# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet v2.5.62 -> 1.1008 # arch/i386/kernel/process.c 1.45 -> 1.46 # drivers/acpi/namespace/nsxfobj.c 1.17 -> 1.19 # arch/sparc/Kconfig 1.8 -> 1.9 # include/acpi/acglobal.h 1.19 -> 1.20 # fs/binfmt_flat.c 1.2 -> 1.4 # fs/nfsd/nfs3xdr.c 1.29 -> 1.32 # drivers/i2c/i2c-frodo.c 1.5 -> 1.6 # drivers/hotplug/ibmphp_pci.c 1.5 -> 1.6 # drivers/char/ipmi/ipmi_kcs_intf.c 1.1 -> 1.2 # drivers/net/znet.c 1.9 -> 1.10 # include/asm-i386/desc.h 1.12 -> 1.13 # arch/ia64/sn/io/xbow.c 1.5 -> 1.6 # include/asm-i386/delay.h 1.1 -> 1.2 # include/acpi/acpixf.h 1.17 -> 1.19 # drivers/acpi/resources/rsio.c 1.12 -> 1.13 # drivers/scsi/megaraid.c 1.34 -> 1.35 # fs/cifs/file.c 1.6 -> 1.7 # drivers/i2c/chips/lm75.c 1.4 -> 1.5 # drivers/ide/pci/via82cxxx.c 1.8 -> 1.9 # drivers/net/aironet4500_core.c 1.11 -> (deleted) # drivers/ide/legacy/macide.c 1.3 -> 1.4 # drivers/net/tc35815.c 1.8 -> 1.9 # drivers/scsi/sym53c8xx_2/sym_hipd.c 1.4 -> 1.5 # drivers/acpi/namespace/nsdumpdv.c 1.7 -> 1.8 # drivers/char/esp.c 1.13 -> 1.14 # drivers/scsi/ips.c 1.47 -> 1.48 # drivers/net/pcmcia/Makefile 1.13 -> 1.14 # drivers/acpi/executer/exoparg3.c 1.9 -> 1.10 # include/asm-i386/system.h 1.23 -> 1.24 # drivers/acpi/hardware/hwacpi.c 1.14 -> 1.15 # include/acpi/acutils.h 1.23 -> 1.24 # drivers/ieee1394/raw1394.c 1.17 -> 1.18 # kernel/ksyms.c 1.183 -> 1.184 # drivers/usb/class/Makefile.lib 1.3 -> 1.5 drivers/usb/Makefile.lib (moved) # include/acpi/acpiosxf.h 1.21 -> 1.24 # include/linux/cdrom.h 1.11 -> 1.12 # drivers/i2c/chips/adm1021.c 1.4 -> 1.5 # drivers/acpi/hardware/hwgpe.c 1.14 -> 1.16 # drivers/acpi/dispatcher/dsobject.c 1.22 -> 1.23 # arch/parisc/kernel/ioctl32.c 1.3 -> 1.4 # drivers/scsi/pci2220i.c 1.15 -> 1.18 # fs/nfsd/nfsxdr.c 1.22 -> 1.23 # arch/mips/philips/nino/int-handler.S 1.1 -> 1.2 # fs/cifs/cifsproto.h 1.6 -> 1.7 # drivers/video/Kconfig 1.13 -> 1.14 # drivers/scsi/eata_dma.c 1.9 -> (deleted) # include/linux/swap.h 1.70 -> 1.71 # drivers/serial/8250_pnp.c 1.7 -> 1.9 # drivers/net/irda/vlsi_ir.c 1.14 -> 1.15 # drivers/char/isicom.c 1.12 -> 1.13 # drivers/message/fusion/mptctl.c 1.11 -> 1.12 # fs/xfs/pagebuf/page_buf.c 1.38 -> 1.40 # arch/alpha/mm/numa.c 1.10 -> 1.11 # include/net/dn_route.h 1.3 -> 1.4 # include/asm-i386/processor.h 1.39 -> 1.40 # drivers/acpi/executer/exconvrt.c 1.19 -> 1.20 # drivers/parisc/dino.c 1.4 -> 1.5 # net/ipv6/exthdrs.c 1.5 -> 1.6 # include/linux/init.h 1.23 -> 1.24 # arch/i386/kernel/cpu/common.c 1.17 -> 1.18 # drivers/scsi/aha152x.c 1.21 -> 1.22 # include/linux/raid/md_k.h 1.49 -> 1.51 # arch/ia64/sn/io/sn2/pcibr/pcibr_error.c 1.2 -> 1.3 # net/ipv4/ipconfig.c 1.21 -> 1.22 # include/video/sgivw.h 1.3 -> 1.4 # drivers/acpi/parser/psscope.c 1.10 -> 1.11 # drivers/acpi/executer/exfield.c 1.17 -> 1.18 # lib/Makefile 1.18 -> 1.20 # drivers/net/natsemi.c 1.46 -> 1.47 # drivers/char/ip2/i2ellis.h 1.4 -> 1.5 # include/linux/i2c-id.h 1.8 -> 1.9 # arch/i386/mach-visws/visws_apic.c 1.5 -> 1.6 # drivers/acpi/toshiba_acpi.c 1.7 -> 1.8 # drivers/scsi/cpqfcTSinit.c 1.30 -> 1.31 # drivers/ide/pci/serverworks.c 1.11 -> 1.14 # net/ipv6/ip6_output.c 1.9 -> 1.10 # drivers/ide/pci/piix.c 1.10 -> 1.12 # net/ipv4/ip_input.c 1.12 -> 1.13 # drivers/scsi/psi_chip.h 1.1 -> 1.2 # include/linux/raid/md.h 1.22 -> 1.23 # drivers/scsi/aic7xxx/aic7xxx_osm.c 1.17 -> 1.19 # include/acpi/acexcep.h 1.13 -> 1.14 # arch/ppc/8260_io/uart.c 1.10 -> 1.11 # include/asm-sparc64/psrcompat.h 1.2 -> 1.3 # drivers/acpi/utilities/uteval.c 1.16 -> 1.17 # drivers/acpi/resources/rsutils.c 1.13 -> 1.14 # drivers/acpi/dispatcher/dswload.c 1.21 -> 1.22 # arch/alpha/kernel/alpha_ksyms.c 1.31 -> 1.32 # drivers/parisc/power.c 1.3 -> 1.4 # drivers/acpi/utilities/utmisc.c 1.21 -> 1.22 # drivers/ide/pci/cs5520.c 1.3 -> 1.4 # include/asm-ppc64/iSeries/ItLpNaca.h 1.1 -> 1.2 # drivers/acpi/hardware/hwsleep.c 1.15 -> 1.16 # drivers/acpi/events/evrgnini.c 1.14 -> 1.15 # drivers/input/serio/i8042.c 1.23 -> 1.24 # arch/sparc/kernel/sparc_ksyms.c 1.13 -> 1.14 # arch/m68knommu/platform/68328/entry.S 1.2 -> 1.3 # arch/alpha/kernel/sys_sable.c 1.6 -> 1.7 # drivers/acpi/pci_link.c 1.12 -> 1.14 # drivers/acpi/executer/exdump.c 1.18 -> 1.19 # include/asm-i386/ide.h 1.10 -> 1.11 # arch/m68k/ifpsp060/src/pfpsp.S 1.4 -> 1.5 # include/linux/init_task.h 1.21 -> 1.23 # sound/drivers/serial-u16550.c 1.12 -> 1.13 # include/acpi/acstruct.h 1.13 -> 1.14 # arch/i386/kernel/head.S 1.22 -> 1.25 # include/asm-i386/mach-visws/irq_vectors.h 1.3 -> 1.4 # include/linux/sched.h 1.133 -> 1.135 # kernel/fork.c 1.105 -> 1.107 # net/sunrpc/svcsock.c 1.39 -> 1.40 # drivers/ide/ppc/pmac.c 1.6 -> 1.7 # drivers/net/aironet4500_proc.c 1.13 -> (deleted) # drivers/acpi/namespace/nsparse.c 1.6 -> 1.7 # fs/xfs/support/debug.c 1.8 -> 1.9 # arch/alpha/lib/ev6-memcpy.S 1.1 -> 1.2 # drivers/acpi/events/evregion.c 1.15 -> 1.16 # drivers/acpi/dispatcher/dsfield.c 1.16 -> 1.17 # drivers/net/wireless/airo.c 1.31 -> 1.32 # drivers/acpi/utilities/utglobal.c 1.22 -> 1.24 # drivers/acpi/executer/exstoren.c 1.16 -> 1.17 # include/acpi/acnamesp.h 1.17 -> 1.18 # drivers/i2c/i2c-philips-par.c 1.9 -> 1.10 # include/asm-i386/cobalt.h 1.2 -> 1.3 include/asm-i386/mach-visws/cobalt.h (moved) # fs/befs/ChangeLog 1.3 -> 1.4 # drivers/acpi/hardware/hwtimer.c 1.13 -> 1.14 # include/acpi/acobject.h 1.16 -> 1.17 # include/acpi/acresrc.h 1.11 -> 1.12 # drivers/acpi/utilities/utalloc.c 1.14 -> 1.15 # include/asm-alpha/machvec.h 1.9 -> 1.10 # drivers/serial/amba.c 1.14 -> 1.16 # drivers/acpi/utilities/utxface.c 1.15 -> 1.16 # drivers/net/lasi_82596.c 1.17 -> 1.18 # Documentation/vm/hugetlbpage.txt 1.2 -> 1.3 # drivers/isdn/hardware/eicon/divasmain.c 1.6 -> 1.7 # Documentation/pnp.txt 1.1 -> 1.2 # drivers/ide/legacy/q40ide.c 1.3 -> 1.4 # drivers/acpi/executer/exregion.c 1.14 -> 1.15 # drivers/serial/sa1100.c 1.15 -> 1.16 # arch/um/include/sysdep-i386/checksum.h 1.1 -> 1.2 # arch/arm/mm/alignment.c 1.6 -> 1.7 # include/acpi/actbl1.h 1.10 -> 1.11 # drivers/net/sk98lin/skge.c 1.12 -> 1.13 # arch/i386/mach-visws/setup.c 1.5 -> 1.6 # arch/ia64/sn/io/xtalk.c 1.5 -> 1.6 # arch/i386/Kconfig 1.40 -> 1.41 # drivers/acpi/parser/psopcode.c 1.18 -> 1.20 # drivers/sbus/char/aurora.c 1.18 -> 1.19 # drivers/block/floppy.c 1.67 -> 1.68 # include/linux/genhd.h 1.45 -> 1.46 # include/linux/nfsd/xdr4.h 1.8 -> 1.9 # include/linux/flat.h 1.2 -> 1.3 # drivers/scsi/53c700.c 1.24 -> 1.25 # drivers/acpi/events/evxfregn.c 1.13 -> 1.14 # include/acpi/acdebug.h 1.17 -> 1.18 # arch/x86_64/kernel/x8664_ksyms.c 1.11 -> 1.12 # drivers/acpi/parser/psparse.c 1.20 -> 1.21 # include/asm-i386/signal.h 1.6 -> 1.7 # drivers/message/fusion/mptbase.h 1.8 -> 1.9 # arch/v850/kernel/process.c 1.3 -> 1.4 # arch/i386/kernel/traps.c 1.44 -> 1.45 # arch/sparc64/kernel/sys32.S 1.3 -> 1.4 # drivers/ide/pci/cy82c693.c 1.10 -> 1.12 # arch/i386/kernel/Makefile 1.34 -> 1.36 # include/linux/i2c.h 1.11 -> 1.12 # include/linux/signal.h 1.9 -> 1.10 # arch/s390/kernel/entry.S 1.23 -> 1.24 # scripts/modpost.c 1.7 -> 1.8 # drivers/ide/legacy/umc8672.c 1.4 -> 1.5 # arch/v850/kernel/init_task.c 1.1 -> 1.2 # drivers/ide/legacy/qd65xx.c 1.3 -> 1.4 # Documentation/s390/Debugging390.txt 1.7 -> 1.8 # drivers/acpi/executer/exprep.c 1.16 -> 1.17 # arch/sparc64/kernel/Makefile 1.19 -> 1.20 # drivers/ide/legacy/ali14xx.c 1.3 -> 1.4 # drivers/acpi/executer/exutils.c 1.18 -> 1.19 # arch/i386/vmlinux.lds.S 1.24 -> 1.25 # include/asm-ia64/sn/pci/bridge.h 1.4 -> 1.5 # fs/cifs/cifsglob.h 1.4 -> 1.5 # drivers/serial/sunsu.c 1.29 -> 1.30 # Documentation/rpc-cache.txt 1.5 -> 1.6 # drivers/md/raid5.c 1.57 -> 1.59 # drivers/net/pcmcia/rayctl.h 1.1 -> 1.2 drivers/net/wireless/rayctl.h (moved) # kernel/Makefile 1.26 -> 1.27 # arch/i386/kernel/cpu/cyrix.c 1.7 -> 1.8 # Documentation/i2c/writing-clients 1.3 -> 1.4 # drivers/char/synclinkmp.c 1.6 -> 1.7 # drivers/serial/anakin.c 1.11 -> 1.12 # arch/ppc64/kernel/ppc_ksyms.c 1.21 -> 1.22 # drivers/char/cyclades.c 1.13 -> 1.14 # fs/cifs/cifssmb.c 1.7 -> 1.8 # arch/m68k/ifpsp060/src/isp.S 1.3 -> 1.4 # include/acpi/platform/acenv.h 1.15 -> 1.17 # include/linux/blkdev.h 1.97 -> 1.98 # drivers/video/pm3fb.c 1.4 -> 1.5 # arch/i386/pci/direct.c 1.12 -> 1.13 # drivers/isdn/hardware/eicon/capimain.c 1.2 -> 1.3 # drivers/block/cciss_scsi.c 1.8.1.3 -> 1.10 # drivers/acpi/tables/tbinstal.c 1.17 -> 1.18 # drivers/acpi/namespace/nsxfname.c 1.14 -> 1.15 # drivers/acpi/executer/exresnte.c 1.19 -> 1.20 # drivers/ide/pci/trm290.c 1.9 -> 1.11 # arch/alpha/kernel/irq_alpha.c 1.10 -> 1.11 # arch/i386/kernel/cpu/mtrr/if.c 1.4 -> 1.5 # drivers/scsi/3w-xxxx.h 1.17 -> 1.18 # drivers/usb/core/message.c 1.20 -> 1.21 # drivers/net/wireless/Kconfig 1.3 -> 1.4 # arch/s390x/kernel/entry.S 1.25 -> 1.26 # net/key/af_key.c 1.20 -> 1.21 # drivers/net/tulip/interrupt.c 1.14 -> 1.15 # drivers/scsi/scsi.h 1.60 -> 1.61 # include/linux/i2c-dev.h 1.6 -> 1.7 # fs/jffs2/wbuf.c 1.5 -> 1.6 # drivers/isdn/hardware/eicon/io.c 1.1 -> 1.2 # arch/i386/mach-visws/mpparse.c 1.3 -> 1.4 # drivers/usb/misc/atmsar.c 1.5.1.1 -> 1.10 # include/asm-i386/segment.h 1.5 -> 1.6 # Documentation/networking/bonding.txt 1.6 -> 1.7 # arch/i386/kernel/entry.S 1.54 -> 1.56 # include/linux/delay.h 1.1 -> 1.2 # drivers/acpi/resources/rsmisc.c 1.10 -> 1.11 # drivers/oprofile/buffer_sync.c 1.7 -> 1.8 # drivers/video/q40fb.c 1.20 -> 1.21 # include/asm-alpha/core_marvel.h 1.3 -> 1.4 # include/acpi/actables.h 1.14 -> 1.15 # drivers/net/Makefile 1.54 -> 1.56 # drivers/acpi/events/evxfevnt.c 1.13 -> 1.14 # net/ipv4/ip_fragment.c 1.7 -> 1.8 # arch/sparc64/kernel/profile.c 1.1 -> (deleted) # fs/cifs/transport.c 1.4 -> 1.5 # drivers/md/md.c 1.135 -> 1.139 # drivers/serial/clps711x.c 1.11 -> 1.12 # drivers/ide/ide.c 1.48 -> 1.50 # drivers/scsi/advansys.c 1.26 -> 1.27 # drivers/ide/pci/cy82c693.h 1.5 -> 1.6 # include/asm-generic/siginfo.h 1.4 -> 1.5 # drivers/ide/legacy/dtc2278.c 1.3 -> 1.4 # drivers/acpi/parser/pstree.c 1.12 -> 1.13 # Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl 1.3 -> 1.4 # include/net/sctp/ulpqueue.h 1.5 -> 1.6 # drivers/scsi/cpqioctl.c 1.1 -> (deleted) # drivers/acpi/parser/psargs.c 1.15 -> 1.16 # arch/m68knommu/kernel/init_task.c 1.1 -> 1.2 # drivers/acpi/executer/exnames.c 1.12 -> 1.13 # arch/mips/au1000/common/serial.c 1.6 -> 1.7 # include/asm-i386/mach-visws/do_timer.h 1.5 -> 1.6 # drivers/scsi/pcmcia/nsp_message.c 1.5 -> 1.6 # arch/i386/kernel/mpparse.c 1.32.1.2 -> 1.35 # arch/parisc/kernel/Makefile 1.9 -> 1.10 # net/ipv6/reassembly.c 1.8 -> 1.9 # drivers/acpi/executer/exfldio.c 1.20 -> 1.21 # drivers/scsi/hosts.h 1.52 -> 1.53 # drivers/usb/media/ov511.c 1.39 -> 1.40 # arch/v850/kernel/rte_cb_multi.c 1.1 -> 1.3 # drivers/scsi/eata_dma_proc.h 1.1 -> (deleted) # include/asm-sparc/posix_types.h 1.1 -> 1.2 # arch/i386/kernel/io_apic.c 1.45 -> 1.48 # drivers/ide/ide-tape.c 1.16 -> 1.17 # drivers/ide/pci/sl82c105.c 1.9 -> 1.11 # drivers/acorn/block/fd1772.c 1.30 -> 1.31 # mm/filemap.c 1.179 -> 1.180 # drivers/net/aironet4500_rid.c 1.2 -> (deleted) # drivers/acpi/resources/rscreate.c 1.16 -> 1.17 # drivers/ide/ide-iops.c 1.4 -> 1.7 # drivers/char/pcmcia/synclink_cs.c 1.7 -> 1.8 # drivers/ide/pci/cs5530.c 1.9 -> 1.11 # drivers/ide/pci/adma100.c 1.3 -> 1.4 # fs/xfs/xfs_mount.c 1.16 -> 1.17 # arch/i386/Makefile 1.44 -> 1.45 # include/asm-parisc/irq.h 1.3 -> 1.4 # drivers/ide/pci/rz1000.c 1.7 -> 1.9 # drivers/char/synclink.c 1.24 -> 1.25 # include/acpi/acoutput.h 1.14 -> 1.15 # drivers/char/ftape/zftape/zftape-ctl.c 1.6 -> 1.7 # drivers/ide/pci/alim15x3.c 1.8 -> 1.10 # drivers/acpi/namespace/nsinit.c 1.19 -> 1.20 # drivers/ide/pci/siimage.c 1.8 -> 1.10 # arch/cris/drivers/eeprom.c 1.8 -> 1.9 # sound/pci/ac97/ac97_codec.c 1.27 -> 1.28 # sound/oss/rme96xx.c 1.10 -> 1.11 # drivers/acpi/dispatcher/dsmthdat.c 1.18 -> 1.19 # drivers/net/e1000/e1000_main.c 1.46 -> 1.47 # drivers/isdn/hardware/eicon/divasi.c 1.4 -> 1.5 # fs/nfsd/nfs3proc.c 1.20 -> 1.21 # include/asm-sparc64/ide.h 1.14 -> 1.15 # include/asm-m68knommu/machdep.h 1.1 -> 1.2 # fs/exec.c 1.70 -> 1.71 # arch/i386/mach-voyager/voyager_smp.c 1.6 -> 1.7 # drivers/scsi/nsp32.c 1.6 -> 1.7 # include/linux/ide.h 1.33 -> 1.38 # drivers/ide/pci/hpt34x.c 1.9 -> 1.11 # drivers/char/ftape/zftape/zftape-vtbl.h 1.2 -> 1.3 # arch/ppc64/xmon/ansidecl.h 1.1 -> 1.2 # drivers/scsi/aacraid/linit.c 1.8 -> 1.10 # drivers/usb/storage/transport.c 1.62 -> 1.63 # drivers/ide/pci/opti621.c 1.8 -> 1.10 # drivers/ide/legacy/buddha.c 1.3 -> 1.4 # net/ipv4/netfilter/ip_fw_compat.c 1.10 -> 1.11 # drivers/acpi/namespace/nsobject.c 1.16 -> 1.17 # drivers/acpi/executer/exresolv.c 1.18 -> 1.19 # drivers/net/pcmcia/ray_cs.c 1.14 -> 1.15 drivers/net/wireless/ray_cs.c (moved) # arch/i386/kernel/trampoline.S 1.6 -> 1.7 # arch/parisc/kernel/irq.c 1.10 -> 1.11 # include/asm-alpha/delay.h 1.3 -> 1.4 # kernel/signal.c 1.73 -> 1.75 # drivers/video/fm2fb.c 1.22 -> 1.23 # include/linux/sys.h 1.2 -> 1.3 # drivers/acpi/tables/tbconvrt.c 1.18 -> 1.19 # arch/parisc/kernel/time.c 1.5 -> 1.6 # arch/parisc/kernel/profile.c 1.1 -> (deleted) # drivers/message/fusion/mptscsih.c 1.18 -> 1.19 # include/asm-m68knommu/m68360_enet.h 1.1 -> 1.2 # drivers/char/sx.c 1.19 -> 1.20 # net/netsyms.c 1.48 -> 1.49 # drivers/acpi/namespace/nseval.c 1.18 -> 1.19 # arch/alpha/kernel/sys_wildfire.c 1.6 -> 1.7 # drivers/ide/setup-pci.c 1.11 -> 1.12 # arch/i386/pci/common.c 1.34 -> 1.35 # include/linux/pci_ids.h 1.81 -> 1.82 # drivers/scsi/aic7xxx_old.c 1.42 -> 1.43 # drivers/usb/serial/usb-serial.c 1.70 -> 1.72 # arch/m68knommu/vmlinux.lds.S 1.4 -> 1.5 # drivers/md/linear.c 1.22 -> 1.23 # Documentation/scsi/ChangeLog.sym53c8xx_2 1.4 -> 1.5 # drivers/char/ftape/zftape/zftape-vtbl.c 1.4 -> 1.5 # drivers/acpi/utilities/utcopy.c 1.21 -> 1.22 # arch/alpha/kernel/Makefile 1.23 -> 1.24 # arch/x86_64/ia32/sys_ia32.c 1.19 -> 1.20 # drivers/acpi/executer/exstore.c 1.22 -> 1.23 # arch/sparc64/kernel/systbls.S 1.30 -> 1.31 # fs/befs/linuxvfs.c 1.5 -> 1.6 # drivers/serial/mcfserial.c 1.2 -> 1.3 # include/linux/usb.h 1.69 -> 1.71 # drivers/net/sis900.c 1.31 -> 1.32 # include/asm-v850/asm.h 1.2 -> 1.3 # drivers/usb/misc/atmsar.h 1.3 -> 1.6 # drivers/ide/ide-cd.c 1.35 -> 1.38 # include/asm-m68knommu/mcfmbus.h 1.1 -> 1.2 # drivers/acpi/pci_irq.c 1.15 -> 1.16 # drivers/ide/pci/ns87415.c 1.8 -> 1.10 # drivers/md/multipath.c 1.42 -> 1.43 # drivers/char/riscom8.c 1.9 -> 1.10 # arch/v850/Kconfig 1.6 -> 1.7 # fs/xfs/xfs_trans.c 1.4 -> 1.5 # drivers/s390/block/dasd.c 1.47 -> 1.48 # net/sched/sch_atm.c 1.6 -> 1.7 # drivers/net/dgrs_plx9060.h 1.1 -> 1.2 # drivers/acpi/dispatcher/dsutils.c 1.18 -> 1.19 # drivers/scsi/aic7xxx/aic79xx_pci.c 1.4 -> 1.5 # include/linux/profile.h 1.3 -> 1.4 # drivers/char/watchdog/sc520_wdt.c 1.4 -> 1.5 # arch/i386/kernel/setup.c 1.67 -> 1.68 # drivers/acpi/utilities/utdelete.c 1.16 -> 1.17 # drivers/scsi/AM53C974.c 1.10 -> 1.11 # drivers/video/sgivwfb.c 1.24 -> 1.25 # net/ipv4/ipmr.c 1.14 -> 1.15 # drivers/acpi/dispatcher/dsmethod.c 1.15 -> 1.16 # Documentation/sysrq.txt 1.6 -> 1.7 # drivers/char/tpqic02.c 1.19 -> 1.20 # arch/i386/kernel/time.c 1.26 -> 1.27 # Documentation/networking/alias.txt 1.2 -> 1.3 # drivers/ide/pci/sis5513.c 1.10 -> 1.12 # drivers/ide/ide-floppy.c 1.24 -> 1.25 # drivers/message/fusion/isense.c 1.5 -> 1.6 # drivers/scsi/scsi_lib.c 1.68 -> 1.70 # arch/sparc64/kernel/time.c 1.20 -> 1.21 # drivers/message/fusion/lsi/mpi_raid.h 1.2 -> 1.3 # include/asm-alpha/bitops.h 1.7 -> 1.8 # drivers/acpi/namespace/nsutils.c 1.20 -> 1.21 # include/acpi/acpi.h 1.8 -> 1.10 # include/acpi/actbl.h 1.12 -> 1.13 # include/asm-s390x/cio.h 1.2 -> 1.3 # drivers/ide/arm/icside.c 1.4 -> 1.5 # net/ipv4/xfrm_policy.c 1.14 -> 1.15 # arch/ppc64/kernel/profile.c 1.1 -> (deleted) # drivers/ide/ide-dma.c 1.7 -> 1.9 # drivers/ide/legacy/pdc4030.c 1.5 -> 1.6 # drivers/acpi/executer/exoparg2.c 1.20 -> 1.21 # drivers/scsi/scsi.c 1.90 -> 1.91 # include/asm-sparc/ide.h 1.13 -> 1.14 # drivers/usb/core/usb.c 1.114 -> 1.115 # drivers/acpi/namespace/nsalloc.c 1.15 -> 1.16 # arch/ppc64/kernel/head.S 1.22 -> 1.23 # net/ipv4/netfilter/ipt_esp.c 1.3 -> 1.4 # drivers/i2c/i2c-proc.c 1.14 -> 1.15 # include/asm-ia64/sn/eeprom.h 1.4 -> 1.5 # drivers/isdn/hardware/eicon/divamnt.c 1.4 -> 1.5 # drivers/scsi/aha1542.c 1.19.1.1 -> 1.21 # fs/xfs/linux/xfs_iomap.c 1.4 -> 1.5 # drivers/ide/pci/generic.c 1.6 -> 1.8 # drivers/net/aironet4500.h 1.6 -> (deleted) # arch/x86_64/ia32/ia32_ioctl.c 1.14 -> 1.15 # drivers/i2c/i2c-algo-bit.c 1.11 -> 1.12 # arch/v850/kernel/intv.S 1.2 -> 1.3 # include/asm-i386/mach-visws/setup_arch_post.h 1.7 -> 1.8 # arch/x86_64/kernel/profile.c 1.2 -> (deleted) # Documentation/DocBook/kernel-hacking.tmpl 1.12 -> 1.13 # scripts/Makefile 1.30 -> 1.31 # drivers/net/sk98lin/skgeinit.c 1.4 -> 1.6 # include/asm-sparc64/irq.h 1.11 -> 1.12 # drivers/net/arlan-proc.c 1.6 -> 1.7 drivers/net/wireless/arlan-proc.c (moved) # drivers/acpi/resources/rsaddr.c 1.11 -> 1.13 # drivers/isdn/hardware/eicon/mi_pc.h 1.2 -> 1.3 # include/asm-arm/arch-integrator/platform.h 1.1 -> 1.2 # drivers/acpi/resources/rscalc.c 1.15 -> 1.16 # drivers/net/au1000_eth.c 1.9 -> 1.11 # drivers/ide/pci/siimage.h 1.5 -> 1.6 # drivers/ide/ide-proc.c 1.6 -> 1.8 # fs/xfs/xfs_log_recover.c 1.9 -> 1.10 # drivers/md/raid1.c 1.50 -> 1.52 # include/linux/sunrpc/svc.h 1.18 -> 1.19 # include/acpi/acmacros.h 1.19 -> 1.20 # fs/xfs/support/spin.h 1.1 -> 1.2 # drivers/s390/cio/chsc.c 1.7 -> 1.8 # sound/oss/vwsnd.c 1.8 -> 1.9 # drivers/scsi/aic7xxx/aic79xx_osm.c 1.17.1.2 -> 1.22 # fs/nfsd/nfssvc.c 1.33 -> 1.34 # drivers/acpi/resources/rsdump.c 1.13 -> 1.15 # drivers/net/arlan.h 1.4 -> 1.5 drivers/net/wireless/arlan.h (moved) # arch/i386/pci/Makefile 1.14 -> 1.15 # fs/proc/task_nommu.c 1.1 -> 1.2 # net/ipv4/xfrm_user.c 1.8 -> 1.10 # arch/sparc/kernel/time.c 1.12 -> 1.13 # drivers/ide/pci/hpt366.c 1.12 -> 1.14 # fs/buffer.c 1.185 -> 1.186 # drivers/acpi/utilities/utinit.c 1.14 -> 1.15 # drivers/acpi/parser/psutils.c 1.15 -> 1.16 # drivers/acpi/events/evxface.c 1.16 -> 1.18 # fs/nfsd/export.c 1.69 -> 1.70 # drivers/ide/ide-probe.c 1.31 -> 1.32 # include/linux/i2c-proc.h 1.3 -> 1.4 # drivers/scsi/dmx3191d.c 1.9 -> 1.10 # drivers/acpi/events/evmisc.c 1.17 -> 1.19 # include/acpi/acevents.h 1.12 -> 1.14 # include/acpi/actypes.h 1.20 -> 1.22 # include/asm-alpha/system.h 1.14.1.1 -> 1.16 # drivers/char/epca.c 1.13 -> 1.14 # Documentation/networking/8139too.txt 1.14 -> 1.15 # include/linux/raid/raid1.h 1.14 -> 1.15 # drivers/scsi/ppa.c 1.17.1.1 -> 1.19 # drivers/acpi/events/evgpe.c 1.6 -> 1.8 # include/linux/skbuff.h 1.18 -> 1.19 # fs/xfs/pagebuf/page_buf.h 1.20 -> 1.22 # drivers/char/tty_io.c 1.58 -> 1.61 # drivers/acpi/executer/exconfig.c 1.15 -> 1.17 # include/acpi/achware.h 1.11 -> 1.12 # drivers/usb/core/urb.c 1.10 -> 1.11 # fs/ntfs/mst.c 1.6 -> 1.7 # MAINTAINERS 1.120 -> 1.123 # include/linux/oprofile.h 1.2.1.3 -> 1.5 # include/asm-v850/page.h 1.1 -> 1.2 # drivers/ide/pci/sc1200.c 1.3 -> 1.5 # arch/sparc64/kernel/sys_sunos32.c 1.27 -> 1.28 # arch/ia64/ia32/sys_ia32.c 1.42 -> 1.43 # include/acpi/actbl2.h 1.14 -> 1.15 # drivers/char/rio/rio_linux.c 1.12 -> 1.13 # include/acpi/aclocal.h 1.24 -> 1.25 # drivers/ide/ide-pnp.c 1.4 -> 1.5 # fs/partitions/msdos.c 1.17 -> 1.18 # drivers/acpi/tables/tbrsdt.c 1.9 -> 1.10 # arch/ia64/hp/sim/simeth.c 1.4 -> 1.5 # arch/mips64/kernel/linux32.c 1.10 -> 1.11 # include/asm-m68knommu/mcfpci.h 1.1 -> 1.2 # drivers/char/watchdog/w83877f_wdt.c 1.14 -> 1.15 # arch/alpha/Makefile 1.18.1.5 -> 1.23 # Documentation/i2c/summary 1.3 -> 1.4 # drivers/acpi/utilities/utdebug.c 1.15 -> 1.16 # include/linux/time.h 1.8 -> 1.9 # drivers/video/sstfb.c 1.18 -> 1.19 # arch/sparc64/kernel/sys_sparc32.c 1.64 -> 1.65 # drivers/net/arlan.c 1.14 -> 1.15 drivers/net/wireless/arlan.c (moved) # arch/v850/vmlinux.lds.S 1.6 -> 1.7 # drivers/net/aironet4500_card.c 1.14 -> (deleted) # net/ipv4/netfilter/ipt_ah.c 1.3 -> 1.4 # drivers/usb/class/cdc-acm.c 1.33 -> 1.34 # include/linux/compiler.h 1.10 -> 1.11 # arch/mips/baget/vacserial.c 1.7 -> 1.8 # arch/m68knommu/kernel/signal.c 1.5 -> 1.6 # drivers/acpi/tables/tbget.c 1.17 -> 1.18 # include/asm-i386/unistd.h 1.23 -> 1.24 # include/acpi/acparser.h 1.14 -> 1.15 # include/linux/nfsd/nfsfh.h 1.11 -> 1.12 # drivers/acpi/utilities/utobject.c 1.16 -> 1.17 # drivers/usb/host/ehci-hcd.c 1.43 -> 1.44 # include/acpi/amlcode.h 1.15 -> 1.17 # include/asm-alpha/compiler.h 1.4 -> 1.5 # drivers/scsi/pci2000.c 1.12 -> 1.13 # drivers/net/ac3200.c 1.10 -> 1.11 # drivers/acpi/events/evsci.c 1.11 -> 1.12 # arch/cris/drivers/serial.c 1.10 -> 1.11 # drivers/scsi/sym53c8xx.c 1.23 -> 1.24 # drivers/ide/legacy/falconide.c 1.4 -> 1.5 # drivers/scsi/aic7xxx/aic79xx.h 1.3 -> 1.4 # drivers/acpi/executer/exsystem.c 1.11 -> 1.12 # arch/i386/mach-visws/traps.c 1.2 -> 1.3 # fs/ntfs/unistr.c 1.17 -> 1.18 # drivers/media/video/bt832.h 1.1 -> 1.2 # drivers/oprofile/oprofile_stats.c 1.1 -> 1.2 # drivers/acpi/resources/rsxface.c 1.11 -> 1.12 # arch/v850/kernel/bug.c 1.2 -> 1.3 # drivers/ide/legacy/ide-cs.c 1.7 -> 1.8 # include/asm-alpha/posix_types.h 1.2 -> 1.3 # arch/alpha/lib/udelay.c 1.1 -> 1.2 # arch/m68knommu/Kconfig 1.5 -> 1.6 # arch/alpha/kernel/core_irongate.c 1.9 -> 1.10 # arch/m68knommu/platform/68360/entry.S 1.2 -> 1.3 # arch/ppc64/kernel/sys_ppc32.c 1.48 -> 1.49 # sound/pci/es1968.c 1.16 -> 1.18 # drivers/parisc/lba_pci.c 1.5 -> 1.6 # arch/sparc64/oprofile/timer_int.c 1.3 -> 1.4 # CREDITS 1.76 -> 1.77 # drivers/scsi/fdomain.c 1.16 -> 1.17 # drivers/pci/probe.c 1.26 -> 1.27 # arch/mips/kernel/pci.c 1.3 -> 1.4 # drivers/net/strip.c 1.8 -> 1.9 drivers/net/wireless/strip.c (moved) # net/ipv6/ipv6_syms.c 1.6 -> 1.7 # drivers/usb/net/kaweth.c 1.36 -> 1.38 # drivers/char/tipar.c 1.4 -> 1.5 # fs/xfs/xfs_error.h 1.2 -> 1.3 # drivers/scsi/eata_dma_proc.c 1.2 -> (deleted) # arch/s390x/kernel/linux32.c 1.37 -> 1.38 # drivers/acpi/parser/pswalk.c 1.11 -> 1.12 # drivers/usb/serial/Kconfig 1.5 -> 1.6 # drivers/scsi/qlogicfc.c 1.25 -> 1.26 # include/acpi/acdispat.h 1.12 -> 1.13 # arch/ppc/8xx_io/uart.c 1.17 -> 1.18 # drivers/ide/legacy/pdc4030.h 1.3 -> 1.4 # fs/quota_v1.c 1.6 -> 1.7 # drivers/ide/pci/pdc202xx_new.c 1.10 -> 1.12 # drivers/acpi/executer/exoparg6.c 1.7 -> 1.8 # arch/x86_64/kernel/Makefile 1.16 -> 1.17 # drivers/net/pcmcia/Kconfig 1.2 -> 1.3 # drivers/media/video/bt832.c 1.1 -> 1.2 # net/ipv6/ip6_input.c 1.5 -> 1.6 # arch/i386/mach-visws/pci-visws.c 1.7 -> 1.9 arch/i386/pci/visws.c (moved) # include/asm-i386/pgtable.h 1.25 -> 1.26 # drivers/acpi/tables/tbxfroot.c 1.16 -> 1.17 # drivers/acpi/tables/tbgetall.c 1.8 -> 1.9 # include/acpi/acconfig.h 1.31 -> 1.32 # drivers/serial/21285.c 1.12 -> 1.13 # drivers/media/dvb/av7110/saa7146_core.c 1.4 -> 1.5 # drivers/isdn/hardware/eicon/divasproc.c 1.3 -> 1.4 # sound/oss/mad16.c 1.7 -> 1.8 # include/asm-arm/arch-iop310/dma.h 1.1 -> 1.2 # net/ipv6/xfrm_policy.c 1.1 -> (deleted) # drivers/usb/input/Kconfig 1.2.1.2 -> 1.4 # net/sunrpc/svcauth.c 1.10 -> 1.11 # net/ipv6/Makefile 1.8 -> 1.9 # drivers/ide/pci/slc90e66.c 1.8 -> 1.10 # drivers/serial/8250_pci.c 1.14 -> 1.15 # drivers/acpi/numa.c 1.4 -> 1.5 # arch/alpha/Kconfig 1.6.1.9 -> 1.10 # drivers/ide/pci/pdcadma.c 1.9 -> 1.11 # drivers/net/am79c961a.c 1.8 -> 1.9 # include/acpi/platform/aclinux.h 1.18 -> 1.20 # drivers/i2c/i2c-dev.c 1.21 -> 1.22 # drivers/i2c/i2c-algo-pcf.c 1.7 -> 1.8 # arch/v850/kernel/irq.c 1.3 -> 1.4 # Documentation/scsi/scsi_mid_low_api.txt 1.9 -> 1.10 # include/linux/module.h 1.50 -> 1.51 # drivers/scsi/sym53c8xx_defs.h 1.7 -> 1.8 # drivers/acpi/tables/tbutils.c 1.16 -> 1.17 # fs/xfs/xfsidbg.c 1.18 -> 1.19 # drivers/ide/pci/it8172.c 1.8 -> 1.9 # drivers/ide/legacy/gayle.c 1.3 -> 1.4 # drivers/scsi/scsi_scan.c 1.58 -> 1.59 # kernel/sched.c 1.159 -> 1.161 # drivers/acpi/executer/exmutex.c 1.10 -> 1.11 # Documentation/s390/cds.txt 1.6 -> 1.7 # include/asm-i386/lithium.h 1.2 -> 1.3 include/asm-i386/mach-visws/lithium.h (moved) # drivers/acpi/parser/psxface.c 1.15 -> 1.16 # drivers/ide/arm/rapide.c 1.3 -> 1.4 # include/asm-parisc/pdcpat.h 1.1 -> 1.2 # drivers/scsi/Makefile 1.37 -> 1.38 # fs/quota_v2.c 1.9 -> 1.10 # drivers/ide/legacy/ht6560b.c 1.3 -> 1.4 # drivers/acpi/osl.c 1.24 -> 1.27 # drivers/ide/pci/aec62xx.c 1.9 -> 1.11 # drivers/i2c/i2c-elv.c 1.9 -> 1.10 # drivers/scsi/sim710.c 1.8 -> 1.10 # drivers/i2c/i2c-velleman.c 1.7 -> 1.8 # drivers/acpi/resources/rsmemory.c 1.10 -> 1.11 # drivers/char/drm/drm_drv.h 1.11 -> 1.12 # drivers/acpi/dispatcher/dsopcode.c 1.18 -> 1.19 # sound/oss/Kconfig 1.4 -> 1.5 # arch/sparc64/kernel/sparc64_ksyms.c 1.36 -> 1.37 # drivers/usb/serial/console.c 1.1 -> 1.2 # sound/pci/via82xx.c 1.25 -> 1.26 # kernel/timer.c 1.40 -> 1.41 # fs/nfsd/nfs4xdr.c 1.8 -> 1.9 # drivers/acpi/executer/exmisc.c 1.19 -> 1.20 # drivers/acpi/events/evevent.c 1.21 -> 1.22 # drivers/char/agp/via-agp.c 1.27 -> 1.28 # arch/i386/mach-visws/Makefile 1.5 -> 1.6 # arch/ppc64/kernel/sys32.S 1.10 -> 1.11 # drivers/acpi/hardware/hwregs.c 1.17 -> 1.18 # drivers/serial/nb85e_uart.c 1.7 -> 1.9 # include/linux/raid/raid5.h 1.13 -> 1.14 # drivers/scsi/sym53c8xx_2/sym_malloc.c 1.1 -> 1.2 # arch/mips/kernel/irixsig.c 1.6 -> 1.7 # arch/m68knommu/platform/68360/commproc.c 1.1 -> 1.2 # drivers/usb/host/ehci.h 1.17 -> 1.18 # drivers/net/Kconfig 1.16 -> 1.18 # drivers/net/pcmcia/ray_cs.h 1.1 -> 1.2 drivers/net/wireless/ray_cs.h (moved) # include/asm-alpha/ide.h 1.10 -> 1.11 # arch/i386/kernel/profile.c 1.1 -> (deleted) # arch/cris/boot/compressed/misc.c 1.5 -> 1.6 # drivers/acpi/dispatcher/dswstate.c 1.18 -> 1.19 # include/asm-sparc64/posix_types.h 1.4 -> 1.5 # kernel/exit.c 1.94 -> 1.97 # fs/cifs/CHANGES 1.4 -> 1.5 # sound/oss/maestro.c 1.17 -> 1.18 # include/linux/types.h 1.8 -> 1.9 # include/asm-parisc/pgtable.h 1.9 -> 1.10 # README 1.6 -> 1.7 # drivers/ide/pci/cmd64x.c 1.8 -> 1.10 # drivers/acpi/executer/exresop.c 1.19 -> 1.21 # drivers/char/specialix.c 1.9 -> 1.10 # include/asm-s390/cio.h 1.2 -> 1.3 # fs/xfs/xfs_dir_leaf.c 1.3 -> 1.4 # arch/alpha/kernel/ptrace.c 1.12 -> 1.13 # include/acpi/acinterp.h 1.20 -> 1.21 # drivers/net/tulip/dmfe.c 1.25 -> 1.26 # arch/sparc64/kernel/ioctl32.c 1.50 -> 1.51 # drivers/scsi/pcmcia/aha152x_stub.c 1.11 -> 1.12 # arch/i386/lib/delay.c 1.3 -> 1.4 # drivers/acpi/tables/tbxface.c 1.15 -> 1.16 # drivers/scsi/Kconfig 1.12 -> 1.14 # fs/xfs/linux/xfs_aops.c 1.23 -> 1.24 # include/asm-ppc/ppcboot.h 1.3 -> 1.4 # fs/cifs/connect.c 1.8 -> 1.9 # drivers/acpi/namespace/nsdump.c 1.18 -> 1.19 # drivers/acpi/executer/exoparg1.c 1.20 -> 1.21 # drivers/pci/Makefile 1.22 -> 1.23 # drivers/message/i2o/i2o_config.c 1.13 -> 1.14 # include/asm-alpha/byteorder.h 1.1 -> 1.2 # drivers/char/mwave/3780i.c 1.2 -> 1.3 # arch/v850/kernel/entry.S 1.5 -> 1.6 # fs/xfs/linux/xfs_super.c 1.27 -> 1.28 # arch/i386/mm/hugetlbpage.c 1.31 -> 1.32 # drivers/acpi/namespace/nsload.c 1.17 -> 1.18 # drivers/char/genrtc.c 1.4 -> 1.6 # drivers/net/setup.c 1.5 -> 1.6 # drivers/acpi/dispatcher/dsinit.c 1.7 -> 1.8 # arch/ppc64/kernel/time.c 1.17 -> 1.18 # arch/i386/kernel/i8259.c 1.19 -> 1.20 # drivers/ide/pci/cmd640.c 1.4 -> 1.5 # include/asm-m68knommu/cacheflush.h 1.1 -> 1.2 # drivers/input/joystick/grip_mp.c 1.2 -> 1.3 # drivers/net/bonding.c 1.16 -> 1.17 # Documentation/i2c/i2c-protocol 1.1 -> 1.2 # drivers/usb/input/usbmouse.c 1.21.1.1 -> 1.23 # drivers/scsi/3w-xxxx.c 1.22 -> 1.24 # sound/pci/als4000.c 1.9 -> 1.10 # fs/xfs/support/qsort.c 1.1 -> 1.2 # arch/ia64/sn/io/l1.c 1.5 -> 1.6 # drivers/char/watchdog/wafer5823wdt.c 1.4 -> 1.5 # drivers/acpi/executer/excreate.c 1.16 -> 1.17 # net/sctp/ulpqueue.c 1.8 -> 1.9 # arch/sparc64/kernel/sunos_ioctl32.c 1.2 -> 1.3 # kernel/profile.c 1.3 -> 1.4 # include/asm-i386/posix_types.h 1.1 -> 1.2 # drivers/acpi/executer/exstorob.c 1.17 -> 1.18 # sound/pci/cs4281.c 1.21 -> 1.22 # include/asm-ia64/sn/sn2/shub_md.h 1.2 -> 1.3 # drivers/acpi/utilities/utmath.c 1.7 -> 1.8 # arch/m68knommu/platform/68360/uCquicc/crt0_rom.S 1.2 -> 1.3 # net/decnet/dn_route.c 1.11 -> 1.12 # drivers/usb/input/usbkbd.c 1.24.1.1 -> 1.26 # fs/cifs/misc.c 1.4 -> 1.5 # drivers/acpi/namespace/nsaccess.c 1.16 -> 1.19 # drivers/acpi/namespace/nssearch.c 1.17 -> 1.18 # drivers/usb/misc/Kconfig 1.4 -> 1.5 # drivers/serial/68360serial.c 1.5 -> 1.6 # arch/alpha/lib/Makefile 1.12 -> 1.13 # drivers/net/skfp/pmf.c 1.1 -> 1.2 # drivers/ide/ppc/mpc8xx.c 1.3 -> 1.4 # include/linux/i2c-algo-bit.h 1.2 -> 1.3 # drivers/i2c/i2c-rpx.c 1.4 -> 1.5 # drivers/isdn/hardware/eicon/i4lididrv.c 1.5 -> 1.6 # drivers/parport/parport_pc.c 1.32 -> 1.33 # include/asm-x86_64/hw_irq.h 1.4 -> 1.5 # drivers/net/wireless/airport.c 1.11 -> 1.12 # drivers/char/ppdev.c 1.18 -> 1.19 # Documentation/i2c/smbus-protocol 1.3 -> 1.4 # arch/m68knommu/platform/68328/pilot/crt0_rom.S 1.1 -> 1.2 # arch/m68k/ifpsp060/src/fpsp.S 1.4 -> 1.5 # arch/ppc64/kernel/Makefile 1.20 -> 1.21 # drivers/acpi/dispatcher/dswexec.c 1.17 -> 1.18 # drivers/ide/pci/pdc202xx_old.c 1.10 -> 1.12 # include/acpi/platform/acgcc.h 1.15 -> 1.16 # drivers/usb/net/pegasus.h 1.22 -> 1.23 # drivers/scsi/eata_dma.h 1.3 -> (deleted) # net/decnet/dn_nsp_out.c 1.4 -> 1.5 # drivers/scsi/qlogicisp.c 1.17 -> 1.18 # include/asm-ppc64/hw_irq.h 1.7 -> 1.8 # include/linux/i2c-algo-pcf.h 1.1 -> 1.2 # drivers/acpi/namespace/nsxfeval.c 1.9 -> 1.10 # drivers/scsi/pcmcia/nsp_cs.c 1.15 -> 1.16 # net/ipv4/igmp.c 1.12 -> 1.13 # drivers/isdn/eicon/divalog.h 1.3 -> 1.4 # drivers/scsi/wd7000.c 1.16.1.1 -> 1.18 # arch/alpha/mm/Makefile 1.5 -> 1.6 # arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c 1.2 -> 1.3 # arch/mips/ddb5xxx/common/pci.c 1.2 -> 1.3 # drivers/serial/sunzilog.c 1.24 -> 1.26 # include/asm-i386/hw_irq.h 1.19 -> 1.20 # drivers/scsi/imm.c 1.16.1.1 -> 1.18 # drivers/acpi/dispatcher/dswscope.c 1.12 -> 1.13 # net/ipv4/route.c 1.38 -> 1.39 # arch/m68knommu/mm/Makefile 1.2 -> 1.3 # drivers/acpi/resources/rsirq.c 1.13 -> 1.14 # arch/i386/kernel/i386_ksyms.c 1.43 -> 1.45 # drivers/ide/legacy/qd65xx.h 1.2 -> 1.3 # include/asm-arm/hardware/iomd.h 1.3 -> 1.4 # arch/ppc/xmon/ansidecl.h 1.3 -> 1.4 # include/linux/tty_ldisc.h 1.2 -> 1.3 # drivers/scsi/sym53c8xx_2/sym_glue.h 1.8 -> 1.9 # fs/nfsctl.c 1.5 -> 1.6 # Documentation/sound/oss/PSS-updates 1.2 -> 1.3 # drivers/ide/pci/amd74xx.c 1.13 -> 1.14 # fs/nfsd/nfs4proc.c 1.6 -> 1.8 # arch/m68k/kernel/head.S 1.10 -> 1.11 # drivers/acpi/namespace/nswalk.c 1.11 -> 1.12 # drivers/scsi/qla1280.c 1.30 -> 1.31 # arch/parisc/kernel/parisc_ksyms.c 1.7 -> 1.8 # drivers/char/amiserial.c 1.11 -> 1.12 # drivers/acpi/resources/rslist.c 1.12 -> 1.13 # arch/v850/kernel/signal.c 1.7 -> 1.8 # arch/i386/kernel/apic.c 1.31 -> 1.33 # drivers/usb/misc/speedtouch.c 1.44 -> 1.60 # Documentation/DocBook/videobook.tmpl 1.3 -> 1.4 # fs/xfs/xfs_log.c 1.9 -> 1.10 # fs/ntfs/attrib.c 1.84 -> 1.85 # drivers/acpi/namespace/nsnames.c 1.16 -> 1.17 # drivers/net/wireless/orinoco.c 1.19 -> 1.20 # arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c 1.4 -> 1.5 # arch/m68knommu/platform/68360/uCquicc/crt0_ram.S 1.2 -> 1.3 # drivers/char/ip2main.c 1.23 -> 1.24 # drivers/scsi/53c7xx.c 1.13 -> 1.14 # include/asm-v850/entry.h 1.1 -> 1.2 # drivers/scsi/sym53c8xx_2/sym_glue.c 1.13 -> 1.15 # drivers/net/wireless/Makefile 1.9 -> 1.10 # fs/xfs/xfs_log.h 1.2 -> 1.3 # drivers/scsi/tmscsim.c 1.16 -> 1.17 # drivers/usb/serial/usb-serial.h 1.24 -> 1.25 # drivers/char/ftape/zftape/zftape-eof.c 1.1 -> 1.2 # (new) -> 1.1 include/asm-i386/mach-visws/mach_apic.h # (new) -> 1.2 include/linux/idr.h # (new) -> 1.5 arch/alpha/oprofile/common.c # (new) -> 1.1 arch/i386/kernel/doublefault.c # (new) -> 1.1 arch/m68knommu/mm/extable.c # (new) -> 1.1 include/asm-v850/bug.h # (new) -> 1.1 arch/m68knommu/platform/68VZ328/ucdimm/config.c # (new) -> 1.1 include/asm-i386/i8259.h # (new) -> 1.1 include/asm-v850/flat.h # (new) -> 1.4 arch/alpha/oprofile/op_model_ev5.c # (new) -> 1.4 arch/alpha/oprofile/op_model_ev4.c # (new) -> 1.2 lib/idr.c # (new) -> 1.1 include/asm-i386/mach-visws/piix4.h # (new) -> 1.1 arch/alpha/oprofile/Kconfig # (new) -> 1.1 include/linux/posix-timers.h # (new) -> 1.2 kernel/posix-timers.c # (new) -> 1.5 arch/alpha/oprofile/op_model_ev6.c # (new) -> 1.1 include/asm-generic/ide_iops.h # (new) -> 1.1 arch/i386/mach-visws/reboot.c # (new) -> 1.1 arch/m68knommu/platform/5307/vectors.c # (new) -> 1.1 include/asm-m68knommu/flat.h # (new) -> 1.3 arch/alpha/oprofile/op_impl.h # (new) -> 1.4 arch/alpha/oprofile/op_model_ev67.c # (new) -> 1.3 arch/alpha/oprofile/Makefile # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 03/02/17 torvalds@home.transmeta.com 1.914.1.137 # Linux 2.5.62 # -------------------------------------------- # 03/02/17 jgarzik@redhat.com 1.914.169.1 # [netdrvr 8139too] add to the list of supported boards # -------------------------------------------- # 03/02/17 jgarzik@redhat.com 1.914.1.138 # Merge redhat.com:/garz/repo/linus-2.5 # into redhat.com:/garz/repo/net-drivers-2.5 # -------------------------------------------- # 03/02/17 jgarzik@redhat.com 1.914.1.139 # [netdrvr] Remove superceded wireless driver aironet4500 # # From the maintainer, Elmer Joandi(sp?): # aironet4500 is superseded by cisco340 drivers (airo.c) by Ben Reed # and the only strenght of my driver is that it allows to access absolutely # all registers on card. Which is useful for developers only. Besides there # is no normal interface to configure crypto in my driver, as the general # interface is not userfriendly at all. So in fact, I use Bens driver for my # ISP bussiness in general cases and my driver for troubleshooting. # -------------------------------------------- # 03/02/17 willy@debian.org 1.914.1.140 # [wireless airo] call pci_enable_device, pci_set_master as needed # -------------------------------------------- # 03/02/17 jejb@raven.il.steeleye.com 1.914.170.1 # Merge raven.il.steeleye.com:/home/jejb/BK/scsi-misc-2.5 # into raven.il.steeleye.com:/home/jejb/BK/scsi-for-linus-2.5 # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.2 # [PATCH] Bounds checking for NFSv3 readdirplus # # From Ted Phelps # # The NFSv3 readdirplus path doesn't check to see if maxcount is less # than the size of a page before it fills it up, possibly overwriting # random bits of memory. At least, it makes my Solaris NFSv3 client # work. # # The attached patch, against 2.5.58, adds this check in a way which is # consistent with the way readdir does under both NFSv2 andNFSv3. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.3 # [PATCH] Keep track of which page is the 'tail' of an NFSd reply # # NFS replies can have a 'tail' after a 'data' component # (for read, readlink, readdir). # # For nfsv2 and v3 this tail is in the same page as the head. # For nfsv4, this tail is in a separate page. # # We need to keep track of which page so that it right one # gets sent. This patch does that. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.4 # [PATCH] Fix handling of error code in NFSv4 replies # # As nfsv4 does some reply encoding while processing # requests, the code which tries to put the overall status # at the head of the reply fails. # # With this patch, we take the address for the overall # status very early so NFSv4's encoding wont confuse us. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.5 # [PATCH] Fix problem where knfsd wouldn't release filesystem on unexport. # # Problem was that the cache was being updated inplace, rather # than swapping in a new entry, so old filesystem pointers # were overwritten without being released. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.6 # [PATCH] Make kNFSd pre/post_[acm]time use struct timespec # # From Trond: # # When the nanosecond resolution on [acm]time was introduced to 2.5.x, # the knfsd GETATTR responses were converted to make use of the # nanosecond field, but the pre/post WCC attributes were not. This will # lead to a lot of unnecessary cache invalidations on the clients. # # The following trivial patch should fix up knfsd so that it stores and # encodes the full 'struct timespec' in both pre and post attribute # fields. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.7 # [PATCH] Convert fs/nfsctl.c to use C99 named initiailzers # # From Art Haas : # # This converts the file to use C99 named initializers. These change make # the file compile with fewer warnings if '-W' is added to the compile # flags, and may enhance code readability. Let me know if you think this # should be sent to Linus. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.8 # [PATCH] Fix bug in md superblock sanity checking. # # This call the super_90_load is meant to make sure that the new # superblock is consistant with a pre-exisitnig one (on rdev0)... but # rdev0 was not passed :-( # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.9 # [PATCH] linear.c fix for gcc bug # # From Andrew Morton : # # gcc-2.95.3 is getting an internal compiler error with CONFIG_LBD=y. Reorganising # the code a bit made it go away. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.10 # [PATCH] Small bug fix for multipath. # # by the nature of multipath, already be in-sync, so we should set the # in-sync flag. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.11 # [PATCH] C99 initializers for drivers/md/md.c # # From Art Haas : # # This converts md.c to use C99 initializers to improve readability and # remove warnings if '-W' is used. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.12 # [PATCH] Add name of md device to name of thread managing that device. # # This allows the thread to easily identified and signalled. # The point of signalling will appear in the next patch. # -------------------------------------------- # 03/02/17 neilb@cse.unsw.edu.au 1.914.170.13 # [PATCH] Provide a 'safe-mode' for soft raid. # # When a raid1 or raid5 array is in 'safe-mode', then the array # is marked clean whenever there are no outstanding write requests, # and is marked dirty again before allowing any write request to # proceed. # # This means than an unclean shutdown while no write activity is happening # will NOT cause a resync to be required. However it does mean extra # updates to the superblock. # # Currently safe-mode is turned on by sending SIGKILL to the raid thread # as would happen at a normal shutdown. This should mean that the # reboot notifier is no longer needed. # # After looking more at performance issues I may make safemode be on # all the time. I will almost certainly make it on when RAID5 is degraded # as an unclean shutdown of a degraded RAID5 means data loss. # # This code was provided by Angus Sawyer # -------------------------------------------- # 03/02/17 davem@nuts.ninka.net 1.914.171.1 # Merge nuts.ninka.net:/home/davem/src/BK/network-2.5 # into nuts.ninka.net:/home/davem/src/BK/net-2.5 # -------------------------------------------- # 03/02/18 hch@lab343.munich.sgi.com 1.914.170.14 # Merge http://linux.bkbits.net/linux-2.5 # into lab343.munich.sgi.com:/home/hch/repo/bkbits/linux-2.5 # -------------------------------------------- # 03/02/18 baldrick@wanadoo.fr 1.914.164.21 # [PATCH] USB speedtouch: replace speedtouch crc routines # # Use the kernel CRC routines rather than a do-it-yourself version. # By the way, I created a common USB Makefile.lib, rather than having # one for the class drivers, and one for speedtouch. # -------------------------------------------- # 03/02/18 Andries.Brouwer@cwi.nl 1.914.172.1 # [PATCH] remove BSD_PARTITION # # There is no reason to have both BSD_PARTITION and FREEBSD_PARTITION # denoting the same partition type. # -------------------------------------------- # 03/02/18 baldrick@wanadoo.fr 1.914.164.22 # [PATCH] USB speedtouch: speedtouch stability fix fix # # It's usually considered stupid to stuff-up like this. However, # for this once we'll just call it "inspired". # -------------------------------------------- # 03/02/18 baldrick@wanadoo.fr 1.914.164.23 # [PATCH] USB speedtouch: speedtouch cleanups # # Grab bag of minor cleanups. # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.1 # Merge groveronline.com:/root/bk/linux-2.5 # into groveronline.com:/root/bk/linux-acpi # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.2 # [PATCH] ide resync # # Ok this first piece eliminates some of the use of ide_ioreg_t, which # actually only works as a ulong anyway. Its a dysfunctional abstraction. # # We also need the ide pci stuff if we have IDE PCI not if we have PCI but # only legacy mode IDE support # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.3 # [PATCH] add generic ide iops # # This abstracts out the mmio copies as PPC at least has better ways to # this and there are other issues on other platforms. It keeps DaveM happy # too 8) # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.4 # [PATCH] eliminate use of ide_ioreg_t on ARM # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.5 # [PATCH] update ide.c # # Remove ide_ioreg_t # Add locking on the ide setting lists # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.6 # [PATCH] remove old style and unused bad drive list # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.7 # [PATCH] clean up the IDE iops, add ones for a dead iface # # Also adds the new OUTBSYNC iop # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.8 # [PATCH] fix ide_ioreg_t and ifdefs in iops # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.9 # [PATCH] add ide_execute_command but do not use it yet # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.10 # [PATCH] remove ide_ioreg_t # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.11 # [PATCH] ide-probe updates # # Fix crash with slave and no master # Fix crash with hdb=noprobe hdb=cdrom # Fix crash with pre ATA devices refusing IDENTIFY # Fix flash slave making master disappear # Add interfaces that the PPC uses to do disk spin up when the BIOS has not # Add framework to allow hdparm -d1 on a box built with IDE_DMA_ONLYDISK # Fix identify framework so we can fix the proc identify crash too # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.12 # [PATCH] ide-proc - fix crash on identify # # We cannot do an identify on a drive with no driver loaded. The kernel # has a ton of half backed "if no driver" cases but they dont cover all # cases and its a mess. # # For now we rely on the probe time identify unless a driver is loaded. A # proper fix (an 'ide-unassigned' driver) will follow later # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.13 # [PATCH] add new settings locks to ide-proc # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.14 # [PATCH] ide-tape no longer needs this ifdef # # Now handled at runtime # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.15 # [PATCH] fix path of file # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.16 # [PATCH] path/ide_ioreg_t fixes for legacy drivers # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.17 # [PATCH] fix int for i/o in pcmcia ide_cs # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.18 # [PATCH] fix the rest of the names/ide_ioreg_t in ide legacy # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.19 # [PATCH] rmeove ide_ioreg_t from PCI ide # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.20 # [PATCH] fix path names and printks in IDE pci # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.21 # [PATCH] add a 'NO_IRQ' definition to IDE # # (second hunk just makes 2.4/2.5 header match format) # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.22 # [PATCH] exterminate unused io_ops structures and switch to ulong # # The iops struct may be a good idea in the longer run but right now its # unused and its mess that can be restored neatly later on. # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.23 # [PATCH] add pio_speed # # Some drivers need this. Its in the core as the core eventually needs to # be doing the tracking here # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.24 # [PATCH] kill more ioregs, add OUTBSYNC # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.25 # [PATCH] resync externs, add execute command remove is_flashcard # # (is_flashcard is unneeded outside ide_probe as we have a drive->flash check) # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.26 # [PATCH] copy idesync # # We need to copy the new io op. Actually we need to shoot the entire mess # in this function and make the drivers always set it but not today. # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.27 # [PATCH] use ide_execute_command for CD # # This is the only user I'll feed you this time. As with 2.4 I want it to # run for a bit on read only media first 8) # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.28 # [PATCH] add a reminder for vdma on non disk # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.29 # [PATCH] clean up DMA reference, new style ONLYDISK # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.30 # [PATCH] ide-dma, fix bogus inc of waiting_for_dma # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.31 # [PATCH] update ide-floppy for new style onlydisk # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.32 # [PATCH] fix ALi 32bitisms, fix ALi FIFO, fix ALi IRQ crash # # also Enable ATI IGP/ALi combo # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.33 # [PATCH] fix some escaped globals # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.34 # [PATCH] don't force enable generic IDE controllers # # Fixes hangs on Micron Samurai boards # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.35 # [PATCH] part fix the highpoint timing/overclock bug # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.36 # [PATCH] clean up siimage, use generic mmio ops # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.37 # [PATCH] update sis driver # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.172.38 # [PATCH] make the sl82c105 work again # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.2 # ACPI: Change NUMA maintainer email # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.3 # ACPI: Eliminate use of acpi_gpl_gpe_number_info (Matthew Wilcox) # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.4 # ACPI: Support translation attribute (Bjorn Helgaas) # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.5 # ACPI: Add ability to override predefined object values (Ducrot Bruno) # -------------------------------------------- # 03/02/18 george@mvista.com 1.914.172.39 # [PATCH] POSIX clocks & timers # # This is version 23 or so of the POSIX timer code. # # Internal changelog: # # - Changed the signals code to match the new order of things. Also the # new xtime_lock code needed to be picked up. It made some things a lot # simpler. # # - Fixed a spin lock hand off problem in locking timers (thanks # to Randy). # # - Fixed nanosleep to test for out of bound nanoseconds # (thanks to Julie). # # - Fixed a couple of id deallocation bugs that left old ids # laying around (hey I get this one). # # - This version has a new timer id manager. Andrew Morton # suggested elimination of recursion (done) and I added code # to allow it to release unused nodes. The prior version only # released the leaf nodes. (The id manager uses radix tree # type nodes.) Also added is a reuse count so ids will not # repeat for at least 256 alloc/ free cycles. # # - The changes for the new sys_call restart now allow one # restart function to handle both nanosleep and clock_nanosleep. # Saves a bit of code, nice. # # - All the requested changes and Lindent too :). # # - I also broke clock_nanosleep() apart much the same way # nanosleep() was with the 2.5.50-bk5 changes. # # TIMER STORMS # # The POSIX clocks and timers code prevents "timer storms" by # not putting repeating timers back in the timer list until # the signal is delivered for the prior expiry. Timer events # missed by this delay are accounted for in the timer overrun # count. The net result is MUCH lower system overhead while # presenting the same info to the user as would be the case if # an interrupt and timer processing were required for each # increment in the overrun count. # -------------------------------------------- # 03/02/18 torvalds@penguin.transmeta.com 1.914.172.40 # Add ndelay() compatibility macro. If the architecture # doesn't define ndelay(), fall back on udelay(). # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.6 # ACPI: Decrease size of override's static array, add a define for the length, # and print a msg if used # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.7 # ACPI: Fix printk output (Jochen Hein) # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.8 # ACPI: Misc interpreter improvements # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.9 # ACPI: misc cleanups # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.10 # ACPI: Change license from GPL to dual GPL and BSD-style # -------------------------------------------- # 03/02/18 ink@jurassic.park.msu.ru 1.914.172.41 # [PATCH] numa fixes # # As Jeff pointed out, reserve_bootmem() in core_irongate.c # breaks build of generic discontiguous memory kernels because # this function doesn't exist in such kernels. # Ditto free_bootmem(). # Also, here's fixes for NUMA+initrd and memory info printk. # # Ivan. # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.164.24 # [PATCH] USB: add "present" flag to usb_device structure. # # This solves lots of races when drivers hold a reference to the usb_device # after the device is physically removed from the system (like when a user # has a open handle.) This now prevents any new urbs being submitted or # canceled for the device. # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.173.11 # ACPI: Toshiba ACPI device update (John Belmonte) # -------------------------------------------- # 03/02/18 agrover@groveronline.com 1.914.174.1 # Merge groveronline.com:/root/bk/linux-2.5 # into groveronline.com:/root/bk/linux-acpi # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.918 # Merge ssh://are.twiddle.net/BK/op-2.5 # into dorothy.sfbay.redhat.com:/dorothy/rth/linux/op-2.5 # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.919 # Merge # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.164.25 # [PATCH] USB serial: fix locking logic # # This gets rid of the port semaphore, and the serialization caused by # that, and replaces it with the proper reference counting logic for # the usb serial object. # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.164.26 # [PATCH] USB: serial core fix to solve ordering issues when destroying our objects. # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.175.1 # Merge kroah.com:/home/greg/linux/BK/bleeding_edge-2.5 # into kroah.com:/home/greg/linux/BK/gregkh-2.5 # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.175.2 # [PATCH] USB: added sched.h to usb.h # # Thanks to Matt Wilcox for the info. # -------------------------------------------- # 03/02/18 greg@kroah.com 1.914.175.3 # USB: usbnet driver also needs the crc32 code. # # Thanks to David Brownell for this. # -------------------------------------------- # 03/02/18 alan@lxorguk.ukuu.org.uk 1.914.174.2 # [PATCH] ndelay() for x86 # # The implementation is not ideal. Thats something to tidy up. # -------------------------------------------- # 03/02/18 torvalds@home.transmeta.com 1.914.174.3 # Merge bk://linuxusb.bkbits.net/linus-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/18 jgarzik@redhat.com 1.914.1.141 # Move the old wireless drivers into drivers/net/wireless: # arlan, ray_cs, and strip. # # Contributed by Randy Dunlap. # -------------------------------------------- # 03/02/18 jgarzik@redhat.com 1.914.1.142 # Merge redhat.com:/garz/repo/linus-2.5 # into redhat.com:/garz/repo/net-drivers-2.5 # -------------------------------------------- # 03/02/18 torvalds@home.transmeta.com 1.914.1.143 # Merge bk://kernel.bkbits.net/jgarzik/net-drivers-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.914.172.42 # [ALPHA] Mirror i386 change to include asm-generic/ide_iops.h. # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.914.172.43 # [ALPHA] Add clockid_t and timer_t for posix clocks. # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.920 # [OPROF] Update for change to cpu_type interface. # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.914.1.144 # Merge dorothy.sfbay.redhat.com:/dorothy/rth/linux/linus-2.5 # into dorothy.sfbay.redhat.com:/dorothy/rth/linux/axp-2.5 # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.921 # [OPROF] Fix arguments to oprofile_add_sample. # -------------------------------------------- # 03/02/18 rth@dorothy.sfbay.redhat.com 1.922 # Merge dorothy.sfbay.redhat.com:/dorothy/rth/linux/linus-2.5 # into dorothy.sfbay.redhat.com:/dorothy/rth/linux/op-2.5 # -------------------------------------------- # 03/02/18 stevef@smfhome1.austin.rr.com 1.914.176.1 # Remove compiler warnings and allow reconnection of tids after temporary tcp session failure # -------------------------------------------- # 03/02/18 torvalds@home.transmeta.com 1.914.1.145 # Merge bk://are.twiddle.net/pci-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/18 kaber@trash.net 1.914.171.2 # [IPV{4,6}]: lru queue for ip_fragment evictor. # The current ip_fragment evictor kills the oldest entry of each hash bucket # starting with 0 instead of killing the oldest entry of all buckets. This # leads # to unfair behaviour if one of the higher hash slots carries alot of # fragments. # This patch holds the frag heads in a lru queue so we can kills the least # recently used first. Each arriving fragment counts as usage. # -------------------------------------------- # 03/02/18 torvalds@home.transmeta.com 1.923 # Merge bk://are.twiddle.net/op-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.924 # [PATCH] spelling fix accessable -> accessible # # This provides the following spelling fix. # # accessable -> accessible # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.925 # [PATCH] spelling fix adress/addres -> address # # This patch provides the following spelling fixes. # # adress -> address # addres -> address # # except for cases in two files which appear to be in French and German. # These were left as is. # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.926 # [PATCH] spelling fix for interupt -> interrupt # # This patch provides the following spelling fix. # # interupt -> interrupt # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.927 # [PATCH] spelling fix for compatable -> compatible # # This patch provides the following spelling fixes. # # compatable -> compatible # compatability -> compatibility # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.928 # [PATCH] spelling fix for propogate -> propagate # # This patch provides the following spelling fix. # # propogate -> propagate # -------------------------------------------- # 03/02/18 elenstev@mesatop.com 1.929 # [PATCH] various spelling fixes # # This provides the following spelling fixes. # # posible -> possible # messsage -> message # reqeuest -> request # exeption -> exception # seqeunce -> sequence # loggger -> logger # resposible -> responsible # qeueu -> queue # microsecnds -> microseconds # positiion -> position # feilds -> fields # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.930 # [PATCH] signal warning and uninitialised variable fix # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.931 # [PATCH] MPT Fusion build fix # # Patch from Hugh Dickins # # 2.5.62's removal of scsi_set_pci_device broke the MPT Fusion build. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.932 # [PATCH] fix for uninitialized timer in drm_drv.h # # Patch from Martin Josefsson # # Here's a fix for an uninitialized timer in drm_drv.h, for some reason it # initilizes the timer when the device is opened, not at init. It moves # the initilization for the waitqueue to init aswell. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.933 # [PATCH] export add_to_page_cache() and __pagevec_lru_add to # # CIFS is using these. # # Given that the readpages() address_space op is supposed to add the pages to # pagecache, it makes sense to make these functions available to modules. # # I can't say that I put a lot of though into the readpages API. It was # designed as just enough functionality to be able to stuff a bunch of # readahead pages into a single BIO. The only reason I made it an a_op at all # was because we have toi enter the fs to pick up the ->get_block callback's # address. # # But a couple of filesystems seem to be making use of it now. Reiser4 will # need access at the do_page_cache_readahead() level too. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.934 # [PATCH] Move mk_pte_huge() into pgtable.h # # Patch from Andi Kleen # # This simple patch allow me to symlink hugetlbpage.c for x86-64. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.935 # [PATCH] fix kirq for clustered apic mode # # Patch from Dave Hansen # # The new kirq patch assumes flat addressing APIC mode where apicid = (1 # << cpu). This isn't true for clustered mode. # # - Change name/type of irq_balance_mask. The type of apicid seems to # be int. # - Change instance of (1< # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.938 # [PATCH] Fix warnings for NTFS # # Patch from Stephen Hemminger # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.939 # [PATCH] allow SMP kernel build without io_apic.c # # Patch from Andrey Panin # # I'm here again, starting another hopeless attempt to submmit # visws subarch support for 2.5. This series of patches was tested # by me and brave people from linux-visws-devel mailing list and # our beloved workstations seem to work well under 2.5.xx. # # This patch moves enable_NMI_through_LVT0() function from io_apic.c # to apic.c to allow SMP kernel build without io_apic.c included. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.940 # [PATCH] export some functions from i8259.c # # Patch from Andrey Panin # # This trivial patch exports some functions from 8259.c file. # Visws subarch needs them to handle interrupts from legacy devices # connected to PIIX4 i8259s, which are in turn connected to SGI # Cobalt APIC. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.941 # [PATCH] make startup_32 kernel entry point # # Patch from Andrey Panin # # This patch marks startup_32 (in head.S) as kernel entry point, # visws kernel loader uses raw elf kernel images and entry point # at stext causes jump to wrong address. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.942 # [PATCH] export boottime gdt descriptor # # Patch from Andrey Panin # # This simple patch exports boottime gdt descriptor from trampoline.S. # Visws uses it to initialize bootup cpu before running the rest of head.S # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.943 # [PATCH] visws: boot changes # # Patch from Andrey Panin # # This simple patch adds some additional code into head.S. # # On visws bootup cpu starts in protected mode (so we don't need # setup.S), but setting up pagetables and gdt is required before # running rest of head.S. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.944 # [PATCH] visws: move header file into asm/arch-visws # # Patch from Andrey Panin # # This trivial patch moves visws related header files into asm/mach-visws. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.945 # [PATCH] visws: add missing mach_apic.h file # # Patch from Andrey Panin # # This patch adds misiing mach_apic.h file. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.946 # [PATCH] visws: pci support # # Patch from Andrey Panin # # This patch contains update of pci support for visws. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.947 # [PATCH] visws: core # # Patch from Andrey Panin # # This patch contains core support for visws subarch. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.948 # [PATCH] visws: framebuffer driver update # # Patch from Andrey Panin # # This patch contains SGI visws framebuffer update. Patch makes it # compile again and brings flatpanel monitor support back. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.949 # [PATCH] visws: sound update # # Patch from Andrey Panin # # This patch contains SGI visws OSS sound driver update. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.950 # [PATCH] visws: MAINTAINERS file update # # Patch from Andrey Panin # # Looks like I'm a maintainer of visws support now :)) # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.951 # [PATCH] visws: i386/KConfig update # # Patch from Andrey Panin # # And finally, attached patch enables visws subarch support # in kernel config. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.952 # [PATCH] fix a visws compile warning # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.953 # [PATCH] consolidate and cleanup profiling code. # # Patch from Nikita Danilov # # this moves functions from identical per-architecture # arch/*/kernel/profile.c into generic kernel/profile.c. Also, identical # {x86,parisc,ppc64,sparc64}_profile_hook()'s are all replaced by the # single kernel/profile.c:profile_hook(), which is #defined to noop in # include/linux/profile.h if CONFIG_PROFILING is not set. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.954 # [PATCH] more ia32 profiler cleanups # # Make the prof_counter and prof_old_counter arrays use per-cpu data, and give # them static scope. # # Also fix a signedness bug in the voyager implementation (from James) # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.955 # [PATCH] TTY module refcounting fix # # Patch from Max Krasnyansky # # This changeset adds module refcounting for TTY line disciplines. I've sent # the patch to LKM earlier. No negative comments (actually most people didn't # seem to care). This is needed at least for Bluetooth and IrDA (Jean is ok # with the patch). # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.956 # [PATCH] remove (start|end)_lazy_tlb() # # Patch from William Lee Irwin III # # Remove start_lazy_tlb() and end_lazy_tlb(), as they are unused. # -------------------------------------------- # 03/02/18 akpm@digeo.com 1.957 # [PATCH] lib/idr.c 64-bit fixes # # Various overflow problems compiling the lib/idr.c code for ppc64 # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.958 # [PATCH] Handle null OLD argument in nb85e_uart's nb85e_uart_set_termios function # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.959 # [PATCH] Fix up some left-over sig->sighand issues on the v850 # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.960 # [PATCH] Add v850 version of `init_irq_proc' for sysctl # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.961 # [PATCH] Set child process initial stack-pointers correctly on the v850 # # Previously the v850's copy_thread function didn't set the child's stack # pointer at all, with the result that it accidentally worked for vfork # (where the child has the same SP as the parent), but not for user # threads; kernel threads also accidentally worked, for a different # reason. # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.962 # [PATCH] Remove unused compile-time configuration options on v850 # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.963 # [PATCH] Use .balign rather than .align for v850 asm funcs # # Removes a bunch of unnecessary nops... :-) # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.964 # [PATCH] v850 kernel entry fixes and cleanup # # 1) Preserve the v850 system-call-number register when handling a signal; # otherwise system calls will not be correctly restarted afterwards # 2) Correctly handle illegal insn exceptions, which need a special # instruction to return (not reti), and save PC/PSW to a different place # 2) Remove some unnecessary register saving in the trap handler # 3) Consolidate various places that use the register save/restore macros # 4) Eliminate some unused compile-time configuration stuff # 5) A bit of whitespace and other syntactic cleanup # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.965 # [PATCH] Implement for v850 # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.966 # [PATCH] Add a v850 config option to pass illegal insn traps to the kernel # # On the v850 RTE-MA1-CB-MULTI platform, these are normally intercepted by # the monitor for the use of an external debugger, but if you want to use # a linux-resident debugger, the kernel has to see them. # -------------------------------------------- # 03/02/18 miles@lsi.nec.co.jp 1.967 # [PATCH] Force v850 interrupt vector parts into their correct locations # # Otherwise a if one them is partially empty, the following input section # can end up in the wrong place. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.968 # [PATCH] init sighand in m68knommu init_task # # Add initialization of init_sighand for m68knommu architectures. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.969 # [PATCH] add exception table support for m68knommu architecture # # This patch adds exception table support for the m68knommu architecture. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.970 # [PATCH] m68knommu cacheflush.h cleanup # # This patch overhauls the cache support routines for the m68knommu # architecture. It removes depricated functions, and fixes those required # to operate as per Documentation/cachetlb.txt. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.971 # [PATCH] fixup use of sighand in m68knommu signal.c # # This patch fixes the use of sighand for the m68knommu architecture. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.972 # [PATCH] bounds check and no argv/envp support for binfmt_flat load # # This patch to the MMUless flat loader does 2 important things: # # 1. Allow for architectures that do not want argv and envp on # the initial process stack (v850 is an example of this) # 2. Does some bounds checking on the zipped flat header when # processing it. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.973 # [PATCH] add extable.c to Makefile for m68knommu architecture # # Add exception table support to Makefile build list for m68knommu. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.974 # [PATCH] fix m68knommu/ColdFire serial port hang # # This patches fixes a serial port "hang" on the m68knommu ColdFire # serial driver. It was erroneoulsy looking for a state bit that # is never set. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.975 # [PATCH] add m68knommu serial console support into tty_io.c # # This patch initializes the m68knommu specific serial drivers (68328serial.c, # mcfserial.c and 68360serial.c) when used as consoles. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.976 # [PATCH] add missing m68knommu/68VZ328/ucdimm/config.c # # This adds the missing config.c file for the m68knommu/68VZ328/ucdimm # target. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.977 # [PATCH] reformat m68knommu 68360/uCquicc crt0_rom.S # # This patch reformats the 68360 crt_rom.S file to make it consistent # with the other m68knommu assembler files, and generally to good # style standards :-) # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.978 # [PATCH] create common vector setup code for m68knommu/ColdFire # # This patch creates a common set of vector code for the ColdFire # sub-architecture of the m68knommu architecture. The basic setup # code for all ColdFire CPU's is the same. Some more patches will # follow this that remove theis common code from each of the # ColdFire CPU configs. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.979 # [PATCH] reformat m68knommu 68328/pilot crt0_rom.S # # This patch reformats the 68328/pilot crt_rom.S file to make it consistent # with the other m68knommu assembler files, and generally to good style # standards :-) # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.980 # [PATCH] create an architecture specific flat header for v850 # # This patch adds a v850 architecture specific flat file header. # It supports the stack layout define needed by the flat format # load binfmt_flat.c (for MMUless CPU's). # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.981 # [PATCH] include the architecture flat file header in common flat header # # This patch adds support into the common flat.h header to include # the architecture specific flat.h header. This is modelled on the # same scheme as the elf include header file support. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.982 # [PATCH] inline unsued functions for MMUless configuration # # This patch adds inline versions of init_emergency_isa_pool() and # blk_queue_bounce() for MMUless builds. This patch was originally # from Christoph Hellwig, as part of the MMUless merge. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.983 # [PATCH] reformat m68knommu 68360/uCquicc crt0_ram.S # # This patch reformats the 68360 crt_ram.S file to make it consistent # with the other m68knommu assembler files, and generally to good # style standards :-) # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.984 # [PATCH] use local RODATA setup for m68knommu linker script # # This patch removes the use of the common RODATA define in the m68knommu # architecture. It cannot be used the same way for the m68knommu target. # For starters just inserting it here is syntactically wrong. All the read # only parts are grouped into a single "text" segment, and this is the root # cause of the problem. So for the m68knommu arch it makes sense to not # use the generic RODATA setup, but to list them locally. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.985 # [PATCH] clean up compiler warnings in m68knommu machdep.h # # This patch includes seq_file.h in the m68knommu machdep.h header. # Cleans up warnings caused by function prototypes. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.986 # [PATCH] remove duplicate memory size option in m68knommu Kconfig # # This patch removes a duplicate menu option in the m68knommu Kconfig. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.987 # [PATCH] fix text and data sizing in MMUless task_nommu.c # # This patch does a couple of things to the MMUless proc support: # # 1. change current->sig to current->sighand # 2. initialize vsize var in task_vsize() function # 3. correctly set *text and *data values in task_vsize() function # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.988 # [PATCH] create an architecture specific flat header for m68knommu # # Add a per-architecture flat.h flat format executable header. The idea is # to support the different options required in a clean way. For starters # we need to be able to configure the initial stack layout, and this # differs for different CPU types. # # This first patch adds the header for the m68knommu architecture. # -------------------------------------------- # 03/02/18 gerg@snapgear.com 1.989 # [PATCH] add missing page_referenced() for MMUless configs # # This patch adds the missing page_reference() macro for the no swap # case. With no rmap this is trivially a call to TestClearPageReferenced(). # -------------------------------------------- # 03/02/18 Petri.Koistinen@iki.fi 1.990 # [PATCH] update README file to current realities. # # Document "patch -p1" behaviour of modern patches, and remove make dep # phase that isn't needed any more. # -------------------------------------------- # 03/02/18 rth@kanga.twiddle.net 1.991 # Merge ssh://are/BK/axp-2.5 # into kanga.twiddle.net:/home/rth/linux/axp-2.5 # -------------------------------------------- # 03/02/18 sfr@canb.auug.org.au 1.990.1.1 # [COMPAT]: compat_sys_futex sparc64. # -------------------------------------------- # 03/02/18 davem@nuts.ninka.net 1.990.1.2 # [SPARC]: Add timer_t and clockid_t. # -------------------------------------------- # 03/02/19 rob@osinvestor.com 1.990.1.3 # [SPARC] Fix compilation of sunsu.c and sunzilog.c # -------------------------------------------- # 03/02/19 hch@lab343.munich.sgi.com 1.990.2.1 # Merge http://linux.bkbits.net/linux-2.5 # into lab343.munich.sgi.com:/home/hch/repo/bkbits/linux-2.5 # -------------------------------------------- # 03/02/19 akpm@digeo.com 1.990.3.1 # [PATCH] posix-timers: fix callback address truncation # # Casting a 64-bit address to int, then to unsigned long will truncate it. # -------------------------------------------- # 03/02/19 lord@sgi.com 1.990.2.2 # [XFS] cleanup delayed allocate write path a little and fix some # small bugs in there. # # SGI Modid: 2.5.x-xfs:slinx:138445a # -------------------------------------------- # 03/02/19 lord@sgi.com 1.990.2.3 # [XFS] fix a couple of memory leaks found by stanford checker # # SGI Modid: 2.5.x-xfs:slinx:138812a # -------------------------------------------- # 03/02/19 hch@sgi.com 1.990.2.4 # [XFS] make pagebuf_delwri_queue static # # SGI Modid: 2.5.x-xfs:slinx:138828a # -------------------------------------------- # 03/02/19 nathans@sgi.com 1.990.2.5 # [XFS] Extra check on the mount path - ensure we don't attempt to mount XFS fs's # with sector sizes smaller than those the device supports. Tripped a BUG # in pagebuf, should now be resolved. # # SGI Modid: 2.5.x-xfs:slinx:139328a # -------------------------------------------- # 03/02/19 kaos@sgi.com 1.990.2.6 # [XFS] XFS patches from 2.5.60-mm1 # # SGI Modid: 2.5.x-xfs:slinx:139330a # -------------------------------------------- # 03/02/19 overby@sgi.com 1.990.2.7 # [XFS] fix one more set of transaction callback ordering issues, # this was always there, but exposed by the last change in # this area and made much more likely. # # SGI Modid: 2.5.x-xfs:slinx:139655a # -------------------------------------------- # 03/02/19 sandeen@sgi.com 1.990.2.8 # [XFS] Remove unused init_spinlock #define # # SGI Modid: 2.5.x-xfs:slinx:139854a # -------------------------------------------- # 03/02/19 rth@twiddle.net 1.990.3.2 # [PATCH] eliminate warnings in generated module files # # The compiler.h fragment should describe the problem well enough. # -------------------------------------------- # 03/02/19 hch@sgi.com 1.990.2.9 # [XFS] insert dirty buffers at the tail of the inode queue # # SGI Modid: 2.5.x-xfs:slinx:139992a # -------------------------------------------- # 03/02/19 hch@sgi.com 1.990.2.10 # [XFS] Under heavy load, there are not enough hash buckets to deal with # the number of metadata buffers. Use the same techniques as the # regular linux buffer cache here. # # use more hash buckets for holding xfs metadata, and use the same # hash algorithm as the regular buffer cache. # # SGI Modid: 2.5.x-xfs:slinx:139997a # -------------------------------------------- # 03/02/19 hch@hera.kernel.org 1.990.2.11 # Merge # -------------------------------------------- # 03/02/19 rth@kanga.twiddle.net 1.992 # [ALPHA] Implement ndelay. # -------------------------------------------- # 03/02/19 rth@kanga.twiddle.net 1.993 # [ALPHA] Collection of warning fixes. # -------------------------------------------- # 03/02/19 rth@kanga.twiddle.net 1.994 # [ALPHA] Turn on -Werror in alpha subdirectories. # -------------------------------------------- # 03/02/19 rth@kanga.twiddle.net 1.995 # [ALPHA] Use more compiler builtins instead of inline assembly. # -------------------------------------------- # 03/02/19 rth@kanga.twiddle.net 1.996 # Merge kanga.twiddle.net:/home/rth/linux/linus-2.5 # into kanga.twiddle.net:/home/rth/linux/axp-2.5 # -------------------------------------------- # 03/02/19 yoshfuji@linux-ipv6.org 1.914.171.3 # [AF_KEY]: Add missing credit. # -------------------------------------------- # 03/02/19 yoshfuji@linux-ipv6.org 1.914.171.4 # [NET]: Convert dst->{input,output}() fully to dst_{input,output}(). # -------------------------------------------- # 03/02/19 mk@linux-ipv6.org 1.914.171.5 # [IPSEC]: Add missing credit and include to xfrm_user ipv6 changes. # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.990.1.4 # [SOUND]: ac97_codec.c needs linux/pci.h # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.990.1.5 # [SPARC]: Fixup asm/ide.h headers for Alans recent IDE merge. # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.914.171.6 # [IPSEC]: Move xfrm6 policy code to net/ipv4/xfrm_policy.c # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.914.171.7 # [IPSEC]: Export xfrm6 type registry interfaces. # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.914.171.8 # [IPSEC]: Remove xfrm6 exports from ipv6_syms.c # -------------------------------------------- # 03/02/19 davem@kernel.bkbits.net 1.990.3.3 # Merge davem@nuts.ninka.net:/home/davem/src/BK/net-2.5 # into kernel.bkbits.net:/home/davem/net-2.5 # -------------------------------------------- # 03/02/19 davem@nuts.ninka.net 1.990.1.6 # [SPARC64]: oprofile/timer_int.c needs linux/profile.h # -------------------------------------------- # 03/02/19 davem@kernel.bkbits.net 1.990.1.7 # Merge davem@nuts.ninka.net:/home/davem/src/BK/sparc-2.5 # into kernel.bkbits.net:/home/davem/sparc-2.5 # -------------------------------------------- # 03/02/19 zaitcev@redhat.com 1.990.4.1 # [SPARC]: Kconfig help update. # -------------------------------------------- # 03/02/19 zaitcev@redhat.com 1.990.4.2 # [SPARC]: Add rtc_lock. # -------------------------------------------- # 03/02/19 davem@kernel.bkbits.net 1.990.1.8 # Merge davem@nuts.ninka.net:/home/davem/src/BK/sparc-2.5 # into kernel.bkbits.net:/home/davem/sparc-2.5 # -------------------------------------------- # 03/02/19 torvalds@home.transmeta.com 1.990.1.9 # Merge bk://kernel.bkbits.net/davem/sparc-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/19 torvalds@home.transmeta.com 1.990.1.10 # Merge master.kernel.org:/home/hch/BK/xfs/linux-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/19 torvalds@home.transmeta.com 1.990.1.11 # Merge bk://cifs.bkbits.net/linux-2.5cifs # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/19 torvalds@home.transmeta.com 1.997 # Merge bk://are.twiddle.net/axp-2.5 # into home.transmeta.com:/home/torvalds/v2.5/linux # -------------------------------------------- # 03/02/19 hch@sgi.com 1.998 # [PATCH] i2c sanity # # small updates to bring us nearer the lm_Sensors CVS (docs, comments, # missing statics, named initializers). I still need to review their # actual code changes before submitting those.. # -------------------------------------------- # 03/02/19 hch@sgi.com 1.999 # [PATCH] get rid of some kdevname abuse # # Use cdevname instead in the serial driver printk cut & pasted into about # a dozend places. # -------------------------------------------- # 03/02/19 hch@lst.de 1.1000 # [PATCH] remove some dead mtrr code # # This patch removes the devfs interface code in mtrr that has been # stubbed out by an ifdef forever. It's one of the few remaining users # of regular files on devfs so there's some urge for me to get rid of it :) # -------------------------------------------- # 03/02/19 hch@sgi.com 1.1001 # [PATCH] kill EXPORT_NO_SYMBOLS # # it's a noop in 2.5 now that the behvaiour of implicitly exporting # all symbols is gone. # -------------------------------------------- # 03/02/19 torvalds@home.transmeta.com 1.1002 # Add doublefault handling with a task gate. # # This potentially helps debugging, since otherwise a double fault # would generate a triple fault and then reboot the machine. Now # instead it can print out a note about where the problem happened, # unless all the kernel data structures are truly buggered. # -------------------------------------------- # 03/02/20 levon@movementarian.org 1.1003 # [PATCH] oprofile author needs to learn C # # Manifested as X profile appearing as /dev/mem ... # -------------------------------------------- # 03/02/20 akpm@digeo.com 1.1004 # [PATCH] Keep interrupts enabled in exit path # # We are leaving local interrupts disabled coming out of exit_notify(). # # But we are about to call wait_task_inactive() which spins, waiting for # another CPU to end a task. If that CPU has issued smp_call_function() to # this CPU, deadlock. # # So the patch enables interrupts again before returning from exit_notify(). # # Also, exit_notify() returns with preemption disabled, so there is no # need to perform another preempt_disable() in do_exit(). # -------------------------------------------- # 03/02/20 akpm@digeo.com 1.1005 # [PATCH] Don't call mmdrop under a spinlock # # We're calling mmdrop() under spin_lock_irq(&rq->lock). But mmdrop # calls vfree(), which calls smp_call_function(). # # It is not legal to call smp_call_function() with irq's off. Because # another CPU may be running smp_call_function() against _this_ CPU, which # deadlocks. # # So the patch arranges for mmdrop() to not be called under # spin_lock_irq(&rq->lock). # -------------------------------------------- # 03/02/20 haveblue@us.ibm.com 1.1006 # [PATCH] make io_apic.c use named initializers # # Bill Irwin was talking about hw_interrupt_type.set_affinity and kirq. # When I went looking, I failed to find this initialization. # # Here are some nice, easy-to-find, named initializers. # -------------------------------------------- # 03/02/20 torvalds@home.transmeta.com 1.1007 # Fix x86 "switch_to()" to properly set the previous task information, # which is needed to keep track of process usage counts correctly and # efficiently. # -------------------------------------------- # 03/02/20 torvalds@home.transmeta.com 1.1008 # Fix "make clean" to remove scripts/elfconfig.h # -------------------------------------------- # diff -Nru a/CREDITS b/CREDITS --- a/CREDITS Thu Feb 20 23:19:22 2003 +++ b/CREDITS Thu Feb 20 23:19:22 2003 @@ -2746,6 +2746,14 @@ E: wsalamon@nai.com D: portions of the Linux Security Module (LSM) framework and security modules +N: Duncan Sands +E: duncan.sands@wanadoo.fr +W: http://topo.math.u-psud.fr/~sands +D: Alcatel SpeedTouch USB driver +S: 69 rue Dunois +S: 75013 Paris +S: France + N: Robert Sanders E: gt8134b@prism.gatech.edu D: Dosemu diff -Nru a/Documentation/DocBook/kernel-hacking.tmpl b/Documentation/DocBook/kernel-hacking.tmpl --- a/Documentation/DocBook/kernel-hacking.tmpl Thu Feb 20 23:19:22 2003 +++ b/Documentation/DocBook/kernel-hacking.tmpl Thu Feb 20 23:19:22 2003 @@ -993,25 +993,6 @@ - - <symbol>EXPORT_NO_SYMBOLS</symbol> - <filename class=headerfile>include/linux/module.h</filename> - - - If a module exports no symbols then you can specify - -EXPORT_NO_SYMBOLS; - - anywhere in the module. - In kernel 2.4 and earlier, if a module contains neither - EXPORT_SYMBOL() nor - EXPORT_NO_SYMBOLS then the module defaults to - exporting all non-static global symbols. - In kernel 2.5 onwards you must explicitly specify whether a module - exports symbols or not. - - - <function>EXPORT_SYMBOL_GPL()</function> <filename class=headerfile>include/linux/module.h</filename> diff -Nru a/Documentation/DocBook/videobook.tmpl b/Documentation/DocBook/videobook.tmpl --- a/Documentation/DocBook/videobook.tmpl Thu Feb 20 23:19:24 2003 +++ b/Documentation/DocBook/videobook.tmpl Thu Feb 20 23:19:24 2003 @@ -739,8 +739,6 @@ MODULE_PARM(io, "i"); MODULE_PARM_DESC(io, "I/O address of the card."); -EXPORT_NO_SYMBOLS; - int init_module(void) { if(io==-1) diff -Nru a/Documentation/i2c/i2c-protocol b/Documentation/i2c/i2c-protocol --- a/Documentation/i2c/i2c-protocol Thu Feb 20 23:19:23 2003 +++ b/Documentation/i2c/i2c-protocol Thu Feb 20 23:19:23 2003 @@ -52,10 +52,10 @@ We have found some I2C devices that needs the following modifications: Flag I2C_M_NOSTART: - In a combined transaction, no 'S Addr' is generated at some point. - For example, setting I2C_M_NOSTART on the second partial message + In a combined transaction, no 'S Addr Wr/Rd [A]' is generated at some + point. For example, setting I2C_M_NOSTART on the second partial message generates something like: - S Addr Rd [A] [Data] NA Wr [A] Data [A] P + S Addr Rd [A] [Data] NA Data [A] P If you set the I2C_M_NOSTART variable for the first partial message, we do not generate Addr, but we do generate the startbit S. This will probably confuse all other clients on your bus, so don't try this. @@ -65,4 +65,12 @@ need to emit an Rd instead of a Wr, or vice versa, you set this flag. For example: S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P - + + Flags I2C_M_IGNORE_NAK + Normally message is interrupted immediately if there is [NA] from the + client. Setting this flag treats any [NA] as [A], and all of + message is sent. + These messages may still fail to SCL lo->hi timeout. + + Flags I2C_M_NO_RD_ACK + In a read message, master A/NA bit is skipped. diff -Nru a/Documentation/i2c/smbus-protocol b/Documentation/i2c/smbus-protocol --- a/Documentation/i2c/smbus-protocol Thu Feb 20 23:19:23 2003 +++ b/Documentation/i2c/smbus-protocol Thu Feb 20 23:19:23 2003 @@ -61,7 +61,7 @@ This is the reverse of Read Byte: it sends a single byte to a device. See Read Byte for more information. -S Addr Wr [A] Data NA P +S Addr Wr [A] Data [A] P SMBus Read Byte Data diff -Nru a/Documentation/i2c/summary b/Documentation/i2c/summary --- a/Documentation/i2c/summary Thu Feb 20 23:19:22 2003 +++ b/Documentation/i2c/summary Thu Feb 20 23:19:22 2003 @@ -4,7 +4,7 @@ ============= I2C (pronounce: I squared C) is a protocol developed by Philips. It is a -slow two-wire protocol (10-100 kHz), but it suffices for many types of +slow two-wire protocol (10-400 kHz), but it suffices for many types of devices. SMBus (System Management Bus) is a subset of the I2C protocol. Many @@ -43,15 +43,15 @@ Included Bus Drivers ==================== -Note that not only stable drivers are patched into the kernel by 'mkpatch'. +Note that only stable drivers are patched into the kernel by 'mkpatch'. Base modules ------------ -i2c-core: The basic I2C code, including the /proc interface -i2c-dev: The /dev interface -i2c-proc: The /proc interface for device (client) drivers +i2c-core: The basic I2C code, including the /proc/bus/i2c* interface +i2c-dev: The /dev/i2c-* interface +i2c-proc: The /proc/sys/dev/sensors interface for device (client) drivers Algorithm drivers ----------------- @@ -59,7 +59,7 @@ i2c-algo-8xx: An algorithm for CPM's I2C device in Motorola 8xx processors (NOT BUILT BY DEFAULT) i2c-algo-bit: A bit-banging algorithm i2c-algo-pcf: A PCF 8584 style algorithm -i2c-algo-ibmocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT) +i2c-algo-ibm_ocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT) Adapter drivers --------------- @@ -68,7 +68,7 @@ i2c-elv: ELV parallel port adapter (uses i2c-algo-bit) i2c-pcf-epp: PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (NOT mkpatched) i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit) -i2c-adap_ibmocp: IBM 4xx processor I2C device (uses i2c-algo-ibmocp) (NOT BUILT BY DEFAULT) +i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT) i2c-pport: Primitive parallel port adapter (uses i2c-algo-bit) i2c-rpx: RPX board Motorola 8xx I2C device (uses i2c-algo-8xx) (NOT BUILT BY DEFAULT) i2c-velleman: Velleman K9000 parallel port adapter (uses i2c-algo-bit) diff -Nru a/Documentation/i2c/writing-clients b/Documentation/i2c/writing-clients --- a/Documentation/i2c/writing-clients Thu Feb 20 23:19:20 2003 +++ b/Documentation/i2c/writing-clients Thu Feb 20 23:19:20 2003 @@ -448,9 +448,9 @@ /* Note that we reserve some space for foo_data too. If you don't need it, remove it. We do it here to help to lessen memory fragmentation. */ - if (! (new_client = kmalloc(sizeof(struct i2c_client)) + + if (! (new_client = kmalloc(sizeof(struct i2c_client) + sizeof(struct foo_data), - GFP_KERNEL)) { + GFP_KERNEL))) { err = -ENOMEM; goto ERROR0; } diff -Nru a/Documentation/networking/8139too.txt b/Documentation/networking/8139too.txt --- a/Documentation/networking/8139too.txt Thu Feb 20 23:19:22 2003 +++ b/Documentation/networking/8139too.txt Thu Feb 20 23:19:22 2003 @@ -93,6 +93,8 @@ --------------- AOpen ALN-325C AT-2500TX 10/100 PCI Fast Ethernet Network Adapter Card +Cnet CNF401 'SinglePoint' 10/100 Base-TX +Genius GF 100TXR4 Fast Ethernet 10/100M PCI Network Card KTI KF-230TX KTI KF-230TX/2 Lantech FastNet TX diff -Nru a/Documentation/networking/alias.txt b/Documentation/networking/alias.txt --- a/Documentation/networking/alias.txt Thu Feb 20 23:19:21 2003 +++ b/Documentation/networking/alias.txt Thu Feb 20 23:19:21 2003 @@ -2,7 +2,7 @@ IP-Aliasing: ============ -IP-aliases are additional IP-adresses/masks hooked up to a base +IP-aliases are additional IP-addresses/masks hooked up to a base interface by adding a colon and a string when running ifconfig. This string is usually numeric, but this is not a must. diff -Nru a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt --- a/Documentation/networking/bonding.txt Thu Feb 20 23:19:20 2003 +++ b/Documentation/networking/bonding.txt Thu Feb 20 23:19:20 2003 @@ -258,7 +258,7 @@ Specifies the ip addresses to use when arp_interval is > 0. These are the targets of the ARP request sent to determine the health of the link to the targets. Specify these values in ddd.ddd.ddd.ddd format. - Multiple ip adresses must be separated by a comma. At least one ip + Multiple ip addresses must be separated by a comma. At least one ip address needs to be given for ARP monitoring to work. The maximum number of targets that can be specified is set at 16. diff -Nru a/Documentation/pnp.txt b/Documentation/pnp.txt --- a/Documentation/pnp.txt Thu Feb 20 23:19:20 2003 +++ b/Documentation/pnp.txt Thu Feb 20 23:19:20 2003 @@ -233,7 +233,7 @@ The Old Way ........... -a series of compatability functions have been created to make it easy to convert +a series of compatibility functions have been created to make it easy to convert ISAPNP drivers. They should serve as a temporary solution only. diff -Nru a/Documentation/rpc-cache.txt b/Documentation/rpc-cache.txt --- a/Documentation/rpc-cache.txt Thu Feb 20 23:19:20 2003 +++ b/Documentation/rpc-cache.txt Thu Feb 20 23:19:20 2003 @@ -146,7 +146,7 @@ Note: If a cache has no active readers on the channel, and has had not active readers for more than 60 seconds, further requests will not be added to the channel but instead all looks that do not find a valid -entry will fail. This is partly for backward compatability: The +entry will fail. This is partly for backward compatibility: The previous nfs exports table was deemed to be authoritative and a failed lookup meant a definite 'no'. diff -Nru a/Documentation/s390/Debugging390.txt b/Documentation/s390/Debugging390.txt --- a/Documentation/s390/Debugging390.txt Thu Feb 20 23:19:20 2003 +++ b/Documentation/s390/Debugging390.txt Thu Feb 20 23:19:20 2003 @@ -97,7 +97,7 @@ 6 6 Input/Output interrupt Mask 7 7 External interrupt Mask used primarily for interprocessor signalling & - clock interupts. + clock interrupts. 8-11 8-11 PSW Key used for complex memory protection mechanism not used under linux @@ -2423,7 +2423,7 @@ There is a new device layer for channel devices, some drivers e.g. lcs are registered with this layer. If the device uses the channel device layer you'll be -able to find what interupts it uses & the current state +able to find what interrupts it uses & the current state of the device. See the manpage chandev.8 &type cat /proc/chandev for more info. diff -Nru a/Documentation/s390/cds.txt b/Documentation/s390/cds.txt --- a/Documentation/s390/cds.txt Thu Feb 20 23:19:23 2003 +++ b/Documentation/s390/cds.txt Thu Feb 20 23:19:23 2003 @@ -286,7 +286,7 @@ struct ccw1 { __u8 cmd_code;/* command code */ - __u8 flags; /* flags, like IDA adressing, etc. */ + __u8 flags; /* flags, like IDA addressing, etc. */ __u16 count; /* byte count */ __u32 cda; /* data address */ } __attribute__ ((packed,aligned(8))); diff -Nru a/Documentation/scsi/ChangeLog.sym53c8xx_2 b/Documentation/scsi/ChangeLog.sym53c8xx_2 --- a/Documentation/scsi/ChangeLog.sym53c8xx_2 Thu Feb 20 23:19:21 2003 +++ b/Documentation/scsi/ChangeLog.sym53c8xx_2 Thu Feb 20 23:19:21 2003 @@ -102,7 +102,7 @@ Sun Sep 9 18:00 2001 Gerard Roudier * version sym-2.1.12-20010909 - Change my email address. - - Add infrastructure for the forthcoming 64 bit DMA adressing support. + - Add infrastructure for the forthcoming 64 bit DMA addressing support. (Based on PCI 64 bit patch from David S. Miller) - Donnot use anymore vm_offset_t type. diff -Nru a/Documentation/scsi/scsi_mid_low_api.txt b/Documentation/scsi/scsi_mid_low_api.txt --- a/Documentation/scsi/scsi_mid_low_api.txt Thu Feb 20 23:19:23 2003 +++ b/Documentation/scsi/scsi_mid_low_api.txt Thu Feb 20 23:19:23 2003 @@ -404,15 +404,15 @@ /** - * scsi_set_pci_device - place PCI device reference in host structure + * scsi_set_device - place device reference in host structure * @shost: a pointer to a scsi host instance - * @pdev: pointer to PCI device instance to assign + * @pdev: pointer to device instance to assign * * Returns nothing * * Notes: Defined in drivers/scsi/hosts.h . **/ -void scsi_set_pci_device(struct Scsi_Host * shost, struct pci_dev * pdev) +void scsi_set_device(struct Scsi_Host * shost, struct device * dev) /** diff -Nru a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl --- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl Thu Feb 20 23:19:20 2003 +++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl Thu Feb 20 23:19:20 2003 @@ -1377,8 +1377,6 @@ module_init(alsa_card_mychip_init) module_exit(alsa_card_mychip_exit) - - EXPORT_NO_SYMBOLS; /* for old kernels only */ ]]> diff -Nru a/Documentation/sound/oss/PSS-updates b/Documentation/sound/oss/PSS-updates --- a/Documentation/sound/oss/PSS-updates Thu Feb 20 23:19:24 2003 +++ b/Documentation/sound/oss/PSS-updates Thu Feb 20 23:19:24 2003 @@ -10,7 +10,7 @@ This parameter is basically a flag. A 0 will leave the joystick port disabled, while a non-zero value would enable the joystick port. The default -setting is pss_enable_joystick=0 as this keeps this driver fully compatable +setting is pss_enable_joystick=0 as this keeps this driver fully compatible with systems that were using previous versions of this driver. If you wish to enable the joystick port you will have to add pss_enable_joystick=1 as an argument to the driver. To actually use the joystick port you will then have @@ -31,7 +31,7 @@ assigned to the CDROM port when you loaded your pss sound driver. (ex. modprobe pss pss_cdrom_port=0x340 && modprobe aztcd aztcd=0x340) The default setting of this parameter leaves the CDROM port disabled to maintain full -compatability with systems using previous versions of this driver. +compatibility with systems using previous versions of this driver. Other options have also been added for the added convenience and utility of the user. These options are only available if this driver is loaded as a @@ -49,7 +49,7 @@ mpu401 && rmmod sound && rmmod soundcore" and retain the full functionality of his CDROM and/or joystick port(s) while gaining back the memory previously used by the sound drivers. This default setting of this parameter is 0 to retain -full behavioral compatability with previous versions of this driver. +full behavioral compatibility with previous versions of this driver. pss_keep_settings @@ -60,7 +60,7 @@ emulations by default on the driver's unloading (as it probably should), so specifying it now will ensure that all future versions of this driver will continue to work as expected. The default value of this parameter is 1 to -retain full behavioral compatability with previous versions of this driver. +retain full behavioral compatibility with previous versions of this driver. pss_firmware diff -Nru a/Documentation/sysrq.txt b/Documentation/sysrq.txt --- a/Documentation/sysrq.txt Thu Feb 20 23:19:21 2003 +++ b/Documentation/sysrq.txt Thu Feb 20 23:19:21 2003 @@ -164,7 +164,7 @@ If for some reason you feel the need to call the handle_sysrq function from within a function called by handle_sysrq, you must be aware that you are in -a lock (you are also in an interupt handler, which means don't sleep!), so +a lock (you are also in an interrupt handler, which means don't sleep!), so you must call __handle_sysrq_nolock instead. * I have more questions, who can I ask? diff -Nru a/Documentation/vm/hugetlbpage.txt b/Documentation/vm/hugetlbpage.txt --- a/Documentation/vm/hugetlbpage.txt Thu Feb 20 23:19:20 2003 +++ b/Documentation/vm/hugetlbpage.txt Thu Feb 20 23:19:20 2003 @@ -66,7 +66,7 @@ /proc/sys/vm_nr_hugepages indicates the current number of configured hugetlb pages in the kernel. Super user privileges are required for modification of -this value. The allocation of hugetlb pages is posible only if there are +this value. The allocation of hugetlb pages is possible only if there are enough physically contiguous free pages in system OR if there are enough hugetlb pages free that can be transfered back to regular memory pool. diff -Nru a/MAINTAINERS b/MAINTAINERS --- a/MAINTAINERS Thu Feb 20 23:19:22 2003 +++ b/MAINTAINERS Thu Feb 20 23:19:22 2003 @@ -215,6 +215,14 @@ L: linux-scsi@vger.kernel.org S: Maintained +ALCATEL SPEEDTOUCH USB DRIVER +P: Duncan Sands +M: duncan.sands@wanadoo.fr +L: linux-usb-users@lists.sourceforge.net +L: linux-usb-devel@lists.sourceforge.net +W: http://www.linux-usb.org/SpeedTouch/ +S: Maintained + ALPHA PORT P: Richard Henderson M: rth@twiddle.net @@ -308,6 +316,15 @@ W: http://www.holtmann.org/linux/bluetooth/ S: Maintained +BONDING DRIVER +P: Chad Tindel +M: ctindel@users.sourceforge.net +P: Jay Vosburgh +M: fubar@us.ibm.com +L: bonding-devel@lists.sourceforge.net +W: http://sourceforge.net/projects/bonding/ +S: Supported + BTTV VIDEO4LINUX DRIVER P: Gerd Knorr M: kraxel@bytesex.org @@ -1565,11 +1582,11 @@ S: Supported SGI VISUAL WORKSTATION 320 AND 540 -P: Bent Hagemark -M: bh@sgi.com -P: Ingo Molnar -M: mingo@redhat.com -S: Maintained +P: Andrey Panin +M: pazke@orbita1.ru +L: linux-visws@lists.sf.net +W: http://linux-visws.sf.net +S: Maintained for 2.5. SIS 5513 IDE CONTROLLER DRIVER P: Lionel Bouton diff -Nru a/README b/README --- a/README Thu Feb 20 23:19:23 2003 +++ b/README Thu Feb 20 23:19:23 2003 @@ -67,12 +67,12 @@ - You can also upgrade between 2.5.xx releases by patching. Patches are distributed in the traditional gzip and the new bzip2 format. To install by patching, get all the newer patch files, enter the - directory in which you unpacked the kernel source and execute: + top level directory of the kernel source (linux-2.5.xx) and execute: - gzip -cd patchXX.gz | patch -p0 + gzip -cd ../patch-2.5.xx.gz | patch -p1 or - bzip2 -dc patchXX.bz2 | patch -p0 + bzip2 -dc ../patch-2.5.xx.bz2 | patch -p1 (repeat xx for all versions bigger than the version of your current source tree, _in_order_) and you should be ok. You may want to remove @@ -148,8 +148,6 @@ - Check the top Makefile for further site-dependent configuration (default SVGA mode etc). - - - Finally, do a "make dep" to set up all the dependencies correctly. COMPILING the kernel: diff -Nru a/arch/alpha/Kconfig b/arch/alpha/Kconfig --- a/arch/alpha/Kconfig Thu Feb 20 23:19:23 2003 +++ b/arch/alpha/Kconfig Thu Feb 20 23:19:23 2003 @@ -935,6 +935,7 @@ source "net/bluetooth/Kconfig" +source "arch/alpha/oprofile/Kconfig" menu "Kernel hacking" diff -Nru a/arch/alpha/Makefile b/arch/alpha/Makefile --- a/arch/alpha/Makefile Thu Feb 20 23:19:22 2003 +++ b/arch/alpha/Makefile Thu Feb 20 23:19:22 2003 @@ -92,9 +92,10 @@ head-y := arch/alpha/kernel/head.o -core-y += arch/alpha/kernel/ arch/alpha/mm/ -core-$(CONFIG_MATHEMU) += arch/alpha/math-emu/ -libs-y += arch/alpha/lib/ +core-y += arch/alpha/kernel/ arch/alpha/mm/ +core-$(CONFIG_MATHEMU) += arch/alpha/math-emu/ +drivers-$(CONFIG_OPROFILE) += arch/alpha/oprofile/ +libs-y += arch/alpha/lib/ # export what is needed by arch/alpha/boot/Makefile LIBS_Y := $(patsubst %/, %/lib.a, $(libs-y)) diff -Nru a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile --- a/arch/alpha/kernel/Makefile Thu Feb 20 23:19:21 2003 +++ b/arch/alpha/kernel/Makefile Thu Feb 20 23:19:21 2003 @@ -3,8 +3,8 @@ # EXTRA_TARGETS := head.o - EXTRA_AFLAGS := $(CFLAGS) +CFLAGS += -Werror -Wno-sign-compare obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ irq_alpha.o signal.o setup.o ptrace.o time.o semaphore.o \ diff -Nru a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c --- a/arch/alpha/kernel/alpha_ksyms.c Thu Feb 20 23:19:19 2003 +++ b/arch/alpha/kernel/alpha_ksyms.c Thu Feb 20 23:19:19 2003 @@ -119,10 +119,6 @@ EXPORT_SYMBOL(copy_page); EXPORT_SYMBOL(clear_page); -EXPORT_SYMBOL(__delay); -EXPORT_SYMBOL(__udelay); -EXPORT_SYMBOL(udelay); - EXPORT_SYMBOL(__direct_map_base); EXPORT_SYMBOL(__direct_map_size); diff -Nru a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c --- a/arch/alpha/kernel/core_irongate.c Thu Feb 20 23:19:22 2003 +++ b/arch/alpha/kernel/core_irongate.c Thu Feb 20 23:19:22 2003 @@ -236,14 +236,15 @@ unsigned long size; size = initrd_end - initrd_start; - free_bootmem(__pa(initrd_start), PAGE_ALIGN(size)); + free_bootmem_node(NODE_DATA(0), __pa(initrd_start), + PAGE_ALIGN(size)); if (!move_initrd(pci_mem)) printk("irongate_init_arch: initrd too big " "(%ldK)\ndisabling initrd\n", size / 1024); } #endif - reserve_bootmem(pci_mem, memtop - pci_mem); + reserve_bootmem_node(NODE_DATA(0), pci_mem, memtop - pci_mem); printk("irongate_init_arch: temporarily reserving " "region %08lx-%08lx for PCI\n", pci_mem, memtop - 1); } diff -Nru a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c --- a/arch/alpha/kernel/irq_alpha.c Thu Feb 20 23:19:20 2003 +++ b/arch/alpha/kernel/irq_alpha.c Thu Feb 20 23:19:20 2003 @@ -74,7 +74,7 @@ alpha_mv.device_interrupt(vector, regs); return; case 4: - perf_irq(vector, regs); + perf_irq(la_ptr, regs); return; default: printk(KERN_CRIT "Hardware intr %ld %lx? Huh?\n", diff -Nru a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c --- a/arch/alpha/kernel/ptrace.c Thu Feb 20 23:19:23 2003 +++ b/arch/alpha/kernel/ptrace.c Thu Feb 20 23:19:23 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -255,6 +256,8 @@ struct pt_regs *regs) { struct task_struct *child; + unsigned long tmp; + size_t copied; long ret; lock_kernel(); @@ -265,6 +268,9 @@ /* are we already being traced? */ if (current->ptrace & PT_PTRACED) goto out_notsk; + ret = security_ptrace(current->parent, current); + if (ret) + goto out_notsk; /* set the ptrace bit in the process ptrace flags. */ current->ptrace |= PT_PTRACED; ret = 0; @@ -272,6 +278,7 @@ } if (pid == 1) /* you may not mess with init */ goto out_notsk; + ret = -ESRCH; read_lock(&tasklist_lock); child = find_task_by_pid(pid); @@ -280,77 +287,65 @@ read_unlock(&tasklist_lock); if (!child) goto out_notsk; + if (request == PTRACE_ATTACH) { ret = ptrace_attach(child); goto out; } - ret = -ESRCH; - if (!(child->ptrace & PT_PTRACED)) { - DBG(DBG_MEM, ("child not traced\n")); - goto out; - } - if (child->state != TASK_STOPPED) { - DBG(DBG_MEM, ("child process not stopped\n")); - if (request != PTRACE_KILL) - goto out; - } - if (child->parent != current) { - DBG(DBG_MEM, ("child not parent of this process\n")); + + ret = ptrace_check_attach(child, request == PTRACE_KILL); + if (ret < 0) goto out; - } switch (request) { /* When I and D space are separate, these will need to be fixed. */ case PTRACE_PEEKTEXT: /* read word at location addr. */ - case PTRACE_PEEKDATA: { - unsigned long tmp; - int copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); + case PTRACE_PEEKDATA: + copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); ret = -EIO; if (copied != sizeof(tmp)) - goto out; + break; regs->r0 = 0; /* special return: no errors */ ret = tmp; - goto out; - } + break; /* Read register number ADDR. */ case PTRACE_PEEKUSR: regs->r0 = 0; /* special return: no errors */ ret = get_reg(child, addr); DBG(DBG_MEM, ("peek $%ld->%#lx\n", addr, ret)); - goto out; + break; /* When I and D space are separate, this will have to be fixed. */ case PTRACE_POKETEXT: /* write the word at location addr. */ - case PTRACE_POKEDATA: { - unsigned long tmp = data; - int copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 1); + case PTRACE_POKEDATA: + tmp = data; + copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 1); ret = (copied == sizeof(tmp)) ? 0 : -EIO; - goto out; - } + break; case PTRACE_POKEUSR: /* write the specified register */ DBG(DBG_MEM, ("poke $%ld<-%#lx\n", addr, data)); ret = put_reg(child, addr, data); - goto out; + break; - case PTRACE_SYSCALL: /* continue and stop at next - (return from) syscall */ + case PTRACE_SYSCALL: + /* continue and stop at next (return from) syscall */ case PTRACE_CONT: /* restart after signal. */ ret = -EIO; if ((unsigned long) data > _NSIG) - goto out; + break; if (request == PTRACE_SYSCALL) set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); else clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); child->exit_code = data; - wake_up_process(child); /* make sure single-step breakpoint is gone. */ ptrace_cancel_bpt(child); - ret = data; - goto out; + wake_up_process(child); + ret = 0; + break; /* * Make the child exit. Best I can do is send it a sigkill. @@ -358,19 +353,19 @@ * exit. */ case PTRACE_KILL: - if (child->state != TASK_ZOMBIE) { - wake_up_process(child); - child->exit_code = SIGKILL; - } + ret = 0; + if (child->state == TASK_ZOMBIE) + break; + child->exit_code = SIGKILL; /* make sure single-step breakpoint is gone. */ ptrace_cancel_bpt(child); - ret = 0; + wake_up_process(child); goto out; case PTRACE_SINGLESTEP: /* execute single instruction. */ ret = -EIO; if ((unsigned long) data > _NSIG) - goto out; + break; /* Mark single stepping. */ child->thread_info->bpt_nsaved = -1; clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); diff -Nru a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c --- a/arch/alpha/kernel/sys_sable.c Thu Feb 20 23:19:19 2003 +++ b/arch/alpha/kernel/sys_sable.c Thu Feb 20 23:19:19 2003 @@ -268,7 +268,7 @@ { 32+3, 32+3, 32+3, 32+3, 32+3}, /* IdSel 7, slot 1 */ { 32+4, 32+4, 32+4, 32+4, 32+4}, /* IdSel 8, slot 2 */ }; - const long min_idsel = 0, max_idsel = 8, irqs_per_slot = 5; + long min_idsel = 0, max_idsel = 8, irqs_per_slot = 5; return COMMON_TABLE_LOOKUP; } diff -Nru a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c --- a/arch/alpha/kernel/sys_wildfire.c Thu Feb 20 23:19:21 2003 +++ b/arch/alpha/kernel/sys_wildfire.c Thu Feb 20 23:19:21 2003 @@ -314,7 +314,7 @@ { 56, 56, 56+1, 56+2, 56+3}, /* IdSel 6 PCI 1 slot 6 */ { 60, 60, 60+1, 60+2, 60+3}, /* IdSel 7 PCI 1 slot 7 */ }; - const long min_idsel = 0, max_idsel = 7, irqs_per_slot = 5; + long min_idsel = 0, max_idsel = 7, irqs_per_slot = 5; struct pci_controller *hose = dev->sysdata; int irq = COMMON_TABLE_LOOKUP; diff -Nru a/arch/alpha/lib/Makefile b/arch/alpha/lib/Makefile --- a/arch/alpha/lib/Makefile Thu Feb 20 23:19:23 2003 +++ b/arch/alpha/lib/Makefile Thu Feb 20 23:19:23 2003 @@ -3,6 +3,8 @@ # EXTRA_AFLAGS := $(CFLAGS) +CFLAGS += -Werror + L_TARGET := lib.a # Many of these routines have implementations tuned for ev6. diff -Nru a/arch/alpha/lib/ev6-memcpy.S b/arch/alpha/lib/ev6-memcpy.S --- a/arch/alpha/lib/ev6-memcpy.S Thu Feb 20 23:19:19 2003 +++ b/arch/alpha/lib/ev6-memcpy.S Thu Feb 20 23:19:19 2003 @@ -243,6 +243,6 @@ .end memcpy -/* For backwards module compatability. */ +/* For backwards module compatibility. */ __memcpy = memcpy .globl __memcpy diff -Nru a/arch/alpha/lib/udelay.c b/arch/alpha/lib/udelay.c --- a/arch/alpha/lib/udelay.c Thu Feb 20 23:19:22 2003 +++ b/arch/alpha/lib/udelay.c Thu Feb 20 23:19:22 2003 @@ -1,15 +1,16 @@ -#include -#include /* for udelay's use of smp_processor_id */ -#include -#include -#include - /* * Copyright (C) 1993, 2000 Linus Torvalds * * Delay routines, using a pre-computed "loops_per_jiffy" value. */ +#include +#include +#include /* for udelay's use of smp_processor_id */ +#include +#include +#include + /* * Use only for very small delays (< 1 msec). * @@ -18,7 +19,8 @@ * a 1GHz box, that's about 2 seconds. */ -void __delay(int loops) +void +__delay(int loops) { int tmp; __asm__ __volatile__( @@ -30,18 +32,24 @@ : "=&r" (tmp), "=r" (loops) : "1"(loops)); } -void __udelay(unsigned long usecs, unsigned long lpj) +#ifdef CONFIG_SMP +#define LPJ cpu_data[smp_processor_id()].loops_per_jiffy +#else +#define LPJ loops_per_jiffy +#endif + +void +udelay(unsigned long usecs) { - usecs *= (((unsigned long)HZ << 32) / 1000000) * lpj; + usecs *= (((unsigned long)HZ << 32) / 1000000) * LPJ; __delay((long)usecs >> 32); } +EXPORT_SYMBOL(udelay); -void udelay(unsigned long usecs) +void +ndelay(unsigned long nsecs) { -#ifdef CONFIG_SMP - __udelay(usecs, cpu_data[smp_processor_id()].loops_per_jiffy); -#else - __udelay(usecs, loops_per_jiffy); -#endif + nsecs *= (((unsigned long)HZ << 32) / 1000000000) * LPJ; + __delay((long)nsecs >> 32); } - +EXPORT_SYMBOL(ndelay); diff -Nru a/arch/alpha/mm/Makefile b/arch/alpha/mm/Makefile --- a/arch/alpha/mm/Makefile Thu Feb 20 23:19:24 2003 +++ b/arch/alpha/mm/Makefile Thu Feb 20 23:19:24 2003 @@ -2,6 +2,8 @@ # Makefile for the linux alpha-specific parts of the memory manager. # +CFLAGS += -Werror + obj-y := init.o fault.o extable.o remap.o obj-$(CONFIG_DISCONTIGMEM) += numa.o diff -Nru a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c --- a/arch/alpha/mm/numa.c Thu Feb 20 23:19:19 2003 +++ b/arch/alpha/mm/numa.c Thu Feb 20 23:19:19 2003 @@ -279,7 +279,8 @@ initrd_end, phys_to_virt(PFN_PHYS(max_low_pfn))); } else { - reserve_bootmem_node(NODE_DATA(KVADDR_TO_NID(initrd_start)), + nid = NODE_DATA(kvaddr_to_nid(initrd_start)); + reserve_bootmem_node(nid, virt_to_phys((void *)initrd_start), INITRD_SIZE); } @@ -349,8 +350,8 @@ initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; printk("Memory: %luk/%luk available (%luk kernel code, %luk reserved, " - "%luk data, %luk init)\n", - nr_free_pages() << (PAGE_SHIFT-10), + "%luk data, %luk init)\n", + (unsigned long)nr_free_pages() << (PAGE_SHIFT-10), num_physpages << (PAGE_SHIFT-10), codesize >> 10, reservedpages << (PAGE_SHIFT-10), diff -Nru a/arch/alpha/oprofile/Kconfig b/arch/alpha/oprofile/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/Kconfig Thu Feb 20 23:19:24 2003 @@ -0,0 +1,23 @@ + +menu "Profiling support" + depends on EXPERIMENTAL + +config PROFILING + bool "Profiling support (EXPERIMENTAL)" + help + Say Y here to enable the extended profiling support mechanisms used + by profilers such as OProfile. + + +config OPROFILE + tristate "OProfile system profiling (EXPERIMENTAL)" + depends on PROFILING + help + OProfile is a profiling system capable of profiling the + whole system, include the kernel, kernel modules, libraries, + and applications. + + If unsure, say N. + +endmenu + diff -Nru a/arch/alpha/oprofile/Makefile b/arch/alpha/oprofile/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/Makefile Thu Feb 20 23:19:24 2003 @@ -0,0 +1,18 @@ +CFLAGS += -Werror -Wno-sign-compare + +obj-$(CONFIG_OPROFILE) += oprofile.o + +DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \ + oprof.o cpu_buffer.o buffer_sync.o \ + event_buffer.o oprofile_files.o \ + oprofilefs.o oprofile_stats.o ) + +oprofile-y := $(DRIVER_OBJS) common.o +oprofile-$(CONFIG_ALPHA_GENERIC) += op_model_ev4.o \ + op_model_ev5.o \ + op_model_ev6.o \ + op_model_ev67.o +oprofile-$(CONFIG_ALPHA_EV4) += op_model_ev4.o +oprofile-$(CONFIG_ALPHA_EV5) += op_model_ev5.o +oprofile-$(CONFIG_ALPHA_EV6) += op_model_ev6.o \ + op_model_ev67.o diff -Nru a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/common.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,188 @@ +/** + * @file arch/alpha/oprofile/common.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + */ + +#include +#include +#include +#include +#include +#include + +#include "op_impl.h" + +extern struct op_axp_model op_model_ev4 __attribute__((weak)); +extern struct op_axp_model op_model_ev5 __attribute__((weak)); +extern struct op_axp_model op_model_pca56 __attribute__((weak)); +extern struct op_axp_model op_model_ev6 __attribute__((weak)); +extern struct op_axp_model op_model_ev67 __attribute__((weak)); + +static struct op_axp_model *model; + +extern void (*perf_irq)(unsigned long, struct pt_regs *); +static void (*save_perf_irq)(unsigned long, struct pt_regs *); + +static struct op_counter_config ctr[20]; +static struct op_system_config sys; +static struct op_register_config reg; + +/* Called from do_entInt to handle the performance monitor interrupt. */ + +static void +op_handle_interrupt(unsigned long which, struct pt_regs *regs) +{ + model->handle_interrupt(which, regs, ctr); + + /* If the user has selected an interrupt frequency that is + not exactly the width of the counter, write a new value + into the counter such that it'll overflow after N more + events. */ + if ((reg.need_reset >> which) & 1) + model->reset_ctr(®, which); +} + +static int +op_axp_setup(void) +{ + unsigned long i, e; + + /* Install our interrupt handler into the existing hook. */ + save_perf_irq = perf_irq; + perf_irq = op_handle_interrupt; + + /* Compute the mask of enabled counters. */ + for (i = e = 0; i < model->num_counters; ++i) + if (ctr[0].enabled) + e |= 1 << i; + reg.enable = e; + + /* Pre-compute the values to stuff in the hardware registers. */ + model->reg_setup(®, ctr, &sys); + + /* Configure the registers on all cpus. */ + smp_call_function(model->cpu_setup, ®, 0, 1); + model->cpu_setup(®); + return 0; +} + +static void +op_axp_shutdown(void) +{ + /* Remove our interrupt handler. We may be removing this module. */ + perf_irq = save_perf_irq; +} + +static void +op_axp_cpu_start(void *dummy) +{ + wrperfmon(1, reg.enable); +} + +static int +op_axp_start(void) +{ + smp_call_function(op_axp_cpu_start, NULL, 0, 1); + op_axp_cpu_start(NULL); + return 0; +} + +static inline void +op_axp_cpu_stop(void *dummy) +{ + /* Disable performance monitoring for all counters. */ + wrperfmon(0, -1); +} + +static void +op_axp_stop(void) +{ + smp_call_function(op_axp_cpu_stop, NULL, 0, 1); + op_axp_cpu_stop(NULL); +} + +static int +op_axp_create_files(struct super_block * sb, struct dentry * root) +{ + int i; + + for (i = 0; i < model->num_counters; ++i) { + struct dentry *dir; + char buf[3]; + + snprintf(buf, sizeof buf, "%d", i); + dir = oprofilefs_mkdir(sb, root, buf); + + oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); + oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); + oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); + /* Dummies. */ + oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); + oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); + oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); + } + + if (model->can_set_proc_mode) { + oprofilefs_create_ulong(sb, root, "enable_pal", + &sys.enable_pal); + oprofilefs_create_ulong(sb, root, "enable_kernel", + &sys.enable_kernel); + oprofilefs_create_ulong(sb, root, "enable_user", + &sys.enable_user); + } + + return 0; +} + +static struct oprofile_operations oprof_axp_ops = { + .create_files = op_axp_create_files, + .setup = op_axp_setup, + .shutdown = op_axp_shutdown, + .start = op_axp_start, + .stop = op_axp_stop, + .cpu_type = NULL /* To be filled in below. */ +}; + +int __init +oprofile_arch_init(struct oprofile_operations **ops) +{ + struct op_axp_model *lmodel = NULL; + + switch (implver()) { + case IMPLVER_EV4: + lmodel = &op_model_ev4; + break; + case IMPLVER_EV5: + /* 21164PC has a slightly different set of events. + Recognize the chip by the presence of the MAX insns. */ + if (!amask(AMASK_MAX)) + lmodel = &op_model_pca56; + else + lmodel = &op_model_ev5; + break; + case IMPLVER_EV6: + /* 21264A supports ProfileMe. + Recognize the chip by the presence of the CIX insns. */ + if (!amask(AMASK_CIX)) + lmodel = &op_model_ev67; + else + lmodel = &op_model_ev6; + break; + } + + if (!lmodel) + return ENODEV; + model = lmodel; + + oprof_axp_ops.cpu_type = lmodel->cpu_type; + *ops = &oprof_axp_ops; + + printk(KERN_INFO "oprofile: using %s performance monitoring.\n", + lmodel->cpu_type); + + return 0; +} diff -Nru a/arch/alpha/oprofile/op_impl.h b/arch/alpha/oprofile/op_impl.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/op_impl.h Thu Feb 20 23:19:24 2003 @@ -0,0 +1,55 @@ +/** + * @file arch/alpha/oprofile/op_impl.h + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + */ + +#ifndef OP_IMPL_H +#define OP_IMPL_H 1 + +/* Per-counter configuration as set via oprofilefs. */ +struct op_counter_config { + unsigned long enabled; + unsigned long event; + unsigned long count; + /* Dummies because I am too lazy to hack the userspace tools. */ + unsigned long kernel; + unsigned long user; + unsigned long unit_mask; +}; + +/* System-wide configuration as set via oprofilefs. */ +struct op_system_config { + unsigned long enable_pal; + unsigned long enable_kernel; + unsigned long enable_user; +}; + +/* Cached values for the various performance monitoring registers. */ +struct op_register_config { + unsigned long enable; + unsigned long mux_select; + unsigned long proc_mode; + unsigned long freq; + unsigned long reset_values; + unsigned long need_reset; +}; + +/* Per-architecture configury and hooks. */ +struct op_axp_model { + void (*reg_setup) (struct op_register_config *, + struct op_counter_config *, + struct op_system_config *); + void (*cpu_setup) (void *); + void (*reset_ctr) (struct op_register_config *, unsigned long); + void (*handle_interrupt) (unsigned long, struct pt_regs *, + struct op_counter_config *); + char *cpu_type; + unsigned char num_counters; + unsigned char can_set_proc_mode; +}; + +#endif diff -Nru a/arch/alpha/oprofile/op_model_ev4.c b/arch/alpha/oprofile/op_model_ev4.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/op_model_ev4.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,117 @@ +/** + * @file arch/alpha/oprofile/op_model_ev4.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + */ + +#include +#include +#include +#include +#include + +#include "op_impl.h" + + +/* Compute all of the registers in preparation for enabling profiling. */ + +static void +ev4_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys) +{ + unsigned long ctl = 0, count, hilo; + + /* Select desired events. We've mapped the event numbers + such that they fit directly into the event selection fields. + + Note that there is no "off" setting. In both cases we select + the EXTERNAL event source, hoping that it'll be the lowest + frequency, and set the frequency counter to LOW. The interrupts + for these "disabled" counter overflows are ignored by the + interrupt handler. + + This is most irritating, becuase the hardware *can* enable and + disable the interrupts for these counters independently, but the + wrperfmon interface doesn't allow it. */ + + ctl |= (ctr[0].enabled ? ctr[0].event << 8 : 14 << 8); + ctl |= (ctr[1].enabled ? (ctr[1].event - 16) << 32 : 7ul << 32); + + /* EV4 can not read or write its counter registers. The only + thing one can do at all is see if you overflow and get an + interrupt. We can set the width of the counters, to some + extent. Take the interrupt count selected by the user, + map it onto one of the possible values, and write it back. */ + + count = ctr[0].count; + if (count <= 4096) + count = 4096, hilo = 1; + else + count = 65536, hilo = 0; + ctr[0].count = count; + ctl |= (ctr[0].enabled && hilo) << 3; + + count = ctr[1].count; + if (count <= 256) + count = 256, hilo = 1; + else + count = 4096, hilo = 0; + ctr[1].count = count; + ctl |= (ctr[1].enabled && hilo); + + reg->mux_select = ctl; + + /* Select performance monitoring options. */ + /* ??? Need to come up with some mechanism to trace only + selected processes. EV4 does not have a mechanism to + select kernel or user mode only. For now, enable always. */ + reg->proc_mode = 0; + + /* Frequency is folded into mux_select for EV4. */ + reg->freq = 0; + + /* See above regarding no writes. */ + reg->reset_values = 0; + reg->need_reset = 0; + +} + +/* Program all of the registers in preparation for enabling profiling. */ + +static void +ev4_cpu_setup(void *x) +{ + struct op_register_config *reg = x; + + wrperfmon(2, reg->mux_select); + wrperfmon(3, reg->proc_mode); +} + +static void +ev4_handle_interrupt(unsigned long which, struct pt_regs *regs, + struct op_counter_config *ctr) +{ + /* EV4 can't properly disable counters individually. + Discard "disabled" events now. */ + if (!ctr[which].enabled) + return; + + /* Record the sample. */ + oprofile_add_sample(regs->pc, !user_mode(regs), + which, smp_processor_id()); +} + + +struct op_axp_model op_model_ev4 = { + .reg_setup = ev4_reg_setup, + .cpu_setup = ev4_cpu_setup, + .reset_ctr = NULL, + .handle_interrupt = ev4_handle_interrupt, + .cpu_type = "alpha/ev4", + .num_counters = 2, + .can_set_proc_mode = 0, +}; diff -Nru a/arch/alpha/oprofile/op_model_ev5.c b/arch/alpha/oprofile/op_model_ev5.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/op_model_ev5.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,212 @@ +/** + * @file arch/alpha/oprofile/op_model_ev5.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + */ + +#include +#include +#include +#include +#include + +#include "op_impl.h" + + +/* Compute all of the registers in preparation for enabling profiling. + + The 21164 (EV5) and 21164PC (PCA65) vary in the bit placement and + meaning of the "CBOX" events. Given that we don't care about meaning + at this point, arrange for the difference in bit placement to be + handled by common code. */ + +static void +common_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys, + int cbox1_ofs, int cbox2_ofs) +{ + int i, ctl, reset, need_reset; + + /* Select desired events. The event numbers are selected such + that they map directly into the event selection fields: + + PCSEL0: 0, 1 + PCSEL1: 24-39 + CBOX1: 40-47 + PCSEL2: 48-63 + CBOX2: 64-71 + + There are two special cases, in that CYCLES can be measured + on PCSEL[02], and SCACHE_WRITE can be measured on CBOX[12]. + These event numbers are canonicalizes to their first appearance. */ + + ctl = 0; + for (i = 0; i < 3; ++i) { + unsigned long event = ctr[i].event; + if (!ctr[i].enabled) + continue; + + /* Remap the duplicate events, as described above. */ + if (i == 2) { + if (event == 0) + event = 12+48; + else if (event == 2+41) + event = 4+65; + } + + /* Convert the event numbers onto mux_select bit mask. */ + if (event < 2) + ctl |= event << 31; + else if (event < 24) + /* error */; + else if (event < 40) + ctl |= (event - 24) << 4; + else if (event < 48) + ctl |= (event - 40) << cbox1_ofs | 15 << 4; + else if (event < 64) + ctl |= event - 48; + else if (event < 72) + ctl |= (event - 64) << cbox2_ofs | 15; + } + reg->mux_select = ctl; + + /* Select processor mode. */ + /* ??? Need to come up with some mechanism to trace only selected + processes. For now select from pal, kernel and user mode. */ + ctl = 0; + ctl |= !sys->enable_pal << 9; + ctl |= !sys->enable_kernel << 8; + ctl |= !sys->enable_user << 30; + reg->proc_mode = ctl; + + /* Select interrupt frequencies. Take the interrupt count selected + by the user, and map it onto one of the possible counter widths. + If the user value is in between, compute a value to which the + counter is reset at each interrupt. */ + + ctl = reset = need_reset = 0; + for (i = 0; i < 3; ++i) { + unsigned long max, hilo, count = ctr[i].count; + if (!ctr[i].enabled) + continue; + + if (count <= 256) + count = 256, hilo = 3, max = 256; + else { + max = (i == 2 ? 16384 : 65536); + hilo = 2; + if (count > max) + count = max; + } + ctr[i].count = count; + + ctl |= hilo << (8 - i*2); + reset |= (max - count) << (48 - 16*i); + if (count != max) + need_reset |= 1 << i; + } + reg->freq = ctl; + reg->reset_values = reset; + reg->need_reset = need_reset; +} + +static void +ev5_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys) +{ + common_reg_setup(reg, ctr, sys, 19, 22); +} + +static void +pca56_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys) +{ + common_reg_setup(reg, ctr, sys, 8, 11); +} + +/* Program all of the registers in preparation for enabling profiling. */ + +static void +ev5_cpu_setup (void *x) +{ + struct op_register_config *reg = x; + + wrperfmon(2, reg->mux_select); + wrperfmon(3, reg->proc_mode); + wrperfmon(4, reg->freq); + wrperfmon(6, reg->reset_values); +} + +/* CTR is a counter for which the user has requested an interrupt count + in between one of the widths selectable in hardware. Reset the count + for CTR to the value stored in REG->RESET_VALUES. + + For EV5, this means disabling profiling, reading the current values, + masking in the value for the desired register, writing, then turning + profiling back on. + + This can be streamlined if profiling is only enabled for user mode. + In that case we know that the counters are not currently incrementing + (due to being in kernel mode). */ + +static void +ev5_reset_ctr(struct op_register_config *reg, unsigned long ctr) +{ + unsigned long values, mask, not_pk, reset_values; + + mask = (ctr == 0 ? 0xfffful << 48 + : ctr == 1 ? 0xfffful << 32 + : 0x3fff << 16); + + not_pk = 1 << 9 | 1 << 8; + + reset_values = reg->reset_values; + + if ((reg->proc_mode & not_pk) == not_pk) { + values = wrperfmon(5, 0); + values = (reset_values & mask) | (values & ~mask & -2); + wrperfmon(6, values); + } else { + wrperfmon(0, -1); + values = wrperfmon(5, 0); + values = (reset_values & mask) | (values & ~mask & -2); + wrperfmon(6, values); + wrperfmon(1, reg->enable); + } +} + +static void +ev5_handle_interrupt(unsigned long which, struct pt_regs *regs, + struct op_counter_config *ctr) +{ + /* Record the sample. */ + oprofile_add_sample(regs->pc, !user_mode(regs), + which, smp_processor_id()); +} + + +struct op_axp_model op_model_ev5 = { + .reg_setup = ev5_reg_setup, + .cpu_setup = ev5_cpu_setup, + .reset_ctr = ev5_reset_ctr, + .handle_interrupt = ev5_handle_interrupt, + .cpu_type = "alpha/ev5", + .num_counters = 3, + .can_set_proc_mode = 1, +}; + +struct op_axp_model op_model_pca56 = { + .reg_setup = pca56_reg_setup, + .cpu_setup = ev5_cpu_setup, + .reset_ctr = ev5_reset_ctr, + .handle_interrupt = ev5_handle_interrupt, + .cpu_type = "alpha/pca56", + .num_counters = 3, + .can_set_proc_mode = 1, +}; diff -Nru a/arch/alpha/oprofile/op_model_ev6.c b/arch/alpha/oprofile/op_model_ev6.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/op_model_ev6.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,104 @@ +/** + * @file arch/alpha/oprofile/op_model_ev6.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + */ + +#include +#include +#include +#include +#include + +#include "op_impl.h" + + +/* Compute all of the registers in preparation for enabling profiling. */ + +static void +ev6_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys) +{ + unsigned long ctl, reset, need_reset, i; + + /* Select desired events. We've mapped the event numbers + such that they fit directly into the event selection fields. */ + ctl = 0; + if (ctr[0].enabled && ctr[0].event) + ctl |= (ctr[0].event & 1) << 4; + if (ctr[1].enabled) + ctl |= (ctr[1].event - 2) & 15; + reg->mux_select = ctl; + + /* Select logging options. */ + /* ??? Need to come up with some mechanism to trace only + selected processes. EV6 does not have a mechanism to + select kernel or user mode only. For now, enable always. */ + reg->proc_mode = 0; + + /* EV6 cannot change the width of the counters as with the + other implementations. But fortunately, we can write to + the counters and set the value such that it will overflow + at the right time. */ + reset = need_reset = 0; + for (i = 0; i < 2; ++i) { + unsigned long count = ctr[i].count; + if (!ctr[i].enabled) + continue; + + if (count > 0x100000) + count = 0x100000; + ctr[i].count = count; + reset |= (0x100000 - count) << (i ? 6 : 28); + if (count != 0x100000) + need_reset |= 1 << i; + } + reg->reset_values = reset; + reg->need_reset = need_reset; +} + +/* Program all of the registers in preparation for enabling profiling. */ + +static void +ev6_cpu_setup (void *x) +{ + struct op_register_config *reg = x; + + wrperfmon(2, reg->mux_select); + wrperfmon(3, reg->proc_mode); + wrperfmon(6, reg->reset_values | 3); +} + +/* CTR is a counter for which the user has requested an interrupt count + in between one of the widths selectable in hardware. Reset the count + for CTR to the value stored in REG->RESET_VALUES. */ + +static void +ev6_reset_ctr(struct op_register_config *reg, unsigned long ctr) +{ + wrperfmon(6, reg->reset_values | (1 << ctr)); +} + +static void +ev6_handle_interrupt(unsigned long which, struct pt_regs *regs, + struct op_counter_config *ctr) +{ + /* Record the sample. */ + oprofile_add_sample(regs->pc, !user_mode(regs), + which, smp_processor_id()); +} + + +struct op_axp_model op_model_ev6 = { + .reg_setup = ev6_reg_setup, + .cpu_setup = ev6_cpu_setup, + .reset_ctr = ev6_reset_ctr, + .handle_interrupt = ev6_handle_interrupt, + .cpu_type = "alpha/ev6", + .num_counters = 2, + .can_set_proc_mode = 0, +}; diff -Nru a/arch/alpha/oprofile/op_model_ev67.c b/arch/alpha/oprofile/op_model_ev67.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/alpha/oprofile/op_model_ev67.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,265 @@ +/** + * @file arch/alpha/oprofile/op_model_ev67.c + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author Richard Henderson + * @author Falk Hueffner + */ + +#include +#include +#include +#include +#include + +#include "op_impl.h" + + +/* Compute all of the registers in preparation for enabling profiling. */ + +static void +ev67_reg_setup(struct op_register_config *reg, + struct op_counter_config *ctr, + struct op_system_config *sys) +{ + unsigned long ctl, reset, need_reset, i; + + /* Select desired events. */ + ctl = 1UL << 4; /* Enable ProfileMe mode. */ + + /* The event numbers are chosen so we can use them directly if + PCTR1 is enabled. */ + if (ctr[1].enabled) { + ctl |= (ctr[1].event & 3) << 2; + } else { + if (ctr[0].event == 0) /* cycles */ + ctl |= 1UL << 2; + } + reg->mux_select = ctl; + + /* Select logging options. */ + /* ??? Need to come up with some mechanism to trace only + selected processes. EV67 does not have a mechanism to + select kernel or user mode only. For now, enable always. */ + reg->proc_mode = 0; + + /* EV67 cannot change the width of the counters as with the + other implementations. But fortunately, we can write to + the counters and set the value such that it will overflow + at the right time. */ + reset = need_reset = 0; + for (i = 0; i < 2; ++i) { + unsigned long count = ctr[i].count; + if (!ctr[i].enabled) + continue; + + if (count > 0x100000) + count = 0x100000; + ctr[i].count = count; + reset |= (0x100000 - count) << (i ? 6 : 28); + if (count != 0x100000) + need_reset |= 1 << i; + } + reg->reset_values = reset; + reg->need_reset = need_reset; +} + +/* Program all of the registers in preparation for enabling profiling. */ + +static void +ev67_cpu_setup (void *x) +{ + struct op_register_config *reg = x; + + wrperfmon(2, reg->mux_select); + wrperfmon(3, reg->proc_mode); + wrperfmon(6, reg->reset_values | 3); +} + +/* CTR is a counter for which the user has requested an interrupt count + in between one of the widths selectable in hardware. Reset the count + for CTR to the value stored in REG->RESET_VALUES. */ + +static void +ev67_reset_ctr(struct op_register_config *reg, unsigned long ctr) +{ + wrperfmon(6, reg->reset_values | (1 << ctr)); +} + +/* ProfileMe conditions which will show up as counters. We can also + detect the following, but it seems unlikely that anybody is + interested in counting them: + * Reset + * MT_FPCR (write to floating point control register) + * Arithmetic trap + * Dstream Fault + * Machine Check (ECC fault, etc.) + * OPCDEC (illegal opcode) + * Floating point disabled + * Differentiate between DTB single/double misses and 3 or 4 level + page tables + * Istream access violation + * Interrupt + * Icache Parity Error. + * Instruction killed (nop, trapb) + + Unfortunately, there seems to be no way to detect Dcache and Bcache + misses; the latter could be approximated by making the counter + count Bcache misses, but that is not precise. + + We model this as 20 counters: + * PCTR0 + * PCTR1 + * 9 ProfileMe events, induced by PCTR0 + * 9 ProfileMe events, induced by PCTR1 +*/ + +enum profileme_counters { + PM_STALLED, /* Stalled for at least one cycle + between the fetch and map stages */ + PM_TAKEN, /* Conditional branch taken */ + PM_MISPREDICT, /* Branch caused mispredict trap */ + PM_ITB_MISS, /* ITB miss */ + PM_DTB_MISS, /* DTB miss */ + PM_REPLAY, /* Replay trap */ + PM_LOAD_STORE, /* Load-store order trap */ + PM_ICACHE_MISS, /* Icache miss */ + PM_UNALIGNED, /* Unaligned Load/Store */ + PM_NUM_COUNTERS +}; + +static inline void +op_add_pm(unsigned long pc, int kern, unsigned long counter, + struct op_counter_config *ctr, unsigned long event) +{ + unsigned long fake_counter = 2 + event; + if (counter == 1) + fake_counter += PM_NUM_COUNTERS; + if (ctr[fake_counter].enabled) + oprofile_add_sample(pc, kern, fake_counter, + smp_processor_id()); +} + +static void +ev67_handle_interrupt(unsigned long which, struct pt_regs *regs, + struct op_counter_config *ctr) +{ + unsigned long pmpc, pctr_ctl; + int kern = !user_mode(regs); + int mispredict = 0; + union { + unsigned long v; + struct { + unsigned reserved: 30; /* 0-29 */ + unsigned overcount: 3; /* 30-32 */ + unsigned icache_miss: 1; /* 33 */ + unsigned trap_type: 4; /* 34-37 */ + unsigned load_store: 1; /* 38 */ + unsigned trap: 1; /* 39 */ + unsigned mispredict: 1; /* 40 */ + } fields; + } i_stat; + + enum trap_types { + TRAP_REPLAY, + TRAP_INVALID0, + TRAP_DTB_DOUBLE_MISS_3, + TRAP_DTB_DOUBLE_MISS_4, + TRAP_FP_DISABLED, + TRAP_UNALIGNED, + TRAP_DTB_SINGLE_MISS, + TRAP_DSTREAM_FAULT, + TRAP_OPCDEC, + TRAP_INVALID1, + TRAP_MACHINE_CHECK, + TRAP_INVALID2, + TRAP_ARITHMETIC, + TRAP_INVALID3, + TRAP_MT_FPCR, + TRAP_RESET + }; + + pmpc = wrperfmon(9, 0); + /* ??? Don't know how to handle physical-mode PALcode address. */ + if (pmpc & 1) + return; + pmpc &= ~2; /* clear reserved bit */ + + i_stat.v = wrperfmon(8, 0); + if (i_stat.fields.trap) { + switch (i_stat.fields.trap_type) { + case TRAP_INVALID1: + case TRAP_INVALID2: + case TRAP_INVALID3: + /* Pipeline redirection ocurred. PMPC points + to PALcode. Recognize ITB miss by PALcode + offset address, and get actual PC from + EXC_ADDR. */ + oprofile_add_sample(regs->pc, kern, which, + smp_processor_id()); + if ((pmpc & ((1 << 15) - 1)) == 581) + op_add_pm(regs->pc, kern, which, + ctr, PM_ITB_MISS); + /* Most other bit and counter values will be + those for the first instruction in the + fault handler, so we're done. */ + return; + case TRAP_REPLAY: + op_add_pm(pmpc, kern, which, ctr, + (i_stat.fields.load_store + ? PM_LOAD_STORE : PM_REPLAY)); + break; + case TRAP_DTB_DOUBLE_MISS_3: + case TRAP_DTB_DOUBLE_MISS_4: + case TRAP_DTB_SINGLE_MISS: + op_add_pm(pmpc, kern, which, ctr, PM_DTB_MISS); + break; + case TRAP_UNALIGNED: + op_add_pm(pmpc, kern, which, ctr, PM_UNALIGNED); + break; + case TRAP_INVALID0: + case TRAP_FP_DISABLED: + case TRAP_DSTREAM_FAULT: + case TRAP_OPCDEC: + case TRAP_MACHINE_CHECK: + case TRAP_ARITHMETIC: + case TRAP_MT_FPCR: + case TRAP_RESET: + break; + } + + /* ??? JSR/JMP/RET/COR or HW_JSR/HW_JMP/HW_RET/HW_COR + mispredicts do not set this bit but can be + recognized by the presence of one of these + instructions at the PMPC location with bit 39 + set. */ + if (i_stat.fields.mispredict) { + mispredict = 1; + op_add_pm(pmpc, kern, which, ctr, PM_MISPREDICT); + } + } + + oprofile_add_sample(pmpc, kern, which, smp_processor_id()); + + pctr_ctl = wrperfmon(5, 0); + if (pctr_ctl & (1UL << 27)) + op_add_pm(pmpc, kern, which, ctr, PM_STALLED); + + /* Unfortunately, TAK is undefined on mispredicted branches. + ??? It is also undefined for non-cbranch insns, should + check that. */ + if (!mispredict && pctr_ctl & (1UL << 0)) + op_add_pm(pmpc, kern, which, ctr, PM_TAKEN); +} + +struct op_axp_model op_model_ev67 = { + .reg_setup = ev67_reg_setup, + .cpu_setup = ev67_cpu_setup, + .reset_ctr = ev67_reset_ctr, + .handle_interrupt = ev67_handle_interrupt, + .cpu_type = "alpha/ev67", + .num_counters = 20, + .can_set_proc_mode = 0, +}; diff -Nru a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c --- a/arch/arm/mm/alignment.c Thu Feb 20 23:19:20 2003 +++ b/arch/arm/mm/alignment.c Thu Feb 20 23:19:20 2003 @@ -400,7 +400,7 @@ * For alignment faults on the ARM922T/ARM920T the MMU makes * the FSR (and hence addr) equal to the updated base address * of the multiple access rather than the restored value. - * Switch this messsage off if we've got a ARM92[02], otherwise + * Switch this message off if we've got a ARM92[02], otherwise * [ls]dm alignment faults are noisy! */ #if !(defined CONFIG_CPU_ARM922T) && !(defined CONFIG_CPU_ARM920T) diff -Nru a/arch/cris/boot/compressed/misc.c b/arch/cris/boot/compressed/misc.c --- a/arch/cris/boot/compressed/misc.c Thu Feb 20 23:19:23 2003 +++ b/arch/cris/boot/compressed/misc.c Thu Feb 20 23:19:23 2003 @@ -13,7 +13,7 @@ */ /* where the piggybacked kernel image expects itself to live. - * it is the same adress we use when we network load an uncompressed + * it is the same address we use when we network load an uncompressed * image into DRAM, and it is the address the kernel is linked to live * at by etrax100.ld. */ diff -Nru a/arch/cris/drivers/eeprom.c b/arch/cris/drivers/eeprom.c --- a/arch/cris/drivers/eeprom.c Thu Feb 20 23:19:21 2003 +++ b/arch/cris/drivers/eeprom.c Thu Feb 20 23:19:21 2003 @@ -802,7 +802,7 @@ return 1; } -/* Reads from current adress. */ +/* Reads from current address. */ static int read_from_eeprom(char * buf, int count) { diff -Nru a/arch/cris/drivers/serial.c b/arch/cris/drivers/serial.c --- a/arch/cris/drivers/serial.c Thu Feb 20 23:19:22 2003 +++ b/arch/cris/drivers/serial.c Thu Feb 20 23:19:22 2003 @@ -1904,7 +1904,7 @@ } #ifdef SERIAL_DEBUG_INTR - printk("** OK, disabling ser_interupts\n"); + printk("** OK, disabling ser_interrupts\n"); #endif e100_disable_serial_data_irq(info); diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig --- a/arch/i386/Kconfig Thu Feb 20 23:19:20 2003 +++ b/arch/i386/Kconfig Thu Feb 20 23:19:20 2003 @@ -83,18 +83,16 @@ If you don't have such a system, you should say N here. -# Visual Workstation support is utterly broken. -# If you want to see it working mail an VW540 to hch@infradead.org 8) -#config X86_VISWS -# bool "SGI 320/540 (Visual Workstation)" -# help -# The SGI Visual Workstation series is an IA32-based workstation -# based on SGI systems chips with some legacy PC hardware attached. -# -# Say Y here to create a kernel to run on the SGI 320 or 540. -# -# A kernel compiled for the Visual Workstation will not run on PCs -# and vice versa. See for details. +config X86_VISWS + bool "SGI 320/540 (Visual Workstation)" + help + The SGI Visual Workstation series is an IA32-based workstation + based on SGI systems chips with some legacy PC hardware attached. + + Say Y here to create a kernel to run on the SGI 320 or 540. + + A kernel compiled for the Visual Workstation will not run on PCs + and vice versa. See for details. endchoice @@ -433,7 +431,7 @@ config X86_UP_APIC bool "Local APIC support on uniprocessors" if !SMP - depends on !X86_VOYAGER + depends on !(X86_VISWS || X86_VOYAGER) ---help--- A local APIC (Advanced Programmable Interrupt Controller) is an integrated interrupt controller in the CPU. If you have a single-CPU @@ -1180,7 +1178,7 @@ config PCI_DIRECT bool - depends on !X86_VISWS && PCI && (PCI_GODIRECT || PCI_GOANY) + depends on PCI && ((PCI_GODIRECT || PCI_GOANY) || X86_VISWS) default y config SCx200 @@ -1673,7 +1671,7 @@ config X86_MPPARSE bool - depends on X86_LOCAL_APIC + depends on X86_LOCAL_APIC && !X86_VISWS default y endmenu @@ -1691,15 +1689,15 @@ config X86_HT bool - depends on SMP && !X86_VOYAGER + depends on SMP && !(X86_VISWS || X86_VOYAGER) default y config X86_BIOS_REBOOT bool - depends on !X86_VOYAGER + depends on !(X86_VISWS || X86_VOYAGER) default y config X86_TRAMPOLINE bool - depends on SMP + depends on SMP || X86_VISWS default y diff -Nru a/arch/i386/Makefile b/arch/i386/Makefile --- a/arch/i386/Makefile Thu Feb 20 23:19:21 2003 +++ b/arch/i386/Makefile Thu Feb 20 23:19:21 2003 @@ -17,7 +17,7 @@ LDFLAGS := -m elf_i386 OBJCOPYFLAGS := -O binary -R .note -R .comment -S -LDFLAGS_vmlinux := -e stext +LDFLAGS_vmlinux := LDFLAGS_BLOB := --format binary --oformat elf32-i386 CFLAGS += -pipe diff -Nru a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile --- a/arch/i386/kernel/Makefile Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/Makefile Thu Feb 20 23:19:20 2003 @@ -6,7 +6,8 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ - pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o + pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \ + doublefault.o obj-y += cpu/ obj-y += timers/ @@ -24,7 +25,6 @@ obj-$(CONFIG_X86_IO_APIC) += io_apic.o obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o suspend_asm.o obj-$(CONFIG_X86_NUMAQ) += numaq.o -obj-$(CONFIG_PROFILING) += profile.o obj-$(CONFIG_EDD) += edd.o obj-$(CONFIG_MODULES) += module.o obj-y += sysenter.o diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c --- a/arch/i386/kernel/apic.c Thu Feb 20 23:19:24 2003 +++ b/arch/i386/kernel/apic.c Thu Feb 20 23:19:24 2003 @@ -50,9 +50,21 @@ /* Using APIC to generate smp_local_timer_interrupt? */ int using_apic_timer = 0; -int prof_multiplier[NR_CPUS] = { 1, }; -int prof_old_multiplier[NR_CPUS] = { 1, }; -DEFINE_PER_CPU(int, prof_counter) = 1; +static DEFINE_PER_CPU(int, prof_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_old_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_counter) = 1; + +void enable_NMI_through_LVT0 (void * dummy) +{ + unsigned int v, ver; + + ver = apic_read(APIC_LVR); + ver = GET_APIC_VERSION(ver); + v = APIC_DM_NMI; /* unmask and set to NMI */ + if (!APIC_INTEGRATED(ver)) /* 82489DX */ + v |= APIC_LVT_LEVEL_TRIGGER; + apic_write_around(APIC_LVT0, v); +} int get_maxlvt(void) { @@ -974,7 +986,7 @@ * accordingly. */ for (i = 0; i < NR_CPUS; ++i) - prof_multiplier[i] = multiplier; + per_cpu(prof_multiplier, i) = multiplier; return 0; } @@ -1006,12 +1018,14 @@ * * Interrupts are already masked off at this point. */ - per_cpu(prof_counter, cpu) = prof_multiplier[cpu]; - if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) { + per_cpu(prof_counter, cpu) = per_cpu(prof_multiplier, cpu); + if (per_cpu(prof_counter, cpu) != + per_cpu(prof_old_multiplier, cpu)) { __setup_APIC_LVTT( calibration_result/ per_cpu(prof_counter, cpu)); - prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu); + per_cpu(prof_old_multiplier, cpu) = + per_cpu(prof_counter, cpu); } #ifdef CONFIG_SMP diff -Nru a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c --- a/arch/i386/kernel/cpu/common.c Thu Feb 20 23:19:19 2003 +++ b/arch/i386/kernel/cpu/common.c Thu Feb 20 23:19:19 2003 @@ -490,6 +490,10 @@ load_TR_desc(); load_LDT(&init_mm.context); + /* Set up doublefault TSS pointer in the GDT */ + __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss); + cpu_gdt_table[cpu][GDT_ENTRY_DOUBLEFAULT_TSS].b &= 0xfffffdff; + /* Clear %fs and %gs. */ asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs"); diff -Nru a/arch/i386/kernel/cpu/cyrix.c b/arch/i386/kernel/cpu/cyrix.c --- a/arch/i386/kernel/cpu/cyrix.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/cpu/cyrix.c Thu Feb 20 23:19:20 2003 @@ -74,7 +74,7 @@ /* * Reset the slow-loop (SLOP) bit on the 686(L) which is set by some old - * BIOSes for compatability with DOS games. This makes the udelay loop + * BIOSes for compatibility with DOS games. This makes the udelay loop * work correctly, and improves performance. * * FIXME: our newer udelay uses the tsc. We dont need to frob with SLOP diff -Nru a/arch/i386/kernel/cpu/mtrr/if.c b/arch/i386/kernel/cpu/mtrr/if.c --- a/arch/i386/kernel/cpu/mtrr/if.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/cpu/mtrr/if.c Thu Feb 20 23:19:20 2003 @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -300,8 +299,6 @@ # endif /* CONFIG_PROC_FS */ -static devfs_handle_t devfs_handle; - char * attrib_to_str(int x) { return (x <= 6) ? mtrr_strings[x] : "?"; @@ -337,7 +334,6 @@ attrib_to_str(type), usage_table[i]); } } - devfs_set_file_size(devfs_handle, len); return 0; } @@ -350,11 +346,6 @@ proc_root_mtrr->owner = THIS_MODULE; proc_root_mtrr->proc_fops = &mtrr_fops; } -#endif -#ifdef USERSPACE_INTERFACE - devfs_handle = devfs_register(NULL, "cpu/mtrr", DEVFS_FL_DEFAULT, 0, 0, - S_IFREG | S_IRUGO | S_IWUSR, - &mtrr_fops, NULL); #endif return 0; } diff -Nru a/arch/i386/kernel/doublefault.c b/arch/i386/kernel/doublefault.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/kernel/doublefault.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#define DOUBLEFAULT_STACKSIZE (1024) +static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE]; +#define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE) + +#define ptr_ok(x) ((x) > 0xc0000000 && (x) < 0xc1000000) + +static void doublefault_fn(void) +{ + struct Xgt_desc_struct gdt_desc = {0, 0}; + unsigned long gdt, tss; + + __asm__ __volatile__("sgdt %0": "=m" (gdt_desc): :"memory"); + gdt = gdt_desc.address; + + printk("double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size); + + if (ptr_ok(gdt)) { + gdt += GDT_ENTRY_TSS << 3; + tss = *(u16 *)(gdt+2); + tss += *(u8 *)(gdt+4) << 16; + tss += *(u8 *)(gdt+7) << 24; + printk("double fault, tss at %08lx\n", tss); + + if (ptr_ok(tss)) { + struct tss_struct *t = (struct tss_struct *)tss; + + printk("eip = %08lx, esp = %08lx\n", t->eip, t->esp); + + printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n", + t->eax, t->ebx, t->ecx, t->edx); + printk("esi = %08lx, edi = %08lx\n", + t->esi, t->edi); + } + } + + for (;;) /* nothing */; +} + +struct tss_struct doublefault_tss __cacheline_aligned = { + .esp0 = STACK_START, + .ss0 = __KERNEL_DS, + .ldt = 0, + .bitmap = INVALID_IO_BITMAP_OFFSET, + .io_bitmap = { [0 ... IO_BITMAP_SIZE ] = ~0 }, + + .eip = (unsigned long) doublefault_fn, + .eflags = 0x00000082, + .esp = STACK_START, + .es = __USER_DS, + .cs = __KERNEL_CS, + .ss = __KERNEL_DS, + .ds = __USER_DS, + + .__cr3 = __pa(swapper_pg_dir) +}; diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S --- a/arch/i386/kernel/entry.S Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/entry.S Thu Feb 20 23:19:20 2003 @@ -41,7 +41,6 @@ */ #include -#include #include #include #include @@ -174,9 +173,10 @@ ENTRY(ret_from_fork) - # NOTE: this function takes a parameter but it's unused on x86. + pushl %eax call schedule_tail GET_THREAD_INFO(%ebp) + popl %eax jmp syscall_exit /* @@ -252,7 +252,7 @@ pushl %eax SAVE_ALL GET_THREAD_INFO(%ebp) - cmpl $(NR_syscalls), %eax + cmpl $(nr_syscalls), %eax jae syscall_badsys testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp) @@ -276,7 +276,7 @@ pushl %eax # save orig_eax SAVE_ALL GET_THREAD_INFO(%ebp) - cmpl $(NR_syscalls), %eax + cmpl $(nr_syscalls), %eax jae syscall_badsys # system call tracing in operation testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp) @@ -339,7 +339,7 @@ xorl %edx,%edx call do_syscall_trace movl ORIG_EAX(%esp), %eax - cmpl $(NR_syscalls), %eax + cmpl $(nr_syscalls), %eax jnae syscall_call jmp syscall_exit @@ -801,8 +801,15 @@ .long sys_epoll_wait .long sys_remap_file_pages .long sys_set_tid_address - - - .rept NR_syscalls-(.-sys_call_table)/4 - .long sys_ni_syscall - .endr + .long sys_timer_create + .long sys_timer_settime /* 260 */ + .long sys_timer_gettime + .long sys_timer_getoverrun + .long sys_timer_delete + .long sys_clock_settime + .long sys_clock_gettime /* 265 */ + .long sys_clock_getres + .long sys_clock_nanosleep + + +nr_syscalls=(.-sys_call_table)/4 diff -Nru a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S --- a/arch/i386/kernel/head.S Thu Feb 20 23:19:19 2003 +++ b/arch/i386/kernel/head.S Thu Feb 20 23:19:19 2003 @@ -38,11 +38,37 @@ #define X86_VENDOR_ID CPU_PARAMS+28 /* + * Initialize page tables + */ +#define INIT_PAGE_TABLES \ + movl $pg0 - __PAGE_OFFSET, %edi; \ + /* "007" doesn't mean with license to kill, but PRESENT+RW+USER */ \ + movl $007, %eax; \ +2: stosl; \ + add $0x1000, %eax; \ + cmp $empty_zero_page - __PAGE_OFFSET, %edi; \ + jne 2b; + +/* * swapper_pg_dir is the main page directory, address 0x00101000 * * On entry, %esi points to the real-mode code as a 32-bit pointer. */ -startup_32: +ENTRY(startup_32) + +#ifdef CONFIG_X86_VISWS +/* + * On SGI Visual Workstations boot CPU starts in protected mode. + */ + orw %bx, %bx + jnz 1f + INIT_PAGE_TABLES + movl $swapper_pg_dir - __PAGE_OFFSET, %eax + movl %eax, %cr3 + lgdt boot_gdt +1: +#endif + /* * Set segments to known values */ @@ -79,17 +105,7 @@ jmp 3f 1: #endif -/* - * Initialize page tables - */ - movl $pg0-__PAGE_OFFSET,%edi /* initialize page tables */ - movl $007,%eax /* "007" doesn't mean with license to kill, but - PRESENT+RW+USER */ -2: stosl - add $0x1000,%eax - cmp $empty_zero_page-__PAGE_OFFSET,%edi - jne 2b - + INIT_PAGE_TABLES /* * Enable paging */ @@ -412,7 +428,7 @@ /* * The Global Descriptor Table contains 28 quadwords, per-CPU. */ -#ifdef CONFIG_SMP +#if defined(CONFIG_SMP) || defined(CONFIG_X86_VISWS) /* * The boot_gdt_table must mirror the equivalent in setup.S and is * used only by the trampoline for booting other CPUs @@ -459,6 +475,13 @@ .quad 0x00409a0000000000 /* 0xb8 APM CS code */ .quad 0x00009a0000000000 /* 0xc0 APM CS 16 code (16 bit) */ .quad 0x0040920000000000 /* 0xc8 APM DS data */ + + .quad 0x0000000000000000 /* 0xd0 - unused */ + .quad 0x0000000000000000 /* 0xd8 - unused */ + .quad 0x0000000000000000 /* 0xe0 - unused */ + .quad 0x0000000000000000 /* 0xe8 - unused */ + .quad 0x0000000000000000 /* 0xf0 - unused */ + .quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */ #if CONFIG_SMP .fill (NR_CPUS-1)*GDT_ENTRIES,8,0 /* other CPU's GDT */ diff -Nru a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c --- a/arch/i386/kernel/i386_ksyms.c Thu Feb 20 23:19:24 2003 +++ b/arch/i386/kernel/i386_ksyms.c Thu Feb 20 23:19:24 2003 @@ -104,6 +104,7 @@ /* Networking helper routines. */ EXPORT_SYMBOL(csum_partial_copy_generic); /* Delay loops */ +EXPORT_SYMBOL(__ndelay); EXPORT_SYMBOL(__udelay); EXPORT_SYMBOL(__delay); EXPORT_SYMBOL(__const_udelay); @@ -182,8 +183,6 @@ EXPORT_SYMBOL(rtc_lock); -EXPORT_SYMBOL_GPL(register_profile_notifier); -EXPORT_SYMBOL_GPL(unregister_profile_notifier); EXPORT_SYMBOL_GPL(set_nmi_callback); EXPORT_SYMBOL_GPL(unset_nmi_callback); diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c --- a/arch/i386/kernel/i8259.c Thu Feb 20 23:19:23 2003 +++ b/arch/i386/kernel/i8259.c Thu Feb 20 23:19:23 2003 @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -47,7 +48,7 @@ void mask_and_ack_8259A(unsigned int); -static unsigned int startup_8259A_irq(unsigned int irq) +unsigned int startup_8259A_irq(unsigned int irq) { enable_8259A_irq(irq); return 0; /* never anything pending */ @@ -71,11 +72,7 @@ /* * This contains the irq mask for both 8259A irq controllers, */ -static unsigned int cached_irq_mask = 0xffff; - -#define __byte(x,y) (((unsigned char *)&(y))[x]) -#define cached_21 (__byte(0,cached_irq_mask)) -#define cached_A1 (__byte(1,cached_irq_mask)) +unsigned int cached_irq_mask = 0xffff; /* * Not all IRQs can be routed through the IO-APIC, eg. on certain (older) diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c --- a/arch/i386/kernel/io_apic.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/io_apic.c Thu Feb 20 23:19:21 2003 @@ -222,7 +222,7 @@ # endif extern unsigned long irq_affinity [NR_IRQS]; -unsigned long __cacheline_aligned irq_balance_mask [NR_IRQS]; +int __cacheline_aligned pending_irq_balance_apicid [NR_IRQS]; static int irqbalance_disabled __initdata = 0; static int physical_balance = 0; @@ -441,7 +441,7 @@ Dprintk("irq = %d moved to cpu = %d\n", selected_irq, min_loaded); /* mark for change destination */ spin_lock(&desc->lock); - irq_balance_mask[selected_irq] = target_cpu_mask; + pending_irq_balance_apicid[selected_irq] = cpu_to_logical_apicid(min_loaded); spin_unlock(&desc->lock); /* Since we made a change, come back sooner to * check for more variation. @@ -500,7 +500,7 @@ if (cpu != new_cpu) { irq_desc_t *desc = irq_desc + irq; spin_lock(&desc->lock); - irq_balance_mask[irq] = cpu_to_logical_apicid(new_cpu); + pending_irq_balance_apicid[irq] = cpu_to_logical_apicid(new_cpu); spin_unlock(&desc->lock); } } @@ -515,7 +515,7 @@ /* push everything to CPU 0 to give us a starting point. */ for (i = 0 ; i < NR_IRQS ; i++) - irq_balance_mask[i] = 1 << 0; + pending_irq_balance_apicid[i] = cpu_to_logical_apicid(0); for (;;) { set_current_state(TASK_INTERRUPTIBLE); time_remaining = schedule_timeout(time_remaining); @@ -580,9 +580,9 @@ static inline void move_irq(int irq) { /* note - we hold the desc->lock */ - if (unlikely(irq_balance_mask[irq])) { - set_ioapic_affinity(irq, irq_balance_mask[irq]); - irq_balance_mask[irq] = 0; + if (unlikely(pending_irq_balance_apicid[irq])) { + set_ioapic_affinity(irq, pending_irq_balance_apicid[irq]); + pending_irq_balance_apicid[irq] = 0; } } @@ -1745,25 +1745,25 @@ */ static struct hw_interrupt_type ioapic_edge_irq_type = { - "IO-APIC-edge", - startup_edge_ioapic_irq, - shutdown_edge_ioapic_irq, - enable_edge_ioapic_irq, - disable_edge_ioapic_irq, - ack_edge_ioapic_irq, - end_edge_ioapic_irq, - set_ioapic_affinity, + .typename = "IO-APIC-edge", + .startup = startup_edge_ioapic_irq, + .shutdown = shutdown_edge_ioapic_irq, + .enable = enable_edge_ioapic_irq, + .disable = disable_edge_ioapic_irq, + .ack = ack_edge_ioapic_irq, + .end = end_edge_ioapic_irq, + .set_affinity = set_ioapic_affinity, }; static struct hw_interrupt_type ioapic_level_irq_type = { - "IO-APIC-level", - startup_level_ioapic_irq, - shutdown_level_ioapic_irq, - enable_level_ioapic_irq, - disable_level_ioapic_irq, - mask_and_ack_level_ioapic_irq, - end_level_ioapic_irq, - set_ioapic_affinity, + .typename = "IO-APIC-level", + .startup = startup_level_ioapic_irq, + .shutdown = shutdown_level_ioapic_irq, + .enable = enable_level_ioapic_irq, + .disable = disable_level_ioapic_irq, + .ack = mask_and_ack_level_ioapic_irq, + .end = end_level_ioapic_irq, + .set_affinity = set_ioapic_affinity, }; static inline void init_IO_APIC_traps(void) @@ -1821,26 +1821,14 @@ static void end_lapic_irq (unsigned int i) { /* nothing */ } static struct hw_interrupt_type lapic_irq_type = { - "local-APIC-edge", - NULL, /* startup_irq() not used for IRQ0 */ - NULL, /* shutdown_irq() not used for IRQ0 */ - enable_lapic_irq, - disable_lapic_irq, - ack_lapic_irq, - end_lapic_irq + .typename = "local-APIC-edge", + .startup = NULL, /* startup_irq() not used for IRQ0 */ + .shutdown = NULL, /* shutdown_irq() not used for IRQ0 */ + .enable = enable_lapic_irq, + .disable = disable_lapic_irq, + .ack = ack_lapic_irq, + .end = end_lapic_irq }; - -void enable_NMI_through_LVT0 (void * dummy) -{ - unsigned int v, ver; - - ver = apic_read(APIC_LVR); - ver = GET_APIC_VERSION(ver); - v = APIC_DM_NMI; /* unmask and set to NMI */ - if (!APIC_INTEGRATED(ver)) /* 82489DX */ - v |= APIC_LVT_LEVEL_TRIGGER; - apic_write_around(APIC_LVT0, v); -} static void setup_nmi (void) { diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c --- a/arch/i386/kernel/mpparse.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/mpparse.c Thu Feb 20 23:19:20 2003 @@ -1027,8 +1027,19 @@ while ((void *) entry < madt_end) { if (entry->header.type == ACPI_MADT_INT_SRC_OVR && - acpi_fadt.sci_int == entry->global_irq) - return; + acpi_fadt.sci_int == entry->bus_irq) { + /* + * See the note at the end of ACPI 2.0b section + * 5.2.10.8 for what this is about. + */ + if (entry->bus_irq != entry->global_irq) { + acpi_fadt.sci_int = entry->global_irq; + irq = entry->global_irq; + break; + } + else + return; + } entry = (struct acpi_table_int_src_ovr *) ((unsigned long) entry + entry->header.length); diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c --- a/arch/i386/kernel/process.c Thu Feb 20 23:19:19 2003 +++ b/arch/i386/kernel/process.c Thu Feb 20 23:19:19 2003 @@ -423,8 +423,12 @@ * so the performance issues may eventually be a valid point. * More important, however, is the fact that this allows us much * more flexibility. + * + * The return value (in %eax) will be the "prev" task after + * the task-switch, and shows up in ret_from_fork in entry.S, + * for example. */ -void __switch_to(struct task_struct *prev_p, struct task_struct *next_p) +struct task_struct * __switch_to(struct task_struct *prev_p, struct task_struct *next_p) { struct thread_struct *prev = &prev_p->thread, *next = &next_p->thread; @@ -495,6 +499,7 @@ */ tss->bitmap = INVALID_IO_BITMAP_OFFSET; } + return prev_p; } asmlinkage int sys_fork(struct pt_regs regs) diff -Nru a/arch/i386/kernel/profile.c b/arch/i386/kernel/profile.c --- a/arch/i386/kernel/profile.c Thu Feb 20 23:19:23 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,45 +0,0 @@ -/* - * linux/arch/i386/kernel/profile.c - * - * (C) 2002 John Levon - * - */ - -#include -#include -#include -#include -#include - -static struct notifier_block * profile_listeners; -static rwlock_t profile_lock = RW_LOCK_UNLOCKED; - -int register_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_register(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -int unregister_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_unregister(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -void x86_profile_hook(struct pt_regs * regs) -{ - /* we would not even need this lock if - * we had a global cli() on register/unregister - */ - read_lock(&profile_lock); - notifier_call_chain(&profile_listeners, 0, regs); - read_unlock(&profile_lock); -} diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Thu Feb 20 23:19:21 2003 +++ b/arch/i386/kernel/setup.c Thu Feb 20 23:19:21 2003 @@ -92,7 +92,6 @@ extern int root_mountflags; extern char _text, _etext, _edata, _end; extern int blk_nohighio; -void __init visws_get_board_type_and_rev(void); unsigned long saved_videomode; diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c --- a/arch/i386/kernel/time.c Thu Feb 20 23:19:21 2003 +++ b/arch/i386/kernel/time.c Thu Feb 20 23:19:21 2003 @@ -135,6 +135,7 @@ time_maxerror = NTP_PHASE_LIMIT; time_esterror = NTP_PHASE_LIMIT; write_sequnlock_irq(&xtime_lock); + clock_was_set(); } /* diff -Nru a/arch/i386/kernel/trampoline.S b/arch/i386/kernel/trampoline.S --- a/arch/i386/kernel/trampoline.S Thu Feb 20 23:19:21 2003 +++ b/arch/i386/kernel/trampoline.S Thu Feb 20 23:19:21 2003 @@ -46,8 +46,8 @@ movl $0xA5A5A5A5, trampoline_data - r_base # write marker for master knows we're running - lidt idt_48 - r_base # load idt with 0, 0 - lgdt gdt_48 - r_base # load gdt with whatever is appropriate + lidt boot_idt - r_base # load idt with 0, 0 + lgdt boot_gdt - r_base # load gdt with whatever is appropriate xor %ax, %ax inc %ax # protected mode (PE) bit @@ -57,7 +57,7 @@ ljmpl $__BOOT_CS, $0x00100000 # jump to startup_32 in arch/i386/kernel/head.S -idt_48: +boot_idt: .word 0 # idt limit = 0 .word 0, 0 # idt base = 0L @@ -65,8 +65,7 @@ # NOTE: here we actually use CPU#0's GDT - but that is OK, we reload # the proper GDT shortly after booting up the secondary CPUs. # - -gdt_48: +ENTRY(boot_gdt) .word __BOOT_DS + 7 # gdt limit .long boot_gdt_table-__PAGE_OFFSET # gdt base = gdt (first SMP CPU) diff -Nru a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c --- a/arch/i386/kernel/traps.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/kernel/traps.c Thu Feb 20 23:19:20 2003 @@ -775,7 +775,7 @@ } #endif -#define _set_gate(gate_addr,type,dpl,addr) \ +#define _set_gate(gate_addr,type,dpl,addr,seg) \ do { \ int __d0, __d1; \ __asm__ __volatile__ ("movw %%dx,%%ax\n\t" \ @@ -785,7 +785,7 @@ :"=m" (*((long *) (gate_addr))), \ "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \ :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \ - "3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \ + "3" ((char *) (addr)),"2" ((seg) << 16)); \ } while (0) @@ -797,22 +797,27 @@ */ void set_intr_gate(unsigned int n, void *addr) { - _set_gate(idt_table+n,14,0,addr); + _set_gate(idt_table+n,14,0,addr,__KERNEL_CS); } static void __init set_trap_gate(unsigned int n, void *addr) { - _set_gate(idt_table+n,15,0,addr); + _set_gate(idt_table+n,15,0,addr,__KERNEL_CS); } static void __init set_system_gate(unsigned int n, void *addr) { - _set_gate(idt_table+n,15,3,addr); + _set_gate(idt_table+n,15,3,addr,__KERNEL_CS); } static void __init set_call_gate(void *a, void *addr) { - _set_gate(a,12,3,addr); + _set_gate(a,12,3,addr,__KERNEL_CS); +} + +static void __init set_task_gate(unsigned int n, unsigned int gdt_entry) +{ + _set_gate(idt_table+n,5,0,0,(gdt_entry<<3)); } @@ -843,7 +848,7 @@ set_system_gate(5,&bounds); set_trap_gate(6,&invalid_op); set_trap_gate(7,&device_not_available); - set_trap_gate(8,&double_fault); + set_task_gate(8,GDT_ENTRY_DOUBLEFAULT_TSS); set_trap_gate(9,&coprocessor_segment_overrun); set_trap_gate(10,&invalid_TSS); set_trap_gate(11,&segment_not_present); diff -Nru a/arch/i386/lib/delay.c b/arch/i386/lib/delay.c --- a/arch/i386/lib/delay.c Thu Feb 20 23:19:23 2003 +++ b/arch/i386/lib/delay.c Thu Feb 20 23:19:23 2003 @@ -41,3 +41,8 @@ { __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */ } + +void __ndelay(unsigned long nsecs) +{ + __const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */ +} diff -Nru a/arch/i386/mach-visws/Makefile b/arch/i386/mach-visws/Makefile --- a/arch/i386/mach-visws/Makefile Thu Feb 20 23:19:23 2003 +++ b/arch/i386/mach-visws/Makefile Thu Feb 20 23:19:23 2003 @@ -4,8 +4,7 @@ EXTRA_CFLAGS += -I../kernel -obj-y := setup.o traps.o +obj-y := setup.o traps.o reboot.o -obj-$(CONFIG_PCI) += pci-visws.o obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o obj-$(CONFIG_X86_LOCAL_APIC) += mpparse.o diff -Nru a/arch/i386/mach-visws/mpparse.c b/arch/i386/mach-visws/mpparse.c --- a/arch/i386/mach-visws/mpparse.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/mach-visws/mpparse.c Thu Feb 20 23:19:20 2003 @@ -1,17 +1,15 @@ -#include -#include -#include -#include + #include -#include -#include -#include -#include +#include +#include #include -#include +#include #include -#include +#include + +#include "cobalt.h" +#include "mach_apic.h" /* Have we found an MP table */ int smp_found_config; @@ -43,25 +41,84 @@ /* Processor that is doing the boot up */ unsigned int boot_cpu_physical_apicid = -1U; unsigned int boot_cpu_logical_apicid = -1U; + /* Internal processor count */ static unsigned int num_processors; /* Bitmask of physically existing CPUs */ unsigned long phys_cpu_present_map; +u8 raw_phys_apicid[NR_CPUS] = { [0 ... NR_CPUS - 1] = BAD_APICID }; + /* * The Visual Workstation is Intel MP compliant in the hardware * sense, but it doesn't have a BIOS(-configuration table). * No problem for Linux. */ + +void __init MP_processor_info (struct mpc_config_processor *m) +{ + int ver, logical_apicid; + + if (!(m->mpc_cpuflag & CPU_ENABLED)) + return; + + logical_apicid = m->mpc_apicid; + printk(KERN_INFO "%sCPU #%d %ld:%ld APIC version %d\n", + m->mpc_cpuflag & CPU_BOOTPROCESSOR ? "Bootup " : "", + m->mpc_apicid, + (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8, + (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4, + m->mpc_apicver); + + if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { + boot_cpu_physical_apicid = m->mpc_apicid; + boot_cpu_logical_apicid = logical_apicid; + } + + num_processors++; + + if (m->mpc_apicid > MAX_APICS) { + printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", + m->mpc_apicid, MAX_APICS); + --num_processors; + return; + } + ver = m->mpc_apicver; + + phys_cpu_present_map |= apicid_to_cpu_present(m->mpc_apicid); + /* + * Validate version + */ + if (ver == 0x0) { + printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! " + "fixing up to 0x10. (tell your hw vendor)\n", + m->mpc_apicid); + ver = 0x10; + } + apic_version[m->mpc_apicid] = ver; + raw_phys_apicid[num_processors - 1] = m->mpc_apicid; +} + void __init find_smp_config(void) { - smp_found_config = 1; + struct mpc_config_processor *mp = phys_to_virt(CO_CPU_TAB_PHYS); + unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); + + if (ncpus > CO_CPU_MAX) { + printk(KERN_WARNING "find_visws_smp: got cpu count of %d at %p\n", + ncpus, mp); - phys_cpu_present_map |= 2; /* or in id 1 */ - apic_version[1] |= 0x10; /* integrated APIC */ - apic_version[0] |= 0x10; + ncpus = CO_CPU_MAX; + } + + smp_found_config = 1; + while (ncpus--) + MP_processor_info(mp++); mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; } +void __init get_smp_config (void) +{ +} diff -Nru a/arch/i386/mach-visws/pci-visws.c b/arch/i386/mach-visws/pci-visws.c --- a/arch/i386/mach-visws/pci-visws.c Thu Feb 20 23:19:23 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,141 +0,0 @@ -/* - * Low-Level PCI Support for SGI Visual Workstation - * - * (c) 1999--2000 Martin Mares - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "pci-i386.h" - -unsigned int pci_probe = 0; - -/* - * The VISWS uses configuration access type 1 only. - */ - -#define CONFIG_CMD(dev, where) (0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | (where & ~3)) - -static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - *value = inb(0xCFC + (where&3)); - return PCIBIOS_SUCCESSFUL; -} - -static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - *value = inw(0xCFC + (where&2)); - return PCIBIOS_SUCCESSFUL; -} - -static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - *value = inl(0xCFC); - return PCIBIOS_SUCCESSFUL; -} - -static int pci_conf1_write_config_byte(struct pci_dev *dev, int where, u8 value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - outb(value, 0xCFC + (where&3)); - return PCIBIOS_SUCCESSFUL; -} - -static int pci_conf1_write_config_word(struct pci_dev *dev, int where, u16 value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - outw(value, 0xCFC + (where&2)); - return PCIBIOS_SUCCESSFUL; -} - -static int pci_conf1_write_config_dword(struct pci_dev *dev, int where, u32 value) -{ - outl(CONFIG_CMD(dev,where), 0xCF8); - outl(value, 0xCFC); - return PCIBIOS_SUCCESSFUL; -} - -#undef CONFIG_CMD - -static struct pci_ops visws_pci_ops = { - pci_conf1_read_config_byte, - pci_conf1_read_config_word, - pci_conf1_read_config_dword, - pci_conf1_write_config_byte, - pci_conf1_write_config_word, - pci_conf1_write_config_dword -}; - -static void __init pcibios_fixup_irqs(void) -{ - struct pci_dev *dev, *p; - u8 pin; - int irq; - - pci_for_each_dev(dev) { - pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); - dev->irq = 0; - if (!pin) - continue; - pin--; - if (dev->bus->parent) { - p = dev->bus->parent->self; - pin = (pin + PCI_SLOT(dev->devfn)) % 4; - } else - p = dev; - irq = visws_get_PCI_irq_vector(p->bus->number, PCI_SLOT(p->devfn), pin+1); - if (irq >= 0) - dev->irq = irq; - DBG("PCI IRQ: %s pin %d -> %d\n", dev->slot_name, pin, irq); - } -} - -void __init pcibios_fixup_bus(struct pci_bus *b) -{ - pci_read_bridge_bases(b); -} - -#if 0 -static struct resource visws_pci_bus_resources[2] = { - { "Host bus 1", 0xf4000000, 0xf7ffffff, 0 }, - { "Host bus 2", 0xf0000000, 0xf3ffffff, 0 } -}; -#endif - -void __init pcibios_init(void) -{ - unsigned int sec_bus = li_pcib_read16(LI_PCI_BUSNUM) & 0xff; - - printk("PCI: Probing PCI hardware on host buses 00 and %02x\n", sec_bus); - pci_scan_bus(0, &visws_pci_ops, NULL); - pci_scan_bus(sec_bus, &visws_pci_ops, NULL); - pcibios_fixup_irqs(); - pcibios_resource_survey(); -} - -char * __init pcibios_setup(char *str) -{ - return str; -} - -int pcibios_enable_device(struct pci_dev *dev, int mask) -{ - return pcibios_enable_resources(dev, mask); -} - -void __init pcibios_penalize_isa_irq(irq) -{ -} diff -Nru a/arch/i386/mach-visws/reboot.c b/arch/i386/mach-visws/reboot.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/mach-visws/reboot.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,48 @@ + +#include +#include +#include + +#include +#include "piix4.h" + +void (*pm_power_off)(void); + +int reboot_thru_bios; +int reboot_smp; + +void machine_restart(char * __unused) +{ +#ifdef CONFIG_SMP + smp_send_stop(); +#endif + + /* + * Visual Workstations restart after this + * register is poked on the PIIX4 + */ + outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT); +} + +void machine_power_off(void) +{ + unsigned short pm_status; + extern unsigned int pci_bus0; + + while ((pm_status = inw(PMSTS_PORT)) & 0x100) + outw(pm_status, PMSTS_PORT); + + outw(PM_SUSPEND_ENABLE, PMCNTRL_PORT); + + mdelay(10); + +#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ + (0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) + + outl(PCI_CONF1_ADDRESS(pci_bus0, SPECIAL_DEV, SPECIAL_REG), 0xCF8); + outl(PIIX_SPECIAL_STOP, 0xCFC); +} + +void machine_halt(void) +{ +} diff -Nru a/arch/i386/mach-visws/setup.c b/arch/i386/mach-visws/setup.c --- a/arch/i386/mach-visws/setup.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/mach-visws/setup.c Thu Feb 20 23:19:20 2003 @@ -9,67 +9,26 @@ #include #include -#include #include #include +#include "cobalt.h" +#include "piix4.h" char visws_board_type = -1; char visws_board_rev = -1; -#define PIIX_PM_START 0x0F80 - -#define SIO_GPIO_START 0x0FC0 - -#define SIO_PM_START 0x0FC8 - -#define PMBASE PIIX_PM_START -#define GPIREG0 (PMBASE+0x30) -#define GPIREG(x) (GPIREG0+((x)/8)) -#define PIIX_GPI_BD_ID1 18 -#define PIIX_GPI_BD_REG GPIREG(PIIX_GPI_BD_ID1) - -#define PIIX_GPI_BD_SHIFT (PIIX_GPI_BD_ID1 % 8) - -#define SIO_INDEX 0x2e -#define SIO_DATA 0x2f - -#define SIO_DEV_SEL 0x7 -#define SIO_DEV_ENB 0x30 -#define SIO_DEV_MSB 0x60 -#define SIO_DEV_LSB 0x61 - -#define SIO_GP_DEV 0x7 - -#define SIO_GP_BASE SIO_GPIO_START -#define SIO_GP_MSB (SIO_GP_BASE>>8) -#define SIO_GP_LSB (SIO_GP_BASE&0xff) - -#define SIO_GP_DATA1 (SIO_GP_BASE+0) - -#define SIO_PM_DEV 0x8 - -#define SIO_PM_BASE SIO_PM_START -#define SIO_PM_MSB (SIO_PM_BASE>>8) -#define SIO_PM_LSB (SIO_PM_BASE&0xff) -#define SIO_PM_INDEX (SIO_PM_BASE+0) -#define SIO_PM_DATA (SIO_PM_BASE+1) - -#define SIO_PM_FER2 0x1 - -#define SIO_PM_GP_EN 0x80 - void __init visws_get_board_type_and_rev(void) { int raw; visws_board_type = (char)(inb_p(PIIX_GPI_BD_REG) & PIIX_GPI_BD_REG) >> PIIX_GPI_BD_SHIFT; -/* - * Get Board rev. - * First, we have to initialize the 307 part to allow us access - * to the GPIO registers. Let's map them at 0x0fc0 which is right - * after the PIIX4 PM section. - */ + /* + * Get Board rev. + * First, we have to initialize the 307 part to allow us access + * to the GPIO registers. Let's map them at 0x0fc0 which is right + * after the PIIX4 PM section. + */ outb_p(SIO_DEV_SEL, SIO_INDEX); outb_p(SIO_GP_DEV, SIO_DATA); /* Talk to GPIO regs. */ @@ -82,11 +41,11 @@ outb_p(SIO_DEV_ENB, SIO_INDEX); outb_p(1, SIO_DATA); /* Enable GPIO registers. */ -/* - * Now, we have to map the power management section to write - * a bit which enables access to the GPIO registers. - * What lunatic came up with this shit? - */ + /* + * Now, we have to map the power management section to write + * a bit which enables access to the GPIO registers. + * What lunatic came up with this shit? + */ outb_p(SIO_DEV_SEL, SIO_INDEX); outb_p(SIO_PM_DEV, SIO_DATA); /* Talk to GPIO regs. */ @@ -99,18 +58,18 @@ outb_p(SIO_DEV_ENB, SIO_INDEX); outb_p(1, SIO_DATA); /* Enable PM registers. */ -/* - * Now, write the PM register which enables the GPIO registers. - */ + /* + * Now, write the PM register which enables the GPIO registers. + */ outb_p(SIO_PM_FER2, SIO_PM_INDEX); outb_p(SIO_PM_GP_EN, SIO_PM_DATA); -/* - * Now, initialize the GPIO registers. - * We want them all to be inputs which is the - * power on default, so let's leave them alone. - * So, let's just read the board rev! - */ + /* + * Now, initialize the GPIO registers. + * We want them all to be inputs which is the + * power on default, so let's leave them alone. + * So, let's just read the board rev! + */ raw = inb_p(SIO_GP_DATA1); raw &= 0x7f; /* 7 bits of valid board revision ID. */ @@ -128,10 +87,10 @@ visws_board_rev = raw; } - printk(KERN_INFO "Silicon Graphics %s (rev %d)\n", - visws_board_type == VISWS_320 ? "320" : + printk(KERN_INFO "Silicon Graphics Visual Workstation %s (rev %d) detected\n", + (visws_board_type == VISWS_320 ? "320" : (visws_board_type == VISWS_540 ? "540" : - "unknown"), visws_board_rev); + "unknown")), visws_board_rev); } void __init pre_intr_init_hook(void) @@ -150,11 +109,16 @@ { visws_get_board_type_and_rev(); } -static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL}; + +static struct irqaction irq0 = { + .handler = timer_interrupt, + .flags = SA_INTERRUPT, + .name = "timer", +}; void __init time_init_hook(void) { - printk("Starting Cobalt Timer system clock\n"); + printk(KERN_INFO "Starting Cobalt Timer system clock\n"); /* Set the countdown value */ co_cpu_write(CO_CPU_TIMEVAL, CO_TIME_HZ/HZ); @@ -166,5 +130,5 @@ co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); /* Wire cpu IDT entry to s/w handler (and Cobalt APIC to IDT) */ - setup_irq(CO_IRQ_TIMER, &irq0); + setup_irq(0, &irq0); } diff -Nru a/arch/i386/mach-visws/traps.c b/arch/i386/mach-visws/traps.c --- a/arch/i386/mach-visws/traps.c Thu Feb 20 23:19:22 2003 +++ b/arch/i386/mach-visws/traps.c Thu Feb 20 23:19:22 2003 @@ -3,132 +3,68 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include +#include +#include -#include -#include #include -#include -#include -#include -#include - -#include #include #include +#include +#include "cobalt.h" +#include "lithium.h" -#ifdef CONFIG_X86_VISWS_APIC -#include -#include -#include -#endif - -#ifdef CONFIG_X86_VISWS_APIC - -/* - * On Rev 005 motherboards legacy device interrupt lines are wired directly - * to Lithium from the 307. But the PROM leaves the interrupt type of each - * 307 logical device set appropriate for the 8259. Later we'll actually use - * the 8259, but for now we have to flip the interrupt types to - * level triggered, active lo as required by Lithium. - */ - -#define REG 0x2e /* The register to read/write */ -#define DEV 0x07 /* Register: Logical device select */ -#define VAL 0x2f /* The value to read/write */ -static void -superio_outb(int dev, int reg, int val) -{ - outb(DEV, REG); - outb(dev, VAL); - outb(reg, REG); - outb(val, VAL); -} +#define A01234 (LI_INTA_0 | LI_INTA_1 | LI_INTA_2 | LI_INTA_3 | LI_INTA_4) +#define BCD (LI_INTB | LI_INTC | LI_INTD) +#define ALLDEVS (A01234 | BCD) -static int __attribute__ ((unused)) -superio_inb(int dev, int reg) +static __init void lithium_init(void) { - outb(DEV, REG); - outb(dev, VAL); - outb(reg, REG); - return inb(VAL); -} - -#define FLOP 3 /* floppy logical device */ -#define PPORT 4 /* parallel logical device */ -#define UART5 5 /* uart2 logical device (not wired up) */ -#define UART6 6 /* uart1 logical device (THIS is the serial port!) */ -#define IDEST 0x70 /* int. destination (which 307 IRQ line) reg. */ -#define ITYPE 0x71 /* interrupt type register */ - -/* interrupt type bits */ -#define LEVEL 0x01 /* bit 0, 0 == edge triggered */ -#define ACTHI 0x02 /* bit 1, 0 == active lo */ + set_fixmap(FIX_LI_PCIA, LI_PCI_A_PHYS); + set_fixmap(FIX_LI_PCIB, LI_PCI_B_PHYS); -static __init void -superio_init(void) -{ - if (visws_board_type == VISWS_320 && visws_board_rev == 5) { - superio_outb(UART6, IDEST, 0); /* 0 means no intr propagated */ - printk("SGI 320 rev 5: disabling 307 uart1 interrupt\n"); + if ((li_pcia_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) || + (li_pcia_read16(PCI_DEVICE_ID) != PCI_VENDOR_ID_SGI_LITHIUM)) { + printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'A'); + panic("This machine is not SGI Visual Workstation 320/540"); } -} -static __init void -lithium_init(void) -{ - set_fixmap(FIX_LI_PCIA, LI_PCI_A_PHYS); - printk("Lithium PCI Bridge A, Bus Number: %d\n", - li_pcia_read16(LI_PCI_BUSNUM) & 0xff); - set_fixmap(FIX_LI_PCIB, LI_PCI_B_PHYS); - printk("Lithium PCI Bridge B (PIIX4), Bus Number: %d\n", - li_pcib_read16(LI_PCI_BUSNUM) & 0xff); + if ((li_pcib_read16(PCI_VENDOR_ID) != PCI_VENDOR_ID_SGI) || + (li_pcib_read16(PCI_DEVICE_ID) != PCI_VENDOR_ID_SGI_LITHIUM)) { + printk(KERN_EMERG "Lithium hostbridge %c not found\n", 'B'); + panic("This machine is not SGI Visual Workstation 320/540"); + } - /* XXX blindly enables all interrupts */ - li_pcia_write16(LI_PCI_INTEN, 0xffff); - li_pcib_write16(LI_PCI_INTEN, 0xffff); + li_pcia_write16(LI_PCI_INTEN, ALLDEVS); + li_pcib_write16(LI_PCI_INTEN, ALLDEVS); } -static __init void -cobalt_init(void) +static __init void cobalt_init(void) { /* * On normal SMP PC this is used only with SMP, but we have to * use it and set it up here to start the Cobalt clock */ set_fixmap(FIX_APIC_BASE, APIC_DEFAULT_PHYS_BASE); - printk("Local APIC ID %lx\n", apic_read(APIC_ID)); - printk("Local APIC Version %lx\n", apic_read(APIC_LVR)); + setup_local_APIC(); + printk(KERN_INFO "Local APIC Version %#lx, ID %#lx\n", + apic_read(APIC_LVR), apic_read(APIC_ID)); set_fixmap(FIX_CO_CPU, CO_CPU_PHYS); - printk("Cobalt Revision %lx\n", co_cpu_read(CO_CPU_REV)); - set_fixmap(FIX_CO_APIC, CO_APIC_PHYS); - printk("Cobalt APIC ID %lx\n", co_apic_read(CO_APIC_ID)); + printk(KERN_INFO "Cobalt Revision %#lx, APIC ID %#lx\n", + co_cpu_read(CO_CPU_REV), co_apic_read(CO_APIC_ID)); /* Enable Cobalt APIC being careful to NOT change the ID! */ - co_apic_write(CO_APIC_ID, co_apic_read(CO_APIC_ID)|CO_APIC_ENABLE); + co_apic_write(CO_APIC_ID, co_apic_read(CO_APIC_ID) | CO_APIC_ENABLE); - printk("Cobalt APIC enabled: ID reg %lx\n", co_apic_read(CO_APIC_ID)); + printk(KERN_INFO "Cobalt APIC enabled: ID reg %#lx\n", + co_apic_read(CO_APIC_ID)); } -#endif -void __init trap_init_hook() +void __init trap_init_hook(void) { -#ifdef CONFIG_X86_VISWS_APIC - superio_init(); lithium_init(); cobalt_init(); -#endif } diff -Nru a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c --- a/arch/i386/mach-visws/visws_apic.c Thu Feb 20 23:19:19 2003 +++ b/arch/i386/mach-visws/visws_apic.c Thu Feb 20 23:19:19 2003 @@ -1,5 +1,5 @@ /* - * linux/arch/i386/kernel/visws_apic.c + * linux/arch/i386/mach_visws/visws_apic.c * * Copyright (C) 1999 Bent Hagemark, Ingo Molnar * @@ -10,234 +10,180 @@ * hardware in the system uses this controller directly. Legacy devices * are connected to the PIIX4 which in turn has its 8259(s) connected to * a of the Cobalt APIC entry. + * + * 09/02/2000 - Updated for 2.4 by jbarnes@sgi.com + * + * 25/11/2002 - Updated for 2.5 by Andrey Panin */ -#include -#include +#include #include -#include -#include -#include #include -#include -#include -#include -#include +#include #include #include -#include #include -#include -#include -#include -#include -#include -#include - -#include - -#include - -/* - * This is the PIIX4-based 8259 that is wired up indirectly to Cobalt - * -- not the manner expected by the normal 8259 code in irq.c. - * - * there is a 'master' physical interrupt source that gets sent to - * the CPU. But in the chipset there are various 'virtual' interrupts - * waiting to be handled. We represent this to Linux through a 'master' - * interrupt controller type, and through a special virtual interrupt- - * controller. Device drivers only see the virtual interrupt sources. - */ - -#define CO_IRQ_BASE 0x20 /* This is the 0x20 in init_IRQ()! */ - -static void startup_piix4_master_irq(unsigned int irq); -static void shutdown_piix4_master_irq(unsigned int irq); -static void do_piix4_master_IRQ(unsigned int irq, struct pt_regs * regs); -#define enable_piix4_master_irq startup_piix4_master_irq -#define disable_piix4_master_irq shutdown_piix4_master_irq +#include +#include -static struct hw_interrupt_type piix4_master_irq_type = { - "PIIX4-master", - startup_piix4_master_irq, - shutdown_piix4_master_irq, - do_piix4_master_IRQ, - enable_piix4_master_irq, - disable_piix4_master_irq -}; - -static void enable_piix4_virtual_irq(unsigned int irq); -static void disable_piix4_virtual_irq(unsigned int irq); -#define startup_piix4_virtual_irq enable_piix4_virtual_irq -#define shutdown_piix4_virtual_irq disable_piix4_virtual_irq - -static struct hw_interrupt_type piix4_virtual_irq_type = { - "PIIX4-virtual", - startup_piix4_virtual_irq, - shutdown_piix4_virtual_irq, - 0, /* no handler, it's never called physically */ - enable_piix4_virtual_irq, - disable_piix4_virtual_irq -}; - -/* - * This is the SGI Cobalt (IO-)APIC: - */ +#include "cobalt.h" +#include "irq_vectors.h" -static void do_cobalt_IRQ(unsigned int irq, struct pt_regs * regs); -static void enable_cobalt_irq(unsigned int irq); -static void disable_cobalt_irq(unsigned int irq); -static void startup_cobalt_irq(unsigned int irq); -#define shutdown_cobalt_irq disable_cobalt_irq -static spinlock_t irq_controller_lock = SPIN_LOCK_UNLOCKED; +int irq_vector[NR_IRQS] = { FIRST_EXTERNAL_VECTOR, 0 }; -static struct hw_interrupt_type cobalt_irq_type = { - "Cobalt-APIC", - startup_cobalt_irq, - shutdown_cobalt_irq, - do_cobalt_IRQ, - enable_cobalt_irq, - disable_cobalt_irq -}; +static spinlock_t cobalt_lock = SPIN_LOCK_UNLOCKED; /* - * Not an __init, needed by the reboot code + * Set the given Cobalt APIC Redirection Table entry to point + * to the given IDT vector/index. */ -void disable_IO_APIC(void) +static inline void co_apic_set(int entry, int irq) { - /* Nop on Cobalt */ -} + co_apic_write(CO_APIC_LO(entry), CO_APIC_LEVEL | irq_vector[irq]); + co_apic_write(CO_APIC_HI(entry), 0); +} /* * Cobalt (IO)-APIC functions to handle PCI devices. */ - -static void disable_cobalt_irq(unsigned int irq) +static inline int co_apic_ide0_hack(void) { - /* XXX undo the APIC entry here? */ + extern char visws_board_type; + extern char visws_board_rev; - /* - * definitely, we do not want to have IRQ storms from - * unused devices --mingo - */ + if (visws_board_type == VISWS_320 && visws_board_rev == 5) + return 5; + return CO_APIC_IDE0; } -static void enable_cobalt_irq(unsigned int irq) +static int is_co_apic(unsigned int irq) { + if (IS_CO_APIC(irq)) + return CO_APIC(irq); + + switch (irq) { + case 0: return CO_APIC_CPU; + case CO_IRQ_IDE0: return co_apic_ide0_hack(); + case CO_IRQ_IDE1: return CO_APIC_IDE1; + default: return -1; + } } + /* - * Set the given Cobalt APIC Redirection Table entry to point - * to the given IDT vector/index. + * This is the SGI Cobalt (IO-)APIC: */ -static void co_apic_set(int entry, int idtvec) + +static void enable_cobalt_irq(unsigned int irq) { - co_apic_write(CO_APIC_LO(entry), CO_APIC_LEVEL | (CO_IRQ_BASE+idtvec)); - co_apic_write(CO_APIC_HI(entry), 0); + co_apic_set(is_co_apic(irq), irq); +} - printk("Cobalt APIC Entry %d IDT Vector %d\n", entry, idtvec); +static void disable_cobalt_irq(unsigned int irq) +{ + int entry = is_co_apic(irq); + + co_apic_write(CO_APIC_LO(entry), CO_APIC_MASK); + co_apic_read(CO_APIC_LO(entry)); } /* * "irq" really just serves to identify the device. Here is where we * map this to the Cobalt APIC entry where it's physically wired. - * This is called via request_irq -> setup_x86_irq -> irq_desc->startup() + * This is called via request_irq -> setup_irq -> irq_desc->startup() */ -static void startup_cobalt_irq(unsigned int irq) +static unsigned int startup_cobalt_irq(unsigned int irq) { - /* - * These "irq"'s are wired to the same Cobalt APIC entries - * for all (known) motherboard types/revs - */ - switch (irq) { - case CO_IRQ_TIMER: co_apic_set(CO_APIC_CPU, CO_IRQ_TIMER); - return; + unsigned long flags; - case CO_IRQ_ENET: co_apic_set(CO_APIC_ENET, CO_IRQ_ENET); - return; + spin_lock_irqsave(&cobalt_lock, flags); + if ((irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING))) + irq_desc[irq].status &= ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING); + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); + return 0; +} - case CO_IRQ_SERIAL: return; /* XXX move to piix4-8259 "virtual" */ +static void ack_cobalt_irq(unsigned int irq) +{ + unsigned long flags; - case CO_IRQ_8259: co_apic_set(CO_APIC_8259, CO_IRQ_8259); - return; - - case CO_IRQ_IDE: - switch (visws_board_type) { - case VISWS_320: - switch (visws_board_rev) { - case 5: - co_apic_set(CO_APIC_0_5_IDE0, CO_IRQ_IDE); - co_apic_set(CO_APIC_0_5_IDE1, CO_IRQ_IDE); - return; - case 6: - co_apic_set(CO_APIC_0_6_IDE0, CO_IRQ_IDE); - co_apic_set(CO_APIC_0_6_IDE1, CO_IRQ_IDE); - return; - } - case VISWS_540: - switch (visws_board_rev) { - case 2: - co_apic_set(CO_APIC_1_2_IDE0, CO_IRQ_IDE); - return; - } - } - break; - default: - panic("huh?"); - } + spin_lock_irqsave(&cobalt_lock, flags); + disable_cobalt_irq(irq); + apic_write(APIC_EOI, APIC_EIO_ACK); + spin_unlock_irqrestore(&cobalt_lock, flags); } +static void end_cobalt_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); +} + +static struct hw_interrupt_type cobalt_irq_type = { + .typename = "Cobalt-APIC", + .startup = startup_cobalt_irq, + .shutdown = disable_cobalt_irq, + .enable = enable_cobalt_irq, + .disable = disable_cobalt_irq, + .ack = ack_cobalt_irq, + .end = end_cobalt_irq, +}; + + /* - * This is the handle() op in do_IRQ() + * This is the PIIX4-based 8259 that is wired up indirectly to Cobalt + * -- not the manner expected by the code in i8259.c. + * + * there is a 'master' physical interrupt source that gets sent to + * the CPU. But in the chipset there are various 'virtual' interrupts + * waiting to be handled. We represent this to Linux through a 'master' + * interrupt controller type, and through a special virtual interrupt- + * controller. Device drivers only see the virtual interrupt sources. */ -static void do_cobalt_IRQ(unsigned int irq, struct pt_regs * regs) +static unsigned int startup_piix4_master_irq(unsigned int irq) { - struct irqaction * action; - irq_desc_t *desc = irq_desc + irq; + init_8259A(0); - spin_lock(&irq_controller_lock); - { - unsigned int status; - /* XXX APIC EOI? */ - status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING); - action = NULL; - if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) { - action = desc->action; - status |= IRQ_INPROGRESS; - } - desc->status = status; - } - spin_unlock(&irq_controller_lock); + return startup_cobalt_irq(irq); +} - /* Exit early if we had no action or it was disabled */ - if (!action) - return; - - handle_IRQ_event(irq, regs, action); - - (void)co_cpu_read(CO_CPU_REV); /* Sync driver ack to its h/w */ - apic_write(APIC_EOI, APIC_EIO_ACK); /* Send EOI to Cobalt APIC */ - - spin_lock(&irq_controller_lock); - { - unsigned int status = desc->status & ~IRQ_INPROGRESS; - desc->status = status; - if (!(status & IRQ_DISABLED)) - enable_cobalt_irq(irq); - } - spin_unlock(&irq_controller_lock); +static void end_piix4_master_irq(unsigned int irq) +{ + unsigned long flags; + + spin_lock_irqsave(&cobalt_lock, flags); + enable_cobalt_irq(irq); + spin_unlock_irqrestore(&cobalt_lock, flags); } +static struct hw_interrupt_type piix4_master_irq_type = { + .typename = "PIIX4-master", + .startup = startup_piix4_master_irq, + .ack = ack_cobalt_irq, + .end = end_piix4_master_irq, +}; + + +static struct hw_interrupt_type piix4_virtual_irq_type = { + .typename = "PIIX4-virtual", + .startup = startup_8259A_irq, + .shutdown = disable_8259A_irq, + .enable = enable_8259A_irq, + .disable = disable_8259A_irq, +}; + + /* - * PIIX4-8259 master/virtual functions to handle: - * - * floppy - * parallel - * serial - * audio (?) + * PIIX4-8259 master/virtual functions to handle interrupt requests + * from legacy devices: floppy, parallel, serial, rtc. * * None of these get Cobalt APIC entries, neither do they have IDT * entries. These interrupts are purely virtual and distributed from @@ -250,161 +196,112 @@ * enable_irq gets the right irq. This 'master' irq is never directly * manipulated by any driver. */ - -static void startup_piix4_master_irq(unsigned int irq) +static void piix4_master_intr(int irq, void *dev_id, struct pt_regs * regs) { - /* ICW1 */ - outb(0x11, 0x20); - outb(0x11, 0xa0); + int realirq; + irq_desc_t *desc; + unsigned long flags; - /* ICW2 */ - outb(0x08, 0x21); - outb(0x70, 0xa1); + spin_lock_irqsave(&i8259A_lock, flags); - /* ICW3 */ - outb(0x04, 0x21); - outb(0x02, 0xa1); - - /* ICW4 */ - outb(0x01, 0x21); - outb(0x01, 0xa1); - - /* OCW1 - disable all interrupts in both 8259's */ - outb(0xff, 0x21); - outb(0xff, 0xa1); - - startup_cobalt_irq(irq); -} + /* Find out what's interrupting in the PIIX4 master 8259 */ + outb(0x0c, 0x20); /* OCW3 Poll command */ + realirq = inb(0x20); -static void shutdown_piix4_master_irq(unsigned int irq) -{ /* - * [we skip the 8259 magic here, not strictly necessary] + * Bit 7 == 0 means invalid/spurious */ + if (unlikely(!(realirq & 0x80))) + goto out_unlock; - shutdown_cobalt_irq(irq); -} - -static void do_piix4_master_IRQ(unsigned int irq, struct pt_regs * regs) -{ - int realirq, mask; + realirq &= 7; - /* Find out what's interrupting in the PIIX4 8259 */ + if (unlikely(realirq == 2)) { + outb(0x0c, 0xa0); + realirq = inb(0xa0); - spin_lock(&irq_controller_lock); - outb(0x0c, 0x20); /* OCW3 Poll command */ - realirq = inb(0x20); + if (unlikely(!(realirq & 0x80))) + goto out_unlock; - if (!(realirq & 0x80)) { - /* - * Bit 7 == 0 means invalid/spurious - */ - goto out_unlock; + realirq = (realirq & 7) + 8; } - realirq &= 0x7f; - /* - * mask and ack the 8259 - */ - mask = inb(0x21); - if ((mask >> realirq) & 0x01) - /* - * This IRQ is masked... ignore - */ - goto out_unlock; + /* mask and ack interrupt */ + cached_irq_mask |= 1 << realirq; + if (unlikely(realirq > 7)) { + inb(0xa1); + outb(cached_A1, 0xa1); + outb(0x60 + (realirq & 7), 0xa0); + outb(0x60 + 2, 0x20); + } else { + inb(0x21); + outb(cached_21, 0x21); + outb(0x60 + realirq, 0x20); + } - outb(mask | (1<action != NULL)) + handle_IRQ_event(realirq, regs, desc->action); + + if (!(desc->status & IRQ_DISABLED)) + enable_8259A_irq(realirq); - if (!(desc->status & IRQ_DISABLED)) - enable_piix4_virtual_irq(realirq); - } - spin_unlock(&irq_controller_lock); return; out_unlock: - spin_unlock(&irq_controller_lock); + spin_unlock_irqrestore(&i8259A_lock, flags); return; } -static void enable_piix4_virtual_irq(unsigned int irq) -{ - /* - * assumes this irq is one of the legacy devices - */ - - unsigned int mask = inb(0x21); - mask &= ~(1 << irq); - outb(mask, 0x21); - enable_cobalt_irq(irq); -} - -/* - * assumes this irq is one of the legacy devices - */ -static void disable_piix4_virtual_irq(unsigned int irq) -{ - unsigned int mask; - - disable_cobalt_irq(irq); +static struct irqaction master_action = { + .handler = piix4_master_intr, + .name = "PIIX4-8259", +}; - mask = inb(0x21); - mask &= ~(1 << irq); - outb(mask, 0x21); -} +static struct irqaction cascade_action = { + .handler = no_action, + .name = "cascade", +}; -static struct irqaction master_action = - { no_action, 0, 0, "PIIX4-8259", NULL, NULL }; void init_VISWS_APIC_irqs(void) { int i; - for (i = 0; i < 16; i++) { + for (i = 0; i < CO_IRQ_APIC0 + CO_APIC_LAST + 1; i++) { irq_desc[i].status = IRQ_DISABLED; irq_desc[i].action = 0; irq_desc[i].depth = 1; - /* - * Cobalt IRQs are mapped to standard ISA - * interrupt vectors: - */ - switch (i) { - /* - * Only CO_IRQ_8259 will be raised - * externally. - */ - case CO_IRQ_8259: + if (i == 0) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_IDE0) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_IDE1) { + irq_desc[i].handler = &cobalt_irq_type; + } + else if (i == CO_IRQ_8259) { irq_desc[i].handler = &piix4_master_irq_type; - break; - case CO_IRQ_FLOPPY: - case CO_IRQ_PARLL: + } + else if (i < CO_IRQ_APIC0) { irq_desc[i].handler = &piix4_virtual_irq_type; - break; - default: + } + else if (IS_CO_APIC(i)) { irq_desc[i].handler = &cobalt_irq_type; - break; } + irq_vector[i] = i + FIRST_EXTERNAL_VECTOR; } - /* - * The master interrupt is always present: - */ - setup_x86_irq(CO_IRQ_8259, &master_action); + setup_irq(CO_IRQ_8259, &master_action); + setup_irq(2, &cascade_action); } - diff -Nru a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c --- a/arch/i386/mach-voyager/voyager_smp.c Thu Feb 20 23:19:21 2003 +++ b/arch/i386/mach-voyager/voyager_smp.c Thu Feb 20 23:19:21 2003 @@ -234,9 +234,9 @@ static __u32 trampoline_base; /* The per cpu profile stuff - used in smp_local_timer_interrupt */ -static unsigned int prof_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; -static unsigned int prof_old_multiplier[NR_CPUS] __cacheline_aligned = { 1, }; -static DEFINE_PER_CPU(unsigned int, prof_counter) = 1; +static DEFINE_PER_CPU(int, prof_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_old_multiplier) = 1; +static DEFINE_PER_CPU(int, prof_counter) = 1; /* the map used to check if a CPU has booted */ static __u32 cpu_booted_map; @@ -1318,10 +1318,12 @@ * * Interrupts are already masked off at this point. */ - per_cpu(prof_counter,cpu) = prof_multiplier[cpu]; - if (per_cpu(prof_counter, cpu) != prof_old_multiplier[cpu]) { + per_cpu(prof_counter,cpu) = per_cpu(prof_multiplier, cpu); + if (per_cpu(prof_counter, cpu) != + per_cpu(prof_old_multiplier, cpu)) { /* FIXME: need to update the vic timer tick here */ - prof_old_multiplier[cpu] = per_cpu(prof_counter, cpu); + per_cpu(prof_old_multiplier, cpu) = + per_cpu(prof_counter, cpu); } update_process_times(user_mode(regs)); @@ -1406,7 +1408,7 @@ * accounting. */ for (i = 0; i < NR_CPUS; ++i) - prof_multiplier[i] = multiplier; + per_cpu(prof_multiplier, i) = multiplier; return 0; } diff -Nru a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c --- a/arch/i386/mm/hugetlbpage.c Thu Feb 20 23:19:23 2003 +++ b/arch/i386/mm/hugetlbpage.c Thu Feb 20 23:19:23 2003 @@ -71,8 +71,6 @@ return (pte_t *) pmd; } -#define mk_pte_huge(entry) {entry.pte_low |= (_PAGE_PRESENT | _PAGE_PSE);} - static void set_huge_pte(struct mm_struct *mm, struct vm_area_struct *vma, struct page *page, pte_t * page_table, int write_access) { pte_t entry; diff -Nru a/arch/i386/pci/Makefile b/arch/i386/pci/Makefile --- a/arch/i386/pci/Makefile Thu Feb 20 23:19:22 2003 +++ b/arch/i386/pci/Makefile Thu Feb 20 23:19:22 2003 @@ -3,6 +3,8 @@ obj-$(CONFIG_PCI_BIOS) += pcbios.o obj-$(CONFIG_PCI_DIRECT) += direct.o +obj-$(CONFIG_X86_VISWS) += visws.o + ifdef CONFIG_X86_NUMAQ obj-y += numa.o else @@ -11,8 +13,15 @@ ifdef CONFIG_ACPI_PCI obj-y += acpi.o endif -obj-y += legacy.o +ifndef CONFIG_X86_VISWS +obj-y += legacy.o +endif endif # CONFIG_X86_NUMAQ -obj-y += irq.o common.o + +ifndef CONFIG_X86_VISWS +obj-y += irq.o +endif + +obj-y += common.o diff -Nru a/arch/i386/pci/common.c b/arch/i386/pci/common.c --- a/arch/i386/pci/common.c Thu Feb 20 23:19:21 2003 +++ b/arch/i386/pci/common.c Thu Feb 20 23:19:21 2003 @@ -180,13 +180,8 @@ return NULL; } #endif - else if (!strcmp(str, "rom")) { - pci_probe |= PCI_ASSIGN_ROMS; - return NULL; - } else if (!strcmp(str, "assign-busses")) { - pci_probe |= PCI_ASSIGN_ALL_BUSSES; - return NULL; - } else if (!strcmp(str, "usepirqmask")) { +#ifndef CONFIG_X86_VISWS + else if (!strcmp(str, "usepirqmask")) { pci_probe |= PCI_USE_PIRQ_MASK; return NULL; } else if (!strncmp(str, "irqmask=", 8)) { @@ -194,6 +189,14 @@ return NULL; } else if (!strncmp(str, "lastbus=", 8)) { pcibios_last_bus = simple_strtol(str+8, NULL, 0); + return NULL; + } +#endif + else if (!strcmp(str, "rom")) { + pci_probe |= PCI_ASSIGN_ROMS; + return NULL; + } else if (!strcmp(str, "assign-busses")) { + pci_probe |= PCI_ASSIGN_ALL_BUSSES; return NULL; } return str; diff -Nru a/arch/i386/pci/direct.c b/arch/i386/pci/direct.c --- a/arch/i386/pci/direct.c Thu Feb 20 23:19:20 2003 +++ b/arch/i386/pci/direct.c Thu Feb 20 23:19:20 2003 @@ -83,7 +83,7 @@ PCI_FUNC(devfn), where, size, value); } -static struct pci_ops pci_direct_conf1 = { +struct pci_ops pci_direct_conf1 = { .read = pci_conf1_read, .write = pci_conf1_write, }; diff -Nru a/arch/i386/pci/visws.c b/arch/i386/pci/visws.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/pci/visws.c Thu Feb 20 23:19:23 2003 @@ -0,0 +1,111 @@ +/* + * Low-Level PCI Support for SGI Visual Workstation + * + * (c) 1999--2000 Martin Mares + */ + +#include +#include +#include +#include + +#include "cobalt.h" +#include "lithium.h" + +#include "pci.h" + + +int broken_hp_bios_irq9; + +extern struct pci_ops pci_direct_conf1; + +static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; } + +int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq; + +void __init pcibios_penalize_isa_irq(int irq) {} + + +unsigned int pci_bus0, pci_bus1; + +static inline u8 bridge_swizzle(u8 pin, u8 slot) +{ + return (((pin - 1) + slot) % 4) + 1; +} + +static u8 __init visws_swizzle(struct pci_dev *dev, u8 *pinp) +{ + u8 pin = *pinp; + + while (dev->bus->self) { /* Move up the chain of bridges. */ + pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)); + dev = dev->bus->self; + } + *pinp = pin; + + return PCI_SLOT(dev->devfn); +} + +static int __init visws_map_irq(struct pci_dev *dev, u8 slot, u8 pin) +{ + int irq, bus = dev->bus->number; + + pin--; + + /* Nothing usefull at PIIX4 pin 1 */ + if (bus == pci_bus0 && slot == 4 && pin == 0) + return -1; + + /* PIIX4 USB is on Bus 0, Slot 4, Line 3 */ + if (bus == pci_bus0 && slot == 4 && pin == 3) { + irq = CO_IRQ(CO_APIC_PIIX4_USB); + goto out; + } + + /* First pin spread down 1 APIC entry per slot */ + if (pin == 0) { + irq = CO_IRQ((bus == pci_bus0 ? CO_APIC_PCIB_BASE0 : + CO_APIC_PCIA_BASE0) + slot); + goto out; + } + + /* lines 1,2,3 from any slot is shared in this twirly pattern */ + if (bus == pci_bus1) { + /* lines 1-3 from devices 0 1 rotate over 2 apic entries */ + irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((slot + (pin - 1)) % 2)); + } else { /* bus == pci_bus0 */ + /* lines 1-3 from devices 0-3 rotate over 3 apic entries */ + if (slot == 0) + slot = 3; /* same pattern */ + irq = CO_IRQ(CO_APIC_PCIA_BASE123 + ((3 - slot) + (pin - 1) % 3)); + } +out: + printk(KERN_DEBUG "PCI: Bus %d Slot %d Line %d -> IRQ %d\n", bus, slot, pin, irq); + return irq; +} + +void __init pcibios_update_irq(struct pci_dev *dev, int irq) +{ + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); +} + +static int __init pcibios_init(void) +{ + /* The VISWS supports configuration access type 1 only */ + pci_probe = (pci_probe | PCI_PROBE_CONF1) & + ~(PCI_PROBE_BIOS | PCI_PROBE_CONF2); + + pci_bus0 = li_pcib_read16(LI_PCI_BUSNUM) & 0xff; + pci_bus1 = li_pcia_read16(LI_PCI_BUSNUM) & 0xff; + + printk(KERN_INFO "PCI: Lithium bridge A bus: %u, " + "bridge B (PIIX4) bus: %u\n", pci_bus1, pci_bus0); + + pci_scan_bus(pci_bus0, &pci_direct_conf1, NULL); + pci_scan_bus(pci_bus1, &pci_direct_conf1, NULL); + pci_fixup_irqs(visws_swizzle, visws_map_irq); + pcibios_resource_survey(); + return 0; +} + +subsys_initcall(pcibios_init); diff -Nru a/arch/i386/vmlinux.lds.S b/arch/i386/vmlinux.lds.S --- a/arch/i386/vmlinux.lds.S Thu Feb 20 23:19:20 2003 +++ b/arch/i386/vmlinux.lds.S Thu Feb 20 23:19:20 2003 @@ -6,7 +6,7 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) -ENTRY(_start) +ENTRY(startup_32) jiffies = jiffies_64; SECTIONS { diff -Nru a/arch/ia64/hp/sim/simeth.c b/arch/ia64/hp/sim/simeth.c --- a/arch/ia64/hp/sim/simeth.c Thu Feb 20 23:19:22 2003 +++ b/arch/ia64/hp/sim/simeth.c Thu Feb 20 23:19:22 2003 @@ -149,7 +149,7 @@ static inline int netdev_attach(int fd, int irq, unsigned int ipaddr) { - /* this puts the host interface in the right mode (start interupting) */ + /* this puts the host interface in the right mode (start interrupting) */ return ia64_ssc(fd, ipaddr, 0,0, SSC_NETDEV_ATTACH); } diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c --- a/arch/ia64/ia32/sys_ia32.c Thu Feb 20 23:19:22 2003 +++ b/arch/ia64/ia32/sys_ia32.c Thu Feb 20 23:19:22 2003 @@ -4063,7 +4063,7 @@ return err; } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; diff -Nru a/arch/ia64/sn/io/l1.c b/arch/ia64/sn/io/l1.c --- a/arch/ia64/sn/io/l1.c Thu Feb 20 23:19:23 2003 +++ b/arch/ia64/sn/io/l1.c Thu Feb 20 23:19:23 2003 @@ -2734,7 +2734,7 @@ * bigger. * * Be careful using the same buffer for both cmd and resp; it could get - * hairy if there were ever an L1 command reqeuest that spanned multiple + * hairy if there were ever an L1 command request that spanned multiple * packets. (On the other hand, that would require some additional * rewriting of the L1 command interface anyway.) */ diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c Thu Feb 20 23:19:24 2003 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c Thu Feb 20 23:19:24 2003 @@ -3505,7 +3505,7 @@ } else xio_port = pcibr_dmamap->bd_xio_port; - /* If this DMA is to an addres that + /* If this DMA is to an address that * refers back to this Bridge chip, * reduce it back to the correct * PCI MEM address. diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c Thu Feb 20 23:19:19 2003 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c Thu Feb 20 23:19:19 2003 @@ -1874,7 +1874,7 @@ BRIDGE_ERRUPPR_ADDRMASK) << 32))); /* - * need to ensure that the xtalk adress in ioe + * need to ensure that the xtalk address in ioe * maps to PCI error address read from bridge. * How to convert PCI address back to Xtalk address ? * (better idea: convert XTalk address to PCI address diff -Nru a/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c b/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c --- a/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c Thu Feb 20 23:19:24 2003 +++ b/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c Thu Feb 20 23:19:24 2003 @@ -272,7 +272,7 @@ * the old do_pcibr_rrb_free() code only clears the enable bit * but I say we should clear the whole rrb (ie): * reg = reg & ~(RRB_MASK << (RRB_SIZE * rrb_index)); - * But to be compatable with old code we'll only clear enable. + * But to be compatible with old code we'll only clear enable. */ reg = reg & ~(RRB_ENABLE_BIT(bridge) << (RRB_SIZE * rrb_index)); clr = clr | (enable_bit << (RRB_SIZE * rrb_index)); diff -Nru a/arch/ia64/sn/io/xbow.c b/arch/ia64/sn/io/xbow.c --- a/arch/ia64/sn/io/xbow.c Thu Feb 20 23:19:19 2003 +++ b/arch/ia64/sn/io/xbow.c Thu Feb 20 23:19:19 2003 @@ -305,7 +305,7 @@ /* * get the name of this xbow vertex and keep the info. - * This is needed during errors and interupts, but as + * This is needed during errors and interrupts, but as * long as we have it, we can use it elsewhere. */ s = dev_to_name(vhdl, devnm, MAXDEVNAME); diff -Nru a/arch/ia64/sn/io/xtalk.c b/arch/ia64/sn/io/xtalk.c --- a/arch/ia64/sn/io/xtalk.c Thu Feb 20 23:19:20 2003 +++ b/arch/ia64/sn/io/xtalk.c Thu Feb 20 23:19:20 2003 @@ -890,7 +890,7 @@ widget_info->w_einfo = 0; /* * get the name of this xwidget vertex and keep the info. - * This is needed during errors and interupts, but as + * This is needed during errors and interrupts, but as * long as we have it, we can use it elsewhere. */ s = dev_to_name(widget,devnm,MAXDEVNAME); diff -Nru a/arch/m68k/ifpsp060/src/fpsp.S b/arch/m68k/ifpsp060/src/fpsp.S --- a/arch/m68k/ifpsp060/src/fpsp.S Thu Feb 20 23:19:23 2003 +++ b/arch/m68k/ifpsp060/src/fpsp.S Thu Feb 20 23:19:24 2003 @@ -22147,7 +22147,7 @@ add_ext: addq.l &1,FTEMP_LO(%a0) # add 1 to l-bit bcc.b xcc_clr # test for carry out - addq.l &1,FTEMP_HI(%a0) # propogate carry + addq.l &1,FTEMP_HI(%a0) # propagate carry bcc.b xcc_clr roxr.w FTEMP_HI(%a0) # mant is 0 so restore v-bit roxr.w FTEMP_HI+2(%a0) # mant is 0 so restore v-bit @@ -22167,7 +22167,7 @@ add_dbl: add.l &ad_1_dbl, FTEMP_LO(%a0) # add 1 to lsb bcc.b dcc_clr # no carry - addq.l &0x1, FTEMP_HI(%a0) # propogate carry + addq.l &0x1, FTEMP_HI(%a0) # propagate carry bcc.b dcc_clr # no carry roxr.w FTEMP_HI(%a0) # mant is 0 so restore v-bit diff -Nru a/arch/m68k/ifpsp060/src/isp.S b/arch/m68k/ifpsp060/src/isp.S --- a/arch/m68k/ifpsp060/src/isp.S Thu Feb 20 23:19:20 2003 +++ b/arch/m68k/ifpsp060/src/isp.S Thu Feb 20 23:19:20 2003 @@ -2625,7 +2625,7 @@ addx.l %d7, %d4 # add carry to hi(result) # the result is saved to the register file. -# for '040 compatability, if Dl == Dh then only the hi(result) is +# for '040 compatibility, if Dl == Dh then only the hi(result) is # saved. so, saving hi after lo accomplishes this without need to # check Dl,Dh equality. mul64_done: diff -Nru a/arch/m68k/ifpsp060/src/pfpsp.S b/arch/m68k/ifpsp060/src/pfpsp.S --- a/arch/m68k/ifpsp060/src/pfpsp.S Thu Feb 20 23:19:19 2003 +++ b/arch/m68k/ifpsp060/src/pfpsp.S Thu Feb 20 23:19:19 2003 @@ -6269,7 +6269,7 @@ add_ext: addq.l &1,FTEMP_LO(%a0) # add 1 to l-bit bcc.b xcc_clr # test for carry out - addq.l &1,FTEMP_HI(%a0) # propogate carry + addq.l &1,FTEMP_HI(%a0) # propagate carry bcc.b xcc_clr roxr.w FTEMP_HI(%a0) # mant is 0 so restore v-bit roxr.w FTEMP_HI+2(%a0) # mant is 0 so restore v-bit @@ -6289,7 +6289,7 @@ add_dbl: add.l &ad_1_dbl, FTEMP_LO(%a0) # add 1 to lsb bcc.b dcc_clr # no carry - addq.l &0x1, FTEMP_HI(%a0) # propogate carry + addq.l &0x1, FTEMP_HI(%a0) # propagate carry bcc.b dcc_clr # no carry roxr.w FTEMP_HI(%a0) # mant is 0 so restore v-bit diff -Nru a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S --- a/arch/m68k/kernel/head.S Thu Feb 20 23:19:24 2003 +++ b/arch/m68k/kernel/head.S Thu Feb 20 23:19:24 2003 @@ -92,7 +92,7 @@ * mmu_map was written for two key reasons. First, it was clear * that it was very difficult to read the previous code for mapping * regions of memory. Second, the Macintosh required such extensive - * memory allocations that it didn't make sense to propogate the + * memory allocations that it didn't make sense to propagate the * existing code any further. * mmu_map requires some parameters: * diff -Nru a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig --- a/arch/m68knommu/Kconfig Thu Feb 20 23:19:22 2003 +++ b/arch/m68knommu/Kconfig Thu Feb 20 23:19:22 2003 @@ -379,11 +379,6 @@ help Set RAM size to be 4MiB. -config RAM4MB - bool "4MiB" - help - Set RAM size to be 4MiB. - config RAM8MB bool "8MiB" help diff -Nru a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c --- a/arch/m68knommu/kernel/init_task.c Thu Feb 20 23:19:20 2003 +++ b/arch/m68knommu/kernel/init_task.c Thu Feb 20 23:19:20 2003 @@ -13,6 +13,7 @@ static struct fs_struct init_fs = INIT_FS; static struct files_struct init_files = INIT_FILES; static struct signal_struct init_signals = INIT_SIGNALS(init_signals); +static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); /* diff -Nru a/arch/m68knommu/kernel/signal.c b/arch/m68knommu/kernel/signal.c --- a/arch/m68knommu/kernel/signal.c Thu Feb 20 23:19:22 2003 +++ b/arch/m68knommu/kernel/signal.c Thu Feb 20 23:19:22 2003 @@ -783,7 +783,7 @@ /* Restart the system call the same way as if the process were not traced. */ struct k_sigaction *ka = - ¤t->sig->action[signr-1]; + ¤t->sighand->action[signr-1]; int has_handler = (ka->sa.sa_handler != SIG_IGN && ka->sa.sa_handler != SIG_DFL); @@ -819,7 +819,7 @@ } } - ka = ¤t->sig->action[signr-1]; + ka = ¤t->sighand->action[signr-1]; if (ka->sa.sa_handler == SIG_IGN) { if (signr != SIGCHLD) continue; @@ -848,8 +848,7 @@ case SIGSTOP: current->state = TASK_STOPPED; current->exit_code = signr; - if (!(current->parent->sig->action[SIGCHLD-1] - .sa.sa_flags & SA_NOCLDSTOP)) + if (!(current->parent->sighand->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP)) notify_parent(current, SIGCHLD); schedule(); continue; diff -Nru a/arch/m68knommu/mm/Makefile b/arch/m68knommu/mm/Makefile --- a/arch/m68knommu/mm/Makefile Thu Feb 20 23:19:24 2003 +++ b/arch/m68knommu/mm/Makefile Thu Feb 20 23:19:24 2003 @@ -2,4 +2,4 @@ # Makefile for the linux m68knommu specific parts of the memory manager. # -obj-y += init.o fault.o memory.o kmap.o +obj-y += init.o fault.o memory.o kmap.o extable.o diff -Nru a/arch/m68knommu/mm/extable.c b/arch/m68knommu/mm/extable.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/m68knommu/mm/extable.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,30 @@ +/* + * linux/arch/m68knommu/mm/extable.c + */ + +#include +#include +#include +#include + +/* Simple binary search */ +const struct exception_table_entry * +search_extable(const struct exception_table_entry *first, + const struct exception_table_entry *last, + unsigned long value) +{ + while (first <= last) { + const struct exception_table_entry *mid; + long diff; + + mid = (last - first) / 2 + first; + diff = mid->insn - value; + if (diff == 0) + return mid; + else if (diff < 0) + first = mid+1; + else + last = mid-1; + } + return NULL; +} diff -Nru a/arch/m68knommu/platform/5307/vectors.c b/arch/m68knommu/platform/5307/vectors.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/m68knommu/platform/5307/vectors.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,94 @@ +/***************************************************************************/ + +/* + * linux/arch/m68knommu/platform/5307/vectors.c + * + * Copyright (C) 1999-2003, Greg Ungerer + */ + +/***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/***************************************************************************/ + +#ifdef TRAP_DBG_INTERRUPT + +asmlinkage void dbginterrupt_c(struct frame *fp) +{ + extern void dump(struct pt_regs *fp); + printk("%s(%d): BUS ERROR TRAP\n", __FILE__, __LINE__); + dump((struct pt_regs *) fp); + asm("halt"); +} + +#endif + +/***************************************************************************/ + +extern e_vector *_ramvec; + +void set_evector(int vecnum, void (*handler)(void)) +{ + if (vecnum >= 0 && vecnum <= 255) + _ramvec[vecnum] = handler; +} + +/***************************************************************************/ + +/* Assembler routines */ +asmlinkage void buserr(void); +asmlinkage void trap(void); +asmlinkage void system_call(void); +asmlinkage void inthandler(void); + +void __init coldfire_trap_init(void) +{ + int i; + + /* + * There is a common trap handler and common interrupt + * handler that handle almost every vector. We treat + * the system call and bus error special, they get their + * own first level handlers. + */ + for (i = 3; (i <= 23); i++) + _ramvec[i] = trap; + for (i = 33; (i <= 63); i++) + _ramvec[i] = trap; + for (i = 24; (i <= 31); i++) + _ramvec[i] = inthandler; + for (i = 64; (i < 255); i++) + _ramvec[i] = inthandler; + _ramvec[255] = 0; + + _ramvec[2] = buserr; + _ramvec[32] = system_call; + +#ifdef TRAP_DBG_INTERRUPT + _ramvec[12] = dbginterrupt; +#endif +} + +/***************************************************************************/ + +void coldfire_reset(void) +{ + HARD_RESET_NOW(); +} + +/***************************************************************************/ diff -Nru a/arch/m68knommu/platform/68328/entry.S b/arch/m68knommu/platform/68328/entry.S --- a/arch/m68knommu/platform/68328/entry.S Thu Feb 20 23:19:19 2003 +++ b/arch/m68knommu/platform/68328/entry.S Thu Feb 20 23:19:19 2003 @@ -95,7 +95,7 @@ Luser_return: /* only allow interrupts when we are really the last one on the*/ /* kernel stack, otherwise stack overflow can occur during*/ - /* heavy interupt load*/ + /* heavy interrupt load*/ andw #ALLOWINT,%sr movel %sp,%d1 /* get thread_info pointer */ diff -Nru a/arch/m68knommu/platform/68328/pilot/crt0_rom.S b/arch/m68knommu/platform/68328/pilot/crt0_rom.S --- a/arch/m68knommu/platform/68328/pilot/crt0_rom.S Thu Feb 20 23:19:23 2003 +++ b/arch/m68knommu/platform/68328/pilot/crt0_rom.S Thu Feb 20 23:19:23 2003 @@ -1,4 +1,6 @@ -/* linux/arch/m68knommu/kernel/head.S: A startup file for the MC68332 +/* + * linux/arch/m68knommu/platform/68328/pilot/crt0_rom.S + * - A startup file for the MC68332 * * Copyright (C) 1998 D. Jeff Dionne , * Kenneth Albanowski , @@ -16,8 +18,6 @@ #include .global _stext -.global __bss_start - .global _start .global _rambase @@ -81,30 +81,28 @@ movew #0x0800, 0xfffff906 /* Ignore CTS */ movew #0x010b, 0xfffff902 /* BAUD to 9600 */ - movew #0x2410, 0xfffff200 /* PLLCR */ - movew #0x123, 0xfffff202 /* PLLFSR */ + movew #0x2410, 0xfffff200 /* PLLCR */ + movew #0x123, 0xfffff202 /* PLLFSR */ #ifdef CONFIG_PILOT - moveb #0, 0xfffffA27 /* LCKCON */ + moveb #0, 0xfffffA27 /* LCKCON */ movel #_start, 0xfffffA00 /* LSSA */ - moveb #0xa, 0xfffffA05 /* LVPW */ - movew #0x9f, 0xFFFFFa08 /* LXMAX */ - movew #0x9f, 0xFFFFFa0a /* LYMAX */ - moveb #9, 0xfffffa29 /* LBAR */ - moveb #0, 0xfffffa25 /* LPXCD */ - moveb #0x04, 0xFFFFFa20 /* LPICF */ - moveb #0x58, 0xfffffA27 /* LCKCON */ - moveb #0x85, 0xfffff429 /* PFDATA */ - moveb #0xd8, 0xfffffA27 /* LCKCON */ - moveb #0xc5, 0xfffff429 /* PFDATA */ - moveb #0xd5, 0xfffff429 /* PFDATA */ + moveb #0xa, 0xfffffA05 /* LVPW */ + movew #0x9f, 0xFFFFFa08 /* LXMAX */ + movew #0x9f, 0xFFFFFa0a /* LYMAX */ + moveb #9, 0xfffffa29 /* LBAR */ + moveb #0, 0xfffffa25 /* LPXCD */ + moveb #0x04, 0xFFFFFa20 /* LPICF */ + moveb #0x58, 0xfffffA27 /* LCKCON */ + moveb #0x85, 0xfffff429 /* PFDATA */ + moveb #0xd8, 0xfffffA27 /* LCKCON */ + moveb #0xc5, 0xfffff429 /* PFDATA */ + moveb #0xd5, 0xfffff429 /* PFDATA */ moveal #0x00100000, %a3 moveal #0x100ffc00, %a4 - #endif /* CONFIG_PILOT */ - #endif /* CONFIG_M68328 */ movew #0x2700, %sr @@ -126,7 +124,7 @@ movel #__ramvec, %d7 addl #16, %d7 moveal %d7, %a0 - moveal #end, %a1 + moveal #_ebss, %a1 lea %a1@(512), %a2 DBG_PUTC('C') @@ -139,9 +137,9 @@ bhi L2 /* Copy data segment from ROM to RAM */ - moveal #__data_rom_start, %a0 - moveal #__data_start, %a1 - moveal #__data_end, %a2 + moveal #_etext, %a0 + moveal #_sdata, %a1 + moveal #_edata, %a2 DBG_PUTC('D') @@ -154,8 +152,8 @@ DBG_PUTC('E') - moveal #__bss_start, %a0 - moveal #end, %a1 + moveal #_sbss, %a0 + moveal #_ebss, %a1 /* Copy 0 to %a0 until %a0 == %a1 */ L1: @@ -166,7 +164,7 @@ DBG_PUTC('F') /* Copy command line from end of bss to command line */ - moveal #end, %a0 + moveal #_ebss, %a0 moveal #command_line, %a1 lea %a1@(512), %a2 @@ -180,17 +178,17 @@ bhi L3 movel #_sdata, %d0 - movel %d0, _rambase - movel #end, %d0 - movel %d0, _ramstart + movel %d0, _rambase + movel #_ebss, %d0 + movel %d0, _ramstart - movel %a4, %d0 - subl #4096, %d0 /* Reserve 4K of stack */ + movel %a4, %d0 + subl #4096, %d0 /* Reserve 4K of stack */ moveq #79, %d7 - movel %d0, _ramend + movel %d0, _ramend - movel %a3, %d0 - movel %d0, rom_length + movel %a3, %d0 + movel %d0, rom_length pea 0 pea env @@ -200,12 +198,10 @@ DBG_PUTC('H') #ifdef CONFIG_PILOT - - movel #penguin_bits, 0xFFFFFA00 - moveb #10, 0xFFFFFA05 - movew #160, 0xFFFFFA08 - movew #160, 0xFFFFFA0A - + movel #penguin_bits, 0xFFFFFA00 + moveb #10, 0xFFFFFA05 + movew #160, 0xFFFFFA08 + movew #160, 0xFFFFFA0A #endif /* CONFIG_PILOT */ DBG_PUTC('I') diff -Nru a/arch/m68knommu/platform/68360/commproc.c b/arch/m68knommu/platform/68360/commproc.c --- a/arch/m68knommu/platform/68360/commproc.c Thu Feb 20 23:19:23 2003 +++ b/arch/m68knommu/platform/68360/commproc.c Thu Feb 20 23:19:23 2003 @@ -90,7 +90,7 @@ while (pquicc->cp_cr & CMD_FLAG); /* On the recommendation of the 68360 manual, p. 7-60 - * - Set sdma interupt service mask to 7 + * - Set sdma interrupt service mask to 7 * - Set sdma arbitration ID to 4 */ pquicc->sdma_sdcr = 0x0740; diff -Nru a/arch/m68knommu/platform/68360/entry.S b/arch/m68knommu/platform/68360/entry.S --- a/arch/m68knommu/platform/68360/entry.S Thu Feb 20 23:19:22 2003 +++ b/arch/m68knommu/platform/68360/entry.S Thu Feb 20 23:19:22 2003 @@ -91,7 +91,7 @@ Luser_return: /* only allow interrupts when we are really the last one on the*/ /* kernel stack, otherwise stack overflow can occur during*/ - /* heavy interupt load*/ + /* heavy interrupt load*/ andw #ALLOWINT,%sr movel %sp,%d1 /* get thread_info pointer */ diff -Nru a/arch/m68knommu/platform/68360/uCquicc/crt0_ram.S b/arch/m68knommu/platform/68360/uCquicc/crt0_ram.S --- a/arch/m68knommu/platform/68360/uCquicc/crt0_ram.S Thu Feb 20 23:19:24 2003 +++ b/arch/m68knommu/platform/68360/uCquicc/crt0_ram.S Thu Feb 20 23:19:24 2003 @@ -15,7 +15,6 @@ #include .global _stext -.global __bss_start .global _start .global _rambase @@ -26,7 +25,6 @@ .global _quicc_base .global _periph_base -.global _dprbase #define REGB 0x1000 #define PEPAR (_dprbase + REGB + 0x0016) @@ -94,63 +92,62 @@ #include -/* By the time this RAM specific code begins to execute, DPRAM - * and DRAM should already be mapped and accessible. */ +/* + * By the time this RAM specific code begins to execute, DPRAM + * and DRAM should already be mapped and accessible. + */ .text _start: _stext: - nop - ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */ - /* We should not need to setup the boot stack the reset should do it. */ - movea.l #_boot_stack, %sp /*set up stack at the end of DRAM:*/ - + nop + ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */ + /* We should not need to setup the boot stack the reset should do it. */ + movea.l #__ramend, %sp /*set up stack at the end of DRAM:*/ set_mbar_register: - moveq.l #0x07, %d1 /* Setup MBAR */ - movec %d1, %dfc + moveq.l #0x07, %d1 /* Setup MBAR */ + movec %d1, %dfc - lea.l MCU_SIM_MBAR_ADRS, %a0 - move.l #_dprbase, %d0 - andi.l #MCU_SIM_MBAR_BA_MASK, %d0 - ori.l #MCU_SIM_MBAR_AS_MASK, %d0 - moves.l %d0, %a0@ + lea.l MCU_SIM_MBAR_ADRS, %a0 + move.l #_dprbase, %d0 + andi.l #MCU_SIM_MBAR_BA_MASK, %d0 + ori.l #MCU_SIM_MBAR_AS_MASK, %d0 + moves.l %d0, %a0@ - moveq.l #0x05, %d1 - movec.l %d1, %dfc + moveq.l #0x05, %d1 + movec.l %d1, %dfc -/* Now we can begin to access registers in DPRAM */ + /* Now we can begin to access registers in DPRAM */ set_sim_mcr: - /* Set Module Configuration Register */ - move.l #MCU_SIM_MCR, MCR - -/* to do: Determine cause of reset */ + /* Set Module Configuration Register */ + move.l #MCU_SIM_MCR, MCR + /* to do: Determine cause of reset */ - /* - * configure system clock MC68360 p. 6-40 - * (value +1)*osc/128 = system clock - */ + /* + * configure system clock MC68360 p. 6-40 + * (value +1)*osc/128 = system clock + */ set_sim_clock: - move.w #MCU_SIM_PLLCR, PLLCR - move.b #MCU_SIM_CLKOCR, CLKOCR - move.w #MCU_SIM_CDVCR, CDVCR + move.w #MCU_SIM_PLLCR, PLLCR + move.b #MCU_SIM_CLKOCR, CLKOCR + move.w #MCU_SIM_CDVCR, CDVCR - // Wait for the PLL to settle - move.w #16384, %d0 + /* Wait for the PLL to settle */ + move.w #16384, %d0 pll_settle_wait: - subi.w #1, %d0 - bne pll_settle_wait + subi.w #1, %d0 + bne pll_settle_wait - /* Setup the system protection register, and watchdog timer register */ + /* Setup the system protection register, and watchdog timer register */ + move.b #MCU_SIM_SWIV, SWIV + move.w #MCU_SIM_PICR, PICR + move.w #MCU_SIM_PITR, PITR + move.w #MCU_SIM_SYPCR, SYPCR - move.b #MCU_SIM_SWIV, SWIV - move.w #MCU_SIM_PICR, PICR - move.w #MCU_SIM_PITR, PITR - move.w #MCU_SIM_SYPCR, SYPCR - -/* Clear DPRAM - system + parameter */ + /* Clear DPRAM - system + parameter */ movea.l #_dprbase, %a0 movea.l #_dprbase+0x2000, %a1 @@ -161,72 +158,68 @@ bhi clear_dpram configure_memory_controller: - /* - * Set up Global Memory Register (GMR) - */ - move.l #MCU_SIM_GMR, %d0 - move.l %d0, GMR + /* Set up Global Memory Register (GMR) */ + move.l #MCU_SIM_GMR, %d0 + move.l %d0, GMR configure_chip_select_0: - move.l #__ramend, %d0 - subi.l #__ramstart, %d0 - subq.l #0x01, %d0 - eori.l #SIM_OR_MASK, %d0 - ori.l #SIM_OR0_MASK, %d0 - move.l %d0, OR0 - - move.l #__ramstart, %d0 - ori.l #SIM_BR0_MASK, %d0 - move.l %d0, BR0 - + move.l #__ramend, %d0 + subi.l #__ramstart, %d0 + subq.l #0x01, %d0 + eori.l #SIM_OR_MASK, %d0 + ori.l #SIM_OR0_MASK, %d0 + move.l %d0, OR0 + + move.l #__ramstart, %d0 + ori.l #SIM_BR0_MASK, %d0 + move.l %d0, BR0 configure_chip_select_1: - move.l #__flashend, %d0 - subi.l #__flashstart, %d0 - subq.l #0x01, %d0 - eori.l #SIM_OR_MASK, %d0 - ori.l #SIM_OR1_MASK, %d0 - move.l %d0, OR1 - - move.l #__flashstart, %d0 - ori.l #SIM_BR1_MASK, %d0 - move.l %d0, BR1 - - - move.w #MCU_SIM_PEPAR, PEPAR - -/* point to vector table: */ - move.l #_romvec, %a0 - move.l #_ramvec, %a1 + move.l #__rom_end, %d0 + subi.l #__rom_start, %d0 + subq.l #0x01, %d0 + eori.l #SIM_OR_MASK, %d0 + ori.l #SIM_OR1_MASK, %d0 + move.l %d0, OR1 + + move.l #__rom_start, %d0 + ori.l #SIM_BR1_MASK, %d0 + move.l %d0, BR1 + + move.w #MCU_SIM_PEPAR, PEPAR + + /* point to vector table: */ + move.l #_romvec, %a0 + move.l #_ramvec, %a1 copy_vectors: - move.l %a0@, %d0 - move.l %d0, %a1@ - move.l %a0@, %a1@ - addq.l #0x04, %a0 - addq.l #0x04, %a1 - cmp.l #_start, %a0 - blt copy_vectors + move.l %a0@, %d0 + move.l %d0, %a1@ + move.l %a0@, %a1@ + addq.l #0x04, %a0 + addq.l #0x04, %a1 + cmp.l #_start, %a0 + blt copy_vectors - move.l #_ramvec, %a1 - movec %a1, %vbr + move.l #_ramvec, %a1 + movec %a1, %vbr /* Copy data segment from ROM to RAM */ - moveal #__data_rom_start, %a0 - moveal #__data_start, %a1 - moveal #__data_end, %a2 + moveal #_stext, %a0 + moveal #_sdata, %a1 + moveal #_edata, %a2 /* Copy %a0 to %a1 until %a1 == %a2 */ LD1: - move.l %a0@, %d0 - addq.l #0x04, %a0 - move.l %d0, %a1@ - addq.l #0x04, %a1 - cmp.l #__data_end, %a1 - blt LD1 + move.l %a0@, %d0 + addq.l #0x04, %a0 + move.l %d0, %a1@ + addq.l #0x04, %a1 + cmp.l #_edata, %a1 + blt LD1 - moveal #__bss_start, %a0 - moveal #end, %a1 + moveal #_sbss, %a0 + moveal #_ebss, %a1 /* Copy 0 to %a0 until %a0 == %a1 */ L1: @@ -235,21 +228,21 @@ bhi L1 load_quicc: - move.l #_dprbase, _quicc_base + move.l #_dprbase, _quicc_base store_ram_size: - /* Set ram size information */ - move.l #_sdata, _rambase - move.l #end, _ramstart - move.l #__ramend, %d0 - sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/ - move.l %d0, _ramend /* Different from __ramend.*/ + /* Set ram size information */ + move.l #_sdata, _rambase + move.l #_ebss, _ramstart + move.l #__ramend, %d0 + sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/ + move.l %d0, _ramend /* Different from __ramend.*/ store_flash_size: - /* Set rom size information */ - move.l #__flashend, %d0 - sub.l #__flashstart, %d0 - move.l %d0, rom_length + /* Set rom size information */ + move.l #__rom_end, %d0 + sub.l #__rom_start, %d0 + move.l %d0, rom_length pea 0 pea env @@ -260,17 +253,14 @@ lea 0x2000(%a2), %sp lp: - jsr start_kernel - /* jmp lp */ + jsr start_kernel _exit: - jmp _exit - .data - .align 4 + .align 4 env: .long 0 _quicc_base: @@ -278,13 +268,16 @@ _periph_base: .long 0 _ramvec: - .long 0 + .long 0 _rambase: - .long 0 + .long 0 _ramstart: - .long 0 + .long 0 _ramend: - .long 0 + .long 0 +_dprbase: + .long 0xffffe000 + .text /* @@ -293,7 +286,7 @@ */ .section ".data.initvect","awx" - .long _boot_stack /* Reset: Initial Stack Pointer - 0. */ + .long __ramend /* Reset: Initial Stack Pointer - 0. */ .long _start /* Reset: Initial Program Counter - 1. */ .long buserr /* Bus Error - 2. */ .long trap /* Address Error - 3. */ diff -Nru a/arch/m68knommu/platform/68360/uCquicc/crt0_rom.S b/arch/m68knommu/platform/68360/uCquicc/crt0_rom.S --- a/arch/m68knommu/platform/68360/uCquicc/crt0_rom.S Thu Feb 20 23:19:23 2003 +++ b/arch/m68knommu/platform/68360/uCquicc/crt0_rom.S Thu Feb 20 23:19:23 2003 @@ -11,11 +11,10 @@ * Copyright (C) 1998 D. Jeff Dionne , * */ -#define ASSEMBLY #include .global _stext -.global __bss_start +.global _sbss .global _start .global _rambase @@ -26,7 +25,6 @@ .global _quicc_base .global _periph_base -.global _dprbase #define REGB 0x1000 #define PEPAR (_dprbase + REGB + 0x0016) @@ -78,7 +76,6 @@ #define SIM_OR0_MASK 0x20000000 #define SIM_BR0_MASK 0x00000001 - /* Defines for chip select one - the RAM */ #define SIM_OR1_MASK 0x10000000 #define SIM_BR1_MASK 0x00000001 @@ -107,66 +104,66 @@ #include -/* By the time this RAM specific code begins to execute, DPRAM - * and DRAM should already be mapped and accessible. */ +/* + * By the time this RAM specific code begins to execute, DPRAM + * and DRAM should already be mapped and accessible. + */ .text _start: _stext: - nop - ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */ - /* We should not need to setup the boot stack the reset should do it. */ - movea.l #_boot_stack, %sp /*set up stack at the end of DRAM:*/ + nop + ori.w #MCU_DISABLE_INTRPTS, %sr /* disable interrupts: */ + /* We should not need to setup the boot stack the reset should do it. */ + movea.l #__ramend, %sp /* set up stack at the end of DRAM:*/ set_mbar_register: - moveq.l #0x07, %d1 /* Setup MBAR */ - movec %d1, %dfc + moveq.l #0x07, %d1 /* Setup MBAR */ + movec %d1, %dfc - lea.l MCU_SIM_MBAR_ADRS, %a0 - move.l #_dprbase, %d0 - andi.l #MCU_SIM_MBAR_BA_MASK, %d0 - ori.l #MCU_SIM_MBAR_AS_MASK, %d0 - moves.l %d0, %a0@ + lea.l MCU_SIM_MBAR_ADRS, %a0 + move.l #_dprbase, %d0 + andi.l #MCU_SIM_MBAR_BA_MASK, %d0 + ori.l #MCU_SIM_MBAR_AS_MASK, %d0 + moves.l %d0, %a0@ - moveq.l #0x05, %d1 - movec.l %d1, %dfc + moveq.l #0x05, %d1 + movec.l %d1, %dfc -/* Now we can begin to access registers in DPRAM */ + /* Now we can begin to access registers in DPRAM */ set_sim_mcr: - /* Set Module Configuration Register */ - move.l #MCU_SIM_MCR, MCR - -/* to do: Determine cause of reset */ + /* Set Module Configuration Register */ + move.l #MCU_SIM_MCR, MCR + /* to do: Determine cause of reset */ - /* - * configure system clock MC68360 p. 6-40 - * (value +1)*osc/128 = system clock - * or - * (value + 1)*osc = system clock - * You do not need to divide the oscillator by 128 unless you want to. - */ + /* + * configure system clock MC68360 p. 6-40 + * (value +1)*osc/128 = system clock + * or + * (value + 1)*osc = system clock + * You do not need to divide the oscillator by 128 unless you want to. + */ set_sim_clock: - move.w #MCU_SIM_PLLCR, PLLCR - move.b #MCU_SIM_CLKOCR, CLKOCR - move.w #MCU_SIM_CDVCR, CDVCR + move.w #MCU_SIM_PLLCR, PLLCR + move.b #MCU_SIM_CLKOCR, CLKOCR + move.w #MCU_SIM_CDVCR, CDVCR - // Wait for the PLL to settle - move.w #16384, %d0 + /* Wait for the PLL to settle */ + move.w #16384, %d0 pll_settle_wait: - subi.w #1, %d0 - bne pll_settle_wait + subi.w #1, %d0 + bne pll_settle_wait - /* Setup the system protection register, and watchdog timer register */ + /* Setup the system protection register, and watchdog timer register */ + move.b #MCU_SIM_SWIV, SWIV + move.w #MCU_SIM_PICR, PICR + move.w #MCU_SIM_PITR, PITR + move.w #MCU_SIM_SYPCR, SYPCR - move.b #MCU_SIM_SWIV, SWIV - move.w #MCU_SIM_PICR, PICR - move.w #MCU_SIM_PITR, PITR - move.w #MCU_SIM_SYPCR, SYPCR - -/* Clear DPRAM - system + parameter */ + /* Clear DPRAM - system + parameter */ movea.l #_dprbase, %a0 movea.l #_dprbase+0x2000, %a1 @@ -177,65 +174,63 @@ bhi clear_dpram configure_memory_controller: - /* - * Set up Global Memory Register (GMR) - */ - move.l #MCU_SIM_GMR, %d0 - move.l %d0, GMR + /* Set up Global Memory Register (GMR) */ + move.l #MCU_SIM_GMR, %d0 + move.l %d0, GMR configure_chip_select_0: - move.l #0x00400000, %d0 - subq.l #0x01, %d0 - eori.l #SIM_OR_MASK, %d0 - ori.l #SIM_OR0_MASK, %d0 - move.l %d0, OR0 - - move.l #__flashstart, %d0 - ori.l #SIM_BR0_MASK, %d0 - move.l %d0, BR0 - - move.l #0x0, BR1 - move.l #0x0, BR2 - move.l #0x0, BR3 - move.l #0x0, BR4 - move.l #0x0, BR5 - move.l #0x0, BR6 - move.l #0x0, BR7 - - move.w #MCU_SIM_PEPAR, PEPAR - -/* point to vector table: */ - move.l #_romvec, %a0 - move.l #_ramvec, %a1 + move.l #0x00400000, %d0 + subq.l #0x01, %d0 + eori.l #SIM_OR_MASK, %d0 + ori.l #SIM_OR0_MASK, %d0 + move.l %d0, OR0 + + move.l #__rom_start, %d0 + ori.l #SIM_BR0_MASK, %d0 + move.l %d0, BR0 + + move.l #0x0, BR1 + move.l #0x0, BR2 + move.l #0x0, BR3 + move.l #0x0, BR4 + move.l #0x0, BR5 + move.l #0x0, BR6 + move.l #0x0, BR7 + + move.w #MCU_SIM_PEPAR, PEPAR + + /* point to vector table: */ + move.l #_romvec, %a0 + move.l #_ramvec, %a1 copy_vectors: - move.l %a0@, %d0 - move.l %d0, %a1@ - move.l %a0@, %a1@ - addq.l #0x04, %a0 - addq.l #0x04, %a1 - cmp.l #_start, %a0 - blt copy_vectors + move.l %a0@, %d0 + move.l %d0, %a1@ + move.l %a0@, %a1@ + addq.l #0x04, %a0 + addq.l #0x04, %a1 + cmp.l #_start, %a0 + blt copy_vectors - move.l #_ramvec, %a1 - movec %a1, %vbr + move.l #_ramvec, %a1 + movec %a1, %vbr /* Copy data segment from ROM to RAM */ - moveal #__data_rom_start, %a0 - moveal #__data_start, %a1 - moveal #__data_end, %a2 + moveal #_etext, %a0 + moveal #_sdata, %a1 + moveal #_edata, %a2 /* Copy %a0 to %a1 until %a1 == %a2 */ LD1: - move.l %a0@, %d0 - addq.l #0x04, %a0 - move.l %d0, %a1@ - addq.l #0x04, %a1 - cmp.l #__data_end, %a1 - blt LD1 + move.l %a0@, %d0 + addq.l #0x04, %a0 + move.l %d0, %a1@ + addq.l #0x04, %a1 + cmp.l #_edata, %a1 + blt LD1 - moveal #__bss_start, %a0 - moveal #end, %a1 + moveal #_sbss, %a0 + moveal #_ebss, %a1 /* Copy 0 to %a0 until %a0 == %a1 */ L1: @@ -244,21 +239,21 @@ bhi L1 load_quicc: - move.l #_dprbase, _quicc_base + move.l #_dprbase, _quicc_base store_ram_size: - /* Set ram size information */ - move.l #_sdata, _rambase - move.l #end, _ramstart - move.l #__ramend, %d0 - sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/ - move.l %d0, _ramend /* Different from __ramend.*/ + /* Set ram size information */ + move.l #_sdata, _rambase + move.l #_ebss, _ramstart + move.l #__ramend, %d0 + sub.l #0x1000, %d0 /* Reserve 4K for stack space.*/ + move.l %d0, _ramend /* Different from __ramend.*/ store_flash_size: - /* Set rom size information */ - move.l #__flashend, %d0 - sub.l #__flashstart, %d0 - move.l %d0, rom_length + /* Set rom size information */ + move.l #__rom_end, %d0 + sub.l #__rom_start, %d0 + move.l %d0, rom_length pea 0 pea env @@ -269,17 +264,14 @@ lea 0x2000(%a2), %sp lp: - jsr start_kernel - /* jmp lp */ + jsr start_kernel _exit: - jmp _exit - .data - .align 4 + .align 4 env: .long 0 _quicc_base: @@ -287,13 +279,17 @@ _periph_base: .long 0 _ramvec: - .long 0 + .long 0 _rambase: - .long 0 + .long 0 _ramstart: - .long 0 + .long 0 _ramend: - .long 0 + .long 0 +_dprbase: + .long 0xffffe000 + + .text /* @@ -302,7 +298,7 @@ */ .section ".data.initvect","awx" - .long _boot_stack /* Reset: Initial Stack Pointer - 0. */ + .long __ramend /* Reset: Initial Stack Pointer - 0. */ .long _start /* Reset: Initial Program Counter - 1. */ .long buserr /* Bus Error - 2. */ .long trap /* Address Error - 3. */ diff -Nru a/arch/m68knommu/platform/68VZ328/ucdimm/config.c b/arch/m68knommu/platform/68VZ328/ucdimm/config.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/m68knommu/platform/68VZ328/ucdimm/config.c Thu Feb 20 23:19:24 2003 @@ -0,0 +1,119 @@ +/* + * linux/arch/m68knommu/platform/68VZ328/ucdimm/config.c + * + * Copyright (C) 1993 Hamish Macdonald + * Copyright (C) 1999 D. Jeff Dionne + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) +{ + /* Restart mode, Enable int, 32KHz, Enable timer */ + TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; + /* Set prescaler (Divide 32KHz by 32)*/ + TPRER = 31; + /* Set compare register 32Khz / 32 / 10 = 100 */ + TCMP = 10; + + request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); +} + +void BSP_tick(void) +{ + /* Reset Timer1 */ + TSTAT &= 0; +} + +unsigned long BSP_gettimeoffset (void) +{ + return 0; +} + +void BSP_gettod (int *yearp, int *monp, int *dayp, + int *hourp, int *minp, int *secp) +{ +} + +int BSP_hwclk(int op, struct hwclk_time *t) +{ + if (!op) { + /* read */ + } else { + /* write */ + } + return 0; +} + +int BSP_set_clock_mmss (unsigned long nowtime) +{ +#if 0 + short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; + + tod->second1 = real_seconds / 10; + tod->second2 = real_seconds % 10; + tod->minute1 = real_minutes / 10; + tod->minute2 = real_minutes % 10; +#endif + return 0; +} + +void BSP_reset (void) +{ + local_irq_disable(); + asm volatile (" + moveal #0x10c00000, %a0; + moveb #0, 0xFFFFF300; + moveal 0(%a0), %sp; + moveal 4(%a0), %a0; + jmp (%a0); + "); +} + +unsigned char *cs8900a_hwaddr; +static int errno; + +_bsc0(char *, getserialnum) +_bsc1(unsigned char *, gethwaddr, int, a) +_bsc1(char *, getbenv, char *, a) + +void config_BSP(char *command, int len) +{ + unsigned char *p; + + printk("\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); + + printk("uCdimm serial string [%s]\n",getserialnum()); + p = cs8900a_hwaddr = gethwaddr(0); + printk("uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", + p[0], p[1], p[2], p[3], p[4], p[5]); + p = getbenv("APPEND"); + if (p) strcpy(p,command); + else command[0] = 0; + + mach_sched_init = BSP_sched_init; + mach_tick = BSP_tick; + mach_gettimeoffset = BSP_gettimeoffset; + mach_gettod = BSP_gettod; + mach_reset = BSP_reset; + + config_M68VZ328_irq(); +} diff -Nru a/arch/m68knommu/vmlinux.lds.S b/arch/m68knommu/vmlinux.lds.S --- a/arch/m68knommu/vmlinux.lds.S Thu Feb 20 23:19:21 2003 +++ b/arch/m68knommu/vmlinux.lds.S Thu Feb 20 23:19:21 2003 @@ -1,7 +1,7 @@ /* * vmlinux.lds.S -- master linker script for m68knommu arch * - * (C) Copyright 2002, Greg Ungerer + * (C) Copyright 2002-2003, Greg Ungerer * * This ends up looking compilcated, because of the number of * address variations for ram and rom/flash layouts. The real @@ -226,7 +226,32 @@ *(__ex_table) __stop___ex_table = .; - RODATA + *(.rodata) *(.rodata.*) + *(__vermagic) /* Kernel version magic */ + *(.rodata1) + + /* Kernel symbol table: Normal symbols */ + __start___ksymtab = .; + *(__ksymtab) + __stop___ksymtab = .; + + /* Kernel symbol table: GPL-only symbols */ + __start___ksymtab_gpl = .; + *(__ksymtab_gpl) + __stop___ksymtab_gpl = .; + + /* Kernel symbol table: Normal symbols */ + __start___kcrctab = .; + *(__kcrctab) + __stop___kcrctab = .; + + /* Kernel symbol table: GPL-only symbols */ + __start___kcrctab_gpl = .; + *(__kcrctab_gpl) + __stop___kcrctab_gpl = .; + + /* Kernel symbol table: strings */ + *(__ksymtab_strings) . = ALIGN(4) ; _etext = . ; diff -Nru a/arch/mips/au1000/common/serial.c b/arch/mips/au1000/common/serial.c --- a/arch/mips/au1000/common/serial.c Thu Feb 20 23:19:20 2003 +++ b/arch/mips/au1000/common/serial.c Thu Feb 20 23:19:20 2003 @@ -195,7 +195,7 @@ #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) #define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ - kdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) + cdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) #else #define DBG_CNT(s) #endif @@ -227,11 +227,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/arch/mips/baget/vacserial.c b/arch/mips/baget/vacserial.c --- a/arch/mips/baget/vacserial.c Thu Feb 20 23:19:22 2003 +++ b/arch/mips/baget/vacserial.c Thu Feb 20 23:19:22 2003 @@ -29,7 +29,7 @@ #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) #define DBG_CNT(s) baget_printk("(%s):[%x] refc=%d, serc=%d, ttyc=%d-> %s\n", \ - kdevname(tty->device),(info->flags),serial_refcount,info->count,tty->count,s) + cdevname(tty->device),(info->flags),serial_refcount,info->count,tty->count,s) #else #define DBG_CNT(s) #endif @@ -173,11 +173,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/arch/mips/ddb5xxx/common/pci.c b/arch/mips/ddb5xxx/common/pci.c --- a/arch/mips/ddb5xxx/common/pci.c Thu Feb 20 23:19:24 2003 +++ b/arch/mips/ddb5xxx/common/pci.c Thu Feb 20 23:19:24 2003 @@ -148,7 +148,7 @@ } bus->resource[0]->flags |= pci_bridge_check_io(dev); bus->resource[1]->flags |= IORESOURCE_MEM; - /* For now, propogate hose limits to the bus; + /* For now, propagate hose limits to the bus; we'll adjust them later. */ bus->resource[0]->end = hose->io_resource->end; bus->resource[1]->end = hose->mem_resource->end; diff -Nru a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c --- a/arch/mips/kernel/irixsig.c Thu Feb 20 23:19:23 2003 +++ b/arch/mips/kernel/irixsig.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * irixsig.c: WHEEE, IRIX signals! YOW, am I compatable or what?!?! + * irixsig.c: WHEEE, IRIX signals! YOW, am I compatible or what?!?! * * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) * Copyright (C) 1997 - 2000 Ralf Baechle (ralf@gnu.org) diff -Nru a/arch/mips/kernel/pci.c b/arch/mips/kernel/pci.c --- a/arch/mips/kernel/pci.c Thu Feb 20 23:19:22 2003 +++ b/arch/mips/kernel/pci.c Thu Feb 20 23:19:22 2003 @@ -145,7 +145,7 @@ } bus->resource[0]->flags |= pci_bridge_check_io(dev); bus->resource[1]->flags |= IORESOURCE_MEM; - /* For now, propogate hose limits to the bus; + /* For now, propagate hose limits to the bus; we'll adjust them later. */ bus->resource[0]->end = hose->io_resource->end; bus->resource[1]->end = hose->mem_resource->end; diff -Nru a/arch/mips/philips/nino/int-handler.S b/arch/mips/philips/nino/int-handler.S --- a/arch/mips/philips/nino/int-handler.S Thu Feb 20 23:19:19 2003 +++ b/arch/mips/philips/nino/int-handler.S Thu Feb 20 23:19:19 2003 @@ -72,7 +72,7 @@ nop /* - * Ok, we've got one of over a hundred other interupts. + * Ok, we've got one of over a hundred other interrupts. */ low_priority: lui t0, %hi(IntStatus1) diff -Nru a/arch/mips64/kernel/linux32.c b/arch/mips64/kernel/linux32.c --- a/arch/mips64/kernel/linux32.c Thu Feb 20 23:19:22 2003 +++ b/arch/mips64/kernel/linux32.c Thu Feb 20 23:19:22 2003 @@ -1800,7 +1800,7 @@ return ret; } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; diff -Nru a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile --- a/arch/parisc/kernel/Makefile Thu Feb 20 23:19:20 2003 +++ b/arch/parisc/kernel/Makefile Thu Feb 20 23:19:20 2003 @@ -16,7 +16,6 @@ processor.o pdc_chassis.o obj-$(CONFIG_SMP) += smp.o -obj-$(CONFIG_PROFILING) += profile.o obj-$(CONFIG_PA11) += pci-dma.o obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_MODULES) += module.o diff -Nru a/arch/parisc/kernel/ioctl32.c b/arch/parisc/kernel/ioctl32.c --- a/arch/parisc/kernel/ioctl32.c Thu Feb 20 23:19:19 2003 +++ b/arch/parisc/kernel/ioctl32.c Thu Feb 20 23:19:19 2003 @@ -2892,7 +2892,7 @@ IOCTL_TABLE_START /* List here exlicitly which ioctl's are known to have - * compatable types passed or none at all... + * compatible types passed or none at all... */ /* Big T */ COMPATIBLE_IOCTL(TCGETA) diff -Nru a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c --- a/arch/parisc/kernel/irq.c Thu Feb 20 23:19:21 2003 +++ b/arch/parisc/kernel/irq.c Thu Feb 20 23:19:21 2003 @@ -447,7 +447,7 @@ /* 1) only process IRQs that are enabled/unmasked (cpu_eiem) * 2) We loop here on EIRR contents in order to avoid - * nested interrupts or having to take another interupt + * nested interrupts or having to take another interrupt * when we could have just handled it right away. * 3) Limit the number of times we loop to make sure other * processing can occur. diff -Nru a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c --- a/arch/parisc/kernel/parisc_ksyms.c Thu Feb 20 23:19:24 2003 +++ b/arch/parisc/kernel/parisc_ksyms.c Thu Feb 20 23:19:24 2003 @@ -207,10 +207,5 @@ EXPORT_SYMBOL_NOVERS($$dyncall); #endif -#ifdef CONFIG_PROFILING -EXPORT_SYMBOL_GPL(register_profile_notifier); -EXPORT_SYMBOL_GPL(unregister_profile_notifier); -#endif - #include EXPORT_SYMBOL_NOVERS(vmalloc_start); diff -Nru a/arch/parisc/kernel/profile.c b/arch/parisc/kernel/profile.c --- a/arch/parisc/kernel/profile.c Thu Feb 20 23:19:21 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,43 +0,0 @@ -/* arch/parisc/kernel/profile.c - * - * Almost entirely copied from ppc64 which is: - * (C) 2002 John Levon - */ - -#include -#include -#include -#include - -static struct notifier_block *profile_listeners; -static rwlock_t profile_lock = RW_LOCK_UNLOCKED; - -int register_profile_notifier(struct notifier_block *nb) -{ - int err; - - write_lock_irq(&profile_lock); - err = notifier_chain_register(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - - return err; -} - -int unregister_profile_notifier(struct notifier_block *nb) -{ - int err; - - write_lock_irq(&profile_lock); - err = notifier_chain_unregister(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - - return err; -} - -void parisc_profile_hook(struct pt_regs *regs) -{ - read_lock(&profile_lock); - notifier_call_chain(&profile_listeners, 0, regs); - read_unlock(&profile_lock); -} - diff -Nru a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c --- a/arch/parisc/kernel/time.c Thu Feb 20 23:19:21 2003 +++ b/arch/parisc/kernel/time.c Thu Feb 20 23:19:21 2003 @@ -51,11 +51,7 @@ extern unsigned long prof_cpu_mask; extern char _stext; -#ifdef CONFIG_PROFILING - extern void parisc_profile_hook(struct pt_regs *); - - parisc_profile_hook(regs); -#endif + profile_hook(regs); if (user_mode(regs)) return; diff -Nru a/arch/ppc/8260_io/uart.c b/arch/ppc/8260_io/uart.c --- a/arch/ppc/8260_io/uart.c Thu Feb 20 23:19:19 2003 +++ b/arch/ppc/8260_io/uart.c Thu Feb 20 23:19:19 2003 @@ -227,11 +227,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/arch/ppc/8xx_io/uart.c b/arch/ppc/8xx_io/uart.c --- a/arch/ppc/8xx_io/uart.c Thu Feb 20 23:19:23 2003 +++ b/arch/ppc/8xx_io/uart.c Thu Feb 20 23:19:23 2003 @@ -242,11 +242,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/arch/ppc/xmon/ansidecl.h b/arch/ppc/xmon/ansidecl.h --- a/arch/ppc/xmon/ansidecl.h Thu Feb 20 23:19:24 2003 +++ b/arch/ppc/xmon/ansidecl.h Thu Feb 20 23:19:24 2003 @@ -1,4 +1,4 @@ -/* ANSI and traditional C compatability macros +/* ANSI and traditional C compatibility macros Copyright 1991, 1992 Free Software Foundation, Inc. This file is part of the GNU C Library. diff -Nru a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile --- a/arch/ppc64/kernel/Makefile Thu Feb 20 23:19:24 2003 +++ b/arch/ppc64/kernel/Makefile Thu Feb 20 23:19:24 2003 @@ -27,7 +27,6 @@ obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o obj-$(CONFIG_SMP) += smp.o -obj-$(CONFIG_PROFILING) += profile.o obj-$(CONFIG_MODULES) += module.o ppc_ksyms.o obj-$(CONFIG_PPC_RTAS) += rtas-proc.o obj-$(CONFIG_SCANLOG) += scanlog.o diff -Nru a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S --- a/arch/ppc64/kernel/head.S Thu Feb 20 23:19:22 2003 +++ b/arch/ppc64/kernel/head.S Thu Feb 20 23:19:22 2003 @@ -337,8 +337,8 @@ * Start of pSeries system interrupt routines */ . = 0x100 - .globl __start_interupts -__start_interupts: + .globl __start_interrupts +__start_interrupts: STD_EXCEPTION_PSERIES( 0x100, SystemReset ) STD_EXCEPTION_PSERIES( 0x200, MachineCheck ) @@ -367,7 +367,7 @@ . = 0x4000 .globl __end_interrupts .globl __start_naca -__end_interupts: +__end_interrupts: __start_naca: #ifdef CONFIG_PPC_ISERIES .llong itVpdAreas diff -Nru a/arch/ppc64/kernel/ppc_ksyms.c b/arch/ppc64/kernel/ppc_ksyms.c --- a/arch/ppc64/kernel/ppc_ksyms.c Thu Feb 20 23:19:20 2003 +++ b/arch/ppc64/kernel/ppc_ksyms.c Thu Feb 20 23:19:20 2003 @@ -232,8 +232,3 @@ #endif EXPORT_SYMBOL(tb_ticks_per_usec); - -#ifdef CONFIG_PROFILING -EXPORT_SYMBOL_GPL(register_profile_notifier); -EXPORT_SYMBOL_GPL(unregister_profile_notifier); -#endif diff -Nru a/arch/ppc64/kernel/profile.c b/arch/ppc64/kernel/profile.c --- a/arch/ppc64/kernel/profile.c Thu Feb 20 23:19:21 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,42 +0,0 @@ -/* - * linux/arch/i386/kernel/profile.c - * - * (C) 2002 John Levon - * - */ - -#include -#include -#include -#include -#include - -static struct notifier_block * profile_listeners; -static rwlock_t profile_lock = RW_LOCK_UNLOCKED; - -int register_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_register(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -int unregister_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_unregister(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -void ppc64_profile_hook(struct pt_regs * regs) -{ - read_lock(&profile_lock); - notifier_call_chain(&profile_listeners, 0, regs); - read_unlock(&profile_lock); -} diff -Nru a/arch/ppc64/kernel/sys32.S b/arch/ppc64/kernel/sys32.S --- a/arch/ppc64/kernel/sys32.S Thu Feb 20 23:19:23 2003 +++ b/arch/ppc64/kernel/sys32.S Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * sys32.S: I-cache tricks for 32-bit compatability layer simple + * sys32.S: I-cache tricks for 32-bit compatibility layer simple * conversions. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) diff -Nru a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c --- a/arch/ppc64/kernel/sys_ppc32.c Thu Feb 20 23:19:22 2003 +++ b/arch/ppc64/kernel/sys_ppc32.c Thu Feb 20 23:19:22 2003 @@ -812,7 +812,7 @@ return sys_sysfs((int)option, arg1, arg2); } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; s32 offset, freq, maxerror, esterror; diff -Nru a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c --- a/arch/ppc64/kernel/time.c Thu Feb 20 23:19:23 2003 +++ b/arch/ppc64/kernel/time.c Thu Feb 20 23:19:23 2003 @@ -110,11 +110,8 @@ unsigned long nip; extern unsigned long prof_cpu_mask; extern char _stext; -#ifdef CONFIG_PROFILING - extern void ppc64_profile_hook(struct pt_regs *); - ppc64_profile_hook(regs); -#endif + profile_hook(regs); if (user_mode(regs)) return; diff -Nru a/arch/ppc64/xmon/ansidecl.h b/arch/ppc64/xmon/ansidecl.h --- a/arch/ppc64/xmon/ansidecl.h Thu Feb 20 23:19:21 2003 +++ b/arch/ppc64/xmon/ansidecl.h Thu Feb 20 23:19:21 2003 @@ -1,4 +1,4 @@ -/* ANSI and traditional C compatability macros +/* ANSI and traditional C compatibility macros Copyright 1991, 1992 Free Software Foundation, Inc. This file is part of the GNU C Library. diff -Nru a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S --- a/arch/s390/kernel/entry.S Thu Feb 20 23:19:20 2003 +++ b/arch/s390/kernel/entry.S Thu Feb 20 23:19:20 2003 @@ -757,8 +757,8 @@ la %r2,SP_PTREGS(%r15) # address of register-save area sr %r3,%r3 icm %r3,3,__LC_SUBCHANNEL_NR # load subchannel nr & extend to int - l %r4,__LC_IO_INT_PARM # load interuption parm - l %r5,__LC_IO_INT_WORD # load interuption word + l %r4,__LC_IO_INT_PARM # load interruption parm + l %r5,__LC_IO_INT_WORD # load interruption word basr %r14,%r1 # branch to standard irq handler io_return: diff -Nru a/arch/s390x/kernel/entry.S b/arch/s390x/kernel/entry.S --- a/arch/s390x/kernel/entry.S Thu Feb 20 23:19:20 2003 +++ b/arch/s390x/kernel/entry.S Thu Feb 20 23:19:20 2003 @@ -781,8 +781,8 @@ GET_THREAD_INFO # load pointer to task_struct to R9 la %r2,SP_PTREGS(%r15) # address of register-save area llgh %r3,__LC_SUBCHANNEL_NR # load subchannel number - llgf %r4,__LC_IO_INT_PARM # load interuption parm - llgf %r5,__LC_IO_INT_WORD # load interuption word + llgf %r4,__LC_IO_INT_PARM # load interruption parm + llgf %r5,__LC_IO_INT_WORD # load interruption word brasl %r14,do_IRQ # call standard irq handler io_return: diff -Nru a/arch/s390x/kernel/linux32.c b/arch/s390x/kernel/linux32.c --- a/arch/s390x/kernel/linux32.c Thu Feb 20 23:19:23 2003 +++ b/arch/s390x/kernel/linux32.c Thu Feb 20 23:19:23 2003 @@ -3578,7 +3578,7 @@ return ret; } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; diff -Nru a/arch/sparc/Kconfig b/arch/sparc/Kconfig --- a/arch/sparc/Kconfig Thu Feb 20 23:19:19 2003 +++ b/arch/sparc/Kconfig Thu Feb 20 23:19:19 2003 @@ -136,34 +136,20 @@ config ISA bool help - Find out whether you have ISA slots on your motherboard. ISA is the - name of a bus system, i.e. the way the CPU talks to the other stuff - inside your box. Other bus systems are PCI, EISA, MicroChannel - (MCA) or VESA. ISA is an older system, now being displaced by PCI; - newer boards don't support it. If you have ISA, say Y, otherwise N. + ISA is found on Espresso only and is not supported currently. + Say N config EISA bool - ---help--- - The Extended Industry Standard Architecture (EISA) bus was - developed as an open alternative to the IBM MicroChannel bus. - - The EISA bus provided some of the features of the IBM MicroChannel - bus while maintaining backward compatibility with cards made for - the older ISA bus. The EISA bus saw limited use between 1988 and - 1995 when it was made obsolete by the PCI bus. - - Say Y here if you are building a kernel for an EISA-based machine. - - Otherwise, say N. + help + EISA is not supported. + Say N config MCA bool help - MicroChannel Architecture is found in some IBM PS/2 machines and - laptops. It is a bus system similar to PCI or ISA. See - (and especially the web page given - there) before attempting to build an MCA bus kernel. + EISA is not supported. + Say N config PCMCIA tristate @@ -242,8 +228,8 @@ config SUN4 bool "Support for SUN4 machines (disables SUN4[CDM] support)" help - Say Y here if, and only if, your machine is a Sun4. Note that - a kernel compiled with this option will run only on Sun4. + Say Y here if, and only if, your machine is a sun4. Note that + a kernel compiled with this option will run only on sun4. (And the current version will probably work only on sun4/330.) if !SUN4 @@ -251,15 +237,9 @@ config PCI bool "Support for PCI and PS/2 keyboard/mouse" help - Find out whether you have a PCI motherboard. PCI is the name of a - bus system, i.e. the way the CPU talks to the other stuff inside - your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or - VESA. If you have PCI, say Y, otherwise N. - - The PCI-HOWTO, available from - , contains valuable - information about which PCI hardware does work under Linux and which - doesn't. + CONFIG_PCI is needed for all JavaStation's (including MrCoffee), + CP-1200, JavaEngine-1, Corona, Red October, and Serengeti SGSC. + All of these platforms are extremely obscure, so say N if unsure. source "drivers/pci/Kconfig" diff -Nru a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c --- a/arch/sparc/kernel/sparc_ksyms.c Thu Feb 20 23:19:19 2003 +++ b/arch/sparc/kernel/sparc_ksyms.c Thu Feb 20 23:19:19 2003 @@ -55,6 +55,8 @@ #include #include +extern spinlock_t rtc_lock; + struct poll { int fd; short events; @@ -152,6 +154,7 @@ EXPORT_SYMBOL(udelay); EXPORT_SYMBOL(ndelay); +EXPORT_SYMBOL(rtc_lock); EXPORT_SYMBOL(mostek_lock); EXPORT_SYMBOL(mstk48t02_regs); #if CONFIG_SUN_AUXIO diff -Nru a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c --- a/arch/sparc/kernel/time.c Thu Feb 20 23:19:22 2003 +++ b/arch/sparc/kernel/time.c Thu Feb 20 23:19:22 2003 @@ -47,6 +47,7 @@ u64 jiffies_64; +spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; enum sparc_clock_type sp_clock_typ; spinlock_t mostek_lock = SPIN_LOCK_UNLOCKED; unsigned long mstk48t02_regs = 0UL; diff -Nru a/arch/sparc64/kernel/Makefile b/arch/sparc64/kernel/Makefile --- a/arch/sparc64/kernel/Makefile Thu Feb 20 23:19:20 2003 +++ b/arch/sparc64/kernel/Makefile Thu Feb 20 23:19:20 2003 @@ -15,7 +15,6 @@ obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o pci_iommu.o \ pci_psycho.o pci_sabre.o pci_schizo.o obj-$(CONFIG_SMP) += smp.o trampoline.o -obj-$(CONFIG_PROFILING) += profile.o obj-$(CONFIG_SPARC32_COMPAT) += sys32.o sys_sparc32.o signal32.o ioctl32.o obj-$(CONFIG_BINFMT_ELF32) += binfmt_elf32.o obj-$(CONFIG_BINFMT_AOUT32) += binfmt_aout32.o diff -Nru a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c --- a/arch/sparc64/kernel/ioctl32.c Thu Feb 20 23:19:23 2003 +++ b/arch/sparc64/kernel/ioctl32.c Thu Feb 20 23:19:23 2003 @@ -4277,7 +4277,7 @@ IOCTL_TABLE_START /* List here exlicitly which ioctl's are known to have - * compatable types passed or none at all... + * compatible types passed or none at all... */ /* Big T */ COMPATIBLE_IOCTL(TCGETA) diff -Nru a/arch/sparc64/kernel/profile.c b/arch/sparc64/kernel/profile.c --- a/arch/sparc64/kernel/profile.c Thu Feb 20 23:19:20 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,42 +0,0 @@ -/* arch/sparc64/kernel/profile.c - * - * Almost entirely copied from ppc64 which is: - * (C) 2002 John Levon - */ - -#include -#include -#include -#include - -static struct notifier_block *profile_listeners; -static rwlock_t profile_lock = RW_LOCK_UNLOCKED; - -int register_profile_notifier(struct notifier_block *nb) -{ - int err; - - write_lock_irq(&profile_lock); - err = notifier_chain_register(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - - return err; -} - -int unregister_profile_notifier(struct notifier_block *nb) -{ - int err; - - write_lock_irq(&profile_lock); - err = notifier_chain_unregister(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - - return err; -} - -void sparc64_profile_hook(struct pt_regs *regs) -{ - read_lock(&profile_lock); - notifier_call_chain(&profile_listeners, 0, regs); - read_unlock(&profile_lock); -} diff -Nru a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c --- a/arch/sparc64/kernel/sparc64_ksyms.c Thu Feb 20 23:19:23 2003 +++ b/arch/sparc64/kernel/sparc64_ksyms.c Thu Feb 20 23:19:23 2003 @@ -374,8 +374,3 @@ /* for ns8703 */ EXPORT_SYMBOL(ns87303_lock); - -#ifdef CONFIG_PROFILING -EXPORT_SYMBOL_GPL(register_profile_notifier); -EXPORT_SYMBOL_GPL(unregister_profile_notifier); -#endif diff -Nru a/arch/sparc64/kernel/sunos_ioctl32.c b/arch/sparc64/kernel/sunos_ioctl32.c --- a/arch/sparc64/kernel/sunos_ioctl32.c Thu Feb 20 23:19:23 2003 +++ b/arch/sparc64/kernel/sunos_ioctl32.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* $Id: sunos_ioctl32.c,v 1.11 2000/07/30 23:12:24 davem Exp $ - * sunos_ioctl32.c: SunOS ioctl compatability on sparc64. + * sunos_ioctl32.c: SunOS ioctl compatibility on sparc64. * * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx) * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu) diff -Nru a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S --- a/arch/sparc64/kernel/sys32.S Thu Feb 20 23:19:20 2003 +++ b/arch/sparc64/kernel/sys32.S Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $ - * sys32.S: I-cache tricks for 32-bit compatability layer simple + * sys32.S: I-cache tricks for 32-bit compatibility layer simple * conversions. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c --- a/arch/sparc64/kernel/sys_sparc32.c Thu Feb 20 23:19:22 2003 +++ b/arch/sparc64/kernel/sys_sparc32.c Thu Feb 20 23:19:22 2003 @@ -3528,7 +3528,7 @@ return ret; } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; diff -Nru a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c --- a/arch/sparc64/kernel/sys_sunos32.c Thu Feb 20 23:19:22 2003 +++ b/arch/sparc64/kernel/sys_sunos32.c Thu Feb 20 23:19:22 2003 @@ -1,5 +1,5 @@ /* $Id: sys_sunos32.c,v 1.64 2002/02/09 19:49:31 davem Exp $ - * sys_sunos32.c: SunOS binary compatability layer on sparc64. + * sys_sunos32.c: SunOS binary compatibility layer on sparc64. * * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx) diff -Nru a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S --- a/arch/sparc64/kernel/systbls.S Thu Feb 20 23:19:21 2003 +++ b/arch/sparc64/kernel/systbls.S Thu Feb 20 23:19:21 2003 @@ -47,7 +47,7 @@ .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_stat64 -/*140*/ .word sys32_sendfile64, sys_nis_syscall, sys_futex, sys_gettid, sys32_getrlimit +/*140*/ .word sys32_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, sys32_getrlimit .word sys32_setrlimit, sys_pivot_root, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 .word sys32_fcntl64, sys_ni_syscall, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount diff -Nru a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c --- a/arch/sparc64/kernel/time.c Thu Feb 20 23:19:21 2003 +++ b/arch/sparc64/kernel/time.c Thu Feb 20 23:19:21 2003 @@ -88,11 +88,8 @@ { unsigned long pc = regs->tpc; unsigned long o7 = regs->u_regs[UREG_RETPC]; -#ifdef CONFIG_PROFILING - extern void sparc64_profile_hook(struct pt_regs *); - sparc64_profile_hook(regs); -#endif + profile_hook(regs); if (user_mode(regs)) return; diff -Nru a/arch/sparc64/oprofile/timer_int.c b/arch/sparc64/oprofile/timer_int.c --- a/arch/sparc64/oprofile/timer_int.c Thu Feb 20 23:19:22 2003 +++ b/arch/sparc64/oprofile/timer_int.c Thu Feb 20 23:19:22 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include static int timer_notify(struct notifier_block * self, unsigned long val, void * data) diff -Nru a/arch/um/include/sysdep-i386/checksum.h b/arch/um/include/sysdep-i386/checksum.h --- a/arch/um/include/sysdep-i386/checksum.h Thu Feb 20 23:19:20 2003 +++ b/arch/um/include/sysdep-i386/checksum.h Thu Feb 20 23:19:20 2003 @@ -60,7 +60,7 @@ /* * These are the old (and unsafe) way of doing checksums, a warning message - * will be printed if they are used and an exeption occurs. + * will be printed if they are used and an exception occurs. * * these functions should go away after some time. */ diff -Nru a/arch/v850/Kconfig b/arch/v850/Kconfig --- a/arch/v850/Kconfig Thu Feb 20 23:19:21 2003 +++ b/arch/v850/Kconfig Thu Feb 20 23:19:21 2003 @@ -133,6 +133,11 @@ depends RTE_CB default y + config RTE_CB_MULTI_DBTRAP + bool "Pass illegal insn trap / dbtrap to kernel" + depends RTE_CB_MULTI + default n + config RTE_CB_MA1_KSRAM bool "Kernel in SRAM (limits size of kernel)" depends RTE_CB_MA1 && RTE_CB_MULTI diff -Nru a/arch/v850/kernel/bug.c b/arch/v850/kernel/bug.c --- a/arch/v850/kernel/bug.c Thu Feb 20 23:19:22 2003 +++ b/arch/v850/kernel/bug.c Thu Feb 20 23:19:22 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/bug.c -- Bug reporting functions * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -37,12 +37,6 @@ printk (KERN_CRIT "unimplemented trap %d called at 0x%08lx, pid %d!\n", trap_num, regs->pc, current->pid); - return -ENOSYS; -} - -int debug_trap (struct pt_regs *regs) -{ - printk (KERN_CRIT "debug trap at 0x%08lx!\n", regs->pc); return -ENOSYS; } diff -Nru a/arch/v850/kernel/entry.S b/arch/v850/kernel/entry.S --- a/arch/v850/kernel/entry.S Thu Feb 20 23:19:23 2003 +++ b/arch/v850/kernel/entry.S Thu Feb 20 23:19:23 2003 @@ -2,8 +2,8 @@ * arch/v850/kernel/entry.S -- Low-level system-call handling, trap handlers, * and context-switching * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -38,27 +38,27 @@ sst.w r6, PTO+PT_GPR(6)[ep]; \ sst.w r7, PTO+PT_GPR(7)[ep]; \ sst.w r8, PTO+PT_GPR(8)[ep]; \ - sst.w r9, PTO+PT_GPR(9)[ep]; + sst.w r9, PTO+PT_GPR(9)[ep] /* Restore argument registers from the struct pt_regs pointed to by EP. */ #define RESTORE_ARG_REGS \ sld.w PTO+PT_GPR(6)[ep], r6; \ sld.w PTO+PT_GPR(7)[ep], r7; \ sld.w PTO+PT_GPR(8)[ep], r8; \ - sld.w PTO+PT_GPR(9)[ep], r9; + sld.w PTO+PT_GPR(9)[ep], r9 /* Save value return registers to the struct pt_regs pointed to by EP. */ #define SAVE_RVAL_REGS \ sst.w r10, PTO+PT_GPR(10)[ep]; \ - sst.w r11, PTO+PT_GPR(11)[ep]; + sst.w r11, PTO+PT_GPR(11)[ep] /* Restore value return registers from the struct pt_regs pointed to by EP. */ #define RESTORE_RVAL_REGS \ sld.w PTO+PT_GPR(10)[ep], r10; \ - sld.w PTO+PT_GPR(11)[ep], r11; + sld.w PTO+PT_GPR(11)[ep], r11 #define SAVE_CALL_CLOBBERED_REGS_BEFORE_ARGS \ sst.w r1, PTO+PT_GPR(1)[ep]; \ - sst.w r5, PTO+PT_GPR(5)[ep]; + sst.w r5, PTO+PT_GPR(5)[ep] #define SAVE_CALL_CLOBBERED_REGS_AFTER_RVAL \ sst.w r12, PTO+PT_GPR(12)[ep]; \ sst.w r13, PTO+PT_GPR(13)[ep]; \ @@ -67,10 +67,10 @@ sst.w r16, PTO+PT_GPR(16)[ep]; \ sst.w r17, PTO+PT_GPR(17)[ep]; \ sst.w r18, PTO+PT_GPR(18)[ep]; \ - sst.w r19, PTO+PT_GPR(19)[ep]; + sst.w r19, PTO+PT_GPR(19)[ep] #define RESTORE_CALL_CLOBBERED_REGS_BEFORE_ARGS \ sld.w PTO+PT_GPR(1)[ep], r1; \ - sld.w PTO+PT_GPR(5)[ep], r5; + sld.w PTO+PT_GPR(5)[ep], r5 #define RESTORE_CALL_CLOBBERED_REGS_AFTER_RVAL \ sld.w PTO+PT_GPR(12)[ep], r12; \ sld.w PTO+PT_GPR(13)[ep], r13; \ @@ -79,40 +79,34 @@ sld.w PTO+PT_GPR(16)[ep], r16; \ sld.w PTO+PT_GPR(17)[ep], r17; \ sld.w PTO+PT_GPR(18)[ep], r18; \ - sld.w PTO+PT_GPR(19)[ep], r19; + sld.w PTO+PT_GPR(19)[ep], r19 /* Save `call clobbered' registers to the struct pt_regs pointed to by EP. */ #define SAVE_CALL_CLOBBERED_REGS \ SAVE_CALL_CLOBBERED_REGS_BEFORE_ARGS; \ SAVE_ARG_REGS; \ SAVE_RVAL_REGS; \ - SAVE_CALL_CLOBBERED_REGS_AFTER_RVAL; + SAVE_CALL_CLOBBERED_REGS_AFTER_RVAL /* Restore `call clobbered' registers from the struct pt_regs pointed to by EP. */ #define RESTORE_CALL_CLOBBERED_REGS \ RESTORE_CALL_CLOBBERED_REGS_BEFORE_ARGS; \ RESTORE_ARG_REGS; \ RESTORE_RVAL_REGS; \ - RESTORE_CALL_CLOBBERED_REGS_AFTER_RVAL; + RESTORE_CALL_CLOBBERED_REGS_AFTER_RVAL /* Save `call clobbered' registers except for the return-value registers to the struct pt_regs pointed to by EP. */ #define SAVE_CALL_CLOBBERED_REGS_NO_RVAL \ SAVE_CALL_CLOBBERED_REGS_BEFORE_ARGS; \ SAVE_ARG_REGS; \ - SAVE_CALL_CLOBBERED_REGS_AFTER_RVAL; + SAVE_CALL_CLOBBERED_REGS_AFTER_RVAL /* Restore `call clobbered' registers except for the return-value registers from the struct pt_regs pointed to by EP. */ #define RESTORE_CALL_CLOBBERED_REGS_NO_RVAL \ RESTORE_CALL_CLOBBERED_REGS_BEFORE_ARGS; \ RESTORE_ARG_REGS; \ - RESTORE_CALL_CLOBBERED_REGS_AFTER_RVAL; - -/* Zero `call clobbered' registers except for the return-value registers. */ -#define ZERO_CALL_CLOBBERED_REGS_NO_RVAL \ - mov r0, r1; mov r0, r5; \ - mov r0, r12; mov r0, r13; mov r0, r14; mov r0, r15; \ - mov r0, r16; mov r0, r17; mov r0, r18; mov r0, r19; + RESTORE_CALL_CLOBBERED_REGS_AFTER_RVAL /* Save `call saved' registers to the struct pt_regs pointed to by EP. */ #define SAVE_CALL_SAVED_REGS \ @@ -126,7 +120,7 @@ sst.w r26, PTO+PT_GPR(26)[ep]; \ sst.w r27, PTO+PT_GPR(27)[ep]; \ sst.w r28, PTO+PT_GPR(28)[ep]; \ - sst.w r29, PTO+PT_GPR(29)[ep]; + sst.w r29, PTO+PT_GPR(29)[ep] /* Restore `call saved' registers from the struct pt_regs pointed to by EP. */ #define RESTORE_CALL_SAVED_REGS \ sld.w PTO+PT_GPR(2)[ep], r2; \ @@ -139,68 +133,53 @@ sld.w PTO+PT_GPR(26)[ep], r26; \ sld.w PTO+PT_GPR(27)[ep], r27; \ sld.w PTO+PT_GPR(28)[ep], r28; \ - sld.w PTO+PT_GPR(29)[ep], r29; + sld.w PTO+PT_GPR(29)[ep], r29 + +/* Save the PC stored in the special register SAVEREG to the struct pt_regs + pointed to by EP. r19 is clobbered. */ +#define SAVE_PC(savereg) \ + stsr SR_ ## savereg, r19; \ + sst.w r19, PTO+PT_PC[ep] +/* Restore the PC from the struct pt_regs pointed to by EP, to the special + register SAVEREG. LP is clobbered (it is used as a scratch register + because the POP_STATE macro restores it, and this macro is usually used + inside POP_STATE). */ +#define RESTORE_PC(savereg) \ + sld.w PTO+PT_PC[ep], lp; \ + ldsr lp, SR_ ## savereg +/* Save the PSW register stored in the special register SAVREG to the + struct pt_regs pointed to by EP r19 is clobbered. */ +#define SAVE_PSW(savereg) \ + stsr SR_ ## savereg, r19; \ + sst.w r19, PTO+PT_PSW[ep] +/* Restore the PSW register from the struct pt_regs pointed to by EP, to + the special register SAVEREG. LP is clobbered (it is used as a scratch + register because the POP_STATE macro restores it, and this macro is + usually used inside POP_STATE). */ +#define RESTORE_PSW(savereg) \ + sld.w PTO+PT_PSW[ep], lp; \ + ldsr lp, SR_ ## savereg -/* Save system registers to the struct pt_regs pointed to by REG. +/* Save CTPC/CTPSW/CTBP registers to the struct pt_regs pointed to by REG. r19 is clobbered. */ -#define SAVE_SYS_REGS \ - stsr SR_EIPC, r19; /* user's PC, before interrupt */ \ - sst.w r19, PTO+PT_PC[ep]; \ - stsr SR_EIPSW, r19; /* & PSW (XXX save this?) */ \ - sst.w r19, PTO+PT_PSW[ep]; \ - stsr SR_CTPC, r19; /* (XXX maybe not used in kernel?) */ \ +#define SAVE_CT_REGS \ + stsr SR_CTPC, r19; \ sst.w r19, PTO+PT_CTPC[ep]; \ - stsr SR_CTPSW, r19; /* " */ \ + stsr SR_CTPSW, r19; \ sst.w r19, PTO+PT_CTPSW[ep]; \ - stsr SR_CTBP, r19; /* " */ \ - sst.w r19, PTO+PT_CTBP[ep]; -/* Restore system registers from the struct pt_regs pointed to by EP. + stsr SR_CTBP, r19; \ + sst.w r19, PTO+PT_CTBP[ep] +/* Restore CTPC/CTPSW/CTBP registers from the struct pt_regs pointed to by EP. LP is clobbered (it is used as a scratch register because the POP_STATE macro restores it, and this macro is usually used inside POP_STATE). */ -#define RESTORE_SYS_REGS \ - sld.w PTO+PT_PC[ep], lp; \ - ldsr lp, SR_EIPC; /* user's PC, before interrupt */ \ - sld.w PTO+PT_PSW[ep], lp; \ - ldsr lp, SR_EIPSW; /* & PSW (XXX save this?) */ \ +#define RESTORE_CT_REGS \ sld.w PTO+PT_CTPC[ep], lp; \ - ldsr lp, SR_CTPC; /* (XXX maybe not used in kernel?) */ \ + ldsr lp, SR_CTPC; \ sld.w PTO+PT_CTPSW[ep], lp; \ - ldsr lp, SR_CTPSW; /* " */ \ + ldsr lp, SR_CTPSW; \ sld.w PTO+PT_CTBP[ep], lp; \ - ldsr lp, SR_CTBP; /* " */ - - -/* Save system registers to the struct pt_regs pointed to by REG. This is a - NMI-specific version, because NMIs save the PC/PSW in a different place - than other interrupt requests. r19 is clobbered. */ -#define SAVE_SYS_REGS_FOR_NMI \ - stsr SR_FEPC, r19; /* user's PC, before NMI */ \ - sst.w r19, PTO+PT_PC[ep]; \ - stsr SR_FEPSW, r19; /* & PSW (XXX save this?) */ \ - sst.w r19, PTO+PT_PSW[ep]; \ - stsr SR_CTPC, r19; /* (XXX maybe not used in kernel?) */ \ - sst.w r19, PTO+PT_CTPC[ep]; \ - stsr SR_CTPSW, r19; /* " */ \ - sst.w r19, PTO+PT_CTPSW[ep]; \ - stsr SR_CTBP, r19; /* " */ \ - sst.w r19, PTO+PT_CTBP[ep]; -/* Restore system registers from the struct pt_regs pointed to by EP. This is - a NMI-specific version, because NMIs save the PC/PSW in a different place - than other interrupt requests. LP is clobbered (it is used as a scratch - register because the POP_STATE macro restores it, and this macro is usually - used inside POP_STATE). */ -#define RESTORE_SYS_REGS_FOR_NMI \ - ldsr lp, SR_FEPC; /* user's PC, before NMI */ \ - sld.w PTO+PT_PC[ep], lp; \ - ldsr lp, SR_FEPSW; /* & PSW (XXX save this?) */ \ - sld.w PTO+PT_PSW[ep], lp; \ - ldsr lp, SR_CTPC; /* (XXX maybe not used in kernel?) */ \ - sld.w PTO+PT_CTPC[ep], lp; \ - ldsr lp, SR_CTPSW; /* " */ \ - sld.w PTO+PT_CTPSW[ep], lp; \ - ldsr lp, SR_CTBP; /* " */ \ - sld.w PTO+PT_CTBP[ep], lp; + ldsr lp, SR_CTBP /* Push register state, except for the stack pointer, on the stack in the form @@ -213,7 +192,7 @@ mov sp, ep; \ sst.w gp, PTO+PT_GPR(GPR_GP)[ep]; \ sst.w lp, PTO+PT_GPR(GPR_LP)[ep]; \ - type ## _STATE_SAVER; + type ## _STATE_SAVER /* Pop a register state, except for the stack pointer, from the struct pt_regs on the stack. */ #define POP_STATE(type) \ @@ -222,161 +201,175 @@ sld.w PTO+PT_GPR(GPR_GP)[ep], gp; \ sld.w PTO+PT_GPR(GPR_LP)[ep], lp; \ sld.w PTO+PT_GPR(GPR_EP)[ep], ep; \ - addi STATE_SAVE_SIZE, sp, sp; /* Clean up our stack space. */ + addi STATE_SAVE_SIZE, sp, sp /* Clean up our stack space. */ -/* Switch to the kernel stack if necessary, and push register state on - the stack in the form of a struct pt_regs. Also load the current - task pointer if switching from user mode. The stack-pointer (r3) - should have already been saved to the memory location SP_SAVE_LOC - (the reason for this is that the interrupt vectors may be beyond a - 22-bit signed offset jump from the actual interrupt handler, and this - allows them to save the stack-pointer and use that register to do an - indirect jump). This macro makes sure that `special' registers, - system registers, and the stack pointer are saved; TYPE identifies - the set of extra registers to be saved as well. SYSCALL_NUM is the - register in which the system-call number this state is for is stored - (r0 if this isn't a system call). Interrupts should already be - disabled when calling this. */ +/* Switch to the kernel stack if necessary, and push register state on the + stack in the form of a struct pt_regs. Also load the current task + pointer if switching from user mode. The stack-pointer (r3) should have + already been saved to the memory location SP_SAVE_LOC (the reason for + this is that the interrupt vectors may be beyond a 22-bit signed offset + jump from the actual interrupt handler, and this allows them to save the + stack-pointer and use that register to do an indirect jump). This macro + makes sure that `special' registers, system registers, and the stack + pointer are saved; TYPE identifies the set of extra registers to be + saved as well. SYSCALL_NUM is the register in which the system-call + number this state is for is stored (r0 if this isn't a system call). + Interrupts should already be disabled when calling this. */ #define SAVE_STATE(type, syscall_num, sp_save_loc) \ - tst1 0, KM; /* See if already in kernel mode. */ \ + tst1 0, KM; /* See if already in kernel mode. */ \ bz 1f; \ - /* Kernel-mode state save. */ \ - ld.w sp_save_loc, sp; /* Reload kernel stack-pointer. */ \ - st.w sp, (PT_GPR(GPR_SP)-PT_SIZE)[sp]; /* Save original SP. */ \ - PUSH_STATE(type); \ - mov 1, r19; /* Was in kernel-mode. */ \ - sst.w r19, PTO+PT_KERNEL_MODE[ep]; /* [ep is set by PUSH_STATE] */ \ - br 2f; \ -1: /* User-mode state save. */ \ - ld.w KSP, sp; /* Switch to kernel stack. */ \ - PUSH_STATE(type); \ - sst.w r0, PTO+PT_KERNEL_MODE[ep]; /* Was in user-mode. */ \ - ld.w sp_save_loc, r19; \ - sst.w r19, PTO+PT_GPR(GPR_SP)[ep]; /* Store user SP. */ \ - mov 1, r19; \ - st.b r19, KM; /* Now we're in kernel-mode. */ \ + ld.w sp_save_loc, sp; /* ... yes, use saved SP. */ \ + br 2f; \ +1: ld.w KSP, sp; /* ... no, switch to kernel stack. */ \ +2: PUSH_STATE(type); \ + ld.b KM, r19; /* Remember old kernel-mode. */ \ + sst.w r19, PTO+PT_KERNEL_MODE[ep]; \ + ld.w sp_save_loc, r19; /* Remember old SP. */ \ + sst.w r19, PTO+PT_GPR(GPR_SP)[ep]; \ + mov 1, r19; /* Now definitely in kernel-mode. */ \ + st.b r19, KM; \ GET_CURRENT_TASK(CURRENT_TASK); /* Fetch the current task pointer. */ \ -2: /* Save away the syscall number. */ \ - sst.w syscall_num, PTO+PT_SYSCALL[ep] + /* Save away the syscall number. */ \ + sst.w syscall_num, PTO+PT_SYSCALL[ep] /* Save register state not normally saved by PUSH_STATE for TYPE. */ #define SAVE_EXTRA_STATE(type) \ mov sp, ep; \ - type ## _EXTRA_STATE_SAVER; + type ## _EXTRA_STATE_SAVER /* Restore register state not normally restored by POP_STATE for TYPE. */ #define RESTORE_EXTRA_STATE(type) \ mov sp, ep; \ - type ## _EXTRA_STATE_RESTORER; + type ## _EXTRA_STATE_RESTORER /* Save any call-clobbered registers not normally saved by PUSH_STATE for TYPE. */ #define SAVE_EXTRA_STATE_FOR_FUNCALL(type) \ mov sp, ep; \ - type ## _FUNCALL_EXTRA_STATE_SAVER; + type ## _FUNCALL_EXTRA_STATE_SAVER /* Restore any call-clobbered registers not normally restored by POP_STATE for TYPE. */ #define RESTORE_EXTRA_STATE_FOR_FUNCALL(type) \ mov sp, ep; \ - type ## _FUNCALL_EXTRA_STATE_RESTORER; + type ## _FUNCALL_EXTRA_STATE_RESTORER -/* These are extra_state_saver/restorer values for a user trap. Note that we - save the argument registers so that restarted syscalls will function - properly (otherwise it wouldn't be necessary), and we must _not_ restore - the return-value registers (so that traps can return a value!), but there - are various options for what happens to other call-clobbered registers, - selected by preprocessor conditionals. */ - -#if TRAPS_PRESERVE_CALL_CLOBBERED_REGS - -/* Traps save/restore all call-clobbered registers (except for rval regs). */ -#define TRAP_STATE_SAVER \ - SAVE_CALL_CLOBBERED_REGS_NO_RVAL; \ - SAVE_SYS_REGS -#define TRAP_STATE_RESTORER \ - RESTORE_CALL_CLOBBERED_REGS_NO_RVAL; \ - RESTORE_SYS_REGS - -#else /* !TRAPS_PRESERVE_CALL_CLOBBERED_REGS */ +/* These are extra_state_saver/restorer values for a user trap. Note + that we save the argument registers so that restarted syscalls will + function properly (otherwise it wouldn't be necessary), and we must + _not_ restore the return-value registers (so that traps can return a + value!), but call-clobbered registers are not saved at all, as the + caller of the syscall function should have saved them. */ +#define TRAP_RET reti /* Traps don't save call-clobbered registers (but do still save arg regs). */ #define TRAP_STATE_SAVER \ - SAVE_ARG_REGS; \ - SAVE_SYS_REGS - -#if TRAPS_ZERO_CALL_CLOBBERED_REGS - -/* Traps zero call-clobbered registers (except for arg/rval regs) before - returning from a system call, to avoid any internal values from leaking out - of the kernel. */ -#define TRAP_STATE_RESTORER \ - ZERO_CALL_CLOBBERED_REGS_NO_ARGS_NO_RVAL; \ - RESTORE_ARG_REGS; \ - RESTORE_SYS_REGS - -#else /* !TRAPS_ZERO_CALL_CLOBBERED_REGS */ - + SAVE_ARG_REGS; \ + SAVE_PC(EIPC) /* When traps return, they just leave call-clobbered registers (except for arg regs) with whatever value they have from the kernel. */ #define TRAP_STATE_RESTORER \ - RESTORE_ARG_REGS; \ - RESTORE_SYS_REGS - -#endif /* TRAPS_ZERO_CALL_CLOBBERED_REGS */ -#endif /* TRAPS_PRESERVE_CALL_CLOBBERED_REGS */ - -/* Save registers not normally saved by traps. */ + RESTORE_ARG_REGS; \ + RESTORE_PC(EIPC) +/* Save registers not normally saved by traps. We need to save r12, even + though it's nominally call-clobbered, because it's used when restarting + a system call (the signal-handling path uses SAVE_EXTRA_STATE, and + expects r12 to be restored when the trap returns). Similarly, we must + save the PSW, so that it's at least in a known state in the the pt_regs + structure. */ #define TRAP_EXTRA_STATE_SAVER \ - SAVE_RVAL_REGS; \ - SAVE_CALL_SAVED_REGS + SAVE_RVAL_REGS; \ + sst.w r12, PTO+PT_GPR(12)[ep]; \ + SAVE_CALL_SAVED_REGS; \ + SAVE_PSW(EIPSW); \ + SAVE_CT_REGS #define TRAP_EXTRA_STATE_RESTORER \ - RESTORE_RVAL_REGS; \ - RESTORE_CALL_SAVED_REGS + RESTORE_RVAL_REGS; \ + sld.w PTO+PT_GPR(12)[ep], r12; \ + RESTORE_CALL_SAVED_REGS; \ + RESTORE_PSW(EIPSW); \ + RESTORE_CT_REGS #define TRAP_FUNCALL_EXTRA_STATE_SAVER \ - SAVE_RVAL_REGS + SAVE_RVAL_REGS #define TRAP_FUNCALL_EXTRA_STATE_RESTORER \ - RESTORE_RVAL_REGS - + RESTORE_RVAL_REGS /* Register saving/restoring for maskable interrupts. */ +#define IRQ_RET reti #define IRQ_STATE_SAVER \ - SAVE_CALL_CLOBBERED_REGS; \ - SAVE_SYS_REGS + SAVE_CALL_CLOBBERED_REGS; \ + SAVE_PC(EIPC); \ + SAVE_PSW(EIPSW) #define IRQ_STATE_RESTORER \ - RESTORE_CALL_CLOBBERED_REGS; \ - RESTORE_SYS_REGS + RESTORE_CALL_CLOBBERED_REGS; \ + RESTORE_PC(EIPC); \ + RESTORE_PSW(EIPSW) #define IRQ_EXTRA_STATE_SAVER \ - SAVE_CALL_SAVED_REGS + SAVE_CALL_SAVED_REGS; \ + SAVE_CT_REGS #define IRQ_EXTRA_STATE_RESTORER \ - RESTORE_CALL_SAVED_REGS + RESTORE_CALL_SAVED_REGS; \ + RESTORE_CT_REGS #define IRQ_FUNCALL_EXTRA_STATE_SAVER /* nothing */ #define IRQ_FUNCALL_EXTRA_STATE_RESTORER /* nothing */ /* Register saving/restoring for non-maskable interrupts. */ +#define NMI_RET reti #define NMI_STATE_SAVER \ - SAVE_CALL_CLOBBERED_REGS; \ - SAVE_SYS_REGS_FOR_NMI + SAVE_CALL_CLOBBERED_REGS; \ + SAVE_PC(FEPC); \ + SAVE_PSW(FEPSW); #define NMI_STATE_RESTORER \ - RESTORE_CALL_CLOBBERED_REGS; \ - RESTORE_SYS_REGS_FOR_NMI + RESTORE_CALL_CLOBBERED_REGS; \ + RESTORE_PC(FEPC); \ + RESTORE_PSW(FEPSW); #define NMI_EXTRA_STATE_SAVER \ - SAVE_CALL_SAVED_REGS + SAVE_CALL_SAVED_REGS; \ + SAVE_CT_REGS #define NMI_EXTRA_STATE_RESTORER \ - RESTORE_CALL_SAVED_REGS + RESTORE_CALL_SAVED_REGS; \ + RESTORE_CT_REGS #define NMI_FUNCALL_EXTRA_STATE_SAVER /* nothing */ #define NMI_FUNCALL_EXTRA_STATE_RESTORER /* nothing */ - -/* Register saving/restoring for a context switch. We don't need to save too - many registers, because context-switching looks like a function call (via - the function `switch_thread'), so callers will save any call-clobbered - registers themselves. The stack pointer and return value are handled by - switch_thread itself. */ + +/* Register saving/restoring for debug traps. */ +#define DBTRAP_RET .long 0x014607E0 /* `dbret', but gas doesn't support it. */ +#define DBTRAP_STATE_SAVER \ + SAVE_CALL_CLOBBERED_REGS; \ + SAVE_PC(DBPC); \ + SAVE_PSW(DBPSW) +#define DBTRAP_STATE_RESTORER \ + RESTORE_CALL_CLOBBERED_REGS; \ + RESTORE_PC(DBPC); \ + RESTORE_PSW(DBPSW) +#define DBTRAP_EXTRA_STATE_SAVER \ + SAVE_CALL_SAVED_REGS; \ + SAVE_CT_REGS +#define DBTRAP_EXTRA_STATE_RESTORER \ + RESTORE_CALL_SAVED_REGS; \ + RESTORE_CT_REGS +#define DBTRAP_FUNCALL_EXTRA_STATE_SAVER /* nothing */ +#define DBTRAP_FUNCALL_EXTRA_STATE_RESTORER /* nothing */ + +/* Register saving/restoring for a context switch. We don't need to save + too many registers, because context-switching looks like a function call + (via the function `switch_thread'), so callers will save any + call-clobbered registers themselves. We do need to save the CT regs, as + they're normally not saved during kernel entry (the kernel doesn't use + them). We save PSW so that interrupt-status state will correctly follow + each thread (mostly NMI vs. normal-IRQ/trap), though for the most part + it doesn't matter since threads are always in almost exactly the same + processor state during a context switch. The stack pointer and return + value are handled by switch_thread itself. */ #define SWITCH_STATE_SAVER \ - SAVE_CALL_SAVED_REGS + SAVE_CALL_SAVED_REGS; \ + SAVE_PSW(PSW); \ + SAVE_CT_REGS #define SWITCH_STATE_RESTORER \ - RESTORE_CALL_SAVED_REGS + RESTORE_CALL_SAVED_REGS; \ + RESTORE_PSW(PSW); \ + RESTORE_CT_REGS /* Restore register state from the struct pt_regs on the stack, switch back @@ -400,24 +393,27 @@ andi _TIF_SIGPENDING, r19, r0; \ bnz 4f; /* Signals to handle, handle them */ \ \ -/* Finally, return to user state. */ \ +/* Return to user state. */ \ 1: st.b r0, KM; /* Now officially in user state. */ \ - POP_STATE(type); \ - st.w sp, KSP; /* Save the kernel stack pointer. */ \ - ld.w PT_GPR(GPR_SP)-PT_SIZE[sp], sp; \ - /* Restore user stack pointer. */ \ - reti; \ \ -/* Return to kernel state. */ \ +/* Final return. The stack-pointer fiddling is not needed when returning \ + to kernel-mode, but they don't hurt, and this way we can share the \ + (somtimes rather lengthy) POP_STATE macro. */ \ 2: POP_STATE(type); \ - reti; \ + st.w sp, KSP; /* Save the kernel stack pointer. */ \ + ld.w PT_GPR(GPR_SP)-PT_SIZE[sp], sp; /* Restore stack pointer. */ \ + type ## _RET; /* Return from the trap/interrupt. */ \ \ /* Call the scheduler before returning from a syscall/trap. */ \ 3: SAVE_EXTRA_STATE_FOR_FUNCALL(type); /* Prepare for funcall. */ \ jarl CSYM(schedule), lp; /* Call scheduler */ \ di; /* The scheduler enables interrupts */\ RESTORE_EXTRA_STATE_FOR_FUNCALL(type); \ - br 1b; \ + GET_CURRENT_THREAD(r18); \ + ld.w TI_FLAGS[r18], r19; \ + andi _TIF_SIGPENDING, r19, r0; \ + bz 1b; /* No signals, return. */ \ + /* Signals to handle, fall through to handle them. */ \ \ /* Handle a signal return. */ \ 4: /* Not all registers are saved by the normal trap/interrupt entry \ @@ -428,13 +424,13 @@ complete register state. Here we save anything not saved by \ the normal entry sequence, so that it may be safely restored \ (in a possibly modified form) after do_signal returns. */ \ - SAVE_EXTRA_STATE(type) /* Save state not saved by entry. */ \ + SAVE_EXTRA_STATE(type); /* Save state not saved by entry. */ \ movea PTO, sp, r6; /* Arg 1: struct pt_regs *regs */ \ mov r0, r7; /* Arg 2: sigset_t *oldset */ \ jarl CSYM(do_signal), lp; /* Handle any signals */ \ di; /* sig handling enables interrupts */ \ RESTORE_EXTRA_STATE(type); /* Restore extra regs. */ \ - br 1b; + br 1b /* Jump to the appropriate function for the system call number in r12 @@ -454,7 +450,7 @@ jmp [r12]; \ /* The syscall number is invalid, return an error. */ \ 1: addi -ENOSYS, r0, r10; \ - jmp [lp]; + jmp [lp] .text @@ -469,7 +465,7 @@ * beyond a 22-bit signed offset jump from the actual interrupt handler, and * this allows them to save the stack-pointer and use that register to do an * indirect jump). - * + * * Syscall protocol: * Syscall number in r12, args in r6-r9 * Return value in r10 @@ -537,18 +533,15 @@ st.w r13, 16[sp] // arg 5 st.w r14, 20[sp] // arg 6 -#if !TRAPS_PRESERVE_CALL_CLOBBERED_REGS // Make sure r13 and r14 are preserved, in case we have to restart a // system call because of a signal (ep has already been set by caller). st.w r13, PTO+PT_GPR(13)[sp] st.w r14, PTO+PT_GPR(13)[sp] mov hilo(ret_from_long_syscall), lp -#endif /* !TRAPS_PRESERVE_CALL_CLOBBERED_REGS */ MAKE_SYS_CALL // Jump to the syscall function. END(syscall_long) -#if !TRAPS_PRESERVE_CALL_CLOBBERED_REGS /* Entry point used to return from a long syscall. Only needed to restore r13/r14 if the general trap mechanism doesnt' do so. */ L_ENTRY(ret_from_long_syscall): @@ -556,7 +549,6 @@ ld.w PTO+PT_GPR(13)[sp], r14 br ret_from_trap // The rest is the same as other traps END(ret_from_long_syscall) -#endif /* !TRAPS_PRESERVE_CALL_CLOBBERED_REGS */ /* These syscalls need access to the struct pt_regs on the stack, so we @@ -564,14 +556,11 @@ L_ENTRY(sys_fork_wrapper): #ifdef CONFIG_MMU - // Save state not saved by entry. This is actually slight overkill; - // it's actually only necessary to save any state restored by - // switch_thread that's not saved by the trap entry. - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. addi SIGCHLD, r0, r6 // Arg 0: flags ld.w PTO+PT_GPR(GPR_SP)[sp], r7 // Arg 1: child SP (use parent's) movea PTO, sp, r8 // Arg 2: parent context - jr CSYM(fork_common) // Do real work (tail-call). + mov hilo(CSYM(fork_common)), r18// Where the real work gets done + br save_extra_state_tramp // Save state and go there #else // fork almost works, enough to trick you into looking elsewhere :-( addi -EINVAL, r0, r10 @@ -580,60 +569,66 @@ END(sys_fork_wrapper) L_ENTRY(sys_vfork_wrapper): - // Save state not saved by entry. This is actually slight overkill; - // it's actually only necessary to save any state restored by - // switch_thread that's not saved by the trap entry. - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. addi CLONE_VFORK | CLONE_VM | SIGCHLD, r0, r6 // Arg 0: flags ld.w PTO+PT_GPR(GPR_SP)[sp], r7 // Arg 1: child SP (use parent's) movea PTO, sp, r8 // Arg 2: parent context - jr CSYM(fork_common) // Do real work (tail-call). + mov hilo(CSYM(fork_common)), r18// Where the real work gets done + br save_extra_state_tramp // Save state and go there END(sys_vfork_wrapper) L_ENTRY(sys_clone_wrapper): - // Save state not saved by entry. This is actually slight overkill; - // it's actually only necessary to save any state restored by - // switch_thread that's not saved by the trap entry. - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. ld.w PTO+PT_GPR(GPR_SP)[sp], r19 // parent's stack pointer cmp r7, r0 // See if child SP arg (arg 1) is 0. cmov z, r19, r7, r7 // ... and use the parent's if so. movea PTO, sp, r8 // Arg 2: parent context - jr CSYM(fork_common) // Do real work (tail-call). + mov hilo(CSYM(fork_common)), r18// Where the real work gets done + br save_extra_state_tramp // Save state and go there END(sys_clone_wrapper) + L_ENTRY(sys_execve_wrapper): movea PTO, sp, r9 // add user context as 4th arg jr CSYM(sys_execve) // Do real work (tail-call). END(sys_execve_wrapper) + L_ENTRY(sys_sigsuspend_wrapper): - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. movea PTO, sp, r7 // add user context as 2nd arg - jarl CSYM(sys_sigsuspend), lp// Do real work. + mov hilo(CSYM(sys_sigsuspend)), r18 // syscall function + jarl save_extra_state_tramp, lp // Save state and do it br restore_extra_regs_and_ret_from_trap END(sys_sigsuspend_wrapper) L_ENTRY(sys_rt_sigsuspend_wrapper): - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. movea PTO, sp, r8 // add user context as 3rd arg - jarl CSYM(sys_rt_sigsuspend), lp // Do real work. + mov hilo(CSYM(sys_rt_sigsuspend)), r18 // syscall function + jarl save_extra_state_tramp, lp // Save state and do it br restore_extra_regs_and_ret_from_trap END(sys_rt_sigsuspend_wrapper) L_ENTRY(sys_sigreturn_wrapper): - SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. movea PTO, sp, r6 // add user context as 1st arg - jarl CSYM(sys_sigreturn), lp // Do real work. + mov hilo(CSYM(sys_sigreturn)), r18 // syscall function + jarl save_extra_state_tramp, lp // Save state and do it br restore_extra_regs_and_ret_from_trap END(sys_sigreturn_wrapper) L_ENTRY(sys_rt_sigreturn_wrapper): SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. movea PTO, sp, r6 // add user context as 1st arg - jarl CSYM(sys_rt_sigreturn), lp // Do real work. + mov hilo(CSYM(sys_rt_sigreturn)), r18 // syscall function + jarl save_extra_state_tramp, lp // Save state and do it br restore_extra_regs_and_ret_from_trap END(sys_rt_sigreturn_wrapper) +/* Save any state not saved by SAVE_STATE(TRAP), and jump to r18. + It's main purpose is to share the rather lengthy code sequence that + SAVE_STATE expands into among the above wrapper functions. */ +L_ENTRY(save_extra_state_tramp): + SAVE_EXTRA_STATE(TRAP) // Save state not saved by entry. + jmp [r18] // Do the work the caller wants +END(save_extra_state_tramp) + + /* * Hardware maskable interrupts. * @@ -658,37 +653,40 @@ shr 20, r6 // shift back, and remove lower nibble add -8, r6 // remove bias for irqs - // If the IRQ index is negative, it's actually one of the exception - // traps below 0x80 (currently, the illegal instruction trap, and - // the `debug trap'). Handle these separately. - bn exception - // Call the high-level interrupt handling code. jarl CSYM(handle_irq), lp - // fall through -/* Entry point used to return from an interrupt (also used by exception - handlers, below). */ -ret_from_irq: RETURN(IRQ) +END(irq) -exception: - mov hilo(ret_from_irq), lp // where the handler should return - cmp -2, r6 - bne 1f - // illegal instruction exception - addi SIGILL, r0, r6 // Arg 0: signal number - mov CURRENT_TASK, r7 // Arg 1: task - jr CSYM(force_sig) // tail call +/* + * Debug trap / illegal-instruction exception + * + * The stack-pointer (r3) should have already been saved to the memory + * location ENTRY_SP (the reason for this is that the interrupt vectors may be + * beyond a 22-bit signed offset jump from the actual interrupt handler, and + * this allows them to save the stack-pointer and use that register to do an + * indirect jump). + */ +G_ENTRY(dbtrap): + SAVE_STATE (DBTRAP, r0, ENTRY_SP)// Save registers. -1: cmp -1, r6 - bne bad_trap_wrapper - // `dbtrap' exception - movea PTO, sp, r6 // Arg 0: user regs - jr CSYM(debug_trap) // tail call + /* Look to see if the preceding instruction was is a dbtrap or not, + to decide which signal we should use. */ + stsr SR_DBPC, r19 // PC following trapping insn + ld.hu -2[r19], r19 + mov SIGTRAP, r6 + ori 0xf840, r0, r20 // DBTRAP insn + cmp r19, r20 // Was this trap caused by DBTRAP? + cmov ne, SIGILL, r6, r6 // Choose signal appropriately -END(irq) + /* Raise the desired signal. */ + mov CURRENT_TASK, r7 // Arg 1: task + jarl CSYM(force_sig), lp // tail call + + RETURN(DBTRAP) +END(dbtrap) /* @@ -711,7 +709,7 @@ Call the generic IRQ handler, with two arguments, the IRQ number, and a pointer to the user registers, to handle the specifics. (we subtract one because the first NMI has code 1). */ - addi FIRST_NMI - 1, r6, r6; + addi FIRST_NMI - 1, r6, r6 jarl CSYM(handle_irq), lp RETURN(NMI) diff -Nru a/arch/v850/kernel/init_task.c b/arch/v850/kernel/init_task.c --- a/arch/v850/kernel/init_task.c Thu Feb 20 23:19:20 2003 +++ b/arch/v850/kernel/init_task.c Thu Feb 20 23:19:20 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/init_task.c -- Initial task/thread structures * - * Copyright (C) 2002 NEC Corporation - * Copyright (C) 2002 Miles Bader + * Copyright (C) 2002,03 NEC Electronics Corporation + * Copyright (C) 2002,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -21,6 +21,7 @@ static struct fs_struct init_fs = INIT_FS; static struct files_struct init_files = INIT_FILES; static struct signal_struct init_signals = INIT_SIGNALS (init_signals); +static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM (init_mm); /* diff -Nru a/arch/v850/kernel/intv.S b/arch/v850/kernel/intv.S --- a/arch/v850/kernel/intv.S Thu Feb 20 23:19:22 2003 +++ b/arch/v850/kernel/intv.S Thu Feb 20 23:19:22 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/intv.S -- Interrupt vectors * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -40,22 +40,19 @@ /* Generic interrupt vectors. */ .section .intv.common, "ax" .balign 0x10 - JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // NMI0 + JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x10 - NMI0 .balign 0x10 - JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // NMI1 + JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x20 - NMI1 .balign 0x10 - JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // NMI2 + JUMP_TO_HANDLER (nmi, NMI_ENTRY_SP) // 0x30 - NMI2 .balign 0x10 - JUMP_TO_HANDLER (trap, ENTRY_SP) // TRAP0n + JUMP_TO_HANDLER (trap, ENTRY_SP) // 0x40 - TRAP0n .balign 0x10 - JUMP_TO_HANDLER (trap, ENTRY_SP) // TRAP1n + JUMP_TO_HANDLER (trap, ENTRY_SP) // 0x50 - TRAP1n .balign 0x10 - JUMP_TO_HANDLER (irq, ENTRY_SP) // illegal insn trap - - .balign 0x10 - JUMP_TO_HANDLER (irq, ENTRY_SP) // DBTRAP insn + JUMP_TO_HANDLER (dbtrap, ENTRY_SP) // 0x60 - Illegal op / DBTRAP insn /* Hardware interrupt vectors. */ diff -Nru a/arch/v850/kernel/irq.c b/arch/v850/kernel/irq.c --- a/arch/v850/kernel/irq.c Thu Feb 20 23:19:23 2003 +++ b/arch/v850/kernel/irq.c Thu Feb 20 23:19:23 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/irq.c -- High-level interrupt handling * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Corporation + * Copyright (C) 2001,02,03 Miles Bader * Copyright (C) 1994-2000 Ralf Baechle * Copyright (C) 1992 Linus Torvalds * @@ -713,3 +713,9 @@ base_irq += interval; } } + +#if defined(CONFIG_PROC_FS) && defined(CONFIG_SYSCTL) +void init_irq_proc(void) +{ +} +#endif /* CONFIG_PROC_FS && CONFIG_SYSCTL */ diff -Nru a/arch/v850/kernel/process.c b/arch/v850/kernel/process.c --- a/arch/v850/kernel/process.c Thu Feb 20 23:19:20 2003 +++ b/arch/v850/kernel/process.c Thu Feb 20 23:19:20 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/process.c -- Arch-dependent process handling * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -75,7 +75,9 @@ set_fs (KERNEL_DS); - /* Clone this thread. */ + /* Clone this thread. Note that we don't pass the clone syscall's + second argument -- it's ignored for calls from kernel mode (the + child's SP is always set to the top of the kernel stack). */ arg0 = flags | CLONE_VM; syscall = __NR_clone; asm volatile ("trap " SYSCALL_SHORT_TRAP @@ -109,7 +111,8 @@ struct task_struct *p, struct pt_regs *regs) { /* Start pushing stuff from the top of the child's kernel stack. */ - unsigned long ksp = (unsigned long)p->thread_info + THREAD_SIZE; + unsigned long orig_ksp = (unsigned long)p->thread_info + THREAD_SIZE; + unsigned long ksp = orig_ksp; /* We push two `state save' stack fames (see entry.S) on the new kernel stack: 1) The innermost one is what switch_thread would have @@ -137,6 +140,19 @@ register (r31), so we make that the place where we want to jump when the child thread begins running. */ child_switch_regs->gpr[GPR_LP] = (v850_reg_t)ret_from_fork; + + if (regs->kernel_mode) + /* Since we're returning to kernel-mode, make sure the child's + stored kernel stack pointer agrees with what the actual + stack pointer will be at that point (the trap return code + always restores the SP, even when returning to + kernel-mode). */ + child_trap_regs->gpr[GPR_SP] = orig_ksp; + else + /* Set the child's user-mode stack-pointer (the name + `stack_start' is a misnomer, it's just the initial SP + value). */ + child_trap_regs->gpr[GPR_SP] = stack_start; /* Thread state for the child (everything else is on the stack). */ p->thread.ksp = ksp; diff -Nru a/arch/v850/kernel/rte_cb_multi.c b/arch/v850/kernel/rte_cb_multi.c --- a/arch/v850/kernel/rte_cb_multi.c Thu Feb 20 23:19:20 2003 +++ b/arch/v850/kernel/rte_cb_multi.c Thu Feb 20 23:19:20 2003 @@ -2,8 +2,8 @@ * include/asm-v850/rte_multi.c -- Support for Multi debugger monitor ROM * on Midas lab RTE-CB series of evaluation boards * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Corporation + * Copyright (C) 2001,02,03 Miles Bader * * This file is subject to the terms and conditions of the GNU General * Public License. See the file COPYING in the main directory of this @@ -23,6 +23,9 @@ the table. */ static long multi_intv_install_table[] = { 0x40, 0x50, /* trap vectors */ +#ifdef CONFIG_RTE_CB_MULTI_DBTRAP + 0x60, /* illegal insn / dbtrap */ +#endif /* Note -- illegal insn trap is used by the debugger. */ 0xD0, 0xE0, 0xF0, /* GINT1 - GINT3 */ 0x240, 0x250, 0x260, 0x270, /* timer D interrupts */ @@ -52,7 +55,7 @@ register unsigned long jr_fixup = (char *)&_intv_start - (char *)dst; register long *ii; - /* Copy interupt vectors as instructed by multi_intv_install_table. */ + /* Copy interrupt vectors as instructed by multi_intv_install_table. */ for (ii = multi_intv_install_table; *ii >= 0; ii++) { /* Copy 16-byte interrupt vector at offset *ii. */ int boffs; diff -Nru a/arch/v850/kernel/signal.c b/arch/v850/kernel/signal.c --- a/arch/v850/kernel/signal.c Thu Feb 20 23:19:24 2003 +++ b/arch/v850/kernel/signal.c Thu Feb 20 23:19:24 2003 @@ -1,8 +1,8 @@ /* * arch/v850/kernel/signal.c -- Signal handling * - * Copyright (C) 2001,02 NEC Corporation - * Copyright (C) 2001,02 Miles Bader + * Copyright (C) 2001,02,03 NEC Electronics Corporation + * Copyright (C) 2001,02,03 Miles Bader * Copyright (C) 1999,2000,2002 Niibe Yutaka & Kaz Kojima * Copyright (C) 1991,1992 Linus Torvalds * @@ -434,7 +434,7 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset, struct pt_regs * regs) { - struct k_sigaction *ka = ¤t->sig->action[sig-1]; + struct k_sigaction *ka = ¤t->sighand->action[sig-1]; /* Are we from a system call? */ if (PT_REGS_SYSCALL (regs)) { diff -Nru a/arch/v850/vmlinux.lds.S b/arch/v850/vmlinux.lds.S --- a/arch/v850/vmlinux.lds.S Thu Feb 20 23:19:22 2003 +++ b/arch/v850/vmlinux.lds.S Thu Feb 20 23:19:22 2003 @@ -24,9 +24,12 @@ /* Interrupt vectors. */ #define INTV_CONTENTS \ + . = ALIGN (0x10) ; \ __intv_start = . ; \ *(.intv.reset) /* Reset vector */ \ + . = __intv_start + 0x10 ; \ *(.intv.common) /* Vectors common to all v850e proc */\ + . = __intv_start + 0x80 ; \ *(.intv.mach) /* Machine-specific int. vectors. */ \ __intv_end = . ; diff -Nru a/arch/x86_64/ia32/ia32_ioctl.c b/arch/x86_64/ia32/ia32_ioctl.c --- a/arch/x86_64/ia32/ia32_ioctl.c Thu Feb 20 23:19:22 2003 +++ b/arch/x86_64/ia32/ia32_ioctl.c Thu Feb 20 23:19:22 2003 @@ -3593,7 +3593,7 @@ IOCTL_TABLE_START /* List here explicitly which ioctl's are known to have - * compatable types passed or none at all... + * compatible types passed or none at all... */ /* Big T */ COMPATIBLE_IOCTL(TCGETA) diff -Nru a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c --- a/arch/x86_64/ia32/sys_ia32.c Thu Feb 20 23:19:21 2003 +++ b/arch/x86_64/ia32/sys_ia32.c Thu Feb 20 23:19:21 2003 @@ -1573,7 +1573,7 @@ return ret; } -/* Handle adjtimex compatability. */ +/* Handle adjtimex compatibility. */ struct timex32 { u32 modes; diff -Nru a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile --- a/arch/x86_64/kernel/Makefile Thu Feb 20 23:19:23 2003 +++ b/arch/x86_64/kernel/Makefile Thu Feb 20 23:19:23 2003 @@ -22,8 +22,6 @@ obj-$(CONFIG_GART_IOMMU) += pci-gart.o aperture.o obj-$(CONFIG_DUMMY_IOMMU) += pci-nommu.o obj-$(CONFIG_MODULES) += module.o -obj-$(CONFIG_PROFILING) += profile.o - $(obj)/bootflag.c: @ln -sf ../../i386/kernel/bootflag.c $(obj)/bootflag.c diff -Nru a/arch/x86_64/kernel/profile.c b/arch/x86_64/kernel/profile.c --- a/arch/x86_64/kernel/profile.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,45 +0,0 @@ -/* - * linux/arch/x86_64/kernel/profile.c - * - * (C) 2002 John Levon - * - */ - -#include -#include -#include -#include -#include - -static struct notifier_block * profile_listeners; -static rwlock_t profile_lock = RW_LOCK_UNLOCKED; - -int register_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_register(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -int unregister_profile_notifier(struct notifier_block * nb) -{ - int err; - write_lock_irq(&profile_lock); - err = notifier_chain_unregister(&profile_listeners, nb); - write_unlock_irq(&profile_lock); - return err; -} - - -void x86_profile_hook(struct pt_regs * regs) -{ - /* we would not even need this lock if - * we had a global cli() on register/unregister - */ - read_lock(&profile_lock); - notifier_call_chain(&profile_listeners, 0, regs); - read_unlock(&profile_lock); -} diff -Nru a/arch/x86_64/kernel/x8664_ksyms.c b/arch/x86_64/kernel/x8664_ksyms.c --- a/arch/x86_64/kernel/x8664_ksyms.c Thu Feb 20 23:19:20 2003 +++ b/arch/x86_64/kernel/x8664_ksyms.c Thu Feb 20 23:19:20 2003 @@ -132,8 +132,6 @@ EXPORT_SYMBOL(rtc_lock); -EXPORT_SYMBOL_GPL(register_profile_notifier); -EXPORT_SYMBOL_GPL(unregister_profile_notifier); EXPORT_SYMBOL_GPL(set_nmi_callback); EXPORT_SYMBOL_GPL(unset_nmi_callback); diff -Nru a/drivers/acorn/block/fd1772.c b/drivers/acorn/block/fd1772.c --- a/drivers/acorn/block/fd1772.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acorn/block/fd1772.c Thu Feb 20 23:19:21 2003 @@ -99,7 +99,7 @@ * Removed the busy wait loop in do_fd_request and replaced * by a routine on tq_immediate; only 11% cpu on a dd off the * raw disc - but the speed is the same. - * 1/ 9/96 - Idea (failed!) - set the 'disable spin-up seqeunce' + * 1/ 9/96 - Idea (failed!) - set the 'disable spin-up sequence' * when we read the track if we know the motor is on; didn't * help - perhaps we have to do it in stepping as well. * Nope. Still doesn't help. diff -Nru a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c --- a/drivers/acpi/dispatcher/dsfield.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/dispatcher/dsfield.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsinit.c b/drivers/acpi/dispatcher/dsinit.c --- a/drivers/acpi/dispatcher/dsinit.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/dispatcher/dsinit.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c --- a/drivers/acpi/dispatcher/dsmethod.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/dispatcher/dsmethod.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c --- a/drivers/acpi/dispatcher/dsmthdat.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/dispatcher/dsmthdat.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c --- a/drivers/acpi/dispatcher/dsobject.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/dispatcher/dsobject.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c --- a/drivers/acpi/dispatcher/dsopcode.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/dispatcher/dsopcode.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c --- a/drivers/acpi/dispatcher/dsutils.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/dispatcher/dsutils.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dswexec.c b/drivers/acpi/dispatcher/dswexec.c --- a/drivers/acpi/dispatcher/dswexec.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/dispatcher/dswexec.c Thu Feb 20 23:19:24 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c --- a/drivers/acpi/dispatcher/dswload.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/dispatcher/dswload.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dswscope.c b/drivers/acpi/dispatcher/dswscope.c --- a/drivers/acpi/dispatcher/dswscope.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/dispatcher/dswscope.c Thu Feb 20 23:19:24 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c --- a/drivers/acpi/dispatcher/dswstate.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/dispatcher/dswstate.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/events/evevent.c b/drivers/acpi/events/evevent.c --- a/drivers/acpi/events/evevent.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/events/evevent.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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 diff -Nru a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c --- a/drivers/acpi/events/evgpe.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/events/evgpe.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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 @@ -255,7 +274,7 @@ ACPI_HIDWORD (acpi_gbl_gpe_block_info[gpe_block].block_address->address), ACPI_LODWORD (acpi_gbl_gpe_block_info[gpe_block].block_address->address))); - ACPI_REPORT_INFO (("GPE Block%d defined as GPE%d to GPE%d\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d defined as GPE%d to GPE%d\n", (s32) gpe_block, (u32) acpi_gbl_gpe_block_info[gpe_block].block_base_number, (u32) (acpi_gbl_gpe_block_info[gpe_block].block_base_number + @@ -307,7 +326,7 @@ void **return_value) { u32 gpe_number; - u32 gpe_number_index; + struct acpi_gpe_number_info *gpe_number_info; char name[ACPI_NAME_SIZE + 1]; u8 type; acpi_status status; @@ -357,19 +376,22 @@ /* Get GPE index and ensure that we have a valid GPE number */ - gpe_number_index = acpi_ev_get_gpe_number_index (gpe_number); - if (gpe_number_index == ACPI_GPE_INVALID) { + gpe_number_info = acpi_ev_get_gpe_number_info (gpe_number); + if (!gpe_number_info) { /* Not valid, all we can do here is ignore it */ + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "GPE number associated with method is not valid %s\n", + name)); return (AE_OK); } /* - * Now we can add this information to the gpe_info block + * Now we can add this information to the gpe_number_info block * for use during dispatch of this GPE. */ - acpi_gbl_gpe_number_info [gpe_number_index].type = type; - acpi_gbl_gpe_number_info [gpe_number_index].method_node = (struct acpi_namespace_node *) obj_handle; + gpe_number_info->type = type; + gpe_number_info->method_node = (struct acpi_namespace_node *) obj_handle; /* * Enable the GPE (SCIs should be disabled at this point) @@ -532,7 +554,7 @@ { u32 gpe_number = (u32) ACPI_TO_INTEGER (context); u32 gpe_number_index; - struct acpi_gpe_number_info gpe_info; + struct acpi_gpe_number_info gpe_number_info; acpi_status status; @@ -553,26 +575,26 @@ return_VOID; } - gpe_info = acpi_gbl_gpe_number_info [gpe_number_index]; + gpe_number_info = acpi_gbl_gpe_number_info [gpe_number_index]; status = acpi_ut_release_mutex (ACPI_MTX_EVENTS); if (ACPI_FAILURE (status)) { return_VOID; } - if (gpe_info.method_node) { + if (gpe_number_info.method_node) { /* * Invoke the GPE Method (_Lxx, _Exx): * (Evaluate the _Lxx/_Exx control method that corresponds to this GPE.) */ - status = acpi_ns_evaluate_by_handle (gpe_info.method_node, NULL, NULL); + status = acpi_ns_evaluate_by_handle (gpe_number_info.method_node, NULL, NULL); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("%s while evaluating method [%4.4s] for GPE[%2.2X]\n", acpi_format_exception (status), - gpe_info.method_node->name.ascii, gpe_number)); + gpe_number_info.method_node->name.ascii, gpe_number)); } } - if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) { + if (gpe_number_info.type & ACPI_EVENT_LEVEL_TRIGGERED) { /* * GPE is level-triggered, we clear the GPE status bit after handling * the event. @@ -609,31 +631,28 @@ acpi_ev_gpe_dispatch ( u32 gpe_number) { - u32 gpe_number_index; - struct acpi_gpe_number_info *gpe_info; + struct acpi_gpe_number_info *gpe_number_info; acpi_status status; ACPI_FUNCTION_TRACE ("ev_gpe_dispatch"); - gpe_number_index = acpi_ev_get_gpe_number_index (gpe_number); - if (gpe_number_index == ACPI_GPE_INVALID) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "GPE[%X] is not a valid event\n", gpe_number)); - return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); - } - /* - * We don't have to worry about mutex on gpe_info because we are + * We don't have to worry about mutex on gpe_number_info because we are * executing at interrupt level. */ - gpe_info = &acpi_gbl_gpe_number_info [gpe_number_index]; + gpe_number_info = acpi_ev_get_gpe_number_info (gpe_number); + if (!gpe_number_info) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "GPE[%X] is not a valid event\n", gpe_number)); + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); + } /* * If edge-triggered, clear the GPE status bit now. Note that * level-triggered events are cleared after the GPE is serviced. */ - if (gpe_info->type & ACPI_EVENT_EDGE_TRIGGERED) { + if (gpe_number_info->type & ACPI_EVENT_EDGE_TRIGGERED) { status = acpi_hw_clear_gpe (gpe_number); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to clear GPE[%2.2X]\n", gpe_number)); @@ -648,12 +667,12 @@ * If there is neither a handler nor a method, we disable the level to * prevent further events from coming in here. */ - if (gpe_info->handler) { + if (gpe_number_info->handler) { /* Invoke the installed handler (at interrupt level) */ - gpe_info->handler (gpe_info->context); + gpe_number_info->handler (gpe_number_info->context); } - else if (gpe_info->method_node) { + else if (gpe_number_info->method_node) { /* * Disable GPE, so it doesn't keep firing before the method has a * chance to run. @@ -692,7 +711,7 @@ /* * It is now safe to clear level-triggered evnets. */ - if (gpe_info->type & ACPI_EVENT_LEVEL_TRIGGERED) { + if (gpe_number_info->type & ACPI_EVENT_LEVEL_TRIGGERED) { status = acpi_hw_clear_gpe (gpe_number); if (ACPI_FAILURE (status)) { ACPI_REPORT_ERROR (("acpi_ev_gpe_dispatch: Unable to clear GPE[%2.2X]\n", gpe_number)); diff -Nru a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c --- a/drivers/acpi/events/evmisc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/events/evmisc.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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 @@ -67,27 +86,53 @@ /******************************************************************************* * - * FUNCTION: acpi_ev_get_gpe_register_index + * FUNCTION: acpi_ev_get_gpe_register_info * * PARAMETERS: gpe_number - Raw GPE number * - * RETURN: None. + * RETURN: Pointer to the info struct for this GPE register. * * DESCRIPTION: Returns the register index (index into the GPE register info * table) associated with this GPE. * ******************************************************************************/ -u32 -acpi_ev_get_gpe_register_index ( +struct acpi_gpe_register_info * +acpi_ev_get_gpe_register_info ( + u32 gpe_number) +{ + + if (gpe_number > acpi_gbl_gpe_number_max) { + return (NULL); + } + + return (&acpi_gbl_gpe_register_info [ACPI_DIV_8 (acpi_gbl_gpe_number_to_index[gpe_number].number_index)]); +} + + +/******************************************************************************* + * + * FUNCTION: acpi_ev_get_gpe_number_info + * + * PARAMETERS: gpe_number - Raw GPE number + * + * RETURN: None. + * + * DESCRIPTION: Returns the number index (index into the GPE number info table) + * associated with this GPE. + * + ******************************************************************************/ + +struct acpi_gpe_number_info * +acpi_ev_get_gpe_number_info ( u32 gpe_number) { if (gpe_number > acpi_gbl_gpe_number_max) { - return (ACPI_GPE_INVALID); + return (NULL); } - return (ACPI_DIV_8 (acpi_gbl_gpe_number_to_index[gpe_number].number_index)); + return (&acpi_gbl_gpe_number_info [acpi_gbl_gpe_number_to_index[gpe_number].number_index]); } diff -Nru a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c --- a/drivers/acpi/events/evregion.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/events/evregion.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/events/evrgnini.c b/drivers/acpi/events/evrgnini.c --- a/drivers/acpi/events/evrgnini.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/events/evrgnini.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/events/evsci.c b/drivers/acpi/events/evsci.c --- a/drivers/acpi/events/evsci.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/events/evsci.c Thu Feb 20 23:19:22 2003 @@ -6,21 +6,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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 diff -Nru a/drivers/acpi/events/evxface.c b/drivers/acpi/events/evxface.c --- a/drivers/acpi/events/evxface.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/events/evxface.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -473,7 +492,7 @@ void *context) { acpi_status status; - u32 gpe_number_index; + struct acpi_gpe_number_info *gpe_number_info; ACPI_FUNCTION_TRACE ("acpi_install_gpe_handler"); @@ -487,8 +506,8 @@ /* Ensure that we have a valid GPE number */ - gpe_number_index = acpi_ev_get_gpe_number_index (gpe_number); - if (gpe_number_index == ACPI_GPE_INVALID) { + gpe_number_info = acpi_ev_get_gpe_number_info (gpe_number); + if (!gpe_number_info) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -499,16 +518,16 @@ /* Make sure that there isn't a handler there already */ - if (acpi_gbl_gpe_number_info[gpe_number_index].handler) { + if (gpe_number_info->handler) { status = AE_ALREADY_EXISTS; goto cleanup; } /* Install the handler */ - acpi_gbl_gpe_number_info[gpe_number_index].handler = handler; - acpi_gbl_gpe_number_info[gpe_number_index].context = context; - acpi_gbl_gpe_number_info[gpe_number_index].type = (u8) type; + gpe_number_info->handler = handler; + gpe_number_info->context = context; + gpe_number_info->type = (u8) type; /* Clear the GPE (of stale events), the enable it */ @@ -545,7 +564,7 @@ acpi_gpe_handler handler) { acpi_status status; - u32 gpe_number_index; + struct acpi_gpe_number_info *gpe_number_info; ACPI_FUNCTION_TRACE ("acpi_remove_gpe_handler"); @@ -559,8 +578,8 @@ /* Ensure that we have a valid GPE number */ - gpe_number_index = acpi_ev_get_gpe_number_index (gpe_number); - if (gpe_number_index == ACPI_GPE_INVALID) { + gpe_number_info = acpi_ev_get_gpe_number_info (gpe_number); + if (!gpe_number_info) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -578,7 +597,7 @@ /* Make sure that the installed handler is the same */ - if (acpi_gbl_gpe_number_info[gpe_number_index].handler != handler) { + if (gpe_number_info->handler != handler) { (void) acpi_hw_enable_gpe (gpe_number); status = AE_BAD_PARAMETER; goto cleanup; @@ -586,8 +605,8 @@ /* Remove the handler */ - acpi_gbl_gpe_number_info[gpe_number_index].handler = NULL; - acpi_gbl_gpe_number_info[gpe_number_index].context = NULL; + gpe_number_info->handler = NULL; + gpe_number_info->context = NULL; cleanup: diff -Nru a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c --- a/drivers/acpi/events/evxfevnt.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/events/evxfevnt.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/events/evxfregn.c b/drivers/acpi/events/evxfregn.c --- a/drivers/acpi/events/evxfregn.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/events/evxfregn.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c --- a/drivers/acpi/executer/exconfig.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/executer/exconfig.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -313,7 +332,6 @@ break; - case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: diff -Nru a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c --- a/drivers/acpi/executer/exconvrt.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/executer/exconvrt.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/excreate.c b/drivers/acpi/executer/excreate.c --- a/drivers/acpi/executer/excreate.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/excreate.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c --- a/drivers/acpi/executer/exdump.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/executer/exdump.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exfield.c b/drivers/acpi/executer/exfield.c --- a/drivers/acpi/executer/exfield.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/executer/exfield.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exfldio.c b/drivers/acpi/executer/exfldio.c --- a/drivers/acpi/executer/exfldio.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exfldio.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c --- a/drivers/acpi/executer/exmisc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exmisc.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c --- a/drivers/acpi/executer/exmutex.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exmutex.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exnames.c b/drivers/acpi/executer/exnames.c --- a/drivers/acpi/executer/exnames.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exnames.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exoparg1.c b/drivers/acpi/executer/exoparg1.c --- a/drivers/acpi/executer/exoparg1.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exoparg1.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c --- a/drivers/acpi/executer/exoparg2.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/executer/exoparg2.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exoparg3.c b/drivers/acpi/executer/exoparg3.c --- a/drivers/acpi/executer/exoparg3.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/executer/exoparg3.c Thu Feb 20 23:19:19 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exoparg6.c b/drivers/acpi/executer/exoparg6.c --- a/drivers/acpi/executer/exoparg6.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exoparg6.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c --- a/drivers/acpi/executer/exprep.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exprep.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exregion.c b/drivers/acpi/executer/exregion.c --- a/drivers/acpi/executer/exregion.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exregion.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exresnte.c b/drivers/acpi/executer/exresnte.c --- a/drivers/acpi/executer/exresnte.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exresnte.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c --- a/drivers/acpi/executer/exresolv.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/executer/exresolv.c Thu Feb 20 23:19:21 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exresop.c b/drivers/acpi/executer/exresop.c --- a/drivers/acpi/executer/exresop.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exresop.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -345,13 +364,6 @@ type_needed = ACPI_TYPE_EVENT; break; - case ARGI_REGION: - - /* Need an operand of type ACPI_TYPE_REGION */ - - type_needed = ACPI_TYPE_REGION; - break; - case ARGI_PACKAGE: /* Package */ /* Need an operand of type ACPI_TYPE_PACKAGE */ @@ -458,6 +470,37 @@ goto next_operand; + case ARGI_BUFFER_OR_STRING: + + /* Need an operand of type STRING or BUFFER */ + + switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { + case ACPI_TYPE_STRING: + case ACPI_TYPE_BUFFER: + + /* Valid operand */ + break; + + case ACPI_TYPE_INTEGER: + + /* Highest priority conversion is to type Buffer */ + + status = acpi_ex_convert_to_buffer (obj_desc, stack_ptr, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Needed [Integer/String/Buffer], found [%s] %p\n", + acpi_ut_get_object_type_name (obj_desc), obj_desc)); + + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } + goto next_operand; + + case ARGI_DATAOBJECT: /* * ARGI_DATAOBJECT is only used by the size_of operator. @@ -477,7 +520,7 @@ default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Needed [Buf/Str/Pkg], found [%s] %p\n", + "Needed [Buffer/String/Package/Reference], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); @@ -499,7 +542,30 @@ default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Needed [Buf/Str/Pkg], found [%s] %p\n", + "Needed [Buffer/String/Package], found [%s] %p\n", + acpi_ut_get_object_type_name (obj_desc), obj_desc)); + + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } + goto next_operand; + + + case ARGI_REGION_OR_FIELD: + + /* Need an operand of type ACPI_TYPE_REGION or a FIELD in a region */ + + switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { + case ACPI_TYPE_REGION: + case ACPI_TYPE_LOCAL_REGION_FIELD: + case ACPI_TYPE_LOCAL_BANK_FIELD: + case ACPI_TYPE_LOCAL_INDEX_FIELD: + + /* Valid operand */ + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Needed [Region/region_field], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); diff -Nru a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c --- a/drivers/acpi/executer/exstore.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/executer/exstore.c Thu Feb 20 23:19:21 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exstoren.c b/drivers/acpi/executer/exstoren.c --- a/drivers/acpi/executer/exstoren.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exstoren.c Thu Feb 20 23:19:20 2003 @@ -7,21 +7,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exstorob.c b/drivers/acpi/executer/exstorob.c --- a/drivers/acpi/executer/exstorob.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/executer/exstorob.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exsystem.c b/drivers/acpi/executer/exsystem.c --- a/drivers/acpi/executer/exsystem.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/executer/exsystem.c Thu Feb 20 23:19:22 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/executer/exutils.c b/drivers/acpi/executer/exutils.c --- a/drivers/acpi/executer/exutils.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/executer/exutils.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/hardware/hwacpi.c b/drivers/acpi/hardware/hwacpi.c --- a/drivers/acpi/hardware/hwacpi.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/hardware/hwacpi.c Thu Feb 20 23:19:19 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c --- a/drivers/acpi/hardware/hwgpe.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/hardware/hwgpe.c Thu Feb 20 23:19:19 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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 @@ -67,34 +86,34 @@ u32 gpe_number) { u32 in_byte; - u32 register_index; - u8 bit_mask; acpi_status status; + struct acpi_gpe_register_info *gpe_register_info; ACPI_FUNCTION_ENTRY (); - /* Translate GPE number to index into global registers array. */ + /* Get the info block for the entire GPE register */ - register_index = acpi_ev_get_gpe_register_index (gpe_number); - - /* Get the register bitmask for this GPE */ - - bit_mask = acpi_hw_get_gpe_bit_mask (gpe_number); + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* * Read the current value of the register, set the appropriate bit * to enable the GPE, and write out the new register. */ status = acpi_hw_low_level_read (8, &in_byte, - &acpi_gbl_gpe_register_info[register_index].enable_address, 0); + &gpe_register_info->enable_address, 0); if (ACPI_FAILURE (status)) { return (status); } - status = acpi_hw_low_level_write (8, (in_byte | bit_mask), - &acpi_gbl_gpe_register_info[register_index].enable_address, 0); + /* Write with the new GPE bit enabled */ + + status = acpi_hw_low_level_write (8, (in_byte | acpi_hw_get_gpe_bit_mask (gpe_number)), + &gpe_register_info->enable_address, 0); return (status); } @@ -117,25 +136,23 @@ acpi_hw_enable_gpe_for_wakeup ( u32 gpe_number) { - u32 register_index; - u8 bit_mask; + struct acpi_gpe_register_info *gpe_register_info; ACPI_FUNCTION_ENTRY (); - /* Translate GPE number to index into global registers array. */ - - register_index = acpi_ev_get_gpe_register_index (gpe_number); - - /* Get the register bitmask for this GPE */ + /* Get the info block for the entire GPE register */ - bit_mask = acpi_hw_get_gpe_bit_mask (gpe_number); + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return; + } /* * Set the bit so we will not disable this when sleeping */ - acpi_gbl_gpe_register_info[register_index].wake_enable |= bit_mask; + gpe_register_info->wake_enable |= acpi_hw_get_gpe_bit_mask (gpe_number); } @@ -156,34 +173,34 @@ u32 gpe_number) { u32 in_byte; - u32 register_index; - u8 bit_mask; acpi_status status; + struct acpi_gpe_register_info *gpe_register_info; ACPI_FUNCTION_ENTRY (); - /* Translate GPE number to index into global registers array. */ - - register_index = acpi_ev_get_gpe_register_index (gpe_number); + /* Get the info block for the entire GPE register */ - /* Get the register bitmask for this GPE */ - - bit_mask = acpi_hw_get_gpe_bit_mask (gpe_number); + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* * Read the current value of the register, clear the appropriate bit, * and write out the new register value to disable the GPE. */ status = acpi_hw_low_level_read (8, &in_byte, - &acpi_gbl_gpe_register_info[register_index].enable_address, 0); + &gpe_register_info->enable_address, 0); if (ACPI_FAILURE (status)) { return (status); } - status = acpi_hw_low_level_write (8, (in_byte & ~bit_mask), - &acpi_gbl_gpe_register_info[register_index].enable_address, 0); + /* Write the byte with this GPE bit cleared */ + + status = acpi_hw_low_level_write (8, (in_byte & ~(acpi_hw_get_gpe_bit_mask (gpe_number))), + &gpe_register_info->enable_address, 0); if (ACPI_FAILURE (status)) { return (status); } @@ -210,25 +227,23 @@ acpi_hw_disable_gpe_for_wakeup ( u32 gpe_number) { - u32 register_index; - u8 bit_mask; + struct acpi_gpe_register_info *gpe_register_info; ACPI_FUNCTION_ENTRY (); - /* Translate GPE number to index into global registers array. */ - - register_index = acpi_ev_get_gpe_register_index (gpe_number); - - /* Get the register bitmask for this GPE */ + /* Get the info block for the entire GPE register */ - bit_mask = acpi_hw_get_gpe_bit_mask (gpe_number); + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return; + } /* * Clear the bit so we will disable this when sleeping */ - acpi_gbl_gpe_register_info[register_index].wake_enable &= ~bit_mask; + gpe_register_info->wake_enable &= ~(acpi_hw_get_gpe_bit_mask (gpe_number)); } @@ -248,28 +263,26 @@ acpi_hw_clear_gpe ( u32 gpe_number) { - u32 register_index; - u8 bit_mask; acpi_status status; + struct acpi_gpe_register_info *gpe_register_info; ACPI_FUNCTION_ENTRY (); - /* Translate GPE number to index into global registers array. */ - - register_index = acpi_ev_get_gpe_register_index (gpe_number); - - /* Get the register bitmask for this GPE */ + /* Get the info block for the entire GPE register */ - bit_mask = acpi_hw_get_gpe_bit_mask (gpe_number); + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* * Write a one to the appropriate bit in the status register to * clear this GPE. */ - status = acpi_hw_low_level_write (8, bit_mask, - &acpi_gbl_gpe_register_info[register_index].status_address, 0); + status = acpi_hw_low_level_write (8, acpi_hw_get_gpe_bit_mask (gpe_number), + &gpe_register_info->status_address, 0); return (status); } @@ -292,11 +305,11 @@ u32 gpe_number, acpi_event_status *event_status) { - u32 in_byte = 0; - u32 register_index = 0; - u8 bit_mask = 0; + u32 in_byte; + u8 bit_mask; struct acpi_gpe_register_info *gpe_register_info; acpi_status status; + acpi_event_status local_event_status = 0; ACPI_FUNCTION_ENTRY (); @@ -306,12 +319,12 @@ return (AE_BAD_PARAMETER); } - (*event_status) = 0; + /* Get the info block for the entire GPE register */ - /* Translate GPE number to index into global registers array. */ - - register_index = acpi_ev_get_gpe_register_index (gpe_number); - gpe_register_info = &acpi_gbl_gpe_register_info[register_index]; + gpe_register_info = acpi_ev_get_gpe_register_info (gpe_number); + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* Get the register bitmask for this GPE */ @@ -325,13 +338,13 @@ } if (bit_mask & in_byte) { - (*event_status) |= ACPI_EVENT_FLAG_ENABLED; + local_event_status |= ACPI_EVENT_FLAG_ENABLED; } /* GPE Enabled for wake? */ if (bit_mask & gpe_register_info->wake_enable) { - (*event_status) |= ACPI_EVENT_FLAG_WAKE_ENABLED; + local_event_status |= ACPI_EVENT_FLAG_WAKE_ENABLED; } /* GPE active (set)? */ @@ -342,8 +355,12 @@ } if (bit_mask & in_byte) { - (*event_status) |= ACPI_EVENT_FLAG_SET; + local_event_status |= ACPI_EVENT_FLAG_SET; } + + /* Set return value */ + + (*event_status) = local_event_status; return (AE_OK); } @@ -378,7 +395,12 @@ for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* Get the info block for the entire GPE register */ + gpe_register_info = &acpi_gbl_gpe_register_info[i]; + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* * Read the enabled status of all GPEs. We @@ -430,7 +452,12 @@ for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* Get the info block for the entire GPE register */ + gpe_register_info = &acpi_gbl_gpe_register_info[i]; + if (!gpe_register_info) { + return (AE_BAD_PARAMETER); + } /* * We previously stored the enabled status of all GPEs. diff -Nru a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c --- a/drivers/acpi/hardware/hwregs.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/hardware/hwregs.c Thu Feb 20 23:19:23 2003 @@ -7,21 +7,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c --- a/drivers/acpi/hardware/hwsleep.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/hardware/hwsleep.c Thu Feb 20 23:19:19 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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 diff -Nru a/drivers/acpi/hardware/hwtimer.c b/drivers/acpi/hardware/hwtimer.c --- a/drivers/acpi/hardware/hwtimer.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/hardware/hwtimer.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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 diff -Nru a/drivers/acpi/namespace/nsaccess.c b/drivers/acpi/namespace/nsaccess.c --- a/drivers/acpi/namespace/nsaccess.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/namespace/nsaccess.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -100,6 +119,18 @@ * initial value, create the initial value. */ if (init_val->val) { + acpi_string val; + + status = acpi_os_predefined_override(init_val, &val); + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not override predefined %s\n", + init_val->name)); + } + + if (!val) { + val = init_val->val; + } + /* * Entry requests an initial value, allocate a * descriptor for it. @@ -118,7 +149,7 @@ switch (init_val->type) { case ACPI_TYPE_METHOD: obj_desc->method.param_count = - (u8) ACPI_STRTOUL (init_val->val, NULL, 10); + (u8) ACPI_STRTOUL (val, NULL, 10); obj_desc->common.flags |= AOPOBJ_DATA_VALID; #if defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY) @@ -132,7 +163,7 @@ case ACPI_TYPE_INTEGER: obj_desc->integer.value = - (acpi_integer) ACPI_STRTOUL (init_val->val, NULL, 10); + (acpi_integer) ACPI_STRTOUL (val, NULL, 10); break; @@ -141,8 +172,8 @@ /* * Build an object around the static string */ - obj_desc->string.length = (u32) ACPI_STRLEN (init_val->val); - obj_desc->string.pointer = init_val->val; + obj_desc->string.length = (u32) ACPI_STRLEN (val); + obj_desc->string.pointer = val; obj_desc->common.flags |= AOPOBJ_STATIC_POINTER; break; @@ -151,7 +182,7 @@ obj_desc->mutex.node = new_node; obj_desc->mutex.sync_level = - (u16) ACPI_STRTOUL (init_val->val, NULL, 10); + (u16) ACPI_STRTOUL (val, NULL, 10); if (ACPI_STRCMP (init_val->name, "_GL_") == 0) { /* diff -Nru a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c --- a/drivers/acpi/namespace/nsalloc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/namespace/nsalloc.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c --- a/drivers/acpi/namespace/nsdump.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/namespace/nsdump.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsdumpdv.c b/drivers/acpi/namespace/nsdumpdv.c --- a/drivers/acpi/namespace/nsdumpdv.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/namespace/nsdumpdv.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nseval.c b/drivers/acpi/namespace/nseval.c --- a/drivers/acpi/namespace/nseval.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/namespace/nseval.c Thu Feb 20 23:19:21 2003 @@ -6,21 +6,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c --- a/drivers/acpi/namespace/nsinit.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/namespace/nsinit.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsload.c b/drivers/acpi/namespace/nsload.c --- a/drivers/acpi/namespace/nsload.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/namespace/nsload.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsnames.c b/drivers/acpi/namespace/nsnames.c --- a/drivers/acpi/namespace/nsnames.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/namespace/nsnames.c Thu Feb 20 23:19:24 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsobject.c b/drivers/acpi/namespace/nsobject.c --- a/drivers/acpi/namespace/nsobject.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/namespace/nsobject.c Thu Feb 20 23:19:21 2003 @@ -6,21 +6,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsparse.c b/drivers/acpi/namespace/nsparse.c --- a/drivers/acpi/namespace/nsparse.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/namespace/nsparse.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c --- a/drivers/acpi/namespace/nssearch.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/namespace/nssearch.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c --- a/drivers/acpi/namespace/nsutils.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/namespace/nsutils.c Thu Feb 20 23:19:21 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nswalk.c b/drivers/acpi/namespace/nswalk.c --- a/drivers/acpi/namespace/nswalk.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/namespace/nswalk.c Thu Feb 20 23:19:24 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c --- a/drivers/acpi/namespace/nsxfeval.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/namespace/nsxfeval.c Thu Feb 20 23:19:24 2003 @@ -6,21 +6,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c --- a/drivers/acpi/namespace/nsxfname.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/namespace/nsxfname.c Thu Feb 20 23:19:20 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/namespace/nsxfobj.c b/drivers/acpi/namespace/nsxfobj.c --- a/drivers/acpi/namespace/nsxfobj.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/namespace/nsxfobj.c Thu Feb 20 23:19:19 2003 @@ -6,21 +6,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -140,7 +159,7 @@ *ret_handle = acpi_ns_convert_entry_to_handle (acpi_ns_get_parent_node (node)); - /* Return exeption if parent is null */ + /* Return exception if parent is null */ if (!acpi_ns_get_parent_node (node)) { status = AE_NULL_ENTRY; diff -Nru a/drivers/acpi/numa.c b/drivers/acpi/numa.c --- a/drivers/acpi/numa.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/numa.c Thu Feb 20 23:19:23 2003 @@ -1,7 +1,7 @@ /* * acpi_numa.c - ACPI NUMA support * - * Copyright (C) 2002 Takayoshi Kochi + * Copyright (C) 2002 Takayoshi Kochi * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c --- a/drivers/acpi/osl.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/osl.c Thu Feb 20 23:19:23 2003 @@ -203,6 +203,26 @@ return AE_OK; } +#define ACPI_MAX_OVERRIDE_LEN 100 + +static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN]; + +acpi_status +acpi_os_predefined_override (const struct acpi_predefined_names *init_val, + acpi_string *new_val) +{ + if (!init_val || !new_val) + return AE_BAD_PARAMETER; + + *new_val = NULL; + if (!memcmp (init_val->name, "_OS_", 4) && strlen(acpi_os_name)) { + printk(KERN_INFO PREFIX "Overriding _OS definition\n"); + *new_val = acpi_os_name; + } + + return AE_OK; +} + acpi_status acpi_os_table_override (struct acpi_table_header *existing_table, struct acpi_table_header **new_table) @@ -223,6 +243,13 @@ acpi_status acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context) { + /* + * Ignore the irq from the core, and use the value in our copy of the + * FADT. It may not be the same if an interrupt source override exists + * for the SCI. + */ + irq = acpi_fadt.sci_int; + #ifdef CONFIG_IA64 irq = gsi_to_vector(irq); #endif @@ -847,3 +874,28 @@ return AE_OK; } + +int __init +acpi_os_name_setup(char *str) +{ + char *p = acpi_os_name; + int count = ACPI_MAX_OVERRIDE_LEN-1; + + if (!str || !*str) + return 0; + + for (; count-- && str && *str; str++) { + if (isalnum(*str) || *str == ' ') + *p++ = *str; + else if (*str == '\'' || *str == '"') + continue; + else + break; + } + *p = 0; + + return 1; + +} + +__setup("acpi_os_name=", acpi_os_name_setup); diff -Nru a/drivers/acpi/parser/psargs.c b/drivers/acpi/parser/psargs.c --- a/drivers/acpi/parser/psargs.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/parser/psargs.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/psopcode.c b/drivers/acpi/parser/psopcode.c --- a/drivers/acpi/parser/psopcode.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/parser/psopcode.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ @@ -258,7 +277,7 @@ #define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE #define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) +#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION_OR_FIELD,ARGI_TARGETREF) #define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_ANYTYPE) #define ARGI_LOCAL0 ARG_NONE #define ARGI_LOCAL1 ARG_NONE @@ -272,7 +291,7 @@ #define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) #define ARGI_METHOD_OP ARGI_INVALID_OPCODE #define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE -#define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFERSTRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFER_OR_STRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_MUTEX_OP ARGI_INVALID_OPCODE diff -Nru a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c --- a/drivers/acpi/parser/psparse.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/parser/psparse.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/psscope.c b/drivers/acpi/parser/psscope.c --- a/drivers/acpi/parser/psscope.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/parser/psscope.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/pstree.c b/drivers/acpi/parser/pstree.c --- a/drivers/acpi/parser/pstree.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/parser/pstree.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/psutils.c b/drivers/acpi/parser/psutils.c --- a/drivers/acpi/parser/psutils.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/parser/psutils.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/pswalk.c b/drivers/acpi/parser/pswalk.c --- a/drivers/acpi/parser/pswalk.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/parser/pswalk.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/parser/psxface.c b/drivers/acpi/parser/psxface.c --- a/drivers/acpi/parser/psxface.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/parser/psxface.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c --- a/drivers/acpi/pci_irq.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/pci_irq.c Thu Feb 20 23:19:21 2003 @@ -351,8 +351,10 @@ printk(" - using IRQ %d\n", dev->irq); return_VALUE(dev->irq); } - else + else { + printk("\n"); return_VALUE(0); + } } dev->irq = irq; diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c --- a/drivers/acpi/pci_link.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/pci_link.c Thu Feb 20 23:19:19 2003 @@ -306,13 +306,26 @@ memset(&resource, 0, sizeof(resource)); /* NOTE: PCI interrupts are always level / active_low / shared. */ - resource.res.id = ACPI_RSTYPE_IRQ; - resource.res.length = sizeof(struct acpi_resource); - resource.res.data.irq.edge_level = ACPI_LEVEL_SENSITIVE; - resource.res.data.irq.active_high_low = ACPI_ACTIVE_LOW; - resource.res.data.irq.shared_exclusive = ACPI_SHARED; - resource.res.data.irq.number_of_interrupts = 1; - resource.res.data.irq.interrupts[0] = irq; + if (irq <= 15) { + resource.res.id = ACPI_RSTYPE_IRQ; + resource.res.length = sizeof(struct acpi_resource); + resource.res.data.irq.edge_level = ACPI_LEVEL_SENSITIVE; + resource.res.data.irq.active_high_low = ACPI_ACTIVE_LOW; + resource.res.data.irq.shared_exclusive = ACPI_SHARED; + resource.res.data.irq.number_of_interrupts = 1; + resource.res.data.irq.interrupts[0] = irq; + } + else { + resource.res.id = ACPI_RSTYPE_EXT_IRQ; + resource.res.length = sizeof(struct acpi_resource); + resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER; + resource.res.data.extended_irq.edge_level = ACPI_LEVEL_SENSITIVE; + resource.res.data.extended_irq.active_high_low = ACPI_ACTIVE_LOW; + resource.res.data.extended_irq.shared_exclusive = ACPI_SHARED; + resource.res.data.extended_irq.number_of_interrupts = 1; + resource.res.data.extended_irq.interrupts[0] = irq; + /* ignore resource_source, it's optional */ + } resource.end.id = ACPI_RSTYPE_END_TAG; status = acpi_set_current_resources(link->handle, &buffer); diff -Nru a/drivers/acpi/resources/rsaddr.c b/drivers/acpi/resources/rsaddr.c --- a/drivers/acpi/resources/rsaddr.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/resources/rsaddr.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -130,6 +149,8 @@ if (ACPI_IO_RANGE == output_struct->data.address16.resource_type) { output_struct->data.address16.attribute.io.range_attribute = (u16) (temp8 & 0x03); + output_struct->data.address16.attribute.io.translation_attribute = + (u16) ((temp8 >> 4) & 0x03); } else { /* BUS_NUMBER_RANGE == Address16.Data->resource_type */ @@ -328,6 +349,9 @@ temp8 = (u8) (linked_list->data.address16.attribute.io.range_attribute & 0x03); + temp8 |= + (linked_list->data.address16.attribute.io.translation_attribute & + 0x03) << 4; } *buffer = temp8; @@ -516,6 +540,8 @@ if (ACPI_IO_RANGE == output_struct->data.address32.resource_type) { output_struct->data.address32.attribute.io.range_attribute = (u16) (temp8 & 0x03); + output_struct->data.address32.attribute.io.translation_attribute = + (u16) ((temp8 >> 4) & 0x03); } else { /* BUS_NUMBER_RANGE == output_struct->Data.Address32.resource_type */ @@ -712,6 +738,9 @@ temp8 = (u8) (linked_list->data.address32.attribute.io.range_attribute & 0x03); + temp8 |= + (linked_list->data.address32.attribute.io.translation_attribute & + 0x03) << 4; } *buffer = temp8; @@ -899,6 +928,8 @@ if (ACPI_IO_RANGE == output_struct->data.address64.resource_type) { output_struct->data.address64.attribute.io.range_attribute = (u16) (temp8 & 0x03); + output_struct->data.address64.attribute.io.translation_attribute = + (u16) ((temp8 >> 4) & 0x03); } else { /* BUS_NUMBER_RANGE == output_struct->Data.Address64.resource_type */ @@ -1099,6 +1130,9 @@ temp8 = (u8) (linked_list->data.address64.attribute.io.range_attribute & 0x03); + temp8 |= + (linked_list->data.address64.attribute.io.range_attribute & + 0x03) << 4; } *buffer = temp8; diff -Nru a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c --- a/drivers/acpi/resources/rscalc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/resources/rscalc.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c --- a/drivers/acpi/resources/rscreate.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/resources/rscreate.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsdump.c b/drivers/acpi/resources/rsdump.c --- a/drivers/acpi/resources/rsdump.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/resources/rsdump.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ @@ -551,6 +570,11 @@ "Invalid range attribute\n"); break; } + + acpi_os_printf (" Type Specific: %s Translation\n", + ACPI_SPARSE_TRANSLATION == + address16_data->attribute.io.translation_attribute ? + "Sparse" : "Dense"); break; case ACPI_BUS_NUMBER_RANGE: @@ -673,26 +697,31 @@ acpi_os_printf (" Resource Type: Io Range\n"); switch (address32_data->attribute.io.range_attribute) { - case ACPI_NON_ISA_ONLY_RANGES: - acpi_os_printf (" Type Specific: " - "Non-ISA Io Addresses\n"); - break; - - case ACPI_ISA_ONLY_RANGES: - acpi_os_printf (" Type Specific: " - "ISA Io Addresses\n"); - break; - - case ACPI_ENTIRE_RANGE: - acpi_os_printf (" Type Specific: " - "ISA and non-ISA Io Addresses\n"); - break; - - default: - acpi_os_printf (" Type Specific: " - "Invalid Range attribute"); - break; - } + case ACPI_NON_ISA_ONLY_RANGES: + acpi_os_printf (" Type Specific: " + "Non-ISA Io Addresses\n"); + break; + + case ACPI_ISA_ONLY_RANGES: + acpi_os_printf (" Type Specific: " + "ISA Io Addresses\n"); + break; + + case ACPI_ENTIRE_RANGE: + acpi_os_printf (" Type Specific: " + "ISA and non-ISA Io Addresses\n"); + break; + + default: + acpi_os_printf (" Type Specific: " + "Invalid Range attribute"); + break; + } + + acpi_os_printf (" Type Specific: %s Translation\n", + ACPI_SPARSE_TRANSLATION == + address32_data->attribute.io.translation_attribute ? + "Sparse" : "Dense"); break; case ACPI_BUS_NUMBER_RANGE: @@ -815,26 +844,31 @@ acpi_os_printf (" Resource Type: Io Range\n"); switch (address64_data->attribute.io.range_attribute) { - case ACPI_NON_ISA_ONLY_RANGES: - acpi_os_printf (" Type Specific: " - "Non-ISA Io Addresses\n"); - break; - - case ACPI_ISA_ONLY_RANGES: - acpi_os_printf (" Type Specific: " - "ISA Io Addresses\n"); - break; - - case ACPI_ENTIRE_RANGE: - acpi_os_printf (" Type Specific: " - "ISA and non-ISA Io Addresses\n"); - break; - - default: - acpi_os_printf (" Type Specific: " - "Invalid Range attribute"); - break; - } + case ACPI_NON_ISA_ONLY_RANGES: + acpi_os_printf (" Type Specific: " + "Non-ISA Io Addresses\n"); + break; + + case ACPI_ISA_ONLY_RANGES: + acpi_os_printf (" Type Specific: " + "ISA Io Addresses\n"); + break; + + case ACPI_ENTIRE_RANGE: + acpi_os_printf (" Type Specific: " + "ISA and non-ISA Io Addresses\n"); + break; + + default: + acpi_os_printf (" Type Specific: " + "Invalid Range attribute"); + break; + } + + acpi_os_printf (" Type Specific: %s Translation\n", + ACPI_SPARSE_TRANSLATION == + address64_data->attribute.io.translation_attribute ? + "Sparse" : "Dense"); break; case ACPI_BUS_NUMBER_RANGE: diff -Nru a/drivers/acpi/resources/rsio.c b/drivers/acpi/resources/rsio.c --- a/drivers/acpi/resources/rsio.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/resources/rsio.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsirq.c b/drivers/acpi/resources/rsirq.c --- a/drivers/acpi/resources/rsirq.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/resources/rsirq.c Thu Feb 20 23:19:24 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rslist.c b/drivers/acpi/resources/rslist.c --- a/drivers/acpi/resources/rslist.c Thu Feb 20 23:19:24 2003 +++ b/drivers/acpi/resources/rslist.c Thu Feb 20 23:19:24 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsmemory.c b/drivers/acpi/resources/rsmemory.c --- a/drivers/acpi/resources/rsmemory.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/resources/rsmemory.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsmisc.c b/drivers/acpi/resources/rsmisc.c --- a/drivers/acpi/resources/rsmisc.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/resources/rsmisc.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsutils.c b/drivers/acpi/resources/rsutils.c --- a/drivers/acpi/resources/rsutils.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/resources/rsutils.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/resources/rsxface.c b/drivers/acpi/resources/rsxface.c --- a/drivers/acpi/resources/rsxface.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/resources/rsxface.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbconvrt.c b/drivers/acpi/tables/tbconvrt.c --- a/drivers/acpi/tables/tbconvrt.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/tables/tbconvrt.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbget.c b/drivers/acpi/tables/tbget.c --- a/drivers/acpi/tables/tbget.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/tables/tbget.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbgetall.c b/drivers/acpi/tables/tbgetall.c --- a/drivers/acpi/tables/tbgetall.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/tables/tbgetall.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c --- a/drivers/acpi/tables/tbinstal.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/tables/tbinstal.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbrsdt.c b/drivers/acpi/tables/tbrsdt.c --- a/drivers/acpi/tables/tbrsdt.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/tables/tbrsdt.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c --- a/drivers/acpi/tables/tbutils.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/tables/tbutils.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbxface.c b/drivers/acpi/tables/tbxface.c --- a/drivers/acpi/tables/tbxface.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/tables/tbxface.c Thu Feb 20 23:19:23 2003 @@ -6,21 +6,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/tables/tbxfroot.c b/drivers/acpi/tables/tbxfroot.c --- a/drivers/acpi/tables/tbxfroot.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/tables/tbxfroot.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c --- a/drivers/acpi/toshiba_acpi.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/toshiba_acpi.c Thu Feb 20 23:19:19 2003 @@ -2,7 +2,7 @@ * toshiba_acpi.c - Toshiba Laptop ACPI Extras * * - * Copyright (C) 2002 John Belmonte + * Copyright (C) 2002-2003 John Belmonte * * 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 @@ -33,7 +33,7 @@ * */ -#define TOSHIBA_ACPI_VERSION "0.13" +#define TOSHIBA_ACPI_VERSION "0.14" #define PROC_INTERFACE_VERSION 1 #include @@ -41,19 +41,9 @@ #include #include #include -#include #include -#include -#define OLD_ACPI_INTERFACE (ACPI_CA_VERSION < 0x20020000) - -#if OLD_ACPI_INTERFACE -#include -extern struct proc_dir_entry* bm_proc_root; -#define acpi_root_dir bm_proc_root -#else #include -#endif MODULE_AUTHOR("John Belmonte"); MODULE_DESCRIPTION("Toshiba Laptop ACPI Extras Driver"); @@ -101,47 +91,6 @@ #define HCI_VIDEO_OUT_CRT 0x2 #define HCI_VIDEO_OUT_TV 0x4 -static int toshiba_lcd_open_fs(struct inode *inode, struct file *file); -static int toshiba_video_open_fs(struct inode *inode, struct file *file); -static int toshiba_fan_open_fs(struct inode *inode, struct file *file); -static int toshiba_keys_open_fs(struct inode *inode, struct file *file); -static int toshiba_version_open_fs(struct inode *inode, struct file *file); - -static struct file_operations toshiba_lcd_fops = { - .open = toshiba_lcd_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static struct file_operations toshiba_video_fops = { - .open = toshiba_video_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static struct file_operations toshiba_fan_fops = { - .open = toshiba_fan_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static struct file_operations toshiba_keys_fops = { - .open = toshiba_keys_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static struct file_operations toshiba_version_fops = { - .open = toshiba_version_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - /* utility */ @@ -191,8 +140,8 @@ static int read_acpi_int(const char* methodName, int* pVal) { - acpi_buffer results; - acpi_object out_objs[1]; + struct acpi_buffer results; + union acpi_object out_objs[1]; acpi_status status; results.length = sizeof(out_objs); @@ -270,22 +219,50 @@ return status; } -#define PROC_TOSHIBA "toshiba" -#define PROC_LCD "lcd" -#define PROC_VIDEO "video" -#define PROC_FAN "fan" -#define PROC_KEYS "keys" -#define PROC_VERSION "version" - static struct proc_dir_entry* toshiba_proc_dir = NULL; static int force_fan; static int last_key_event; static int key_event_valid; +typedef struct _ProcItem +{ + char* name; + char* (*read_func)(char*); + unsigned long (*write_func)(const char*, unsigned long); +} ProcItem; + /* proc file handlers */ -static int toshiba_lcd_seq_show(struct seq_file *seq, void *offset) +static int +dispatch_read(char* page, char** start, off_t off, int count, int* eof, + ProcItem* item) +{ + char* p = page; + int len; + + if (off == 0) + p = item->read_func(p); + + /* ISSUE: I don't understand this code */ + len = (p - page); + if (len <= off+count) *eof = 1; + *start = page + off; + len -= off; + if (len>count) len = count; + if (len<0) len = 0; + return len; +} + +static int +dispatch_write(struct file* file, const char* buffer, unsigned long count, + ProcItem* item) +{ + return item->write_func(buffer, count); +} + +static char* +read_lcd(char* p) { u32 hci_result; u32 value; @@ -293,24 +270,18 @@ hci_read1(HCI_LCD_BRIGHTNESS, &value, &hci_result); if (hci_result == HCI_SUCCESS) { value = value >> HCI_LCD_BRIGHTNESS_SHIFT; - seq_printf(seq, "brightness: %d\n" - "brightness_levels: %d\n", - value, - HCI_LCD_BRIGHTNESS_LEVELS); - } else - seq_puts(seq, "ERROR\n"); - - return 0; -} + p += sprintf(p, "brightness: %d\n", value); + p += sprintf(p, "brightness_levels: %d\n", + HCI_LCD_BRIGHTNESS_LEVELS); + } else { + p += sprintf(p, "ERROR\n"); + } -static int toshiba_lcd_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, toshiba_lcd_seq_show, NULL); + return p; } -static int -proc_write_lcd(struct file* file, const char* buffer, size_t count, - loff_t* data) +static unsigned long +write_lcd(const char* buffer, unsigned long count) { int value; /*int byte_count;*/ @@ -330,7 +301,8 @@ return count; } -static int toshiba_video_seq_show(struct seq_file *seq, void *offset) +static char* +read_video(char* p) { u32 hci_result; u32 value; @@ -340,26 +312,18 @@ int is_lcd = (value & HCI_VIDEO_OUT_LCD) ? 1 : 0; int is_crt = (value & HCI_VIDEO_OUT_CRT) ? 1 : 0; int is_tv = (value & HCI_VIDEO_OUT_TV ) ? 1 : 0; - seq_printf(seq, "lcd_out: %d\n" - "crt_out: %d\n" - "tv_out: %d\n", - is_lcd, - is_crt, - is_tv); - } else - seq_puts(seq, "ERROR\n"); + p += sprintf(p, "lcd_out: %d\n", is_lcd); + p += sprintf(p, "crt_out: %d\n", is_crt); + p += sprintf(p, "tv_out: %d\n", is_tv); + } else { + p += sprintf(p, "ERROR\n"); + } - return 0; + return p; } -static int toshiba_video_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, toshiba_video_seq_show, NULL); -} - -static int -proc_write_video(struct file* file, const char* buffer, size_t count, - loff_t* data) +static unsigned long +write_video(const char* buffer, unsigned long count) { int value; const char* buffer_end = buffer + count; @@ -400,31 +364,25 @@ return count; } -static int toshiba_fan_seq_show(struct seq_file *seq, void *offset) +static char* +read_fan(char* p) { u32 hci_result; u32 value; hci_read1(HCI_FAN, &value, &hci_result); if (hci_result == HCI_SUCCESS) { - seq_printf(seq, "running: %d\n" - "force_on: %d\n", - (value > 0), - force_fan); - } else - seq_puts(seq, "ERROR\n"); - - return 0; -} + p += sprintf(p, "running: %d\n", (value > 0)); + p += sprintf(p, "force_on: %d\n", force_fan); + } else { + p += sprintf(p, "ERROR\n"); + } -static int toshiba_fan_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, toshiba_fan_seq_show, NULL); + return p; } -static int -proc_write_fan(struct file* file, const char* buffer, size_t count, - loff_t* data) +static unsigned long +write_fan(const char* buffer, unsigned long count) { int value; u32 hci_result; @@ -443,7 +401,8 @@ return count; } -static int toshiba_keys_seq_show(struct seq_file *seq, void *offset) +static char* +read_keys(char* p) { u32 hci_result; u32 value; @@ -456,28 +415,20 @@ } else if (hci_result == HCI_EMPTY) { /* better luck next time */ } else { - seq_puts(seq, "ERROR\n"); + p += sprintf(p, "ERROR\n"); goto end; } } - seq_printf(seq, "hotkey_ready: %d\n" - "hotkey: 0x%04x\n", - key_event_valid, - last_key_event); + p += sprintf(p, "hotkey_ready: %d\n", key_event_valid); + p += sprintf(p, "hotkey: 0x%04x\n", last_key_event); end: - return 0; + return p; } -static int toshiba_keys_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, toshiba_keys_seq_show, NULL); -} - -static int -proc_write_keys(struct file* file, const char* buffer, size_t count, - loff_t* data) +static unsigned long +write_keys(const char* buffer, unsigned long count) { int value; @@ -491,61 +442,44 @@ return count; } -static int toshiba_version_seq_show(struct seq_file *seq, void *offset) -{ - seq_printf(seq, "driver: %s\n" - "proc_interface: %d\n", - TOSHIBA_ACPI_VERSION, - PROC_INTERFACE_VERSION); - - return 0; -} - -static int toshiba_version_open_fs(struct inode *inode, struct file *file) +static char* +read_version(char* p) { - return single_open(file, toshiba_version_seq_show, NULL); + p += sprintf(p, "driver: %s\n", TOSHIBA_ACPI_VERSION); + p += sprintf(p, "proc_interface: %d\n", + PROC_INTERFACE_VERSION); + return p; } /* proc and module init */ +#define PROC_TOSHIBA "toshiba" + +ProcItem proc_items[] = +{ + { "lcd" , read_lcd , write_lcd }, + { "video" , read_video , write_video }, + { "fan" , read_fan , write_fan }, + { "keys" , read_keys , write_keys }, + { "version" , read_version , 0 }, + { 0 , 0 , 0 }, +}; + static acpi_status add_device(void) { struct proc_dir_entry* proc; + ProcItem* item; - proc = create_proc_entry(PROC_LCD, S_IFREG | S_IRUGO | S_IWUSR, - toshiba_proc_dir); - if (proc) { - proc->proc_fops = &toshiba_lcd_fops; - proc->proc_fops->write = proc_write_lcd; - } - - proc = create_proc_entry(PROC_VIDEO, S_IFREG | S_IRUGO | S_IWUSR, - toshiba_proc_dir); - if (proc) { - proc->proc_fops = &toshiba_video_fops; - proc->proc_fops->write = proc_write_video; - } - - proc = create_proc_entry(PROC_FAN, S_IFREG | S_IRUGO | S_IWUSR, - toshiba_proc_dir); - if (proc) { - proc->proc_fops = &toshiba_fan_fops; - proc->proc_fops->write = proc_write_fan; - } - - proc = create_proc_entry(PROC_KEYS, S_IFREG | S_IRUGO | S_IWUSR, - toshiba_proc_dir); - if (proc) { - proc->proc_fops = &toshiba_keys_fops; - proc->proc_fops->write = proc_write_keys; - } - - proc = create_proc_entry(PROC_VERSION, S_IFREG | S_IRUGO | S_IWUSR, - toshiba_proc_dir); - if (proc) - proc->proc_fops = &toshiba_version_fops; + for (item = proc_items; item->name; ++item) + { + proc = create_proc_read_entry(item->name, + S_IFREG | S_IRUGO | S_IWUSR, + toshiba_proc_dir, (read_proc_t*)dispatch_read, item); + if (proc && item->write_func) + proc->write_proc = (write_proc_t*)dispatch_write; + } return(AE_OK); } @@ -553,11 +487,10 @@ static acpi_status remove_device(void) { - remove_proc_entry(PROC_LCD, toshiba_proc_dir); - remove_proc_entry(PROC_VIDEO, toshiba_proc_dir); - remove_proc_entry(PROC_FAN, toshiba_proc_dir); - remove_proc_entry(PROC_KEYS, toshiba_proc_dir); - remove_proc_entry(PROC_VERSION, toshiba_proc_dir); + ProcItem* item; + + for (item = proc_items; item->name; ++item) + remove_proc_entry(item->name, toshiba_proc_dir); return(AE_OK); } diff -Nru a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c --- a/drivers/acpi/utilities/utalloc.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/utilities/utalloc.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c --- a/drivers/acpi/utilities/utcopy.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/utilities/utcopy.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utdebug.c b/drivers/acpi/utilities/utdebug.c --- a/drivers/acpi/utilities/utdebug.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/utilities/utdebug.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c --- a/drivers/acpi/utilities/utdelete.c Thu Feb 20 23:19:21 2003 +++ b/drivers/acpi/utilities/utdelete.c Thu Feb 20 23:19:21 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/uteval.c b/drivers/acpi/utilities/uteval.c --- a/drivers/acpi/utilities/uteval.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/utilities/uteval.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c --- a/drivers/acpi/utilities/utglobal.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/utilities/utglobal.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 + * 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. */ #define DEFINE_ACPI_GLOBALS @@ -358,14 +377,16 @@ const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS] = { - "system_memory", - "system_iO", +/*! [Begin] no source code translation (keep these ASL Keywords as-is) */ + "SystemMemory", + "SystemIO", "PCI_Config", - "embedded_control", + "EmbeddedControl", "SMBus", "CMOS", "PCIBARTarget", - "data_table", + "DataTable" +/*! [End] no source code translation !*/ }; @@ -381,7 +402,7 @@ else if (space_id >= ACPI_NUM_PREDEFINED_REGIONS) { - return ("invalid_space_iD"); + return ("invalid_space_id"); } return ((char *) acpi_gbl_region_types[space_id]); diff -Nru a/drivers/acpi/utilities/utinit.c b/drivers/acpi/utilities/utinit.c --- a/drivers/acpi/utilities/utinit.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/utilities/utinit.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utmath.c b/drivers/acpi/utilities/utmath.c --- a/drivers/acpi/utilities/utmath.c Thu Feb 20 23:19:23 2003 +++ b/drivers/acpi/utilities/utmath.c Thu Feb 20 23:19:23 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c --- a/drivers/acpi/utilities/utmisc.c Thu Feb 20 23:19:19 2003 +++ b/drivers/acpi/utilities/utmisc.c Thu Feb 20 23:19:19 2003 @@ -5,21 +5,40 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c --- a/drivers/acpi/utilities/utobject.c Thu Feb 20 23:19:22 2003 +++ b/drivers/acpi/utilities/utobject.c Thu Feb 20 23:19:22 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c --- a/drivers/acpi/utilities/utxface.c Thu Feb 20 23:19:20 2003 +++ b/drivers/acpi/utilities/utxface.c Thu Feb 20 23:19:20 2003 @@ -5,21 +5,40 @@ *****************************************************************************/ /* - * Copyright (C) 2000 - 2003, R. Byron Moore + * Copyright (C) 2000 - 2003, R. Byron Moore + * All rights reserved. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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. * - * 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. + * 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. * - * 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 + * 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. */ diff -Nru a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c --- a/drivers/block/cciss_scsi.c Thu Feb 20 23:19:20 2003 +++ b/drivers/block/cciss_scsi.c Thu Feb 20 23:19:20 2003 @@ -737,7 +737,7 @@ sh->hostdata[0] = (unsigned long) hba[i]; sh->irq = hba[i]->intr; sh->unique_id = sh->irq; - scsi_set_pci_device(sh, hba[i]->pdev); + scsi_set_device(sh, &hba[i]->pdev->dev); return 1; /* Say we have 1 scsi adapter, this will be */ /* called multiple times, once for each adapter */ diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c --- a/drivers/block/floppy.c Thu Feb 20 23:19:20 2003 +++ b/drivers/block/floppy.c Thu Feb 20 23:19:20 2003 @@ -822,7 +822,7 @@ } } /* - * We should propogate failures to grab the resources back + * We should propagate failures to grab the resources back * nicely from here. Actually we ought to rewrite the fd * driver some day too. */ diff -Nru a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c --- a/drivers/char/agp/via-agp.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/agp/via-agp.c Thu Feb 20 23:19:23 2003 @@ -227,7 +227,7 @@ printk (KERN_INFO PFX "Found KT400 in disguise as a KT266.\n"); - /* Check AGP compatability mode. */ + /* Check AGP compatibility mode. */ pci_read_config_byte(pdev, VIA_AGPSEL, ®); if ((reg & (1<<1))==0) return via_generic_agp3_setup(pdev); @@ -271,7 +271,7 @@ { u8 reg; pci_read_config_byte(pdev, VIA_AGPSEL, ®); - /* Check AGP 2.0 compatability mode. */ + /* Check AGP 2.0 compatibility mode. */ if ((reg & (1<<1))==0) return via_generic_agp3_setup(pdev); return via_generic_setup(pdev); diff -Nru a/drivers/char/amiserial.c b/drivers/char/amiserial.c --- a/drivers/char/amiserial.c Thu Feb 20 23:19:24 2003 +++ b/drivers/char/amiserial.c Thu Feb 20 23:19:24 2003 @@ -50,7 +50,7 @@ #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) #define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ - kdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) + cdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) #else #define DBG_CNT(s) #endif @@ -164,11 +164,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/cyclades.c b/drivers/char/cyclades.c --- a/drivers/char/cyclades.c Thu Feb 20 23:19:20 2003 +++ b/drivers/char/cyclades.c Thu Feb 20 23:19:20 2003 @@ -903,18 +903,18 @@ "cyc Warning: cyclades_port out of range for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if( (long)info < (long)(&cy_port[0]) || (long)(&cy_port[NR_PORTS]) < (long)info ){ - printk(badrange, kdevname(device), routine); + printk(badrange, cdevname(device), routine); return 1; } if (info->magic != CYCLADES_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/drm/drm_drv.h b/drivers/char/drm/drm_drv.h --- a/drivers/char/drm/drm_drv.h Thu Feb 20 23:19:23 2003 +++ b/drivers/char/drm/drm_drv.h Thu Feb 20 23:19:23 2003 @@ -323,8 +323,6 @@ dev->last_context = 0; dev->last_switch = 0; dev->last_checked = 0; - init_timer( &dev->timer ); - init_waitqueue_head( &dev->context_wait ); dev->ctx_start = 0; dev->lck_start = 0; @@ -580,6 +578,8 @@ memset( (void *)dev, 0, sizeof(*dev) ); dev->count_lock = SPIN_LOCK_UNLOCKED; sema_init( &dev->struct_sem, 1 ); + init_timer( &dev->timer ); + init_waitqueue_head( &dev->context_wait ); if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0) return -EPERM; diff -Nru a/drivers/char/epca.c b/drivers/char/epca.c --- a/drivers/char/epca.c Thu Feb 20 23:19:22 2003 +++ b/drivers/char/epca.c Thu Feb 20 23:19:22 2003 @@ -2805,7 +2805,7 @@ ch->fepstopc = ch->stopc; /* ------------------------------------------------------------ - The XON / XOFF characters have changed; propogate these + The XON / XOFF characters have changed; propagate these changes to the card. --------------------------------------------------------------- */ @@ -2819,7 +2819,7 @@ /* --------------------------------------------------------------- Similar to the above, this time the auxilarly XON / XOFF - characters have changed; propogate these changes to the card. + characters have changed; propagate these changes to the card. ------------------------------------------------------------------ */ fepcmd(ch, SAUXONOFFC, ch->fepstartca, ch->fepstopca, 0, 1); diff -Nru a/drivers/char/esp.c b/drivers/char/esp.c --- a/drivers/char/esp.c Thu Feb 20 23:19:19 2003 +++ b/drivers/char/esp.c Thu Feb 20 23:19:19 2003 @@ -135,7 +135,7 @@ #if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT) #define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \ - kdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) + cdevname(tty->device), (info->flags), serial_refcount,info->count,tty->count,s) #else #define DBG_CNT(s) #endif @@ -184,11 +184,11 @@ "Warning: null esp_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != ESP_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/ftape/zftape/zftape-ctl.c b/drivers/char/ftape/zftape/zftape-ctl.c --- a/drivers/char/ftape/zftape/zftape-ctl.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/ftape/zftape/zftape-ctl.c Thu Feb 20 23:19:21 2003 @@ -717,7 +717,7 @@ ftape_disable()); } /* zft_seg_pos should be greater than the vtbl segpos but not - * if in compatability mode and only after we read in the + * if in compatibility mode and only after we read in the * header segments * * might also be a problem if the user makes a backup with a diff -Nru a/drivers/char/ftape/zftape/zftape-eof.c b/drivers/char/ftape/zftape/zftape-eof.c --- a/drivers/char/ftape/zftape/zftape-eof.c Thu Feb 20 23:19:24 2003 +++ b/drivers/char/ftape/zftape/zftape-eof.c Thu Feb 20 23:19:24 2003 @@ -1,6 +1,6 @@ /* * I use these routines just to decide when I have to fake a - * volume-table to preserve compatability to original ftape. + * volume-table to preserve compatibility to original ftape. */ /* * Copyright (C) 1994-1995 Bas Laarhoven. diff -Nru a/drivers/char/ftape/zftape/zftape-vtbl.c b/drivers/char/ftape/zftape/zftape-vtbl.c --- a/drivers/char/ftape/zftape/zftape-vtbl.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/ftape/zftape/zftape-vtbl.c Thu Feb 20 23:19:21 2003 @@ -143,7 +143,7 @@ * using the keyword "blocksize". The blocksize written to the * volume-label is in bytes. * - * We use this now only for compatability with old zftape version. We + * We use this now only for compatibility with old zftape version. We * store the blocksize directly as binary number in the vendor * extension part of the volume entry. */ diff -Nru a/drivers/char/ftape/zftape/zftape-vtbl.h b/drivers/char/ftape/zftape/zftape-vtbl.h --- a/drivers/char/ftape/zftape/zftape-vtbl.h Thu Feb 20 23:19:21 2003 +++ b/drivers/char/ftape/zftape/zftape-vtbl.h Thu Feb 20 23:19:21 2003 @@ -72,7 +72,7 @@ #define VTBL_FMT 125 #define VTBL_RESERVED_2 126 #define VTBL_RESERVED_3 127 -/* compatability with pre revision K */ +/* compatibility with pre revision K */ #define VTBL_K_CMPR 120 /* the next is used by QIC-3020 tapes with format code 6 (>2^16 diff -Nru a/drivers/char/genrtc.c b/drivers/char/genrtc.c --- a/drivers/char/genrtc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/genrtc.c Thu Feb 20 23:19:23 2003 @@ -97,7 +97,7 @@ static spinlock_t gen_rtc_lock = SPIN_LOCK_UNLOCKED; /* - * Routine to poll RTC seconds field for change as often as posible, + * Routine to poll RTC seconds field for change as often as possible, * after first RTC_UIE use timer to reduce polling */ void genrtc_troutine(void *data) @@ -430,7 +430,6 @@ module_init(rtc_generic_init); module_exit(rtc_generic_exit); -EXPORT_NO_SYMBOLS; /* diff -Nru a/drivers/char/ip2/i2ellis.h b/drivers/char/ip2/i2ellis.h --- a/drivers/char/ip2/i2ellis.h Thu Feb 20 23:19:19 2003 +++ b/drivers/char/ip2/i2ellis.h Thu Feb 20 23:19:19 2003 @@ -400,7 +400,7 @@ rwlock_t read_fifo_spinlock; rwlock_t write_fifo_spinlock; -// For queuing interupt bottom half handlers. /\/\|=mhw=|\/\/ +// For queuing interrupt bottom half handlers. /\/\|=mhw=|\/\/ struct work_struct tqueue_interrupt; struct timer_list SendPendingTimer; // Used by iiSendPending diff -Nru a/drivers/char/ip2main.c b/drivers/char/ip2main.c --- a/drivers/char/ip2main.c Thu Feb 20 23:19:24 2003 +++ b/drivers/char/ip2main.c Thu Feb 20 23:19:24 2003 @@ -366,7 +366,7 @@ #if defined(MODULE) && defined(IP2DEBUG_OPEN) #define DBG_CNT(s) printk(KERN_DEBUG "(%s): [%x] refc=%d, ttyc=%d, modc=%x -> %s\n", \ - kdevname(tty->device),(pCh->flags),ref_count, \ + cdevname(tty->device),(pCh->flags),ref_count, \ tty->count,/*GET_USE_COUNT(module)*/0,s) #else #define DBG_CNT(s) diff -Nru a/drivers/char/ipmi/ipmi_kcs_intf.c b/drivers/char/ipmi/ipmi_kcs_intf.c --- a/drivers/char/ipmi/ipmi_kcs_intf.c Thu Feb 20 23:19:19 2003 +++ b/drivers/char/ipmi/ipmi_kcs_intf.c Thu Feb 20 23:19:19 2003 @@ -128,7 +128,7 @@ /* The driver will disable interrupts when it gets into a situation where it cannot handle messages due to lack of memory. Once that situation clears up, it will re-enable - interupts. */ + interrupts. */ int interrupt_disabled; }; diff -Nru a/drivers/char/isicom.c b/drivers/char/isicom.c --- a/drivers/char/isicom.c Thu Feb 20 23:19:19 2003 +++ b/drivers/char/isicom.c Thu Feb 20 23:19:19 2003 @@ -347,11 +347,11 @@ static const char * badport = KERN_WARNING "ISICOM: Warning: NULL isicom port for dev %s in %s.\n"; if (!port) { - printk(badport, kdevname(dev), routine); + printk(badport, cdevname(dev), routine); return 1; } if (port->magic != ISICOM_MAGIC) { - printk(badmagic, kdevname(dev), routine); + printk(badmagic, cdevname(dev), routine); return 1; } #endif diff -Nru a/drivers/char/mwave/3780i.c b/drivers/char/mwave/3780i.c --- a/drivers/char/mwave/3780i.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/mwave/3780i.c Thu Feb 20 23:19:23 2003 @@ -698,7 +698,7 @@ usDspBaseIO, pusIPCSource); /* - * Disable DSP to PC interrupts, read the interupt register, + * Disable DSP to PC interrupts, read the interrupt register, * clear the pending IPC bits, and reenable DSP to PC interrupts */ spin_lock_irqsave(&dsp_lock, flags); diff -Nru a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c --- a/drivers/char/pcmcia/synclink_cs.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/pcmcia/synclink_cs.c Thu Feb 20 23:19:21 2003 @@ -860,11 +860,11 @@ "Warning: null mgslpc_info for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != MGSLPC_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/ppdev.c b/drivers/char/ppdev.c --- a/drivers/char/ppdev.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/ppdev.c Thu Feb 20 23:19:23 2003 @@ -676,7 +676,7 @@ (pp->state.mode != IEEE1284_MODE_COMPAT)) { struct ieee1284_info *info; - /* parport released, but not in compatability mode */ + /* parport released, but not in compatibility mode */ parport_claim_or_block (pp->pdev); pp->flags |= PP_CLAIMED; info = &pp->pdev->port->ieee1284; diff -Nru a/drivers/char/rio/rio_linux.c b/drivers/char/rio/rio_linux.c --- a/drivers/char/rio/rio_linux.c Thu Feb 20 23:19:22 2003 +++ b/drivers/char/rio/rio_linux.c Thu Feb 20 23:19:22 2003 @@ -302,11 +302,11 @@ KERN_ERR "rio: Warning: null rio port for device %s in %s\n"; if (!port) { - printk (badinfo, kdevname(device), routine); + printk (badinfo, cdevname(device), routine); return 1; } if (port->magic != RIO_MAGIC) { - printk (badmagic, kdevname(device), routine); + printk (badmagic, cdevname(device), routine); return 1; } diff -Nru a/drivers/char/riscom8.c b/drivers/char/riscom8.c --- a/drivers/char/riscom8.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/riscom8.c Thu Feb 20 23:19:21 2003 @@ -140,11 +140,11 @@ "rc: Warning: null riscom port for device %s in %s\n"; if (!port) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (port->magic != RISCOM8_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/specialix.c b/drivers/char/specialix.c --- a/drivers/char/specialix.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/specialix.c Thu Feb 20 23:19:23 2003 @@ -219,11 +219,11 @@ KERN_ERR "sx: Warning: null specialix port for device %s in %s\n"; if (!port) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (port->magic != SPECIALIX_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/sx.c b/drivers/char/sx.c --- a/drivers/char/sx.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/sx.c Thu Feb 20 23:19:21 2003 @@ -448,11 +448,11 @@ KERN_ERR "sx: Warning: null sx port for device %s in %s\n"; if (!port) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (port->magic != SX_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } diff -Nru a/drivers/char/synclink.c b/drivers/char/synclink.c --- a/drivers/char/synclink.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/synclink.c Thu Feb 20 23:19:21 2003 @@ -987,11 +987,11 @@ "Warning: null mgsl_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != MGSL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c --- a/drivers/char/synclinkmp.c Thu Feb 20 23:19:20 2003 +++ b/drivers/char/synclinkmp.c Thu Feb 20 23:19:20 2003 @@ -718,11 +718,11 @@ "Warning: null synclinkmp_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != MGSL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/char/tipar.c b/drivers/char/tipar.c --- a/drivers/char/tipar.c Thu Feb 20 23:19:22 2003 +++ b/drivers/char/tipar.c Thu Feb 20 23:19:22 2003 @@ -531,8 +531,6 @@ MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE(DRIVER_LICENSE); -EXPORT_NO_SYMBOLS; - MODULE_PARM(timeout, "i"); MODULE_PARM_DESC(timeout, "Timeout (default=1.5 seconds)"); MODULE_PARM(delay, "i"); diff -Nru a/drivers/char/tpqic02.c b/drivers/char/tpqic02.c --- a/drivers/char/tpqic02.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/tpqic02.c Thu Feb 20 23:19:21 2003 @@ -2076,7 +2076,7 @@ if (TP_DIAGS(dev)) { - printk("qic02_tape_open: dev=%s, flags=%x ", kdevname(dev), flags); + printk("qic02_tape_open: dev=%s, flags=%x ", cdevname(dev), flags); } if (minor(dev) == 255) { /* special case for resetting */ @@ -2266,7 +2266,7 @@ kdev_t dev = inode->i_rdev; if (TP_DIAGS(dev)) { - printk("qic02_tape_release: dev=%s\n", kdevname(dev)); + printk("qic02_tape_release: dev=%s\n", cdevname(dev)); } if (status_zombie == NO) { /* don't rewind in zombie mode */ diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c --- a/drivers/char/tty_io.c Thu Feb 20 23:19:22 2003 +++ b/drivers/char/tty_io.c Thu Feb 20 23:19:22 2003 @@ -155,6 +155,9 @@ extern void uart_console_init(void); extern void sgi_serial_console_init(void); extern void sci_console_init(void); +extern void m68328_console_init(void); +extern void mcfrs_console_init(void); +extern void rs_360_init(void); extern void tx3912_console_init(void); extern void tx3912_rs_init(void); extern void hvc_console_init(void); @@ -211,11 +214,11 @@ "Warning: null TTY for (%s) in %s\n"; if (!tty) { - printk(badtty, kdevname(device), routine); + printk(badtty, cdevname(device), routine); return 1; } if (tty->magic != TTY_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif @@ -241,7 +244,7 @@ if (tty->count != count) { printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) " "!= #fd's(%d) in %s\n", - kdevname(tty->device), tty->count, count, routine); + cdevname(tty->device), tty->count, count, routine); return count; } #endif @@ -286,6 +289,10 @@ if (tty->ldisc.num == ldisc) return 0; /* We are already in the desired discipline */ + + if (!try_module_get(ldiscs[ldisc].owner)) + return -EINVAL; + o_ldisc = tty->ldisc; tty_wait_until_sent(tty, 0); @@ -300,9 +307,13 @@ if (tty->ldisc.open) retval = (tty->ldisc.open)(tty); if (retval < 0) { + module_put(tty->ldisc.owner); + tty->ldisc = o_ldisc; tty->termios->c_line = tty->ldisc.num; if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) { + module_put(tty->ldisc.owner); + tty->ldisc = ldiscs[N_TTY]; tty->termios->c_line = N_TTY; if (tty->ldisc.open) { @@ -314,7 +325,10 @@ tty_name(tty, buf), r); } } + } else { + module_put(o_ldisc.owner); } + if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc) tty->driver.set_ldisc(tty); return retval; @@ -490,6 +504,8 @@ if (tty->ldisc.num != ldiscs[N_TTY].num) { if (tty->ldisc.close) (tty->ldisc.close)(tty); + module_put(tty->ldisc.owner); + tty->ldisc = ldiscs[N_TTY]; tty->termios->c_line = N_TTY; if (tty->ldisc.open) { @@ -1082,24 +1098,24 @@ #ifdef TTY_PARANOIA_CHECK if (idx < 0 || idx >= tty->driver.num) { printk(KERN_DEBUG "release_dev: bad idx when trying to " - "free (%s)\n", kdevname(tty->device)); + "free (%s)\n", cdevname(tty->device)); return; } if (tty != tty->driver.table[idx]) { printk(KERN_DEBUG "release_dev: driver.table[%d] not tty " - "for (%s)\n", idx, kdevname(tty->device)); + "for (%s)\n", idx, cdevname(tty->device)); return; } if (tty->termios != tty->driver.termios[idx]) { printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios " "for (%s)\n", - idx, kdevname(tty->device)); + idx, cdevname(tty->device)); return; } if (tty->termios_locked != tty->driver.termios_locked[idx]) { printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not " "termios_locked for (%s)\n", - idx, kdevname(tty->device)); + idx, cdevname(tty->device)); return; } #endif @@ -1114,20 +1130,20 @@ if (o_tty != tty->driver.other->table[idx]) { printk(KERN_DEBUG "release_dev: other->table[%d] " "not o_tty for (%s)\n", - idx, kdevname(tty->device)); + idx, cdevname(tty->device)); return; } if (o_tty->termios != tty->driver.other->termios[idx]) { printk(KERN_DEBUG "release_dev: other->termios[%d] " "not o_termios for (%s)\n", - idx, kdevname(tty->device)); + idx, cdevname(tty->device)); return; } if (o_tty->termios_locked != tty->driver.other->termios_locked[idx]) { printk(KERN_DEBUG "release_dev: other->termios_locked[" "%d] not o_termios_locked for (%s)\n", - idx, kdevname(tty->device)); + idx, cdevname(tty->device)); return; } if (o_tty->link != tty) { @@ -1268,11 +1284,14 @@ */ if (tty->ldisc.close) (tty->ldisc.close)(tty); + module_put(tty->ldisc.owner); + tty->ldisc = ldiscs[N_TTY]; tty->termios->c_line = N_TTY; if (o_tty) { if (o_tty->ldisc.close) (o_tty->ldisc.close)(o_tty); + module_put(o_tty->ldisc.owner); o_tty->ldisc = ldiscs[N_TTY]; } @@ -2263,6 +2282,15 @@ #endif #ifdef CONFIG_ARC_CONSOLE arc_console_init(); +#endif +#ifdef CONFIG_SERIAL_68328 + m68328_console_init(); +#endif +#ifdef CONFIG_SERIAL_COLDFIRE + mcfrs_console_init(); +#endif +#ifdef CONFIG_SERIAL_68360 + rs_360_init(); #endif #ifdef CONFIG_SERIAL_TX3912_CONSOLE tx3912_console_init(); diff -Nru a/drivers/char/watchdog/sc520_wdt.c b/drivers/char/watchdog/sc520_wdt.c --- a/drivers/char/watchdog/sc520_wdt.c Thu Feb 20 23:19:21 2003 +++ b/drivers/char/watchdog/sc520_wdt.c Thu Feb 20 23:19:21 2003 @@ -385,4 +385,3 @@ MODULE_AUTHOR("Scott and Bill Jennings"); MODULE_DESCRIPTION("Driver for watchdog timer in AMD \"Elan\" SC520 uProcessor"); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/char/watchdog/w83877f_wdt.c b/drivers/char/watchdog/w83877f_wdt.c --- a/drivers/char/watchdog/w83877f_wdt.c Thu Feb 20 23:19:22 2003 +++ b/drivers/char/watchdog/w83877f_wdt.c Thu Feb 20 23:19:22 2003 @@ -359,4 +359,3 @@ MODULE_AUTHOR("Scott and Bill Jennings"); MODULE_DESCRIPTION("Driver for watchdog timer in w83877f chip"); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/char/watchdog/wafer5823wdt.c b/drivers/char/watchdog/wafer5823wdt.c --- a/drivers/char/watchdog/wafer5823wdt.c Thu Feb 20 23:19:23 2003 +++ b/drivers/char/watchdog/wafer5823wdt.c Thu Feb 20 23:19:23 2003 @@ -256,6 +256,5 @@ MODULE_AUTHOR("Justin Cormack"); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; /* end of wafer5823wdt.c */ diff -Nru a/drivers/hotplug/ibmphp_pci.c b/drivers/hotplug/ibmphp_pci.c --- a/drivers/hotplug/ibmphp_pci.c Thu Feb 20 23:19:19 2003 +++ b/drivers/hotplug/ibmphp_pci.c Thu Feb 20 23:19:19 2003 @@ -491,7 +491,7 @@ pci_bus_write_config_dword (ibmphp_pci_bus, devfn, address[count], func->pfmem[count]->start); /*_______________This is for debugging purposes only______________________________*/ - debug ("b4 writing, start addres is %x\n", func->pfmem[count]->start); + debug ("b4 writing, start address is %x\n", func->pfmem[count]->start); pci_bus_read_config_dword (ibmphp_pci_bus, devfn, address[count], &bar[count]); debug ("after writing, start address is %x\n", bar[count]); /*_________________________________________________________________________________*/ diff -Nru a/drivers/i2c/chips/adm1021.c b/drivers/i2c/chips/adm1021.c --- a/drivers/i2c/chips/adm1021.c Thu Feb 20 23:19:19 2003 +++ b/drivers/i2c/chips/adm1021.c Thu Feb 20 23:19:19 2003 @@ -19,12 +19,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include +#include #include #include #include -#include + /* Registers */ #define ADM1021_SYSCTL_TEMP 1200 @@ -123,8 +123,6 @@ unsigned short flags, int kind); static void adm1021_init_client(struct i2c_client *client); static int adm1021_detach_client(struct i2c_client *client); -static int adm1021_command(struct i2c_client *client, unsigned int cmd, - void *arg); static int adm1021_read_value(struct i2c_client *client, u8 reg); static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value); @@ -151,7 +149,6 @@ .flags = I2C_DF_NOTIFY, .attach_adapter = adm1021_attach_adapter, .detach_client = adm1021_detach_client, - .command = adm1021_command, }; /* These files are created for each detected adm1021. This is just a template; @@ -186,7 +183,7 @@ take more memory than the datastructure takes now. */ static int adm1021_id = 0; -int adm1021_attach_adapter(struct i2c_adapter *adapter) +static int adm1021_attach_adapter(struct i2c_adapter *adapter) { return i2c_detect(adapter, &addr_data, adm1021_detect); } @@ -339,7 +336,7 @@ return err; } -void adm1021_init_client(struct i2c_client *client) +static void adm1021_init_client(struct i2c_client *client) { /* Initialize the adm1021 chip */ adm1021_write_value(client, ADM1021_REG_TOS_W, @@ -356,7 +353,7 @@ adm1021_write_value(client, ADM1021_REG_CONV_RATE_W, 0x04); } -int adm1021_detach_client(struct i2c_client *client) +static int adm1021_detach_client(struct i2c_client *client) { int err; @@ -376,28 +373,20 @@ } - -/* No commands defined yet */ -int adm1021_command(struct i2c_client *client, unsigned int cmd, void *arg) -{ - return 0; -} - /* All registers are byte-sized */ -int adm1021_read_value(struct i2c_client *client, u8 reg) +static int adm1021_read_value(struct i2c_client *client, u8 reg) { return i2c_smbus_read_byte_data(client, reg); } -int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value) +static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value) { - if (read_only > 0) - return 0; - - return i2c_smbus_write_byte_data(client, reg, value); + if (!read_only) + return i2c_smbus_write_byte_data(client, reg, value); + return 0; } -void adm1021_update_client(struct i2c_client *client) +static void adm1021_update_client(struct i2c_client *client) { struct adm1021_data *data = client->data; @@ -447,10 +436,11 @@ } -void adm1021_temp(struct i2c_client *client, int operation, int ctl_name, - int *nrels_mag, long *results) +static void adm1021_temp(struct i2c_client *client, int operation, + int ctl_name, int *nrels_mag, long *results) { struct adm1021_data *data = client->data; + if (operation == SENSORS_PROC_REAL_INFO) *nrels_mag = 0; else if (operation == SENSORS_PROC_REAL_READ) { @@ -473,8 +463,8 @@ } } -void adm1021_remote_temp(struct i2c_client *client, int operation, - int ctl_name, int *nrels_mag, long *results) +static void adm1021_remote_temp(struct i2c_client *client, int operation, + int ctl_name, int *nrels_mag, long *results) { struct adm1021_data *data = client->data; int prec = 0; @@ -546,10 +536,11 @@ } } -void adm1021_die_code(struct i2c_client *client, int operation, - int ctl_name, int *nrels_mag, long *results) +static void adm1021_die_code(struct i2c_client *client, int operation, + int ctl_name, int *nrels_mag, long *results) { struct adm1021_data *data = client->data; + if (operation == SENSORS_PROC_REAL_INFO) *nrels_mag = 0; else if (operation == SENSORS_PROC_REAL_READ) { @@ -561,8 +552,8 @@ } } -void adm1021_alarms(struct i2c_client *client, int operation, int ctl_name, - int *nrels_mag, long *results) +static void adm1021_alarms(struct i2c_client *client, int operation, + int ctl_name, int *nrels_mag, long *results) { struct adm1021_data *data = client->data; if (operation == SENSORS_PROC_REAL_INFO) @@ -578,7 +569,6 @@ static int __init sensors_adm1021_init(void) { - return i2c_add_driver(&adm1021_driver); } diff -Nru a/drivers/i2c/chips/lm75.c b/drivers/i2c/chips/lm75.c --- a/drivers/i2c/chips/lm75.c Thu Feb 20 23:19:19 2003 +++ b/drivers/i2c/chips/lm75.c Thu Feb 20 23:19:19 2003 @@ -18,12 +18,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include +#include #include #include #include -#include #define LM75_SYSCTL_TEMP 1200 /* Degrees Celcius * 10 */ @@ -72,8 +71,6 @@ unsigned short flags, int kind); static void lm75_init_client(struct i2c_client *client); static int lm75_detach_client(struct i2c_client *client); -static int lm75_command(struct i2c_client *client, unsigned int cmd, - void *arg); static u16 swap_bytes(u16 val); static int lm75_read_value(struct i2c_client *client, u8 reg); static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value); @@ -84,12 +81,12 @@ /* This is the driver that will be inserted */ static struct i2c_driver lm75_driver = { + .owner = THIS_MODULE, .name = "LM75 sensor chip driver", .id = I2C_DRIVERID_LM75, .flags = I2C_DF_NOTIFY, .attach_adapter = lm75_attach_adapter, .detach_client = lm75_detach_client, - .command = lm75_command, }; /* These files are created for each detected LM75. This is just a template; @@ -105,14 +102,14 @@ static int lm75_id = 0; -int lm75_attach_adapter(struct i2c_adapter *adapter) +static int lm75_attach_adapter(struct i2c_adapter *adapter) { return i2c_detect(adapter, &addr_data, lm75_detect); } /* This function is called by i2c_detect */ -int lm75_detect(struct i2c_adapter *adapter, int address, - unsigned short flags, int kind) +static int lm75_detect(struct i2c_adapter *adapter, int address, + unsigned short flags, int kind) { int i, cur, conf, hyst, os; struct i2c_client *new_client; @@ -217,7 +214,7 @@ return err; } -int lm75_detach_client(struct i2c_client *client) +static int lm75_detach_client(struct i2c_client *client) { struct lm75_data *data = client->data; @@ -227,12 +224,7 @@ return 0; } -int lm75_command(struct i2c_client *client, unsigned int cmd, void *arg) -{ - return 0; -} - -u16 swap_bytes(u16 val) +static u16 swap_bytes(u16 val) { return (val >> 8) | (val << 8); } @@ -240,7 +232,7 @@ /* All registers are word-sized, except for the configuration register. LM75 uses a high-byte first convention, which is exactly opposite to the usual practice. */ -int lm75_read_value(struct i2c_client *client, u8 reg) +static int lm75_read_value(struct i2c_client *client, u8 reg) { if (reg == LM75_REG_CONF) return i2c_smbus_read_byte_data(client, reg); @@ -251,7 +243,7 @@ /* All registers are word-sized, except for the configuration register. LM75 uses a high-byte first convention, which is exactly opposite to the usual practice. */ -int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) +static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) { if (reg == LM75_REG_CONF) return i2c_smbus_write_byte_data(client, reg, value); @@ -260,7 +252,7 @@ swap_bytes(value)); } -void lm75_init_client(struct i2c_client *client) +static void lm75_init_client(struct i2c_client *client) { /* Initialize the LM75 chip */ lm75_write_value(client, LM75_REG_TEMP_OS, @@ -270,7 +262,7 @@ lm75_write_value(client, LM75_REG_CONF, 0); } -void lm75_update_client(struct i2c_client *client) +static void lm75_update_client(struct i2c_client *client) { struct lm75_data *data = client->data; @@ -292,8 +284,8 @@ } -void lm75_temp(struct i2c_client *client, int operation, int ctl_name, - int *nrels_mag, long *results) +static void lm75_temp(struct i2c_client *client, int operation, int ctl_name, + int *nrels_mag, long *results) { struct lm75_data *data = client->data; if (operation == SENSORS_PROC_REAL_INFO) @@ -318,7 +310,7 @@ } } -int __init sensors_lm75_init(void) +static int __init sensors_lm75_init(void) { return i2c_add_driver(&lm75_driver); } diff -Nru a/drivers/i2c/i2c-algo-bit.c b/drivers/i2c/i2c-algo-bit.c --- a/drivers/i2c/i2c-algo-bit.c Thu Feb 20 23:19:22 2003 +++ b/drivers/i2c/i2c-algo-bit.c Thu Feb 20 23:19:22 2003 @@ -21,20 +21,18 @@ /* With some changes from Kyösti Mälkki and even Frodo Looijaard */ -/* $Id: i2c-algo-bit.c,v 1.37 2002/07/08 00:41:49 mds Exp $ */ +/* $Id: i2c-algo-bit.c,v 1.44 2003/01/21 08:08:16 kmalkki Exp $ */ #include #include #include #include -#include #include -#include -#include #include - +#include #include #include + /* ----- global defines ----------------------------------------------- */ #define DEB(x) if (i2c_debug>=1) x; diff -Nru a/drivers/i2c/i2c-algo-pcf.c b/drivers/i2c/i2c-algo-pcf.c --- a/drivers/i2c/i2c-algo-pcf.c Thu Feb 20 23:19:23 2003 +++ b/drivers/i2c/i2c-algo-pcf.c Thu Feb 20 23:19:23 2003 @@ -31,15 +31,12 @@ #include #include #include -#include #include -#include -#include #include - #include #include #include "i2c-pcf8584.h" + /* ----- global defines ----------------------------------------------- */ #define DEB(x) if (i2c_debug>=1) x diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c --- a/drivers/i2c/i2c-dev.c Thu Feb 20 23:19:23 2003 +++ b/drivers/i2c/i2c-dev.c Thu Feb 20 23:19:23 2003 @@ -28,25 +28,22 @@ /* The devfs code is contributed by Philipp Matthias Hahn */ -/* $Id: i2c-dev.c,v 1.48 2002/10/01 14:10:04 ac9410 Exp $ */ +/* $Id: i2c-dev.c,v 1.53 2003/01/21 08:08:16 kmalkki Exp $ */ -#include #include #include #include #include -#include #include #include - +#include +#include +#include +#include /* If you want debugging uncomment: */ /* #define DEBUG */ -#include -#include -#include -#include /* struct file_operations changed too often in the 2.1 series for nice code */ @@ -107,9 +104,9 @@ struct i2c_client *client = (struct i2c_client *)file->private_data; - if(count > 8192) + if (count > 8192) count = 8192; - + /* copy user space data to kernel space. */ tmp = kmalloc(count,GFP_KERNEL); if (tmp==NULL) diff -Nru a/drivers/i2c/i2c-elv.c b/drivers/i2c/i2c-elv.c --- a/drivers/i2c/i2c-elv.c Thu Feb 20 23:19:23 2003 +++ b/drivers/i2c/i2c-elv.c Thu Feb 20 23:19:23 2003 @@ -21,20 +21,18 @@ /* With some changes from Kyösti Mälkki and even Frodo Looijaard */ -/* $Id: i2c-elv.c,v 1.21 2001/11/19 18:45:02 mds Exp $ */ +/* $Id: i2c-elv.c,v 1.27 2003/01/21 08:08:16 kmalkki Exp $ */ #include #include #include #include -#include #include -#include #include -#include #include #include #include +#include #define DEFAULT_BASE 0x378 static int base=0; @@ -120,12 +118,13 @@ * This is only done when more than one hardware adapter is supported. */ static struct i2c_algo_bit_data bit_elv_data = { - NULL, - bit_elv_setsda, - bit_elv_setscl, - bit_elv_getsda, - bit_elv_getscl, - 80, 80, 100, /* waits, timeout */ + .setsda = bit_elv_setsda, + .setscl = bit_elv_setscl, + .getsda = bit_elv_getsda, + .getscl = bit_elv_getscl, + .udelay = 80, + .mdelay = 80, + .timeout = HZ }; static struct i2c_adapter bit_elv_ops = { diff -Nru a/drivers/i2c/i2c-frodo.c b/drivers/i2c/i2c-frodo.c --- a/drivers/i2c/i2c-frodo.c Thu Feb 20 23:19:19 2003 +++ b/drivers/i2c/i2c-frodo.c Thu Feb 20 23:19:19 2003 @@ -12,18 +12,14 @@ * version 2 as published by the Free Software Foundation. */ -#include -#include #include - #include #include #include - -#include - #include #include +#include + static void frodo_setsda (void *data,int state) { @@ -58,7 +54,7 @@ .getscl = frodo_getscl, .udelay = 80, .mdelay = 80, - .timeout = 100 + .timeout = HZ }; static struct i2c_adapter frodo_ops = { diff -Nru a/drivers/i2c/i2c-philips-par.c b/drivers/i2c/i2c-philips-par.c --- a/drivers/i2c/i2c-philips-par.c Thu Feb 20 23:19:20 2003 +++ b/drivers/i2c/i2c-philips-par.c Thu Feb 20 23:19:20 2003 @@ -21,7 +21,7 @@ /* With some changes from Kyösti Mälkki and even Frodo Looijaard */ -/* $Id: i2c-philips-par.c,v 1.23 2002/02/06 08:50:58 simon Exp $ */ +/* $Id: i2c-philips-par.c,v 1.29 2003/01/21 08:08:16 kmalkki Exp $ */ #include #include @@ -32,10 +32,6 @@ #include #include -#ifndef __exit -#define __exit __init -#endif - static int type; struct i2c_par @@ -135,21 +131,22 @@ */ static struct i2c_algo_bit_data bit_lp_data = { - NULL, - bit_lp_setsda, - bit_lp_setscl, - bit_lp_getsda, - bit_lp_getscl, - 80, 80, 100, /* waits, timeout */ + .setsda = bit_lp_setsda, + .setscl = bit_lp_setscl, + .getsda = bit_lp_getsda, + .getscl = bit_lp_getscl, + .udelay = 80, + .mdelay = 80, + .timeout = HZ }; static struct i2c_algo_bit_data bit_lp_data2 = { - NULL, - bit_lp_setsda2, - bit_lp_setscl2, - bit_lp_getsda2, - NULL, - 80, 80, 100, /* waits, timeout */ + .setsda = bit_lp_setsda2, + .setscl = bit_lp_setscl2, + .getsda = bit_lp_getsda2, + .udelay = 80, + .mdelay = 80, + .timeout = HZ }; static struct i2c_adapter bit_lp_ops = { diff -Nru a/drivers/i2c/i2c-proc.c b/drivers/i2c/i2c-proc.c --- a/drivers/i2c/i2c-proc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/i2c/i2c-proc.c Thu Feb 20 23:19:22 2003 @@ -29,10 +29,10 @@ #include #include #include +#include #include #include #include -#include #include static int i2c_create_name(char **name, const char *prefix, @@ -87,7 +87,7 @@ (for a LM78 chip on the ISA bus at port 0x310), or lm75-i2c-3-4e (for a LM75 chip on the third i2c bus at address 0x4e). name is allocated first. */ -int i2c_create_name(char **name, const char *prefix, +static int i2c_create_name(char **name, const char *prefix, struct i2c_adapter *adapter, int addr) { char name_buffer[50]; @@ -200,7 +200,8 @@ { ctl_table *table; char *temp; - id -= 256; + + id -= 256; if (i2c_entries[id]) { table = i2c_entries[id]->ctl_table; unregister_sysctl_table(i2c_entries[id]); @@ -213,7 +214,7 @@ } } -int i2c_proc_chips(ctl_table * ctl, int write, struct file *filp, +static int i2c_proc_chips(ctl_table * ctl, int write, struct file *filp, void *buffer, size_t * lenp) { char BUF[SENSORS_PREFIX_MAX + 30]; @@ -251,7 +252,7 @@ return 0; } -int i2c_sysctl_chips(ctl_table * table, int *name, int nlen, +static int i2c_sysctl_chips(ctl_table * table, int *name, int nlen, void *oldval, size_t * oldlenp, void *newval, size_t newlen, void **context) { @@ -413,7 +414,7 @@ WARNING! This is tricky code. I have tested it, but there may still be hidden bugs in it, even leading to crashes and things! */ -int i2c_parse_reals(int *nrels, void *buffer, int bufsize, +static int i2c_parse_reals(int *nrels, void *buffer, int bufsize, long *results, int magnitude) { int maxels, min, mag; @@ -822,11 +823,11 @@ unregister_sysctl_table(i2c_proc_header); } +EXPORT_SYMBOL(i2c_register_entry); EXPORT_SYMBOL(i2c_deregister_entry); -EXPORT_SYMBOL(i2c_detect); EXPORT_SYMBOL(i2c_proc_real); -EXPORT_SYMBOL(i2c_register_entry); EXPORT_SYMBOL(i2c_sysctl_real); +EXPORT_SYMBOL(i2c_detect); MODULE_AUTHOR("Frodo Looijaard "); MODULE_DESCRIPTION("i2c-proc driver"); diff -Nru a/drivers/i2c/i2c-rpx.c b/drivers/i2c/i2c-rpx.c --- a/drivers/i2c/i2c-rpx.c Thu Feb 20 23:19:23 2003 +++ b/drivers/i2c/i2c-rpx.c Thu Feb 20 23:19:23 2003 @@ -17,12 +17,11 @@ #include #include #include - +#include +#include #include #include -#include -#include static void rpx_iic_init(struct i2c_algo_8xx_data *data) diff -Nru a/drivers/i2c/i2c-velleman.c b/drivers/i2c/i2c-velleman.c --- a/drivers/i2c/i2c-velleman.c Thu Feb 20 23:19:23 2003 +++ b/drivers/i2c/i2c-velleman.c Thu Feb 20 23:19:23 2003 @@ -18,17 +18,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ------------------------------------------------------------------------- */ -/* $Id: i2c-velleman.c,v 1.23 2001/11/19 18:45:02 mds Exp $ */ +/* $Id: i2c-velleman.c,v 1.29 2003/01/21 08:08:16 kmalkki Exp $ */ #include #include #include #include -#include /* for 2.0 kernels to get NULL */ -#include /* for 2.0 kernels to get ENODEV */ -#include +#include #include #include +#include /* ----- global defines ----------------------------------------------- */ #define DEB(x) /* should be reasonable open, close &c. */ @@ -104,12 +103,13 @@ */ static struct i2c_algo_bit_data bit_velle_data = { - NULL, - bit_velle_setsda, - bit_velle_setscl, - bit_velle_getsda, - bit_velle_getscl, - 10, 10, 100, /* waits, timeout */ + .setsda = bit_velle_setsda, + .setscl = bit_velle_setscl, + .getsda = bit_velle_getsda, + .getscl = bit_velle_getscl, + .udelay = 10, + .mdelay = 10, + .timeout = HZ }; static struct i2c_adapter bit_velle_ops = { diff -Nru a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c --- a/drivers/ide/arm/icside.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/arm/icside.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/icside.c + * linux/drivers/ide/arm/icside.c * * Copyright (c) 1996-2002 Russell King. * @@ -813,7 +813,7 @@ for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; - if (hwif->io_ports[IDE_DATA_OFFSET] == (ide_ioreg_t)dataport) + if (hwif->io_ports[IDE_DATA_OFFSET] == dataport) goto found; } @@ -841,8 +841,8 @@ memset(&hwif->hw, 0, sizeof(hw_regs_t)); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { - hwif->hw.io_ports[i] = (ide_ioreg_t)port; - hwif->io_ports[i] = (ide_ioreg_t)port; + hwif->hw.io_ports[i] = port; + hwif->io_ports[i] = port; port += 1 << info->stepping; } hwif->hw.io_ports[IDE_CONTROL_OFFSET] = base + info->ctrloffset; diff -Nru a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c --- a/drivers/ide/arm/rapide.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/arm/rapide.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/rapide.c + * linux/drivers/ide/arm/rapide.c * * Copyright (c) 1996-2002 Russell King. */ @@ -25,7 +25,7 @@ memset(&hw, 0, sizeof(hw)); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { - hw.io_ports[i] = (ide_ioreg_t)port; + hw.io_ports[i] = port; port += 1 << 4; } hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206; diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c --- a/drivers/ide/ide-cd.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/ide-cd.c Thu Feb 20 23:19:21 2003 @@ -846,6 +846,7 @@ } /* Set up the controller registers. */ + /* FIXME: for Virtual DMA we must check harder */ HWIF(drive)->OUTB(info->dma, IDE_FEATURE_REG); HWIF(drive)->OUTB(0, IDE_IREASON_REG); HWIF(drive)->OUTB(0, IDE_SECTOR_REG); @@ -854,13 +855,10 @@ HWIF(drive)->OUTB(xferlen >> 8 , IDE_BCOUNTH_REG); if (IDE_CONTROL_REG) HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG); - + if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) { - if (HWGROUP(drive)->handler != NULL) - BUG(); - ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry); /* packet command */ - HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG); + ide_execute_command(drive, WIN_PACKETCMD, handler, WAIT_CMD, cdrom_timer_expiry); return ide_started; } else { /* packet command */ @@ -1276,9 +1274,7 @@ * this condition is far too common, to bother * users about it */ -#if 0 - printk("%s: disabled DSC seek overlap\n", drive->name); -#endif + /* printk("%s: disabled DSC seek overlap\n", drive->name);*/ drive->dsc_overlap = 0; } } @@ -2965,8 +2961,10 @@ printk(", %dkB Cache", be16_to_cpu(cap.buffer_size)); +#ifdef CONFIG_BLK_DEV_IDEDMA if (drive->using_dma) (void) HWIF(drive)->ide_dma_verbose(drive); +#endif /* CONFIG_BLK_DEV_IDEDMA */ printk("\n"); return nslots; @@ -3261,11 +3259,7 @@ .version = IDECD_VERSION, .media = ide_cdrom, .busy = 0, -#ifdef CONFIG_IDEDMA_ONLYDISK - .supports_dma = 0, -#else .supports_dma = 1, -#endif .supports_dsc_overlap = 1, .cleanup = ide_cdrom_cleanup, .do_request = ide_do_rw_cdrom, diff -Nru a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c --- a/drivers/ide/ide-dma.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/ide-dma.c Thu Feb 20 23:19:21 2003 @@ -90,9 +90,6 @@ #include #include -#define CONFIG_IDEDMA_NEW_DRIVE_LISTINGS -#ifdef CONFIG_IDEDMA_NEW_DRIVE_LISTINGS - struct drive_list_entry { char * id_model; char * id_firmware; @@ -165,40 +162,6 @@ return 0; } -#else /* !CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ - -/* - * good_dma_drives() lists the model names (from "hdparm -i") - * of drives which do not support mode2 DMA but which are - * known to work fine with this interface under Linux. - */ -const char *good_dma_drives[] = {"Micropolis 2112A", - "CONNER CTMA 4000", - "CONNER CTT8000-A", - "ST34342A", /* for Sun Ultra */ - NULL}; - -/* - * bad_dma_drives() lists the model names (from "hdparm -i") - * of drives which supposedly support (U)DMA but which are - * known to corrupt data with this interface under Linux. - * - * This is an empirical list. Its generated from bug reports. That means - * while it reflects actual problem distributions it doesn't answer whether - * the drive or the controller, or cabling, or software, or some combination - * thereof is the fault. If you don't happen to agree with the kernel's - * opinion of your drive - use hdparm to turn DMA on. - */ -const char *bad_dma_drives[] = {"WDC AC11000H", - "WDC AC22100H", - "WDC AC32100H", - "WDC AC32500H", - "WDC AC33100H", - "WDC AC31600H", - NULL}; - -#endif /* CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ - /** * ide_dma_intr - IDE DMA interrupt handler * @drive: the drive the interrupt is for @@ -282,6 +245,7 @@ hwif->sg_dma_direction = PCI_DMA_TODEVICE; else hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; + #if 1 if (sector_count > 256) BUG(); @@ -822,7 +786,6 @@ if (!drive->waiting_for_dma) printk(KERN_WARNING "%s: (%s) called while not waiting\n", drive->name, __FUNCTION__); - drive->waiting_for_dma++; return 0; } @@ -832,24 +795,11 @@ { struct hd_driveid *id = drive->id; -#ifdef CONFIG_IDEDMA_NEW_DRIVE_LISTINGS int blacklist = in_drive_list(id, drive_blacklist); if (blacklist) { - printk("%s: Disabling (U)DMA for %s\n", drive->name, id->model); + printk(KERN_WARNING "%s: Disabling (U)DMA for %s\n", drive->name, id->model); return(blacklist); } -#else /* !CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ - const char **list; - /* Consult the list of known "bad" drives */ - list = bad_dma_drives; - while (*list) { - if (!strcmp(*list++,id->model)) { - printk("%s: Disabling (U)DMA for %s\n", - drive->name, id->model); - return 1; - } - } -#endif /* CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ return 0; } @@ -858,19 +808,7 @@ int __ide_dma_good_drive (ide_drive_t *drive) { struct hd_driveid *id = drive->id; - -#ifdef CONFIG_IDEDMA_NEW_DRIVE_LISTINGS return in_drive_list(id, drive_whitelist); -#else /* !CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ - const char **list; - /* Consult the list of known "good" drives */ - list = good_dma_drives; - while (*list) { - if (!strcmp(*list++,id->model)) - return 1; - } -#endif /* CONFIG_IDEDMA_NEW_DRIVE_LISTINGS */ - return 0; } EXPORT_SYMBOL(__ide_dma_good_drive); diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c --- a/drivers/ide/ide-floppy.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/ide-floppy.c Thu Feb 20 23:19:21 2003 @@ -1857,11 +1857,7 @@ .version = IDEFLOPPY_VERSION, .media = ide_floppy, .busy = 0, -#ifdef CONFIG_IDEDMA_ONLYDISK - .supports_dma = 0, -#else .supports_dma = 1, -#endif .supports_dsc_overlap = 0, .cleanup = idefloppy_cleanup, .do_request = idefloppy_do_request, diff -Nru a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c --- a/drivers/ide/ide-iops.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/ide-iops.c Thu Feb 20 23:19:21 2003 @@ -31,60 +31,129 @@ #include #include +/* + * IDE operator we assign to an unplugged device so that + * we don't trash new hardware assigned the same resources + */ + +static u8 ide_unplugged_inb (unsigned long port) +{ + return 0xFF; +} + +static u16 ide_unplugged_inw (unsigned long port) +{ + return 0xFFFF; +} + +static void ide_unplugged_insw (unsigned long port, void *addr, u32 count) +{ +} + +static u32 ide_unplugged_inl (unsigned long port) +{ + return 0xFFFFFFFF; +} + +static void ide_unplugged_insl (unsigned long port, void *addr, u32 count) +{ +} + +static void ide_unplugged_outb (u8 addr, unsigned long port) +{ +} + +static void ide_unplugged_outw (u16 addr, unsigned long port) +{ +} + +static void ide_unplugged_outsw (unsigned long port, void *addr, u32 count) +{ +} + +static void ide_unplugged_outl (u32 addr, unsigned long port) +{ +} + +static void ide_unplugged_outsl (unsigned long port, void *addr, u32 count) +{ +} -static u8 ide_inb (ide_ioreg_t port) +void unplugged_hwif_iops (ide_hwif_t *hwif) +{ + hwif->OUTB = ide_unplugged_outb; + hwif->OUTBSYNC = ide_unplugged_outb; + hwif->OUTW = ide_unplugged_outw; + hwif->OUTL = ide_unplugged_outl; + hwif->OUTSW = ide_unplugged_outsw; + hwif->OUTSL = ide_unplugged_outsl; + hwif->INB = ide_unplugged_inb; + hwif->INW = ide_unplugged_inw; + hwif->INL = ide_unplugged_inl; + hwif->INSW = ide_unplugged_insw; + hwif->INSL = ide_unplugged_insl; +} + +EXPORT_SYMBOL(unplugged_hwif_iops); + +/* + * Conventional PIO operations for ATA devices + */ + +static u8 ide_inb (unsigned long port) { return (u8) inb(port); } -static u16 ide_inw (ide_ioreg_t port) +static u16 ide_inw (unsigned long port) { return (u16) inw(port); } -static void ide_insw (ide_ioreg_t port, void *addr, u32 count) +static void ide_insw (unsigned long port, void *addr, u32 count) { return insw(port, addr, count); } -static u32 ide_inl (ide_ioreg_t port) +static u32 ide_inl (unsigned long port) { return (u32) inl(port); } -static void ide_insl (ide_ioreg_t port, void *addr, u32 count) +static void ide_insl (unsigned long port, void *addr, u32 count) { insl(port, addr, count); } -static void ide_outb (u8 value, ide_ioreg_t port) +static void ide_outb (u8 addr, unsigned long port) { - outb(value, port); + outb(addr, port); } -static void ide_outw (u16 value, ide_ioreg_t port) +static void ide_outw (u16 addr, unsigned long port) { - outw(value, port); + outw(addr, port); } -static void ide_outsw (ide_ioreg_t port, void *addr, u32 count) +static void ide_outsw (unsigned long port, void *addr, u32 count) { outsw(port, addr, count); } -static void ide_outl (u32 value, ide_ioreg_t port) +static void ide_outl (u32 addr, unsigned long port) { - outl(value, port); + outl(addr, port); } -static void ide_outsl (ide_ioreg_t port, void *addr, u32 count) +static void ide_outsl (unsigned long port, void *addr, u32 count) { - outsl(port, addr, count); + return outsl(port, addr, count); } void default_hwif_iops (ide_hwif_t *hwif) { hwif->OUTB = ide_outb; + hwif->OUTBSYNC = ide_outb; hwif->OUTW = ide_outw; hwif->OUTL = ide_outl; hwif->OUTSW = ide_outsw; @@ -98,78 +167,66 @@ EXPORT_SYMBOL(default_hwif_iops); -static u8 ide_mm_inb (ide_ioreg_t port) +/* + * MMIO operations, typically used for SATA controllers + */ + +static u8 ide_mm_inb (unsigned long port) { return (u8) readb(port); } -static u16 ide_mm_inw (ide_ioreg_t port) +static u16 ide_mm_inw (unsigned long port) { return (u16) readw(port); } -static void ide_mm_insw (ide_ioreg_t port, void *addr, u32 count) +static void ide_mm_insw (unsigned long port, void *addr, u32 count) { -#ifdef CONFIG_PPC - /* Can we move the barrier out of the loop ? */ - while (count--) { *(u16 *)addr = __raw_readw(port); iobarrier_r(); addr += 2; } -#else /* everything else is sane benh */ - while (count--) { *(u16 *)addr = readw(port); addr += 2; } -#endif + __ide_mm_insw(port, addr, count); } -static u32 ide_mm_inl (ide_ioreg_t port) +static u32 ide_mm_inl (unsigned long port) { return (u32) readl(port); } -static void ide_mm_insl (ide_ioreg_t port, void *addr, u32 count) +static void ide_mm_insl (unsigned long port, void *addr, u32 count) { -#ifdef CONFIG_PPC - /* Can we move the barrier out of the loop ? */ - while (count--) { *(u32 *)addr = __raw_readl(port); iobarrier_r(); addr += 4; } -#else /* everything else is sane benh */ - while (count--) { *(u32 *)addr = readl(port); addr += 4; } -#endif + __ide_mm_insl(port, addr, count); } -static void ide_mm_outb (u8 value, ide_ioreg_t port) +static void ide_mm_outb (u8 value, unsigned long port) { writeb(value, port); } -static void ide_mm_outw (u16 value, ide_ioreg_t port) +static void ide_mm_outw (u16 value, unsigned long port) { writew(value, port); } -static void ide_mm_outsw (ide_ioreg_t port, void *addr, u32 count) +static void ide_mm_outsw (unsigned long port, void *addr, u32 count) { -#ifdef CONFIG_PPC - /* Can we move the barrier out of the loop ? */ - while (count--) { __raw_writew(*(u16 *)addr, port); iobarrier_w(); addr += 2; } -#else /* everything else is sane benh */ - while (count--) { writew(*(u16 *)addr, port); addr += 2; } -#endif + __ide_mm_outsw(port, addr, count); } -static void ide_mm_outl (u32 value, ide_ioreg_t port) +static void ide_mm_outl (u32 value, unsigned long port) { writel(value, port); } -static void ide_mm_outsl (ide_ioreg_t port, void *addr, u32 count) +static void ide_mm_outsl (unsigned long port, void *addr, u32 count) { -#ifdef CONFIG_PPC - while (count--) { __raw_writel(*(u32 *)addr, port); iobarrier_w(); addr += 4; } -#else /* everything else is sane benh */ - while (count--) { writel(*(u32 *)addr, port); addr += 4; } -#endif + __ide_mm_outsl(port, addr, count); } void default_hwif_mmiops (ide_hwif_t *hwif) { hwif->OUTB = ide_mm_outb; + /* Most systems will need to override OUTBSYNC, alas however + this one is controller specific! */ + hwif->OUTBSYNC = ide_mm_outb; hwif->OUTW = ide_mm_outw; hwif->OUTL = ide_mm_outl; hwif->OUTSW = ide_mm_outsw; @@ -245,7 +302,7 @@ * of the sector count register location, with interrupts disabled * to ensure that the reads all happen together. */ -void ata_vlb_sync (ide_drive_t *drive, ide_ioreg_t port) +void ata_vlb_sync (ide_drive_t *drive, unsigned long port) { (void) HWIF(drive)->INB(port); (void) HWIF(drive)->INB(port); @@ -819,9 +876,9 @@ // while (HWGROUP(drive)->busy) // ide_delay_50ms(); -#if !defined(CONFIG_DMA_NONPCI) +#if defined(CONFIG_BLK_DEV_IDEDMA) && !defined(CONFIG_DMA_NONPCI) hwif->ide_dma_host_off(drive); -#endif /* !(CONFIG_DMA_NONPCI) */ +#endif /* (CONFIG_BLK_DEV_IDEDMA) && !(CONFIG_DMA_NONPCI) */ /* * Don't use ide_wait_cmd here - it will @@ -887,12 +944,12 @@ drive->id->dma_mword &= ~0x0F00; drive->id->dma_1word &= ~0x0F00; -#if !defined(CONFIG_DMA_NONPCI) +#if defined(CONFIG_BLK_DEV_IDEDMA) && !defined(CONFIG_DMA_NONPCI) if (speed >= XFER_SW_DMA_0) hwif->ide_dma_host_on(drive); else - hwif->ide_dma_off(drive); -#endif /* !(CONFIG_DMA_NONPCI) */ + hwif->ide_dma_off_quietly(drive); +#endif /* (CONFIG_BLK_DEV_IDEDMA) && !(CONFIG_DMA_NONPCI) */ switch(speed) { case XFER_UDMA_7: drive->id->dma_ultra |= 0x8080; break; @@ -926,6 +983,8 @@ * at the appropriate code to handle the next interrupt, and a * timer is started to prevent us from waiting forever in case * something goes wrong (see the ide_timer_expiry() handler later on). + * + * See also ide_execute_command */ void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry) @@ -935,7 +994,7 @@ spin_lock_irqsave(&ide_lock, flags); if (hwgroup->handler != NULL) { - printk("%s: ide_set_handler: handler not null; " + printk(KERN_CRIT "%s: ide_set_handler: handler not null; " "old=%p, new=%p\n", drive->name, hwgroup->handler, handler); } @@ -947,6 +1006,47 @@ } EXPORT_SYMBOL(ide_set_handler); + +/** + * ide_execute_command - execute an IDE command + * @drive: IDE drive to issue the command against + * @command: command byte to write + * @handler: handler for next phase + * @timeout: timeout for command + * @expiry: handler to run on timeout + * + * Helper function to issue an IDE command. This handles the + * atomicity requirements, command timing and ensures that the + * handler and IRQ setup do not race. All IDE command kick off + * should go via this function or do equivalent locking. + */ + +void ide_execute_command(ide_drive_t *drive, task_ioreg_t cmd, ide_handler_t *handler, unsigned timeout, ide_expiry_t *expiry) +{ + unsigned long flags; + ide_hwgroup_t *hwgroup = HWGROUP(drive); + ide_hwif_t *hwif = HWIF(drive); + + spin_lock_irqsave(&ide_lock, flags); + + if(hwgroup->handler) + BUG(); + hwgroup->handler = handler; + hwgroup->expiry = expiry; + hwgroup->timer.expires = jiffies + timeout; + add_timer(&hwgroup->timer); + hwif->OUTBSYNC(cmd, IDE_COMMAND_REG); + /* Drive takes 400nS to respond, we must avoid the IRQ being + serviced before that. + + FIXME: we could skip this delay with care on non shared + devices + */ + ndelay(400); + spin_unlock_irqrestore(&ide_lock, flags); +} + +EXPORT_SYMBOL(ide_execute_command); /* needed below */ diff -Nru a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c --- a/drivers/ide/ide-pnp.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/ide-pnp.c Thu Feb 20 23:19:22 2003 @@ -58,9 +58,9 @@ if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) return 1; - ide_setup_ports(&hw, (ide_ioreg_t) pnp_port_start(dev, 0), + ide_setup_ports(&hw, (unsigned long) pnp_port_start(dev, 0), generic_ide_offsets, - (ide_ioreg_t) pnp_port_start(dev, 1), + (unsigned long) pnp_port_start(dev, 1), 0, NULL, // generic_pnp_ide_iops, pnp_irq(dev, 0)); diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c --- a/drivers/ide/ide-probe.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/ide-probe.c Thu Feb 20 23:19:22 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/ide-probe.c Version 1.07 March 18, 2001 + * linux/drivers/ide/ide-probe.c Version 1.10 Feb 11, 2003 * * Copyright (C) 1994-1998 Linus Torvalds & authors (see below) */ @@ -27,6 +27,8 @@ * Version 1.06 stream line request queue and prep for cascade project. * Version 1.07 max_sect <= 255; slower disks would get behind and * then fall over when they get to 256. Paul G. + * Version 1.10 Update set for new IDE. drive->id is now always + * valid after probe time even with noprobe */ #undef REALLY_SLOW_IO /* most systems can safely undef this */ @@ -54,22 +56,54 @@ #include #include -/* - * CompactFlash cards and their brethern pretend to be removable - * hard disks, except: - * (1) they never have a slave unit, and - * (2) they don't have doorlock mechanisms. - * This test catches them, and is invoked elsewhere when setting - * appropriate config bits. - * - * FIXME: This treatment is probably applicable for *all* PCMCIA (PC CARD) - * devices, so in linux 2.3.x we should change this to just treat all PCMCIA - * drives this way, and get rid of the model-name tests below - * (too big of an interface change for 2.2.x). - * At that time, we might also consider parameterizing the timeouts and retries, - * since these are MUCH faster than mechanical drives. -M.Lord +/** + * generic_id - add a generic drive id + * @drive: drive to make an ID block for + * + * Add a fake id field to the drive we are passed. This allows + * use to skip a ton of NULL checks (which people always miss) + * and make drive properties unconditional outside of this file */ -inline int drive_is_flashcard (ide_drive_t *drive) + +static int generic_id(ide_drive_t *drive) +{ + drive->id = kmalloc(SECTOR_WORDS *4, GFP_KERNEL); + if(drive->id == NULL) + { + printk(KERN_ERR "ide: out of memory for id data.\n"); + return -ENOMEM; + } + memset(drive->id, 0, SECTOR_WORDS * 4); + drive->id->cyls = drive->cyl; + drive->id->heads = drive->head; + drive->id->sectors = drive->sect; + drive->id->cur_cyls = drive->cyl; + drive->id->cur_heads = drive->head; + drive->id->cur_sectors = drive->sect; + strcpy(drive->id->model, "UNKNOWN"); + return 0; +} + +/** + * drive_is_flashcard - check for compact flash + * @drive: drive to check + * + * CompactFlash cards and their brethern pretend to be removable + * hard disks, except: + * (1) they never have a slave unit, and + * (2) they don't have doorlock mechanisms. + * This test catches them, and is invoked elsewhere when setting + * appropriate config bits. + * + * FIXME: This treatment is probably applicable for *all* PCMCIA (PC CARD) + * devices, so in linux 2.3.x we should change this to just treat all + * PCMCIA drives this way, and get rid of the model-name tests below + * (too big of an interface change for 2.4.x). + * At that time, we might also consider parameterizing the timeouts and + * retries, since these are MUCH faster than mechanical drives. -M.Lord + */ + +static inline int drive_is_flashcard (ide_drive_t *drive) { struct hd_driveid *id = drive->id; @@ -88,6 +122,16 @@ return 0; /* no, it is not a flash memory card */ } +/** + * do_identify - identify a drive + * @drive: drive to identify + * @cmd: command used + * + * Called when we have issued a drive identify command to + * read and parse the results. This function is run with + * interrupts disabled. + */ + static inline void do_identify (ide_drive_t *drive, u8 cmd) { ide_hwif_t *hwif = HWIF(drive); @@ -207,6 +251,7 @@ */ if (id->config & (1<<7)) drive->removable = 1; + /* * Prevent long system lockup probing later for non-existant * slave drive if the hwif is actually a flash memory card of @@ -214,11 +259,17 @@ */ drive->is_flash = 0; if (drive_is_flashcard(drive)) { +#if 0 + /* The new IDE adapter widgets don't follow this heuristic + so we must nowdays just bite the bullet and take the + probe hit */ + ide_drive_t *mate = &hwif->drives[1^drive->select.b.unit]; ide_drive_t *mate = &hwif->drives[1^drive->select.b.unit]; if (!mate->ata_flash) { mate->present = 0; mate->noprobe = 1; } +#endif drive->is_flash = 1; } drive->media = ide_disk; @@ -244,21 +295,26 @@ return; } -/* - * try_to_identify() sends an ATA(PI) IDENTIFY request to a drive - * and waits for a response. It also monitors irqs while this is - * happening, in hope of automatically determining which one is - * being used by the interface. +/** + * actual_try_to_identify - send ata/atapi identify + * @drive: drive to identify + * @cmd: comamnd to use * - * Returns: 0 device was identified - * 1 device timed-out (no response to identify request) - * 2 device aborted the command (refused to identify itself) + * try_to_identify() sends an ATA(PI) IDENTIFY request to a drive + * and waits for a response. It also monitors irqs while this is + * happening, in hope of automatically determining which one is + * being used by the interface. + * + * Returns: 0 device was identified + * 1 device timed-out (no response to identify request) + * 2 device aborted the command (refused to identify itself) */ + static int actual_try_to_identify (ide_drive_t *drive, u8 cmd) { ide_hwif_t *hwif = HWIF(drive); int rc; - ide_ioreg_t hd_status; + unsigned long hd_status; unsigned long timeout; u8 s = 0, a = 0; @@ -268,7 +324,7 @@ a = hwif->INB(IDE_ALTSTATUS_REG); s = hwif->INB(IDE_STATUS_REG); if ((a ^ s) & ~INDEX_STAT) { - printk("%s: probing with STATUS(0x%02x) instead of " + printk(KERN_INFO "%s: probing with STATUS(0x%02x) instead of " "ALTSTATUS(0x%02x)\n", drive->name, s, a); /* ancient Seagate drives, broken interfaces */ hd_status = IDE_STATUS_REG; @@ -327,6 +383,16 @@ return rc; } +/** + * try_to_identify - try to identify a drive + * @drive: drive to probe + * @cmd: comamnd to use + * + * Issue the identify command and then do IRQ probing to + * complete the identification when needed by finding the + * IRQ the drive is attached to + */ + static int try_to_identify (ide_drive_t *drive, u8 cmd) { ide_hwif_t *hwif = HWIF(drive); @@ -376,15 +442,19 @@ } -/* - * do_probe() has the difficult job of finding a drive if it exists, - * without getting hung up if it doesn't exist, without trampling on - * ethernet cards, and without leaving any IRQs dangling to haunt us later. - * - * If a drive is "known" to exist (from CMOS or kernel parameters), - * but does not respond right away, the probe will "hang in there" - * for the maximum wait time (about 30 seconds), otherwise it will - * exit much more quickly. +/** + * do_probe - probe an IDE device + * @drive: drive to probe + * @cmd: command to use + * + * do_probe() has the difficult job of finding a drive if it exists, + * without getting hung up if it doesn't exist, without trampling on + * ethernet cards, and without leaving any IRQs dangling to haunt us later. + * + * If a drive is "known" to exist (from CMOS or kernel parameters), + * but does not respond right away, the probe will "hang in there" + * for the maximum wait time (about 30 seconds), otherwise it will + * exit much more quickly. * * Returns: 0 device was identified * 1 device timed-out (no response to identify request) @@ -392,6 +462,7 @@ * 3 bad status from device (possible for ATAPI drives) * 4 probe was not attempted because failure was obvious */ + static int do_probe (ide_drive_t *drive, u8 cmd) { int rc; @@ -507,44 +578,55 @@ } } -/* - * probe_for_drive() tests for existence of a given drive using do_probe(). +/** + * probe_for_drives - upper level drive probe + * @drive: drive to probe for + * + * probe_for_drive() tests for existence of a given drive using do_probe() + * and presents things to the user as needed. * - * Returns: 0 no device was found - * 1 device was found (note: drive->present might still be 0) + * Returns: 0 no device was found + * 1 device was found (note: drive->present might + * still be 0) */ + static inline u8 probe_for_drive (ide_drive_t *drive) { /* skip probing? */ - if (drive->noprobe) - return drive->present; - - /* if !(success||timed-out) */ - if (do_probe(drive, WIN_IDENTIFY) >= 2) { - /* look for ATAPI device */ - (void) do_probe(drive, WIN_PIDENTIFY); + if (!drive->noprobe) + { + /* if !(success||timed-out) */ + if (do_probe(drive, WIN_IDENTIFY) >= 2) { + /* look for ATAPI device */ + (void) do_probe(drive, WIN_PIDENTIFY); + } + if (drive->id && strstr(drive->id->model, "E X A B Y T E N E S T")) + enable_nest(drive); + if (!drive->present) + /* drive not found */ + return 0; + + /* identification failed? */ + if (drive->id == NULL) { + if (drive->media == ide_disk) { + printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n", + drive->name, drive->cyl, + drive->head, drive->sect); + } else if (drive->media == ide_cdrom) { + printk(KERN_INFO "%s: ATAPI cdrom (?)\n", drive->name); + } else { + /* nuke it */ + drive->present = 0; + } + } + /* drive was found */ } - if (drive->id && strstr(drive->id->model, "E X A B Y T E N E S T")) - enable_nest(drive); - if (!drive->present) - /* drive not found */ + if(!drive->present) return 0; - - /* identification failed? */ - if (drive->id == NULL) { - if (drive->media == ide_disk) { - printk("%s: non-IDE drive, CHS=%d/%d/%d\n", - drive->name, drive->cyl, - drive->head, drive->sect); - } else if (drive->media == ide_cdrom) { - printk("%s: ATAPI cdrom (?)\n", drive->name); - } else { - /* nuke it */ + if(drive->id == NULL) + if(generic_id(drive) < 0) drive->present = 0; - } - } - /* drive was found */ - return 1; + return drive->present; } static int hwif_check_region(ide_hwif_t *hwif, unsigned long addr, int num) @@ -560,12 +642,21 @@ { printk("%s: %s resource 0x%lX-0x%lX not free.\n", hwif->name, hwif->mmio?"MMIO":"I/O", addr, addr+num-1); - mdelay(2000); } return err; } - + +/** + * hwif_check_regions - check resources for IDE + * @hwif: interface to use + * + * Checks if all the needed resources for an interface are free + * providing the interface is PIO. Right now core IDE code does + * this work which is deeply wrong. MMIO leaves it to the controller + * driver, PIO will migrate this way over time + */ + static int hwif_check_regions (ide_hwif_t *hwif) { u32 i = 0; @@ -627,6 +718,72 @@ //EXPORT_SYMBOL(hwif_register); +/* Enable code below on all archs later, for now, I want it on PPC + */ +#ifdef CONFIG_PPC +/* + * This function waits for the hwif to report a non-busy status + * see comments in probe_hwif() + */ +static int wait_not_busy(ide_hwif_t *hwif, unsigned long timeout) +{ + u8 stat = 0; + + while(timeout--) { + /* Turn this into a schedule() sleep once I'm sure + * about locking issues (2.5 work ?) + */ + mdelay(1); + stat = hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]); + if ((stat & BUSY_STAT) == 0) + break; + /* Assume a value of 0xff means nothing is connected to + * the interface and it doesn't implement the pull-down + * resistor on D7 + */ + if (stat == 0xff) + break; + } + return ((stat & BUSY_STAT) == 0) ? 0 : -EBUSY; +} + +static int wait_hwif_ready(ide_hwif_t *hwif) +{ + int rc; + + printk(KERN_INFO "Probing IDE interface %s...\n", hwif->name); + + /* Let HW settle down a bit from whatever init state we + * come from */ + mdelay(2); + + /* Wait for BSY bit to go away, spec timeout is 30 seconds, + * I know of at least one disk who takes 31 seconds, I use 35 + * here to be safe + */ + rc = wait_not_busy(hwif, 35000); + if (rc) + return rc; + + /* Now make sure both master & slave are ready */ + SELECT_DRIVE(&hwif->drives[0]); + hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); + mdelay(2); + rc = wait_not_busy(hwif, 10000); + if (rc) + return rc; + SELECT_DRIVE(&hwif->drives[1]); + hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); + mdelay(2); + rc = wait_not_busy(hwif, 10000); + + /* Exit function with master reselected (let's be sane) */ + SELECT_DRIVE(&hwif->drives[0]); + + return rc; +} +#endif /* CONFIG_PPC */ + /* * This routine only knows how to look for drive units 0 and 1 * on an interface, so any setting of MAX_DRIVES > 2 won't work here. @@ -650,13 +807,13 @@ ide_drive_t *drive = &hwif->drives[unit]; if (drive->present) { drive->present = 0; - printk("%s: ERROR, PORTS ALREADY IN USE\n", + printk(KERN_ERR "%s: ERROR, PORTS ALREADY IN USE\n", drive->name); msgout = 1; } } if (!msgout) - printk("%s: ports already in use, skipping probe\n", + printk(KERN_ERR "%s: ports already in use, skipping probe\n", hwif->name); return; } @@ -666,17 +823,35 @@ * we'll install our IRQ driver much later... */ irqd = hwif->irq; - - if (irqd >= NR_IRQS) - { - printk(KERN_ERR "***WARNING***: Bogus interrupt reported. Probably a bug in the Linux ACPI\n"); - printk(KERN_ERR "***WARNING***: Attempting to continue as best we can.\n"); - irqd = 0; - } if (irqd) disable_irq(hwif->irq); local_irq_set(flags); + +#ifdef CONFIG_PPC + /* This is needed on some PPCs and a bunch of BIOS-less embedded + * platforms. Typical cases are: + * + * - The firmware hard reset the disk before booting the kernel, + * the drive is still doing it's poweron-reset sequence, that + * can take up to 30 seconds + * - The firmware does nothing (or no firmware), the device is + * still in POST state (same as above actually). + * - Some CD/DVD/Writer combo drives tend to drive the bus during + * their reset sequence even when they are non-selected slave + * devices, thus preventing discovery of the main HD + * + * Doing this wait-for-busy should not harm any existing configuration + * (at least things won't be worse than what current code does, that + * is blindly go & talk to the drive) and fix some issues like the + * above. + * + * BenH. + */ + if (wait_hwif_ready(hwif)) + printk(KERN_WARNING "%s: Wait for ready failed before probe !\n", hwif->name); +#endif /* CONFIG_PPC */ + /* * Second drive should only exist if first drive was found, * but a lot of cdrom drives are configured as single slaves. @@ -689,6 +864,7 @@ if (drive->present && !hwif->present) { hwif->present = 1; if (hwif->chipset != ide_4drives || + !hwif->mate || !hwif->mate->present) { hwif_register(hwif); } @@ -698,7 +874,7 @@ unsigned long timeout = jiffies + WAIT_WORSTCASE; u8 stat; - printk("%s: reset\n", hwif->name); + printk(KERN_WARNING "%s: reset\n", hwif->name); hwif->OUTB(12, hwif->io_ports[IDE_CONTROL_OFFSET]); udelay(10); hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); @@ -718,11 +894,18 @@ for (unit = 0; unit < MAX_DRIVES; ++unit) { ide_drive_t *drive = &hwif->drives[unit]; + int enable_dma = 1; + if (drive->present) { if (hwif->tuneproc != NULL && drive->autotune == IDE_TUNE_AUTO) /* auto-tune PIO mode */ hwif->tuneproc(drive, 255); + +#ifdef CONFIG_IDEDMA_ONLYDISK + if (drive->media != ide_disk) + enable_dma = 0; +#endif /* * MAJOR HACK BARF :-/ * @@ -742,7 +925,8 @@ * PARANOIA!!! */ hwif->ide_dma_off_quietly(drive); - hwif->ide_dma_check(drive); + if (enable_dma) + hwif->ide_dma_check(drive); } } } @@ -757,7 +941,6 @@ probe_hwif(hwif); hwif_init(hwif); -#if 1 if (hwif->present) { u16 unit = 0; for (unit = 0; unit < MAX_DRIVES; ++unit) { @@ -767,7 +950,6 @@ } } } -#endif hwif->initializing = 0; return 0; } @@ -855,13 +1037,8 @@ ide_hwgroup_t *hwgroup, *new_hwgroup; ide_hwif_t *match = NULL; -#if 0 - /* Allocate the buffer and no sleep allowed */ - new_hwgroup = kmalloc(sizeof(ide_hwgroup_t),GFP_ATOMIC); -#else /* Allocate the buffer and potentially sleep first */ new_hwgroup = kmalloc(sizeof(ide_hwgroup_t),GFP_KERNEL); -#endif spin_lock_irqsave(&ide_lock, flags); @@ -1188,7 +1365,7 @@ { unsigned int index; int probe[MAX_HWIFS]; - + MOD_INC_USE_COUNT; memset(probe, 0, MAX_HWIFS * sizeof(int)); for (index = 0; index < MAX_HWIFS; ++index) diff -Nru a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c --- a/drivers/ide/ide-proc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/ide-proc.c Thu Feb 20 23:19:22 2003 @@ -407,20 +407,40 @@ { ide_drive_t *drive = (ide_drive_t *)data; int len = 0, i = 0; + int err = 0; - if (drive && !taskfile_lib_get_identify(drive, page)) { + len = sprintf(page, "\n"); + + if (drive) + { unsigned short *val = (unsigned short *) page; - char *out = ((char *)val) + (SECTOR_WORDS * 4); - page = out; - do { - out += sprintf(out, "%04x%c", - le16_to_cpu(*val), (++i & 7) ? ' ' : '\n'); - val += 1; - } while (i < (SECTOR_WORDS * 2)); - len = out - page; + + /* + * The current code can't handle a driverless + * identify query taskfile. Now the right fix is + * to add a 'default' driver but that is a bit + * more work. + * + * FIXME: this has to be fixed for hotswap devices + */ + + if(DRIVER(drive)) + err = taskfile_lib_get_identify(drive, page); + else /* This relies on the ID changes */ + val = (unsigned short *)drive->id; + + if(!err) + { + char *out = ((char *)page) + (SECTOR_WORDS * 4); + page = out; + do { + out += sprintf(out, "%04x%c", + le16_to_cpu(*val), (++i & 7) ? ' ' : '\n'); + val += 1; + } while (i < (SECTOR_WORDS * 2)); + len = out - page; + } } - else - len = sprintf(page, "\n"); PROC_IDE_READ_RETURN(page,start,off,count,eof,len); } @@ -434,6 +454,7 @@ char *out = page; int len, rc, mul_factor, div_factor; + down(&ide_setting_sem); out += sprintf(out, "name\t\t\tvalue\t\tmin\t\tmax\t\tmode\n"); out += sprintf(out, "----\t\t\t-----\t\t---\t\t---\t\t----\n"); while(setting) { @@ -453,6 +474,7 @@ setting = setting->next; } len = out - page; + up(&ide_setting_sem); PROC_IDE_READ_RETURN(page,start,off,count,eof,len); } @@ -521,12 +543,17 @@ --n; ++p; } + + down(&ide_setting_sem); setting = ide_find_setting_by_name(drive, name); if (!setting) + { + up(&ide_setting_sem); goto parse_error; - + } if (for_real) ide_write_setting(drive, setting, val * setting->div_factor / setting->mul_factor); + up(&ide_setting_sem); } } while (!for_real++); return count; diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c --- a/drivers/ide/ide-tape.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/ide-tape.c Thu Feb 20 23:19:21 2003 @@ -6221,11 +6221,7 @@ .version = IDETAPE_VERSION, .media = ide_tape, .busy = 1, -#ifdef CONFIG_IDEDMA_ONLYDISK - .supports_dma = 0, -#else .supports_dma = 1, -#endif .supports_dsc_overlap = 1, .cleanup = idetape_cleanup, .do_request = idetape_do_request, diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c --- a/drivers/ide/ide.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/ide.c Thu Feb 20 23:19:20 2003 @@ -775,6 +775,7 @@ hwif->iops = old_hwif.iops; #else hwif->OUTB = old_hwif.OUTB; + hwif->OUTBSYNC = old_hwif.OUTBSYNC; hwif->OUTW = old_hwif.OUTW; hwif->OUTL = old_hwif.OUTL; hwif->OUTSW = old_hwif.OUTSW; @@ -833,8 +834,8 @@ */ void ide_setup_ports ( hw_regs_t *hw, - ide_ioreg_t base, int *offsets, - ide_ioreg_t ctrl, ide_ioreg_t intr, + unsigned long base, int *offsets, + unsigned long ctrl, unsigned long intr, ide_ack_intr_t *ack_intr, /* * ide_io_ops_t *iops, @@ -930,38 +931,52 @@ int ide_register (int arg1, int arg2, int irq) { hw_regs_t hw; - ide_init_hwif_ports(&hw, (ide_ioreg_t) arg1, (ide_ioreg_t) arg2, NULL); + ide_init_hwif_ports(&hw, (unsigned long) arg1, (unsigned long) arg2, NULL); hw.irq = irq; return ide_register_hw(&hw, NULL); } EXPORT_SYMBOL(ide_register); + +/* + * Locks for IDE setting functionality + */ + +DECLARE_MUTEX(ide_setting_sem); +EXPORT_SYMBOL(ide_setting_sem); + /** - * ide_add_setting - attach an IDE setting - * drive: drive the setting is for - * name: name of setting - * rw: set if writable - * read_ioctl: read function - * write_ioctl: write function - * data_type: form expected - * min: minimum - * max: maximum - * mul_factor: multiply by - * div_factor: divide by - * data: value - * set: handling for setting - * - * Add a setting to the IDE drive. Support automatic removal and allow - * all the work to be done by plugged in handlers. This code is also - * rather short on locking, but the current plan is to do the locking - * internally to the function. + * ide_add_setting - add an ide setting option + * @drive: drive to use + * @name: setting name + * @rw: true if the function is read write + * @read_ioctl: function to call on read + * @write_ioctl: function to call on write + * @data_type: type of data + * @min: range minimum + * @max: range maximum + * @mul_factor: multiplication scale + * @div_factor: divison scale + * @data: private data field + * @set: setting + * + * Removes the setting named from the device if it is present. + * The function takes the settings_lock to protect against + * parallel changes. This function must not be called from IRQ + * context. Returns 0 on success or -1 on failure. + * + * BUGS: This code is seriously over-engineered. There is also + * magic about how the driver specific features are setup. If + * a driver is attached we assume the driver settings are auto + * remove. */ -void ide_add_setting (ide_drive_t *drive, const char *name, int rw, int read_ioctl, int write_ioctl, int data_type, int min, int max, int mul_factor, int div_factor, void *data, ide_procset_t *set) +int ide_add_setting (ide_drive_t *drive, const char *name, int rw, int read_ioctl, int write_ioctl, int data_type, int min, int max, int mul_factor, int div_factor, void *data, ide_procset_t *set) { ide_settings_t **p = (ide_settings_t **) &drive->settings, *setting = NULL; + down(&ide_setting_sem); while ((*p) && strcmp((*p)->name, name) < 0) p = &((*p)->next); if ((setting = kmalloc(sizeof(*setting), GFP_KERNEL)) == NULL) @@ -980,49 +995,76 @@ setting->div_factor = div_factor; setting->data = data; setting->set = set; + setting->next = *p; if (drive->driver) setting->auto_remove = 1; *p = setting; - return; + up(&ide_setting_sem); + return 0; abort: + up(&ide_setting_sem); if (setting) kfree(setting); + return -1; } EXPORT_SYMBOL(ide_add_setting); /** - * ide_remove_setting - remove an ioctl setting - * @name: name of the property + * __ide_remove_setting - remove an ide setting option + * @drive: drive to use + * @name: setting name * - * Remove a drive ioctl setting that was created by ide_add_setting. - * Again this needs the locking fixed + * Removes the setting named from the device if it is present. + * The caller must hold the setting semaphore. */ -void ide_remove_setting (ide_drive_t *drive, char *name) +static void __ide_remove_setting (ide_drive_t *drive, char *name) { - ide_settings_t **p = (ide_settings_t **) &drive->settings, *setting; + ide_settings_t **p, *setting; + + p = (ide_settings_t **) &drive->settings; while ((*p) && strcmp((*p)->name, name)) p = &((*p)->next); if ((setting = (*p)) == NULL) return; + (*p) = setting->next; + kfree(setting->name); kfree(setting); } +/** + * ide_remove_setting - remove an ide setting option + * @drive: drive to use + * @name: setting name + * + * Removes the setting named from the device if it is present. + * The function takes the settings_lock to protect against + * parallel changes. This function must not be called from IRQ + * context. + */ + +void ide_remove_setting (ide_drive_t *drive, char *name) +{ + down(&ide_setting_sem); + __ide_remove_setting(drive, name); + up(&ide_setting_sem); +} + EXPORT_SYMBOL(ide_remove_setting); /** - * ide_find_setting_by_ioctl - find a setting handler by its command - * @drive: drive to act for - * @cmd: ioctl command code - * - * Scan the drive handlers for an ioctl handler for this function. - * The handlers vary by drive and sometimes by drive state. - * Needs locking fixes. + * ide_find_setting_by_ioctl - find a drive specific ioctl + * @drive: drive to scan + * @cmd: ioctl command to handle + * + * Scan's the device setting table for a matching entry and returns + * this or NULL if no entry is found. The caller must hold the + * setting semaphore */ static ide_settings_t *ide_find_setting_by_ioctl (ide_drive_t *drive, int cmd) @@ -1034,17 +1076,18 @@ break; setting = setting->next; } + return setting; } /** - * ide_find_setting_by_name - find a setting handler by its name - * @drive: drive to act for - * @cmd: ioctl command code - * - * Scan the drive handlers handler matching the name for this function. - * The handlers vary by drive and sometimes by drive state. - * Needs locking fixes. + * ide_find_setting_by_name - find a drive specific setting + * @drive: drive to scan + * @name: setting name + * + * Scan's the device setting table for a matching entry and returns + * this or NULL if no entry is found. The caller must hold the + * setting semaphore */ ide_settings_t *ide_find_setting_by_name (ide_drive_t *drive, char *name) @@ -1060,30 +1103,43 @@ } /** - * auto_remove_settings - remove driver settings on a device - * @drive: drive to clean + * auto_remove_settings - remove driver specific settings + * @drive: drive * - * Called when we change the driver bindings for a device, for - * example if the device is hot plugged. We must scrub the driver - * bindings that are thus no longer relevant to the device in case - * it changes from say a CD-ROM to a disk - * Needs locking fixes + * Automatically remove all the driver specific settings for this + * drive. This function may sleep and must not be called from IRQ + * context. Takes the settings_lock */ static void auto_remove_settings (ide_drive_t *drive) { ide_settings_t *setting; + down(&ide_setting_sem); repeat: setting = drive->settings; while (setting) { if (setting->auto_remove) { - ide_remove_setting(drive, setting->name); + __ide_remove_setting(drive, setting->name); goto repeat; } setting = setting->next; } + up(&ide_setting_sem); } +/** + * ide_read_setting - read an IDE setting + * @drive: drive to read from + * @setting: drive setting + * + * Read a drive setting and return the value. The caller + * must hold the ide_setting_sem when making this call. + * + * BUGS: the data return and error are the same return value + * so an error -EINVAL and true return of the same value cannot + * be told apart + */ + int ide_read_setting (ide_drive_t *drive, ide_settings_t *setting) { int val = -EINVAL; @@ -1132,10 +1188,22 @@ EXPORT_SYMBOL(ide_spin_wait_hwgroup); -/* - * FIXME: This should be changed to enqueue a special request - * to the driver to change settings, and then wait on a sema for completion. - * The current scheme of polling is kludgey, though safe enough. +/** + * ide_write_setting - read an IDE setting + * @drive: drive to read from + * @setting: drive setting + * @val: value + * + * Write a drive setting if it is possible. The caller + * must hold the ide_setting_sem when making this call. + * + * BUGS: the data return and error are the same return value + * so an error -EINVAL and true return of the same value cannot + * be told apart + * + * FIXME: This should be changed to enqueue a special request + * to the driver to change settings, and then wait on a sema for completion. + * The current scheme of polling is kludgy, though safe enough. */ int ide_write_setting (ide_drive_t *drive, ide_settings_t *setting, int val) { @@ -1360,16 +1428,22 @@ ide_settings_t *setting; int err = 0; + down(&ide_setting_sem); if ((setting = ide_find_setting_by_ioctl(drive, cmd)) != NULL) { if (cmd == setting->read_ioctl) { err = ide_read_setting(drive, setting); + up(&ide_setting_sem); return err >= 0 ? put_user(err, (long *) arg) : err; } else { if (bdev != bdev->bd_contains) - return -EINVAL; - return ide_write_setting(drive, setting, arg); + err = -EINVAL; + else + err = ide_write_setting(drive, setting, arg); + up(&ide_setting_sem); + return err; } } + up(&ide_setting_sem); switch (cmd) { case HDIO_GETGEO: @@ -1976,7 +2050,7 @@ vals[2] = 0; /* default irq = probe for it */ case 3: /* base,ctl,irq */ hwif->hw.irq = vals[2]; - ide_init_hwif_ports(&hwif->hw, (ide_ioreg_t) vals[0], (ide_ioreg_t) vals[1], &hwif->irq); + ide_init_hwif_ports(&hwif->hw, (unsigned long) vals[0], (unsigned long) vals[1], &hwif->irq); memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); hwif->irq = vals[2]; hwif->noprobe = 0; diff -Nru a/drivers/ide/legacy/ali14xx.c b/drivers/ide/legacy/ali14xx.c --- a/drivers/ide/legacy/ali14xx.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/legacy/ali14xx.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/ali14xx.c Version 0.03 Feb 09, 1996 + * linux/drivers/ide/legacy/ali14xx.c Version 0.03 Feb 09, 1996 * * Copyright (C) 1996 Linus Torvalds & author (see below) */ diff -Nru a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c --- a/drivers/ide/legacy/buddha.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/legacy/buddha.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/buddha.c -- Amiga Buddha, Catweasel and X-Surf IDE Driver + * linux/drivers/ide/legacy/buddha.c -- Amiga Buddha, Catweasel and X-Surf IDE Driver * * Copyright (C) 1997, 2001 by Geert Uytterhoeven and others * @@ -197,16 +197,16 @@ for(i=0;iirq.AssignedIRQ); goto failed; diff -Nru a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c --- a/drivers/ide/legacy/macide.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/legacy/macide.c Thu Feb 20 23:19:19 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/macide.c -- Macintosh IDE Driver + * linux/drivers/ide/legacy/macide.c -- Macintosh IDE Driver * * Copyright (C) 1998 by Michael Schmitz * @@ -98,21 +98,21 @@ switch (macintosh_config->ide_type) { case MAC_IDE_QUADRA: - ide_setup_ports(&hw, (ide_ioreg_t)IDE_BASE, macide_offsets, + ide_setup_ports(&hw, IDE_BASE, macide_offsets, 0, 0, macide_ack_intr, // quadra_ide_iops, IRQ_NUBUS_F); index = ide_register_hw(&hw, NULL); break; case MAC_IDE_PB: - ide_setup_ports(&hw, (ide_ioreg_t)IDE_BASE, macide_offsets, + ide_setup_ports(&hw, IDE_BASE, macide_offsets, 0, 0, macide_ack_intr, // macide_pb_iops, IRQ_NUBUS_C); index = ide_register_hw(&hw, NULL); break; case MAC_IDE_BABOON: - ide_setup_ports(&hw, (ide_ioreg_t)BABOON_BASE, macide_offsets, + ide_setup_ports(&hw, BABOON_BASE, macide_offsets, 0, 0, NULL, // macide_baboon_iops, IRQ_BABOON_1); diff -Nru a/drivers/ide/legacy/pdc4030.c b/drivers/ide/legacy/pdc4030.c --- a/drivers/ide/legacy/pdc4030.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/legacy/pdc4030.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* -*- linux-c -*- - * linux/drivers/ide/pdc4030.c Version 0.90 May 27, 1999 + * linux/drivers/ide/legacy/pdc4030.c Version 0.90 May 27, 1999 * * Copyright (C) 1995-2002 Linus Torvalds & authors (see below) */ diff -Nru a/drivers/ide/legacy/pdc4030.h b/drivers/ide/legacy/pdc4030.h --- a/drivers/ide/legacy/pdc4030.h Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/legacy/pdc4030.h Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/pdc4030.h + * linux/drivers/ide/legacy/pdc4030.h * * Copyright (C) 1995-1998 Linus Torvalds & authors */ diff -Nru a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c --- a/drivers/ide/legacy/q40ide.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/legacy/q40ide.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/q40ide.c -- Q40 I/O port IDE Driver + * linux/drivers/ide/legacy/q40ide.c -- Q40 I/O port IDE Driver * * (c) Richard Zidlicky * @@ -82,7 +82,7 @@ for (i = 0; i < Q40IDE_NUM_HWIFS; i++) { hw_regs_t hw; - ide_setup_ports(&hw,(ide_ioreg_t) pcide_bases[i], (int *)pcide_offsets, + ide_setup_ports(&hw,(unsigned long) pcide_bases[i], (int *)pcide_offsets, pcide_bases[i]+0x206, 0, NULL, // pcide_iops, diff -Nru a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c --- a/drivers/ide/legacy/qd65xx.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/legacy/qd65xx.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/qd65xx.c Version 0.07 Sep 30, 2001 + * linux/drivers/ide/legacy/qd65xx.c Version 0.07 Sep 30, 2001 * * Copyright (C) 1996-2001 Linus Torvalds & author (see below) */ diff -Nru a/drivers/ide/legacy/qd65xx.h b/drivers/ide/legacy/qd65xx.h --- a/drivers/ide/legacy/qd65xx.h Thu Feb 20 23:19:24 2003 +++ b/drivers/ide/legacy/qd65xx.h Thu Feb 20 23:19:24 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/qd65xx.h + * linux/drivers/ide/legacy/qd65xx.h * * Copyright (c) 2000 Linus Torvalds & authors */ diff -Nru a/drivers/ide/legacy/umc8672.c b/drivers/ide/legacy/umc8672.c --- a/drivers/ide/legacy/umc8672.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/legacy/umc8672.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/umc8672.c Version 0.05 Jul 31, 1996 + * linux/drivers/ide/legacy/umc8672.c Version 0.05 Jul 31, 1996 * * Copyright (C) 1995-1996 Linus Torvalds & author (see below) */ diff -Nru a/drivers/ide/pci/adma100.c b/drivers/ide/pci/adma100.c --- a/drivers/ide/pci/adma100.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/adma100.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/adma100.c -- basic support for Pacific Digital ADMA-100 boards + * linux/drivers/ide/pci/adma100.c -- basic support for Pacific Digital ADMA-100 boards * * Created 09 Apr 2002 by Mark Lord * diff -Nru a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c --- a/drivers/ide/pci/aec62xx.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/aec62xx.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/aec62xx.c Version 0.11 March 27, 2002 + * linux/drivers/ide/pci/aec62xx.c Version 0.11 March 27, 2002 * * Copyright (C) 1999-2002 Andre Hedrick * @@ -409,7 +409,7 @@ if (dev->resource[PCI_ROM_RESOURCE].start) { pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); - printk("%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); + printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); } #if defined(DISPLAY_AEC62XX_TIMINGS) && defined(CONFIG_PROC_FS) @@ -559,5 +559,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for ARTOP AEC62xx IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c --- a/drivers/ide/pci/alim15x3.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/alim15x3.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/alim15x3.c Version 0.15 2002/08/19 + * linux/drivers/ide/pci/alim15x3.c Version 0.16 2003/01/02 * * Copyright (C) 1998-2000 Michel Aubry, Maintainer * Copyright (C) 1998-2000 Andrzej Krzysztofowicz, Maintainer @@ -19,6 +19,10 @@ * Don't use LBA48 mode on ALi <= 0xC4 * Don't poke 0x79 with a non ALi northbridge * Don't flip undefined bits on newer chipsets (fix Fujitsu laptop hang) + * + * Documentation + * Chipset documentation available under NDA only + * */ #include @@ -94,7 +98,7 @@ static int ali_get_info (char *buffer, char **addr, off_t offset, int count) { - u32 bibma; + unsigned long bibma; u8 reg53h, reg5xh, reg5yh, reg5xh1, reg5yh1, c0, c1, rev, tmp; char *q, *p = buffer; @@ -106,14 +110,15 @@ fifo[3] = " ??? "; /* first fetch bibma: */ - pci_read_config_dword(bmide_dev, 0x20, &bibma); - bibma = (bibma & 0xfff0) ; + + bibma = pci_resource_start(bmide_dev, 4); + /* * at that point bibma+0x2 et bibma+0xa are byte * registers to investigate: */ - c0 = inb((unsigned short)bibma + 0x02); - c1 = inb((unsigned short)bibma + 0x0a); + c0 = inb(bibma + 0x02); + c1 = inb(bibma + 0x0a); p += sprintf(p, "\n Ali M15x3 Chipset.\n"); @@ -295,6 +300,7 @@ int port = hwif->channel ? 0x5c : 0x58; int portFIFO = hwif->channel ? 0x55 : 0x54; u8 cd_dma_fifo = 0; + int unit = drive->select.b.unit & 1; pio = ide_get_best_pio_mode(drive, pio, 5, &d); s_time = ide_pio_timings[pio].setup_time; @@ -323,13 +329,13 @@ */ pci_read_config_byte(dev, portFIFO, &cd_dma_fifo); if (drive->media==ide_disk) { - if (hwif->channel) { + if (unit) { pci_write_config_byte(dev, portFIFO, (cd_dma_fifo & 0x0F) | 0x50); } else { pci_write_config_byte(dev, portFIFO, (cd_dma_fifo & 0xF0) | 0x05); } } else { - if (hwif->channel) { + if (unit) { pci_write_config_byte(dev, portFIFO, cd_dma_fifo & 0x0F); } else { pci_write_config_byte(dev, portFIFO, cd_dma_fifo & 0xF0); @@ -779,9 +785,10 @@ static void __init init_hwif_ali15x3 (ide_hwif_t *hwif) { u8 ideic, inmir; - u8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6, + s8 irq_routing_table[] = { -1, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 }; - + int irq = -1; + hwif->irq = hwif->channel ? 15 : 14; if (isa_dev) { @@ -801,15 +808,17 @@ */ pci_read_config_byte(isa_dev, 0x44, &inmir); inmir = inmir & 0x0f; - hwif->irq = irq_routing_table[inmir]; + irq = irq_routing_table[inmir]; } else if (hwif->channel && !(ideic & 0x01)) { /* * get SIRQ2 routing table */ pci_read_config_byte(isa_dev, 0x75, &inmir); inmir = inmir & 0x0f; - hwif->irq = irq_routing_table[inmir]; + irq = irq_routing_table[inmir]; } + if(irq >= 0) + hwif->irq = irq; } init_hwif_common_ali15x3(hwif); @@ -850,10 +859,8 @@ ide_pci_device_t *d = &ali15x3_chipsets[id->driver_data]; if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_IGP, NULL)) - { - printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not supported by Linux\n"); - return 1; - } + printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not yet fully tested.\n"); + #if defined(CONFIG_SPARC64) d->init_hwif = init_hwif_common_ali15x3; #endif /* CONFIG_SPARC64 */ @@ -890,5 +897,3 @@ MODULE_AUTHOR("Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox"); MODULE_DESCRIPTION("PCI driver module for ALi 15x3 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c --- a/drivers/ide/pci/amd74xx.c Thu Feb 20 23:19:24 2003 +++ b/drivers/ide/pci/amd74xx.c Thu Feb 20 23:19:24 2003 @@ -472,5 +472,3 @@ MODULE_AUTHOR("Vojtech Pavlik"); MODULE_DESCRIPTION("AMD PCI IDE driver"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c --- a/drivers/ide/pci/cmd640.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/cmd640.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/cmd640.c Version 1.02 Sep 01, 1996 + * linux/drivers/ide/pci/cmd640.c Version 1.02 Sep 01, 1996 * * Copyright (C) 1995-1996 Linus Torvalds & authors (see below) */ diff -Nru a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c --- a/drivers/ide/pci/cmd64x.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/cmd64x.c Thu Feb 20 23:19:23 2003 @@ -1,6 +1,6 @@ /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16 * - * linux/drivers/ide/cmd64x.c Version 1.30 Sept 10, 2002 + * linux/drivers/ide/pci/cmd64x.c Version 1.30 Sept 10, 2002 * * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. * Note, this driver is not used at all on other systems because @@ -596,7 +596,7 @@ #ifdef __i386__ if (dev->resource[PCI_ROM_RESOURCE].start) { pci_write_config_byte(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); - printk("%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); + printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); } #endif @@ -604,7 +604,7 @@ case PCI_DEVICE_ID_CMD_643: break; case PCI_DEVICE_ID_CMD_646: - printk("%s: chipset revision 0x%02X, ", name, class_rev); + printk(KERN_INFO "%s: chipset revision 0x%02X, ", name, class_rev); switch(class_rev) { case 0x07: case 0x05: @@ -793,6 +793,3 @@ MODULE_AUTHOR("Eddie Dost, David Miller, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for CMD64x IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; - diff -Nru a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c --- a/drivers/ide/pci/cs5520.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/pci/cs5520.c Thu Feb 20 23:19:19 2003 @@ -320,6 +320,3 @@ MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("PCI driver module for Cyrix 5510/5520 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; - diff -Nru a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c --- a/drivers/ide/pci/cs5530.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/cs5530.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/cs5530.c Version 0.7 Sept 10, 2002 + * linux/drivers/ide/pci/cs5530.c Version 0.7 Sept 10, 2002 * * Copyright (C) 2000 Andre Hedrick * Ditto of GNU General Public License. @@ -9,6 +9,9 @@ * * Development of this chipset driver was funded * by the nice folks at National Semiconductor. + * + * Documentation: + * CS5530 documentation available from National Semiconductor. */ #include @@ -456,5 +459,3 @@ MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Cyrix/NS 5530 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c --- a/drivers/ide/pci/cy82c693.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/pci/cy82c693.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/cy82c693.c Version 0.40 Sep. 10, 2002 + * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002 * * Copyright (C) 1998-2000 Andreas S. Krebs (akrebs@altavista.net), Maintainer * Copyright (C) 1998-2002 Andre Hedrick , Integrater @@ -335,7 +335,7 @@ /* * this function is called during init and is used to setup the cy82c693 chip */ -unsigned int __init init_chipset_cy82c693(struct pci_dev *dev, const char *name) +static unsigned int __init init_chipset_cy82c693(struct pci_dev *dev, const char *name) { if (PCI_FUNC(dev->devfn) != 1) return 0; @@ -387,7 +387,7 @@ /* * the init function - called for each ide channel once */ -void __init init_hwif_cy82c693(ide_hwif_t *hwif) +static void __init init_hwif_cy82c693(ide_hwif_t *hwif) { hwif->autodma = 0; @@ -466,5 +466,3 @@ MODULE_AUTHOR("Andreas Krebs, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for the Cypress CY82C693 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/cy82c693.h b/drivers/ide/pci/cy82c693.h --- a/drivers/ide/pci/cy82c693.h Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/pci/cy82c693.h Thu Feb 20 23:19:20 2003 @@ -64,9 +64,9 @@ u8 time_8; /* clocks for 8bit (0xF0=Active/data, 0x0F=Recovery) */ } pio_clocks_t; -extern unsigned int init_chipset_cy82c693(struct pci_dev *, const char *); -extern void init_hwif_cy82c693(ide_hwif_t *); -extern void init_iops_cy82c693(ide_hwif_t *); +static unsigned int init_chipset_cy82c693(struct pci_dev *, const char *); +static void init_hwif_cy82c693(ide_hwif_t *); +static void init_iops_cy82c693(ide_hwif_t *); static ide_pci_device_t cy82c693_chipsets[] __devinitdata = { { /* 0 */ diff -Nru a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c --- a/drivers/ide/pci/generic.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/pci/generic.c Thu Feb 20 23:19:22 2003 @@ -1,10 +1,26 @@ /* - * linux/drivers/ide/generic.c Version 0.10 Sept 11, 2002 + * linux/drivers/ide/pci/generic.c Version 0.11 December 30, 2002 * * Copyright (C) 2001-2002 Andre Hedrick + * Portions (C) Copyright 2002 Red Hat Inc + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, 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. + * + * 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. */ - #undef REALLY_SLOW_IO /* most systems can safely undef this */ #include /* for CONFIG_BLK_DEV_IDEPCI */ @@ -89,6 +105,7 @@ static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) { ide_pci_device_t *d = &generic_chipsets[id->driver_data]; + u16 command; if (dev->device != d->device) BUG(); @@ -102,6 +119,12 @@ (!(PCI_FUNC(dev->devfn) & 1))) return 1; + pci_read_config_word(dev, PCI_COMMAND, &command); + if(!(command & PCI_COMMAND_IO)) + { + printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); + return 1; + } ide_setup_pci_device(dev, d); MOD_INC_USE_COUNT; return 0; @@ -142,5 +165,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for generic PCI IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c --- a/drivers/ide/pci/hpt34x.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/hpt34x.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/hpt34x.c Version 0.40 Sept 10, 2002 + * linux/drivers/ide/pci/hpt34x.c Version 0.40 Sept 10, 2002 * * Copyright (C) 1998-2000 Andre Hedrick * May be copied or modified under the terms of the GNU General Public License @@ -362,5 +362,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Highpoint 34x IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c --- a/drivers/ide/pci/hpt366.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/pci/hpt366.c Thu Feb 20 23:19:22 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/hpt366.c Version 0.34 Sept 17, 2002 + * linux/drivers/ide/pci/hpt366.c Version 0.34 Sept 17, 2002 * * Copyright (C) 1999-2002 Andre Hedrick * Portions Copyright (C) 2001 Sun Microsystems, Inc. @@ -807,7 +807,7 @@ } else if (freq < 0xc8) { pll = F_LOW_PCI_50; if (hpt_minimum_revision(dev,8)) - return -EOPNOTSUPP; + pci_set_drvdata(dev, NULL); else if (hpt_minimum_revision(dev,5)) pci_set_drvdata(dev, (void *) fifty_base_hpt372); else if (hpt_minimum_revision(dev,4)) @@ -820,7 +820,7 @@ if (hpt_minimum_revision(dev,8)) { printk(KERN_ERR "HPT37x: 66MHz timings are not supported.\n"); - return -EOPNOTSUPP; + pci_set_drvdata(dev, NULL); } else if (hpt_minimum_revision(dev,5)) pci_set_drvdata(dev, (void *) sixty_six_base_hpt372); @@ -923,7 +923,7 @@ if (!pci_get_drvdata(dev)) { printk(KERN_ERR "hpt366: unknown bus timing.\n"); - return -EOPNOTSUPP; + pci_set_drvdata(dev, NULL); } return 0; } @@ -1061,6 +1061,12 @@ if (!dmabase) return; + + if(pci_get_drvdata(hwif->pci_dev) == NULL) + { + printk(KERN_WARNING "hpt: no known IDE timings, disabling DMA.\n"); + return; + } dma_old = hwif->INB(dmabase+2); @@ -1215,5 +1221,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Highpoint HPT366 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/it8172.c b/drivers/ide/pci/it8172.c --- a/drivers/ide/pci/it8172.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/it8172.c Thu Feb 20 23:19:23 2003 @@ -330,5 +330,3 @@ MODULE_AUTHOR("SteveL@mvista.com"); MODULE_DESCRIPTION("PCI driver module for ITE 8172 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c --- a/drivers/ide/pci/ns87415.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/ns87415.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/ns87415.c Version 2.00 Sep. 10, 2002 + * linux/drivers/ide/pci/ns87415.c Version 2.00 Sep. 10, 2002 * * Copyright (C) 1997-1998 Mark Lord * Copyright (C) 1998 Eddie C. Dost @@ -263,5 +263,3 @@ MODULE_AUTHOR("Mark Lord, Eddie Dost, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for NS87415 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c --- a/drivers/ide/pci/opti621.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/opti621.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/opti621.c Version 0.7 Sept 10, 2002 + * linux/drivers/ide/pci/opti621.c Version 0.7 Sept 10, 2002 * * Copyright (C) 1996-1998 Linus Torvalds & authors (see below) */ @@ -399,5 +399,3 @@ MODULE_AUTHOR("Jaromir Koutek, Jan Harkes, Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Opti621 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c --- a/drivers/ide/pci/pdc202xx_new.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/pdc202xx_new.c Thu Feb 20 23:19:23 2003 @@ -224,7 +224,7 @@ decode_registers(REG_D, DP); #endif /* PDC202XX_DECODE_REGISTER_INFO */ #if PDC202XX_DEBUG_DRIVE_INFO - printk("%s: %s drive%d 0x%08x ", + printk(KERN_DEBUG "%s: %s drive%d 0x%08x ", drive->name, ide_xfer_verbose(speed), drive->dn, drive_conf); pci_read_config_dword(dev, drive_pci, &drive_conf); @@ -321,7 +321,7 @@ case PCI_DEVICE_ID_PROMISE_20268: cable = pdcnew_new_cable_detect(hwif); #if PDC202_DEBUG_CABLE - printk("%s: %s-pin cable, %s-pin cable, %d\n", + printk(KERN_DEBUG "%s: %s-pin cable, %s-pin cable, %d\n", hwif->name, hwif->udma_four ? "80" : "40", cable ? "40" : "80", cable); #endif /* PDC202_DEBUG_CABLE */ @@ -347,15 +347,15 @@ if ((ultra_66) && (cable)) { #ifdef DEBUG - printk("ULTRA 66/100/133: %s channel of Ultra 66/100/133 " + printk(KERN_DEBUG "ULTRA 66/100/133: %s channel of Ultra 66/100/133 " "requires an 80-pin cable for Ultra66 operation.\n", hwif->channel ? "Secondary" : "Primary"); - printk(" Switching to Ultra33 mode.\n"); + printk(KERN_DEBUG " Switching to Ultra33 mode.\n"); #endif /* DEBUG */ /* Primary : zero out second bit */ /* Secondary : zero out fourth bit */ - printk("Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary"); - printk("%s reduced to Ultra33 mode.\n", drive->name); + printk(KERN_WARNING "Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary"); + printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); } if (drive->media != ide_disk) @@ -444,7 +444,7 @@ /* * Deleted this because it is redundant from the caller. */ - printk("PDC202XX: %s channel reset.\n", + printk(KERN_WARNING "PDC202XX: %s channel reset.\n", HWIF(drive)->channel ? "Secondary" : "Primary"); } @@ -459,7 +459,7 @@ hwif->OUTB((udma_speed_flag & ~0x10), (high_16|0x001f)); mdelay(2000); /* 2 seconds ?! */ - printk("PDC202XX: %s channel reset.\n", + printk(KERN_WARNING "PDC202XX: %s channel reset.\n", hwif->channel ? "Secondary" : "Primary"); } @@ -513,7 +513,7 @@ if (dev->resource[PCI_ROM_RESOURCE].start) { pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); - printk("%s: ROM enabled at 0x%08lx\n", + printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); } @@ -555,7 +555,7 @@ hwif->autodma = 1; hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma; #if PDC202_DEBUG_CABLE - printk("%s: %s-pin cable\n", + printk(KERN_DEBUG "%s: %s-pin cable\n", hwif->name, hwif->udma_four ? "80" : "40"); #endif /* PDC202_DEBUG_CABLE */ } @@ -672,5 +672,3 @@ MODULE_AUTHOR("Andre Hedrick, Frank Tiernan"); MODULE_DESCRIPTION("PCI driver module for Promise PDC20268 and higher"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c --- a/drivers/ide/pci/pdc202xx_old.c Thu Feb 20 23:19:24 2003 +++ b/drivers/ide/pci/pdc202xx_old.c Thu Feb 20 23:19:24 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/pdc202xx.c Version 0.36 Sept 11, 2002 + * linux/drivers/ide/pci/pdc202xx_old.c Version 0.36 Sept 11, 2002 * * Copyright (C) 1998-2002 Andre Hedrick * @@ -323,7 +323,7 @@ decode_registers(REG_D, DP); #endif /* PDC202XX_DECODE_REGISTER_INFO */ #if PDC202XX_DEBUG_DRIVE_INFO - printk("%s: %s drive%d 0x%08x ", + printk(KERN_DEBUG "%s: %s drive%d 0x%08x ", drive->name, ide_xfer_verbose(speed), drive->dn, drive_conf); pci_read_config_dword(dev, drive_pci, &drive_conf); @@ -379,7 +379,7 @@ case PCI_DEVICE_ID_PROMISE_20262: cable = pdc202xx_old_cable_detect(hwif); #if PDC202_DEBUG_CABLE - printk("%s: %s-pin cable, %s-pin cable, %d\n", + printk(KERN_DEBUG "%s: %s-pin cable, %s-pin cable, %d\n", hwif->name, hwif->udma_four ? "80" : "40", cable ? "40" : "80", cable); #endif /* PDC202_DEBUG_CABLE */ @@ -408,16 +408,16 @@ if ((ultra_66) && (cable)) { #ifdef DEBUG - printk("ULTRA 66/100/133: %s channel of Ultra 66/100/133 " + printk(KERN_DEBUG "ULTRA 66/100/133: %s channel of Ultra 66/100/133 " "requires an 80-pin cable for Ultra66 operation.\n", hwif->channel ? "Secondary" : "Primary"); - printk(" Switching to Ultra33 mode.\n"); + printk(KERN_DEBUG " Switching to Ultra33 mode.\n"); #endif /* DEBUG */ /* Primary : zero out second bit */ /* Secondary : zero out fourth bit */ hwif->OUTB(CLKSPD & ~mask, (hwif->dma_master + 0x11)); - printk("Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary"); - printk("%s reduced to Ultra33 mode.\n", drive->name); + printk(KERN_WARNING "Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary"); + printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); } else { if (ultra_66) { /* @@ -620,7 +620,7 @@ hwif->OUTB((udma_speed_flag & ~0x10), (high_16|0x001f)); mdelay(2000); /* 2 seconds ?! */ - printk("PDC202XX: %s channel reset.\n", + printk(KERN_WARNING "PDC202XX: %s channel reset.\n", hwif->channel ? "Secondary" : "Primary"); } @@ -699,7 +699,7 @@ if (dev->resource[PCI_ROM_RESOURCE].start) { pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE); - printk("%s: ROM enabled at 0x%08lx\n", + printk(KERN_INFO "%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start); } @@ -780,7 +780,7 @@ hwif->autodma = 1; hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma; #if PDC202_DEBUG_CABLE - printk("%s: %s-pin cable\n", + printk(KERN_DEBUG "%s: %s-pin cable\n", hwif->name, hwif->udma_four ? "80" : "40"); #endif /* PDC202_DEBUG_CABLE */ } @@ -797,7 +797,7 @@ udma_speed_flag = hwif->INB((dmabase|0x1f)); primary_mode = hwif->INB((dmabase|0x1a)); secondary_mode = hwif->INB((dmabase|0x1b)); - printk("%s: (U)DMA Burst Bit %sABLED " \ + printk(KERN_INFO "%s: (U)DMA Burst Bit %sABLED " \ "Primary %s Mode " \ "Secondary %s Mode.\n", hwif->cds->name, (udma_speed_flag & 1) ? "EN" : "DIS", @@ -806,7 +806,7 @@ #ifdef CONFIG_PDC202XX_BURST if (!(udma_speed_flag & 1)) { - printk("%s: FORCING BURST BIT 0x%02x->0x%02x ", + printk(KERN_INFO "%s: FORCING BURST BIT 0x%02x->0x%02x ", hwif->cds->name, udma_speed_flag, (udma_speed_flag|1)); hwif->OUTB(udma_speed_flag|1,(dmabase|0x1f)); @@ -816,7 +816,7 @@ #endif /* CONFIG_PDC202XX_BURST */ #ifdef CONFIG_PDC202XX_MASTER if (!(primary_mode & 1)) { - printk("%s: FORCING PRIMARY MODE BIT " + printk(KERN_INFO "%s: FORCING PRIMARY MODE BIT " "0x%02x -> 0x%02x ", hwif->cds->name, primary_mode, (primary_mode|1)); hwif->OUTB(primary_mode|1, (dmabase|0x1a)); @@ -825,7 +825,7 @@ } if (!(secondary_mode & 1)) { - printk("%s: FORCING SECONDARY MODE BIT " + printk(KERN_INFO "%s: FORCING SECONDARY MODE BIT " "0x%02x -> 0x%02x ", hwif->cds->name, secondary_mode, (secondary_mode|1)); hwif->OUTB(secondary_mode|1, (dmabase|0x1b)); @@ -850,7 +850,7 @@ if (irq != irq2) { pci_write_config_byte(dev, (PCI_INTERRUPT_LINE)|0x80, irq); /* 0xbc */ - printk("%s: pci-config space interrupt " + printk(KERN_INFO "%s: pci-config space interrupt " "mirror fixed.\n", d->name); } } @@ -955,5 +955,3 @@ MODULE_AUTHOR("Andre Hedrick, Frank Tiernan"); MODULE_DESCRIPTION("PCI driver module for older Promise IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/pdcadma.c b/drivers/ide/pci/pdcadma.c --- a/drivers/ide/pci/pdcadma.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/pdcadma.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/pdcadma.c Version 0.05 Sept 10, 2002 + * linux/drivers/ide/pci/pdcadma.c Version 0.05 Sept 10, 2002 * * Copyright (C) 1999-2000 Andre Hedrick * May be copied or modified under the terms of the GNU General Public License @@ -161,5 +161,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for PDCADMA IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c --- a/drivers/ide/pci/piix.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/pci/piix.c Thu Feb 20 23:19:19 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/piix.c Version 0.42 January 11, 2003 + * linux/drivers/ide/pci/piix.c Version 0.42 January 11, 2003 * * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer * Copyright (C) 1998-2000 Andre Hedrick @@ -821,5 +821,3 @@ MODULE_AUTHOR("Andre Hedrick, Andrzej Krzysztofowicz"); MODULE_DESCRIPTION("PCI driver module for Intel PIIX IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/rz1000.c b/drivers/ide/pci/rz1000.c --- a/drivers/ide/pci/rz1000.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/rz1000.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/rz1000.c Version 0.05 December 8, 1997 + * linux/drivers/ide/pci/rz1000.c Version 0.06 January 12, 2003 * * Copyright (C) 1995-1998 Linus Torvalds & author (see below) */ @@ -43,13 +43,13 @@ hwif->chipset = ide_rz1000; if (!pci_read_config_word (dev, 0x40, ®) && !pci_write_config_word(dev, 0x40, reg & 0xdfff)) { - printk("%s: disabled chipset read-ahead " + printk(KERN_INFO "%s: disabled chipset read-ahead " "(buggy RZ1000/RZ1001)\n", hwif->name); } else { hwif->serialized = 1; hwif->drives[0].no_unmask = 1; hwif->drives[1].no_unmask = 1; - printk("%s: serialized, disabled unmasking " + printk(KERN_INFO "%s: serialized, disabled unmasking " "(buggy RZ1000/RZ1001)\n", hwif->name); } } @@ -94,6 +94,4 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for RZ1000 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c --- a/drivers/ide/pci/sc1200.c Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/pci/sc1200.c Thu Feb 20 23:19:22 2003 @@ -1,11 +1,14 @@ /* - * linux/drivers/ide/sc1200.c Version 0.9 24-Oct-2002 + * linux/drivers/ide/pci/sc1200.c Version 0.91 28-Jan-2003 * * Copyright (C) 2000-2002 Mark Lord * May be copied or modified under the terms of the GNU General Public License * * Development of this chipset driver was funded * by the nice folks at National Semiconductor. + * + * Documentation: + * Available from National Semiconductor */ #include @@ -587,5 +590,3 @@ MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for NS SC1200 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c --- a/drivers/ide/pci/serverworks.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/pci/serverworks.c Thu Feb 20 23:19:19 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/serverworks.c Version 0.7 10 Sept 2002 + * linux/drivers/ide/pci/serverworks.c Version 0.7 10 Sept 2002 * * Copyright (C) 1998-2000 Michel Aubry * Copyright (C) 1998-2000 Andrzej Krzysztofowicz @@ -21,6 +21,9 @@ * * CSB6: `Champion South Bridge' IDE Interface (optional: third channel) * + * Documentation: + * Available under NDA only. Errata info very hard to get. + * */ #include @@ -575,7 +578,7 @@ * This is a device pin issue on CSB6. * Since there will be a future raid mode, * early versions of the chipset require the - * interrupt pin to be set, and it is a compatablity + * interrupt pin to be set, and it is a compatiblity * mode issue. */ dev->irq = 0; @@ -828,5 +831,3 @@ MODULE_AUTHOR("Michael Aubry. Andrzej Krzysztofowicz, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for Serverworks OSB4/CSB5/CSB6 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c --- a/drivers/ide/pci/siimage.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/siimage.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/siimage.c Version 1.01 Sept 11, 2002 + * linux/drivers/ide/pci/siimage.c Version 1.02 Jan 30, 2003 * * Copyright (C) 2001-2002 Andre Hedrick */ @@ -31,15 +31,15 @@ { char *p = buf; u8 mmio = (pci_get_drvdata(dev) != NULL) ? 1 : 0; - u32 bmdma = (mmio) ? ((u32) pci_get_drvdata(dev)) : + unsigned long bmdma = (mmio) ? ((unsigned long) pci_get_drvdata(dev)) : (pci_resource_start(dev, 4)); p += sprintf(p, "\nController: %d\n", index); p += sprintf(p, "SiI%x Chipset.\n", dev->device); if (mmio) - p += sprintf(p, "MMIO Base 0x%08x\n", bmdma); - p += sprintf(p, "%s-DMA Base 0x%08x\n", (mmio)?"MMIO":"BM", bmdma); - p += sprintf(p, "%s-DMA Base 0x%08x\n", (mmio)?"MMIO":"BM", bmdma+8); + p += sprintf(p, "MMIO Base 0x%lx\n", bmdma); + p += sprintf(p, "%s-DMA Base 0x%lx\n", (mmio)?"MMIO":"BM", bmdma); + p += sprintf(p, "%s-DMA Base 0x%lx\n", (mmio)?"MMIO":"BM", bmdma+8); p += sprintf(p, "--------------- Primary Channel " "---------------- Secondary Channel " @@ -248,9 +248,9 @@ { u8 speed = ide_dma_speed(drive, siimage_ratemask(drive)); - config_chipset_for_pio(drive, (!(speed))); + config_chipset_for_pio(drive, !speed); - if ((!(speed))) + if (!speed) return 0; if (ide_set_xfer_rate(drive, speed)) @@ -267,7 +267,7 @@ ide_hwif_t *hwif = HWIF(drive); struct hd_driveid *id = drive->id; - if ((id != NULL) && ((id->capability & 1) != 0) && drive->autodma) { + if (id != NULL && (id->capability & 1) != 0 && drive->autodma) { if (!(hwif->atapi_dma)) goto fast_ata_pio; /* Consult the list of known "bad" drives */ @@ -317,10 +317,9 @@ return 1; /* return 1 if Device INTR asserted */ - if ((pci_read_config_byte(hwif->pci_dev, SELREG(1), &dma_altstat)), - ((dma_altstat & 8) == 8)) + pci_read_config_byte(hwif->pci_dev, SELREG(1), &dma_altstat); + if (dma_altstat & 8) return 0; //return 1; - return 0; } @@ -355,7 +354,7 @@ hwif->OUTL(sata_error, SATA_ERROR_REG); watchdog = (sata_error & 0x00680000) ? 1 : 0; #if 1 - printk("%s: sata_error = 0x%08x, " + printk(KERN_WARNING "%s: sata_error = 0x%08x, " "watchdog = %d, %s\n", drive->name, sata_error, watchdog, __FUNCTION__); @@ -426,7 +425,7 @@ ide_hwif_t *hwif = HWIF(drive); if ((hwif->INL(SATA_STATUS_REG) & 0x03) != 0x03) { - printk("%s: reset phy dead, status=0x%08x\n", + printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n", hwif->name, hwif->INL(SATA_STATUS_REG)); HWGROUP(drive)->poll_timeout = 0; #if 0 @@ -475,10 +474,10 @@ if (SATA_STATUS_REG) { u32 sata_stat = hwif->INL(SATA_STATUS_REG); - printk("%s: reset phy, status=0x%08x, %s\n", + printk(KERN_WARNING "%s: reset phy, status=0x%08x, %s\n", hwif->name, sata_stat, __FUNCTION__); if (!(sata_stat)) { - printk("%s: reset phy dead, status=0x%08x\n", + printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n", hwif->name, sata_stat); drive->failures++; } @@ -491,7 +490,7 @@ if (dev->device == PCI_DEVICE_ID_SII_3112) goto sata_skip; - printk("%s: BASE CLOCK ", name); + printk(KERN_INFO "%s: BASE CLOCK ", name); clocking &= ~0x0C; switch(clocking) { case 0x03: printk("DISABLED !\n"); break; @@ -514,13 +513,12 @@ #endif /* DISPLAY_SIIMAGE_TIMINGS && CONFIG_PROC_FS */ } -#ifdef CONFIG_TRY_MMIO_SIIMAGE static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name) { - u32 bar5 = pci_resource_start(dev, 5); - u32 end5 = pci_resource_end(dev, 5); + unsigned long bar5 = pci_resource_start(dev, 5); + unsigned long end5 = pci_resource_end(dev, 5); u8 tmpbyte = 0; - u32 addr; + unsigned long addr; void *ioaddr; ioaddr = ioremap_nocache(bar5, (end5 - bar5)); @@ -529,82 +527,77 @@ return 0; pci_set_master(dev); - addr = (u32) ioaddr; - pci_set_drvdata(dev, (void *) addr); + pci_set_drvdata(dev, ioaddr); + addr = (unsigned long) ioaddr; if (dev->device == PCI_DEVICE_ID_SII_3112) { - sii_outl(0, DEVADDR(0x148)); - sii_outl(0, DEVADDR(0x1C8)); + writel(0, DEVADDR(0x148)); + writel(0, DEVADDR(0x1C8)); } - sii_outb(0, DEVADDR(0xB4)); - sii_outb(0, DEVADDR(0xF4)); - tmpbyte = sii_inb(DEVADDR(0x4A)); + writeb(0, DEVADDR(0xB4)); + writeb(0, DEVADDR(0xF4)); + tmpbyte = readb(DEVADDR(0x4A)); switch(tmpbyte) { case 0x01: - sii_outb(tmpbyte|0x10, DEVADDR(0x4A)); - tmpbyte = sii_inb(DEVADDR(0x4A)); + writeb(tmpbyte|0x10, DEVADDR(0x4A)); + tmpbyte = readb(DEVADDR(0x4A)); case 0x31: /* if clocking is disabled */ /* 133 clock attempt to force it on */ - sii_outb(tmpbyte & ~0x20, DEVADDR(0x4A)); - tmpbyte = sii_inb(DEVADDR(0x4A)); + writeb(tmpbyte & ~0x20, DEVADDR(0x4A)); + tmpbyte = readb(DEVADDR(0x4A)); case 0x11: case 0x21: break; default: tmpbyte &= ~0x30; tmpbyte |= 0x20; - sii_outb(tmpbyte, DEVADDR(0x4A)); + writeb(tmpbyte, DEVADDR(0x4A)); break; } - sii_outb(0x72, DEVADDR(0xA1)); - sii_outw(0x328A, DEVADDR(0xA2)); - sii_outl(0x62DD62DD, DEVADDR(0xA4)); - sii_outl(0x43924392, DEVADDR(0xA8)); - sii_outl(0x40094009, DEVADDR(0xAC)); - sii_outb(0x72, DEVADDR(0xE1)); - sii_outw(0x328A, DEVADDR(0xE2)); - sii_outl(0x62DD62DD, DEVADDR(0xE4)); - sii_outl(0x43924392, DEVADDR(0xE8)); - sii_outl(0x40094009, DEVADDR(0xEC)); + writeb(0x72, DEVADDR(0xA1)); + writew(0x328A, DEVADDR(0xA2)); + writel(0x62DD62DD, DEVADDR(0xA4)); + writel(0x43924392, DEVADDR(0xA8)); + writel(0x40094009, DEVADDR(0xAC)); + writeb(0x72, DEVADDR(0xE1)); + writew(0x328A, DEVADDR(0xE2)); + writel(0x62DD62DD, DEVADDR(0xE4)); + writel(0x43924392, DEVADDR(0xE8)); + writel(0x40094009, DEVADDR(0xEC)); if (dev->device == PCI_DEVICE_ID_SII_3112) { - sii_outl(0xFFFF0000, DEVADDR(0x108)); - sii_outl(0xFFFF0000, DEVADDR(0x188)); - sii_outl(0x00680000, DEVADDR(0x148)); - sii_outl(0x00680000, DEVADDR(0x1C8)); + writel(0xFFFF0000, DEVADDR(0x108)); + writel(0xFFFF0000, DEVADDR(0x188)); + writel(0x00680000, DEVADDR(0x148)); + writel(0x00680000, DEVADDR(0x1C8)); } - tmpbyte = sii_inb(DEVADDR(0x4A)); + tmpbyte = readb(DEVADDR(0x4A)); proc_reports_siimage(dev, (tmpbyte>>=4), name); return 1; } -#endif /* CONFIG_TRY_MMIO_SIIMAGE */ static unsigned int __init init_chipset_siimage (struct pci_dev *dev, const char *name) { u32 class_rev = 0; u8 tmpbyte = 0; -#ifdef CONFIG_TRY_MMIO_SIIMAGE u8 BA5_EN = 0; -#endif /* CONFIG_TRY_MMIO_SIIMAGE */ pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); class_rev &= 0xff; pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (class_rev) ? 1 : 255); -#ifdef CONFIG_TRY_MMIO_SIIMAGE pci_read_config_byte(dev, 0x8A, &BA5_EN); if ((BA5_EN & 0x01) || (pci_resource_start(dev, 5))) { if (setup_mmio_siimage(dev, name)) { return 0; } } -#endif /* CONFIG_TRY_MMIO_SIIMAGE */ pci_write_config_byte(dev, 0x80, 0x00); pci_write_config_byte(dev, 0x84, 0x00); @@ -653,22 +646,12 @@ static void __init init_mmio_iops_siimage (ide_hwif_t *hwif) { struct pci_dev *dev = hwif->pci_dev; - u32 addr = (u32) pci_get_drvdata(hwif->pci_dev); + unsigned long addr = (unsigned long) pci_get_drvdata(hwif->pci_dev); u8 ch = hwif->channel; // u16 i = 0; hw_regs_t hw; - hwif->OUTB = sii_outb; - hwif->OUTW = sii_outw; - hwif->OUTL = sii_outl; - hwif->OUTSW = sii_outsw; - hwif->OUTSL = sii_outsl; - hwif->INB = sii_inb; - hwif->INW = sii_inw; - hwif->INL = sii_inl; - hwif->INSW = sii_insw; - hwif->INSL = sii_insl; - + default_hwif_mmiops(hwif); memset(&hw, 0, sizeof(hw_regs_t)); #if 1 @@ -706,7 +689,7 @@ #endif #if 0 - printk("%s: ", hwif->name); + printk(KERN_DEBUG "%s: ", hwif->name); for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) printk("0x%08x ", DEVADDR((ch) ? 0xC0 : 0x80)|(i)); printk("0x%08x ", DEVADDR((ch) ? 0xCA : 0x8A)|(i)); @@ -726,7 +709,6 @@ hw.priv = (void *) addr; // hw.priv = pci_get_drvdata(hwif->pci_dev); hw.irq = hwif->pci_dev->irq; -// hw.iops = siimage_iops; memcpy(&hwif->hw, &hw, sizeof(hw)); memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->hw.io_ports)); @@ -777,9 +759,6 @@ pci_read_config_byte(hwif->pci_dev, SELREG(0), &ata66); return (ata66 & 0x01) ? 1 : 0; } -#ifndef CONFIG_TRY_MMIO_SIIMAGE - if (hwif->mmio) BUG(); -#endif /* CONFIG_TRY_MMIO_SIIMAGE */ return (hwif->INB(SELADDR(0)) & 0x01) ? 1 : 0; } @@ -870,5 +849,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for SiI IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/siimage.h b/drivers/ide/pci/siimage.h --- a/drivers/ide/pci/siimage.h Thu Feb 20 23:19:22 2003 +++ b/drivers/ide/pci/siimage.h Thu Feb 20 23:19:22 2003 @@ -9,8 +9,6 @@ #define DISPLAY_SIIMAGE_TIMINGS -#define CONFIG_TRY_MMIO_SIIMAGE -//#undef CONFIG_TRY_MMIO_SIIMAGE #undef SIIMAGE_VIRTUAL_DMAPIO #undef SIIMAGE_BUFFERED_TASKFILE #undef SIIMAGE_LARGE_DMA @@ -31,62 +29,10 @@ #define ADJREG(B,R) ((B)|(R)|((hwif->channel)<<(4+(2*(hwif->mmio))))) #define SELREG(R) ADJREG((0xA0),(R)) -#define SELADDR(R) ((((u32)hwif->hwif_data)*(hwif->mmio))|SELREG((R))) -#define HWIFADDR(R) ((((u32)hwif->hwif_data)*(hwif->mmio))|(R)) -#define DEVADDR(R) (((u32) pci_get_drvdata(dev))|(R)) +#define SELADDR(R) ((((unsigned long)hwif->hwif_data)*(hwif->mmio))|SELREG((R))) +#define HWIFADDR(R) ((((unsigned long)hwif->hwif_data)*(hwif->mmio))|(R)) +#define DEVADDR(R) (((unsigned long) pci_get_drvdata(dev))|(R)) - -inline u8 sii_inb (u32 port) -{ - return (u8) readb(port); -} - -inline u16 sii_inw (u32 port) -{ - return (u16) readw(port); -} - -inline void sii_insw (u32 port, void *addr, u32 count) -{ - while (count--) { *(u16 *)addr = readw(port); addr += 2; } -} - -inline u32 sii_inl (u32 port) -{ - return (u32) readl(port); -} - -inline void sii_insl (u32 port, void *addr, u32 count) -{ - sii_insw(port, addr, (count)<<1); -// while (count--) { *(u32 *)addr = readl(port); addr += 4; } -} - -inline void sii_outb (u8 value, u32 port) -{ - writeb(value, port); -} - -inline void sii_outw (u16 value, u32 port) -{ - writew(value, port); -} - -inline void sii_outsw (u32 port, void *addr, u32 count) -{ - while (count--) { writew(*(u16 *)addr, port); addr += 2; } -} - -inline void sii_outl (u32 value, u32 port) -{ - writel(value, port); -} - -inline void sii_outsl (u32 port, void *addr, u32 count) -{ - sii_outsw(port, addr, (count)<<1); -// while (count--) { writel(*(u32 *)addr, port); addr += 4; } -} #if defined(DISPLAY_SIIMAGE_TIMINGS) && defined(CONFIG_PROC_FS) #include diff -Nru a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c --- a/drivers/ide/pci/sis5513.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/sis5513.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/sis5513.c Version 0.14ac Sept 11, 2002 + * linux/drivers/ide/pci/sis5513.c Version 0.14ac Sept 11, 2002 * * Copyright (C) 1999-2000 Andre Hedrick * Copyright (C) 2002 Lionel Bouton , Maintainer @@ -10,7 +10,7 @@ * * SiS Taiwan : for direct support and hardware. * Daniela Engert : for initial ATA100 advices and numerous others. - * John Fremlin, Manfred Spraul, Dave Morgan : + * John Fremlin, Manfred Spraul, Dave Morgan, Peter Kjellerstedt : * for checking code correctness, providing patches. * * @@ -18,18 +18,27 @@ * ATA100 tests and design on the SiS735/5513 chipset. * ATA16/33 support from specs * ATA133 support for SiS961/962 by L.C. Chang + * + * Documentation: + * SiS chipset documentation available under NDA to companies not + * individuals only. */ /* - * TODO: - * - Get ridden of SisHostChipInfo[] completness dependency. - * - Study drivers/ide/ide-timing.h. - * - Are there pre-ATA_16 SiS5513 chips ? -> tune init code for them - * or remove ATA_00 define - * - More checks in the config registers (force values instead of - * relying on the BIOS setting them correctly). - * - Further optimisations ? - * . for example ATA66+ regs 0x48 & 0x4A + * Notes/Special cases: + * - SiS5513 derivatives usually have the same PCI IDE register layout when + * supporting the same UDMA modes. + * - There are exceptions : + * . SiS730 and SiS550 use the same layout than ATA_66 chipsets but support + * ATA_100 + * . ATA_133 capable chipsets mark a shift in SiS chipset designs : previously + * south and northbridge were integrated, making IDE (a southbridge function) + * capabilities easily deduced from the northbridge PCI id. With ATA_133, + * chipsets started to be split in the usual north/south bridges chips + * -> the driver needs to detect the correct southbridge when faced to newest + * northbridges. + * . On ATA133 capable chipsets when bit 30 of dword at 0x54 is 1 the + * configuration space is moved from 0x40 to 0x70. */ #include @@ -64,7 +73,7 @@ /* Miscellaneaous flags */ #define SIS5513_LATENCY 0x01 -/* registers layout and init values are chipset family dependent */ +/* registers layout and init values are chipset family dependant */ /* 1/ define families */ #define ATA_00 0x00 #define ATA_16 0x01 @@ -298,6 +307,7 @@ static char* get_drives_info (char *buffer, u8 pos) { u8 reg00, reg01, reg10, reg11; /* timing registers */ + u32 regdw0, regdw1; char* p = buffer; /* Postwrite/Prefetch */ @@ -313,13 +323,31 @@ pci_read_config_byte(bmide_dev, 0x41+2*pos, ®01); pci_read_config_byte(bmide_dev, 0x44+2*pos, ®10); pci_read_config_byte(bmide_dev, 0x45+2*pos, ®11); + } else { + u32 reg54h; + u8 drive_pci = 0x40; + pci_read_config_dword(bmide_dev, 0x54, ®54h); + if (reg54h & 0x40000000) { + // Configuration space remapped to 0x70 + drive_pci = 0x70; + } + pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+8*pos, ®dw0); + pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+8*pos+4, ®dw1); + p += sprintf(p, "Drive %d:\n", pos); } /* UDMA */ - if (chipset_family >= ATA_33) { + if (chipset_family >= ATA_133) { + p += sprintf(p, " UDMA %s \t \t \t UDMA %s\n", + (regdw0 & 0x04) ? "Enabled" : "Disabled", + (regdw1 & 0x04) ? "Enabled" : "Disabled"); + p += sprintf(p, " UDMA Cycle Time %s \t UDMA Cycle Time %s\n", + cycle_time[(regdw0 & 0xF0) >> 4], + cycle_time[(regdw1 & 0xF0) >> 4]); + } else if (chipset_family >= ATA_33) { p += sprintf(p, " UDMA %s \t \t \t UDMA %s\n", - (reg01 & 0x80) ? "Enabled" : "Disabled", + (reg01 & 0x80) ? "Enabled" : "Disabled", (reg11 & 0x80) ? "Enabled" : "Disabled"); p += sprintf(p, " UDMA Cycle Time "); @@ -659,13 +687,11 @@ ide_hwif_t *hwif = HWIF(drive); struct pci_dev *dev = hwif->pci_dev; - u8 drive_pci, reg; + u8 drive_pci, reg, speed; u32 regdw; #ifdef DEBUG sis5513_load_verify_registers(dev, "sis5513_tune_chipset start"); - printk("SIS5513: sis5513_tune_chipset, drive %d, speed %d\n", - drive->dn, speed); #endif #ifdef BROKEN_LEVEL @@ -675,7 +701,12 @@ if (xferspeed > BROKEN_LEVEL) xferspeed = BROKEN_LEVEL; #endif - u8 speed = ide_rate_filter(sis5513_ratemask(drive), xferspeed); + speed = ide_rate_filter(sis5513_ratemask(drive), xferspeed); + +#ifdef DEBUG + printk("SIS5513: sis5513_tune_chipset, drive %d, speed %d\n", + drive->dn, xferspeed); +#endif /* See config_art_rwp_pio for drive pci config registers */ drive_pci = 0x40; @@ -770,7 +801,7 @@ u8 speed = ide_dma_speed(drive, sis5513_ratemask(drive)); #ifdef DEBUG - printk("SIS5513: config_chipset_for_dma, drive %d, ultra %x, udma_66 %x\n", + printk("SIS5513: config_chipset_for_dma, drive %d, ultra %x\n", drive->dn, drive->id->dma_ultra); #endif @@ -1056,4 +1087,15 @@ MODULE_DESCRIPTION("PCI driver module for SIS IDE"); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; +/* + * TODO: + * - Get ridden of SisHostChipInfo[] completness dependancy. + * - Study drivers/ide/ide-timing.h. + * - Are there pre-ATA_16 SiS5513 chips ? -> tune init code for them + * or remove ATA_00 define + * - More checks in the config registers (force values instead of + * relying on the BIOS setting them correctly). + * - Further optimisations ? + * . for example ATA66+ regs 0x48 & 0x4A + */ + diff -Nru a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c --- a/drivers/ide/pci/sl82c105.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/pci/sl82c105.c Thu Feb 20 23:19:21 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/sl82c105.c + * linux/drivers/ide/pci/sl82c105.c * * SL82C105/Winbond 553 IDE driver * @@ -7,6 +7,10 @@ * * Drive tuning added from Rebel.com's kernel sources * -- Russell King (15/11/98) linux@arm.linux.org.uk + * + * Merge in Russell's HW workarounds, fix various problems + * with the timing registers setup. + * -- Benjamin Herrenschmidt (01/11/03) benh@kernel.crashing.org */ #include @@ -28,6 +32,24 @@ #include "ide_modes.h" #include "sl82c105.h" +#undef DEBUG + +#ifdef DEBUG +#define DBG(arg) printk arg +#else +#define DBG(fmt,...) +#endif +/* + * SL82C105 PCI config register 0x40 bits. + */ +#define CTRL_IDE_IRQB (1 << 30) +#define CTRL_IDE_IRQA (1 << 28) +#define CTRL_LEGIRQ (1 << 11) +#define CTRL_P1F16 (1 << 5) +#define CTRL_P1EN (1 << 4) +#define CTRL_P0F16 (1 << 1) +#define CTRL_P0EN (1 << 0) + /* * Convert a PIO mode and cycle time to the required on/off * times for the interface. This has protection against run-away @@ -57,7 +79,7 @@ /* * Configure the drive and chipset for PIO */ -static void config_for_pio(ide_drive_t *drive, int pio, int report) +static void config_for_pio(ide_drive_t *drive, int pio, int report, int chipset_only) { ide_hwif_t *hwif = HWIF(drive); struct pci_dev *dev = hwif->pci_dev; @@ -65,14 +87,20 @@ u16 drv_ctrl = 0x909; unsigned int xfer_mode, reg; + DBG(("config_for_pio(drive:%s, pio:%d, report:%d, chipset_only:%d)\n", + drive->name, pio, report, chipset_only)); + reg = (hwif->channel ? 0x4c : 0x44) + (drive->select.b.unit ? 4 : 0); pio = ide_get_best_pio_mode(drive, pio, 5, &p); xfer_mode = XFER_PIO_0 + pio; - if (ide_config_drive_speed(drive, xfer_mode) == 0) + if (chipset_only || ide_config_drive_speed(drive, xfer_mode) == 0) { drv_ctrl = get_timing_sl82c105(&p); + drive->pio_speed = xfer_mode; + } else + drive->pio_speed = XFER_PIO_0; if (drive->using_dma == 0) { /* @@ -96,15 +124,16 @@ { ide_hwif_t *hwif = HWIF(drive); struct pci_dev *dev = hwif->pci_dev; - u16 drv_ctrl = 0x909; unsigned int reg; + DBG(("config_for_dma(drive:%s)\n", drive->name)); + reg = (hwif->channel ? 0x4c : 0x44) + (drive->select.b.unit ? 4 : 0); - if (ide_config_drive_speed(drive, XFER_MW_DMA_2) == 0) - drv_ctrl = 0x0240; + if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) + return 1; - pci_write_config_word(dev, reg, drv_ctrl); + pci_write_config_word(dev, reg, 0x0240); return 0; } @@ -117,6 +146,9 @@ static int sl82c105_check_drive (ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); + + DBG(("sl82c105_check_drive(drive:%s)\n", drive->name)); + do { struct hd_driveid *id = drive->id; @@ -143,34 +175,188 @@ return hwif->ide_dma_off_quietly(drive); } +/* + * The SL82C105 holds off all IDE interrupts while in DMA mode until + * all DMA activity is completed. Sometimes this causes problems (eg, + * when the drive wants to report an error condition). + * + * 0x7e is a "chip testing" register. Bit 2 resets the DMA controller + * state machine. We need to kick this to work around various bugs. + */ +static inline void sl82c105_reset_host(struct pci_dev *dev) +{ + u16 val; + + pci_read_config_word(dev, 0x7e, &val); + pci_write_config_word(dev, 0x7e, val | (1 << 2)); + pci_write_config_word(dev, 0x7e, val & ~(1 << 2)); +} + +/* + * If we get an IRQ timeout, it might be that the DMA state machine + * got confused. Fix from Todd Inglett. Details from Winbond. + * + * This function is called when the IDE timer expires, the drive + * indicates that it is READY, and we were waiting for DMA to complete. + */ +static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct pci_dev *dev = hwif->pci_dev; + u32 val, mask = hwif->channel ? CTRL_IDE_IRQB : CTRL_IDE_IRQA; + unsigned long dma_base = hwif->dma_base; + + printk("sl82c105: lost IRQ: resetting host\n"); + + /* + * Check the raw interrupt from the drive. + */ + pci_read_config_dword(dev, 0x40, &val); + if (val & mask) + printk("sl82c105: drive was requesting IRQ, but host lost it\n"); + + /* + * Was DMA enabled? If so, disable it - we're resetting the + * host. The IDE layer will be handling the drive for us. + */ + val = hwif->INB(dma_base); + if (val & 1) { + outb(val & ~1, dma_base); + printk("sl82c105: DMA was enabled\n"); + } + + sl82c105_reset_host(dev); + + /* ide_dmaproc would return 1, so we do as well */ + return 1; +} + +/* + * ATAPI devices can cause the SL82C105 DMA state machine to go gaga. + * Winbond recommend that the DMA state machine is reset prior to + * setting the bus master DMA enable bit. + * + * The generic IDE core will have disabled the BMEN bit before this + * function is called. + */ +static int sl82c105_ide_dma_begin(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct pci_dev *dev = hwif->pci_dev; + +// DBG(("sl82c105_ide_dma_begin(drive:%s)\n", drive->name)); + + sl82c105_reset_host(dev); + return __ide_dma_begin(drive); +} + +static int sl82c105_ide_dma_timeout(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct pci_dev *dev = hwif->pci_dev; + + DBG(("sl82c105_ide_dma_timeout(drive:%s)\n", drive->name)); + + sl82c105_reset_host(dev); + return __ide_dma_timeout(drive); +} + static int sl82c105_ide_dma_on (ide_drive_t *drive) { + DBG(("sl82c105_ide_dma_on(drive:%s)\n", drive->name)); + if (config_for_dma(drive)) { - config_for_pio(drive, 4, 0); + config_for_pio(drive, 4, 0, 0); return HWIF(drive)->ide_dma_off_quietly(drive); } + printk(KERN_INFO "%s: DMA enabled\n", drive->name); return __ide_dma_on(drive); } static int sl82c105_ide_dma_off (ide_drive_t *drive) { - config_for_pio(drive, 4, 0); - return __ide_dma_off(drive); + u8 speed = XFER_PIO_0; + int rc; + + DBG(("sl82c105_ide_dma_off(drive:%s)\n", drive->name)); + + rc = __ide_dma_off(drive); + if (drive->pio_speed) + speed = drive->pio_speed - XFER_PIO_0; + config_for_pio(drive, speed, 0, 1); + drive->current_speed = drive->pio_speed; + + return rc; } static int sl82c105_ide_dma_off_quietly (ide_drive_t *drive) { - config_for_pio(drive, 4, 0); - return __ide_dma_off_quietly(drive); + u8 speed = XFER_PIO_0; + int rc; + + DBG(("sl82c105_ide_dma_off_quietly(drive:%s)\n", drive->name)); + + rc = __ide_dma_off_quietly(drive); + if (drive->pio_speed) + speed = drive->pio_speed - XFER_PIO_0; + config_for_pio(drive, speed, 0, 1); + drive->current_speed = drive->pio_speed; + + return rc; +} + +/* + * Ok, that is nasty, but we must make sure the DMA timings + * won't be used for a PIO access. The solution here is + * to make sure the 16 bits mode is diabled on the channel + * when DMA is enabled, thus causing the chip to use PIO0 + * timings for those operations. + */ +static void sl82c105_selectproc(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct pci_dev *dev = hwif->pci_dev; + u32 val, old, mask; + + //DBG(("sl82c105_selectproc(drive:%s)\n", drive->name)); + + mask = hwif->channel ? CTRL_P1F16 : CTRL_P0F16; + old = val = *((u32 *)&hwif->hwif_data); + if (drive->using_dma) + val &= ~mask; + else + val |= mask; + if (old != val) { + pci_write_config_dword(dev, 0x40, val); + *((u32 *)&hwif->hwif_data) = val; + } } /* + * ATA reset will clear the 16 bits mode in the control + * register, we need to update our cache + */ +static void sl82c105_resetproc(ide_drive_t *drive) +{ + ide_hwif_t *hwif = HWIF(drive); + struct pci_dev *dev = hwif->pci_dev; + u32 val; + + DBG(("sl82c105_resetproc(drive:%s)\n", drive->name)); + + pci_read_config_dword(dev, 0x40, &val); + *((u32 *)&hwif->hwif_data) = val; +} + +/* * We only deal with PIO mode here - DMA mode 'using_dma' is not * initialised at the point that this function is called. */ static void tune_sl82c105(ide_drive_t *drive, u8 pio) { - config_for_pio(drive, pio, 1); + DBG(("tune_sl82c105(drive:%s)\n", drive->name)); + + config_for_pio(drive, pio, 1, 0); /* * We support 32-bit I/O on this interface, and it @@ -189,16 +375,20 @@ struct pci_dev *bridge; u8 rev; - bridge = pci_find_device(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_83C553, NULL); - /* - * If we are part of a Winbond 553 + * The bridge should be part of the same device, but function 0. */ - if (!bridge || bridge->class >> 8 != PCI_CLASS_BRIDGE_ISA) + bridge = pci_find_slot(dev->bus->number, + PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); + if (!bridge) return -1; - if (bridge->bus != dev->bus || - PCI_SLOT(bridge->devfn) != PCI_SLOT(dev->devfn)) + /* + * Make sure it is a Winbond 553 and is an ISA bridge. + */ + if (bridge->vendor != PCI_VENDOR_ID_WINBOND || + bridge->device != PCI_DEVICE_ID_WINBOND_83C553 || + bridge->class >> 8 != PCI_CLASS_BRIDGE_ISA) return -1; /* @@ -211,16 +401,21 @@ /* * Enable the PCI device + * + * --BenH: It's arch fixup code that should enable channels that + * have not been enabled by firmware. I decided we can still enable + * channel 0 here at least, but channel 1 has to be enabled by + * firmware or arch code. We still set both to 16 bits mode. */ static unsigned int __init init_chipset_sl82c105(struct pci_dev *dev, const char *msg) { - u8 ctrl_stat; + u32 val; - /* - * Enable the ports - */ - pci_read_config_byte(dev, 0x40, &ctrl_stat); - pci_write_config_byte(dev, 0x40, ctrl_stat | 0x33); + DBG(("init_chipset_sl82c105()\n")); + + pci_read_config_dword(dev, 0x40, &val); + val |= CTRL_P0EN | CTRL_P0F16 | CTRL_P1F16; + pci_write_config_dword(dev, 0x40, val); return dev->irq; } @@ -230,6 +425,8 @@ unsigned int rev; u8 dma_state; + DBG(("init_dma_sl82c105(hwif: ide%d, dma_base: 0x%08x)\n", hwif->index, dma_base)); + hwif->autodma = 0; if (!dma_base) @@ -238,8 +435,6 @@ dma_state = hwif->INB(dma_base + 2); rev = sl82c105_bridge_revision(hwif->pci_dev); if (rev <= 5) { - hwif->drives[0].autotune = 1; - hwif->drives[1].autotune = 1; printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n", hwif->name, rev); dma_state &= ~0x60; @@ -259,8 +454,28 @@ static void __init init_hwif_sl82c105(ide_hwif_t *hwif) { - hwif->tuneproc = tune_sl82c105; + struct pci_dev *dev = hwif->pci_dev; + u32 val; + + DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index)); + hwif->tuneproc = tune_sl82c105; + hwif->selectproc = sl82c105_selectproc; + hwif->resetproc = sl82c105_resetproc; + + /* Default to PIO 0 for fallback unless tuned otherwise, + * we always autotune PIO, this is done before DMA is + * checked, so there is no risk of accidentally disabling + * DMA + */ + hwif->drives[0].pio_speed = XFER_PIO_0; + hwif->drives[0].autotune = 1; + hwif->drives[1].pio_speed = XFER_PIO_1; + hwif->drives[1].autotune = 1; + + pci_read_config_dword(dev, 0x40, &val); + *((u32 *)&hwif->hwif_data) = val; + if (!hwif->dma_base) return; @@ -273,6 +488,10 @@ hwif->ide_dma_on = &sl82c105_ide_dma_on; hwif->ide_dma_off = &sl82c105_ide_dma_off; hwif->ide_dma_off_quietly = &sl82c105_ide_dma_off_quietly; + hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq; + hwif->ide_dma_begin = &sl82c105_ide_dma_begin; + hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout; + if (!noautodma) hwif->autodma = 1; hwif->drives[0].autodma = hwif->autodma; @@ -318,5 +537,3 @@ MODULE_DESCRIPTION("PCI driver module for W82C105 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c --- a/drivers/ide/pci/slc90e66.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/pci/slc90e66.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/slc90e66.c Version 0.11 September 11, 2002 + * linux/drivers/ide/pci/slc90e66.c Version 0.11 September 11, 2002 * * Copyright (C) 2000-2002 Andre Hedrick * @@ -403,5 +403,3 @@ MODULE_AUTHOR("Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for SLC90E66 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c --- a/drivers/ide/pci/trm290.c Thu Feb 20 23:19:20 2003 +++ b/drivers/ide/pci/trm290.c Thu Feb 20 23:19:20 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/trm290.c Version 1.02 Mar. 18, 2000 + * linux/drivers/ide/pci/trm290.c Version 1.02 Mar. 18, 2000 * * Copyright (c) 1997-1998 Mark Lord * May be copied or modified under the terms of the GNU General Public License @@ -176,6 +176,7 @@ trm290_prepare_drive(drive, drive->using_dma); } +#ifdef CONFIG_BLK_DEV_IDEDMA static int trm290_ide_dma_write (ide_drive_t *drive /*, struct request *rq */) { ide_hwif_t *hwif = HWIF(drive); @@ -296,6 +297,7 @@ status = hwif->INW(hwif->dma_status); return (status == 0x00ff); } +#endif /* CONFIG_BLK_DEV_IDEDMA */ /* * Invoked from ide-dma.c at boot time. @@ -342,11 +344,13 @@ ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->channel ? 0x0080 : 0x0000), 3); +#ifdef CONFIG_BLK_DEV_IDEDMA hwif->ide_dma_write = &trm290_ide_dma_write; hwif->ide_dma_read = &trm290_ide_dma_read; hwif->ide_dma_begin = &trm290_ide_dma_begin; hwif->ide_dma_end = &trm290_ide_dma_end; hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq; +#endif /* CONFIG_BLK_DEV_IDEDMA */ hwif->selectproc = &trm290_selectproc; hwif->autodma = 0; /* play it safe for now */ @@ -430,5 +434,3 @@ MODULE_AUTHOR("Mark Lord"); MODULE_DESCRIPTION("PCI driver module for Tekram TRM290 IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c --- a/drivers/ide/pci/via82cxxx.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/pci/via82cxxx.c Thu Feb 20 23:19:19 2003 @@ -667,5 +667,3 @@ MODULE_AUTHOR("Vojtech Pavlik, Michel Aubry, Jeff Garzik, Andre Hedrick"); MODULE_DESCRIPTION("PCI driver module for VIA IDE"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c --- a/drivers/ide/ppc/mpc8xx.c Thu Feb 20 23:19:23 2003 +++ b/drivers/ide/ppc/mpc8xx.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/ide-m8xx.c + * linux/drivers/ide/ppc/ide-m8xx.c * * Copyright (C) 2000, 2001 Wolfgang Denk, wd@denx.de * Modified for direct IDE interface @@ -54,7 +54,7 @@ typedef struct ide_ioport_desc { unsigned long base_off; /* Offset to PCMCIA memory */ - ide_ioreg_t reg_off[IDE_NR_PORTS]; /* controller register offsets */ + unsigned long reg_off[IDE_NR_PORTS]; /* controller register offsets */ int irq; /* IRQ */ } ide_ioport_desc_t; @@ -113,7 +113,7 @@ * IDE stuff. */ static int -m8xx_ide_default_irq(ide_ioreg_t base) +m8xx_ide_default_irq(unsigned long base) { #ifdef CONFIG_BLK_DEV_MPC8xx_IDE if (base >= MAX_HWIFS) @@ -127,7 +127,7 @@ #endif } -static ide_ioreg_t +static unsigned long m8xx_ide_default_io_base(int index) { return index; @@ -161,10 +161,10 @@ */ #if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) static void -m8xx_ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, - ide_ioreg_t ctrl_port, int *irq) +m8xx_ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port, + unsigned long ctrl_port, int *irq) { - ide_ioreg_t *p = hw->io_ports; + unsigned long *p = hw->io_ports; int i; typedef struct { @@ -346,9 +346,9 @@ */ #if defined(CONFIG_IDE_EXT_DIRECT) void m8xx_ide_init_hwif_ports (hw_regs_t *hw, - ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq) + unsigned long data_port, unsigned long ctrl_port, int *irq) { - ide_ioreg_t *p = hw->io_ports; + unsigned long *p = hw->io_ports; int i; u32 ide_phy_base; diff -Nru a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c --- a/drivers/ide/ppc/pmac.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ide/ppc/pmac.c Thu Feb 20 23:19:19 2003 @@ -51,7 +51,7 @@ #define DMA_WAIT_TIMEOUT 500 typedef struct pmac_ide_hwif { - ide_ioreg_t regbase; + unsigned long regbase; int irq; int kind; int aapl_bus_id; @@ -267,7 +267,7 @@ */ void __pmac pmac_ide_init_hwif_ports(hw_regs_t *hw, - ide_ioreg_t data_port, ide_ioreg_t ctrl_port, + unsigned long data_port, unsigned long ctrl_port, int *irq) { int i, ix; @@ -672,14 +672,14 @@ pmif->timings[0] = pmif->timings[1] = value; } -ide_ioreg_t __pmac +unsigned long __pmac pmac_ide_get_base(int index) { return pmac_ide[index].regbase; } int __pmac -pmac_ide_check_base(ide_ioreg_t base) +pmac_ide_check_base(unsigned long base) { int ix; @@ -690,7 +690,7 @@ } int __pmac -pmac_ide_get_irq(ide_ioreg_t base) +pmac_ide_get_irq(unsigned long base) { int ix; diff -Nru a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c --- a/drivers/ide/setup-pci.c Thu Feb 20 23:19:21 2003 +++ b/drivers/ide/setup-pci.c Thu Feb 20 23:19:21 2003 @@ -662,7 +662,7 @@ * This is in the wrong place. The driver may * do set up based on the autotune value and this * will then trash it. Torben please move it and - * propogate the fixes into the drivers + * propagate the fixes into the drivers */ if (drive0_tune == IDE_TUNE_BIOS) /* biostimings */ hwif->drives[0].autotune = IDE_TUNE_BIOS; diff -Nru a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c --- a/drivers/ieee1394/raw1394.c Thu Feb 20 23:19:19 2003 +++ b/drivers/ieee1394/raw1394.c Thu Feb 20 23:19:19 2003 @@ -238,7 +238,7 @@ list_del(&hi->list); host_count--; /* - FIXME: adressranges should be removed + FIXME: addressranges should be removed and fileinfo states should be initialized (including setting generation to internal-generation ...) diff -Nru a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c --- a/drivers/input/joystick/grip_mp.c Thu Feb 20 23:19:23 2003 +++ b/drivers/input/joystick/grip_mp.c Thu Feb 20 23:19:23 2003 @@ -22,10 +22,7 @@ MODULE_AUTHOR("Brian Bonnlander"); MODULE_DESCRIPTION("Gravis Grip Multiport driver"); -#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); -#endif -EXPORT_NO_SYMBOLS; #ifdef GRIP_DEBUG #define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg) diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c --- a/drivers/input/serio/i8042.c Thu Feb 20 23:19:19 2003 +++ b/drivers/input/serio/i8042.c Thu Feb 20 23:19:19 2003 @@ -257,7 +257,7 @@ /* * i8042_close() frees the interrupt, so that it can possibly be used * by another driver. We never know - if the user doesn't have a mouse, - * the BIOS could have used the AUX interupt for PCI. + * the BIOS could have used the AUX interrupt for PCI. */ static void i8042_close(struct serio *port) diff -Nru a/drivers/isdn/eicon/divalog.h b/drivers/isdn/eicon/divalog.h --- a/drivers/isdn/eicon/divalog.h Thu Feb 20 23:19:24 2003 +++ b/drivers/isdn/eicon/divalog.h Thu Feb 20 23:19:24 2003 @@ -1,5 +1,5 @@ /* - * Include file for defining the kernel loggger messages + * Include file for defining the kernel logger messages * These definitions are shared between the klog driver and the * klogd daemon process * diff -Nru a/drivers/isdn/hardware/eicon/capimain.c b/drivers/isdn/hardware/eicon/capimain.c --- a/drivers/isdn/hardware/eicon/capimain.c Thu Feb 20 23:19:20 2003 +++ b/drivers/isdn/hardware/eicon/capimain.c Thu Feb 20 23:19:20 2003 @@ -29,8 +29,6 @@ #include "cp_vers.h" #include "capifunc.h" -EXPORT_NO_SYMBOLS; - static char *main_revision = "$Revision: 1.1.2.11 $"; static char *DRIVERNAME = "Eicon DIVA - CAPI Interface driver (http://www.melware.net)"; diff -Nru a/drivers/isdn/hardware/eicon/divamnt.c b/drivers/isdn/hardware/eicon/divamnt.c --- a/drivers/isdn/hardware/eicon/divamnt.c Thu Feb 20 23:19:22 2003 +++ b/drivers/isdn/hardware/eicon/divamnt.c Thu Feb 20 23:19:22 2003 @@ -28,8 +28,6 @@ #include "di_defs.h" #include "debug_if.h" -EXPORT_NO_SYMBOLS; - static char *main_revision = "$Revision: 1.1.2.4 $"; static int major = 241; diff -Nru a/drivers/isdn/hardware/eicon/divasi.c b/drivers/isdn/hardware/eicon/divasi.c --- a/drivers/isdn/hardware/eicon/divasi.c Thu Feb 20 23:19:21 2003 +++ b/drivers/isdn/hardware/eicon/divasi.c Thu Feb 20 23:19:21 2003 @@ -28,8 +28,6 @@ #include "um_xdi.h" #include "um_idi.h" -EXPORT_NO_SYMBOLS; - static char *main_revision = "$Revision: 1.1.2.7 $"; static int major = 242; diff -Nru a/drivers/isdn/hardware/eicon/divasmain.c b/drivers/isdn/hardware/eicon/divasmain.c --- a/drivers/isdn/hardware/eicon/divasmain.c Thu Feb 20 23:19:20 2003 +++ b/drivers/isdn/hardware/eicon/divasmain.c Thu Feb 20 23:19:20 2003 @@ -45,7 +45,6 @@ #include "xdi_vers.h" #include "diva_dma.h" -EXPORT_NO_SYMBOLS; static char *main_revision = "$Revision: 1.1.2.8 $"; int errno = 0; diff -Nru a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c --- a/drivers/isdn/hardware/eicon/divasproc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/isdn/hardware/eicon/divasproc.c Thu Feb 20 23:19:23 2003 @@ -33,8 +33,6 @@ #include "diva.h" -EXPORT_NO_SYMBOLS; - extern PISDN_ADAPTER IoAdapters[MAX_ADAPTER]; extern diva_entity_queue_t adapter_queue; extern void divas_get_version(char *); diff -Nru a/drivers/isdn/hardware/eicon/i4lididrv.c b/drivers/isdn/hardware/eicon/i4lididrv.c --- a/drivers/isdn/hardware/eicon/i4lididrv.c Thu Feb 20 23:19:23 2003 +++ b/drivers/isdn/hardware/eicon/i4lididrv.c Thu Feb 20 23:19:23 2003 @@ -27,8 +27,6 @@ #include "../avmb1/capicmd.h" /* this should be moved in a common place */ -EXPORT_NO_SYMBOLS; - #define INCLUDE_INLINE_FUNCS static eicon_card *cards = (eicon_card *) NULL; /* glob. var , contains diff -Nru a/drivers/isdn/hardware/eicon/io.c b/drivers/isdn/hardware/eicon/io.c --- a/drivers/isdn/hardware/eicon/io.c Thu Feb 20 23:19:20 2003 +++ b/drivers/isdn/hardware/eicon/io.c Thu Feb 20 23:19:20 2003 @@ -534,7 +534,7 @@ goto Trapped ; } /* - * memory based shared ram is accessable from different + * memory based shared ram is accessible from different * processors without disturbing concurrent processes. */ a->ram_out (a, &IoAdapter->pcm->rc, 0) ; diff -Nru a/drivers/isdn/hardware/eicon/mi_pc.h b/drivers/isdn/hardware/eicon/mi_pc.h --- a/drivers/isdn/hardware/eicon/mi_pc.h Thu Feb 20 23:19:22 2003 +++ b/drivers/isdn/hardware/eicon/mi_pc.h Thu Feb 20 23:19:22 2003 @@ -120,7 +120,7 @@ #define MQ_CACHED_ADDR(x) (((x) & 0x1fffffffL) | 0x80000000L) #define MQ_UNCACHED_ADDR(x) (((x) & 0x1fffffffL) | 0xa0000000L) /*--------------------------------------------------------------------------------------------*/ -/* Additional definitions reflecting the different adress map of the SERVER 4BRI V2 */ +/* Additional definitions reflecting the different address map of the SERVER 4BRI V2 */ #define MQ2_BREG_RISC 0x0200 /* RISC Reset ect */ #define MQ2_BREG_IRQ_TEST 0x0400 /* Interrupt request, no CPU interaction */ #define MQ2_BOARD_DSP_OFFSET 0x800000 /* PC relative On board DSP regs offset */ diff -Nru a/drivers/md/linear.c b/drivers/md/linear.c --- a/drivers/md/linear.c Thu Feb 20 23:19:21 2003 +++ b/drivers/md/linear.c Thu Feb 20 23:19:21 2003 @@ -110,9 +110,18 @@ goto out; } + /* + * This code was restructured to work around a gcc-2.95.3 internal + * compiler error. Alter it with care. + */ { - sector_t sz = md_size[mdidx(mddev)]; - unsigned round = sector_div(sz, conf->smallest->size); + sector_t sz; + unsigned round; + unsigned long base; + + sz = md_size[mdidx(mddev)]; + base = conf->smallest->size; + round = sector_div(sz, base); nb_zone = conf->nr_zones = sz + (round ? 1 : 0); } diff -Nru a/drivers/md/md.c b/drivers/md/md.c --- a/drivers/md/md.c Thu Feb 20 23:19:20 2003 +++ b/drivers/md/md.c Thu Feb 20 23:19:20 2003 @@ -83,21 +83,45 @@ static struct ctl_table_header *raid_table_header; static ctl_table raid_table[] = { - {DEV_RAID_SPEED_LIMIT_MIN, "speed_limit_min", - &sysctl_speed_limit_min, sizeof(int), 0644, NULL, &proc_dointvec}, - {DEV_RAID_SPEED_LIMIT_MAX, "speed_limit_max", - &sysctl_speed_limit_max, sizeof(int), 0644, NULL, &proc_dointvec}, - {0} + { + .ctl_name = DEV_RAID_SPEED_LIMIT_MIN, + .procname = "speed_limit_min", + .data = &sysctl_speed_limit_min, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = DEV_RAID_SPEED_LIMIT_MAX, + .procname = "speed_limit_max", + .data = &sysctl_speed_limit_max, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { .ctl_name = 0 } }; static ctl_table raid_dir_table[] = { - {DEV_RAID, "raid", NULL, 0, 0555, raid_table}, - {0} + { + .ctl_name = DEV_RAID, + .procname = "raid", + .maxlen = 0, + .mode = 0555, + .child = raid_table, + }, + { .ctl_name = 0 } }; static ctl_table raid_root_table[] = { - {CTL_DEV, "dev", NULL, 0, 0555, raid_dir_table}, - {0} + { + .ctl_name = CTL_DEV, + .procname = "dev", + .maxlen = 0, + .mode = 0555, + .proc_handler = raid_dir_table, + }, + { .ctl_name = 0 } }; static void md_recover_arrays(void); @@ -209,6 +233,11 @@ return down_interruptible(&mddev->reconfig_sem); } +static inline void mddev_lock_uninterruptible(mddev_t * mddev) +{ + down(&mddev->reconfig_sem); +} + static inline int mddev_trylock(mddev_t * mddev) { return down_trylock(&mddev->reconfig_sem); @@ -700,7 +729,7 @@ if (rdev2->raid_disk >= 0) d->raid_disk = rdev2->raid_disk; else - d->raid_disk = rdev2->desc_nr; /* compatability */ + d->raid_disk = rdev2->desc_nr; /* compatibility */ if (rdev2->faulty) { d->state = (1<persistent) return; - printk(KERN_INFO "md: updating md%d RAID superblock on device\n", - mdidx(mddev)); + printk(KERN_INFO "md: updating md%d RAID superblock on device (in sync %d)\n", + mdidx(mddev),mddev->in_sync); err = 0; ITERATE_RDEV(mddev,rdev,tmp) { @@ -1490,6 +1519,8 @@ mddev->pers = NULL; return -EINVAL; } + atomic_set(&mddev->writes_pending,0); + mddev->safemode = 0; if (mddev->pers->sync_request) mddev->in_sync = 0; else @@ -1521,6 +1552,7 @@ if (!mddev->ro) goto out; + mddev->safemode = 0; mddev->in_sync = 0; md_update_sb(mddev); mddev->ro = 0; @@ -1925,7 +1957,7 @@ if (!list_empty(&mddev->disks)) { mdk_rdev_t *rdev0 = list_entry(mddev->disks.next, mdk_rdev_t, same_set); - int err = super_90_load(rdev, NULL); + int err = super_90_load(rdev, rdev0); if (err < 0) { printk(KERN_WARNING "md: %s has different UUID to %s\n", bdev_partition_name(rdev->bdev), bdev_partition_name(rdev0->bdev)); @@ -2794,6 +2826,48 @@ } +void md_write_start(mddev_t *mddev) +{ + if (mddev->safemode && !atomic_read(&mddev->writes_pending)) { + mddev_lock_uninterruptible(mddev); + atomic_inc(&mddev->writes_pending); + if (mddev->in_sync) { + mddev->in_sync = 0; + md_update_sb(mddev); + } + mddev_unlock(mddev); + } else + atomic_inc(&mddev->writes_pending); +} + +void md_write_end(mddev_t *mddev, mdk_thread_t *thread) +{ + if (atomic_dec_and_test(&mddev->writes_pending) && mddev->safemode) + md_wakeup_thread(thread); +} +static inline void md_enter_safemode(mddev_t *mddev) +{ + + mddev_lock_uninterruptible(mddev); + if (mddev->safemode && !atomic_read(&mddev->writes_pending) && !mddev->in_sync && !mddev->recovery_running) { + mddev->in_sync = 1; + md_update_sb(mddev); + } + mddev_unlock(mddev); +} + +void md_handle_safemode(mddev_t *mddev) +{ + if (signal_pending(current)) { + printk(KERN_INFO "md: md%d in safe mode\n",mdidx(mddev)); + mddev->safemode= 1; + flush_curr_signals(); + } + if (mddev->safemode) + md_enter_safemode(mddev); +} + + DECLARE_WAIT_QUEUE_HEAD(resync_wait); #define SYNC_MARKS 10 @@ -2971,6 +3045,8 @@ mddev->recovery_running = 0; if (mddev->recovery_running == 0) mddev->recovery_cp = MaxSector; + if (mddev->safemode) + md_enter_safemode(mddev); md_recover_arrays(); } @@ -3246,6 +3322,9 @@ EXPORT_SYMBOL(md_error); EXPORT_SYMBOL(md_sync_acct); EXPORT_SYMBOL(md_done_sync); +EXPORT_SYMBOL(md_write_start); +EXPORT_SYMBOL(md_write_end); +EXPORT_SYMBOL(md_handle_safemode); EXPORT_SYMBOL(md_register_thread); EXPORT_SYMBOL(md_unregister_thread); EXPORT_SYMBOL(md_wakeup_thread); diff -Nru a/drivers/md/multipath.c b/drivers/md/multipath.c --- a/drivers/md/multipath.c Thu Feb 20 23:19:21 2003 +++ b/drivers/md/multipath.c Thu Feb 20 23:19:21 2003 @@ -283,6 +283,7 @@ p->rdev = rdev; conf->working_disks++; rdev->raid_disk = path; + rdev->in_sync = 1; found = 1; } spin_unlock_irq(&conf->device_lock); diff -Nru a/drivers/md/raid1.c b/drivers/md/raid1.c --- a/drivers/md/raid1.c Thu Feb 20 23:19:22 2003 +++ b/drivers/md/raid1.c Thu Feb 20 23:19:22 2003 @@ -319,8 +319,10 @@ * Let's see if all mirrored write operations have finished * already. */ - if (atomic_dec_and_test(&r1_bio->remaining)) + if (atomic_dec_and_test(&r1_bio->remaining)) { + md_write_end(r1_bio->mddev,conf->thread); raid_end_bio_io(r1_bio, uptodate); + } } atomic_dec(&conf->mirrors[mirror].rdev->nr_pending); return 0; @@ -540,6 +542,7 @@ * If all mirrors are non-operational * then return an IO error: */ + md_write_end(mddev,conf->thread); raid_end_bio_io(r1_bio, 0); return 0; } @@ -555,6 +558,8 @@ * do end_request by hand if all requests finish until we had a * chance to set up the semaphore correctly ... lots of races). */ + + md_write_start(mddev); for (i=disks; i--; ) { struct bio *mbio; mbio = r1_bio->write_bios[i]; @@ -902,10 +907,11 @@ struct bio *bio; unsigned long flags; mddev_t *mddev; - conf_t *conf; + conf_t *conf = data; mdk_rdev_t *rdev; - + md_handle_safemode(conf->mddev); + for (;;) { spin_lock_irqsave(&retry_list_lock, flags); if (list_empty(head)) @@ -1184,9 +1190,9 @@ { - const char * name = "raid1d"; + snprintf(conf->thread_name,MD_THREAD_NAME_MAX,"raid1d_md%d",mdidx(mddev)); - conf->thread = md_register_thread(raid1d, conf, name); + conf->thread = md_register_thread(raid1d, conf, conf->thread_name); if (!conf->thread) { printk(THREAD_ERROR, mdidx(mddev)); goto out_free_conf; diff -Nru a/drivers/md/raid5.c b/drivers/md/raid5.c --- a/drivers/md/raid5.c Thu Feb 20 23:19:20 2003 +++ b/drivers/md/raid5.c Thu Feb 20 23:19:20 2003 @@ -913,6 +913,7 @@ struct bio *nextbi = bi->bi_next; clear_bit(BIO_UPTODATE, &bi->bi_flags); if (--bi->bi_phys_segments == 0) { + md_write_end(conf->mddev, conf->thread); bi->bi_next = return_bi; return_bi = bi; } @@ -963,16 +964,19 @@ /* We can return any write requests */ struct bio *wbi, *wbi2; PRINTK("Return write for disc %d\n", i); + spin_lock_irq(&conf->device_lock); wbi = dev->written; dev->written = NULL; while (wbi && wbi->bi_sector < dev->sector + STRIPE_SECTORS) { wbi2 = wbi->bi_next; if (--wbi->bi_phys_segments == 0) { + md_write_end(conf->mddev, conf->thread); wbi->bi_next = return_bi; return_bi = wbi; } wbi = wbi2; } + spin_unlock_irq(&conf->device_lock); } } } @@ -1275,6 +1279,8 @@ bi->bi_next = NULL; bi->bi_phys_segments = 1; /* over-loaded to count active stripes */ + if ( bio_data_dir(bi) == WRITE ) + md_write_start(mddev); for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) { new_sector = raid5_compute_sector(logical_sector, @@ -1297,6 +1303,8 @@ if (--bi->bi_phys_segments == 0) { int bytes = bi->bi_size; + if ( bio_data_dir(bi) == WRITE ) + md_write_end(mddev,conf->thread); bi->bi_size = 0; bi->bi_end_io(bi, bytes, 0); } @@ -1357,6 +1365,7 @@ PRINTK("+++ raid5d active\n"); + md_handle_safemode(mddev); handled = 0; spin_lock_irq(&conf->device_lock); while (1) { @@ -1477,9 +1486,9 @@ } { - const char * name = "raid5d"; + snprintf(conf->thread_name,MD_THREAD_NAME_MAX,"raid5d_md%d",mdidx(mddev)); - conf->thread = md_register_thread(raid5d, conf, name); + conf->thread = md_register_thread(raid5d, conf, conf->thread_name); if (!conf->thread) { printk(KERN_ERR "raid5: couldn't allocate thread for md%d\n", mdidx(mddev)); goto abort; diff -Nru a/drivers/media/dvb/av7110/saa7146_core.c b/drivers/media/dvb/av7110/saa7146_core.c --- a/drivers/media/dvb/av7110/saa7146_core.c Thu Feb 20 23:19:23 2003 +++ b/drivers/media/dvb/av7110/saa7146_core.c Thu Feb 20 23:19:23 2003 @@ -494,7 +494,7 @@ saa->revision = (rev & 0xf); - /* remap the memory from virtual to physical adress */ + /* remap the memory from virtual to physical address */ saa->mem = ioremap ((saa->device->resource[0].start) &PCI_BASE_ADDRESS_MEM_MASK, 0x1000); diff -Nru a/drivers/media/video/bt832.c b/drivers/media/video/bt832.c --- a/drivers/media/video/bt832.c Thu Feb 20 23:19:23 2003 +++ b/drivers/media/video/bt832.c Thu Feb 20 23:19:23 2003 @@ -1,5 +1,5 @@ /* Driver for Bt832 CMOS Camera Video Processor - i2c-adresses: 0x88 or 0x8a + i2c-addresses: 0x88 or 0x8a The BT832 interfaces to a Quartzsight Digital Camera (352x288, 25 or 30 fps) via a 9 pin connector ( 4-wire SDATA, 2-wire i2c, SCLK, VCC, GND). diff -Nru a/drivers/media/video/bt832.h b/drivers/media/video/bt832.h --- a/drivers/media/video/bt832.h Thu Feb 20 23:19:22 2003 +++ b/drivers/media/video/bt832.h Thu Feb 20 23:19:22 2003 @@ -4,7 +4,7 @@ color digital camera directly to video capture devices via an 8-bit, 4:2:2 YUV or YCrCb video interface. - i2c adresses: 0x88 or 0x8a + i2c addresses: 0x88 or 0x8a */ /* The 64 registers: */ diff -Nru a/drivers/message/fusion/isense.c b/drivers/message/fusion/isense.c --- a/drivers/message/fusion/isense.c Thu Feb 20 23:19:21 2003 +++ b/drivers/message/fusion/isense.c Thu Feb 20 23:19:21 2003 @@ -89,7 +89,6 @@ #define my_VERSION MPT_LINUX_VERSION_COMMON #define MYNAM "isense" -EXPORT_NO_SYMBOLS; MODULE_AUTHOR(MODULEAUTHOR); MODULE_DESCRIPTION(my_NAME); diff -Nru a/drivers/message/fusion/lsi/mpi_raid.h b/drivers/message/fusion/lsi/mpi_raid.h --- a/drivers/message/fusion/lsi/mpi_raid.h Thu Feb 20 23:19:21 2003 +++ b/drivers/message/fusion/lsi/mpi_raid.h Thu Feb 20 23:19:21 2003 @@ -184,7 +184,7 @@ /****************************************************************************/ -/* Mailbox reqeust structure */ +/* Mailbox request structure */ /****************************************************************************/ typedef struct _MSG_MAILBOX_REQUEST diff -Nru a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h --- a/drivers/message/fusion/mptbase.h Thu Feb 20 23:19:20 2003 +++ b/drivers/message/fusion/mptbase.h Thu Feb 20 23:19:20 2003 @@ -603,7 +603,7 @@ dma_addr_t sense_buf_pool_dma; u32 sense_buf_low_dma; int mtrr_reg; - void *pcidev; /* struct pci_dev pointer */ + struct pci_dev *pcidev; u8 *memmap; /* mmap address */ struct Scsi_Host *sh; /* Scsi Host pointer */ ScsiCfgData spi_data; /* Scsi config. data */ diff -Nru a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c --- a/drivers/message/fusion/mptctl.c Thu Feb 20 23:19:19 2003 +++ b/drivers/message/fusion/mptctl.c Thu Feb 20 23:19:19 2003 @@ -102,7 +102,6 @@ #define my_VERSION MPT_LINUX_VERSION_COMMON #define MYNAM "mptctl" -EXPORT_NO_SYMBOLS; MODULE_AUTHOR(MODULEAUTHOR); MODULE_DESCRIPTION(my_NAME); MODULE_LICENSE("GPL"); diff -Nru a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c --- a/drivers/message/fusion/mptscsih.c Thu Feb 20 23:19:21 2003 +++ b/drivers/message/fusion/mptscsih.c Thu Feb 20 23:19:21 2003 @@ -1769,7 +1769,7 @@ /* Set the pci device pointer in Scsi_Host structure. */ - scsi_set_pci_device(sh, this->pcidev); + scsi_set_device(sh, &this->pcidev->dev); spin_unlock_irqrestore(&this->FreeQlock, flags); diff -Nru a/drivers/message/i2o/i2o_config.c b/drivers/message/i2o/i2o_config.c --- a/drivers/message/i2o/i2o_config.c Thu Feb 20 23:19:23 2003 +++ b/drivers/message/i2o/i2o_config.c Thu Feb 20 23:19:23 2003 @@ -964,7 +964,6 @@ i2o_remove_handler(&cfg_handler); } -EXPORT_NO_SYMBOLS; MODULE_AUTHOR("Red Hat Software"); MODULE_DESCRIPTION("I2O Configuration"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig --- a/drivers/net/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/net/Kconfig Thu Feb 20 23:19:23 2003 @@ -2376,175 +2376,7 @@ end of the link as well. It's good enough, for example, to run IP over the async ports of a Camtec JNT Pad. If unsure, say N. - -menu "Wireless LAN (non-hamradio)" - depends on NETDEVICES - -config NET_RADIO - bool "Wireless LAN (non-hamradio)" - ---help--- - Support for wireless LANs and everything having to do with radio, - but not with amateur radio or FM broadcasting. - - Saying Y here also enables the Wireless Extensions (creates - /proc/net/wireless and enables ifconfig access). The Wireless - Extension is a generic API allowing a driver to expose to the user - space configuration and statistics specific to common Wireless LANs. - The beauty of it is that a single set of tool can support all the - variations of Wireless LANs, regardless of their type (as long as - the driver supports Wireless Extension). Another advantage is that - these parameters may be changed on the fly without restarting the - driver (or Linux). If you wish to use Wireless Extensions with - wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch - the tools from - . - - Some user-level drivers for scarab devices which don't require - special kernel support are available from - . - -config STRIP - tristate "STRIP (Metricom starmode radio IP)" - depends on NET_RADIO && INET - ---help--- - Say Y if you have a Metricom radio and intend to use Starmode Radio - IP. STRIP is a radio protocol developed for the MosquitoNet project - (on the WWW at ) to send Internet - traffic using Metricom radios. Metricom radios are small, battery - powered, 100kbit/sec packet radio transceivers, about the size and - weight of a cellular telephone. (You may also have heard them called - "Metricom modems" but we avoid the term "modem" because it misleads - many people into thinking that you can plug a Metricom modem into a - phone line and use it as a modem.) - - You can use STRIP on any Linux machine with a serial port, although - it is obviously most useful for people with laptop computers. If you - think you might get a Metricom radio in the future, there is no harm - in saying Y to STRIP now, except that it makes the kernel a bit - bigger. - - You can also compile this as a module ( = code which can be inserted - in and removed from the running kernel whenever you want), say M - here and read . The module will be - called strip. - -config ARLAN - tristate "Aironet Arlan 655 & IC2200 DS support" - depends on NET_RADIO && ISA - ---help--- - Aironet makes Arlan, a class of wireless LAN adapters. These use the - www.Telxon.com chip, which is also used on several similar cards. - This driver is tested on the 655 and IC2200 series cards. Look at - for the latest information. - - The driver is built as two modules, arlan and arlan-proc. The latter - is the /proc interface and is not needed most of time. - - On some computers the card ends up in non-valid state after some - time. Use a ping-reset script to clear it. - -config AIRONET4500 - tristate "Aironet 4500/4800 series adapters" - depends on NET_RADIO && (PCI || ISA || PCMCIA) - ---help--- - www.aironet.com (recently bought by Cisco) makes these 802.11 DS - adapters. Driver by Elmer Joandi (elmer@ylenurme.ee). - - Say Y here if you have such an adapter, and then say Y below to - the option that applies to your particular type of card (PCI, ISA, - or PCMCIA). - - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called aironet4500_core. If you want to - compile it as a module, say M here and read - as well as - . - - quick config parameters: - SSID=tsunami - "The Password" - adhoc=1 there are no Access Points around - master=1 Adhoc master (the one who creates network - sync) - slave=1 Adhoc slave (btw, it is still forming own net - sometimes, and has problems with firmware... - change IbssJoinNetTimeout from /proc...) - channel=1..? meaningful in adhoc mode - - If you have problems with screwing up card, both_bap_lock=1 is a - conservative value (performance hit 15%). - - All other parameters can be set via the proc interface. - -config AIRONET4500_NONCS - tristate "Aironet 4500/4800 ISA/PCI/PNP/365 support " - depends on AIRONET4500 - help - If you have an ISA, PCI or PCMCIA Aironet 4500/4800 wireless LAN - card, say Y here, and then also to the options below that apply - to you. - - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called aironet4500_card. If you want to - compile it as a module, say M here and read - . - -config AIRONET4500_PNP - bool "Aironet 4500/4800 PNP support " - depends on AIRONET4500_NONCS - help - If you have an ISA Aironet 4500/4800 card which you want to use in - PnP (Plug and Play) mode, say Y here. This is the recommended mode - for ISA cards. Remember however to enable the PnP jumper on the - board if you say Y here. - -config AIRONET4500_PCI - bool "Aironet 4500/4800 PCI support " - depends on AIRONET4500_NONCS && PCI - help - If you have an PCI Aironet 4500/4800 card, say Y here. - -config AIRONET4500_ISA - bool "Aironet 4500/4800 ISA broken support (EXPERIMENTAL)" - depends on AIRONET4500_NONCS && EXPERIMENTAL - help - If you have an ISA Aironet 4500/4800 card which you want to run in - non-PnP mode, say Y here. This is not recommended and does not work - correctly at this point. Say N. - -config AIRONET4500_I365 - bool "Aironet 4500/4800 I365 broken support (EXPERIMENTAL)" - depends on AIRONET4500_NONCS && EXPERIMENTAL - help - If you have a PCMCIA Aironet 4500/4800 card which you want to use - without the standard PCMCIA cardservices provided by the pcmcia-cs - package, say Y here. This is not recommended, so say N. - -config AIRONET4500_PROC - tristate "Aironet 4500/4800 PROC interface " - depends on AIRONET4500 && m - ---help--- - If you say Y here (and to the "/proc file system" below), you will - be able to configure your Aironet card via the - /proc/sys/aironet4500 interface. - - Additional info: look in . - - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called aironet4500_proc. If you want to - compile it as a module, say M here and read - . - - NOTE: the proc interface uses a lot of memory, so it is recommended - to compile it as a module and remove the module after - configuration. - -# New directory for Wireless LAN devices - cards above will move there source "drivers/net/wireless/Kconfig" - -endmenu source "drivers/net/tokenring/Kconfig" diff -Nru a/drivers/net/Makefile b/drivers/net/Makefile --- a/drivers/net/Makefile Thu Feb 20 23:19:20 2003 +++ b/drivers/net/Makefile Thu Feb 20 23:19:20 2003 @@ -59,11 +59,6 @@ # obj-$(CONFIG_MII) += mii.o -obj-$(CONFIG_AIRONET4500) += aironet4500_core.o -obj-$(CONFIG_AIRONET4500_CS) += aironet4500_core.o -obj-$(CONFIG_AIRONET4500_NONCS) += aironet4500_card.o -obj-$(CONFIG_AIRONET4500_PROC) += aironet4500_proc.o -obj-$(CONFIG_AIRONET4500_CS) += aironet4500_proc.o obj-$(CONFIG_WINBOND_840) += mii.o obj-$(CONFIG_SUNDANCE) += sundance.o mii.o @@ -111,7 +106,6 @@ obj-$(CONFIG_SLIP) += slhc.o endif -obj-$(CONFIG_STRIP) += strip.o obj-$(CONFIG_DUMMY) += dummy.o obj-$(CONFIG_BONDING) += bonding.o obj-$(CONFIG_DE600) += de600.o @@ -136,7 +130,6 @@ obj-$(CONFIG_EEXPRESS_PRO) += eepro.o obj-$(CONFIG_8139CP) += 8139cp.o mii.o obj-$(CONFIG_8139TOO) += 8139too.o mii.o -obj-$(CONFIG_ARLAN) += arlan.o arlan-proc.o obj-$(CONFIG_ZNET) += znet.o obj-$(CONFIG_LAN_SAA9730) += saa9730.o obj-$(CONFIG_DEPCA) += depca.o diff -Nru a/drivers/net/ac3200.c b/drivers/net/ac3200.c --- a/drivers/net/ac3200.c Thu Feb 20 23:19:22 2003 +++ b/drivers/net/ac3200.c Thu Feb 20 23:19:22 2003 @@ -344,7 +344,7 @@ MODULE_PARM(io, "1-" __MODULE_STRING(MAX_AC32_CARDS) "i"); MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_AC32_CARDS) "i"); MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_AC32_CARDS) "i"); -MODULE_PARM_DESC(io, "I/O base adress(es)"); +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"); diff -Nru a/drivers/net/aironet4500.h b/drivers/net/aironet4500.h --- a/drivers/net/aironet4500.h Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,1607 +0,0 @@ -/* - * Aironet 4500 Pcmcia driver - * - * Elmer Joandi, Januar 1999 - * Copyright: GPL - * - * - * Revision 0.1 ,started 30.12.1998 - * - * - */ - - -#ifndef AIRONET4500_H -#define AIRONET4500_H -// redefined to avoid PCMCIA includes - - #include -/*#include - #include -*/ - -/* -#include -#include -#include -#include -#include -*/ -#include -#include - -//damn idiot PCMCIA stuff -#ifndef DEV_NAME_LEN - #define DEV_NAME_LEN 32 -#endif - -struct pcmcia_junkdev_node_t { - char dev_name[DEV_NAME_LEN]; - u_short major, minor; - struct dev_node_t *next; -}; - -#ifndef CS_RELEASE -typedef struct pcmcia_junkdev_node_t dev_node_t; -#endif - - - -#include - - -#define AWC_ERROR -1 -#define AWC_SUCCESS 0 - -struct awc_cis { - unsigned char cis[0x301]; - unsigned char unknown302[0xdf]; - unsigned short configuration_register; - unsigned short pin_replacement_register; - unsigned short socket_and_copy_register; - -}; - - -/* timeout for transmit watchdog timer, AP default is 8 sec */ -#define AWC_TX_TIMEOUT (HZ * 8) - - - -/*************************** REGISTER OFFSETS *********************/ -#define awc_Command_register 0x00 -#define awc_Param0_register 0x02 -#define awc_Param1_register 0x04 -#define awc_Param2_register 0x06 -#define awc_Status_register 0x08 -#define awc_Resp0_register 0x0A -#define awc_Resp1_register 0x0C -#define awc_Resp2_register 0x0E -#define awc_EvStat_register 0x30 -#define awc_EvIntEn_register 0x32 -#define awc_EvAck_register 0x34 -#define awc_SWSupport0_register 0x28 -#define awc_SWSupport1_register 0x2A -#define awc_SWSupport2_register 0x2C -#define awc_SWSupport3_register 0x2E -#define awc_LinkStatus_register 0x10 -// Memory access RID FID -#define awc_Select0_register 0x18 -#define awc_Offset0_register 0x1C -#define awc_Data0_register 0x36 -#define awc_Select1_register 0x1A -#define awc_Offset1_register 0x1E -#define awc_Data1_register 0x38 -// -#define awc_RxFID_register 0x20 -#define awc_TxAllocFID_register 0x22 -#define awc_TxComplFID_register 0x24 -#define awc_AuxPage_register 0x3A -#define awc_AuxOffset_register 0x3C -#define awc_AuxData_register 0x3E - - -struct awc_bap { - u16 select; - u16 offset; - u16 data; - volatile int lock; - volatile int status; - struct semaphore sem; - spinlock_t spinlock; - unsigned long flags; -}; - - - -#define AWC_COMMAND_STATE_WAIT_CMD_BUSY 1 -#define AWC_COMMAND_STATE_WAIT_CMD_ACK 2 -#define AWC_COMMAND_STATE_WAIT_BAP_BUSY 3 -#define AWC_COMMAND_STATE_BAP_NOT_SET 4 -#define AWC_COMMAND_STATE_BAP_SET 5 - -struct awc_command { - volatile int state; - volatile int lock_state; - struct net_device * dev; - struct awc_private * priv; - u16 port; - struct awc_bap * bap; - u16 command; - u16 par0; - u16 par1; - u16 par2; - u16 status; - u16 resp0; - u16 resp1; - u16 resp2; - u16 rid; - u16 offset; - u16 len; - void * buff; - -}; - - - - -#define DOWN(a) down_interruptible( a ) ; -// if (in_interrupt()) { down_interruptible( a ) ; } else printk("semaphore DOWN in interrupt tried \n"); -#define UP(a) up( a ) ; -// if (in_interrupt()) {up( a ) ; } else printk("semaphore UP in interrupt tried \n"); - -/* if (!in_interrupt())\ - printk("bap lock under cli but not in int\n");\ -*/ - -#define AWC_LOCK_COMMAND_ISSUING(a) spin_lock_irqsave(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags); -#define AWC_UNLOCK_COMMAND_ISSUING(a) spin_unlock_irqrestore(&a->command_issuing_spinlock,a->command_issuing_spinlock_flags); - -#define AWC_BAP_LOCK_UNDER_CLI_REAL(cmd) \ - if (!cmd.priv) {\ - printk(KERN_CRIT "awc4500: no priv present in command !");\ - }\ - cmd.bap = &(cmd.priv->bap1);\ - if (both_bap_lock)\ - spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ - if (cmd.bap){\ - spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\ - cmd.bap->lock++;\ - if (cmd.bap->lock > 1)\ - printk("Bap 1 lock high\n");\ - cmd.lock_state |= AWC_BAP_LOCKED;\ - } - -#define AWC_BAP_LOCK_NOT_CLI_REAL(cmd) {\ - if (in_interrupt())\ - printk("bap lock not cli in int\n");\ - if (!cmd.priv) {\ - printk(KERN_CRIT "awc4500: no priv present in command,lockup follows !");\ - }\ - cmd.bap = &(cmd.priv->bap0);\ - if (both_bap_lock)\ - spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ - spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\ - DOWN(&(cmd.priv->bap0.sem));\ - cmd.bap->lock++;\ - if (cmd.bap->lock > 1)\ - printk("Bap 0 lock high\n");\ - cmd.lock_state |= AWC_BAP_SEMALOCKED;\ -} - -#define AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd) {\ - cmd.bap = &(cmd.priv->bap0);\ - if (both_bap_lock)\ - spin_lock_irqsave(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ - spin_lock_irqsave(&(cmd.bap->spinlock),cmd.bap->flags);\ - cmd.bap->lock++;\ - if (cmd.bap->lock > 1)\ - printk("Bap 0 lock high\n");\ - cmd.lock_state |= AWC_BAP_LOCKED;\ -} - -#define BAP_LOCK_ANY(cmd)\ - if (in_interrupt()) AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd)\ - else AWC_BAP_LOCK_NOT_CLI_REAL(cmd) - -#define AWC_BAP_LOCK_NOT_CLI(cmd) BAP_LOCK_ANY(cmd) -#define AWC_BAP_LOCK_UNDER_CLI(cmd) AWC_BAP_LOCK_UNDER_CLI_REAL(cmd) -/* - if (!cmd.priv->bap1.lock ) {BAP_LOCK_ANY(cmd);}\ - else AWC_BAP_LOCK_NOT_CLI_CLI_REAL(cmd); -*/ -#define AWC_BAP_LOCKED 0x01 -#define AWC_BAP_SEMALOCKED 0x02 - -#define AWC_BAP_BUSY 0x8000 -#define AWC_BAP_ERR 0x4000 -#define AWC_BAP_DONE 0x2000 - -#define AWC_CLI 1 -#define AWC_NOT_CLI 2 - -/*#define WAIT61x3 inb(0x61);\ - inb(0x61);\ - inb(0x61); -*/ -#define WAIT61x3 udelay(bap_sleep) - -#define AWC_INIT_COMMAND(context, a_com, a_dev,a_cmmand,a_pr0, a_rid, a_offset, a_len, a_buff) {\ - memset(&a_com,0,sizeof(a_com) );\ - a_com.dev = a_dev;\ - a_com.priv = a_dev->priv;\ - a_com.port = a_dev->base_addr;\ - a_com.bap = NULL;\ - a_com.command = a_cmmand;\ - a_com.par0 = a_pr0;\ - a_com.rid = a_rid;\ - a_com.offset = a_offset;\ - a_com.len = a_len;\ - a_com.buff = a_buff;\ - a_com.lock_state = 0;\ -}; - -/* väga veider asi järgnevast - makrost välja jäetud if (cmd.bap) AWC_IN((cmd.bap)->data);\ -*/ - -#define AWC_BAP_UNLOCK(com) { \ - if (com.bap){ \ - if ( (com.lock_state & AWC_BAP_SEMALOCKED) &&\ - (com.lock_state & AWC_BAP_LOCKED) ){\ - printk("Both Sema and simple lock \n");\ - }\ - if ( com.lock_state & AWC_BAP_SEMALOCKED ){\ - com.bap->lock--; \ - com.lock_state &= ~AWC_BAP_SEMALOCKED;\ - UP(&(com.bap->sem)); \ - spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\ - } else if (com.lock_state & AWC_BAP_LOCKED){\ - com.bap->lock--; \ - com.lock_state &= ~AWC_BAP_LOCKED;\ - spin_unlock_irqrestore(&(cmd.bap->spinlock),cmd.bap->flags);\ - }\ - }\ - if (both_bap_lock)\ - spin_unlock_irqrestore(&cmd.priv->both_bap_spinlock,cmd.priv->both_bap_spinlock_flags);\ -} - -#define AWC_RELEASE_COMMAND(com) {\ - AWC_BAP_UNLOCK(cmd);\ - } - - - -#define awc_manufacturer_code 0x015F -#define awc_product_code 0x0005 - - -#define awc_write(base,register,u16value) outw(u16value, (base)+(register)) -#define awc_read(base,register) inw((base)+(register)) -#define AWC_OUT(base,val) outw(val, base) -#define AWC_IN(base) inw(base) - - -#define awc_read_response(cmd) { \ - cmd->status=awc_read(cmd->port,awc_Status_register);\ - cmd->resp0=awc_read(cmd->port,awc_Resp0_register);\ - cmd->resp1=awc_read(cmd->port,awc_Resp1_register);\ - cmd->resp2=awc_read(cmd->port,awc_Resp2_register);\ -}; - -#define awc_command_busy(base) (awc_read(base,awc_Command_register) & 0x8000) -#define awc_command_read(base) awc_read(base,awc_Command_register) -#define awc_command_write(base,cmd) awc_write(base,awc_Command_register,cmd) -#define awc_event_status_Awake(base) (awc_read(base,awc_EvStat_register) & 0x0100) -#define awc_event_status_Link(base) (awc_read(base,awc_EvStat_register) & 0x0080) -#define awc_event_status_Cmd(base) (awc_read(base,awc_EvStat_register) & 0x0010) -#define awc_event_status_Alloc(base) (awc_read(base,awc_EvStat_register) & 0x0008) -#define awc_event_status_TxExc(base) (awc_read(base,awc_EvStat_register) & 0x0004) -#define awc_event_status_Tx(base) (awc_read(base,awc_EvStat_register) & 0x0002) -#define awc_event_status_TxResp(base) (awc_read(base,awc_EvStat_register) & 0x0006) -#define awc_event_status_Rx(base) (awc_read(base,awc_EvStat_register) & 0x0001) -#define awc_event_status(base) (awc_read(base,awc_EvStat_register)) - -#define awc_Link_Status(base) awc_read(base,awc_LinkStatus_register) - -#define awc_Rx_Fid(base) awc_read(base,awc_RxFID_register) -#define awc_Tx_Allocated_Fid(base) awc_read(base,awc_TxAllocFID_register) -#define awc_Tx_Compl_Fid(base) awc_read(base,awc_TxComplFID_register) - -#define awc_event_ack_ClrStckCmdBsy(base) awc_write(base,awc_EvAck_register, 0x4000) -#define awc_event_ack_WakeUp(base) awc_write(base,awc_EvAck_register, 0x2000) -#define awc_event_ack_Awaken(base) awc_write(base,awc_EvAck_register, 0x0100) -#define awc_event_ack_Link(base) awc_write(base,awc_EvAck_register, 0x0080) -#define awc_event_ack_Cmd(base) awc_write(base,awc_EvAck_register, 0x0010) -#define awc_event_ack_Alloc(base) awc_write(base,awc_EvAck_register, 0x0008) -#define awc_event_ack_TxExc(base) awc_write(base,awc_EvAck_register, 0x0004) -#define awc_event_ack_Tx(base) awc_write(base,awc_EvAck_register, 0x0002) -#define awc_event_ack_Rx(base) awc_write(base,awc_EvAck_register, 0x0001) - -#define awc_event_ack(base,ints) awc_write(base,awc_EvAck_register,ints) - -#define awc_ints_enabled(base) (awc_read(base,awc_EvIntEn_register)) -#define awc_ints_enable(base,ints) awc_write(base,awc_EvIntEn_register,ints) - - - -/************************ RX TX BUFF ************************/ - - -struct aironet4500_radio_rx_header { - u32 RxTime; - u16 Status; - u16 PayloadLength; - u8 Reserved0; - u8 RSSI; - u8 Rate; - u8 Frequency; - u8 Rx_association_count; - u8 Reserved1[3]; - u8 PLCP_header[4]; - -}; - - -struct aironet4500_radio_tx_header { - u32 SWSupport; - u16 Status; - #define aironet4500_tx_status_max_retries 0x0002 - #define aironet4500_tx_status_lifetime_exceeded 0x0004 - #define aironet4500_tx_status_AID_failure 0x0008 - #define aironet4500_tx_status_MAC_disabled 0x0010 - #define aironet4500_tx_status_association_lost 0x0020 - u16 PayloadLength; - u16 TX_Control; - #define aironet4500_tx_control_tx_ok_event_enable 0x0002 - #define aironet4500_tx_control_tx_fail_event_enable 0x0004 - #define aironet4500_tx_control_header_type_802_11 0x0008 - #define aironet4500_tx_control_payload_type_llc 0x0010 - #define aironet4500_tx_control_no_release 0x0020 - #define aironet4500_tx_control_reuse_fid \ - (aironet4500_tx_control_tx_ok_event_enable |\ - aironet4500_tx_control_tx_fail_event_enable |\ - aironet4500_tx_control_no_release) - #define aironet4500_tx_control_no_retries 0x0040 - #define aironet4500_tx_control_clear_AID 0x0080 - #define aironet4500_tx_control_strict_order 0x0100 - #define aironet4500_tx_control_use_rts 0x0200 - u16 AID; - u8 Tx_Long_Retry; - u8 Tx_Short_Retry; - u8 tx_association_count; - u8 tx_bit_rate; - #define aironet4500_tx_bit_rate_automatic 0 - #define aironet4500_tx_bit_rate_500kbps 1 - #define aironet4500_tx_bit_rate_1Mbps 2 - #define aironet4500_tx_bit_rate_2Mbps 4 - u8 Max_Long_Retry; - u8 Max_Short_Retry; - u8 Reserved0[2]; -}; - - -struct aironet4500_rx_fid { - - u16 rid; - struct aironet4500_radio_rx_header radio_rx; - struct ieee_802_11_header ieee_802_11; - u16 gap_length; - struct ieee_802_3_header ieee_802_3; - u8 * payload; -}; - - -struct aironet4500_tx_fid { - - u16 fid; - u16 fid_size; - struct aironet4500_radio_tx_header radio_tx; - struct ieee_802_11_header ieee_802_11; - u16 gap_length; - #define aironet4500_gap_len_without_802_3 6 - #define aironet4500_gap_len_with_802_3 0 - struct ieee_802_3_header ieee_802_3; - u8 * payload; -}; - -struct awc_fid { - - u32 type; - #define p80211_llc_snap 0x0100 - #define p80211_8021H 0x0200 - #define p80211_8022 0x0400 - #define p80211_8023 0x0800 - #define p80211_snap_8021H 0x1000 - #define p80211copy_path_skb 0x2000 - - u8 priority; - u8 busy; - - #define awc_tx_fid_complete_read 0x01 - u16 state; - union { - struct aironet4500_tx_fid tx; - struct aironet4500_rx_fid rx; - } u; - - struct ieee_802_11_snap_header snap; - struct ieee_802_11_802_1H_header bridge; - u16 bridge_size; - struct ieee_802_11_802_2_header p8022; - - u16 pkt_len; - u8 * mac; - struct sk_buff * skb; - long long transmit_start_time; - struct awc_fid * next; - struct awc_fid * prev; - -}; - - - -struct awc_fid_queue { - - - struct awc_fid * head; - struct awc_fid * tail; - int size; - spinlock_t spinlock; -}; - - -static __inline__ void -awc_fid_queue_init(struct awc_fid_queue * queue){ - - unsigned long flags; - memset(queue,0, sizeof(struct awc_fid_queue)); - spin_lock_init(&queue->spinlock); - spin_lock_irqsave(&queue->spinlock,flags); - queue->head = NULL; - queue->tail = NULL; - queue->size = 0; - spin_unlock_irqrestore(&queue->spinlock,flags); -}; - -static inline void -awc_fid_queue_push_tail( struct awc_fid_queue * queue, - struct awc_fid * fid){ - - unsigned long flags; - - spin_lock_irqsave(&queue->spinlock,flags); - - fid->prev = queue->tail; - fid->next = NULL; - - if (queue->tail){ - queue->tail->next = fid; - } - queue->tail = fid; - - if (!queue->head) - queue->head = fid; - queue->size++; - - spin_unlock_irqrestore(&queue->spinlock,flags); - -}; - - -static inline void -awc_fid_queue_push_head( struct awc_fid_queue * queue, - struct awc_fid * fid){ - - unsigned long flags; - - spin_lock_irqsave(&queue->spinlock,flags); - - fid->prev = NULL; - fid->next = queue->head; - - if (queue->head){ - queue->head->prev = fid; - } - queue->head = fid; - - if (!queue->tail) - queue->tail = fid; - queue->size++; - - spin_unlock_irqrestore(&queue->spinlock,flags); -}; - - - -static inline void -awc_fid_queue_rm( struct awc_fid_queue * queue, - struct awc_fid * fid){ - - - if (fid->prev) { - fid->prev->next = fid->next; - }; - - if (fid->next) { - fid->next->prev = fid->prev; - }; - - if (fid == queue->tail) { - queue->tail = fid->prev; - }; - if (fid == queue->head) { - queue->head = fid->next; - }; - fid->next = NULL; - fid->prev = NULL; - queue->size--; - if (queue->size ==0 ){ - queue->tail = NULL; - queue->head = NULL; - } -}; - -static inline void -awc_fid_queue_remove( struct awc_fid_queue * queue, - struct awc_fid * fid){ - unsigned long flags; - spin_lock_irqsave(&queue->spinlock,flags); - - awc_fid_queue_rm(queue,fid); - - spin_unlock_irqrestore(&queue->spinlock,flags); - -}; - - - -static inline struct awc_fid * -awc_fid_queue_pop_head( struct awc_fid_queue * queue){ - - unsigned long flags; - struct awc_fid * fid; - - spin_lock_irqsave(&queue->spinlock,flags); - - fid = queue->head; - if (fid) - awc_fid_queue_rm(queue,fid); - - spin_unlock_irqrestore(&queue->spinlock,flags); - - return fid; -}; - - - - -static inline struct awc_fid * -awc_fid_queue_pop_tail( struct awc_fid_queue * queue){ - - unsigned long flags; - struct awc_fid * fid; - - spin_lock_irqsave(&queue->spinlock,flags); - - fid = queue->tail; - if (fid) - awc_fid_queue_rm(queue,fid); - - spin_unlock_irqrestore(&queue->spinlock,flags); - - return fid; -}; - - - -#define AWC_TX_HEAD_SIZE 0x44 -#define AWC_TX_ALLOC_SMALL_SIZE 200 -#define AWC_RX_BUFFS 50 - - -/***************************** RID & CONFIG ***********************/ - -struct awc_config{ - unsigned short Len; /* sizeof(PC4500_CONFIG) */ - unsigned short OperatingMode; /* operating mode */ - - #define MODE_STA_IBSS 0 - #define MODE_STA_ESS 1 - #define MODE_AP 2 - #define MODE_AP_RPTR 3 - #define MODE_ETHERNET_HOST (0<<8) /* rx payloads converted */ - #define MODE_LLC_HOST (1<<8) /* rx payloads left as is */ - #define MODE_AIRONET_EXTEND (1<<9) /* enable Aironet extenstions */ - #define MODE_AP_INTERFACE (1<<10) /* enable ap interface extensions */ - unsigned short ReceiveMode; /* receive mode */ - #define RXMODE_BC_MC_ADDR 0 - #define RXMODE_BC_ADDR 1 /* ignore multicasts */ - #define RXMODE_ADDR 2 /* ignore multicast and broadcast */ - #define RXMODE_RFMON 3 /* wireless monitor mode */ - #define RXMODE_RFMON_ANYBSS 4 - #define RXMODE_LANMON 5 /* lan style monitor -- data packets only */ - #define RXMODE_DISABLE_802_3_HEADER 0x100 /* disables 802.3 header on rx */ - - unsigned short FragmentThreshold; - unsigned short RtsThreshold; - unsigned char StationMacAddress[6]; - unsigned char Rates[8]; - unsigned short ShortRetryLimit; - unsigned short LongRetryLimit; - unsigned short TxLifetime; /* in kusec */ - unsigned short RxLifetime; /* in kusec */ - unsigned short Stationary; - unsigned short Ordering; - unsigned short DeviceType; /* for overriding device type */ - unsigned short _reserved1[5]; /*---------- Scanning/Associating ----------*/ - unsigned short ScanMode; - #define SCANMODE_ACTIVE 0 - #define SCANMODE_PASSIVE 1 - #define SCANMODE_AIROSCAN 2 - unsigned short ProbeDelay; /* in kusec */ - unsigned short ProbeEnergyTimeout; /* in kusec */ - unsigned short ProbeResponseTimeout; - unsigned short BeaconListenTimeout; - unsigned short JoinNetTimeout; - unsigned short AuthenticationTimeout; - unsigned short AuthenticationType; - #define AUTH_OPEN 1 - #define AUTH_SHAREDKEY 2 - #define AUTH_EXCLUDENONWEP 4 - unsigned short AssociationTimeout; - unsigned short SpecifiedApTimeout; - unsigned short OfflineScanInterval; - unsigned short OfflineScanDuration; - unsigned short LinkLossDelay; - unsigned short MaxBeaconLostTime; - unsigned short RefreshInterval; - #define DISABLE_REFRESH 0xFFFF - unsigned short _reserved1a[1]; /*---------- Power save operation ----------*/ - unsigned short PowerSaveMode; - #define POWERSAVE_CAM 0 - #define POWERSAVE_PSP 1 - #define POWERSAVE_PSP_CAM 2 - unsigned short SleepForDtims; - unsigned short ListenInterval; - unsigned short FastListenInterval; - unsigned short ListenDecay; - unsigned short FastListenDelay; - unsigned short _reserved2[2]; /*---------- Ap/Ibss config items ----------*/ - unsigned short BeaconPeriod; - unsigned short AtimDuration; - unsigned short HopPeriod; - unsigned short ChannelSet; - unsigned short Channel; - unsigned short DtimPeriod; - unsigned short _reserved3[2]; /*---------- Radio configuration ----------*/ - unsigned short RadioType; - #define RADIOTYPE_DEFAULT 0 - #define RADIOTYPE_802_11 1 - #define RADIOTYPE_LEGACY 2 - unsigned char u8RxDiversity; - unsigned char u8TxDiversity; - unsigned short TxPower; - #define TXPOWER_DEFAULT 0 - unsigned short RssiThreshold; - #define RSSI_DEFAULT 0 - unsigned short RadioSpecific[4]; /*---------- Aironet Extensions ----------*/ - unsigned char NodeName[16]; - unsigned short ArlThreshold; - unsigned short ArlDecay; - unsigned short ArlDelay; - unsigned short _reserved4[1]; /*---------- Aironet Extensions ----------*/ - unsigned short MagicAction; - #define MAGIC_ACTION_STSCHG 1 - #define MACIC_ACTION_RESUME 2 - #define MAGIC_IGNORE_MCAST (1<<8) - #define MAGIC_IGNORE_BCAST (1<<9) - #define MAGIC_SWITCH_TO_PSP (0<<10) - #define MAGIC_STAY_IN_CAM (1<<10) -}; - - - -struct awc_SSID { - u16 lenght; - u8 SSID[32]; -}; - -struct awc_SSIDs { - u16 ridLen; - struct awc_SSID SSID[3]; - -}; - -struct awc_fixed_APs{ - u16 ridLen; - u8 AP[4][6]; -}; - -struct awc_driver_name{ - u16 ridLen; - u8 name[16]; -}; - -struct awc_encapsulation{ - u16 etherType; - u16 Action; -}; - -struct awc_enc_trans{ - u16 ridLen; - struct awc_encapsulation rules[8]; -}; - -struct awc_wep_key { - u16 ridLen; - u16 KeyIndex; - u8 Address[6]; - u16 KeyLen; - u8 Key[16]; -}; - -struct awc_modulation { - u16 ridLen; - u16 Modulation; -}; - -struct awc_cap{ - u16 ridLen; - u8 OUI[3]; - u8 ProductNum[3]; - u8 ManufacturerName[32]; - u8 ProductName[16]; - u8 ProductVersion[8]; - u8 FactoryAddress[6]; - u8 AironetAddress[6]; - u16 RadioType; - u16 RegDomain; - u8 Callid[6]; - u8 SupportedRates[8]; - u8 RxDiversity; - u8 TxDiversity; - u16 TxPowerLevels[8]; - u16 HardwareVersion; - u16 HardwareCapabilities; - u16 TemperatureRange; - u16 SoftwareVersion; - u16 SoftwareSubVersion; - u16 InterfaceVersion; - u16 SoftwareCapabilities; - u8 BootBlockVersionMajor; - u8 BootBlockVersionMinor; - -}; - - -struct awc_status{ - u16 ridLen; - u8 MacAddress[6]; - u16 OperationalMode; - u16 ErrorCode; - u16 CurrentSignalQuality; - u16 SSIDlength; - u8 SSID[32]; - u8 ApName[16]; - u8 CurrentBssid[32]; - u8 PreviousBSSIDs[3][6]; - u16 BeaconPeriod; - u16 DtimPeriod; - u16 AtimDuration; - u16 HopPeriod; - u16 ChannelSet; - u16 Channel; - - u16 HopsToBackbone; - u16 ApTotalLoad; - u16 OurGeneratedLoad; - u16 AccumulatedArl; - -}; - - -struct awc_AP{ - u16 ridLen; - u16 TIM_Addr; - u16 Airo_Addr; -}; - -struct awc_Statistics_32 { - - u32 RidLen; - u32 RxOverrunErr; - u32 RxPlcpCrcErr; - u32 RxPlcpFormat; - u32 RxPlcpLength; - u32 RxMacCrcErr; - u32 RxMacCrcOk; - u32 RxWepErr; - u32 RxWepOk; - u32 RetryLong; - u32 RetryShort; - u32 MaxRetries; - u32 NoAck; - - u32 NoCts; - u32 RxAck; - u32 RxCts; - u32 TxAck; - u32 TxRts; - u32 TxCts; - u32 TxMc; - u32 TxBc; - u32 TxUcFrags; - u32 TxUcPackets; - u32 TxBeacon; - u32 RxBeacon; - u32 TxSinColl; - u32 TxMulColl; - u32 DefersNo; - u32 DefersProt; - u32 DefersEngy; - u32 DupFram; - u32 RxFragDisc; - u32 TxAged; - u32 RxAged; - u32 LostSync_Max; - u32 LostSync_Mis; - u32 LostSync_Arl; - u32 LostSync_Dea; - u32 LostSync_Disa; - u32 LostSync_Tsf; - u32 HostTxMc; - u32 HostTxBc; - u32 HostTxUc; - u32 HostTxFail; - u32 HostRxMc; - u32 HostRxBc; - u32 HostRxUc; - u32 HostRxDiscar; - u32 HmacTxMc; - u32 HmacTxBc; - u32 HmacTxUc; - u32 HmacTxFail; - u32 HmacRxMc; - u32 HmacRxBc; - u32 HmacRxUc; - u32 HmacRxDisca; - u32 HmacRxAcce; - u32 SsidMismatch; - u32 ApMismatch; - u32 RatesMismatc; - u32 AuthReject; - u32 AuthTimeout; - u32 AssocReject; - u32 AssocTimeout; - u32 NewReason; - u32 AuthFail_1; - u32 AuthFail_2; - u32 AuthFail_3; - u32 AuthFail_4; - u32 AuthFail_5; - u32 AuthFail_6; - u32 AuthFail_7; - u32 AuthFail_8; - u32 AuthFail_9; - u32 AuthFail_10; - u32 AuthFail_11; - u32 AuthFail_12; - u32 AuthFail_13; - u32 AuthFail_14; - u32 AuthFail_15; - u32 AuthFail_16; - u32 AuthFail_17; - u32 AuthFail_18; - u32 AuthFail_19; - u32 RxMan; - u32 TxMan; - u32 RxRefresh; - u32 TxRefresh; - u32 RxPoll; - u32 TxPoll; - u32 HostRetries; - u32 LostSync_HostReq; - u32 HostTxBytes; - u32 HostRxBytes; - u32 ElapsedUsec; - u32 ElapsedSec; - u32 LostSyncBett; -}; - -struct awc_Statistics_16 { - - u16 RidLen; - u16 RxOverrunErr; - u16 RxPlcpCrcErr; - u16 RxPlcpFormat; - u16 RxPlcpLength; - u16 RxMacCrcErr; - u16 RxMacCrcOk; - u16 RxWepErr; - u16 RxWepOk; - u16 RetryLong; - u16 RetryShort; - u16 MaxRetries; - u16 NoAck; - u16 NoCts; - u16 RxAck; - u16 RxCts; - u16 TxAck; - u16 TxRts; - u16 TxCts; - u16 TxMc; - u16 TxBc; - u16 TxUcFrags; - u16 TxUcPackets; - u16 TxBeacon; - u16 RxBeacon; - u16 TxSinColl; - u16 TxMulColl; - u16 DefersNo; - u16 DefersProt; - u16 DefersEngy; - u16 DupFram; - u16 RxFragDisc; - u16 TxAged; - u16 RxAged; - u16 LostSync_Max; - u16 LostSync_Mis; - u16 LostSync_Arl; - u16 LostSync_Dea; - u16 LostSync_Disa; - u16 LostSync_Tsf; - u16 HostTxMc; - u16 HostTxBc; - u16 HostTxUc; - u16 HostTxFail; - u16 HostRxMc; - u16 HostRxBc; - u16 HostRxUc; - u16 HostRxDiscar; - u16 HmacTxMc; - u16 HmacTxBc; - u16 HmacTxUc; - u16 HmacTxFail; - u16 HmacRxMc; - u16 HmacRxBc; - u16 HmacRxUc; - u16 HmacRxDisca; - u16 HmacRxAcce; - u16 SsidMismatch; - u16 ApMismatch; - u16 RatesMismatc; - u16 AuthReject; - u16 AuthTimeout; - u16 AssocReject; - u16 AssocTimeout; - u16 NewReason; - u16 AuthFail_1; - u16 AuthFail_2; - u16 AuthFail_3; - u16 AuthFail_4; - u16 AuthFail_5; - u16 AuthFail_6; - u16 AuthFail_7; - u16 AuthFail_8; - u16 AuthFail_9; - u16 AuthFail_10; - u16 AuthFail_11; - u16 AuthFail_12; - u16 AuthFail_13; - u16 AuthFail_14; - u16 AuthFail_15; - u16 AuthFail_16; - u16 AuthFail_17; - u16 AuthFail_18; - u16 AuthFail_19; - u16 RxMan; - u16 TxMan; - u16 RxRefresh; - u16 TxRefresh; - u16 RxPoll; - u16 TxPoll; - u16 HostRetries; - u16 LostSync_HostReq; - u16 HostTxBytes; - u16 HostRxBytes; - u16 ElapsedUsec; - u16 ElapsedSec; - u16 LostSyncBett; -}; - - -#define AWC_TXCTL_TXOK (1<<1) /* report if tx is ok */ -#define AWC_TXCTL_TXEX (1<<2) /* report if tx fails */ -#define AWC_TXCTL_802_3 (0<<3) /* 802.3 packet */ -#define AWC_TXCTL_802_11 (1<<3) /* 802.11 mac packet */ -#define AWC_TXCTL_ETHERNET (0<<4) /* payload has ethertype */ -#define AWC_TXCTL_LLC (1<<4) /* payload is llc */ -#define AWC_TXCTL_RELEASE (0<<5) /* release after completion */ -#define AWC_TXCTL_NORELEASE (1<<5) /* on completion returns to host */ - - -/************************* LINK STATUS STUFF *******************/ - -#define awc_link_status_loss_of_sync_missed_beacons 0x8000 -#define awc_link_status_loss_of_sync_max_retries 0x8001 -#define awc_link_status_loss_of_sync_ARL_exceed 0x8002 -#define awc_link_status_loss_of_sync_host_request 0x8003 -#define awc_link_status_loss_of_sync_TSF_sync 0x8004 -#define awc_link_status_deauthentication 0x8100 -#define awc_link_status_disassociation 0x8200 -#define awc_link_status_association_failed 0x8400 -#define awc_link_status_authentication_failed 0x0300 -#define awc_link_status_associated 0x0400 - -struct awc_strings { - int par; - unsigned int mask; - const char * string; - -}; - -#define awc_link_status_strings {\ -{awc_link_status_loss_of_sync_missed_beacons, 0xFFFF,"Loss of sync -- missed beacons"},\ -{awc_link_status_loss_of_sync_max_retries, 0xFFFF,"Loss of sync -- max retries"},\ -{awc_link_status_loss_of_sync_ARL_exceed, 0xFFFF,"Loss of sync -- average retry level (ARL) exceeded"},\ -{awc_link_status_loss_of_sync_host_request, 0xFFFF,"Loss of sync -- host request"},\ -{awc_link_status_loss_of_sync_TSF_sync, 0xFFFF,"Loss of sync -- TSF synchronization"},\ -{awc_link_status_deauthentication, 0xFF00,"Deauthentication "},\ -{awc_link_status_disassociation, 0xFF00,"Disassocation "},\ -{awc_link_status_association_failed , 0xFF00,"Association failed "},\ -{awc_link_status_authentication_failed, 0xFF00,"Authentication failure"},\ -{awc_link_status_associated, 0xFFFF,"Associated "},\ -{0,0,NULL}\ -} - - -/****************************** COMMANDS and DEFAULTS and STATUSES ***********/ - -/****************************** COMMANDS */ - - -// Command definitions - - - - -#define awc4500wout(base, com, p0,p1,p2) {\ - awc_write(base,awc_Param0_register, p0);\ - awc_write(base,awc_Param1_register, p1);\ - awc_write(base,awc_Param2_register, p2);\ - WAIT61x3;\ - awc_write(base,awc_Command_register, com);\ - WAIT61x3;\ -} -#define awc_wout(cmd, com, p0,p1,p2) {\ - awc_write(base,awc_Param0_register, p0);\ - awc_write(base,awc_Param1_register, p1);\ - awc_write(base,awc_Param2_register, p2);\ - WAIT61x3;\ - awc_write(base,awc_Command_register, com);\ - WAIT61x3;\ -} - - -#define awc_command_NOP(cmd) awc_wout( cmd,0x0000,0,0,0) // NOP -#define awc_command_Enable_All(cmd) awc_wout( cmd,0x0001,0,0,0) // Enable -#define awc_command_Enable_MAC(cmd) awc_wout( cmd,0x0101,0,0,0) // Enable Mac -#define awc_command_Enable_Rx(cmd) awc_wout( cmd,0x0201,0,0,0) // Enable Rx -#define awc_command_Disable_MAC(cmd) awc_wout( cmd,0x0002,0,0,0) // Disable -#define awc_command_Sync_Loss(cmd) awc_wout( cmd,0x0003,0,0,0) // Force a Loss of Sync -#define awc_command_Soft_Reset(cmd) awc_wout( cmd,0x0004,0,0,0) // Firmware Restart (soft reset) -#define awc_command_Host_Sleep(cmd) awc_wout( cmd,0x0005,0,0,0) // Host Sleep (must be issued as 0x0085) -#define awc_command_Magic_Packet(cmd) awc_wout( cmd,0x0006,0,0,0) // Magic Packet -#define awc_command_Read_Configuration(cmd) awc_wout( cmd,0x0008,0,0,0) // Read the Configuration from nonvolatile storage -#define awc_command_Allocate_TX_Buff(cmd,size) awc_wout( cmd,0x000A,size,0,0) // Allocate Transmit Buffer -#define awc_command_TX(cmd,FID) awc_wout( cmd,0x000B,FID ,0,0) // Transmit -#define awc_command_Deallocate(cmd,FID) awc_wout( cmd,0x000C,FID ,0,0) // Deallocate -#define awc_command_NOP2(cmd) awc_wout( cmd,0x0010,0,0,0) // NOP (same as 0x0000) -#define awc_command_Read_RID(cmd,RID) awc_wout( cmd,0x0021,RID ,0,0) // Read RID -#define awc_command_Write_RID(cmd,RID) awc_wout( cmd,0x0121,RID ,0,0) // Write RID -#define awc_command_Allocate_Buff(cmd,size) awc_wout( cmd,0x0028,size,0,0) // Allocate Buffer -#define awc_command_PSP_Nodes(cmd) awc_wout( cmd,0x0030,0,0,0) // PSP nodes (AP only) -#define awc_command_Set_Phy_register(cmd,phy_register,clear_bits, set_bits)\ - awc_wout( cmd,0x003E,phy_register,clear_bits, set_bits) // Set PHY register -#define awc_command_TX_Test(cmd,command, frequency, pattern) awc_wout( cmd,0x003F,command, frequency, pattern) // Transmitter Test -#define awc_command_RX_Test(cmd) awc_wout( cmd,0x013F,0,0,0) // RX Test -#define awc_command_Sleep(cmd) awc_wout( cmd,0x0085,0,0,0) // Go to Sleep (No Ack bit is mandatory) -#define awc_command_Save_Configuration(cmd) awc_wout( cmd,0x0108,0,0,0) // Save the configuration to nonvolatile - - -#define AWC_COMMAND_NOOP_BULL 0x000 -#define AWC_COMMAND_ENABLE 0x001 -#define AWC_COMMAND_ENABLE_MAC 0x101 -#define AWC_COMMAND_ENABLE_RX 0x201 -#define AWC_COMMAND_DISABLE 0x002 -#define AWC_COMMAND_LOSE_SYNC 0x003 -#define AWC_COMMAND_SOFT_RESET 0x004 -#define AWC_COMMAND_HOST_SLEEP 0x085 -#define AWC_COMMAND_MAGIC_PACKET 0x006 -#define AWC_COMMAND_READ_CONF 0x008 -#define AWC_COMMAND_SAVE_CONF 0x108 -#define AWC_COMMAND_TX_ALLOC 0x00A -#define AWC_COMMAND_TX 0x00B -#define AWC_COMMAND_DEALLOC 0x00C -#define AWC_COMMAND_NOOP 0x010 -#define AWC_COMMAND_READ_RID 0x021 -#define AWC_COMMAND_WRITE_RID 0x121 -#define AWC_COMMAND_ALLOC 0x028 -#define AWC_COMMAND_PSP_NODES 0x030 -#define AWC_COMMAND_SET_PHY 0x03E -#define AWC_COMMAND_TX_TEST 0x03F -#define AWC_COMMAND_SLEEP 0x085 - - -#define awc_command_name_strings {\ - {0x0000, 0x00FF,"awc_command_NOP " },\ - {0x0001, 0x00FF,"awc_command_Enable_All " },\ - {0x0101, 0x01FF,"awc_command_Enable_MAC " },\ - {0x0201, 0x01FF,"awc_command_Enable_Rx " },\ - {0x0002, 0x00FF,"awc_command_Disable_MAC " },\ - {0x0003, 0x00FF,"awc_command_Sync_Loss " },\ - {0x0004, 0x00FF,"awc_command_Soft_Reset " },\ - {0x0005, 0x00FF,"awc_command_Host_Sleep " },\ - {0x0006, 0x00FF,"awc_command_Magic_Packet " },\ - {0x0008, 0x00FF,"awc_command_Read_Configuration " },\ - {0x000A, 0x00FF,"awc_command_Allocate_TX_Buff " },\ - {0x000B, 0x00FF,"awc_command_TX " },\ - {0x000C, 0x00FF,"awc_command_Deallocate " },\ - {0x0010, 0x00FF,"awc_command_NOP2 " },\ - {0x0021, 0x00FF,"awc_command_Read_RID " },\ - {0x0121, 0x01FF,"awc_command_Write_RID " },\ - {0x0028, 0x00FF,"awc_command_Allocate_Buff " },\ - {0x0030, 0x00FF,"awc_command_PSP_Nodes " },\ - {0x003E, 0x00FF,"awc_command_Set_Phy_register " },\ - {0x003F, 0x00FF,"awc_command_TX_Test " },\ - {0x013F, 0x01FF,"awc_command_RX_Test " },\ - {0x0085, 0x00FF,"awc_command_Sleep " },\ - {0x0108, 0x01FF,"awc_command_Save_Configuration " },\ - {0x0000, 0x00FF, NULL}\ -}; - - -/***************************** STATUSES */ - -#define awc_reply_success 0x0000 - -#define awc_reply_error_strings {\ - { 0x0000, 0x00FF," Success"},\ - { 0x0001, 0x00FF," Illegal command."},\ - { 0x0002, 0x00FF," Illegal format."},\ - { 0x0003, 0x00FF," Invalid FID."},\ - { 0x0004, 0x00FF," Invalid RID."},\ - { 0x0005, 0x00FF," Too Large"},\ - { 0x0006, 0x00FF," MAC is not disabled."},\ - { 0x0007, 0x00FF," Alloc is still busy processing previous alloc"},\ - { 0x0008, 0x00FF," Invalid Mode Field"},\ - { 0x0009, 0x00FF," Tx is not allowed in monitor mode"},\ - { 0x000A, 0x00FF," Loop test or memory test error"},\ - { 0x000B, 0x00FF," Cannot read this RID."},\ - { 0x000C, 0x00FF," Cannot write to this RID."},\ - { 0x000D, 0x00FF," Tag not found."},\ - { 0x0080, 0x00FF," Config mode is invalid."},\ - { 0x0081, 0x00FF," Config hop interval is invalid."},\ - { 0x0082, 0x00FF," Config beacon interval is invalid."},\ - { 0x0083, 0x00FF," Config receive mode is invalid."},\ - { 0x0084, 0x00FF," Config MAC address is invalid."},\ - { 0x0085, 0x00FF," Config rates are invalid."},\ - { 0x0086, 0x00FF," Config ordering field is invalid."},\ - { 0x0087, 0x00FF," Config scan mode is invalid."},\ - { 0x0088, 0x00FF," Config authentication type is invalid."},\ - { 0x0089, 0x00FF," Config power save mode is invalid."},\ - { 0x008A, 0x00FF," Config radio type is invalid."},\ - { 0x008B, 0x00FF," Config diversity is invalid."},\ - { 0x008C, 0x00FF," Config SSID list is invalid."},\ - { 0x008D, 0x00FF," Config specified AP list is invalid."},\ - { 0x0000, 0x00FF, NULL}\ -}; - -#define awc_reply_command_failed( status) ((status & 0x7F00) == 0x7F) - - -/************************* PHY and TEST commands ****************/ - - -// this might be wrong and reading is not implemented(was not in spec properly) -#define awc_Set_PLCP_Word(PLCP_Word)\ - awc_command_Set_Phy_register(base,0x8000,0 ,PLCP_Word) -#define awc_Set_TX_Test_Freq(Tx_Test_Freq)\ - awc_command_Set_Phy_register(base,0x8002,0 ,Tx_Test_Freq) -#define awc_Set_Tx_Power(Tx_Power)\ - awc_command_Set_Phy_register(base,0x8004,0 ,Tx_Power) -#define awc_Set_RSSI_Treshold(RSSI_Treshold)\ - awc_command_Set_Phy_register(base,0x8006,0 ,RSSI_Treshold) -#define awc_Get_PLCP_Word(PLCP_Word)\ - awc_command_Set_Phy_register(base,0x8000,0 ,0) -#define awc_Get_TX_Test_Freq(Tx_Test_Freq)\ - awc_command_Set_Phy_register(base,0x8002,0 ,0) -#define awc_Get_Tx_Power(Tx_Power)\ - awc_command_Set_Phy_register(base,0x8004,0 ,0) -#define awc_Get_RSSI_Treshold(RSSI_Treshold)\ - awc_command_Set_Phy_register(base,0x8006,0 ,0) - - -#define awc_tx_test_code_end 0x0000 // Ends the transmitter test -#define awc_tx_test_code_loop 0x0001 // Loop back to the beginning of the commands -#define awc_tx_test_code_start 0x0002 // Start transmitting -#define awc_tx_test_code_stop 0x0003 // Stop transmitting -#define awc_tx_test_code_delayu 0x0004 // Delay for N usec where N is the next word -#define awc_tx_test_code_delayk 0x0005 // Delay for N Kusec where N is the next word -#define awc_tx_test_code_next 0x0006 // Go to the next frequency in the frequency RID -#define awc_tx_test_code_rx 0x0007 // Start receive mode - -#define awc_tx_test_code_strings {\ -{ awc_tx_test_code_end , 0x000f ," Ends the transmitter test"},\ -{ awc_tx_test_code_loop , 0x000f ," Loop back to the beginning of the commands"},\ -{ awc_tx_test_code_start , 0x000f ," Start transmitting"},\ -{ awc_tx_test_code_stop , 0x000f ," Stop transmitting"},\ -{ awc_tx_test_code_delayu , 0x000f ," Delay for N usec where N is the next word"},\ -{ awc_tx_test_code_delayk , 0x000f ," Delay for N Kusec where N is the next word"},\ -{ awc_tx_test_code_next , 0x000f ," Go to the next frequency in the frequency RID"},\ -{ awc_tx_test_code_rx , 0x000f ," Start receive mode"},\ -{ 0 , 0x000f ,NULL}\ -}; - - - -#define AWC_COMMSTAT_HARD_RESET 0x0000001 -#define AWC_COMMSTAT_WAKE 0x0000002 -#define AWC_COMMSTAT_SOFT_RESET 0x0000004 -#define AWC_COMMSTAT_CONFIGURE 0x0000008 -#define AWC_COMMSTAT_READ_CONF 0x0000010 -#define AWC_COMMSTAT_SAVE_CONF 0x0000020 -#define AWC_COMMSTAT_DEALLOC 0x0000040 -#define AWC_COMMSTAT_ALLOC_TX 0x0000080 -#define AWC_COMMSTAT_ALLOC_TEST 0x0000100 -#define AWC_COMMSTAT_ENABLE_MAC 0x0000200 -#define AWC_COMMSTAT_ENABLE_RX 0x0000400 -#define AWC_COMMSTAT_DISABLE_MAC 0x0000800 -#define AWC_COMMSTAT_RX_ACK 0x0001000 -#define AWC_COMMSTAT_TX_ACK 0x0002000 -#define AWC_COMMSTAT_AWAKEN_ACK 0x0004000 -#define AWC_COMMSTAT_TX_FAIL_ACK 0x0008000 -#define AWC_COMMSTAT_LINK_ACK 0x0010000 -#define AWC_COMMSTAT_CLR_CMD 0x0020000 -#define AWC_COMMSTAT_ALLOC_ACK 0x0040000 -#define AWC_COMMSTAT_HOST_SLEEP 0x0080000 -#define AWC_COMMSTAT_RX 0x0100000 -#define AWC_COMMSTAT_TX 0x0200000 -#define AWC_COMMSTAT_SLEEP 0x0400000 -#define AWC_COMMSTAT_PSP_NODES 0x0800000 -#define AWC_COMMSTAT_SET_TX_POWER 0x1000000 - - -/***************************** R I D ***************/ - -#define AWC_NOF_RIDS 18 -extern int awc_rid_setup(struct net_device * dev); - -struct aironet4500_rid_selector{ - const u16 selector; - const unsigned MAC_Disable_at_write:1; - const unsigned read_only:1; - const unsigned may_change:1; - const char * name; -}; - - - - - -extern const struct aironet4500_rid_selector aironet4500_RID_Select_General_Config; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_SSID_list; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_list ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Driver_name; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Encapsulation; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Active_Config; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Capabilities; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_AP_Info ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Radio_Info; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Status ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_Modulation ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_volatile ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_nonvolatile ; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_delta; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_clear; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_delta; -extern const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_clear; - -#define awc_def_gen_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_General_Config,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_SSID_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_SSID_list,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_AP_List_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_AP_list,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Dname_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Driver_name,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_act_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Active_Config,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Cap_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Capabilities,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_AP_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_AP_Info,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Radio_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Radio_Info,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Stat_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Status,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Enc_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Encapsulation,offset, bits,1,1,0,0, mask, value, name, value_name} - -#define awc_def_WEPv_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_WEP_volatile,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_WEPnv_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_WEP_nonvolatile,offset, bits,1,1,0,0, mask, value, name, value_name} -#define awc_def_Modulation_RID(offset,name, bits,mask,value,value_name)\ - {&aironet4500_RID_Select_Modulation,offset, bits,1,1,0,0, mask, value, name, value_name} - -#define awc_def_Stats_RID(o16,offset,name, value_name)\ - {&aironet4500_RID_Select_32_stats,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name} -#define awc_def_Stats_delta_RID(o16,offset,name, value_name)\ - {&aironet4500_RID_Select_32_stats_delta,offset, 32,1,1,0,0, 0xffffffff, 0, name, value_name} -#define awc_def_Stats_clear_RID(o16,offset,name, value_name)\ - {&aironet4500_RID_Select_32_stats_delta,offset,32,1,1,0,0, 0xffffffff, 0, name,value_name} - -#define awc_def_Stats16_RID(offset,o32,name, value_name)\ - {&aironet4500_RID_Select_16_stats,offset, 16,1,1,0,0, 0xffffffff, 0, name, value_name} -#define awc_def_Stats16_delta_RID(offset,o32,name, value_name)\ - {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff, 0, name,value_name} -#define awc_def_Stats16_clear_RID(offset,o32,name, value_name)\ - {&aironet4500_RID_Select_16_stats_delta,offset, 16,1,1,0,0, 0xffffffff, 0, name,value_name} - - -#define aironet4500_RID_Select_strings {\ -{ 0xFF10, 0xffff, "General Configuration"},\ -{ 0xFF11, 0xffff, "Valid SSID list" },\ -{ 0xFF12, 0xffff, "Valid AP list"},\ -{ 0xFF13, 0xffff, "Driver name"},\ -{ 0xFF14, 0xffff, "Ethernet Protocol"},\ -{ 0xFF15, 0xffff, "WEP volatile"},\ -{ 0xFF16, 0xffff, "WEP nonvolatile"},\ -{ 0xFF17, 0xffff, "Modulation"},\ -{ 0xFF20, 0xffff, "Actual Configuration"},\ -{ 0xFF00, 0xffff, "Capabilities"},\ -{ 0xFF01, 0xffff, "AP Info"},\ -{ 0xFF02, 0xffff, "Radio Info"},\ -{ 0xFF50, 0xffff, "Status"},\ -{ 0xFF60, 0xffff, "Cumulative 16-bit Statistics"},\ -{ 0xFF61, 0xffff, "Delta 16-bit Statistics"},\ -{ 0xFF62, 0xffff, "Delta 16-bit Statistics and Clear"},\ -{ 0xFF68, 0xffff, "Cumulative 32-bit Statistics"},\ -{ 0xFF69, 0xffff, "Delta 32-bit Statistics "},\ -{ 0xFF6A, 0xffff, "Delta 32-bit Statistics and Clear"},\ -{ 0x0000, 0xffff, NULL}\ -} - - - - - -struct aironet4500_RID { - const struct aironet4500_rid_selector * selector; - const u32 offset; - const u8 bits; - const u8 array; - const u32 units; - const unsigned read_only:1; - const unsigned null_terminated:1; - const u32 mask; - const u32 value; - const char * name; - const char * value_name; - -}; - -struct aironet4500_RID_names{ - struct aironet4500_RID rid; - char *name; -}; - -struct aironet4500_RID_names_values{ - struct aironet4500_RID rid; - char *name; - u32 mask; -}; - -struct awc_rid_dir{ - const struct aironet4500_rid_selector * selector; - const int size; - const struct aironet4500_RID * rids; - struct net_device * dev ; - void * buff; - int bufflen; // just checking -}; - -extern int awc_nof_rids; -extern struct awc_rid_dir awc_rids[]; - - - - - -struct awc_private { - dev_node_t node; // somewhere back in times PCMCIA needed that - - int dummy_test; // left for cleanup - // card rid inmemory copy - struct awc_config config; // card RID mirrors - struct awc_config general_config; // - struct awc_SSIDs SSIDs; - struct awc_fixed_APs fixed_APs; - struct awc_driver_name driver_name; - struct awc_enc_trans enc_trans; - struct awc_cap capabilities; - struct awc_status status; - struct awc_AP AP; - struct awc_Statistics_32 statistics; - struct awc_Statistics_32 statistics_delta; - struct awc_Statistics_32 statistics_delta_clear; - struct awc_Statistics_16 statistics16; - struct awc_Statistics_16 statistics16_delta; - struct awc_Statistics_16 statistics16_delta_clear; - struct awc_wep_key wep_volatile; - struct awc_wep_key wep_nonvolatile; - struct awc_modulation modulation; - - // here are just references to rids - struct awc_rid_dir rid_dir[AWC_NOF_RIDS]; - int rids_read; - - - struct awc_bap bap0; - struct awc_bap bap1; - int sleeping_bap; - - struct awc_fid_queue tx_small_ready; - struct awc_fid_queue tx_large_ready; - struct awc_fid_queue tx_post_process; - struct awc_fid_queue tx_in_transmit; - spinlock_t queues_lock; - - struct awc_fid_queue rx_ready; - struct awc_fid_queue rx_post_process; - - - - struct semaphore tx_buff_semaphore; - volatile int tx_buffs_in_use; - volatile int tx_small_buffs_in_use; - volatile int tx_buffs_total; - volatile int tx_small_buffs_total; - int large_buff_mem; - int small_buff_no; - - volatile int mac_enabled; - u16 link_status; - u8 link_status_changed; - - volatile int ejected; - volatile int work_running; - volatile int work_active; - volatile long tx_chain_active; - volatile u16 enabled_interrupts; - volatile u16 waiting_interrupts; - volatile int interrupt_count; - - // Command serialize stuff -//changed to spinlock struct semaphore command_semaphore; - spinlock_t both_bap_spinlock; // on SMP, card should theorethically live without that - unsigned long both_bap_spinlock_flags; - spinlock_t bap_setup_spinlock; // on SMP, card should theoretically live without that - unsigned long bap_setup_spinlock_flags; - spinlock_t command_issuing_spinlock; - unsigned long command_issuing_spinlock_flags; - spinlock_t interrupt_spinlock; - - volatile int unlock_command_postponed; - struct awc_command cmd; - long long async_command_start; - volatile int command_semaphore_on; - struct work_struct work; - volatile int process_tx_results; - - u8 p2p[6]; - u8 bssid[6]; - int p2p_uc; - int p2p_found; - int p802_11_send; - int simple_bridge; - int force_rts_on_shorter; - int force_tx_rate; - int ip_tos_reliability_rts; - int ip_tos_troughput_no_retries; - int full_stats; - int debug; - - struct net_device_stats stats; - - struct ctl_table * proc_table; - - void * bus; - int card_type; -}; - -extern int awc_init(struct net_device * dev); -extern void awc_reset(struct net_device *dev); -extern int awc_config(struct net_device *dev); -extern int awc_open(struct net_device *dev); -extern void awc_tx_timeout(struct net_device *dev); -extern int awc_start_xmit(struct sk_buff *, struct net_device *); -extern void awc_interrupt(int irq, void *dev_id, struct pt_regs *regs); -extern struct net_device_stats * awc_get_stats(struct net_device *dev); -extern void awc_set_multicast_list(struct net_device *dev); -extern int awc_change_mtu(struct net_device *dev, int new_mtu); -extern int awc_close(struct net_device *dev); -extern int awc_private_init(struct net_device * dev); -extern int awc_register_proc(int (*awc_proc_set_device) (int),int (*awc_proc_unset_device)(int)); -extern int awc_unregister_proc(void); -extern int (* awc_proc_set_fun) (int) ; -extern int (* awc_proc_unset_fun) (int) ; -extern int awc_interrupt_process(struct net_device * dev); -extern int awc_readrid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf ); -extern int awc_writerid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf); -extern int awc_readrid_dir(struct net_device * dev, struct awc_rid_dir * rid ); -extern int awc_writerid_dir(struct net_device * dev, struct awc_rid_dir * rid); -extern int awc_tx_alloc(struct net_device * dev) ; -extern int awc_tx_dealloc(struct net_device * dev); -extern struct awc_fid *awc_tx_fid_lookup(struct net_device * dev, u16 fid); -extern int awc_issue_soft_reset(struct net_device * dev); -extern int awc_issue_noop(struct net_device * dev); -extern int awc_dump_registers(struct net_device * dev); -extern unsigned short awc_issue_command_and_block(struct awc_command * cmd); -extern int awc_enable_MAC(struct net_device * dev); -extern int awc_disable_MAC(struct net_device * dev); -extern int awc_read_all_rids(struct net_device * dev); -extern int awc_write_all_rids(struct net_device * dev); -extern int awc_receive_packet(struct net_device * dev); -extern int awc_transmit_packet(struct net_device * dev, struct awc_fid * tx_buff) ; -extern int awc_tx_complete_check(struct net_device * dev); -extern int awc_interrupt_process(struct net_device * dev); -extern void awc_work(struct net_device *dev); -extern int awc_802_11_find_copy_path(struct net_device * dev, struct awc_fid * rx_buff); -extern void awc_802_11_router_rx(struct net_device * dev,struct awc_fid * rx_buff); -extern int awc_802_11_tx_find_path_and_post(struct net_device * dev, struct sk_buff * skb); -extern void awc_802_11_after_tx_packet_to_card_write(struct net_device * dev, struct awc_fid * tx_buff); -extern void awc_802_11_after_failed_tx_packet_to_card_write(struct net_device * dev,struct awc_fid * tx_buff); -extern void awc_802_11_after_tx_complete(struct net_device * dev, struct awc_fid * tx_buff); -extern void awc_802_11_failed_rx_copy(struct net_device * dev,struct awc_fid * rx_buff); -extern int awc_tx_alloc(struct net_device * dev) ; -extern int awc_tx_dealloc_fid(struct net_device * dev,struct awc_fid * fid); -extern int awc_tx_dealloc(struct net_device * dev); -extern struct awc_fid * - awc_tx_fid_lookup_and_remove(struct net_device * dev, u16 fid_handle); -extern int awc_queues_init(struct net_device * dev); -extern int awc_queues_destroy(struct net_device * dev); -extern int awc_rids_setup(struct net_device * dev); - - - -extern int awc_debug; -extern int bap_sleep ; -extern int bap_sleep_after_setup ; -extern int sleep_before_command ; -extern int bap_sleep_before_write; -extern int sleep_in_command ; -extern int both_bap_lock; -extern int bap_setup_spinlock; -extern int tx_queue_len ; -extern int tx_rate; -extern int awc_full_stats; - -#define MAX_AWCS 4 -extern struct net_device * aironet4500_devices[MAX_AWCS]; - -#define AWC_DEBUG 1 - -#ifdef AWC_DEBUG - #define DEBUG(a,args...) if (awc_debug & a) printk( args) - #define AWC_ENTRY_EXIT_DEBUG(a) if (awc_debug & 8) printk( a) -#else - #define DEBUG(a, args...) - #define AWC_ENTRY_EXIT_DEBUG(a) -#endif - -#endif /* AIRONET4500_H */ diff -Nru a/drivers/net/aironet4500_card.c b/drivers/net/aironet4500_card.c --- a/drivers/net/aironet4500_card.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,1019 +0,0 @@ -/* - * Aironet 4500 PCI-ISA-i365 driver - * - * Elmer Joandi, Januar 1999 - * Copyright GPL - * - * - * Revision 0.1 ,started 30.12.1998 - * - * Revision 0.2, Feb 27, 2000 - * Jeff Garzik - softnet, cleanups - * - */ -#ifdef MODULE -static const char *awc_version = -"aironet4500_cards.c v0.2 Feb 27, 2000 Elmer Joandi, elmer@ylenurme.ee.\n"; -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "aironet4500.h" - -#define PCI_VENDOR_ID_AIRONET 0x14b9 -#define PCI_DEVICE_AIRONET_4800_1 0x1 -#define PCI_DEVICE_AIRONET_4800 0x4500 -#define PCI_DEVICE_AIRONET_4500 0x4800 -#define AIRONET4X00_IO_SIZE 0x40 -#define AIRONET4X00_CIS_SIZE 0x300 -#define AIRONET4X00_MEM_SIZE 0x300 - -#define AIRONET4500_PCI 1 -#define AIRONET4500_PNP 2 -#define AIRONET4500_ISA 3 -#define AIRONET4500_365 4 - - -#ifdef CONFIG_AIRONET4500_PCI - -#include - -static struct pci_device_id aironet4500_card_pci_tbl[] __devinitdata = { - { PCI_VENDOR_ID_AIRONET, PCI_DEVICE_AIRONET_4800_1, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_AIRONET, PCI_DEVICE_AIRONET_4800, PCI_ANY_ID, PCI_ANY_ID, }, - { PCI_VENDOR_ID_AIRONET, PCI_DEVICE_AIRONET_4500, PCI_ANY_ID, PCI_ANY_ID, }, - { } /* Terminating entry */ -}; -MODULE_DEVICE_TABLE(pci, aironet4500_card_pci_tbl); -MODULE_LICENSE("GPL"); - - -static int awc_pci_init(struct net_device * dev, struct pci_dev *pdev, - int ioaddr, int cis_addr, int mem_addr,u8 pci_irq_line) ; - - -int awc4500_pci_probe(struct net_device *dev) -{ - int cards_found = 0; - u8 pci_irq_line = 0; -// int p; - struct pci_dev *pdev = NULL; - - if (!pci_present()) - return -1; - - while ((pdev = pci_find_class (PCI_CLASS_NETWORK_OTHER << 8, pdev))) { - u16 pci_command, new_command; - u32 pci_memaddr; - u32 pci_ioaddr; - u32 pci_cisaddr; - - if (pdev->vendor != PCI_VENDOR_ID_AIRONET) - continue; - if ((pdev->device != PCI_DEVICE_AIRONET_4800_1) && - (pdev->device != PCI_DEVICE_AIRONET_4800) && - (pdev->device != PCI_DEVICE_AIRONET_4500)) - continue; - - if (pci_enable_device(pdev)) - continue; - - pci_irq_line = pdev->irq; - pci_memaddr = pci_resource_start (pdev, 0); - pci_cisaddr = pci_resource_start (pdev, 1); - pci_ioaddr = pci_resource_start (pdev, 2); - -// printk("\n pci capabilities %x and ptr %x \n",pci_caps,pci_caps_ptr); - /* Remove I/O space marker in bit 0. */ - -// if (check_region(pci_ioaddr, AIRONET4X00_IO_SIZE) || -// check_region(pci_cisaddr, AIRONET4X00_CIS_SIZE) || -// check_region(pci_memaddr, AIRONET4X00_MEM_SIZE)) { -// printk(KERN_ERR "aironet4X00 mem addrs not available for maping \n"); -// continue; -// } - if (!request_region(pci_ioaddr, AIRONET4X00_IO_SIZE, "aironet4x00 ioaddr")) - continue; -// request_region(pci_cisaddr, AIRONET4X00_CIS_SIZE, "aironet4x00 cis"); -// request_region(pci_memaddr, AIRONET4X00_MEM_SIZE, "aironet4x00 mem"); - - mdelay(10); - - pci_read_config_word(pdev, PCI_COMMAND, &pci_command); - new_command = pci_command | PCI_COMMAND_SERR; - if (pci_command != new_command) - pci_write_config_word(pdev, PCI_COMMAND, new_command); - - -/* if (device == PCI_DEVICE_AIRONET_4800) - pci_write_config_dword(pdev, 0x40, 0x00000000); - - udelay(1000); -*/ - if (pdev->device == PCI_DEVICE_AIRONET_4800) - pci_write_config_dword(pdev, 0x40, 0x40000000); - - if (awc_pci_init(dev, pdev, pci_ioaddr,pci_cisaddr,pci_memaddr,pci_irq_line)){ - printk(KERN_ERR "awc4800 pci init failed \n"); - break; - } - dev = 0; - cards_found++; - } - - return cards_found ? 0 : -ENODEV; -} - - -static int awc_pci_init(struct net_device * dev, struct pci_dev *pdev, - int ioaddr, int cis_addr, int mem_addr, u8 pci_irq_line) { - - int i, allocd_dev = 0; - - if (!dev) { - dev = init_etherdev(NULL, 0); - if (!dev) - return -ENOMEM; - allocd_dev = 1; - } - dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL ); - if (!dev->priv) { - if (allocd_dev) { - unregister_netdev(dev); - kfree(dev); - } - return -ENOMEM; - } - memset(dev->priv,0,sizeof(struct awc_private)); - if (!dev->priv) { - printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n"); - if (allocd_dev) { - unregister_netdev(dev); - kfree(dev); - } - return -ENOMEM; - }; - -// ether_setup(dev); - -// dev->tx_queue_len = tx_queue_len; - - dev->hard_start_xmit = &awc_start_xmit; -// dev->set_config = &awc_config_misiganes,aga mitte awc_config; - dev->get_stats = &awc_get_stats; -// dev->set_multicast_list = &awc_set_multicast_list; - dev->change_mtu = awc_change_mtu; - dev->init = &awc_init; - dev->open = &awc_open; - dev->stop = &awc_close; - dev->base_addr = ioaddr; - dev->irq = pci_irq_line; - dev->tx_timeout = &awc_tx_timeout; - dev->watchdog_timeo = AWC_TX_TIMEOUT; - - - i = request_irq(dev->irq,awc_interrupt, SA_SHIRQ | SA_INTERRUPT, dev->name, dev); - if (i) { - kfree(dev->priv); - dev->priv = NULL; - if (allocd_dev) { - unregister_netdev(dev); - kfree(dev); - } - return i; - } - - awc_private_init( dev); - awc_init(dev); - - i=0; - while (aironet4500_devices[i] && i < MAX_AWCS-1) i++; - if (!aironet4500_devices[i]){ - aironet4500_devices[i]=dev; - ((struct awc_private *) - aironet4500_devices[i]->priv)->card_type = AIRONET4500_PCI; - - if (awc_proc_set_fun) - awc_proc_set_fun(i); - } - -// if (register_netdev(dev) != 0) { -// printk(KERN_NOTICE "awc_cs: register_netdev() failed\n"); -// goto failed; -// } - - return 0; -// failed: -// return -1; - -} - -#ifdef MODULE -static void awc_pci_release(void) { - -// long flags; - int i=0; - - DEBUG(0, "awc_detach \n"); - - i=0; - while ( i < MAX_AWCS) { - if (!aironet4500_devices[i]) - {i++; continue;}; - if (((struct awc_private *)aironet4500_devices[i]->priv)->card_type != AIRONET4500_PCI) - {i++; continue;} - - if (awc_proc_unset_fun) - awc_proc_unset_fun(i); - release_region(aironet4500_devices[i]->base_addr, AIRONET4X00_IO_SIZE); -// release_region(pci_cisaddr, AIRONET4X00_CIS_SIZE, "aironet4x00 cis"); -// release_region(pci_memaddr, AIRONET4X00_MEM_SIZE, "aironet4x00 mem"); - - unregister_netdev(aironet4500_devices[i]); - free_irq(aironet4500_devices[i]->irq,aironet4500_devices[i]); - kfree(aironet4500_devices[i]->priv); - kfree(aironet4500_devices[i]); - - aironet4500_devices[i]=0; - - - i++; - } - - -} - - -#endif //MODULE - - -#endif /* CONFIG_AIRONET4500_PCI */ - -#ifdef CONFIG_AIRONET4500_PNP - -#include -#define AIRONET4X00_IO_SIZE 0x40 - -#define isapnp_logdev pnp_dev -#define isapnp_dev pnp_card -#define isapnp_find_device pnp_find_card -#define isapnp_find_logdev pnp_find_dev -#define PNP_BUS card -#define PNP_BUS_NUMBER number -#define PNP_DEV_NUMBER number - - -int awc4500_pnp_hw_reset(struct net_device *dev){ - - struct isapnp_logdev *logdev; - - DEBUG(0, "awc_pnp_reset \n"); - - if (!dev->priv ) { - printk("awc4500 no dev->priv in hw_reset\n"); - return -1; - }; - - logdev = ((struct isapnp_logdev *) ((struct awc_private *)dev->priv)->bus); - - if (!logdev ) { - printk("awc4500 no pnp logdev in hw_reset\n"); - return -1; - }; - - pnp_disable_dev(logdev); - - udelay(100); - - if (pnp_activate_dev(logdev, NULL) < 0) { - printk("%s cfg begin failed in hw_reset for csn %x devnum %x \n", - dev->name, logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER); - return -EAGAIN; - } - - return 0; -} - -int awc4500_pnp_probe(struct net_device *dev) -{ - int isa_index = 0; - int isa_irq_line = 0; - int isa_ioaddr = 0; - int card = 0; - int i=0; - struct isapnp_dev * pnp_dev ; - struct isapnp_logdev *logdev; - - while (1) { - - pnp_dev = isapnp_find_device( - ISAPNP_VENDOR('A','W','L'), - ISAPNP_DEVICE(1), - 0); - - if (!pnp_dev) break; - - isa_index++; - - logdev = isapnp_find_logdev(pnp_dev, ISAPNP_VENDOR('A','W','L'), - ISAPNP_FUNCTION(1), - 0); - if (!logdev){ - printk("No logical device found on Aironet board \n"); - return -ENODEV; - } - if (pnp_device_attach(logdev) < 0) { - printk("pnp_device_attach failed for csn %x devnum %x \n", - logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER); - return -EAGAIN; - } - if (pnp_activate_dev(logdev, NULL) < 0) { - printk("pnp_activate_dev failed for csn %x devnum %x \n", - logdev->PNP_BUS->PNP_BUS_NUMBER, logdev->PNP_DEV_NUMBER); - pnp_device_detach(logdev); - return -EIO; - } - - isa_irq_line = pnp_irq(logdev, 0); - isa_ioaddr = pnp_port_start(logdev, 0); - request_region(isa_ioaddr, AIRONET4X00_IO_SIZE, "aironet4x00 ioaddr"); - - if (!dev) { - dev = init_etherdev(NULL, 0); - if (!dev) { - release_region(isa_ioaddr, AIRONET4X00_IO_SIZE); - pnp_device_detach(logdev); - return -ENOMEM; - } - } - dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL ); - memset(dev->priv,0,sizeof(struct awc_private)); - if (!dev->priv) { - printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n"); - return -1; - }; - ((struct awc_private *)dev->priv)->bus = logdev; - - // ether_setup(dev); - - // dev->tx_queue_len = tx_queue_len; - - dev->hard_start_xmit = &awc_start_xmit; - // dev->set_config = &awc_config_misiganes,aga mitte awc_config; - dev->get_stats = &awc_get_stats; - // dev->set_multicast_list = &awc_set_multicast_list; - dev->change_mtu = awc_change_mtu; - dev->init = &awc_init; - dev->open = &awc_open; - dev->stop = &awc_close; - dev->base_addr = isa_ioaddr; - dev->irq = isa_irq_line; - dev->tx_timeout = &awc_tx_timeout; - dev->watchdog_timeo = AWC_TX_TIMEOUT; - - netif_start_queue (dev); - - request_irq(dev->irq,awc_interrupt , SA_SHIRQ | SA_INTERRUPT ,"Aironet 4X00",dev); - - awc_private_init( dev); - - ((struct awc_private *)dev->priv)->bus = logdev; - - cli(); - if ( awc_init(dev) ){ - printk("card not found at irq %x io %lx\n",dev->irq, dev->base_addr); - if (card==0){ - sti(); - return -1; - } - sti(); - break; - } - udelay(10); - sti(); - i=0; - while (aironet4500_devices[i] && i < MAX_AWCS-1) i++; - if (!aironet4500_devices[i] && i < MAX_AWCS-1 ){ - aironet4500_devices[i]=dev; - - ((struct awc_private *) - aironet4500_devices[i]->priv)->card_type = AIRONET4500_PNP; - - if (awc_proc_set_fun) - awc_proc_set_fun(i); - } else { - printk(KERN_CRIT "Out of resources (MAX_AWCS) \n"); - return -1; - } - - card++; - } - - if (card == 0) return -ENODEV; - return 0; -} - -#ifdef MODULE -static void awc_pnp_release(void) { - -// long flags; - int i=0; - struct isapnp_logdev *logdev; - - DEBUG(0, "awc_detach \n"); - - i=0; - while ( i < MAX_AWCS) { - if (!aironet4500_devices[i]) - {i++; continue;} - if (((struct awc_private *)aironet4500_devices[i]->priv)->card_type != AIRONET4500_PNP) - {i++; continue;} - - logdev = ((struct isapnp_logdev *) ((struct awc_private *)aironet4500_devices[i]->priv)->bus); - - if (!logdev ) - printk("awc4500 no pnp logdev in pnp_release\n"); - - if (awc_proc_unset_fun) - awc_proc_unset_fun(i); - pnp_device_detach(logdev); - - release_region(aironet4500_devices[i]->base_addr, AIRONET4X00_IO_SIZE); -// release_region(isa_cisaddr, AIRONET4X00_CIS_SIZE, "aironet4x00 cis"); -// release_region(isa_memaddr, AIRONET4X00_MEM_SIZE, "aironet4x00 mem"); - - unregister_netdev(aironet4500_devices[i]); - free_irq(aironet4500_devices[i]->irq,aironet4500_devices[i]); - kfree(aironet4500_devices[i]->priv); - kfree(aironet4500_devices[i]); - - aironet4500_devices[i]=0; - - - i++; - } - - -} - -static struct isapnp_device_id id_table[] = { - { ISAPNP_ANY_ID, ISAPNP_ANY_ID, - ISAPNP_VENDOR('A','W','L'), ISAPNP_DEVICE(1), 0 }, - {0} -}; - -MODULE_DEVICE_TABLE(isapnp, id_table); - -#endif //MODULE -#endif /* CONFIG_AIRONET4500_PNP */ - -#ifdef CONFIG_AIRONET4500_ISA - -static int irq[] = {0,0,0,0,0}; -static int io[] = {0,0,0,0,0}; - -/* - EXPORT_SYMBOL(irq); - EXPORT_SYMBOL(io); -*/ -MODULE_PARM(irq,"i"); -MODULE_PARM_DESC(irq,"Aironet 4x00 ISA non-PNP irqs,required"); -MODULE_PARM(io,"i"); -MODULE_PARM_DESC(io,"Aironet 4x00 ISA non-PNP ioports,required"); - - - -int awc4500_isa_probe(struct net_device *dev) -{ -// int cards_found = 0; -// static int isa_index; /* Static, for multiple probe calls. */ - int isa_irq_line = 0; - int isa_ioaddr = 0; -// int p; - int card = 0; - int i=0; - - if (! io[0] || ! irq[0]){ - -// printk(" Both irq and io params must be supplied for ISA mode !!!\n"); - return -ENODEV; - } - - printk(KERN_WARNING " Aironet ISA Card in non-PNP(ISA) mode sometimes feels bad on interrupt \n"); - printk(KERN_WARNING " Use aironet4500_pnp if any problems(i.e. card malfunctioning). \n"); - printk(KERN_WARNING " Note that this isa probe is not friendly... must give exact parameters \n"); - - while (irq[card] != 0){ - - isa_ioaddr = io[card]; - isa_irq_line = irq[card]; - - request_region(isa_ioaddr, AIRONET4X00_IO_SIZE, "aironet4x00 ioaddr"); - - if (!dev) { - dev = init_etherdev(NULL, 0); - if (!dev) { - release_region(isa_ioaddr, AIRONET4X00_IO_SIZE); - return (card == 0) ? -ENOMEM : 0; - } - } - dev->priv = kmalloc(sizeof(struct awc_private),GFP_KERNEL ); - memset(dev->priv,0,sizeof(struct awc_private)); - if (!dev->priv) { - printk(KERN_CRIT "aironet4x00: could not allocate device private, some unstability may follow\n"); - return -1; - }; - - // ether_setup(dev); - - // dev->tx_queue_len = tx_queue_len; - - dev->hard_start_xmit = &awc_start_xmit; - // dev->set_config = &awc_config_misiganes,aga mitte awc_config; - dev->get_stats = &awc_get_stats; - // dev->set_multicast_list = &awc_set_multicast_list; - dev->change_mtu = awc_change_mtu; - dev->init = &awc_init; - dev->open = &awc_open; - dev->stop = &awc_close; - dev->base_addr = isa_ioaddr; - dev->irq = isa_irq_line; - dev->tx_timeout = &awc_tx_timeout; - dev->watchdog_timeo = AWC_TX_TIMEOUT; - - request_irq(dev->irq,awc_interrupt ,SA_INTERRUPT ,"Aironet 4X00",dev); - - awc_private_init( dev); - if ( awc_init(dev) ){ - printk("card not found at irq %x mem %x\n",irq[card],io[card]); - if (card==0) - return -1; - break; - } - - i=0; - while (aironet4500_devices[i] && i < MAX_AWCS-1) i++; - if (!aironet4500_devices[i]){ - aironet4500_devices[i]=dev; - ((struct awc_private *) - aironet4500_devices[i]->priv)->card_type = AIRONET4500_ISA; - - if (awc_proc_set_fun) - awc_proc_set_fun(i); - } - - card++; - } - if (card == 0 ) { - return -ENODEV; - }; - return 0; -} - -#ifdef MODULE -static void awc_isa_release(void) { - -// long flags; - int i=0; - - DEBUG(0, "awc_detach \n"); - - i=0; - while ( i < MAX_AWCS) { - - if (!aironet4500_devices[i]) - {i++; continue;} - if (((struct awc_private *)aironet4500_devices[i]->priv)->card_type != AIRONET4500_ISA) - {i++; continue;} - - if (awc_proc_unset_fun) - awc_proc_unset_fun(i); - release_region(aironet4500_devices[i]->base_addr, AIRONET4X00_IO_SIZE); -// release_region(isa_cisaddr, AIRONET4X00_CIS_SIZE, "aironet4x00 cis"); -// release_region(isa_memaddr, AIRONET4X00_MEM_SIZE, "aironet4x00 mem"); - - unregister_netdev(aironet4500_devices[i]); - free_irq(aironet4500_devices[i]->irq,aironet4500_devices[i]); - kfree(aironet4500_devices[i]->priv); - kfree(aironet4500_devices[i]); - - aironet4500_devices[i]=0; - - - i++; - } - - -} - -#endif //MODULE - -#endif /* CONFIG_AIRONET4500_ISA */ - -#ifdef CONFIG_AIRONET4500_I365 - -#define port_range 0x40 - -int awc_i365_offset_ports[] = {0x3e0,0x3e0,0x3e2,0x3e2}; -int awc_i365_data_ports [] = {0x3e1,0x3e1,0x3e3,0x3e3}; -int awc_i365_irq[] = {5,5,11,12}; -int awc_i365_io[] = {0x140,0x100,0x400,0x440}; -int awc_i365_sockets = 0; - -struct i365_socket { - int offset_port ; - int data_port; - int socket; - int irq; - int io; - int manufacturer; - int product; -}; - -inline u8 i365_in (struct i365_socket * s, int offset) { - outb(offset + (s->socket % 2)* 0x40, s->offset_port); - return inb(s->data_port); -}; - -inline void i365_out (struct i365_socket * s, int offset,int data){ - outb(offset + (s->socket % 2)* 0x40 ,s->offset_port); - outb((data & 0xff),s->data_port) ; - -}; - -void awc_i365_card_release(struct i365_socket * s){ - - i365_out(s, 0x5, 0); // clearing ints - i365_out(s, 0x6, 0x20); // mem 16 bits - i365_out(s, 0x7, 0); // clear IO - i365_out(s, 0x3, 0); // gen ctrl reset + mem mode - i365_out(s, 0x2, 0); // reset power - i365_out(s, 0x2, i365_in(s, 0x2) & 0x7f ); // cardenable off - i365_out(s, 0x2, 0); // remove power - - -}; -int awc_i365_probe_once(struct i365_socket * s ){ - - - int caps=i365_in(s, 0); - int ret; - unsigned long jiff; -// short rev = 0x3000; - unsigned char cis [0x3e3]; - unsigned char * mem = phys_to_virt(0xd000); - int i; - int port ; - - DEBUG(1," i365 control ID %x \n", caps); - - if (caps & 0xC){ - return 1; - }; - - ret = i365_in(s, 0x1); - - if ((ret & 0xC0) != 0xC0){ - printk("card in socket %d port %x not in known state, %x \n", - s->socket, s->offset_port, ret ); - return -1; - }; - - - awc_i365_card_release(s); - - - mdelay(100); - - i365_out(s, 0x2, 0x10 ); // power enable - mdelay(200); - - i365_out(s, 0x2, 0x10 | 0x01 | 0x04 | 0x80); //power enable - - mdelay(250); - - if (!s->irq) - s->irq = 11; - - i365_out(s, 0x3, 0x40 | 0x20 | s->irq); - - jiff = jiffies; - - while (jiffies-jiff < HZ ) - if (i365_in(s,0x1) & 0x20) - break; - - if (! (i365_in(s,0x1) & 0x20) ){ - printk("irq enable timeout on socket %x \n", s->socket); - return -1; - }; - - i365_out(s,0x10,0xd0); - i365_out(s,0x11,0x0); - i365_out(s,0x12,0xd0); - i365_out(s,0x13,0x0); - i365_out(s,0x14,0x30 ); - i365_out(s,0x15,0x3f | 0x40); // enab mem reg bit - i365_out(s,0x06,0x01); // enab mem - - mdelay(10); - - cis[0] = 0x45; - -// memcpy_toio( 0xd3e0, &(cis[0]),0x1); - -// mem[0x3e0] = 0x0; -// mem[0] = 0x45; - - mem[0x3e0] = 0x45; - - mdelay(10); - - memcpy_fromio(cis,0xD000, 0x3e0); - - for (i = 0; i <= 0x3e2; i++) - printk("%02x", mem[i]); - for (i = 0; i <= 0x3e2; i++) - printk("%c", mem[i]); - - i=0; - while (i < 0x3e0){ - if (cis[i] == 0xff) - break; - if (cis[i] != 0x20 ){ - i = i + 2 + cis[i+1]; - continue; - }else { - s->manufacturer = cis[i+2] | (cis[i+3]<<8); - s->product = cis[i+4] | (cis[i+5]<<8); - break; - }; - i++; - }; - - DEBUG(1,"socket %x manufacturer %x product %x \n", - s->socket, s->manufacturer,s->product); - - i365_out(s,0x07, 0x1 | 0x2); // enable io 16bit - mdelay(1); - port = s->io; - i365_out(s,0x08, port & 0xff); - i365_out(s,0x09, (port & 0xff00)/ 0x100); - i365_out(s,0x0A, (port+port_range) & 0xff); - i365_out(s,0x0B, ((port+port_range) & 0xff00) /0x100); - - i365_out(s,0x06, 0x40); // enable io window - - mdelay(1); - - i365_out(s,0x3e0,0x45); - - outw(0x10, s->io); - - jiff = jiffies; - while (!(inw(s->io + 0x30) & 0x10)){ - - if (jiffies - jiff > HZ ){ - - printk("timed out waitin for command ack \n"); - break; - } - }; - - - outw(0x10, s->io + 0x34); - mdelay(10); - - return 0; - -}; - - -static int awc_i365_init(struct i365_socket * s) { - - struct net_device * dev; - int i; - - - dev = init_etherdev(0, sizeof(struct awc_private) ); - -// dev->tx_queue_len = tx_queue_len; - ether_setup(dev); - - dev->hard_start_xmit = &awc_start_xmit; -// dev->set_config = &awc_config_misiganes,aga mitte awc_config; - dev->get_stats = &awc_get_stats; - dev->set_multicast_list = &awc_set_multicast_list; - - dev->init = &awc_init; - dev->open = &awc_open; - dev->stop = &awc_close; - dev->irq = s->irq; - dev->base_addr = s->io; - dev->tx_timeout = &awc_tx_timeout; - dev->watchdog_timeo = AWC_TX_TIMEOUT; - - - awc_private_init( dev); - - i=0; - while (aironet4500_devices[i] && i < MAX_AWCS-1) i++; - if (!aironet4500_devices[i]){ - aironet4500_devices[i]=dev; - - ((struct awc_private *) - aironet4500_devices[i]->priv)->card_type = AIRONET4500_365; - - if (awc_proc_set_fun) - awc_proc_set_fun(i); - } - - if (register_netdev(dev) != 0) { - printk(KERN_NOTICE "awc_cs: register_netdev() failed\n"); - goto failed; - } - - return 0; - - failed: - return -1; -} - - -static void awc_i365_release(void) { - -// long flags; - int i=0; - - DEBUG(0, "awc_detach \n"); - - i=0; - while ( i < MAX_AWCS) { - - if (!aironet4500_devices[i]) - {i++; continue;} - - if (((struct awc_private *)aironet4500_devices[i]->priv)->card_type != AIRONET4500_365) - {i++; continue;} - - if (awc_proc_unset_fun) - awc_proc_unset_fun(i); - - unregister_netdev(aironet4500_devices[i]); - - //kfree(aironet4500_devices[i]->priv); - kfree(aironet4500_devices[i]); - - aironet4500_devices[i]=0; - - - i++; - } - - -} - - - - - - - -int awc_i365_probe(void) { - - int i = 1; - int k = 0; - int ret = 0; - int found=0; - - struct i365_socket s; - /* Always emit the version, before any failure. */ - - if (!awc_i365_sockets) { - printk(" awc i82635 4x00: use bitfiel opts awc_i365_sockets=0x3 <- (1|2) to probe sockets 0 and 1\n"); - return -1; - }; - - while (k < 4){ - if (i & awc_i365_sockets){ - - s.offset_port = awc_i365_offset_ports[k]; - s.data_port = awc_i365_data_ports[k]; - s.socket = k; - s.manufacturer = 0; - s.product = 0; - s.irq = awc_i365_irq[k]; - s.io = awc_i365_io[k]; - - ret = awc_i365_probe_once(&s); - if (!ret){ - if (awc_i365_init(&s)) - goto failed; - else found++; - } else if (ret == -1) - goto failed; - }; - k++; - i *=2; - }; - - if (!found){ - printk("no aironet 4x00 cards found\n"); - return -1; - } - return 0; - -failed: - awc_i365_release(); - return -1; - - -} - -#endif /* CONFIG_AIRONET4500_I365 */ - -#ifdef MODULE -int init_module(void) -{ - int found = 0; - - printk("%s\n ", awc_version); - -#ifdef CONFIG_AIRONET4500_PCI - if (awc4500_pci_probe(NULL) == -ENODEV){ -// printk("PCI 4X00 aironet cards not found\n"); - } else { - found++; -// printk("PCI 4X00 found some cards \n"); - } -#endif -#ifdef CONFIG_AIRONET4500_PNP - if (awc4500_pnp_probe(NULL) == -ENODEV){ -// printk("PNP 4X00 aironet cards not found\n"); - } else { - found++; -// printk("PNP 4X00 found some cards \n"); - } -#endif -#ifdef CONFIG_AIRONET4500_365 - if ( awc_i365_probe() == -1) { -// printk("PCMCIA 4X00 aironet cards not found for i365(without card services) initialization\n"); - } else { - found++ ; -// printk("PCMCIA 4X00 found some cards, take care, this code is not supposed to work yet \n"); - } -#endif -#ifdef CONFIG_AIRONET4500_ISA - if (awc4500_isa_probe(NULL) == -ENODEV){ -// printk("ISA 4X00 aironet ISA-bus non-PNP-mode cards not found\n"); - } else { - found++; -// printk("ISA 4X00 found some cards \n"); - } -#endif - if (!found) { - printk(KERN_ERR "No Aironet 4X00 cards were found. Note that for ISA \n cards you should use either automatic PNP mode or \n ISA mode with both io and irq param \n Aironet is also afraid of: being second PNP controller(by slot), having anything(brandname bios weirdnesses) in range 0x100-0x180 and maybe around 0xd0000\n If you PNP type card does not get found, try non-PNP switch before complainig. \n"); - return -1; - } - return 0; - - -} - -void cleanup_module(void) -{ - DEBUG(0, "awc_cs: unloading %c ",'\n'); -#ifdef CONFIG_AIRONET4500_PCI - awc_pci_release(); -#endif -#ifdef CONFIG_AIRONET4500_PNP - awc_pnp_release(); -#endif -#ifdef CONFIG_AIRONET4500_365 - awc_i365_release(); -#endif -#ifdef CONFIG_AIRONET4500_ISA - awc_isa_release(); -#endif - -} -#endif diff -Nru a/drivers/net/aironet4500_core.c b/drivers/net/aironet4500_core.c --- a/drivers/net/aironet4500_core.c Thu Feb 20 23:19:19 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,3234 +0,0 @@ -/* - * Aironet 4500/4800 driver core - * - * Elmer Joandi, Januar 1999 - * Copyright: GPL - * - * - * Revision 0.1 ,started 30.12.1998 - * - * - */ - /* CHANGELOG: - march 99, stable version 2.0 - august 99, stable version 2.2 - november 99, integration with 2.3 - 17.12.99: finally, got SMP near-correct. - timing issues remain- on SMP box its 15% slower on tcp - 10.03.00 looks like softnet take us back to normal on SMP - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "aironet4500.h" - - -int bap_sleep = 10 ; -int bap_sleep_after_setup = 1; -int sleep_before_command = 1; -int bap_sleep_before_write= 1; -int sleep_in_command = 1; -int both_bap_lock; /* activated at awc_init in this */ -int bap_setup_spinlock; /* file if numcpu >1 */ - -EXPORT_SYMBOL(bap_sleep); -EXPORT_SYMBOL(bap_sleep_after_setup); -EXPORT_SYMBOL(sleep_before_command); -EXPORT_SYMBOL(bap_sleep_before_write); -EXPORT_SYMBOL(sleep_in_command); -EXPORT_SYMBOL(both_bap_lock); -EXPORT_SYMBOL(bap_setup_spinlock); - -struct awc_strings awc_status_error_codes[]=awc_reply_error_strings; -struct awc_strings awc_command_names[]=awc_command_name_strings; -struct awc_strings awc_link_status_names[]=awc_link_status_strings; -struct awc_strings awc_rid_names[]=aironet4500_RID_Select_strings; -struct awc_strings awc_link_failure_reason_names[]=IEEE_802_11_LINK_STATUS_FAILURE_REASON_STRINGS; - -const char * awc_print_string( struct awc_strings* strings, int code){ - - struct awc_strings * str = strings; - int i = 0; - while (str[i].string != NULL){ - if (str[i].par == (code & str[i].mask )){ - return str[i].string; - }; - i++; - }; - return "UNKNOWN"; -}; - -int awc_dump_registers(struct net_device * dev){ - -#ifdef AWC_DEBUG - int i; -#endif - int status= inw(dev->base_addr +4*2); - int r1= inw(dev->base_addr +5*2); - int r2= inw(dev->base_addr +6*2); - int r3= inw(dev->base_addr +7*2); - - printk(KERN_ERR "Command %s , result: %s, at memblk %x(RID %s) , offset %x \n", - awc_print_string(awc_command_names,status), - awc_print_string(awc_status_error_codes,r1), - r2, awc_print_string(awc_rid_names,r2), - r3); - -#ifdef AWC_DEBUG - printk(KERN_ERR "%s aironet register dump ",dev->name ); - - - for (i=0; i < 32; i++){ - printk("%4x ", inw(dev->base_addr + i*2 ) ); - if ( (i+1)%8 == 0){ - printk("\n"); - printk(KERN_ERR "%02x",(i+1)*2); - } - }; - printk(KERN_ERR " \n"); -#endif - return 0; -}; - -/****************************** COMMAND ******************/ - - -inline -int awc_command_busy_clear_wait(struct net_device * dev){ -// long long jiff = jiffies; - u16 active_interrupts; - int cnt= 0; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_command_busy_clear_wait "); - - while (awc_command_busy(dev->base_addr)){ - if (cnt > 1000 ){ - printk(KERN_ERR "awc command busy too long, clearing\n"); - awc_dump_registers(dev); - awc_event_ack_ClrStckCmdBsy(dev->base_addr); - break; - }; - if (((struct awc_private*) dev->priv)->ejected) - return -1; - cnt++; - udelay(10); - } - - cnt = 0; - while (awc_command_busy(dev->base_addr)){ - //if (jiffies - jiff > (HZ/3)){ - if (cnt > 30000 ){ - printk(KERN_CRIT "awc command busy WAY too long, clearing\n"); - awc_dump_registers(dev); - awc_event_ack_ClrStckCmdBsy(dev->base_addr); - active_interrupts = awc_event_status(dev->base_addr); - awc_event_ack(dev->base_addr, active_interrupts); - - AWC_ENTRY_EXIT_DEBUG("BAD exit\n "); - return -1 ; - - }; - if (((struct awc_private*) dev->priv)->ejected) - return -1; - cnt++; - udelay(10); - } - - - AWC_ENTRY_EXIT_DEBUG(" exit\n "); - - return 0; - - -}; - - - -inline unsigned short -awc_issue_command_and_block(struct awc_command * cmd){ - - int ticks; - long long jiff; - u16 enabled_interrupts; - int cnt = 0; -// unsigned long flags; - - jiff = jiffies; - - - AWC_ENTRY_EXIT_DEBUG(" entry awc_issue_command_and_block "); - - AWC_LOCK_COMMAND_ISSUING(cmd->priv); - - if (awc_command_busy_clear_wait(cmd->dev)) goto final; - - if (cmd->priv->sleeping_bap) udelay(sleep_before_command); - - awc4500wout(cmd->port,cmd->command,cmd->par0,cmd->par1,cmd->par2); -// awc_dump_registers(cmd->dev); - - - if (cmd->priv->sleeping_bap) udelay(sleep_in_command); - - enabled_interrupts = awc_ints_enabled(cmd->dev->base_addr); - awc_ints_enable(cmd->dev->base_addr, enabled_interrupts & ~0x10); - if(cmd->priv->enabled_interrupts & 0x10) - cmd->priv->enabled_interrupts &= ~0x10; - - - while ( awc_command_read(cmd->port) == cmd->command) { - udelay(1); - awc_command_write(cmd->port, cmd->command); - //if ((jiffies - jiff) > 2){ - if (cnt > 2000 ){ - printk(" long wait with commmand reg busy in blocking command \n"); - awc_dump_registers(cmd->dev); - goto final; - }; - if (cmd->priv->ejected) - goto final; - cnt++; - udelay(10); - - }; - AWC_ENTRY_EXIT_DEBUG(" issued " ); - - ticks = 0; - while ( awc_event_status_Cmd(cmd->port) == 0) { - ticks++; - if (ticks > 100000){ - printk(" long wait with commmand reg busy \n"); - awc_dump_registers(cmd->dev); - goto final; - }; - if (ticks > 500){ - DEBUG(1, " long wait after issue 10mks * %d ", ticks ); - //printk(" long wait with command reg busy about ticks\n"); - // sti(); - } - if (cmd->priv->ejected) - goto final; - udelay(10); - } - if (cmd->priv->sleeping_bap) udelay(sleep_in_command); - - awc_read_response(cmd); - AWC_ENTRY_EXIT_DEBUG(" resp read \n"); - - if (awc_command_busy(cmd->port)) - awc_event_ack_ClrStckCmdBsy(cmd->port); - - awc_event_ack_Cmd(cmd->port); - if (cmd->priv->sleeping_bap) udelay(sleep_in_command); - - if (cmd->status & 0xff00){ - printk(KERN_ERR " bad response to command %s, parameter %x \n",awc_print_string(awc_command_names, cmd->command),cmd->par0); - awc_dump_registers(cmd->dev); - goto final; - } - - AWC_UNLOCK_COMMAND_ISSUING(cmd->priv); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - udelay(1); - return 0; -final: - AWC_UNLOCK_COMMAND_ISSUING(cmd->priv); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -}; - - -inline -unsigned short -awc_issue_command(struct awc_command * cmd){ - - -// long long jiff = jiffies; -// unsigned short enabled_ints; - int cnt = 0; -// int i=0; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_issue_command"); - - if (!cmd){ - printk(KERN_CRIT "cmd == NULL in awc_issue_command\n"); - return -1; - - } - if (!cmd->dev){ - printk(KERN_CRIT "cmd->dev == NULL in awc_issue_command\n"); - return -1; - - } - - AWC_LOCK_COMMAND_ISSUING(cmd->priv); - - if(awc_command_busy_clear_wait(cmd->dev)) goto final; - - if(!cmd->priv->enabled_interrupts & 0x10){ - cmd->priv->enabled_interrupts |= 0x10; - awc_ints_enable(cmd->port, cmd->priv->enabled_interrupts ); - } - - cmd->priv->async_command_start = jiffies; - cmd->priv->command_semaphore_on++; - - - awc4500wout(cmd->port,cmd->command,cmd->par0,cmd->par1,cmd->par2); - - while ( awc_command_read(cmd->port) == cmd->command) { - - awc_command_write(cmd->port, cmd->command); - //if ((jiffies - jiff) > 2){ - if (cnt > 2000) { - printk(" long wait with commmand reg busy in async command \n"); - awc_dump_registers(cmd->dev); - goto final; - }; - if (cmd->priv->ejected) - goto final; - cnt++; - udelay(10); - }; - - cmd->priv->cmd = *cmd; - - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - AWC_UNLOCK_COMMAND_ISSUING(cmd->priv); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - -}; - -inline -unsigned short -awc_issue_command_no_ack(struct net_device * dev, - u16 com, u16 par1, u16 par2, u16 par3){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - int cnt = 0; - long long jiff; - jiff = jiffies; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_issue_command_no_ack "); - - - AWC_LOCK_COMMAND_ISSUING(priv); - - if (awc_command_busy_clear_wait(dev)) { - printk("aironet4x00 no_ack command (reset) with stuck card \n"); - } - - awc4500wout(dev->base_addr,com, par1, par2,par3); - - udelay(10); - while ( awc_event_status_Cmd(dev->base_addr) == 0) { - if (awc_command_read(dev->base_addr) == com) { - awc_command_write(dev->base_addr, com); - } - //if ((jiffies - jiff) > 2){ - if (cnt > 2000) { - printk(" long wait with commmand reg busy in noack command %d par %d %d %d\n",com,par1,par2,par3); - awc_dump_registers(dev); - goto final; - }; - if (priv->ejected) - goto final; - udelay(10); - cnt++; - } - - if (awc_command_busy(dev->base_addr)) - awc_event_ack_ClrStckCmdBsy(dev->base_addr); - - AWC_UNLOCK_COMMAND_ISSUING(priv); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; -final: - AWC_UNLOCK_COMMAND_ISSUING(priv); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -}; - - -/******************************** BAP *************************/ - -// inline // too long for inline -int awc_bap_setup(struct awc_command * cmd) { - - int status; - long long jiff; - unsigned long flags; - int cleared = 0; - int cycles = 0; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_bap_setup "); - - if ( cmd->priv->sleeping_bap) - udelay(bap_sleep); - - if (cmd->priv->ejected) - return -1; - - if (!cmd->bap || !(cmd->lock_state & (AWC_BAP_SEMALOCKED |AWC_BAP_LOCKED))) - DEBUG(1,"no bap or bap not locked cmd %d !!", cmd->command); - - if (bap_setup_spinlock) - spin_lock_irqsave(&cmd->priv->bap_setup_spinlock,cmd->priv->bap_setup_spinlock_flags); - status = AWC_IN(cmd->bap->offset); - - if (status & ~0x2000 ){ - WAIT61x3; - status = AWC_IN(cmd->bap->offset); - } - - if (status & ~0x2000 ){ - WAIT61x3; - AWC_IN(cmd->dev->base_addr + 0x26); - AWC_OUT(cmd->dev->base_addr + 0x26, 0); - WAIT61x3; - udelay(60); - #ifdef AWC_DEBUG - printk("b"); - #endif - status = AWC_IN(cmd->bap->offset); - } - - - if (status & 0xC000){ - printk(KERN_ERR "bap entered with err or busy bit set %x \n",status); - if (cmd->bap->lock != 1) - printk(KERN_ERR "bap lock bad same time %x\n",cmd->bap->lock); - awc_dump_registers(cmd->dev); - // AWC_OUT(cmd->bap->offset, 0x800); - } - - save_flags(flags); - cli(); - - AWC_OUT(cmd->bap->select, cmd->rid); - WAIT61x3; - AWC_OUT(cmd->bap->offset, cmd->offset); - - restore_flags(flags); - - WAIT61x3; - - jiff = jiffies; - - while (1) { - cycles++; - status = AWC_IN(cmd->bap->offset); - if ( cmd->priv->sleeping_bap) - udelay(bap_sleep); - if (cmd->priv->ejected) - goto ejected_unlock; - udelay(1); - if (cycles > 10000) { - printk(KERN_CRIT "deadlock in bap\n"); - goto return_AWC_ERROR; - }; - status = AWC_IN(cmd->bap->offset); - if (status & AWC_BAP_BUSY) { - if (cycles % 100 == 99 ) { - save_flags(flags); - cli(); - if (!cleared){ - AWC_IN(cmd->dev->base_addr + 0x26); - AWC_OUT(cmd->dev->base_addr + 0x26, 0); - WAIT61x3; - cleared = 1; - } - AWC_OUT(cmd->bap->select, cmd->rid); - WAIT61x3; - AWC_OUT(cmd->bap->offset, cmd->offset); - restore_flags(flags); - #ifdef AWC_DEBUG - printk("B"); - #endif - - if ( cmd->priv->sleeping_bap) - udelay(bap_sleep); - else udelay(30); - //restart_timeout(); - } - if (jiffies - jiff > 1 ) { - AWC_ENTRY_EXIT_DEBUG(" BAD BUSY exit \n"); - awc_dump_registers(cmd->dev); - goto return_AWC_ERROR; - } - continue; - } - if (status & AWC_BAP_DONE) { - WAIT61x3; WAIT61x3; WAIT61x3; - - // if ((status & 0xfff) != cmd->offset) - // printk(KERN_ERR "awcPBD %x ",status); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - if (cmd->priv->sleeping_bap) - udelay(bap_sleep_after_setup); - - // success - goto return_AWC_SUCCESS; - } - - if (status & AWC_BAP_ERR) { - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - // invalid rid or offset - printk(KERN_ERR "bap setup error bit set for rid %x offset %x \n",cmd->rid,cmd->offset); - awc_dump_registers(cmd->dev); - goto return_AWC_ERROR; - } - if ( cmd->priv->sleeping_bap) - udelay(bap_sleep); - else udelay(1); - // -- awc missed it, try again - - save_flags(flags); - cli(); - AWC_OUT(cmd->bap->select, cmd->rid); - WAIT61x3; - AWC_OUT(cmd->bap->offset, cmd->offset); - WAIT61x3; - restore_flags(flags); - - if (jiffies - jiff > HZ) - if (! (status &(AWC_BAP_ERR |AWC_BAP_DONE |AWC_BAP_BUSY))){ - printk("aironet4500: bap setup lock without any status bits set"); - awc_dump_registers(cmd->dev); - goto return_AWC_ERROR; - - }; - - } - - AWC_ENTRY_EXIT_DEBUG(" WE MUST NOT BE HERE exit \n"); - -ejected_unlock: - if (bap_setup_spinlock) - spin_unlock_irqrestore(&cmd->priv->bap_setup_spinlock,cmd->priv->bap_setup_spinlock_flags); - AWC_ENTRY_EXIT_DEBUG(" ejected_unlock_exit \n"); - return -1; - -return_AWC_ERROR: - if (bap_setup_spinlock) - spin_unlock_irqrestore(&cmd->priv->bap_setup_spinlock,cmd->priv->bap_setup_spinlock_flags); - AWC_ENTRY_EXIT_DEBUG(" AWC_ERROR_exit \n"); - return AWC_ERROR; - -return_AWC_SUCCESS: - if (bap_setup_spinlock) - spin_unlock_irqrestore(&cmd->priv->bap_setup_spinlock,cmd->priv->bap_setup_spinlock_flags); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return AWC_SUCCESS; -} - - - // requires call to awc_bap_setup() first -inline -int -awc_bap_read(struct awc_command * cmd) { - register u16 len; - register u16 * buff = (u16 *) cmd->buff; - register u16 port= cmd->bap->data; - - - AWC_ENTRY_EXIT_DEBUG(" entry awc_bap_read "); - if (!cmd->bap && !(cmd->lock_state & (AWC_BAP_SEMALOCKED |AWC_BAP_LOCKED))) - DEBUG(0,"no bap or bap not locked %d !!", cmd->command); - cmd->len = (cmd->len + 1) & (~1); // round up to even value - len = cmd->len / 2; - if (cmd->priv->ejected) - return -1; - - - if (cmd->priv->sleeping_bap) - udelay(bap_sleep_before_write); - - if (!cmd->priv->sleeping_bap) - while ( len-- > 0) - *buff++ = AWC_IN(port); - else - while ( len-- > 0){ - *buff++ = AWC_IN(port); - } - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - if (cmd->priv->ejected) - return -1; - - return AWC_SUCCESS; -} - - // requires call to awc_bap_setup() first -inline -int -awc_bap_write(struct awc_command * cmd){ - register u16 len; - register u16 * buff = (u16 *) cmd->buff; - register u16 port= cmd->bap->data; - - - AWC_ENTRY_EXIT_DEBUG(" entry awc_bap_write "); - if (!cmd->bap && !(cmd->lock_state & (AWC_BAP_SEMALOCKED |AWC_BAP_LOCKED))) - DEBUG(0,"no bap or bap not locked %d !!", cmd->command); - - cmd->len = (cmd->len + 1) & (~1); // round up to even value - len = cmd->len / 2; - - if (cmd->priv->ejected) - return -1; - - if (cmd->priv->sleeping_bap) - udelay(bap_sleep_before_write); - - - if (!cmd->priv->sleeping_bap) - while (len-- > 0) - AWC_OUT(port, *buff++); - else - while ( len-- > 0){ - AWC_OUT(port, *buff++); - } - if (cmd->priv->ejected) - return -1; - - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - - return AWC_SUCCESS; -} - - - - -/***************************** RID READ/WRITE ********************/ - -const struct aironet4500_rid_selector aironet4500_RID_Select_General_Config =(const struct aironet4500_rid_selector){ 0xFF10, 1,0,0, "General Configuration" }; // See notes General Configuration Many configuration items. -const struct aironet4500_rid_selector aironet4500_RID_Select_SSID_list =(const struct aironet4500_rid_selector){ 0xFF11, 1,0,0, "Valid SSID list" }; // See notes Valid SSID list List of SSIDs which the station may associate to. -const struct aironet4500_rid_selector aironet4500_RID_Select_AP_list =(const struct aironet4500_rid_selector){ 0xFF12, 1,0,0, "Valid AP list" }; // See notes Valid AP list List of APs which the station may associate to. -const struct aironet4500_rid_selector aironet4500_RID_Select_Driver_name =(const struct aironet4500_rid_selector){ 0xFF13, 1,0,0, "Driver name" }; // See notes Driver name The name and version of the driver (for debugging) -const struct aironet4500_rid_selector aironet4500_RID_Select_Encapsulation =(const struct aironet4500_rid_selector){ 0xFF14, 1,0,0, "Ethernet Protocol" }; // See notes Ethernet Protocol Rules for encapsulating ethernet payloads onto 802.11. -const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_volatile =(const struct aironet4500_rid_selector){ 0xFF15, 1,0,0, "WEP key volatile" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_nonvolatile =(const struct aironet4500_rid_selector){ 0xFF16, 1,0,0, "WEP key non-volatile" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_Modulation =(const struct aironet4500_rid_selector){ 0xFF17, 1,0,0, "Modulation" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_Active_Config =(const struct aironet4500_rid_selector){ 0xFF20, 0,1,1, "Actual Configuration" }; // Read only Actual Configuration This has the same format as the General Configuration. -const struct aironet4500_rid_selector aironet4500_RID_Select_Capabilities =(const struct aironet4500_rid_selector){ 0xFF00, 0,1,0, "Capabilities" }; // Read Only Capabilities PC4500 Information -const struct aironet4500_rid_selector aironet4500_RID_Select_AP_Info =(const struct aironet4500_rid_selector){ 0xFF01, 0,1,1, "AP Info" }; // Read Only AP Info Access Point Information -const struct aironet4500_rid_selector aironet4500_RID_Select_Radio_Info =(const struct aironet4500_rid_selector){ 0xFF02, 0,1,1, "Radio Info" }; // Read Only Radio Info Radio Information -- note radio specific -const struct aironet4500_rid_selector aironet4500_RID_Select_Status =(const struct aironet4500_rid_selector){ 0xFF50, 0,1,1, "Status" }; // Read Only Status PC4500 Current Status Information -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats =(const struct aironet4500_rid_selector){ 0xFF60, 0,1,1, "Cumulative 16-bit Statistics" }; // Read Only 16-bit Statistics Cumulative 16-bit Statistics -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_delta =(const struct aironet4500_rid_selector){ 0xFF61, 0,1,1, "Delta 16-bit Statistics" }; // Read Only 16-bit Statistics Delta 16-bit Statistics (since last clear) -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_clear =(const struct aironet4500_rid_selector){ 0xFF62, 0,1,1, "Delta 16-bit Statistics and Clear" }; // Read Only / 16-bit Statistics Delta 16-bit Statistics and Clear -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats =(const struct aironet4500_rid_selector){ 0xFF68, 0,1,1, "Cumulative 32-bit Statistics" }; // Read Only 32-bit Statistics Cumulative 32-bit Statistics -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_delta =(const struct aironet4500_rid_selector){ 0xFF69, 0,1,1, "Delta 32-bit Statistics" }; // Read Only 32-bit Statistics Delta 32-bit Statistics (since last clear) -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_clear =(const struct aironet4500_rid_selector){ 0xFF6A, 0,1,1, "Delta 32-bit Statistics and Clear" }; // Read Only / 32-bit Statistics Delta 32-bit Statistics and Clear - -EXPORT_SYMBOL(aironet4500_RID_Select_General_Config); -EXPORT_SYMBOL(aironet4500_RID_Select_SSID_list); -EXPORT_SYMBOL(aironet4500_RID_Select_AP_list); -EXPORT_SYMBOL(aironet4500_RID_Select_Driver_name); -EXPORT_SYMBOL(aironet4500_RID_Select_Encapsulation); -EXPORT_SYMBOL(aironet4500_RID_Select_WEP_volatile); -EXPORT_SYMBOL(aironet4500_RID_Select_WEP_nonvolatile); -EXPORT_SYMBOL(aironet4500_RID_Select_Modulation); -EXPORT_SYMBOL(aironet4500_RID_Select_Active_Config); -EXPORT_SYMBOL(aironet4500_RID_Select_Capabilities); -EXPORT_SYMBOL(aironet4500_RID_Select_AP_Info); -EXPORT_SYMBOL(aironet4500_RID_Select_Radio_Info); -EXPORT_SYMBOL(aironet4500_RID_Select_Status); -EXPORT_SYMBOL(aironet4500_RID_Select_16_stats); -EXPORT_SYMBOL(aironet4500_RID_Select_16_stats_delta); -EXPORT_SYMBOL(aironet4500_RID_Select_16_stats_clear); -EXPORT_SYMBOL(aironet4500_RID_Select_32_stats); -EXPORT_SYMBOL(aironet4500_RID_Select_32_stats_delta); -EXPORT_SYMBOL(aironet4500_RID_Select_32_stats_clear); - - -struct awc_rid_dir awc_rids_temp[]={ - // following MUST be consistent with awc_rids_setup !!! - {&aironet4500_RID_Select_General_Config, 0x100 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_SSID_list, 0x68 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_AP_list, 0x20 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Driver_name, 0x12 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Encapsulation, 0x22 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Active_Config, 0x100 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Capabilities, 0x80 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Status, 0x6c , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_AP_Info, 0x06 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats, 0x184 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats_delta, 0x184 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats_clear, 0x184 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_WEP_volatile, 0x1c , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_WEP_nonvolatile, 0x1c , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_Modulation, 0x04 , NULL, NULL, NULL,0 }, - -#ifdef AWC_USE_16BIT_STATS - {&aironet4500_RID_Select_16_stats, 0xC2 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_16_stats_delta, 0xC2 , NULL, NULL, NULL,0 }, - {&aironet4500_RID_Select_16_stats_clear, 0xC2 , NULL, NULL, NULL,0 }, -#else - {NULL},{NULL},{NULL}, -#endif - - {0} - - -}; - - - -int -awc_readrid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf ){ - struct awc_command cmd; - - int sleep_state ; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_readrid "); - if (!rid) return -1; - if (!rid->selector) return -1; - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x21, rid->selector->selector, - rid->selector->selector, rid->offset, (rid->bits / 8),pBuf); - - sleep_state = cmd.priv->sleeping_bap ; - cmd.priv->sleeping_bap = 1; - udelay(500); - AWC_BAP_LOCK_NOT_CLI(cmd); - if (awc_issue_command_and_block(&cmd)) goto final; - udelay(1); - if (awc_bap_setup(&cmd)) goto final; - udelay(1); - if (awc_bap_read(&cmd)) goto final; - cmd.priv->sleeping_bap = sleep_state; - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - cmd.priv->sleeping_bap = sleep_state; - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -} - -int -awc_writerid(struct net_device * dev, struct aironet4500_RID * rid, void *pBuf){ - - struct awc_command cmd; - int sleep_state ; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_writerid "); - - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x21, rid->selector->selector, - rid->selector->selector,rid->offset, rid->bits/8,pBuf); - - sleep_state = cmd.priv->sleeping_bap ; - cmd.priv->sleeping_bap = 1; - - udelay(500); - AWC_BAP_LOCK_NOT_CLI(cmd); - if (awc_issue_command_and_block(&cmd)) goto final; - udelay(10); - if (awc_bap_setup(&cmd)) goto final; - udelay(10); - if (awc_bap_write(&cmd)) goto final; - udelay(10); - cmd.command=0x121; - if (awc_issue_command_and_block(&cmd)) goto final; - cmd.priv->sleeping_bap = sleep_state; - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - cmd.priv->sleeping_bap = sleep_state; - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -} - -int -awc_readrid_dir(struct net_device * dev, struct awc_rid_dir * rid ){ - struct awc_command cmd; - int sleep_state; - - AWC_ENTRY_EXIT_DEBUG(" entry awcreadrid_dir "); - - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x21, rid->selector->selector, - rid->selector->selector,0, rid->bufflen,rid->buff); - - sleep_state = cmd.priv->sleeping_bap ; - cmd.priv->sleeping_bap = 1; - - udelay(500); - - AWC_BAP_LOCK_NOT_CLI(cmd); - if (awc_issue_command_and_block(&cmd)) goto final; - - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_read(&cmd)) goto final; - cmd.priv->sleeping_bap = sleep_state; - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - cmd.priv->sleeping_bap = sleep_state; - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -} - -int -awc_writerid_dir(struct net_device * dev, struct awc_rid_dir * rid){ - - struct awc_command cmd; - int sleep_state ; - - - AWC_ENTRY_EXIT_DEBUG(" entry awc_writerid_dir "); - - - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x21, rid->selector->selector, - rid->selector->selector,0, rid->bufflen,((char *)rid->buff)); - - sleep_state = cmd.priv->sleeping_bap ; - cmd.priv->sleeping_bap = 1; - - udelay(500); - - AWC_BAP_LOCK_NOT_CLI(cmd); - - if (awc_issue_command_and_block(&cmd)) goto final; - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_write(&cmd)) goto final; - cmd.priv->sleeping_bap = sleep_state; - - cmd.command=0x121; - udelay(500); - if (awc_issue_command_and_block(&cmd)) goto final; - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - cmd.priv->sleeping_bap = sleep_state; - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -} - -EXPORT_SYMBOL(awc_readrid); -EXPORT_SYMBOL(awc_writerid); -EXPORT_SYMBOL(awc_readrid_dir); -EXPORT_SYMBOL(awc_writerid_dir); - -/***************************** STARTUP *******************/ - - -inline -int -awc_issue_blocking_command(struct net_device * dev,u16 comm){ - - struct awc_command cmd; -// struct awc_private * priv = (struct awc_private *)dev->priv; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_issue_blocking_command "); - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,comm,0, 0, 0, 0 ,0 ); - - AWC_BAP_LOCK_NOT_CLI(cmd); - - if (awc_issue_command_and_block(&cmd)) - goto final; - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - -}; - -int -awc_issue_soft_reset(struct net_device * dev){ - - u16 status ; -// int i= 0; - -/* outw(inw(dev->base_addr + 0x30), dev->base_addr + 0x32); - udelay(10); - outw(inw(dev->base_addr + 0x30), dev->base_addr + 0x34); - - for (i=0; i< 32; i++) - outw(0,dev->base_addr + i*2); - udelay(100); - outw(0x6,dev->base_addr + 0x34); - udelay(100); - outw(0x6,dev->base_addr + 0x34); - outw(0x6,dev->base_addr + 0x34); - WAIT61x3; - AWC_IN(dev->base_addr + 0x26); - AWC_OUT(dev->base_addr + 0x26, 0); - WAIT61x3; - udelay(60); - - - outw(0x4, dev->base_addr); - udelay(1000); - WAIT61x3; - AWC_IN(dev->base_addr + 0x26); - AWC_OUT(dev->base_addr + 0x26, 0); - WAIT61x3; - udelay(60); -*/ - - status = awc_issue_command_no_ack(dev, AWC_COMMAND_SOFT_RESET,0,0,0); - -// awc_command_busy_clear_wait(dev); - - return status; -}; - -int -awc_issue_noop(struct net_device * dev){ - int retval; - AWC_OUT(dev->base_addr + 0x28, 0); - AWC_OUT(dev->base_addr + 0x2A, 0); - udelay(1000); - retval= awc_issue_blocking_command(dev, AWC_COMMAND_NOOP); - udelay(1000); - return retval; -}; - -EXPORT_SYMBOL(awc_enable_MAC); - -int -awc_enable_MAC(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - AWC_ENTRY_EXIT_DEBUG(" entry awc_enable_MAC "); - - if (priv->mac_enabled){ - - AWC_ENTRY_EXIT_DEBUG(" mac already enabled exit \n"); - return 0; - } - udelay(500); - if (awc_issue_blocking_command(dev, AWC_COMMAND_ENABLE)){ - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - } - udelay(500); - - priv->mac_enabled = 1; - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; -}; - -EXPORT_SYMBOL(awc_disable_MAC); -int -awc_disable_MAC(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - AWC_ENTRY_EXIT_DEBUG(" entry awc_disable_MAC "); - - if (!priv->mac_enabled){ - AWC_ENTRY_EXIT_DEBUG(" mac allready disabled exit \n"); - return 0; - } - udelay(1000); - if (awc_issue_blocking_command(dev, AWC_COMMAND_DISABLE)){ - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - } - udelay(1000); - priv->mac_enabled = 0; - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; -}; - - - -int -awc_read_all_rids(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - int status,i; - AWC_ENTRY_EXIT_DEBUG(" entry awc_read_all_rids "); - - for (i=0; i< AWC_NOF_RIDS && priv->rid_dir[i].selector ; i++){ - status = awc_readrid_dir(dev,&priv->rid_dir[i]); - udelay(50); - if (status) return status; - - } - priv->rids_read = 1; - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; -} - -int -awc_write_all_rids(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - int i,status ; - AWC_ENTRY_EXIT_DEBUG(" entry awc_write_all_rids "); - - for (i=0;i < 5 && i< AWC_NOF_RIDS && priv->rid_dir[i].selector ; i++){ - status = awc_writerid_dir(dev,&priv->rid_dir[i]); - udelay(10); - if(status) return status; - } - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; -} - -/************************** FID QUEUES ****************************/ -/**************************** TX ALLOC / DEALLOC ***************/ - - - -int awc_tx_alloc(struct net_device * dev) { - - struct awc_command cmd; - int k=0; - int tot=0; - struct awc_fid * fid = NULL; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_tx_alloc "); - - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x0A,0, 0,0,0,NULL); - cmd.par0 = dev->mtu + AWC_TX_HEAD_SIZE + 8 ; - - DEBUG(32,"about to allocate %x bytes ",cmd.priv->large_buff_mem); - DEBUG(32,"in %x large buffers ",cmd.priv->large_buff_mem / (dev->mtu + AWC_TX_HEAD_SIZE + 8) ); - - k=0;tot=0; - AWC_BAP_LOCK_NOT_CLI(cmd); - - while (k < cmd.priv->large_buff_mem / (dev->mtu + AWC_TX_HEAD_SIZE + 8) ) { - - fid = kmalloc(sizeof(struct awc_fid),GFP_KERNEL ); - if (!fid) goto final; - memset(fid, 0, sizeof(struct awc_fid)); - - if (awc_issue_command_and_block(&cmd)) goto final; - - while ( awc_event_status_Alloc(cmd.port) == 0) ; - fid->u.tx.fid = awc_Tx_Allocated_Fid(cmd.port); - fid->u.tx.fid_size = dev->mtu + AWC_TX_HEAD_SIZE ; - - DEBUG(32,"allocated large tx fid %x ",fid->u.tx.fid); - if(fid->u.tx.fid == 0 - || cmd.status != 0xA){ - printk(KERN_ERR "%s bad tx_alloc\n",dev->name); - fid->busy =1; - goto final; - } else { - fid->busy =0; - tot++; - } - awc_event_ack_Alloc(cmd.port); - - // shoudlnt goto final after that - awc_fid_queue_push_tail(&cmd.priv->tx_large_ready,fid); - - k++; - } - cmd.priv->tx_buffs_total = tot; - DEBUG(32,"allocated %d large tx buffs\n",tot); - - cmd.par0 = AWC_TX_ALLOC_SMALL_SIZE ; - k =0; tot = 0; - - while (k < cmd.priv->small_buff_no) { - - fid = kmalloc(sizeof(struct awc_fid),GFP_KERNEL ); - if (!fid) goto final; - memset(fid, 0, sizeof(struct awc_fid)); - - cmd.par0 = AWC_TX_ALLOC_SMALL_SIZE ; - - if (awc_issue_command_and_block(&cmd)) goto final; - - while ( awc_event_status_Alloc(cmd.port) == 0) ; - fid->u.tx.fid = awc_Tx_Allocated_Fid(cmd.port); - fid->u.tx.fid_size = AWC_TX_ALLOC_SMALL_SIZE; - - DEBUG(32,"allocated large tx fid %x ",fid->u.tx.fid); - if(fid->u.tx.fid == 0 - || cmd.status != 0xA){ - printk(KERN_ERR "%s bad tx_alloc\n",dev->name); - fid->busy =1; - goto final; - } else { - fid->busy =0; - tot++; - } - awc_event_ack_Alloc(cmd.port); - - // shoudlnt goto final after that - awc_fid_queue_push_tail(&cmd.priv->tx_small_ready,fid); - - k++; - } - - cmd.priv->tx_small_buffs_total = tot; - DEBUG(32,"allocated %d small tx buffs\n",tot); - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - - final: - if (fid ) - kfree(fid); - printk(KERN_CRIT "%s awc tx prealloc failed \n",dev->name); - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - -}; - -int -awc_tx_dealloc_fid(struct net_device * dev,struct awc_fid * fid){ - - struct awc_command cmd; - int fid_handle = 0; - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0x0C,0, 0,0,0,NULL); - - AWC_BAP_LOCK_NOT_CLI(cmd); - - if (fid->u.tx.fid){ - fid_handle = cmd.par0 = fid->u.tx.fid; - fid->u.tx.fid = 0; - fid->busy =0; - kfree(fid); - - if (!cmd.priv->ejected) - if (awc_issue_command_and_block(&cmd)) goto final; - //awc_event_ack_Alloc(cmd.port); - } - - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - - final: - printk(KERN_ERR "awc_tx_dealloc failed for fid %x \n",fid_handle); - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - - -}; - -int -awc_tx_dealloc(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - - - -// int k=0; - struct awc_fid * fid; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_tx_dealloc "); - - while (NULL != (fid = awc_fid_queue_pop_head(&priv->tx_large_ready))) - awc_tx_dealloc_fid(dev,fid); - while (NULL != (fid = awc_fid_queue_pop_head(&priv->tx_small_ready))) - awc_tx_dealloc_fid(dev,fid); - while (NULL != (fid = awc_fid_queue_pop_head(&priv->tx_post_process))) - awc_tx_dealloc_fid(dev,fid); - while (NULL != (fid = awc_fid_queue_pop_head(&priv->tx_in_transmit))) - awc_tx_dealloc_fid(dev,fid); - - return 0; - -}; - - - -inline struct awc_fid * -awc_tx_fid_lookup_and_remove(struct net_device * dev, u16 fid_handle){ - - struct awc_private * priv = (struct awc_private *)dev->priv; -// int k = 0; - unsigned long flags; - struct awc_fid * fid = NULL; - int cnt=0; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_tx_fid_lookup "); - - spin_lock_irqsave(&(priv->queues_lock),flags); - - - fid = priv->tx_in_transmit.head; - cnt = 0; - while (fid){ - if (fid->u.tx.fid == fid_handle){ - awc_fid_queue_remove(&priv->tx_in_transmit, fid); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return fid; - } - fid = fid->next; - // printk("iT\n"); - if (cnt++ > 200) { - // printk("bbb in awc_fid_queue\n"); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return 0; - }; - }; - - cnt=0; - fid = priv->tx_post_process.head; - while (fid){ - if (fid->u.tx.fid == fid_handle){ - awc_fid_queue_remove(&priv->tx_post_process, fid); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return fid; - } - fid = fid->next; - // printk("pp\n"); - if (cnt++ > 200) { - // printk("bbb in awc_fid_queue\n"); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return 0; - }; - - }; - - cnt=0; - fid = priv->tx_large_ready.head; - while (fid){ - if (fid->u.tx.fid == fid_handle){ - awc_fid_queue_remove(&priv->tx_large_ready, fid); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return fid; - } - fid = fid->next; - // printk("lr\n"); - if (cnt++ > 200) { - // printk("bbb in awc_fid_queue\n"); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return 0; - }; - - }; - cnt=0; - fid = priv->tx_small_ready.head; - while (fid){ - if (fid->u.tx.fid == fid_handle){ - awc_fid_queue_remove(&priv->tx_small_ready, fid); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return fid; - } - fid = fid->next; - // printk("sr\n"); - if (cnt++ > 200) { - // printk("bbb in awc_fid_queue\n"); - spin_unlock_irqrestore(&(priv->queues_lock),flags); - return 0; - }; - - }; - - spin_unlock_irqrestore(&(priv->queues_lock),flags); - - printk(KERN_ERR "%s tx fid %x not found \n",dev->name, fid_handle); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return NULL; -} - - - - - -int -awc_queues_init(struct net_device * dev){ - struct awc_private * priv = (struct awc_private *)dev->priv; - struct awc_fid * fid = NULL; - int retv =0; - int k = 0; - - awc_fid_queue_init(&priv->tx_in_transmit); - awc_fid_queue_init(&priv->tx_post_process); - awc_fid_queue_init(&priv->tx_large_ready); - awc_fid_queue_init(&priv->tx_small_ready); - awc_fid_queue_init(&priv->rx_ready); - awc_fid_queue_init(&priv->rx_post_process); - - retv = awc_tx_alloc(dev); - - k = 0; - while (k < AWC_RX_BUFFS){ - fid = kmalloc(sizeof(struct awc_fid),GFP_KERNEL); - if (!fid) return -1; - awc_fid_queue_push_tail(&priv->rx_ready,fid); - k++; - }; - - if (retv) return retv; - - return 0; -}; - - -int -awc_queues_destroy(struct net_device * dev){ - struct awc_private * priv = (struct awc_private *)dev->priv; - struct awc_fid * fid = NULL; - int retv =0; - - - - while (NULL != (fid = awc_fid_queue_pop_head(&priv->rx_ready))){ - kfree(fid); - } - while (NULL != (fid = awc_fid_queue_pop_head(&priv->rx_post_process))){ - kfree(fid); - } - - retv = awc_tx_dealloc(dev); - - return retv; -}; - - - -/****************************** 802.11router ******************/ -inline int -awc_802_11_copy_path_skb(struct net_device * dev, struct awc_fid * rx_buff){ - - struct awc_private * priv = (struct awc_private * )dev->priv; - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_copy_path_skb"); - - if (rx_buff->pkt_len < 22 ) rx_buff->pkt_len = 22; - -// if (!rx_buff->skb) - rx_buff->skb = dev_alloc_skb(rx_buff->pkt_len + 12 +2); - - - if (rx_buff->skb == NULL) { - printk(KERN_CRIT "couldnt alloc rx_buff->skb in rx event \n"); - priv->stats.rx_dropped++; - return -1; - } - rx_buff->type |= p80211copy_path_skb; - - rx_buff->skb->dev = dev; - -// skb_reserve(rx_buff->skb, rx_buff->pkt_len + 12 ); - - rx_buff->u.rx.payload = skb_put(rx_buff->skb, rx_buff->pkt_len + 12 ) ; - rx_buff->u.rx.payload = ((char *)rx_buff->u.rx.payload ) +12; - - AWC_ENTRY_EXIT_DEBUG("exit\n"); - - return 0; - - -}; - - -int -awc_802_11_find_copy_path(struct net_device * dev, struct awc_fid * rx_buff){ - -// struct awc_private * priv = (struct awc_private * )dev->priv; -// u8 is_802_3 = 0; -// int i = 0; - - rx_buff->type =0; - - return awc_802_11_copy_path_skb(dev,rx_buff); -}; - - -/* called from INTERRUPT context, - - must deliver the packet to where it was meant by - awc_802_11_find_copy_path - - SHOULD be efficient and - queue the packet if operations take longer - -*/ - - -int parse_not_8023; - -void -awc_802_11_router_rx(struct net_device * dev,struct awc_fid * rx_buff){ - - struct awc_private * priv = (struct awc_private * )dev->priv; - struct sk_buff * skb = rx_buff->skb; - u8 * payload = rx_buff->u.rx.payload; -// u8 * p802_3_macs_place = payload -12; - u16 pkt_len = rx_buff->pkt_len; - struct ieee_802_11_802_1H_header * bridge = NULL; - struct ieee_802_11_snap_header * snap = NULL; - struct ieee_802_11_802_1H_header * bridge_tmp; - struct ieee_802_11_snap_header * snap_tmp; - - u16 ptr = 0; - u16 len; - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_router_rx"); - -// if (rx_buff->type & p80211_8023) - rx_buff->mac = rx_buff->u.rx.ieee_802_3.dst_mac; -// else -// rx_buff->mac = rx_buff->u.rx.ieee_802_11.mac1; - - if ( rx_buff->u.rx.ieee_802_11.frame_control == 0x8 ) - memcpy(priv->bssid,rx_buff->u.rx.ieee_802_11.mac3,6); - - while ((ptr < pkt_len - 1 ) && payload && parse_not_8023){ - - bridge_tmp = (struct ieee_802_11_802_1H_header*) &payload[ptr]; - snap_tmp = (struct ieee_802_11_snap_header*) &payload[ptr]; - len = ntohs( *((u16*)&payload[ptr]) ); - - - - if ( len < 0x5DC) { // not a protocol - - if ( len != pkt_len-2 - ptr){ - printk(KERN_ERR "%s bad encapsulation lenght %x at pkt offset %x \n",dev->name,len,ptr); - goto bad_packet; - } - DEBUG(1,"parisng packet of size %x\n",len); - ptr +=2; - continue; - } - - DEBUG(1,"parisng packet of proto %x\n",len); - - if (snap_tmp->dsap == 0xaa && snap_tmp->ssap == 0xaa && - pkt_len - ptr > sizeof(struct ieee_802_11_snap_header) ){ - - DEBUG(0x200,"%s SNAP ",dev->name); - if (snap_tmp->ctrl != 0x03){ - printk(KERN_ERR "%s unknown snap ctrl %x \n",dev->name,snap_tmp->ctrl); - goto bad_packet; - }; - if (snap_tmp->oui[0] == 0 && // LLC RFC1042 - snap_tmp->oui[1] == 0 && - snap_tmp->oui[2] == 0 ){ - snap = snap_tmp; - ptr += sizeof(struct ieee_802_11_snap_header); - DEBUG(0x200,"%s LLC RFC1042 \n",dev->name); - continue; - } - if (snap_tmp->oui[0] == 0 && // LLC 802.1H - snap_tmp->oui[1] == 0 && - snap_tmp->oui[2] == 0x78){ - snap = snap_tmp; - DEBUG(0x200,"%s LLC 802.1H \n",dev->name); - ptr += sizeof(struct ieee_802_11_snap_header); - continue; - }; - if (snap_tmp->oui[0] == 0x00 && // 802.1H itself - snap_tmp->oui[1] == 0x40 && - snap_tmp->oui[2] == 0x96){ - ptr += sizeof(struct ieee_802_11_802_1H_header); - if (ptr >= pkt_len){ - goto bad_packet; - DEBUG(1,"%s invalid packet len in 802.1H SNAP OUI check \n",dev->name); - } - DEBUG(0x200,"%s OUI 004096 \n",dev->name); - DEBUG(0x200," 802.1H uknown1 %x ",ntohs(bridge_tmp->unknown1)); - DEBUG(0x200," 802.1H uknw type %x \n",0xf000 & ntohs(bridge_tmp->unknown2)); - DEBUG(0x200," 802.1H payloadsize %x \n",0x0fff & ntohs(bridge_tmp->unknown2)); - - //goto bad_packet; // TODO - - bridge = bridge_tmp; - if (bridge_tmp->unknown1 == 0x0000 && - ((ntohs(bridge_tmp->unknown2) & 0xf000) == 0x1000 ) ){ - rx_buff->type |= p80211_8021H; - rx_buff->mac = &payload[ptr]; - DEBUG(0x200," 802.1H DATA packet of size %x\n",0xf000 & ntohs(bridge_tmp->unknown2) ); - memcpy(priv->p2p,rx_buff->u.rx.ieee_802_11.mac2, 6); - ptr +=12; - continue; - }; - DEBUG(0x200,"%s droping unknown 004096 packet \n ",dev->name); - goto bad_packet; - - - } - goto bad_packet; - } - if ( len > 0x5DC){ - // packet without linklevel header for us - - if ( len == 0x8000 || len == 0x8006){ - - DEBUG(0x200,"Non IP packet %x \n",ntohs(len)); - - }; - goto good_packet; - - }; - - goto good_packet; - } - - good_packet: - - if (ptr > pkt_len) goto bad_packet; - - if ( rx_buff->mac != (payload + ptr -12) ) - memcpy( payload +ptr -12, rx_buff->mac , 12); - - - - if (!payload || !skb || !rx_buff->skb || !rx_buff->u.rx.payload) - return ; - //skb->ip_summed = CHECKSUM_NONE; - skb->data = payload + ptr -12; - skb->len += ptr ; - - rx_buff->skb->protocol = eth_type_trans(rx_buff->skb,dev); - DEBUG(0x200,"eth_type_trans decided: %x\n",rx_buff->skb->protocol); - rx_buff->skb = NULL; - rx_buff->u.rx.payload = NULL; - priv->stats.rx_packets++; - priv->stats.rx_bytes += skb->len; - - netif_rx(skb); - dev->last_rx = jiffies; - AWC_ENTRY_EXIT_DEBUG("exit\n"); - return ; - - bad_packet: - DEBUG(0x200,"%s packet dropped in packet hdr parse \n ",dev->name); - if (rx_buff->skb && (rx_buff->type & p80211copy_path_skb)){ - - dev_kfree_skb_irq(rx_buff->skb); - rx_buff->skb = NULL; - rx_buff->u.rx.payload = NULL; - }; - - AWC_ENTRY_EXIT_DEBUG("exit\n"); - -}; - -void -awc_802_11_failed_rx_copy(struct net_device * dev,struct awc_fid * rx_buff){ - struct awc_private * priv = (struct awc_private * )dev->priv; - - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_failed_rx_copy"); - if (rx_buff->skb) - dev_kfree_skb_irq(rx_buff->skb); - rx_buff->skb = NULL; - rx_buff->u.rx.payload = NULL; - priv->stats.rx_errors++; - - - AWC_ENTRY_EXIT_DEBUG("exit\n"); -}; - -/* - called from kernel->driver tx routine - must decide where and how to post the packet - must post the packet to wherever it decides - either copy to card or enqueue to destination queue - -*/ - - -int -awc_802_11_tx_find_path_and_post(struct net_device * dev, - struct sk_buff * skb){ - - - struct awc_private * priv = (struct awc_private * )dev->priv; - int i; - int len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; /* check min length*/ - struct awc_fid * fid = NULL; -// u16 saved_fid ; - u16 p2p_direct =priv->p2p_found; - struct iphdr * ip_hdr; - //buffer = skb->data; - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_tx_find_path_and_post"); - - // netif_stop_queue(dev); - DOWN(&priv->tx_buff_semaphore); - if (len > dev->mtu + 16 ) { - printk(KERN_ERR "%s packet size too large %d \n",dev->name, len); - goto final; - } - - if (len + AWC_TX_HEAD_SIZE < AWC_TX_ALLOC_SMALL_SIZE ) - fid = awc_fid_queue_pop_head(&priv->tx_small_ready); - - if (!fid) - fid = awc_fid_queue_pop_head(&priv->tx_large_ready); - - if (!fid) { - DEBUG(32,"%s buffs in use \n",dev->name); - goto no_space; - } -/* - if (fid->u.tx.fid_size < len + AWC_TX_HEAD_SIZE){ - awc_fid_queue_push_tail(&priv->tx_small_ready, fid); - fid = awc_fid_queue_pop_head(&priv->tx_large_ready); - } -*/ - if (!fid) { - DEBUG(32,"%s buffs in use \n",dev->name); - goto no_space; - } - - if (fid->u.tx.fid_size < len + AWC_TX_HEAD_SIZE - 14){ - printk(KERN_ERR "found too small tx fid size %d, pktlen %d \n",fid->u.tx.fid_size, len); - } - memset(&fid->u.tx.radio_tx, 0,sizeof(struct aironet4500_radio_tx_header)); - memset(&fid->u.tx.ieee_802_11, 0,sizeof(struct ieee_802_11_header)); - memset(&fid->u.tx.ieee_802_3, 0,sizeof(struct ieee_802_3_header)); - fid->u.tx.payload =NULL; - fid->u.tx.gap_length =0; - fid->busy = 1; - - - priv->tx_buffs_in_use++; - DEBUG(32,"found large buff %x \n",fid->u.tx.fid); - -/* - fid->type |= p80211_llc_snap; - fid->snap.dsap = 0xaa; - fid->snap.ssap = 0xaa; - fid->snap.ctrl = 0x03; - fid->snap.oui[0] = 0x0; - fid->snap.oui[1] = 0x0; - fid->snap.oui[2] = 0x0; -*/ - fid->skb = skb; - - - if (priv->p2p_uc && !priv->p2p_found){ // we go without encapsulation to neighbour; - - for (i=0; i < 6; i++) - if (priv->p2p[i] != skb->data[i]){ - p2p_direct = 1; - break; - } - }; - - if (priv->force_tx_rate == 2 || priv->force_tx_rate == 4 || - priv->force_tx_rate== 11 || priv->force_tx_rate == 22){ - fid->u.tx.radio_tx.tx_bit_rate = priv->force_tx_rate; - } else if (priv->force_tx_rate != 0 ) { - printk(KERN_ERR "wrong force_tx_rate=%d changed to default \n", priv->force_tx_rate); - priv->force_tx_rate = 0; - }; - fid->u.tx.radio_tx.TX_Control = - aironet4500_tx_control_tx_ok_event_enable | - aironet4500_tx_control_tx_fail_event_enable | - aironet4500_tx_control_no_release; - - if (len < priv->force_rts_on_shorter){ - fid->u.tx.radio_tx.TX_Control |= - aironet4500_tx_control_use_rts; - }; - - ip_hdr = (struct iphdr * ) ((( char * ) skb->data) + 14); - if (ip_hdr && skb->data[12] == 0x80 ){ - if (ip_hdr->tos & IPTOS_RELIABILITY && priv->ip_tos_reliability_rts) - fid->u.tx.radio_tx.TX_Control |= - aironet4500_tx_control_use_rts; - if (ip_hdr->tos & IPTOS_THROUGHPUT && priv->ip_tos_troughput_no_retries) - fid->u.tx.radio_tx.TX_Control |= - aironet4500_tx_control_no_retries; - }; - - if (priv->p802_11_send || memcmp(dev->dev_addr, skb->data +6, 6) ){ - fid->u.tx.radio_tx.TX_Control |= - aironet4500_tx_control_header_type_802_11; - DEBUG(0x200,"%s bridging, forcing 802_11 send \n ",dev->name); - } - - - if (!priv->p2p_uc || p2p_direct) { - if ((fid->u.tx.radio_tx.TX_Control & - aironet4500_tx_control_header_type_802_11 )){ - - // including 802.3 header into 802.11 packet - fid->u.tx.radio_tx.PayloadLength = len -12; - fid->u.tx.ieee_802_3.payload_length = len -12 ; - fid->pkt_len = len -12; - fid->u.tx.payload = skb->data +12; - - if (priv->simple_bridge){ - memcpy(fid->u.tx.ieee_802_11.mac1,skb->data,6); - memcpy(fid->u.tx.ieee_802_11.mac2,skb->data +6,6); - memcpy(fid->u.tx.ieee_802_11.mac3,priv->status.CurrentBssid ,6); - memset(fid->u.tx.ieee_802_11.mac4,0,6); - fid->u.tx.ieee_802_11.frame_control = 0x8; - fid->u.tx.ieee_802_11.gapLen=6; - } else { - memcpy(fid->u.tx.ieee_802_11.mac1,skb->data,6); - memcpy(fid->u.tx.ieee_802_11.mac2,dev->dev_addr,6); - memcpy(fid->u.tx.ieee_802_11.mac3,skb->data +6 ,6); - memset(fid->u.tx.ieee_802_11.mac4,0 ,6); - fid->u.tx.ieee_802_11.frame_control = 0x108; - fid->u.tx.ieee_802_11.gapLen=6; - } - } else { // plain old 802.3, with hdr copied - fid->u.tx.radio_tx.PayloadLength = len -12; - fid->u.tx.ieee_802_3.payload_length = len -12; - fid->pkt_len = len - 12; - fid->u.tx.payload = skb->data +12; - }; - memcpy(fid->u.tx.ieee_802_3.dst_mac,skb->data, 12); - DEBUG(0x200,"%s tx simply 802.3 type \n ",dev->name); - - } else {// 802.1H bridgeing - fid->type |= p80211_8021H; - fid->bridge_size = len + sizeof(fid->bridge) ; - fid->bridge.dsap = 0xaa; - fid->bridge.ssap = 0xaa; - fid->bridge.ctrl = 0x03; - fid->bridge.oui[0] = 0x0; - fid->bridge.oui[1] = 0x40; - fid->bridge.oui[2] = 0x96; - fid->bridge.unknown1= 0x0000; - fid->bridge.unknown2= htons((len) & 0x1000); - fid->u.tx.radio_tx.PayloadLength = fid->bridge_size + 2; - fid->u.tx.ieee_802_3.payload_length = fid->u.tx.radio_tx.PayloadLength ; - - - fid->u.tx.payload = skb->data +12; - if ((fid->u.tx.radio_tx.TX_Control & - aironet4500_tx_control_header_type_802_11 )){ - - memcpy(fid->u.tx.ieee_802_11.mac1,priv->p2p,6); - memcpy(fid->u.tx.ieee_802_11.mac2,skb->data +6,6); - memcpy(fid->u.tx.ieee_802_11.mac3,priv->bssid ,6); - memset(fid->u.tx.ieee_802_11.mac4,0,6); - fid->u.tx.ieee_802_11.gapLen=6; - - fid->u.tx.ieee_802_11.frame_control = 0x8; - } - memcpy(fid->u.tx.ieee_802_3.dst_mac,priv->p2p, 6); - memcpy(fid->u.tx.ieee_802_3.src_mac,dev->dev_addr, 6); - fid->u.tx.payload = skb->data + 2 + sizeof(fid->bridge); - fid->pkt_len = len ; - - DEBUG(0x200,"%s tx simply 802.1H type \n ",dev->name); - - }; - - priv->stats.tx_bytes += fid->u.tx.ieee_802_3.payload_length; - priv->stats.tx_packets++; - - - awc_fid_queue_push_tail(&priv->tx_in_transmit,fid); - udelay(1); - awc_transmit_packet(dev,fid); - if (priv->tx_large_ready.size <= 2 || priv->tx_small_ready.size <= 2 ){ - if (netif_running(dev)) - netif_stop_queue(dev); - } else { - if (netif_running(dev)) - netif_wake_queue(dev); - } - UP(&priv->tx_buff_semaphore); - AWC_ENTRY_EXIT_DEBUG("exit\n"); - return 0; - - - no_space: - DEBUG(32,"%s tx buffs not found \n ",dev->name); - #ifdef AWC_DEBUG -// printk("s"); - #endif - netif_stop_queue (dev); //weell, here it must be set anyway and before - //priv->stats.tx_fifo_errors++; - UP(&priv->tx_buff_semaphore); - AWC_ENTRY_EXIT_DEBUG("NoSpaceExit\n"); - return 1 ; - final: - priv->stats.tx_errors++; - UP(&priv->tx_buff_semaphore); - if (!netif_running(dev)) - netif_start_queue(dev); - dev_kfree_skb(skb); - AWC_ENTRY_EXIT_DEBUG("BADExit\n"); - return -1; - -}; - -/* - called from low level driver->card tx copy routine - probably wants to free skbuf if failed transmits won't be - resubmitted to another device (if more than one path) - or tried again (if tx buffer in card needs to be filled again) -*/ - - -void -awc_802_11_after_tx_packet_to_card_write(struct net_device * dev, - struct awc_fid * tx_buff){ - - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_tx_packet_to_card_write"); - - if (!tx_buff){ - DEBUG(1,"%s no damn tx_buff in awc_802_11_after_tx_packet_to_card_write \n",dev->name); - }; - - if(tx_buff->skb){ - dev_kfree_skb(tx_buff->skb); - tx_buff->skb = NULL; - } - - AWC_ENTRY_EXIT_DEBUG("exit\n"); -}; - -/* - called from low level driver->card tx copy routine - probably wants to free skbuf if failed writes won't be - resubmitted to another device (if more than one path) - or tried again (if tx buffer in card needs to be filled again) -*/ - -void -awc_802_11_after_failed_tx_packet_to_card_write(struct net_device * dev, - struct awc_fid * tx_buff){ - struct awc_private * priv = (struct awc_private *)dev->priv; - - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_failed_tx_packet_to_card_write"); - - if (!tx_buff){ - DEBUG(1,"%s no damn tx_buff in awc_802_11_after_failed_tx_packet_to_card_write \n",dev->name); - }; - - if(tx_buff->skb){ - dev_kfree_skb(tx_buff->skb); - tx_buff->skb = NULL; - tx_buff->busy =0; - printk(KERN_ERR "%s packet to card write failed \n",dev->name); - } - - awc_fid_queue_remove(&priv->tx_in_transmit,tx_buff); - - if (tx_buff->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE) - awc_fid_queue_push_tail(&priv->tx_small_ready,tx_buff); - else - awc_fid_queue_push_tail(&priv->tx_large_ready,tx_buff); - - AWC_ENTRY_EXIT_DEBUG("exit\n"); - -}; - -inline void -awc_802_11_after_tx_complete(struct net_device * dev, struct awc_fid * tx_buff){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - - AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_tx_complete"); - - DEBUG(32,"tx complete status %x \n ",tx_buff->u.tx.radio_tx.Status); - - #ifdef AWC_DEBUG - if (tx_buff->u.tx.radio_tx.Status) - printk("tf%x ",tx_buff->u.tx.radio_tx.Status); - #endif - if (tx_buff->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE){ - awc_fid_queue_push_tail(&priv->tx_small_ready,tx_buff); - priv->tx_small_buffs_in_use--; - } else { - awc_fid_queue_push_tail(&priv->tx_large_ready,tx_buff); - priv->tx_buffs_in_use--; - } - - tx_buff->busy = 0; -// netif_wake_queue (dev); - - AWC_ENTRY_EXIT_DEBUG("exit\n"); -}; - - - - -/******************************** R X ***********************/ - - - -inline int -awc_receive_packet(struct net_device * dev){ - - struct awc_command cmd; - u16 Fid; -// struct sk_buff *skb = NULL; - struct awc_fid * rx_buff; - - - struct awc_private * priv ; - int i; - - priv= (struct awc_private *)dev->priv; - rx_buff = priv->rx_ready.head ; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_receive_packet "); - - Fid = awc_Rx_Fid(dev->base_addr); - - DEBUG(128," RX FID %x \n",Fid); - - if (!Fid){ - printk(KERN_CRIT "No RxFid when rx event \n"); - return -1; - } - - - - if (!rx_buff){ - printk(KERN_CRIT "No rx_buff in rx event \n"); - return -1; - } - - rx_buff->type = 0; - - - AWC_INIT_COMMAND(AWC_CLI,cmd,dev,0,0, - Fid, 0, 0x14 , &(rx_buff->u.rx.radio_rx)); - - -// header reading , order is important - AWC_BAP_LOCK_UNDER_CLI(cmd); - - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_read(&cmd)) goto final; - - DEBUG(128, "rx receive radio header, length %x \n",rx_buff->u.rx.radio_rx.PayloadLength); - - cmd.buff = &(rx_buff->u.rx.ieee_802_11); - cmd.len = 0x20; - - if (awc_bap_read(&cmd)) goto final; - - DEBUG(128, "rx receive 802_11 header, framecontrol %x \n",rx_buff->u.rx.ieee_802_11.frame_control); - - if (rx_buff->u.rx.ieee_802_11.gapLen > 8) { - printk(KERN_ERR "%s: 802.11 gap lenght huge %d \n",dev->name,rx_buff->u.rx.ieee_802_11.gapLen); - goto final; - } - DEBUG(128,"SeqCtl %x, 802_11 macs: ",rx_buff->u.rx.ieee_802_11.SeqCtl); - if (awc_debug & 0x7000){ - DEBUG(0x7000, " %s mac1 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac1[i] )) ; - DEBUG(0x7000, " %s mac2 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac2[i] )) ; - DEBUG(0x7000, " %s mac3 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac3[i] )) ; - DEBUG(0x7000, " %s mac4 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac4[i] )) ; - } - DEBUG(128,"\n GapLen %d ",rx_buff->u.rx.ieee_802_11.gapLen ); - - if (rx_buff->u.rx.ieee_802_11.gapLen > 0) { - cmd.buff = rx_buff->u.rx.ieee_802_11.gap; - cmd.len = rx_buff->u.rx.ieee_802_11.gapLen; - if (awc_bap_read(&cmd)) goto final; - DEBUG(128, "rx receive gap header , gap length %x \n",rx_buff->u.rx.gap_length); - } - for (i = 0; i < rx_buff->u.rx.ieee_802_11.gapLen ; i++) DEBUG(128,"%x",((unsigned char)rx_buff->u.rx.ieee_802_11.gap[i] )) ; - - - if ( !(priv->config.ReceiveMode & RXMODE_DISABLE_802_3_HEADER ) - ){ - cmd.buff = &(rx_buff->u.rx.ieee_802_3); - cmd.len = 0x10; - rx_buff->type |= p80211_8023; - if (awc_bap_read(&cmd)) goto final; - DEBUG(128, "rx receive 802_3 header, payload length %x \n",rx_buff->u.rx.ieee_802_3.payload_length); - DEBUG(128,"\n 802_3 status %x ",rx_buff->u.rx.ieee_802_3.status ); - DEBUG(128," RX payloadLen %x, dst,src: ",rx_buff->u.rx.ieee_802_3.payload_length); - if (awc_debug & 0x7000){ - for (i = 0; i < 6; i++) printk("%02x:",((unsigned char)rx_buff->u.rx.ieee_802_3.dst_mac[i] )) ; - for (i = 0; i < 6; i++) printk("%02x:",((unsigned char)rx_buff->u.rx.ieee_802_3.src_mac[i] )) ; - } - }; - - rx_buff->pkt_len = rx_buff->u.rx.radio_rx.PayloadLength; - - if (priv->config.OperatingMode & MODE_LLC_HOST) - rx_buff->type |= p80211_llc_snap; - - - if (awc_802_11_find_copy_path(dev,rx_buff)) goto final; - - - if (rx_buff->u.rx.payload ){ - cmd.buff = rx_buff->u.rx.payload; - cmd.len = rx_buff->pkt_len; - if (awc_bap_read(&cmd)) goto final; - DEBUG(128, "rx payload read %x \n",rx_buff->u.rx.ieee_802_3.payload_length); - }; - - AWC_RELEASE_COMMAND(cmd); - - DEBUG(128,"\n payload hdr %x ",rx_buff->u.rx.ieee_802_3.status ); - if (awc_debug && rx_buff->u.rx.payload) - for (i = 0; i < 20; i++) DEBUG(128,"%x",((unsigned char)rx_buff->u.rx.payload[i] )) ; - DEBUG(128,"%c",'\n'); - - awc_802_11_router_rx(dev,rx_buff); - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - - awc_802_11_failed_rx_copy(dev,rx_buff); - // if (skb) dev_kfree_skb(skb, FREE_WRITE); - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - -}; - - -int -awc_transmit_packet(struct net_device * dev, struct awc_fid * tx_buff) { - - struct awc_command cmd; - u16 size ; -// unsigned long flags; - int i; - struct awc_private * priv= (struct awc_private *)dev->priv; - - AWC_ENTRY_EXIT_DEBUG(" entry awc_transmit_packet "); - - if (priv->link_status_changed ){ - priv->link_status_changed =0; - awc_readrid_dir(dev,&priv->rid_dir[7]); - } - - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0xB, tx_buff->u.tx.fid, - tx_buff->u.tx.fid, 0, 0x14 , &(tx_buff->u.tx.radio_tx)); - - AWC_BAP_LOCK_NOT_CLI(cmd); - -#ifdef AWC_BY_BOOK -#warning By books is bad, AWC_BY_BOOK -#error cli sti bad here - if ( !(tx_buff->type &(p80211_llc_snap|p80211_8021H) ) - && !(tx_buff->u.tx.radio_tx.TX_Control & - aironet4500_tx_control_header_type_802_11 )){ - - cmd.buff=&(tx_buff->u.tx.radio_tx.TX_Control); - cmd.len = 0x2 ; - cmd.offset = 0x8; - save_flags(flags); - cli(); - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_write(&cmd)) goto final; - - cmd.buff=&(tx_buff->u.tx.ieee_802_3.payload_length); - cmd.len = 14; - cmd.offset = 0x36; - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_write(&cmd)) goto final; - restore_flags(flags); - - } else { -#endif - - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_write(&cmd)) goto final; - - DEBUG(64," wrote radio tx header for fid %x \n",tx_buff->u.tx.fid); - - // 802.11 - cmd.buff=&(tx_buff->u.tx.ieee_802_11); - cmd.len = 0x20; - if (awc_bap_write(&cmd)) goto final; - - // Gap - if (tx_buff->u.tx.ieee_802_11.gapLen) { - cmd.buff=&(tx_buff->u.tx.ieee_802_11.gap); - cmd.len = tx_buff->u.tx.ieee_802_11.gapLen; - if (awc_bap_write(&cmd)) goto final; - } - // 802.3 - if ( ! (tx_buff->u.tx.radio_tx.TX_Control & - aironet4500_tx_control_header_type_802_11 )){ - - cmd.buff=&(tx_buff->u.tx.ieee_802_3); - if (awc_debug & 0x7000){ - printk("%s TX dst ",dev->name); - for (i=0; i < 6; i++) printk ("%02x:",(unsigned char) tx_buff->u.tx.ieee_802_3.dst_mac[i]); - printk(" src "); - for (i=0; i < 6; i++) printk ("%02x:",(unsigned char) tx_buff->u.tx.ieee_802_3.src_mac[i]); - printk(" \n "); - } - cmd.len = 0x10; - if (awc_bap_write(&cmd)) goto final; - }; - - if (tx_buff->type & p80211_llc_snap) { - cmd.buff= & tx_buff->snap; - cmd.len = sizeof(tx_buff->snap); - if (awc_bap_write(&cmd)) goto final; - }; - - if (tx_buff->type & p80211_8021H) { - size = htons(tx_buff->bridge_size); - // size = tx_buff->bridge_size;// to seasure raw speed of f** UC - cmd.buff= & size; - cmd.len = 2 ; - if (awc_bap_write(&cmd)) goto final; - - cmd.buff= & tx_buff->bridge; - cmd.len = sizeof(tx_buff->bridge); - if (awc_bap_write(&cmd)) goto final; - }; - -#ifdef AWC_BY_BOOK - - } -#endif - cmd.buff= tx_buff->u.tx.payload; - cmd.len = tx_buff->pkt_len; - - if (awc_bap_write(&cmd)) goto final; - AWC_RELEASE_COMMAND(cmd); -// locking probs, these two lines below and above, swithc order - if (awc_issue_command_and_block(&cmd)) goto final_unlocked; - - - tx_buff->transmit_start_time = jiffies; - awc_802_11_after_tx_packet_to_card_write(dev,tx_buff); - // issue the transmit command - - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - final: - awc_802_11_after_failed_tx_packet_to_card_write(dev,tx_buff); - printk(KERN_CRIT "%s awc tx command failed \n",dev->name); - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - - final_unlocked: - awc_802_11_after_failed_tx_packet_to_card_write(dev,tx_buff); - printk(KERN_CRIT "%s awc tx command failed \n",dev->name); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; - -} - - -inline int -awc_tx_complete_check(struct net_device * dev){ - - struct awc_fid * fid; - struct awc_command cmd; - - - AWC_ENTRY_EXIT_DEBUG(" entry awc_tx_complete_check "); - - - - fid = awc_fid_queue_pop_head(&((struct awc_private *)dev->priv)->tx_post_process); - - if (!fid) { - printk("awc_tx_complete_check with empty queue \n "); - return -1; - } - - DEBUG(64," tx_complete fid %x \n",fid->u.tx.fid); - - AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0,0, fid->u.tx.fid, - 0, 0x14 , &(fid->u.tx.radio_tx)); - - fid->state |= awc_tx_fid_complete_read; - - AWC_BAP_LOCK_NOT_CLI(cmd); - if (awc_bap_setup(&cmd)) goto final; - if (awc_bap_read(&cmd)) goto final; - AWC_RELEASE_COMMAND(cmd); - - awc_802_11_after_tx_complete(dev,fid); - - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - return 0; - - final: - awc_802_11_after_tx_complete(dev,fid); - printk(KERN_ERR "%s awc_tx_complete_check failed \n",dev->name); - AWC_RELEASE_COMMAND(cmd); - AWC_ENTRY_EXIT_DEBUG(" BAD exit \n"); - return -1; ; -} - - -#define AWC_QUEUE_BH {\ - if (!priv->work_active && !priv->work_running){\ - priv->work_active = 1;\ - schedule_work(&priv->work); \ - }\ - } - - -void -awc_bh(struct net_device *dev){ - - struct awc_private * priv = (struct awc_private *)dev->priv; - int active_interrupts; - int enabled_interrupts; -// u16 tx_status; - int multi_ints = 0; -// u16 tx_fid = 0; -// unsigned long flags; - - DEBUG(8, "awc_bh awoken on jiffie %ld \n",jiffies); - - priv->work_running = 1; - - active_interrupts = awc_event_status(dev->base_addr); - - enabled_interrupts = awc_ints_enabled(dev->base_addr); - - DEBUG(8, "awc_bh active ints %x \n",active_interrupts); - - if (test_and_set_bit( 0, (void *) &priv->tx_chain_active) ) { -// printk(KERN_ERR "tx chain active in bh \n"); -// schedule_work(&priv->work); - goto bad_end; - } -start: - if (active_interrupts == 0xffff){ - - printk(KERN_CRIT "%s device ejected in interrupt, disabling\n",dev->name); - netif_device_detach (dev); - if (priv->command_semaphore_on){ - priv->command_semaphore_on--; - AWC_UNLOCK_COMMAND_ISSUING(priv); - } - priv->tx_chain_active =0; - goto bad_end; - - } - - if (priv->unlock_command_postponed ){ - - priv->unlock_command_postponed-- ; - if( priv->command_semaphore_on ){ - - awc_read_response((&priv->cmd)); - priv->async_command_start = 0; - if (priv->command_semaphore_on){ - - priv->command_semaphore_on--; - AWC_UNLOCK_COMMAND_ISSUING(priv); - } - } - }; - -/* if ( active_interrupts & 0x1 ){ - awc_receive_packet(dev) ; - awc_event_ack_Rx(dev->base_addr); - priv->waiting_interrupts &= ~0x1; - } -*/ - while (priv->tx_post_process.size) - if (awc_tx_complete_check(dev)) break; - - active_interrupts = awc_event_status(dev->base_addr); - - if (priv->command_semaphore_on || priv->tx_post_process.size){ - if (multi_ints++ < 10000){ - goto start; - } - }; - priv->work_active = 0; - priv->work_running = 0; - - priv->tx_chain_active = 0; - - - - bad_end: -// if (!priv->tx_chain_active) -// wake_up(&priv->tx_chain_wait_queue); - - priv->work_running = 0; - priv->work_active = 0; - return ; -}; - - -inline int -awc_interrupt_process(struct net_device * dev){ - - struct awc_private * priv ; - int active_interrupts; - int enabled_interrupts; - u16 tx_status; - int multi_ints = 0; - u16 tx_fid = 0; -// u16 ints_to_ack =0; - struct awc_fid * fid = NULL; -// int interrupt_reenter = 0; -// unsigned long flags; - -// save_flags(flags); -// cli(); - // here we need it, because on 2.3 SMP there are truly parallel irqs - disable_irq(dev->irq); - - DEBUG(2," entering interrupt handler %s ",dev->name); - - if (!dev) { - printk(KERN_ERR "No dev in interrupt \n"); - goto bad_end; - }; - - priv = (struct awc_private *)dev->priv; - - if (!priv) { - printk(KERN_ERR "No PRIV in interrupt \n"); - goto bad_end; - }; - - - enabled_interrupts = awc_ints_enabled(dev->base_addr); - active_interrupts = awc_event_status(dev->base_addr); - - DEBUG(2,"entry: processing interrupts waiting %x \n",priv->waiting_interrupts); - DEBUG(2,"entry: processing interrupts active %x \n",active_interrupts); - DEBUG(2,"entry: processing interrupts enabled %x \n",enabled_interrupts); -// printk("ikka interruptis\n"); - - - priv->interrupt_count++; - if (priv->interrupt_count > 1 ) - printk(" interrupt count on\n "); - - - - if (priv->waiting_interrupts & active_interrupts) - printk(KERN_ERR "double interrupt waiting %x active %x \n", - priv->waiting_interrupts, active_interrupts); - - // priv->waiting_interrupts |= active_interrupts; - - - - - -start: - DEBUG(2,"Start processing int, times %d\n",multi_ints); - - if (active_interrupts == 0xffff){ - - printk(KERN_CRIT "%s device ejected, got interrupt, disabling\n",dev->name); - //priv-> - netif_device_detach (dev); - priv->ejected = 1; - if (priv->work_active || priv->work_running){ - priv->interrupt_count--; - goto bad_end; - } else if (priv->command_semaphore_on){ - - printk(KERN_ERR "ejected, last BH fired \n"); - - AWC_QUEUE_BH; - } - priv->interrupt_count--; - goto bad_end; - } - - - - if (active_interrupts & 0x100 ){ - awc_event_ack_Awaken(dev->base_addr); - udelay(10); - DEBUG(1,"%s device awoke \n",dev->name); - priv->waiting_interrupts &= ~0x100; - }; - if (active_interrupts & 0x80 ){ - - priv->link_status = awc_Link_Status(dev->base_addr); - DEBUG(1,"link status changed %x \n",priv->link_status); - awc_event_ack_Link(dev->base_addr); - priv->waiting_interrupts &= ~0x80; - if(priv->link_status == 0x400) - printk(KERN_INFO "%s Associated\n",dev->name ); - else { - printk(KERN_INFO "%s Link status change : %s \n",dev->name, awc_print_string(awc_link_status_names, priv->link_status) ); - if ( priv->link_status & 0x8100 || - priv->link_status & 0x0100 || - priv->link_status & 0x8200 || - priv->link_status & 0x8400 || - priv->link_status & 0x0300 ) - printk(KERN_INFO "%s Link status change reason : %s \n",dev->name, awc_print_string(awc_link_failure_reason_names, priv->link_status & 0xff) ); - - } - }; - - - if (active_interrupts & 0x10 & enabled_interrupts ){ - -// printk(KERN_ERR "cmd int shouldnt be active in interrupt routine\n"); - - awc_event_ack_Cmd(priv->cmd.port); - - if ( priv->enabled_interrupts & 0x10) - priv->enabled_interrupts &= ~0x10; - - enabled_interrupts = awc_ints_enabled(dev->base_addr); - - if (enabled_interrupts & 0x10){ - awc_ints_enable(dev->base_addr, enabled_interrupts & ~0x10); - } - - if (priv->command_semaphore_on){ - priv->unlock_command_postponed++; - - AWC_QUEUE_BH; - } - } - - if ((active_interrupts & 0x10) && !(0x10 & enabled_interrupts) ){ - -// printk(KERN_ERR "%s: aironet4500: cmd int shouldnt be active in interrupt routine\n",dev->name); - - //awc_event_ack_Cmd(priv->cmd.port); - } - - -// active_interrupts = awc_event_status(dev->base_addr); - - tx_status = active_interrupts & 0x6 ; - - - - if (tx_status) { - - tx_fid = awc_Tx_Compl_Fid(dev->base_addr); - if (!tx_fid){ - udelay(10); - tx_fid = awc_Tx_Compl_Fid(dev->base_addr); - } - if (!tx_fid) - printk(KERN_ERR "No tx fid when tx int active\n"); - - fid = awc_tx_fid_lookup_and_remove(dev, tx_fid); - - if (fid) { - if (priv->process_tx_results) { - awc_fid_queue_push_tail(&priv->tx_post_process,fid); - AWC_QUEUE_BH; - }else { - if (fid->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE) - awc_fid_queue_push_tail(&priv->tx_small_ready,fid); - else - awc_fid_queue_push_tail(&priv->tx_large_ready,fid); - netif_wake_queue (dev); - } - } else - printk(KERN_ERR "awc fid %x not found\n",tx_fid); - - - if (tx_status & 2){ - awc_event_ack_Tx(dev->base_addr); - priv->stats.tx_packets++; - priv->waiting_interrupts &= ~0x2; - } - if (tx_status & 4){ - priv->stats.tx_errors++; - awc_event_ack_TxExc(dev->base_addr); - priv->waiting_interrupts &= ~0x4; - } - if ((tx_status&6) == 6) - printk(KERN_NOTICE "%s: both tx and txExc up\n",dev->name); - - - } - -// active_interrupts = awc_event_status(dev->base_addr); - - if ( active_interrupts & 0x1 ){ - awc_receive_packet(dev); - awc_event_ack_Rx(dev->base_addr); - priv->waiting_interrupts &= ~0x1; - } - - active_interrupts = awc_event_status(dev->base_addr); - - if ((active_interrupts & 0x7) && - !priv->work_active && - !priv->work_running ){ - if (multi_ints++ < 5) - goto start; - } - if (multi_ints >=5 ) - printk(KERN_ERR "%s multi_ints > 5 interrupts still active %x\n",dev->name,active_interrupts); - - - priv->interrupt_count--; - - awc_ints_enable(dev->base_addr, 0x0000); - - - DEBUG(0x8, " enabling ints in interrupt_process %x \n", - priv->enabled_interrupts & ~priv->waiting_interrupts); - - - - AWC_ENTRY_EXIT_DEBUG(" exit \n"); - - awc_ints_enable(dev->base_addr, - priv->enabled_interrupts); - -//end_here: - - enable_irq(dev->irq); -// restore_flags(flags); - - return 0; - -bad_end: - AWC_ENTRY_EXIT_DEBUG(" bad_end exit \n"); - enable_irq(dev->irq); -// restore_flags(flags); - return -1; - - -}; - -static const char *aironet4500_core_version = -"aironet4500.c v0.1 1/1/99 Elmer Joandi, elmer@ylenurme.ee.\n"; - -struct net_device * aironet4500_devices[MAX_AWCS]; - -int awc_debug; // 0xffffff; -static int p802_11_send; // 1 - -static int awc_process_tx_results; -int tx_queue_len = 10; -int tx_rate; -int channel = 5; -//static int tx_full_rate; -int max_mtu = 2312; -int adhoc; -int large_buff_mem = 1700 * 10; -int small_buff_no = 20; -int awc_full_stats; -char SSID[33]; -int master; -int slave; -int awc_simple_bridge; -// int debug =0; - -#if LINUX_VERSION_CODE >= 0x20100 - -MODULE_PARM(awc_debug,"i"); -MODULE_PARM(tx_rate,"i"); -MODULE_PARM(channel,"i"); -//MODULE_PARM(tx_full_rate,"i"); -MODULE_PARM(adhoc,"i"); -MODULE_PARM(master,"i"); -MODULE_PARM(slave,"i"); -MODULE_PARM(awc_simple_bridge,"i"); -MODULE_PARM(max_mtu,"i"); -MODULE_PARM(large_buff_mem,"i"); -MODULE_PARM(small_buff_no,"i"); -MODULE_PARM(SSID,"c33"); -MODULE_PARM_DESC(awc_debug,"Aironet debug mask"); -MODULE_PARM_DESC(channel,"Aironet "); -MODULE_PARM_DESC(adhoc,"Aironet Access Points not available (0-1)"); -MODULE_PARM_DESC(master,"Aironet is Adhoc master (creates network sync) (0-1)"); -MODULE_PARM_DESC(slave,"Aironet is Adhoc slave (0-1)"); -MODULE_PARM_DESC(max_mtu,"Aironet MTU limit (256-2312)"); -#endif -MODULE_LICENSE("GPL"); - - -/*EXPORT_SYMBOL(tx_queue_len); -EXPORT_SYMBOL(awc_debug); - */ -EXPORT_SYMBOL(awc_init); -EXPORT_SYMBOL(awc_open); -EXPORT_SYMBOL(awc_close); -EXPORT_SYMBOL(awc_reset); -EXPORT_SYMBOL(awc_config); - -EXPORT_SYMBOL(aironet4500_devices); -EXPORT_SYMBOL(awc_debug); -//EXPORT_SYMBOL(); - -EXPORT_SYMBOL(awc_private_init); -EXPORT_SYMBOL(awc_tx_timeout); -EXPORT_SYMBOL(awc_start_xmit); -EXPORT_SYMBOL(awc_interrupt); -EXPORT_SYMBOL(awc_get_stats); -EXPORT_SYMBOL(awc_change_mtu); -EXPORT_SYMBOL(awc_set_multicast_list); - -EXPORT_SYMBOL(awc_proc_set_fun); -EXPORT_SYMBOL(awc_proc_unset_fun); -EXPORT_SYMBOL(awc_register_proc); -EXPORT_SYMBOL(awc_unregister_proc); - - -/*************************** RESET INIT CONFIG ***********************/ - - - void awc_reset(struct net_device *dev) -{ - - long long jiff; - - DEBUG(2, " awc_reset dev %p \n", dev); - DEBUG(2, "%s: awc_reset \n", dev->name); - - awc_issue_soft_reset(dev); - - jiff = jiffies; - udelay(1000); - while (awc_command_read(dev->base_addr)){ - udelay(1000); - if (jiffies - jiff > 5*HZ){ - printk(KERN_CRIT "%s bad reset\n",dev->name); - break; - } - }; - -} - - int awc_config(struct net_device *dev) -{ -// struct awc_private *priv = (struct awc_private *)dev->priv; - - DEBUG(2, "%s: awc_config \n", dev->name); - - - if( awc_disable_MAC(dev)) goto final; - udelay(100); - if( awc_write_all_rids(dev) ) goto final; - udelay(100); - if( awc_enable_MAC(dev)) goto final; - - return 0; - final: - return -1; -} - - -char name[] = "ElmerLinux"; - - int awc_init(struct net_device *dev){ - struct awc_private *priv = (struct awc_private *)dev->priv; - int i; - const char * radioType; - - DEBUG(2, "%s: awc_init \n", dev->name); - - /* both_bap_lock decreases performance about 15% - * but without it card gets screwed up - */ -#ifdef CONFIG_SMP - both_bap_lock = 1; - bap_setup_spinlock = 1; -#endif - //awc_dump_registers(dev); - - if (adhoc & !max_mtu) - max_mtu= 2250; - else if (!max_mtu) - max_mtu= 1500; - - priv->sleeping_bap = 1; - - - priv->enabled_interrupts = awc_ints_enabled(dev->base_addr); - - if( awc_issue_noop(dev) ) goto final; - - awc_ints_enable(dev->base_addr,0); - - if( awc_disable_MAC(dev) ) goto final; - - -// awc_rids_setup(dev); - i=0; - while ( i < AWC_NOF_RIDS){ - if (awc_rids_temp[i].selector) - memcpy(&priv->rid_dir[i],&awc_rids_temp[i],sizeof(priv->rid_dir[0]) ); - else priv->rid_dir[i].selector = NULL; - i++; - } - - // following MUST be consistent with awc_rids in count and ordrering !!! - priv->rid_dir[0].buff = &priv->config; // card RID mirrors - priv->rid_dir[1].buff = &priv->SSIDs; - priv->rid_dir[2].buff = &priv->fixed_APs; - priv->rid_dir[3].buff = &priv->driver_name; - priv->rid_dir[4].buff = &priv->enc_trans; - priv->rid_dir[5].buff = &priv->general_config; // - priv->rid_dir[6].buff = &priv->capabilities; - priv->rid_dir[7].buff = &priv->status; - priv->rid_dir[8].buff = &priv->AP; - priv->rid_dir[9].buff = &priv->statistics; - priv->rid_dir[10].buff = &priv->statistics_delta; - priv->rid_dir[11].buff = &priv->statistics_delta_clear; - priv->rid_dir[12].buff = &priv->wep_volatile; - priv->rid_dir[13].buff = &priv->wep_nonvolatile; - priv->rid_dir[14].buff = &priv->modulation; - - priv->rid_dir[15].buff = &priv->statistics16; - priv->rid_dir[16].buff = &priv->statistics16_delta; - priv->rid_dir[17].buff = &priv->statistics16_delta_clear; - - priv->rid_dir[0].bufflen = sizeof(priv->config); // card RID mirrors - priv->rid_dir[1].bufflen = sizeof(priv->SSIDs); - priv->rid_dir[2].bufflen = sizeof(priv->fixed_APs); - priv->rid_dir[3].bufflen = sizeof(priv->driver_name); - priv->rid_dir[4].bufflen = sizeof(priv->enc_trans); - priv->rid_dir[5].bufflen = sizeof(priv->general_config); // - priv->rid_dir[6].bufflen = sizeof(priv->capabilities); - priv->rid_dir[7].bufflen = sizeof(priv->status); - priv->rid_dir[8].bufflen = sizeof(priv->AP); - priv->rid_dir[9].bufflen = sizeof(priv->statistics); - priv->rid_dir[10].bufflen = sizeof(priv->statistics_delta); - priv->rid_dir[11].bufflen = sizeof(priv->statistics_delta_clear); - priv->rid_dir[12].bufflen = sizeof(priv->wep_volatile); - priv->rid_dir[13].bufflen = sizeof(priv->wep_nonvolatile); - priv->rid_dir[14].bufflen = sizeof(priv->modulation); - - priv->rid_dir[15].bufflen = sizeof(priv->statistics16); - priv->rid_dir[16].bufflen = sizeof(priv->statistics16_delta); - priv->rid_dir[17].bufflen = sizeof(priv->statistics16_delta_clear); - - - if( awc_read_all_rids(dev) ) goto final; - - - priv->config.OperatingMode = 0;// MODE_LLC_HOST; - DEBUG(1,"ReceiveMode %x \n",priv->config.ReceiveMode); - // priv->config.ReceiveMode = RXMODE_DISABLE_802_3_HEADER; - - if (!adhoc) - priv->config.OperatingMode = MODE_STA_ESS; -// priv->config.OperatingMode = MODE_AP; -// Setting rates does not work with new hardware, use force_tx_rate via proc -// priv->config.Rates[0] =0x82; -// priv->config.Rates[1] =0x4; -// priv->config.Rates[2] =tx_full_rate; -// priv->config.Rates[3] =0; -// priv->config.Rates[4] =0; -// priv->config.Rates[5] =0; -// priv->config.Rates[6] =0; -// priv->config.Rates[7] =0; - priv->config.Channel = channel; - if (adhoc && master){ - priv->config.JoinNetTimeout = 0x1;//0 is facotry default - } else if (adhoc && slave){ - // by spec 0xffff, but, this causes immediate bad behaviour - // firmware behvaiour changed somehere around ver 2?? - priv->config.JoinNetTimeout = 0x7fff; - }; -// priv->config.AuthenticationType = 1; - priv->config.Stationary =1; -// priv->config.ScanMode = 1; -// priv->config.LinkLossDelay = 100; - priv->config.FragmentThreshold = 1700; - priv->config.RtsThreshold = 1700; - memcpy(priv->config.NodeName, name, 10); - - DEBUG(1,"%s supported Rates \n",dev->name); - for (i=0; i< 8; i++) - DEBUG(1,"%x ",priv->capabilities.SupportedRates[i]); - DEBUG(1,"%c",'\n'); - DEBUG(1,"%s default Rates \n",dev->name); - for (i=0; i< 8; i++) - DEBUG(1,"%x ",priv->config.Rates[i]); - DEBUG(1,"%c",'\n'); - - - // here we go, bad aironet - memset(&priv->SSIDs,0,sizeof(priv->SSIDs)); - - spin_lock_init(&priv->queues_lock); - priv->SSIDs.ridLen =0; - if (!SSID) { - priv->SSIDs.SSID[0].SSID[0] ='a'; - priv->SSIDs.SSID[0].SSID[1] ='b'; - priv->SSIDs.SSID[0].SSID[2] ='c'; - priv->SSIDs.SSID[0].lenght =3; - } else { - int sidlen = strlen(SSID); - memcpy(priv->SSIDs.SSID[0].SSID,SSID,sidlen); - priv->SSIDs.SSID[0].lenght = sidlen; - }; - - priv->SSIDs.SSID[1].lenght =0; - priv->SSIDs.SSID[1].SSID[0] =0; - priv->SSIDs.SSID[1].SSID[1] =0; - priv->SSIDs.SSID[2].lenght =0; - priv->SSIDs.SSID[2].SSID[0] =0; - priv->SSIDs.SSID[2].SSID[1] =0; - - -// priv->enc_trans.rules[0].etherType= 0x0008; -// priv->enc_trans.rules[0].Action = 1; - - memcpy( priv->config.StationMacAddress, - priv->capabilities.FactoryAddress, 6 ); - - memcpy(dev->dev_addr, priv->config.StationMacAddress, 6); - - DEBUG(2, "%s: awc_init success \n", dev->name); - - if (priv->capabilities.RadioType == 1) radioType = "802.11 Frequency Hoping"; - else if (priv->capabilities.RadioType == 2) radioType = "802.11 Direct Sequence"; - else if (priv->capabilities.RadioType == 4) radioType = "LM2000"; - else radioType = "Multiple Radio Types"; - - printk("%s: %s %s found @ 0x%lx irq %d firmwareVersion %d \n",dev->name, - priv->capabilities.ProductName,radioType, - dev->base_addr,dev->irq, - priv->capabilities.SoftwareVersion); - - return 0; - final: - printk(KERN_ERR "aironet init failed \n"); - return -ENODEV; - - }; - -int awc_private_init(struct net_device * dev){ - struct awc_private * priv = (struct awc_private *) dev->priv; - int i = 0; - - DEBUG(2, "%s: awc_private_init \n", dev->name); - - - memset(priv, 0, sizeof(struct awc_private)); - - spin_lock_init(&priv->queues_lock); - - priv->bap0.select = dev->base_addr + awc_Select0_register; - priv->bap0.offset = dev->base_addr + awc_Offset0_register; - priv->bap0.data = dev->base_addr + awc_Data0_register; - priv->bap0.lock = 0; - priv->bap0.status = 0; - spin_lock_init(&priv->bap0.spinlock); - init_MUTEX(&priv->bap0.sem); - priv->bap1.select = dev->base_addr + awc_Select1_register; - priv->bap1.offset = dev->base_addr + awc_Offset1_register; - priv->bap1.data = dev->base_addr + awc_Data1_register; - priv->bap1.lock = 0; - priv->bap1.status = 0; - spin_lock_init(&priv->bap1.spinlock); - init_MUTEX(&priv->bap1.sem); - priv->sleeping_bap = 1; - -//spinlock now init_MUTEX(&priv->command_semaphore); - spin_lock_init(&priv->command_issuing_spinlock); - spin_lock_init(&priv->both_bap_spinlock); - spin_lock_init(&priv->bap_setup_spinlock); - spin_lock_init(&priv->interrupt_spinlock); - - priv->command_semaphore_on = 0; - priv->unlock_command_postponed = 0; - INIT_WORK(&priv->work, (void *)(void *)awc_work, dev); - priv->work_running = 0; - priv->work_active = 0; - priv->tx_chain_active = 0; - priv->enabled_interrupts= 0x00; - priv->waiting_interrupts= 0x00; - - - init_MUTEX(&priv->tx_buff_semaphore); - priv->tx_buffs_in_use = 0; - priv->tx_small_buffs_in_use = 0; - priv->mac_enabled =0; - priv->link_status =0; - priv->large_buff_mem = large_buff_mem; - if (priv->large_buff_mem < max_mtu + AWC_TX_HEAD_SIZE + 10 ) - priv->large_buff_mem = max_mtu + AWC_TX_HEAD_SIZE + 10; - priv->small_buff_no = small_buff_no; - if (priv->small_buff_no < 1 ) - priv->small_buff_no = 1 ; - - priv->process_tx_results = awc_process_tx_results; - - //init_waitqueue(&priv->tx_chain_wait_queue); - - for (i=0; i< 6 ; i++ ) { - priv->p2p[i] = 0xff; - priv->bssid[i] =0; - } -// priv->p2p_uc =1; - priv->p2p_found =0; - - priv->p802_11_send =p802_11_send; - priv->full_stats = awc_full_stats; - priv->simple_bridge = awc_simple_bridge; - priv->force_rts_on_shorter = 0; - priv->force_tx_rate = tx_rate; - priv->ip_tos_reliability_rts = 0; - priv->ip_tos_troughput_no_retries = 0 ; - - priv->ejected =0; - priv->interrupt_count =0; - - return 0; - -}; - -/**************************** OPEN CLOSE **********************/ - - - int awc_open(struct net_device *dev) -{ - struct awc_private *priv = (struct awc_private *)dev->priv; - - - - DEBUG(2, "%s: awc_open \n", dev->name); - - if( awc_queues_init(dev) ) goto final; - if( awc_config(dev) ) goto final; - - memcpy(dev->dev_addr, priv->config.StationMacAddress, 6); - - priv->enabled_interrupts = 0x87; - awc_ints_enable(dev->base_addr,priv->enabled_interrupts); - -// priv->p8022_client = register_8022_client; -// priv->snap_client = register_snap_client; - DEBUG(2, "%s: opened \n", dev->name); - - priv->sleeping_bap = 0; - - - MOD_INC_USE_COUNT; -// kernel_thread(awc_thread,dev,0); - - netif_start_queue (dev); - return 0; /* Always succeed */ - - final: - netif_device_detach (dev); - printk(KERN_ERR "aironet open failed \n"); - return -1; -} - - - int awc_close(struct net_device *dev) -{ - struct awc_private * priv = (struct awc_private *) dev->priv; - - DEBUG(2, "%s: closing device.\n", dev->name); - - netif_stop_queue (dev); - - awc_disable_MAC(dev); - awc_queues_destroy(dev); - - awc_reset(dev); - - mdelay(10); - - AWC_LOCK_COMMAND_ISSUING(priv); - - MOD_DEC_USE_COUNT; - - AWC_UNLOCK_COMMAND_ISSUING(priv); - - return 0; -} - - - -/****************************** TX RX STUFF ******************/ - - - -void awc_tx_timeout (struct net_device *dev) -{ - struct awc_private *priv = (struct awc_private *) dev->priv; - struct awc_fid * fid; - int cnt; - unsigned long flags; - - DEBUG (2, "%s: awc_tx_timeout \n", dev->name); - - printk (KERN_NOTICE "%s: Transmit timed out , buffs %d %d, queues tx %d pp %d lrg %d sm %d \n ", - dev->name, priv->tx_small_buffs_total, priv->tx_buffs_total, - priv->tx_in_transmit.size, priv->tx_post_process.size, - priv->tx_large_ready.size, priv->tx_small_ready.size); - priv->stats.tx_errors++; - - save_flags(flags); - cli(); - fid = priv->tx_in_transmit.head; - cnt = 0; - while (fid) { // removing all fids older that that - if (jiffies - fid->transmit_start_time > (HZ)) { - // printk(KERN_ERR "%s staled tx_buff found, age %uld jiffies\n",dev->name, - // jiffies - fid->transmit_start_time ); - awc_fid_queue_remove (&priv->tx_in_transmit, fid); - if (fid->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE) - awc_fid_queue_push_tail (&priv->tx_small_ready, fid); - else - awc_fid_queue_push_tail (&priv->tx_large_ready, fid); - } - fid = fid->next; - if (cnt++ > 200) { - printk ("bbb in awc_fid_queue\n"); - restore_flags(flags); - return; - }; - - } - restore_flags(flags); - dev->trans_start = jiffies; - netif_wake_queue (dev); -} - - -long long last_tx_q_hack; -int direction = 1; - -int awc_start_xmit(struct sk_buff *skb, struct net_device *dev) { - - struct awc_private *priv = (struct awc_private *)dev->priv; - int retval = 0; -// unsigned long flags; - - DEBUG(2, "%s: awc_start_xmit \n", dev->name); - - - if (!dev) { - DEBUG(1, " xmit dev=NULL, jiffie %ld \n",jiffies); - return -1; - }; - - if (!skb) { - DEBUG(1, " xmit skb=NULL, jiffie %ld \n",jiffies); - return -1; - }; - -// if (test_and_set_bit( 0, (void *) &priv->tx_chain_active) ) { -// netif_start_queue (dev); -// return 1; -// } - - dev->trans_start = jiffies; - retval = awc_802_11_tx_find_path_and_post(dev,skb); - priv->tx_chain_active = 0; -// wake_up_interruptible(&priv->tx_chain_wait_queue); - -// if (!dev->tbusy) dev_tint(dev); - return retval; -} - -void awc_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct awc_private *priv; - unsigned long flags; - -// if ((dev == NULL)) return; - - priv = (struct awc_private *)dev->priv; - - - - - DEBUG(2, "%s: awc_interrupt \n", dev->name); - spin_lock_irqsave(&priv->interrupt_spinlock, flags); - - awc_interrupt_process(dev); - - spin_unlock_irqrestore(&priv->interrupt_spinlock, flags); -} - - - -/************************ STATS, MULTICAST & STUFF ****************/ - - - - struct net_device_stats *awc_get_stats(struct net_device *dev) -{ - struct awc_private *priv = (struct awc_private *)dev->priv; -// unsigned long flags; -// int cnt = 0; -// int unlocked_stats_in_interrupt=0; - - DEBUG(2, "%s: awc_get_stats \n", dev->name); - - if (!netif_running(dev)) { - return 0; - } -// save_flags(flags); -// cli(); - if (awc_full_stats) - awc_readrid_dir(dev, &priv->rid_dir[9]); -// restore_flags(flags); - - // the very following is the very wrong very probably - if (awc_full_stats){ - priv->stats.rx_bytes = priv->statistics.HostRxBytes; - priv->stats.tx_bytes = priv->statistics.HostTxBytes; - priv->stats.rx_fifo_errors = priv->statistics.RxOverrunErr ; - priv->stats.rx_crc_errors = priv->statistics.RxPlcpCrcErr + priv->statistics.RxMacCrcErr ; - priv->stats.rx_frame_errors = priv->statistics.RxPlcpFormat ; - priv->stats.rx_length_errors = priv->statistics.RxPlcpLength ; - priv->stats.rx_missed_errors = priv->statistics.RxAged ; - priv->stats.rx_over_errors = priv->statistics.RxOverrunErr ; - - priv->stats.collisions = priv->statistics.TxSinColl; - priv->stats.tx_aborted_errors = priv->statistics.TxAged ; - priv->stats.tx_fifo_errors = priv->statistics.HostTxFail ; - priv->stats.tx_window_errors = priv->statistics.TxMulColl ; - priv->stats.tx_heartbeat_errors = priv->statistics.DefersProt +priv->statistics.DefersEngy ; - priv->stats.tx_carrier_errors = priv->statistics.RetryLong +priv->statistics.RetryShort ; - priv->stats.multicast = priv->statistics.HostRxMc; - } - - -// printk("rx_packets %d\n",priv->stats.rx_packets); - return &(priv->stats); -} - - -int awc_change_mtu(struct net_device *dev, int new_mtu){ - -// struct awc_private *priv = (struct awc_private *)dev->priv; - unsigned long flags; - - if ((new_mtu < 256 ) || (new_mtu > 2312) || (max_mtu && new_mtu > max_mtu) ) - return -EINVAL; - - if (netif_running(dev)) { - printk("PLEASE, ifconfig %s down for mtu change\n",dev->name); - - }; - if (dev->mtu != new_mtu) { - save_flags(flags); - cli(); - netif_stop_queue(dev); - awc_disable_MAC(dev); - restore_flags(flags); - - awc_tx_dealloc(dev); - dev->mtu = new_mtu; - awc_tx_alloc(dev); - awc_enable_MAC(dev); - netif_start_queue(dev); - - printk("%s mtu has been changed to %d \n ",dev->name,dev->mtu); - - } - - return 0; - -}; - - - void -awc_set_multicast_list(struct net_device *dev) { -// int ioaddr = dev->base_addr; - -/* if (dev->flags & IFF_PROMISC) - promisc - else if (dev->mc_count || (dev->flags & IFF_ALLMULTI)) - allmulti - else - normal - */ - - -} - - - -int (* awc_proc_set_fun) (int); -int (* awc_proc_unset_fun) (int); - - -int awc_register_proc(int (*awc_proc_set_device)(int),int (*awc_proc_unset_device)(int)){ - - AWC_ENTRY_EXIT_DEBUG("awc_register_proc"); - awc_proc_set_fun = awc_proc_set_device; - awc_proc_unset_fun = awc_proc_unset_device; - AWC_ENTRY_EXIT_DEBUG("exit"); - return 0; -}; - -int awc_unregister_proc(void){ - - AWC_ENTRY_EXIT_DEBUG("awc_unregister_proc"); - - awc_proc_set_fun = NULL; - awc_proc_unset_fun = NULL; - AWC_ENTRY_EXIT_DEBUG("exit"); - return 0; -}; - -static int aironet_core_init(void) -{ -// unsigned long flags; - - - printk(KERN_INFO"%s", aironet4500_core_version); - return 0; - - -} - -static void aironet_core_exit(void) -{ - printk(KERN_INFO "aironet4500 unloading core module \n"); - -} - -module_init(aironet_core_init); -module_exit(aironet_core_exit); - diff -Nru a/drivers/net/aironet4500_proc.c b/drivers/net/aironet4500_proc.c --- a/drivers/net/aironet4500_proc.c Thu Feb 20 23:19:19 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,719 +0,0 @@ -/* - * Aironet 4500 /proc interface - * - * Elmer Joandi, Januar 1999 - * Copyright GPL - * - * - * Revision 0.1 ,started 30.12.1998 - * - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifdef CONFIG_PROC_FS - -#include -#include - -#include "aironet4500.h" -#include "aironet4500_rid.c" - - -#define AWC_STR_SIZE 0x2ff0 -#define DEV_AWC_INFO 1 -#define DEV_AWC 1 - -static spinlock_t driver_lock = SPIN_LOCK_UNLOCKED; - -struct awc_proc_private{ - struct ctl_table_header * sysctl_header; - struct ctl_table * proc_table; - struct ctl_table proc_table_device_root[2]; - struct ctl_table proc_table_sys_root[2]; - char proc_name[10]; -}; -static char awc_drive_info[AWC_STR_SIZE]="Zcom \n\0"; -static char awc_proc_buff[AWC_STR_SIZE]; -static int awc_int_buff; -static struct awc_proc_private awc_proc_priv[MAX_AWCS]; - -extern int awc_proc_unset_device(int device_number); - -int awc_proc_format_array(int write,char * buff, size_t * len, struct awc_rid_dir * rid_dir, struct aironet4500_RID * rid){ - - u8 * data = rid_dir->buff + rid->offset; - int pos = 0; - int null_past = 0; - int hex = ((rid->mask == 0xff) && (rid->value == 0x0 )); - int string = ((rid->mask == 0) && (rid->value == 0 )); - u32 val =0; - int bytes = (rid->bits / 8); - int ch =0; - int i,k; - int array_len = rid->array; - int nullX = 0; - - - AWC_ENTRY_EXIT_DEBUG("awc_proc_format_array"); - - if (rid->bits %8 ) bytes +=1; - - if (bytes > 4 && rid->array == 1){ - array_len = bytes; - bytes = 1; - hex = 1; - }; - if (bytes < 1 || bytes > 4){ - printk(KERN_ERR " weird number of bytes %d in aironet rid \n",bytes); - return -1; - }; - DEBUG(0x20000,"awc proc array bytes %d",bytes); - DEBUG(0x20000," hex %d",hex); - DEBUG(0x20000," string %d",string); - - DEBUG(0x20000," array_len %d \n",array_len); - DEBUG(0x20000," offset %d \n",rid->offset); - - if (!write){ - for (i=0; i < array_len ; i++){ - - if (bytes <= 1 ) val = data[i*bytes]; - else if (bytes <= 2 ) val = *((u16 *)&data[i*bytes]); - else if (bytes <= 4 ) val = *((u32 *)&data[i*bytes]); - - if (rid->null_terminated && !val) - null_past =1; - - if (hex && !string) - for (k=0; k = '0' && ch <='9') - ch -= '0'; - if (ch >= 'A' && ch <='F') - ch -= 'A'+ 0xA; - if (ch >= 'a' && ch <='f') - ch -= 'a'+ 0xA; - val += ch <<4; - k++; - - ch = *(buff + 2*i*bytes +k + nullX); - if (val == 0 && (ch == 'X' || ch == 'x')){ - nullX=2; - val = 0; - k = -1; - continue; - }; - if (ch >= '0' && ch <='9') - ch -= '0'; - if (ch >= 'A' && ch <='F') - ch -= 'A'+ 0xA; - if (ch >= 'a' && ch <='f') - ch -= 'a'+ 0xA; - - val += ch; - if (i*bytes > *len ) - val = 0; - } - if (rid->bits <=8 ) data[i*bytes] = val; - else if (rid->bits <=16 ) *((u16 *)&data[i*bytes]) = val; - else if (rid->bits <=32 ) *((u32 *)&data[i*bytes]) = val; - if (!val) null_past=1; - - } else { - for (k=0; k < bytes; k++){ - data[i*bytes +k] = *(buff + i*bytes +k); - if (i*bytes +k > *len || !data[i*bytes +k]) - null_past = 1;; - } - - } - if (null_past){ - if (rid->bits <=8 ) data[i*bytes] = 0; - else if (rid->bits <=16 ) *((u16 *)&data[i*bytes]) = 0; - else if (rid->bits <=32 ) *((u32 *)&data[i*bytes]) = 0; - } - - } - - }; - - -// *len = pos; - - AWC_ENTRY_EXIT_DEBUG("awc_proc_format_array"); - return 0; -}; - - -int awc_proc_format_bits(int write,u32 * buff, size_t* lenp, struct awc_rid_dir * rid_dir, struct aironet4500_RID * rid){ - - u8 * data = rid_dir->buff + rid->offset; - u32 val = 0; - int not_bool = 0; - - AWC_ENTRY_EXIT_DEBUG("awc_proc_format_bits"); - - if ((rid->bits == 8 && rid->mask == 0xff) || - (rid->bits == 16 && rid->mask == 0xffff) || - (rid->bits == 32 && rid->mask == 0xffffffff) ) - not_bool = 1; - - if (rid->bits <=8 ) val = *data; - else if (rid->bits <=16 ) val = *((u16 *)data); - else if (rid->bits <=32 ) val = *((u32 *)data); - - DEBUG(0x20000,"awc proc int enter data %x \n",val); - DEBUG(0x20000,"awc proc int enter buff %x \n",*buff); - DEBUG(0x20000,"awc proc int enter intbuff %x \n",awc_int_buff); - DEBUG(0x20000,"awc proc int enter lenp %x \n",*lenp); - - - - if (!write){ - if (rid->mask) - val &= rid->mask; - - if (!not_bool && rid->mask && - ((val & rid->mask) == (rid->value & rid->mask))) - *buff = 1; - else if (!not_bool) *buff = 0; - else *buff = val; - } else { - if (not_bool){ - val &= ~rid->mask; - val |= (*buff & rid->mask); - } else { - if (*buff){ - val &= ~rid->mask; - if (rid->value) - val |= rid->mask & rid->value; - else val |= rid->mask & ~rid->value; - } else val &= ~rid->mask; - }; - if (rid->bits == 8) *data = val & 0xff; - if (rid->bits == 16) *((u16*)data) = val &0xffff; - if (rid->bits == 32) *((u32*)data) = val &0xffffffff; - - } - DEBUG(0x20000,"awc proc int buff %x \n",awc_int_buff); - if (rid->bits <=8 ) val = *data; - else if (rid->bits <=16 ) val = *((u16 *)data); - else if (rid->bits <=32 ) val = *((u32 *)data); - - DEBUG(0x20000,"awc proc int data %x \n",val); - -// both of them are crazy -// *lenp = sizeof(int); -// *lenp += 1; - - AWC_ENTRY_EXIT_DEBUG("exit"); - return 0; - -}; - -int awc_proc_fun(ctl_table *ctl, int write, struct file * filp, - void *buffer, size_t *lenp) -{ - int retv =-1; - struct awc_private *priv = NULL; - unsigned long flags; -// int device_number = (int ) ctl->extra1; - - struct awc_rid_dir * rid_dir; - - struct net_device * dev= NULL; - struct aironet4500_RID * rid = (struct aironet4500_RID * ) ctl->extra2; - - - AWC_ENTRY_EXIT_DEBUG("awc_proc_fun"); - - if (!write && filp) - if (filp->f_pos){ -// printk(KERN_CRIT "Oversize read\n"); - *lenp = 0;// hack against reading til eof - return 0; - } - - MOD_INC_USE_COUNT; - - rid_dir = ((struct awc_rid_dir *)ctl->extra1); - dev = rid_dir->dev; - - if (!dev){ - printk(KERN_ERR " NO device here \n"); - goto final; - } - - if(ctl->procname == NULL || awc_drive_info == NULL ){ - printk(KERN_WARNING " procname is NULL in sysctl_table or awc_mib_info is NULL \n at awc module\n "); - MOD_DEC_USE_COUNT; - return -1; - } - priv = (struct awc_private * ) dev->priv; - - if ((rid->selector->read_only || rid->read_only) && write){ - printk(KERN_ERR "This value is read-only \n"); - goto final; - }; - - if (!write && rid->selector->may_change) { - spin_lock_irqsave(&driver_lock, flags); - awc_readrid(dev,rid,rid_dir->buff + rid->offset); - spin_unlock_irqrestore(&driver_lock, flags); - }; - - if (rid->array > 1 || rid->bits > 32){ - if (write){ - retv = proc_dostring(ctl, write, filp, buffer, lenp); - if (retv) goto final; - retv = awc_proc_format_array(write, awc_proc_buff, lenp, rid_dir, rid); - if (retv) goto final; - } else { - retv = awc_proc_format_array(write, awc_proc_buff, lenp, rid_dir, rid); - if (retv) goto final; - retv = proc_dostring(ctl, write, filp, buffer, lenp); - if (retv) goto final; - } - } else { - if (write){ - retv = proc_dointvec(ctl, write, filp, buffer, lenp); - if (retv) goto final; - retv = awc_proc_format_bits(write, &awc_int_buff, lenp, rid_dir, rid); - if (retv) goto final; - } else { - retv = awc_proc_format_bits(write, &awc_int_buff, lenp,rid_dir, rid); - if (retv) goto final; - retv = proc_dointvec(ctl, write, filp, buffer, lenp); - if (retv) goto final; - } - } - if (write) { - spin_lock_irqsave(&driver_lock, flags); - - if (rid->selector->MAC_Disable_at_write){ - awc_disable_MAC(dev); - }; - awc_writerid(dev,rid,rid_dir->buff + rid->offset); - if (rid->selector->MAC_Disable_at_write){ - awc_enable_MAC(dev); - }; - spin_lock_irqsave(&driver_lock, flags); - }; - - DEBUG(0x20000,"awc proc ret %x \n",retv); - DEBUG(0x20000,"awc proc lenp %x \n",*lenp); - - MOD_DEC_USE_COUNT; - return retv; - -final: - - AWC_ENTRY_EXIT_DEBUG("exit"); - MOD_DEC_USE_COUNT; - return -1 ; -} - - -char conf_reset_result[200]; - - -ctl_table awc_exdev_table[] = { - { - .ctl_name = 0, - .maxlen = 0, - .mode = 0400, - }, - { .ctl_name = 0 } -}; -ctl_table awc_exroot_table[] = { - { - .ctl_name = 254, - .procname = "aironet4500", - .maxlen = 0, - .mode = 0555, - }, - { .ctl_name = 0 } -}; - -ctl_table awc_driver_proc_table[] = { - { - .ctl_name = 1, - .procname = "debug", - .data = &awc_debug, - .maxlen = sizeof(awc_debug), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 2, - .procname = "bap_sleep", - .data = &bap_sleep, - .maxlen = sizeof(bap_sleep), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 3, - .procname = "bap_sleep_after_setup", - .data = &bap_sleep_after_setup, - .maxlen = sizeof(bap_sleep_after_setup), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 4, - .procname = "sleep_before_command", - .data = &sleep_before_command, - .maxlen = sizeof(sleep_before_command), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 5, - .procname = "bap_sleep_before_write", - .data = &bap_sleep_before_write, - .maxlen = sizeof(bap_sleep_before_write), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 6, - .procname = "sleep_in_command", - .data = &sleep_in_command, - .maxlen = sizeof(sleep_in_command), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 7, - .procname = "both_bap_lock", - .data = &both_bap_lock, - .maxlen = sizeof(both_bap_lock), - .mode = 0600, - .proc_handler = proc_dointvec - }, - { - .ctl_name = 8, - .procname = "bap_setup_spinlock", - .data = &bap_setup_spinlock, - .maxlen = sizeof(bap_setup_spinlock), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { .ctl_name = 0 } -}; - -ctl_table awc_driver_level_ctable[] = { - { - .ctl_name = 1, - .procname = "force_rts_on_shorter", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 2, - .procname = "force_tx_rate", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 3, - .procname = "ip_tos_reliability_rts", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 4, - .procname = "ip_tos_troughput_no_retries", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 5, - .procname = "debug", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 6, - .procname = "simple_bridge", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 7, - .procname = "p802_11_send", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { - .ctl_name = 8, - .procname = "full_stats", - .maxlen = sizeof(int), - .mode = 0600, - .proc_handler = proc_dointvec, - }, - { .ctl_name = 0 } -}; - -ctl_table awc_root_table[] = { - { - .ctl_name = 254, - .procname = "aironet4500", - .maxlen = 0, - .mode = 0555, - .child = awc_driver_proc_table, - }, - { .ctl_name = 0 } -}; - -struct ctl_table_header * awc_driver_sysctl_header; - -const char awc_procname[]= "awc5"; - - -int awc_proc_set_device(int device_number){ - int group =0; - int rid = 0; - struct awc_private * priv; - ctl_table * tmp_table_ptr; - - AWC_ENTRY_EXIT_DEBUG("awc_proc_set_device"); - if (!aironet4500_devices[device_number] || (awc_nof_rids <=0 )) return -1 ; - priv = (struct awc_private * )aironet4500_devices[device_number]->priv; - - awc_rids_setup(aironet4500_devices[device_number]); - - memcpy(&(awc_proc_priv[device_number].proc_table_sys_root[0]), awc_exroot_table,sizeof(struct ctl_table)*2); - awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name = 254 - device_number; - memcpy(awc_proc_priv[device_number].proc_table_device_root, awc_exdev_table,sizeof(awc_exdev_table) ); - awc_proc_priv[device_number].proc_table_device_root[0].ctl_name = device_number+1; - - awc_proc_priv[device_number].proc_table_sys_root->child = awc_proc_priv[device_number].proc_table_device_root; - memcpy(awc_proc_priv[device_number].proc_name,(struct NET_DEVICE * )aironet4500_devices[device_number]->name,5); - awc_proc_priv[device_number].proc_name[4]=0; - // awc_proc_priv[device_number].proc_name[3]=48+device_number; - awc_proc_priv[device_number].proc_table_device_root[0].procname = &(awc_proc_priv[device_number].proc_name[0]); - awc_proc_priv[device_number].proc_table = kmalloc(sizeof(struct ctl_table) * (awc_nof_rids+2),GFP_KERNEL); - if (!awc_proc_priv[device_number].proc_table){ - printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); - return -1; - } - awc_proc_priv[device_number].proc_table_device_root[0].child=awc_proc_priv[device_number].proc_table; - - - if (awc_debug) printk("device %d of %d proc interface setup ",device_number, awc_nof_rids); - - - while (awc_rids[group].selector && group < awc_nof_rids){ - if (awc_debug & 0x20000) - printk(KERN_CRIT "ridgroup %s size %d \n", awc_rids[group].selector->name,awc_rids[group].size); - - awc_proc_priv[device_number].proc_table[group].ctl_name = group +1; - awc_proc_priv[device_number].proc_table[group+1].ctl_name = 0; - awc_proc_priv[device_number].proc_table[group].procname = awc_rids[group].selector->name; - awc_proc_priv[device_number].proc_table[group].data = awc_proc_buff; - awc_proc_priv[device_number].proc_table[group].maxlen = sizeof(awc_proc_buff) -1; - awc_proc_priv[device_number].proc_table[group].mode = 0600; - awc_proc_priv[device_number].proc_table[group].child = kmalloc(sizeof(struct ctl_table) * (awc_rids[group].size +2), GFP_KERNEL); - awc_proc_priv[device_number].proc_table[group].proc_handler = NULL; - awc_proc_priv[device_number].proc_table[group].strategy = NULL; - awc_proc_priv[device_number].proc_table[group].de = NULL; - awc_proc_priv[device_number].proc_table[group].extra1 = NULL; - awc_proc_priv[device_number].proc_table[group].extra2 = NULL; - if (!awc_proc_priv[device_number].proc_table[group].child) { - awc_proc_priv[device_number].proc_table[group].ctl_name = 0; - printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); - return 0; - } - rid=0; - while (awc_rids[group].rids[rid].selector && (rid < awc_rids[group].size -1)){ - -// DEBUG(0x20000,"rid %s \n", awc_rids[group].rids[rid].name); - - awc_proc_priv[device_number].proc_table[group].child[rid].ctl_name = rid +1; - awc_proc_priv[device_number].proc_table[group].child[rid+1].ctl_name = 0; - awc_proc_priv[device_number].proc_table[group].child[rid].procname = awc_rids[group].rids[rid].name; - if (awc_rids[group].rids[rid].array > 1 || - awc_rids[group].rids[rid].bits > 32 ){ - awc_proc_priv[device_number].proc_table[group].child[rid].data = awc_proc_buff; - awc_proc_priv[device_number].proc_table[group].child[rid].maxlen = sizeof(awc_proc_buff) -1; - } else { - awc_proc_priv[device_number].proc_table[group].child[rid].data = &awc_int_buff; - awc_proc_priv[device_number].proc_table[group].child[rid].maxlen = sizeof(awc_int_buff); - - } - if ( awc_rids[group].rids[rid].read_only || - awc_rids[group].rids[rid].selector->read_only ) - awc_proc_priv[device_number].proc_table[group].child[rid].mode = 0400; - else - awc_proc_priv[device_number].proc_table[group].child[rid].mode = 0600; - awc_proc_priv[device_number].proc_table[group].child[rid].child = NULL; - awc_proc_priv[device_number].proc_table[group].child[rid].proc_handler = awc_proc_fun; - awc_proc_priv[device_number].proc_table[group].child[rid].strategy = NULL; - awc_proc_priv[device_number].proc_table[group].child[rid].de = NULL; - awc_proc_priv[device_number].proc_table[group].child[rid].extra1 = (void *) &(((struct awc_private* )aironet4500_devices[device_number]->priv)->rid_dir[group]); - awc_proc_priv[device_number].proc_table[group].child[rid].extra2 = (void *) &(awc_rids[group].rids[rid]); - - rid++; - } - - group++; - - }; -// here are driver-level params dir - awc_proc_priv[device_number].proc_table[group].ctl_name = group +1; - awc_proc_priv[device_number].proc_table[group+1].ctl_name = 0; - awc_proc_priv[device_number].proc_table[group].procname = "driver-level"; - awc_proc_priv[device_number].proc_table[group].data = awc_proc_buff; - awc_proc_priv[device_number].proc_table[group].maxlen = sizeof(awc_proc_buff) -1; - awc_proc_priv[device_number].proc_table[group].mode = 0600; - awc_proc_priv[device_number].proc_table[group].child = kmalloc(sizeof(awc_driver_level_ctable) , GFP_KERNEL); - awc_proc_priv[device_number].proc_table[group].proc_handler = NULL; - awc_proc_priv[device_number].proc_table[group].strategy = NULL; - awc_proc_priv[device_number].proc_table[group].de = NULL; - awc_proc_priv[device_number].proc_table[group].extra1 = NULL; - awc_proc_priv[device_number].proc_table[group].extra2 = NULL; - if (!awc_proc_priv[device_number].proc_table[group].child) { - awc_proc_priv[device_number].proc_table[group].ctl_name = 0; - printk(KERN_CRIT "Out of memory on aironet4500_proc huge table alloc \n"); - return 0; - } - - - tmp_table_ptr = awc_proc_priv[device_number].proc_table[group].child; - memcpy(tmp_table_ptr,awc_driver_level_ctable,sizeof(awc_driver_level_ctable)); - - - tmp_table_ptr[0].data = - &(priv->force_rts_on_shorter); - tmp_table_ptr[1].data = &priv->force_tx_rate; - tmp_table_ptr[2].data = (void *) &priv->ip_tos_reliability_rts; - tmp_table_ptr[3].data = (void *) &priv->ip_tos_troughput_no_retries; - tmp_table_ptr[4].data = (void *) &priv->debug; - tmp_table_ptr[5].data = (void *) &priv->simple_bridge; - tmp_table_ptr[6].data = (void *) &priv->p802_11_send; - tmp_table_ptr[7].data = (void *) &priv->full_stats; - - - awc_proc_priv[device_number].sysctl_header = - register_sysctl_table(awc_proc_priv[device_number].proc_table_sys_root,0); - - AWC_ENTRY_EXIT_DEBUG("exit"); - - if (awc_proc_priv[device_number].sysctl_header) - return 0; - return 1; - -}; - -int awc_proc_unset_device(int device_number){ - int k; - - AWC_ENTRY_EXIT_DEBUG("awc_proc_unset_device"); - if (awc_proc_priv[device_number].sysctl_header){ - unregister_sysctl_table(awc_proc_priv[device_number].sysctl_header); - awc_proc_priv[device_number].sysctl_header = NULL; - } - if (awc_proc_priv[device_number].proc_table){ - for (k=0; awc_proc_priv[device_number].proc_table[k].ctl_name ; k++ ){ - if (awc_proc_priv[device_number].proc_table[k].child) - kfree(awc_proc_priv[device_number].proc_table[k].child); - } - kfree(awc_proc_priv[device_number].proc_table); - awc_proc_priv[device_number].proc_table = NULL; - } - if (awc_proc_priv[device_number].proc_table_device_root[0].ctl_name) - awc_proc_priv[device_number].proc_table_device_root[0].ctl_name = 0; - if (awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name) - awc_proc_priv[device_number].proc_table_sys_root[0].ctl_name = 0; - - AWC_ENTRY_EXIT_DEBUG("exit"); - return 0; -}; - -static int aironet_proc_init(void) { - int i=0; - - AWC_ENTRY_EXIT_DEBUG("init_module"); - - - for (i=0; i < MAX_AWCS; i++){ - awc_proc_set_device(i); - } - - awc_register_proc(awc_proc_set_device, awc_proc_unset_device); - - awc_driver_sysctl_header = register_sysctl_table(awc_root_table,0); - - AWC_ENTRY_EXIT_DEBUG("exit"); - return 0; - -}; - -static void aironet_proc_exit(void){ - - int i=0; - AWC_ENTRY_EXIT_DEBUG("cleanup_module"); - awc_unregister_proc(); - for (i=0; i < MAX_AWCS; i++){ - awc_proc_unset_device(i); - } - if (awc_driver_sysctl_header) - unregister_sysctl_table(awc_driver_sysctl_header); - AWC_ENTRY_EXIT_DEBUG("exit"); -}; - -module_init(aironet_proc_init); -module_exit(aironet_proc_exit); - -#else -#error awc driver needs CONFIG_PROC_FS - -#endif // whole proc system styff -MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/aironet4500_rid.c b/drivers/net/aironet4500_rid.c --- a/drivers/net/aironet4500_rid.c Thu Feb 20 23:19:21 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,2205 +0,0 @@ -/* - * Aironet 4500 Pcmcia driver - * - * Elmer Joandi, Januar 1999 - * Copyright Elmer Joandi, all rights restricted - * - * - * Revision 0.1 ,started 30.12.1998 - * - * - */ - -#include -#include - -#include "aironet4500.h" - - - -#define awc_RID_gen_RidLen {(const struct aironet4500_rid_selector *)&aironet4500_RID_Select_General_Config,0x0000, 8,1,1,1,0, 0xffffffff,0x0000, "Length of RID" } -#define awc_RID_gen_OperatingMode_adhoc {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000003,0x0000,"Opmode IBSS Adhoc operation" } // Without AP -#define awc_RID_gen_OperatingMode_Infrastructure {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000003,0x0001,"Opmode Infrastructure Station operation" }// With AP -#define awc_RID_gen_OperatingMode_AP {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000003,0x0002,"Opmode Access Point" } // Aironet doesn't release info on use -#define awc_RID_gen_OperatingMode_AP_and_repeater {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000003,0x0003,"Opmode Access Point and Repeater" } // no info -#define awc_RID_gen_OperatingMode_No_payload_modify {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000100,0x0100,"Opmode Payload without modify" } -#define awc_RID_gen_OperatingMode_LLC_802_3_convert {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000100,0x0000,"Opmode LLC -> 802.3 convert" } -#define awc_RID_gen_OperatingMode_proprietary_ext {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000200,0x0200,"Opmode Aironet Extentsions enabled" } // neened for 11Mbps -#define awc_RID_gen_OperatingMode_no_proprietary_ext {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0,0x00000200,0x0000,"Opmode Aironet Extentsions disabled" } -#define awc_RID_gen_OperatingMode_AP_ext {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000400,0x0400,"Opmode AP Extentsions enabled" } // no info -#define awc_RID_gen_OperatingMode_no_AP_ext {&aironet4500_RID_Select_General_Config,0x0002,16,1,1,0,0, 0x00000400,0x0000,"Opmode AP Extentsions disabled" } -#define awc_RID_gen_ReceiveMode {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000ffff,0x0000,"RX Mode"} -#define awc_RID_gen_ReceiveMode_BMA {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0000,"RX Mode BC MC ADDR"} -#define awc_RID_gen_ReceiveMode_BA {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0001,"RX Mode BC ADDR"} -#define awc_RID_gen_ReceiveMode_A {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0002,"RX Mode ADDR"} -#define awc_RID_gen_ReceiveMode_802_11_monitor {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0003,"RX Mode 802.11 Monitor current BSSID"} -#define awc_RID_gen_ReceiveMode_802_11_any_monitor {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0004,"RX Mode 802.11 Monitor any BSSID"} -#define awc_RID_gen_ReceiveMode_LAN_monitor {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x0000000f,0x0005,"RX Mode LAN Monitor current BSSID"} -#define awc_RID_gen_ReceiveMode_802_3_hdr_disable {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x00000100,0x0100,"RX Mode Disable RX 802.3 Header"} -#define awc_RID_gen_ReceiveMode_802_3_hdr_enable {&aironet4500_RID_Select_General_Config,0x0004,16,1,1,0,0,0x00000100,0x0000,"RX Mode Enable RX 802.3 header"} -#define awc_RID_gen_Fragmentation_threshold {&aironet4500_RID_Select_General_Config,0x0006,16,1,1,0,0,0x0000ffff,0x0000,"Fragmentation Threshold"} // treshold of packet size starting to be fragmented -#define awc_RID_gen_RTS_threshold {&aironet4500_RID_Select_General_Config,0x0008,16,1,1,0,0,0xffff,0x0000,"RTS Threshold"} // packet size, larger ones get sent with RTS/CTS -#define awc_RID_gen_Station_Mac_Id {&aironet4500_RID_Select_General_Config,0x000A, 8,6,1,0,0,0xff,0,"Station MAC Id"} -#define awc_RID_gen_Supported_rates {&aironet4500_RID_Select_General_Config,0x0010, 8,8,1,0,1,0xff,0x00,"Supported Rates"} // Hex encoded 500kbps -#define awc_RID_gen_Basic_Rate {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x80,0x80,"Basic Rate"} // if 0x80 bit is set -#define awc_RID_gen_Rate_500kbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x01,"Rate 500kbps"} -#define awc_RID_gen_Rate_1Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x02,"Rate 1Mbps"} -#define awc_RID_gen_Rate_2Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x04,"Rate 2Mbps"} -#define awc_RID_gen_Rate_4Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x08,"Rate 4Mbps"} -#define awc_RID_gen_Rate_5Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x0B,"Rate 5.5Mbps"} -#define awc_RID_gen_Rate_10Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x14,"Rate 10Mbps"} -#define awc_RID_gen_Rate_11Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0x7f,0x16,"Rate 11Mbps"} -#define awc_RID_gen_BasicRate_500kbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x81,"BasicRate 500kbps"} -#define awc_RID_gen_BasicRate_1Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x82,"BasicRate 1Mbps"} -#define awc_RID_gen_BasicRate_2Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x84,"BasicRate 2Mbps"} -#define awc_RID_gen_BasicRate_4Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x88,"BasicRate 4Mbps"} -#define awc_RID_gen_BasicRate_5Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x8B,"BasicRate 5.5Mbps"} -#define awc_RID_gen_BasicRate_10Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x94,"BasicRate 10Mbps"} -#define awc_RID_gen_BasicRate_11Mbps {&aironet4500_RID_Select_General_Config,0x0010, 8,1,1,0,1,0xff,0x96,"BasicRate 11Mbps"} - - -#define awc_RID_gen_Long_retry_limit {&aironet4500_RID_Select_General_Config,0x0018,16, 1,1,0,0,0xffff,0,"Short Retry Limit"} -#define awc_RID_gen_Short_retry_limit {&aironet4500_RID_Select_General_Config,0x001A,16, 1,1,0,0,0xffff,0,"Long Retry Limit"} -#define awc_RID_gen_Tx_MSDU_lifetime {&aironet4500_RID_Select_General_Config,0x001C,16, 1,1000,0,0,0xffff,0,"TX MSDU Lifetime"} -#define awc_RID_gen_Rx_MSDU_lifetime {&aironet4500_RID_Select_General_Config,0x001E,16, 1,1000,0,0,0xffff,0,"RX MSDU Lifetime"} -#define awc_RID_gen_Stationary {&aironet4500_RID_Select_General_Config,0x0020,16, 1,1,0,0,0xffff,0,"Stationary"} -#define awc_RID_gen_BC_MC_Ordering {&aironet4500_RID_Select_General_Config,0x0022,16, 1,1,0,0,0xffff,0,"Strictly order Bcast and Mcast"} -#define awc_RID_gen_Device_type {&aironet4500_RID_Select_General_Config,0x0024,16, 1,1,1,0,0xffff,0x00,"Radio Type"} -#define awc_RID_gen_Reserved_0x0026 {&aironet4500_RID_Select_General_Config,0x0026, 8,10,1,0,0,0xff,0,"Reserved0x28"} - - -//SCANNING/ASSOCIATING -#define awc_RID_gen_ScanMode awc_def_gen_RID(0x0030,"ScanMode", 16,0xf,0, NULL) -#define awc_RID_gen_ScanMode_Active awc_def_gen_RID(0x0030,"ScanMode Active", 16,0xf,0, "Active") -#define awc_RID_gen_ScanMode_Passive awc_def_gen_RID(0x0030,"ScanMode Passive", 16,0xf,1, "Passive") -#define awc_RID_gen_ScanMode_Aironet_ext awc_def_gen_RID(0x0030,"ScanMode Aironet Ext", 16,0xf,2, "Aironet Ext") -#define awc_RID_gen_ProbeDelay awc_def_gen_RID(0x0032,"ProbeDelay", 16,0xffff,0," msek") // Time ms to wait after switching to a channel for clear channel assessment. -#define awc_RID_gen_ProbeEnergyTimeout awc_def_gen_RID(0x0034,"ProbeEnergyTimeout", 16,0xffff,0,"msek") // Time to wait for energy after an active probe. -#define awc_RID_gen_ProbeResponseTimeout awc_def_gen_RID(0x0036,"ProbeResponseTimeout", 16,0xffff,0,"msek") // Time to wait for a probe response after energy detected. -#define awc_RID_gen_BeaconListenTimeout awc_def_gen_RID(0x0038,"BeaconListenTimeout", 16,0xffff,0,"msek") // 0 default 40 Time to listen for a beacon on each channel. -#define awc_RID_gen_IbssJoinNetTimeout awc_def_gen_RID(0x003A,"IbssJoinNetTimeout", 16,0xffff,0,"msek") // 0 default 10000 IBSS: Time to scan for an IBSS before forming a -#define awc_RID_gen_AuthenticationTimeout awc_def_gen_RID(0x003C,"AuthenticationTimeout",16,0xffff,0,"msek") // 0 default 2000 Time limit after which an authentication sequence will -#define awc_RID_gen_AuthenticationType awc_def_gen_RID(0x003E,"AuthenticationType", 16,0xffff,0,NULL) // 0 default 1 (open) // Selects the desired authentication and privacy methods. -#define awc_RID_gen_AuthenticationType_None awc_def_gen_RID(0x003E,"AuthenticationType None", 16,0xffff,0,"None") // 0x00 = None -#define awc_RID_gen_AuthenticationType_Open awc_def_gen_RID(0x003E,"AuthenticationType Open", 16,0xffff,1,"Open") // 0x01 = Open -#define awc_RID_gen_AuthenticationType_Shared awc_def_gen_RID(0x003E,"AuthenticationType Shared-Key", 16,0xffff,2,"Shared-Key") // 0x02 = Shared-Key -#define awc_RID_gen_AuthenticationType_Exclude_Open awc_def_gen_RID(0x003E,"AuthenticationType Exclude Open", 16,0xffff,4,"Exclude Open") // 0x04 = Exclude Unencrypted -#define awc_RID_gen_AssociationTimeout awc_def_gen_RID(0x0040,"AssociationTimeout", 16,0xffff,0,"msek") // 0 default 2000 ESS: Time limit after which an association sequence -#define awc_RID_gen_SpecifiedAPtimeout awc_def_gen_RID(0x0042,"SpecifiedAPtimeout", 16,0xffff,0,"msek") // 0 default 10000 0 selects the factory default [~10 sec]. -#define awc_RID_gen_OfflineScanInterval awc_def_gen_RID(0x0044,"OfflineScanInterval", 16,0xffff,0,"msek") // 0 0 0 disables offline scanning.(kus) The time period between offline scans. -#define awc_RID_gen_OfflineScanDuration awc_def_gen_RID(0x0046,"OfflineScanDuration", 16,0xffff,0,"msek") // 0 0 0 disables offline scanning. // (kus) The duration of an offline scan. -#define awc_RID_gen_LinkLossDelay awc_def_gen_RID(0x0048,"LinkLossDelay", 16,0xffff,0,"msek") // 0 0 Time to delay before reporting a loss of association -#define awc_RID_gen_MaxBeaconLostTime awc_def_gen_RID(0x004A,"MaxBeaconLostTime", 16,0xffff,0,"msek") // 0 default 500 If no beacons are received for this time period, the unit -#define awc_RID_gen_RefreshInterval awc_def_gen_RID(0x004C,"RefreshInterval", 16,0xffff,0,"msek") // 0 default 10000 At the specified interval, the station will send a refresh -//POWER SAVE OPERATION -#define awc_RID_gen_PowerSaveMode awc_def_gen_RID(0x0050,"PowerSaveMode", 16,0xffff,0,NULL) // 0 0Note, for IBSS there is only one PSP mode and it is only enabled if the ATIMwindow is non-zero. -#define awc_RID_gen_PowerSaveMode_CAM awc_def_gen_RID(0x0050,"PowerSaveMode CAM", 16,0x000f,0,"CAM") // 0 = CAM -#define awc_RID_gen_PowerSaveMode_PSP awc_def_gen_RID(0x0050,"PowerSaveMode PSP", 16,0x000f,1,"PSP") // 1 = PSP -#define awc_RID_gen_PowerSaveMode_Fast_PSP awc_def_gen_RID(0x0050,"PowerSaveMode Fast PSP", 16,0x000f,2,"Fast PSP") //2 = PSP-CAM [FASTPSP] -#define awc_RID_gen_SleepForDTIMs awc_def_gen_RID(0x0052,"SleepForDTIMs", 16,0xffff,0,"DTIMs") // 0 0If non-zero, the station may sleep through DTIMs; this -#define awc_RID_gen_ListenInterval awc_def_gen_RID(0x0054,"ListenInterval", 16,0xffff,0,"msek") // 0 default 200 kus Maximum time to awaken for TIMs. 0 selects factory -#define awc_RID_gen_FastListenInterval awc_def_gen_RID(0x0056,"FastListenInterval", 16,0xffff,0,"msek") // 0 default 100 kus The listen interval to be used immediately after -#define awc_RID_gen_ListenDecay awc_def_gen_RID(0x0058,"ListenDecay", 16,0xffff,0,"times") // 0 default 2Number of times to use the current listen interval -#define awc_RID_gen_FastListenDelay awc_def_gen_RID(0x005A,"FastListenDelay", 16,0xffff,0,"msek") // 0 default 200 kus Time interval to delay before going to fast listen -#define awc_RID_gen_Reserved0x005C awc_def_gen_RID(0x005C,"Reserved0x005C", 32,0xffffffff,0,"") // -//ADHOC (or AP) OPERATION -#define awc_RID_gen_BeaconPeriod awc_def_gen_RID(0x0060,"BeaconPeriod", 16,0xffff,0,"msek") // 0 default 100 0 selects the factory default of [~100 ms]. (kus) -#define awc_RID_gen_AtimDuration awc_def_gen_RID(0x0062,"AtimDuration", 16,0xffff,0,"msek") // 0 default 5 kus The time period reserved for ATIMs immediately after (kus) the beacon. 0xFFFF will disable the ATIM window; power save mode will not operate.This parameter only applies to adhoc/IBSS. -#define awc_RID_gen_Reserved0x0064 awc_def_gen_RID(0x0064,"Reserved64", 16,0xffff,0,"") // 0 0Reserved for future use -#define awc_RID_gen_DSChannel awc_def_gen_RID(0x0066,"DSChannel", 16,0xffff,0,"") // 0 default 1The desired operating channel. ()refer to 802.11) For North America, a Channel of 0 is 2412 MHz. -#define awc_RID_gen_Reserved0x0068 awc_def_gen_RID(0x0068,"Reserved68", 16,0xffff,0,"") // 0 0Reserved for future use -#define awc_RID_gen_DTIM_Period awc_def_gen_RID(0x006A,"DTIM Period", 16,0xffff,0,"") // 0 default 1Selects how often a beacon is a DTIM for APs -#define awc_RID_gen_Reserved0x0006C awc_def_gen_RID(0x006C,"Reserved6C", 32,0xffffffff,0,"") // 0's0's Reserved for future use -//RADIO OPERATION -#define awc_RID_gen_RadioSpreadType awc_def_gen_RID(0x0070,"RadioSpreadType", 16,0xffff,0,NULL) // 0 default 0Selects the radio operational mode. By default, this will -#define awc_RID_gen_RadioSpreadType_FH awc_def_gen_RID(0x0070,"RadioSpreadType FH", 16,0xffff,0,"FH") //0 = 802.11 FH Radio (Default) -#define awc_RID_gen_RadioSpreadType_DS awc_def_gen_RID(0x0070,"RadioSpreadType DS", 16,0xffff,1,"DS") //1 = 802.11 DS Radio -#define awc_RID_gen_RadioSpreadType_LM awc_def_gen_RID(0x0070,"RadioSpreadType LM2000", 16,0xffff,2,"LM2000") //2 = LM2000 (Legacy) DS Radio -#define awc_RID_gen_TX_antenna_Diversity awc_def_gen_RID(0x0072,"TX antenna Diversity", 16,0xff00,0,NULL) // 0 default 0x0303 This field is bit-mapped to select the operational -#define awc_RID_gen_TX_antenna_Diversity_default awc_def_gen_RID(0x0072,"TX antenna Diversity Default", 16,0xff00,0x0000,"Default") // 0 = Diversity as programmed at the factory -#define awc_RID_gen_TX_antenna_Diversity_1 awc_def_gen_RID(0x0072,"TX antenna Diversity Antenna 1", 16,0xff00,0x0100,"Antenna 1") // 1 = Antenna 1 only -#define awc_RID_gen_TX_antenna_Diversity_2 awc_def_gen_RID(0x0072,"TX antenna Diversity Antenna 2", 16,0xff00,0x0200,"Antenna 2") // 2 = Antenna 2 only -#define awc_RID_gen_TX_antenna_Diversity_both awc_def_gen_RID(0x0072,"TX antenna Diversity both antennas", 16,0xff00,0x0300,"both antennas") // 3 = Antennas 1 and 2 are active -#define awc_RID_gen_RX_antenna_Diversity awc_def_gen_RID(0x0072,"RX antenna Diversity", 16,0x00ff,0,NULL) // 0 default 0x0303 This field is bit-mapped to select the operational -#define awc_RID_gen_RX_antenna_Diversity_default awc_def_gen_RID(0x0072,"RX antenna Diversity Default", 16,0x00ff,0,"Default") // 0 = Diversity as programmed at the factory -#define awc_RID_gen_RX_antenna_Diversity_1 awc_def_gen_RID(0x0072,"RX antenna Diversity Antenna 1", 16,0x00ff,1,"Antenna 1") // 1 = Antenna 1 only -#define awc_RID_gen_RX_antenna_Diversity_2 awc_def_gen_RID(0x0072,"RX antenna Diversity Antenna 2", 16,0x00ff,2,"Antenna 2") // 2 = Antenna 2 only -#define awc_RID_gen_RX_antenna_Diversity_both awc_def_gen_RID(0x0072,"RX antenna Diversity both antennas", 16,0x00ff,3,"both antennas") // -#define awc_RID_gen_TransmitPower awc_def_gen_RID(0x0074,"TransmitPower", 16,0xffff,0,"mW (rounded up, btw)") // 0 default 250 or 0 selects the default (maximum power allowed for the -#define awc_RID_gen_RSSIthreshold awc_def_gen_RID(0x0076,"RSSIthreshold", 16,0xffff,0,"units") // 0 default 0 RSSI threshold. 0 selects factory default. -#define awc_RID_gen_Modulation awc_def_gen_RID(0x0078,"Modulation", 8,0xff,0,"") // modulation type -#define awc_RID_gen_Reserved0x0079 awc_def_gen_RID(0x0079,"Reserved0x0079", 56,0xff,0,"") // 0's0's reserved for future radio specific parameters - - -//AIRONET EXTENSIONS -#define awc_RID_gen_NodeName awc_def_gen_RID(0x0080,"NodeName", 128,0,0,"") // 0 0 Station name. -#define awc_RID_gen_ARLThreshold awc_def_gen_RID(0x0090,"ARLThreshold", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_gen_ARLDecay awc_def_gen_RID(0x0092,"ARLDecay", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_gen_ARLDelay awc_def_gen_RID(0x0094,"ARLDelay", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_gen_Unused0x0096 awc_def_gen_RID(0x0096,"Reserved0x96", 16,0xffff,0,"") // -#define awc_RID_gen_MagicPacketAction awc_def_gen_RID(0x0098,"MagicPacketAction", 8,0xff,0," hell knows what") // 0 0 0 selects no action to be taken on a magic packet and" -#define awc_RID_gen_MagicPacketControl awc_def_gen_RID(0x0099,"MagicPacketControl", 8,0xff,0," hell know what") // 0 0 0 will disable the magic packet mode command" - - -#define awc_RID_act_RidLen {&aironet4500_RID_Select_Active_Config,0x0000, 8,1,1,1,0, 0xffffffff,0x0000, "Length of RID" } -#define awc_RID_act_OperatingMode_adhoc {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000003,0x0000,"Opmode IBSS Adhoc operation" } -#define awc_RID_act_OperatingMode_Infrastructure {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000003,0x0001,"Opmode Infrastructure Station operation" } -#define awc_RID_act_OperatingMode_AP {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000003,0x0002,"Opmode Access Point" } -#define awc_RID_act_OperatingMode_AP_and_repeater {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000003,0x0003,"Opmode Access Point and Repeater" } -#define awc_RID_act_OperatingMode_No_payload_modify {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000100,0x0100,"Opmode Payload without modify" } -#define awc_RID_act_OperatingMode_LLC_802_3_convert {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000100,0x0000,"Opmode LLC -> 802.3 convert" } -#define awc_RID_act_OperatingMode_proprietary_ext {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000200,0x0200,"Opmode Aironet Extentsions enabled" } -#define awc_RID_act_OperatingMode_no_proprietary_ext {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0,0x00000200,0x0000,"Opmode Aironet Extentsions disabled" } -#define awc_RID_act_OperatingMode_AP_ext {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000400,0x0400,"Opmode AP Extentsions enabled" } -#define awc_RID_act_OperatingMode_no_AP_ext {&aironet4500_RID_Select_Active_Config,0x0002,16,1,1,0,0, 0x00000400,0x0000,"Opmode AP Extentsions disabled" } -#define awc_RID_act_ReceiveMode {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0xffffffff,0x0000,"RX Mode"} -#define awc_RID_act_ReceiveMode_BMA {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0000,"RX Mode BC MC ADDR"} -#define awc_RID_act_ReceiveMode_BA {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0001,"RX Mode BC ADDR"} -#define awc_RID_act_ReceiveMode_A {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0002,"RX Mode ADDR"} -#define awc_RID_act_ReceiveMode_802_11_monitor {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0003,"RX Mode 802.11 Monitor current BSSID"} -#define awc_RID_act_ReceiveMode_802_11_any_monitor {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0004,"RX Mode 802.11 Monitor any BSSID"} -#define awc_RID_act_ReceiveMode_LAN_monitor {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x0000000f,0x0005,"RX Mode LAN Monitor current BSSID"} -#define awc_RID_act_ReceiveMode_802_3_hdr_disable {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x00000100,0x0100,"RX Mode Disable RX 802.3 Header"} -#define awc_RID_act_ReceiveMode_802_3_hdr_enable {&aironet4500_RID_Select_Active_Config,0x0004,16,1,1,0,0,0x00000100,0x0000,"RX Mode Enable RX 802.3 header"} -#define awc_RID_act_Fragmentation_threshold {&aironet4500_RID_Select_Active_Config,0x0006,16,1,1,0,0,0x0000ffff,0x0000,"Fragmentation Threshold"} -#define awc_RID_act_RTS_threshold {&aironet4500_RID_Select_Active_Config,0x0008,16,1,1,0,0,0xffff,0x0000,"RTS Threshold"} -#define awc_RID_act_Station_Mac_Id {&aironet4500_RID_Select_Active_Config,0x000A, 8,6,1,0,0,0xff,0,"Station MAC Id"} -#define awc_RID_act_Supported_rates {&aironet4500_RID_Select_Active_Config,0x0010, 8,8,1,0,1,0xff,0x00,"Supported Rates"} -#define awc_RID_act_Basic_Rate {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x80,0x80,"Basic Rate"} -#define awc_RID_act_Rate_500kbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x01,"Rate 500kbps"} -#define awc_RID_act_Rate_1Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x02,"Rate 1Mbps"} -#define awc_RID_act_Rate_2Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x04,"Rate 2Mbps"} -#define awc_RID_act_Rate_4Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x08,"Rate 4Mbps"} -#define awc_RID_act_Rate_5Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x0B,"Rate 5.5Mbps"} -#define awc_RID_act_Rate_10Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x14,"Rate 10Mbps"} -#define awc_RID_act_Rate_11Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0x7f,0x16,"Rate 11Mbps"} -#define awc_RID_act_BasicRate_500kbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x81,"BasicRate 500kbps"} -#define awc_RID_act_BasicRate_1Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x82,"BasicRate 1Mbps"} -#define awc_RID_act_BasicRate_2Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x84,"BasicRate 2Mbps"} -#define awc_RID_act_BasicRate_4Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x88,"BasicRate 4Mbps"} -#define awc_RID_act_BasicRate_5Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x8B,"BasicRate 5.5Mbps"} -#define awc_RID_act_BasicRate_10Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x94,"BasicRate 10Mbps"} -#define awc_RID_act_BasicRate_11Mbps {&aironet4500_RID_Select_Active_Config,0x0010, 8,1,1,0,1,0xff,0x96,"BasicRate 11Mbps"} - - -#define awc_RID_act_Long_retry_limit {&aironet4500_RID_Select_Active_Config,0x0018,16, 1,1,0,0,0xffff,0,"Short Retry Limit"} -#define awc_RID_act_Short_retry_limit {&aironet4500_RID_Select_Active_Config,0x001A,16, 1,1,0,0,0xffff,0,"Long Retry Limit"} -#define awc_RID_act_Tx_MSDU_lifetime {&aironet4500_RID_Select_Active_Config,0x001C,16, 1,1000,0,0,0xffff,0,"TX MSDU Lifetime"} -#define awc_RID_act_Rx_MSDU_lifetime {&aironet4500_RID_Select_Active_Config,0x001E,16, 1,1000,0,0,0xffff,0,"RX MSDU Lifetime"} -#define awc_RID_act_Stationary {&aironet4500_RID_Select_Active_Config,0x0020,16, 1,1,0,0,0xffff,0,"Stationary"} -#define awc_RID_act_BC_MC_Ordering {&aironet4500_RID_Select_Active_Config,0x0022,16, 1,1,0,0,0xffff,0,"Strictly order Bcast and Mcast"} -#define awc_RID_act_Device_type {&aironet4500_RID_Select_Active_Config,0x0024,16, 1,1,1,0,0xffff,0x0065,"Radio Type PC4500"} -#define awc_RID_act_Reserved_0x0026 {&aironet4500_RID_Select_Active_Config,0x0026, 8,10,1,0,0,0xff,0,"Reserved0x28"} - - -//SCANNING/ASSOCIATING -#define awc_RID_act_ScanMode awc_def_act_RID(0x0030,"ScanMode", 16,0xf,0, NULL) -#define awc_RID_act_ScanMode_Active awc_def_act_RID(0x0030,"ScanMode Active", 16,0xf,0, "Active") -#define awc_RID_act_ScanMode_Passive awc_def_act_RID(0x0030,"ScanMode Passive", 16,0xf,1, "Passive") -#define awc_RID_act_ScanMode_Aironet_ext awc_def_act_RID(0x0030,"ScanMode Aironet Ext", 16,0xf,2, "Aironet Ext") -#define awc_RID_act_ProbeDelay awc_def_act_RID(0x0032,"ProbeDelay", 16,0xffff,0," msek") // Time ms to wait after switching to a channel for clear channel assessment. -#define awc_RID_act_ProbeEnergyTimeout awc_def_act_RID(0x0034,"ProbeEnergyTimeout", 16,0xffff,0,"msek") // Time to wait for energy after an active probe. -#define awc_RID_act_ProbeResponseTimeout awc_def_act_RID(0x0036,"ProbeResponseTimeout", 16,0xffff,0,"msek") // Time to wait for a probe response after energy detected. -#define awc_RID_act_BeaconListenTimeout awc_def_act_RID(0x0038,"BeaconListenTimeout", 16,0xffff,0,"msek") // 0 default 40 Time to listen for a beacon on each channel. -#define awc_RID_act_IbssJoinNetTimeout awc_def_act_RID(0x003A,"IbssJoinNetTimeout", 16,0xffff,0,"msek") // 0 default 10000 IBSS: Time to scan for an IBSS before forming a -#define awc_RID_act_AuthenticationTimeout awc_def_act_RID(0x003C,"AuthenticationTimeout",16,0xffff,0,"msek") // 0 default 2000 Time limit after which an authentication sequence will -#define awc_RID_act_AuthenticationType awc_def_act_RID(0x003E,"AuthenticationType", 16,0xffff,0,NULL) // 0 default 1 (open) // Selects the desired authentication and privacy methods. -#define awc_RID_act_AuthenticationType_None awc_def_act_RID(0x003E,"AuthenticationType None", 16,0xffff,0,"None") // 0x00 = None -#define awc_RID_act_AuthenticationType_Open awc_def_act_RID(0x003E,"AuthenticationType Open", 16,0xffff,1,"Open") // 0x01 = Open -#define awc_RID_act_AuthenticationType_Shared awc_def_act_RID(0x003E,"AuthenticationType Shared-Key", 16,0xffff,2,"Shared-Key") // 0x02 = Shared-Key -#define awc_RID_act_AuthenticationType_Exclude_Open awc_def_act_RID(0x003E,"AuthenticationType Exclude Open", 16,0xffff,4,"Exclude Open") // 0x04 = Exclude Unencrypted -#define awc_RID_act_AssociationTimeout awc_def_act_RID(0x0040,"AssociationTimeout", 16,0xffff,0,"msek") // 0 default 2000 ESS: Time limit after which an association sequence -#define awc_RID_act_SpecifiedAPtimeout awc_def_act_RID(0x0042,"SpecifiedAPtimeout", 16,0xffff,0,"msek") // 0 default 10000 0 selects the factory default [~10 sec]. -#define awc_RID_act_OfflineScanInterval awc_def_act_RID(0x0044,"OfflineScanInterval", 16,0xffff,0,"msek") // 0 0 0 disables offline scanning.(kus) The time period between offline scans. -#define awc_RID_act_OfflineScanDuration awc_def_act_RID(0x0046,"OfflineScanDuration", 16,0xffff,0,"msek") // 0 0 0 disables offline scanning. // (kus) The duration of an offline scan. -#define awc_RID_act_LinkLossDelay awc_def_act_RID(0x0048,"LinkLossDelay", 16,0xffff,0,"msek") // 0 0 Time to delay before reporting a loss of association -#define awc_RID_act_MaxBeaconLostTime awc_def_act_RID(0x004A,"MaxBeaconLostTime", 16,0xffff,0,"msek") // 0 default 500 If no beacons are received for this time period, the unit -#define awc_RID_act_RefreshInterval awc_def_act_RID(0x004C,"RefreshInterval", 16,0xffff,0,"msek") // 0 default 10000 At the specified interval, the station will send a refresh -//POWER SAVE OPERATION -#define awc_RID_act_PowerSaveMode awc_def_act_RID(0x0050,"PowerSaveMode", 16,0xffff,0,NULL) // 0 0Note, for IBSS there is only one PSP mode and it is only enabled if the ATIMwindow is non-zero. -#define awc_RID_act_PowerSaveMode_CAM awc_def_act_RID(0x0050,"PowerSaveMode CAM", 16,0x000f,0,"CAM") // 0 = CAM -#define awc_RID_act_PowerSaveMode_PSP awc_def_act_RID(0x0050,"PowerSaveMode PSP", 16,0x000f,1,"PSP") // 1 = PSP -#define awc_RID_act_PowerSaveMode_Fast_PSP awc_def_act_RID(0x0050,"PowerSaveMode Fast PSP", 16,0x000f,2,"Fast PSP") //2 = PSP-CAM [FASTPSP] -#define awc_RID_act_SleepForDTIMs awc_def_act_RID(0x0052,"SleepForDTIMs", 16,0xffff,0,"DTIMs") // 0 0If non-zero, the station may sleep through DTIMs; this -#define awc_RID_act_ListenInterval awc_def_act_RID(0x0054,"ListenInterval", 16,0xffff,0,"msek") // 0 default 200 kus Maximum time to awaken for TIMs. 0 selects factory -#define awc_RID_act_FastListenInterval awc_def_act_RID(0x0056,"FastListenInterval", 16,0xffff,0,"msek") // 0 default 100 kus The listen interval to be used immediately after -#define awc_RID_act_ListenDecay awc_def_act_RID(0x0058,"ListenDecay", 16,0xffff,0,"times") // 0 default 2Number of times to use the current listen interval -#define awc_RID_act_FastListenDelay awc_def_act_RID(0x005A,"FastListenDelay", 16,0xffff,0,"msek") // 0 default 200 kus Time interval to delay before going to fast listen -#define awc_RID_act_Reserved0x005C awc_def_act_RID(0x005C,"Reserved0x005C", 32,0,0,"") // -//ADHOC (or AP) OPERATION -#define awc_RID_act_BeaconPeriod awc_def_act_RID(0x0060,"BeaconPeriod", 16,0xffff,0,"msek") // 0 default 100 0 selects the factory default of [~100 ms]. (kus) -#define awc_RID_act_AtimDuration awc_def_act_RID(0x0062,"AtimDuration", 16,0xffff,0,"msek") // 0 default 5 kus The time period reserved for ATIMs immediately after (kus) the beacon. 0xFFFF will disable the ATIM window; power save mode will not operate.This parameter only applies to adhoc/IBSS. -#define awc_RID_act_Reserved0x0064 awc_def_act_RID(0x0064,"Reserved64", 16,0xffff,0,"") // 0 0Reserved for future use -#define awc_RID_act_DSChannel awc_def_act_RID(0x0066,"DSChannel", 16,0xffff,0,"") // 0 default 1The desired operating channel. ()refer to 802.11) For North America, a Channel of 0 is 2412 MHz. -#define awc_RID_act_Reserved0x0068 awc_def_act_RID(0x0068,"Reserved68", 16,0xffff,0,"") // 0 0Reserved for future use -#define awc_RID_act_DTIM_Period awc_def_act_RID(0x006A,"DTIM Period", 16,0xffff,0,"") // 0 default 1Selects how often a beacon is a DTIM for APs -#define awc_RID_act_Reserved0x0006C awc_def_act_RID(0x006C,"Reserved6C", 32,0xffffffff,0,"") // 0's0's Reserved for future use -//RADIO OPERATION -#define awc_RID_act_RadioSpreadType awc_def_act_RID(0x0070,"RadioSpreadType", 16,0xffff,0,NULL) // 0 default 0Selects the radio operational mode. By default, this will -#define awc_RID_act_RadioSpreadType_FH awc_def_act_RID(0x0070,"RadioSpreadType FH", 16,0xffff,0,"FH") //0 = 802.11 FH Radio (Default) -#define awc_RID_act_RadioSpreadType_DS awc_def_act_RID(0x0070,"RadioSpreadType DS", 16,0xffff,1,"DS") //1 = 802.11 DS Radio -#define awc_RID_act_RadioSpreadType_LM awc_def_act_RID(0x0070,"RadioSpreadType LM2000", 16,0xffff,2,"LM2000") //2 = LM2000 (Legacy) DS Radio -#define awc_RID_act_TX_antenna_Diversity awc_def_act_RID(0x0072,"TX antenna Diversity", 16,0xff00,0,NULL) // 0 default 0x0303 This field is bit-mapped to select the operational -#define awc_RID_act_TX_antenna_Diversity_default awc_def_act_RID(0x0072,"TX antenna Diversity Default", 16,0xff00,0x0000,"Default") // 0 = Diversity as programmed at the factory -#define awc_RID_act_TX_antenna_Diversity_1 awc_def_act_RID(0x0072,"TX antenna Diversity Antenna 1", 16,0xff00,0x0100,"Antenna 1") // 1 = Antenna 1 only -#define awc_RID_act_TX_antenna_Diversity_2 awc_def_act_RID(0x0072,"TX antenna Diversity Antenna 2", 16,0xff00,0x0200,"Antenna 2") // 2 = Antenna 2 only -#define awc_RID_act_TX_antenna_Diversity_both awc_def_act_RID(0x0072,"TX antenna Diversity both antennas", 16,0xff00,0x0300,"both antennas") // 3 = Antennas 1 and 2 are active -#define awc_RID_act_RX_antenna_Diversity awc_def_act_RID(0x0072,"RX antenna Diversity", 16,0x00ff,0,NULL) // 0 default 0x0303 This field is bit-mapped to select the operational -#define awc_RID_act_RX_antenna_Diversity_default awc_def_act_RID(0x0072,"RX antenna Diversity Default", 16,0x00ff,0,"Default") // 0 = Diversity as programmed at the factory -#define awc_RID_act_RX_antenna_Diversity_1 awc_def_act_RID(0x0072,"RX antenna Diversity Antenna 1", 16,0x00ff,1,"Antenna 1") // 1 = Antenna 1 only -#define awc_RID_act_RX_antenna_Diversity_2 awc_def_act_RID(0x0072,"RX antenna Diversity Antenna 2", 16,0x00ff,2,"Antenna 2") // 2 = Antenna 2 only -#define awc_RID_act_RX_antenna_Diversity_both awc_def_act_RID(0x0072,"RX antenna Diversity both antennas", 16,0x00ff,3,"both antennas") // -#define awc_RID_act_TransmitPower awc_def_act_RID(0x0074,"TransmitPower", 16,0xffff,0,"mW (rounded up, btw)") // 0 default 250 or 0 selects the default (maximum power allowed for the -#define awc_RID_act_RSSIthreshold awc_def_act_RID(0x0076,"RSSIthreshold", 16,0xffff,0,"units") // 0 default 0 RSSI threshold. 0 selects factory default. -#define awc_RID_act_Reserved0x0078 awc_def_act_RID(0x0078,"Reserved0x0078", 64,0,0,"") // 0's0's reserved for future radio specific parameters -#define awc_RID_act_Modulation awc_def_act_RID(0x0078,"Modulation", 8,0xff,0,"") // modulation type -#define awc_RID_act_Reserved0x0079 awc_def_act_RID(0x0079,"Reserved0x0079", 56,0xff,0,"") // 0's0's reserved for future radio specific parameters - -//AIRONET EXTENSIONS -#define awc_RID_act_NodeName awc_def_act_RID(0x0080,"NodeName", 128,0,0,"") // 0 0 Station name. -#define awc_RID_act_ARLThreshold awc_def_act_RID(0x0090,"ARLThreshold", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_act_ARLDecay awc_def_act_RID(0x0092,"ARLDecay", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_act_ARLDelay awc_def_act_RID(0x0094,"ARLDelay", 16,0xffff,0,"times") // 0 default 0xFFFF 0 selects the factory defaults. (which for now is -#define awc_RID_act_Unused0x0096 awc_def_act_RID(0x0096,"Reserved0x96", 16,0xffff,0,"") // -#define awc_RID_act_MagicPacketAction awc_def_act_RID(0x0098,"MagicPacketAction", 8,0xff,0," hell knows what") // 0 0 0 selects no action to be taken on a magic packet and" -#define awc_RID_act_MagicPacketControl awc_def_act_RID(0x0099,"MagicPacketControl", 8,0xff,0," hell know what") // 0 0 0 will disable the magic packet mode command" - - - -// *************************** SSID RID - - - -#define awc_RID_SSID_RidLen awc_def_SSID_RID(0x0000,"RidLen", 16,0xffff,0,"") //RidLen ",16,0xffff,,"") // read-only Length of this RID including the length field 0x68 -#define awc_RID_SSID_Accept_any awc_def_SSID_RID(0x0002,"Accept Any SSID", 16,0xffff,0,"Accept ANY SSID") // -#define awc_RID_SSIDlen1 awc_def_SSID_RID(0x0002,"SSIDlen1", 16,0xffff,0,"") // 7 The length of the SSID1 byte string. -#define awc_RID_SSID1 awc_def_SSID_RID(0x0004,"SSID1", 255,0,0,"") // "tsunami" The identifier uniquely identifying the wireless system. -#define awc_RID_SSIDlen2 awc_def_SSID_RID(0x0024,"SSIDlen2", 16,0xffff,0,"") // 0 The length of the SSID2 byte string. -#define awc_RID_SSID2 awc_def_SSID_RID(0x0026,"SSID2", 255,0,0,"") // -#define awc_RID_SSIDlen3 awc_def_SSID_RID(0x0046,"SSIDlen3", 16,0xffff,0,"") // 0 The length of the SSID3 byte string. -#define awc_RID_SSID3 awc_def_SSID_RID(0x0048,"SSID3", 255,0,0,"") // -#define awc_RID_SSID1hex awc_def_SSID_RID(0x0004,"SSID1hex", 255,0xff,0,"") -#define awc_RID_SSID2hex awc_def_SSID_RID(0x0026,"SSID2hex", 255,0xff,0,"") -#define awc_RID_SSID3hex awc_def_SSID_RID(0x0048,"SSID3hex", 255,0xff,0,"") - -// AP list - -#define awc_RID_AP_List_RidLen awc_def_AP_List_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_AP_List_SpecifiedAP1 awc_def_AP_List_RID(0x0002,"SpecifiedAP1", 48,0xff,0,"") // 0 Specifies the MAC address of an access point to attempt to associate to first, before looking for other Access Points -#define awc_RID_AP_List_SpecifiedAP2 awc_def_AP_List_RID(0x0008,"SpecifiedAP2", 48,0xff,0,"") // 0 Allows for a secondary AP to associate to if the radio cannot associate to the primary AP. -#define awc_RID_AP_List_SpecifiedAP3 awc_def_AP_List_RID(0x000E,"SpecifiedAP3", 48,0xff,0,"") // 0 Allows for a third option when specifying a list of APs. -#define awc_RID_AP_List_SpecifiedAP4 awc_def_AP_List_RID(0x0014,"SpecifiedAP4", 48,0xff,0,"") // 0 Allows for a fourth option when specifying a list of APs. - -// Driver Name - -#define awc_RID_Dname_RidLen awc_def_Dname_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_Dname_DriverName awc_def_Dname_RID(0x0002,"DriverName", 128,0,0,"") // The driver name and version can be written here for debugging support - - -// Encapsulation Transformations RID - -#define awc_RID_Enc_RidLen awc_def_Enc_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_Enc_EtherType1 awc_def_Enc_RID(0x0002,"EtherType1", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_1 awc_def_Enc_RID(0x0004,"RX Action 1", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_1_RFC_1042 awc_def_Enc_RID(0x0004,"RX Action 1", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_1_802_11 awc_def_Enc_RID(0x0004,"RX Action 1", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_1 awc_def_Enc_RID(0x0004,"TX Action 1", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_1_RFC_1042 awc_def_Enc_RID(0x0004,"TX Action 1", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_1_802_11 awc_def_Enc_RID(0x0004,"Tx Action 1", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType2 awc_def_Enc_RID(0x0006,"EtherType2", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_2 awc_def_Enc_RID(0x0008,"RX Action 2", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_2_RFC_1042 awc_def_Enc_RID(0x0008,"RX Action 2", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_2_802_11 awc_def_Enc_RID(0x0008,"RX Action 2", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_2 awc_def_Enc_RID(0x0008,"TX Action 2", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_2_RFC_1042 awc_def_Enc_RID(0x0008,"TX Action 2", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_2_802_11 awc_def_Enc_RID(0x0008,"Tx Action 2", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType3 awc_def_Enc_RID(0x000A,"EtherType3", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_3 awc_def_Enc_RID(0x000C,"RX Action 3", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_3_RFC_1042 awc_def_Enc_RID(0x000C,"RX Action 3", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_3_802_11 awc_def_Enc_RID(0x000C,"RX Action 3", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_3_ awc_def_Enc_RID(0x000C,"TX Action 3", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_3_RFC_1042 awc_def_Enc_RID(0x000C,"TX Action 3", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_3_802_11 awc_def_Enc_RID(0x000C,"Tx Action 3", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType4 awc_def_Enc_RID(0x000E,"EtherType4", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_4 awc_def_Enc_RID(0x0010,"RX Action 4", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_4_RFC_1042 awc_def_Enc_RID(0x0010,"RX Action 4", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_4_802_11 awc_def_Enc_RID(0x0010,"RX Action 4", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_4 awc_def_Enc_RID(0x0010,"TX Action 4", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_4_RFC_1042 awc_def_Enc_RID(0x0010,"TX Action 4", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_4_802_11 awc_def_Enc_RID(0x0010,"Tx Action 4", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType5 awc_def_Enc_RID(0x0012,"EtherType5", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_5 awc_def_Enc_RID(0x0014,"RX Action 5", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_5_RFC_1042 awc_def_Enc_RID(0x0014,"RX Action 5", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_5_802_11 awc_def_Enc_RID(0x0014,"RX Action 5", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_5 awc_def_Enc_RID(0x0014,"TX Action 5", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_5_RFC_1042 awc_def_Enc_RID(0x0014,"TX Action 5", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_5_802_11 awc_def_Enc_RID(0x0014,"Tx Action 5", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType6 awc_def_Enc_RID(0x0016,"EtherType6", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_6 awc_def_Enc_RID(0x0018,"RX Action 6", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_6_RFC_1042 awc_def_Enc_RID(0x0018,"RX Action 6", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_6_802_11 awc_def_Enc_RID(0x0018,"RX Action 6", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_6 awc_def_Enc_RID(0x0018,"TX Action 6", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_6_RFC_1042 awc_def_Enc_RID(0x0018,"TX Action 6", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_6_802_11 awc_def_Enc_RID(0x0018,"Tx Action 6", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType7 awc_def_Enc_RID(0x001A,"EtherType7", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_7 awc_def_Enc_RID(0x001C,"RX Action 8", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_7_RFC_1042 awc_def_Enc_RID(0x001C,"RX Action 7", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_7_802_11 awc_def_Enc_RID(0x001C,"RX Action 7", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_7 awc_def_Enc_RID(0x001C,"TX Action 7", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_7_RFC_1042 awc_def_Enc_RID(0x001C,"TX Action 7", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_7_802_11 awc_def_Enc_RID(0x001C,"Tx Action 7", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_EtherType8 awc_def_Enc_RID(0x001E,"EtherType7", 16,0xffff,0,"") // 0 Note, the ethertype values are in network transmission order. So IP (0x800) is actually (0x0008). Zero ends the list and selects the default action. -#define awc_RID_Enc_Action_RX_8 awc_def_Enc_RID(0x0020,"RX Action 8", 16,0x0001,0,NULL) // 0 This field is bit encoded as follows: -#define awc_RID_Enc_Action_RX_8_RFC_1042 awc_def_Enc_RID(0x0020,"RX Action 8", 16,0x0001,1,"RX RFC1042") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_RX_8_802_11 awc_def_Enc_RID(0x0020,"RX Action 8", 16,0x0001,0,"RX 802.11") // bit 0 (0x0001) 1=RFC1042 is kept for receive packets. -#define awc_RID_Enc_Action_TX_8 awc_def_Enc_RID(0x0020,"TX Action 8", 16,0x0002,0,NULL) // -#define awc_RID_Enc_Action_TX_8_RFC_1042 awc_def_Enc_RID(0x0020,"TX Action 8", 16,0x0002,1,"TX 802.11" ) // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. -#define awc_RID_Enc_Action_TX_8_802_11 awc_def_Enc_RID(0x0020,"Tx Action 8", 16,0x0002,0,"TX RFC1042") // bit 1 (0x0002) 0=RFC1042 is used for transmit encapsulation. 1=802.1H is used for transmit encapsulation. - - -// WEP Key volatile -#define awc_RID_WEPv_RidLen awc_def_WEPv_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_WEPv_KeyIndex awc_def_WEPv_RID(0x0002,"KeyIndex", 16,0xffff,0,"Index to list of keys") -#define awc_RID_WEPv_Address awc_def_WEPv_RID(0x0004,"Address", 48,0xff,0,"mac address related to keys") -#define awc_RID_WEPv_KeyLen awc_def_WEPv_RID(0x000A,"KeyLen", 16,0xffff,0,"Key Length (0 and 5 are valid)") -#define awc_RID_WEPv_Key awc_def_WEPv_RID(0x000C,"Key", 128,0xff,0,"Key itself in hex coding") -#define awc_RID_WEPv_KeyAscii awc_def_WEPv_RID(0x000C,"KeyAscii", 128,0,0,"Key itself in ascii coding") - -// WEP Key non-volatile -#define awc_RID_WEPnv_RidLen awc_def_WEPnv_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_WEPnv_KeyIndex awc_def_WEPnv_RID(0x0002,"KeyIndex", 16,0xffff,0,"Index to list of keys") -#define awc_RID_WEPnv_Address awc_def_WEPnv_RID(0x0004,"Address", 48,0xff,0,"mac address related to keys") -#define awc_RID_WEPnv_KeyLen awc_def_WEPnv_RID(0x000A,"KeyLen", 16,0xffff,0,"Key Length (0 and 5 are valid)") -#define awc_RID_WEPnv_Key awc_def_WEPnv_RID(0x000C,"Key", 128,0xff,0,"Key itself in hex coding") -#define awc_RID_WEPnv_KeyAscii awc_def_WEPnv_RID(0x000C,"KeyAscii", 128,0,0,"Key itself in ascii coding") - -// Modulation -#define awc_RID_Modulation_RidLen awc_def_Modulation_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_Modulation_Modulation awc_def_Modulation_RID(0x0002,"Modulation", 16,0xffff,0,"Modulation") - - -// Capabilities RID -#define awc_RID_Cap_RidLen awc_def_Cap_RID(0x0000,"RidLen", 16,0xffff,0,"") // read-only Length of this RID including the length field -#define awc_RID_Cap_OUI awc_def_Cap_RID(0x0002,"OUI", 24,0xffff,0,"") // 0x00 0x40 This field will give the manufacturer OUI (fourth byte always zero). -#define awc_RID_Cap_ProductNum awc_def_Cap_RID(0x0006,"ProductNum", 24,0xffff,0,"") // 0x0004 This field will give the product number. -#define awc_RID_Cap_ManufacturerName awc_def_Cap_RID(0x0008,"ManufacturerName", 255,0,0,"") // ASCIIz encoding of manufacturer name. -#define awc_RID_Cap_ProductName awc_def_Cap_RID(0x0028,"ProductName", 128,0,0,"") // PC4500 ASCIIz encoding of product name. -#define awc_RID_Cap_ProductVersion awc_def_Cap_RID(0x0038,"ProductVersion", 64,0,0,"") // . ASCIIz encoding of product (firmware?) version. -#define awc_RID_Cap_FactoryAddress awc_def_Cap_RID(0x0040,"FactoryAddress", 48,0xff,0,"") // This field will contain the OEM assigned IEEE address. If there is no OEM address assigned, the Aironet assigned IEEE Address will be returned in this field. -#define awc_RID_Cap_AironetAddress awc_def_Cap_RID(0x0046,"AironetAddress", 48,0xff,0,"") // This field will contain the Aironet factory assigned IEEE address. -#define awc_RID_Cap_RadioSpreadType_DS awc_def_Cap_RID(0x004C,"RadioType_FH", 16,0x0001,1,"") // 0x01 = 802.11 FH -#define awc_RID_Cap_RadioSpreadType_FH awc_def_Cap_RID(0x004C,"RadioType_DS", 16,0x0002,2,"") // 0x02 = 802.11 DS -#define awc_RID_Cap_RadioSpreadType_Legacy awc_def_Cap_RID(0x004C,"RadioType_Legacy", 16,0x0004,4,"") // 0x04 = LM2000 (Legacy) DS // Note, more than one bit may be set for radios supporting multiple modes of operation. -#define awc_RID_Cap_RegDomain awc_def_Cap_RID(0x004E,"RegDomain", 16,0xffff,0,"") // This field indicates the registration domain/country The values as assigned by 802.11 will be used. -#define awc_RID_Cap_Callid awc_def_Cap_RID(0x0050,"Callid", 48,0xff,0,"") // This field indicates the callid assigned to the unit (if RegDomain is Japan) Each nibble will contain one decimal digit of the 12 digit callid. (Note, this is not the encoded format). -#define awc_RID_Cap_SupportedRates awc_def_Cap_RID(0x0056,"SupportedRates", 64,0xff,0,"") // 0x02, 0x04, This field will indicate the 802.11 supported rates as specified in the rates. -#define awc_RID_Cap_RxDiversity awc_def_Cap_RID(0x005E,"RxDiversity", 8 ,0xff,0,"") // 0x03 This field will indicate the number of antennas supported as a bit mask. -#define awc_RID_Cap_TxDiversity awc_def_Cap_RID(0x005F,"TxDiversity", 8 ,0xff,0,"") // 0x03 This field will indicate the number of antennas supported as a bit mask. -#define awc_RID_Cap_TxPowerLevels awc_def_Cap_RID(0x0060,"TxPowerLevels", 128,0xff,0,"") // 250 This table indicates the supported transmit power levels. (values are in mW) Zero terminates the list. Note, this may be further restricted depending on country selected. -#define awc_RID_Cap_HardwareVersion awc_def_Cap_RID(0x0070,"HardwareVersion", 16,0xffff,0,"") // 0 This indicates the revision of hardware. -#define awc_RID_Cap_HardwareCapabilit awc_def_Cap_RID(0x0072,"HardwareCapabilit", 16,0xffff,0,"") // 0 This is a bit-mapped field indicating harware capabilities. No bits have been assigned yet. Initially this is zero. -#define awc_RID_Cap_TemperatureRange awc_def_Cap_RID(0x0074,"TemperatureRange", 16,0xffff,0,"") // 0 This indicates the temperature range capability. -#define awc_RID_Cap_SoftwareVersion awc_def_Cap_RID(0x0076,"SoftwareVersion", 16,0xffff,0,"") // 0 This indicates the revision of software. -#define awc_RID_Cap_SoftwareVersion_major awc_def_Cap_RID(0x0076,"SoftwareVersion major", 16,0xff00,0,"") // The upper byte indicates the major version and the -#define awc_RID_Cap_SoftwareVersion_minor awc_def_Cap_RID(0x0076,"SoftwareVersion minor", 16,0x00ff,0,"") // lower byte the minor version. -#define awc_RID_Cap_SoftwareSubVersion awc_def_Cap_RID(0x0078,"SoftwareSubVersio", 16,0xffff,0,"") // 0 This indicates the sub-revision of software. -#define awc_RID_Cap_InterfaceVersion awc_def_Cap_RID(0x007A,"InterfaceVersion", 16,0xffff,0,"") // 0 This indicates the revision of the interface. This will be bumped whenever there are incompatible modifications made to the interfac This may be bumped on first release to ensure that "unreleased" utilities/drivers become unusable. -#define awc_RID_Cap_SoftwareCapabilities awc_def_Cap_RID(0x007C,"SoftwareCapabiliti", 160,0xff,0,"") // 0 This field gives a bit mapped indication of capabilities. No capability bits have yet been assigned. -#define awc_RID_Cap_BootBlockVersion awc_def_Cap_RID(0x007E,"BootBlockVersion ", 16,0xffff,0,"") // This indicates the revision of bootblock software. The upper byte indicates the major version and the lower byte the minor version. Note, BCD encoding is used. (version 2.11 would be 0x0211.) - - -// Status RID - -#define awc_RID_Status_RidLen awc_def_Stat_RID( 0x0000,"RidLen", 16,0xffff,0,"") // Length of this RID including the length field -#define awc_RID_Status_MacAddress awc_def_Stat_RID( 0x0002,"MacAddress", 48,0xff,0,"") // The MAC address in use by the station. -#define awc_RID_Status_OperationalMode awc_def_Stat_RID( 0x0008,"OperationalMode", 16,0xffff,0,NULL) // Bit-mapped. -#define awc_RID_Status_Configured awc_def_Stat_RID( 0x0008,"OperationalMode Configured", 16,0x0001,1,"Configured") // -#define awc_RID_Status_MAC_Enabled awc_def_Stat_RID( 0x0008,"OperationalMode MAC Enabled", 16,0x0002,2,"MAC Enabled") // -#define awc_RID_Status_Receive_Enabled awc_def_Stat_RID( 0x0008,"OperationalMode Receive Enabled", 16,0x0004,4,"Receive Enabled") // -#define awc_RID_Status_In_Sync awc_def_Stat_RID( 0x0008,"OperationalMode In Sync with cell", 16,0x0010,10,"In Sync with cell") // -#define awc_RID_Status_Associated awc_def_Stat_RID( 0x0008,"OperationalMode Associated", 16,0x0020,20,"Associated") // -#define awc_RID_Status_Error awc_def_Stat_RID( 0x0008,"OperationalMode Error", 16,0x8000,0x8000,"Error") // -#define awc_RID_Status_ErrorCode awc_def_Stat_RID( 0x000A,"ErrorCode", 16,0xffff,0,"") // Non-zero if an error state has been entered -#define awc_RID_Status_CurrentSignalQuality awc_def_Stat_RID( 0x000C,"CurrentSignalQuality",16,0xffff,0,"") // A measure of the current signal quality. -#define awc_RID_Status_SSIDlength awc_def_Stat_RID( 0x000E,"SSIDlength", 16,0xffff,0,"") // This length of the following SSID. -#define awc_RID_Status_SSID awc_def_Stat_RID( 0x0010,"SSID", 255,0,0,"") // The SSID that is currently in effect. -#define awc_RID_Status_ApName awc_def_Stat_RID( 0x0030,"ApName", 128,0,0,"") // The name of the current BSSID (ESS mode only) -#define awc_RID_Status_CurrentBssid awc_def_Stat_RID( 0x0040,"CurrentBssid", 48,0xff,0,"") // BSSID that is currently in effect. -#define awc_RID_Status_PreviousBssid1 awc_def_Stat_RID( 0x0046,"PreviousBssid1", 48,0xff,0,"") // A former BSSID. -#define awc_RID_Status_PreviousBssid2 awc_def_Stat_RID( 0x004C,"PreviousBssid2", 48,0xff,0,"") // A former BSSID. -#define awc_RID_Status_PreviousBssid3 awc_def_Stat_RID( 0x0052,"PreviousBssid3", 48,0xff,0,"") // A former BSSID. -#define awc_RID_Status_BeaconPeriod awc_def_Stat_RID( 0x0058,"BeaconPeriod", 16,0xffff,0,"msek") // (kus) The current beacon period. -#define awc_RID_Status_DtimPeriod awc_def_Stat_RID( 0x005A,"DtimPeriod", 16,0xffff,0,"units") // The current DTIM period (number of beacons between DTIMs). -#define awc_RID_Status_AtimDuration awc_def_Stat_RID( 0x005C,"AtimDuration", 16,0xffff,0,"msek") // (kus) The current ATIM window duration. Adhoc/Ibss only -#define awc_RID_Status_HopPeriod awc_def_Stat_RID( 0x005E,"HopPeriod", 16,0xffff,0,"msek") // (kus) The current hopping period. -#define awc_RID_Status_ChannelSet awc_def_Stat_RID( 0x0060,"ChannelSet", 16,0xffff,0,"Set") // The current channel set. -#define awc_RID_Status_Channel awc_def_Stat_RID( 0x0062,"Channel", 16,0xffff,0," ") // The current operating channel. -#define awc_RID_Status_HopsToBackbone awc_def_Stat_RID( 0x0064,"HopsToBackbone", 16,0xffff,0,"hops") // 0 indicates a backbone association. -#define awc_RID_Status_ApTotalLoad awc_def_Stat_RID( 0x0066,"ApTotalLoad", 16,0xffff,0,"units") // Total load including broadcast/multicast from backbone. This is the value extracted from the Aironet element. -#define awc_RID_Status_OurGeneratedLoad awc_def_Stat_RID( 0x0068,"OurGeneratedLoad", 16,0xffff,0,"units") // Total load generated by our station (transmitted and received). Excludes received broadcast/multicast traffic. -#define awc_RID_Status_AccumulatedArl awc_def_Stat_RID( 0x006A,"AccumulatedArl", 16,0xffff,0,"units") // - -// AP RID - -#define awc_RID_AP_16RidLen awc_def_AP_RID(0x0000,"RidLen", 16,0xffff,0,"") // 0x06, read-only Length of this RID including the length field -#define awc_RID_AP_TIM_addr awc_def_AP_RID(0x0002,"TIM Addr", 16,0xffff,0,"") // Read only The "Traffic Indication Map" is updated by the host via -#define awc_RID_AP_Airo_addr awc_def_AP_RID(0x0004,"Airo Addr", 16,0xffff,0,"") // Read only The "Aironet Information Element" is updated by the host via the AUX I/O ports. This is the address of the Aironet Element. - - -// Statistics RID - -#define awc_RID_Stats_RidLen awc_def_Stats_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats_RxOverrunErr awc_def_Stats_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats_RxPlcpCrcErr awc_def_Stats_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats_RxPlcpFormat awc_def_Stats_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats_RxPlcpLength awc_def_Stats_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats_RxMacCrcErr awc_def_Stats_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats_RxMacCrcOk awc_def_Stats_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats_RxWepErr awc_def_Stats_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_RxWepOk awc_def_Stats_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_RetryLong awc_def_Stats_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_RetryShort awc_def_Stats_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_MaxRetries awc_def_Stats_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACK-d.") -#define awc_RID_Stats_NoAck awc_def_Stats_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats_NoCts awc_def_Stats_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats_RxAck awc_def_Stats_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats_RxCts awc_def_Stats_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats_TxAck awc_def_Stats_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats_TxRts awc_def_Stats_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats_TxCts awc_def_Stats_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats_TxMc awc_def_Stats_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_TxBc awc_def_Stats_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats_TxUcFrags awc_def_Stats_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_TxUcPackets awc_def_Stats_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats_TxBeacon awc_def_Stats_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats_RxBeacon awc_def_Stats_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats_TxSinColl awc_def_Stats_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats_TxMulColl awc_def_Stats_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats_DefersNo awc_def_Stats_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats_DefersProt awc_def_Stats_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats_DefersEngy awc_def_Stats_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats_DupFram awc_def_Stats_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats_RxFragDisc awc_def_Stats_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats_TxAged awc_def_Stats_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats_RxAged awc_def_Stats_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats_LostSync_Max awc_def_Stats_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats_LostSync_Mis awc_def_Stats_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats_LostSync_Arl awc_def_Stats_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats_LostSync_Dea awc_def_Stats_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats_LostSync_Disa awc_def_Stats_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats_LostSync_Tsf awc_def_Stats_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats_HostTxMc awc_def_Stats_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats_HostTxBc awc_def_Stats_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats_HostTxUc awc_def_Stats_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats_HostTxFail awc_def_Stats_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats_HostRxMc awc_def_Stats_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats_HostRxBc awc_def_Stats_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats_HostRxUc awc_def_Stats_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats_HostRxDiscar awc_def_Stats_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats_HmacTxMc awc_def_Stats_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats_HmacTxBc awc_def_Stats_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats_HmacTxUc awc_def_Stats_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats_HmacTxFail awc_def_Stats_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats_HmacRxMc awc_def_Stats_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_HmacRxBc awc_def_Stats_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats_HmacRxUc awc_def_Stats_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_HmacRxDisca awc_def_Stats_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats_HmacRxAcce awc_def_Stats_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats_SsidMismatch awc_def_Stats_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats_ApMismatch awc_def_Stats_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats_RatesMismatc awc_def_Stats_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats_AuthReject awc_def_Stats_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats_AuthTimeout awc_def_Stats_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats_AssocReject awc_def_Stats_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats_AssocTimeout awc_def_Stats_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats_NewReason awc_def_Stats_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats_AuthFail_1 awc_def_Stats_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats_AuthFail_2 awc_def_Stats_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats_AuthFail_3 awc_def_Stats_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats_AuthFail_4 awc_def_Stats_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats_AuthFail_5 awc_def_Stats_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats_AuthFail_6 awc_def_Stats_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats_AuthFail_7 awc_def_Stats_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats_AuthFail_8 awc_def_Stats_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left)") -#define awc_RID_Stats_AuthFail_9 awc_def_Stats_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats_AuthFail_10 awc_def_Stats_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats_AuthFail_11 awc_def_Stats_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats_AuthFail_12 awc_def_Stats_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats_AuthFail_13 awc_def_Stats_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats_AuthFail_14 awc_def_Stats_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats_AuthFail_15 awc_def_Stats_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats_AuthFail_16 awc_def_Stats_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats_AuthFail_17 awc_def_Stats_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats_AuthFail_18 awc_def_Stats_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats_AuthFail_19 awc_def_Stats_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats_RxMan awc_def_Stats_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats_TxMan awc_def_Stats_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats_RxRefresh awc_def_Stats_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats_TxRefresh awc_def_Stats_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats_RxPoll awc_def_Stats_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats_TxPoll awc_def_Stats_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats_HostRetries awc_def_Stats_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats_LostSync_HostReq awc_def_Stats_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats_HostTxBytes awc_def_Stats_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats_HostRxBytes awc_def_Stats_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats_ElapsedUsec awc_def_Stats_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats_ElapsedSec awc_def_Stats_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats_LostSyncBett awc_def_Stats_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") - - - -#define awc_RID_Stats_delta_RidLen awc_def_Stats_delta_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats_delta_RxOverrunErr awc_def_Stats_delta_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats_delta_RxPlcpCrcErr awc_def_Stats_delta_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats_delta_RxPlcpFormat awc_def_Stats_delta_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats_delta_RxPlcpLength awc_def_Stats_delta_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats_delta_RxMacCrcErr awc_def_Stats_delta_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats_delta_RxMacCrcOk awc_def_Stats_delta_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats_delta_RxWepErr awc_def_Stats_delta_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_delta_RxWepOk awc_def_Stats_delta_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_delta_RetryLong awc_def_Stats_delta_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_delta_RetryShort awc_def_Stats_delta_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_delta_MaxRetries awc_def_Stats_delta_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACKd.") -#define awc_RID_Stats_delta_NoAck awc_def_Stats_delta_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats_delta_NoCts awc_def_Stats_delta_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats_delta_RxAck awc_def_Stats_delta_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats_delta_RxCts awc_def_Stats_delta_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats_delta_TxAck awc_def_Stats_delta_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats_delta_TxRts awc_def_Stats_delta_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats_delta_TxCts awc_def_Stats_delta_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats_delta_TxMc awc_def_Stats_delta_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_delta_TxBc awc_def_Stats_delta_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats_delta_TxUcFrags awc_def_Stats_delta_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_delta_TxUcPackets awc_def_Stats_delta_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats_delta_TxBeacon awc_def_Stats_delta_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats_delta_RxBeacon awc_def_Stats_delta_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats_delta_TxSinColl awc_def_Stats_delta_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats_delta_TxMulColl awc_def_Stats_delta_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats_delta_DefersNo awc_def_Stats_delta_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats_delta_DefersProt awc_def_Stats_delta_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats_delta_DefersEngy awc_def_Stats_delta_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats_delta_DupFram awc_def_Stats_delta_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats_delta_RxFragDisc awc_def_Stats_delta_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats_delta_TxAged awc_def_Stats_delta_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats_delta_RxAged awc_def_Stats_delta_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats_delta_LostSync_Max awc_def_Stats_delta_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats_delta_LostSync_Mis awc_def_Stats_delta_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats_delta_LostSync_Arl awc_def_Stats_delta_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats_delta_LostSync_Dea awc_def_Stats_delta_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats_delta_LostSync_Disa awc_def_Stats_delta_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats_delta_LostSync_Tsf awc_def_Stats_delta_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats_delta_HostTxMc awc_def_Stats_delta_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats_delta_HostTxBc awc_def_Stats_delta_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats_delta_HostTxUc awc_def_Stats_delta_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats_delta_HostTxFail awc_def_Stats_delta_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats_delta_HostRxMc awc_def_Stats_delta_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats_delta_HostRxBc awc_def_Stats_delta_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats_delta_HostRxUc awc_def_Stats_delta_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats_delta_HostRxDiscar awc_def_Stats_delta_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats_delta_HmacTxMc awc_def_Stats_delta_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats_delta_HmacTxBc awc_def_Stats_delta_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats_delta_HmacTxUc awc_def_Stats_delta_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats_delta_HmacTxFail awc_def_Stats_delta_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats_delta_HmacRxMc awc_def_Stats_delta_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_delta_HmacRxBc awc_def_Stats_delta_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats_delta_HmacRxUc awc_def_Stats_delta_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_delta_HmacRxDisca awc_def_Stats_delta_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats_delta_HmacRxAcce awc_def_Stats_delta_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats_delta_SsidMismatch awc_def_Stats_delta_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats_delta_ApMismatch awc_def_Stats_delta_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats_delta_RatesMismatc awc_def_Stats_delta_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats_delta_AuthReject awc_def_Stats_delta_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats_delta_AuthTimeout awc_def_Stats_delta_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats_delta_AssocReject awc_def_Stats_delta_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats_delta_AssocTimeout awc_def_Stats_delta_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats_delta_NewReason awc_def_Stats_delta_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats_delta_AuthFail_1 awc_def_Stats_delta_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats_delta_AuthFail_2 awc_def_Stats_delta_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats_delta_AuthFail_3 awc_def_Stats_delta_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats_delta_AuthFail_4 awc_def_Stats_delta_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats_delta_AuthFail_5 awc_def_Stats_delta_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats_delta_AuthFail_6 awc_def_Stats_delta_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats_delta_AuthFail_7 awc_def_Stats_delta_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats_delta_AuthFail_8 awc_def_Stats_delta_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left)") -#define awc_RID_Stats_delta_AuthFail_9 awc_def_Stats_delta_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats_delta_AuthFail_10 awc_def_Stats_delta_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats_delta_AuthFail_11 awc_def_Stats_delta_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats_delta_AuthFail_12 awc_def_Stats_delta_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats_delta_AuthFail_13 awc_def_Stats_delta_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats_delta_AuthFail_14 awc_def_Stats_delta_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats_delta_AuthFail_15 awc_def_Stats_delta_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats_delta_AuthFail_16 awc_def_Stats_delta_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats_delta_AuthFail_17 awc_def_Stats_delta_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats_delta_AuthFail_18 awc_def_Stats_delta_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats_delta_AuthFail_19 awc_def_Stats_delta_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats_delta_RxMan awc_def_Stats_delta_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats_delta_TxMan awc_def_Stats_delta_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats_delta_RxRefresh awc_def_Stats_delta_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats_delta_TxRefresh awc_def_Stats_delta_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats_delta_RxPoll awc_def_Stats_delta_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats_delta_TxPoll awc_def_Stats_delta_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats_delta_HostRetries awc_def_Stats_delta_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats_delta_LostSync_HostReq awc_def_Stats_delta_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats_delta_HostTxBytes awc_def_Stats_delta_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats_delta_HostRxBytes awc_def_Stats_delta_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats_delta_ElapsedUsec awc_def_Stats_delta_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats_delta_ElapsedSec awc_def_Stats_delta_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats_delta_LostSyncBett awc_def_Stats_delta_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") - - - -#define awc_RID_Stats_clear_RidLen awc_def_Stats_clear_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats_clear_RxOverrunErr awc_def_Stats_clear_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats_clear_RxPlcpCrcErr awc_def_Stats_clear_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats_clear_RxPlcpFormat awc_def_Stats_clear_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats_clear_RxPlcpLength awc_def_Stats_clear_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats_clear_RxMacCrcErr awc_def_Stats_clear_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats_clear_RxMacCrcOk awc_def_Stats_clear_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats_clear_RxWepErr awc_def_Stats_clear_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_clear_RxWepOk awc_def_Stats_clear_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats_clear_RetryLong awc_def_Stats_clear_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_clear_RetryShort awc_def_Stats_clear_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats_clear_MaxRetries awc_def_Stats_clear_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACKd.") -#define awc_RID_Stats_clear_NoAck awc_def_Stats_clear_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats_clear_NoCts awc_def_Stats_clear_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats_clear_RxAck awc_def_Stats_clear_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats_clear_RxCts awc_def_Stats_clear_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats_clear_TxAck awc_def_Stats_clear_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats_clear_TxRts awc_def_Stats_clear_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats_clear_TxCts awc_def_Stats_clear_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats_clear_TxMc awc_def_Stats_clear_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_clear_TxBc awc_def_Stats_clear_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats_clear_TxUcFrags awc_def_Stats_clear_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats_clear_TxUcPackets awc_def_Stats_clear_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats_clear_TxBeacon awc_def_Stats_clear_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats_clear_RxBeacon awc_def_Stats_clear_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats_clear_TxSinColl awc_def_Stats_clear_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats_clear_TxMulColl awc_def_Stats_clear_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats_clear_DefersNo awc_def_Stats_clear_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats_clear_DefersProt awc_def_Stats_clear_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats_clear_DefersEngy awc_def_Stats_clear_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats_clear_DupFram awc_def_Stats_clear_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats_clear_RxFragDisc awc_def_Stats_clear_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats_clear_TxAged awc_def_Stats_clear_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats_clear_RxAged awc_def_Stats_clear_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats_clear_LostSync_Max awc_def_Stats_clear_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats_clear_LostSync_Mis awc_def_Stats_clear_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats_clear_LostSync_Arl awc_def_Stats_clear_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats_clear_LostSync_Dea awc_def_Stats_clear_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats_clear_LostSync_Disa awc_def_Stats_clear_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats_clear_LostSync_Tsf awc_def_Stats_clear_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats_clear_HostTxMc awc_def_Stats_clear_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats_clear_HostTxBc awc_def_Stats_clear_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats_clear_HostTxUc awc_def_Stats_clear_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats_clear_HostTxFail awc_def_Stats_clear_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats_clear_HostRxMc awc_def_Stats_clear_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats_clear_HostRxBc awc_def_Stats_clear_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats_clear_HostRxUc awc_def_Stats_clear_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats_clear_HostRxDiscar awc_def_Stats_clear_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats_clear_HmacTxMc awc_def_Stats_clear_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats_clear_HmacTxBc awc_def_Stats_clear_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats_clear_HmacTxUc awc_def_Stats_clear_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats_clear_HmacTxFail awc_def_Stats_clear_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats_clear_HmacRxMc awc_def_Stats_clear_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_clear_HmacRxBc awc_def_Stats_clear_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats_clear_HmacRxUc awc_def_Stats_clear_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats_clear_HmacRxDisca awc_def_Stats_clear_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats_clear_HmacRxAcce awc_def_Stats_clear_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats_clear_SsidMismatch awc_def_Stats_clear_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats_clear_ApMismatch awc_def_Stats_clear_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats_clear_RatesMismatc awc_def_Stats_clear_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats_clear_AuthReject awc_def_Stats_clear_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats_clear_AuthTimeout awc_def_Stats_clear_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats_clear_AssocReject awc_def_Stats_clear_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats_clear_AssocTimeout awc_def_Stats_clear_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats_clear_NewReason awc_def_Stats_clear_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats_clear_AuthFail_1 awc_def_Stats_clear_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats_clear_AuthFail_2 awc_def_Stats_clear_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats_clear_AuthFail_3 awc_def_Stats_clear_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats_clear_AuthFail_4 awc_def_Stats_clear_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats_clear_AuthFail_5 awc_def_Stats_clear_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats_clear_AuthFail_6 awc_def_Stats_clear_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats_clear_AuthFail_7 awc_def_Stats_clear_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats_clear_AuthFail_8 awc_def_Stats_clear_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left)") -#define awc_RID_Stats_clear_AuthFail_9 awc_def_Stats_clear_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats_clear_AuthFail_10 awc_def_Stats_clear_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats_clear_AuthFail_11 awc_def_Stats_clear_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats_clear_AuthFail_12 awc_def_Stats_clear_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats_clear_AuthFail_13 awc_def_Stats_clear_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats_clear_AuthFail_14 awc_def_Stats_clear_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats_clear_AuthFail_15 awc_def_Stats_clear_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats_clear_AuthFail_16 awc_def_Stats_clear_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats_clear_AuthFail_17 awc_def_Stats_clear_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats_clear_AuthFail_18 awc_def_Stats_clear_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats_clear_AuthFail_19 awc_def_Stats_clear_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats_clear_RxMan awc_def_Stats_clear_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats_clear_TxMan awc_def_Stats_clear_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats_clear_RxRefresh awc_def_Stats_clear_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats_clear_TxRefresh awc_def_Stats_clear_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats_clear_RxPoll awc_def_Stats_clear_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats_clear_TxPoll awc_def_Stats_clear_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats_clear_HostRetries awc_def_Stats_clear_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats_clear_LostSync_HostReq awc_def_Stats_clear_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats_clear_HostTxBytes awc_def_Stats_clear_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats_clear_HostRxBytes awc_def_Stats_clear_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats_clear_ElapsedUsec awc_def_Stats_clear_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats_clear_ElapsedSec awc_def_Stats_clear_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats_clear_LostSyncBett awc_def_Stats_clear_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") - - - -#define awc_RID_Stats16_RidLen awc_def_Stats16_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats16_RxOverrunErr awc_def_Stats16_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats16_RxPlcpCrcErr awc_def_Stats16_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats16_RxPlcpFormat awc_def_Stats16_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats16_RxPlcpLength awc_def_Stats16_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats16_RxMacCrcErr awc_def_Stats16_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats16_RxMacCrcOk awc_def_Stats16_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats16_RxWepErr awc_def_Stats16_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_RxWepOk awc_def_Stats16_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_RetryLong awc_def_Stats16_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_RetryShort awc_def_Stats16_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_MaxRetries awc_def_Stats16_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACKd.") -#define awc_RID_Stats16_NoAck awc_def_Stats16_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats16_NoCts awc_def_Stats16_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats16_RxAck awc_def_Stats16_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats16_RxCts awc_def_Stats16_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats16_TxAck awc_def_Stats16_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats16_TxRts awc_def_Stats16_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats16_TxCts awc_def_Stats16_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats16_TxMc awc_def_Stats16_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_TxBc awc_def_Stats16_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats16_TxUcFrags awc_def_Stats16_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_TxUcPackets awc_def_Stats16_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats16_TxBeacon awc_def_Stats16_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats16_RxBeacon awc_def_Stats16_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats16_TxSinColl awc_def_Stats16_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats16_TxMulColl awc_def_Stats16_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats16_DefersNo awc_def_Stats16_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats16_DefersProt awc_def_Stats16_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats16_DefersEngy awc_def_Stats16_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats16_DupFram awc_def_Stats16_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats16_RxFragDisc awc_def_Stats16_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats16_TxAged awc_def_Stats16_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats16_RxAged awc_def_Stats16_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats16_LostSync_Max awc_def_Stats16_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats16_LostSync_Mis awc_def_Stats16_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats16_LostSync_Arl awc_def_Stats16_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats16_LostSync_Dea awc_def_Stats16_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats16_LostSync_Disa awc_def_Stats16_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats16_LostSync_Tsf awc_def_Stats16_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats16_HostTxMc awc_def_Stats16_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats16_HostTxBc awc_def_Stats16_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats16_HostTxUc awc_def_Stats16_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats16_HostTxFail awc_def_Stats16_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats16_HostRxMc awc_def_Stats16_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats16_HostRxBc awc_def_Stats16_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats16_HostRxUc awc_def_Stats16_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats16_HostRxDiscar awc_def_Stats16_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats16_HmacTxMc awc_def_Stats16_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats16_HmacTxBc awc_def_Stats16_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats16_HmacTxUc awc_def_Stats16_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats16_HmacTxFail awc_def_Stats16_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats16_HmacRxMc awc_def_Stats16_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_HmacRxBc awc_def_Stats16_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats16_HmacRxUc awc_def_Stats16_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_HmacRxDisca awc_def_Stats16_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats16_HmacRxAcce awc_def_Stats16_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats16_SsidMismatch awc_def_Stats16_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats16_ApMismatch awc_def_Stats16_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats16_RatesMismatc awc_def_Stats16_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats16_AuthReject awc_def_Stats16_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats16_AuthTimeout awc_def_Stats16_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats16_AssocReject awc_def_Stats16_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats16_AssocTimeout awc_def_Stats16_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats16_NewReason awc_def_Stats16_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats16_AuthFail_1 awc_def_Stats16_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats16_AuthFail_2 awc_def_Stats16_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats16_AuthFail_3 awc_def_Stats16_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats16_AuthFail_4 awc_def_Stats16_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats16_AuthFail_5 awc_def_Stats16_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats16_AuthFail_6 awc_def_Stats16_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats16_AuthFail_7 awc_def_Stats16_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats16_AuthFail_8 awc_def_Stats16_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left)") -#define awc_RID_Stats16_AuthFail_9 awc_def_Stats16_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats16_AuthFail_10 awc_def_Stats16_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats16_AuthFail_11 awc_def_Stats16_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats16_AuthFail_12 awc_def_Stats16_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats16_AuthFail_13 awc_def_Stats16_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats16_AuthFail_14 awc_def_Stats16_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats16_AuthFail_15 awc_def_Stats16_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats16_AuthFail_16 awc_def_Stats16_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats16_AuthFail_17 awc_def_Stats16_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats16_AuthFail_18 awc_def_Stats16_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats16_AuthFail_19 awc_def_Stats16_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats16_RxMan awc_def_Stats16_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats16_TxMan awc_def_Stats16_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats16_RxRefresh awc_def_Stats16_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats16_TxRefresh awc_def_Stats16_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats16_RxPoll awc_def_Stats16_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats16_TxPoll awc_def_Stats16_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats16_HostRetries awc_def_Stats16_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats16_LostSync_HostReq awc_def_Stats16_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats16_HostTxBytes awc_def_Stats16_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats16_HostRxBytes awc_def_Stats16_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats16_ElapsedUsec awc_def_Stats16_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats16_ElapsedSec awc_def_Stats16_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats16_LostSyncBett awc_def_Stats16_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") - - - -#define awc_RID_Stats16_delta_RidLen awc_def_Stats16_delta_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats16_delta_RxOverrunErr awc_def_Stats16_delta_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats16_delta_RxPlcpCrcErr awc_def_Stats16_delta_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats16_delta_RxPlcpFormat awc_def_Stats16_delta_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats16_delta_RxPlcpLength awc_def_Stats16_delta_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats16_delta_RxMacCrcErr awc_def_Stats16_delta_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats16_delta_RxMacCrcOk awc_def_Stats16_delta_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats16_delta_RxWepErr awc_def_Stats16_delta_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_delta_RxWepOk awc_def_Stats16_delta_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_delta_RetryLong awc_def_Stats16_delta_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_delta_RetryShort awc_def_Stats16_delta_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_delta_MaxRetries awc_def_Stats16_delta_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACKd.") -#define awc_RID_Stats16_delta_NoAck awc_def_Stats16_delta_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats16_delta_NoCts awc_def_Stats16_delta_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats16_delta_RxAck awc_def_Stats16_delta_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats16_delta_RxCts awc_def_Stats16_delta_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats16_delta_TxAck awc_def_Stats16_delta_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats16_delta_TxRts awc_def_Stats16_delta_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats16_delta_TxCts awc_def_Stats16_delta_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats16_delta_TxMc awc_def_Stats16_delta_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_delta_TxBc awc_def_Stats16_delta_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats16_delta_TxUcFrags awc_def_Stats16_delta_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_delta_TxUcPackets awc_def_Stats16_delta_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats16_delta_TxBeacon awc_def_Stats16_delta_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats16_delta_RxBeacon awc_def_Stats16_delta_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats16_delta_TxSinColl awc_def_Stats16_delta_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats16_delta_TxMulColl awc_def_Stats16_delta_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats16_delta_DefersNo awc_def_Stats16_delta_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats16_delta_DefersProt awc_def_Stats16_delta_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats16_delta_DefersEngy awc_def_Stats16_delta_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats16_delta_DupFram awc_def_Stats16_delta_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats16_delta_RxFragDisc awc_def_Stats16_delta_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats16_delta_TxAged awc_def_Stats16_delta_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats16_delta_RxAged awc_def_Stats16_delta_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats16_delta_LostSync_Max awc_def_Stats16_delta_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats16_delta_LostSync_Mis awc_def_Stats16_delta_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats16_delta_LostSync_Arl awc_def_Stats16_delta_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats16_delta_LostSync_Dea awc_def_Stats16_delta_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats16_delta_LostSync_Disa awc_def_Stats16_delta_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats16_delta_LostSync_Tsf awc_def_Stats16_delta_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats16_delta_HostTxMc awc_def_Stats16_delta_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats16_delta_HostTxBc awc_def_Stats16_delta_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats16_delta_HostTxUc awc_def_Stats16_delta_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats16_delta_HostTxFail awc_def_Stats16_delta_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats16_delta_HostRxMc awc_def_Stats16_delta_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats16_delta_HostRxBc awc_def_Stats16_delta_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats16_delta_HostRxUc awc_def_Stats16_delta_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats16_delta_HostRxDiscar awc_def_Stats16_delta_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats16_delta_HmacTxMc awc_def_Stats16_delta_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats16_delta_HmacTxBc awc_def_Stats16_delta_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats16_delta_HmacTxUc awc_def_Stats16_delta_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats16_delta_HmacTxFail awc_def_Stats16_delta_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats16_delta_HmacRxMc awc_def_Stats16_delta_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_delta_HmacRxBc awc_def_Stats16_delta_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats16_delta_HmacRxUc awc_def_Stats16_delta_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_delta_HmacRxDisca awc_def_Stats16_delta_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats16_delta_HmacRxAcce awc_def_Stats16_delta_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats16_delta_SsidMismatch awc_def_Stats16_delta_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats16_delta_ApMismatch awc_def_Stats16_delta_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats16_delta_RatesMismatc awc_def_Stats16_delta_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats16_delta_AuthReject awc_def_Stats16_delta_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats16_delta_AuthTimeout awc_def_Stats16_delta_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats16_delta_AssocReject awc_def_Stats16_delta_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats16_delta_AssocTimeout awc_def_Stats16_delta_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats16_delta_NewReason awc_def_Stats16_delta_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats16_delta_AuthFail_1 awc_def_Stats16_delta_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats16_delta_AuthFail_2 awc_def_Stats16_delta_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats16_delta_AuthFail_3 awc_def_Stats16_delta_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats16_delta_AuthFail_4 awc_def_Stats16_delta_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats16_delta_AuthFail_5 awc_def_Stats16_delta_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats16_delta_AuthFail_6 awc_def_Stats16_delta_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats16_delta_AuthFail_7 awc_def_Stats16_delta_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats16_delta_AuthFail_8 awc_def_Stats16_delta_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left)") -#define awc_RID_Stats16_delta_AuthFail_9 awc_def_Stats16_delta_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats16_delta_AuthFail_10 awc_def_Stats16_delta_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats16_delta_AuthFail_11 awc_def_Stats16_delta_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats16_delta_AuthFail_12 awc_def_Stats16_delta_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats16_delta_AuthFail_13 awc_def_Stats16_delta_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats16_delta_AuthFail_14 awc_def_Stats16_delta_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats16_delta_AuthFail_15 awc_def_Stats16_delta_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats16_delta_AuthFail_16 awc_def_Stats16_delta_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats16_delta_AuthFail_17 awc_def_Stats16_delta_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats16_delta_AuthFail_18 awc_def_Stats16_delta_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats16_delta_AuthFail_19 awc_def_Stats16_delta_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats16_delta_RxMan awc_def_Stats16_delta_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats16_delta_TxMan awc_def_Stats16_delta_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats16_delta_RxRefresh awc_def_Stats16_delta_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats16_delta_TxRefresh awc_def_Stats16_delta_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats16_delta_RxPoll awc_def_Stats16_delta_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats16_delta_TxPoll awc_def_Stats16_delta_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats16_delta_HostRetries awc_def_Stats16_delta_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats16_delta_LostSync_HostReq awc_def_Stats16_delta_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats16_delta_HostTxBytes awc_def_Stats16_delta_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats16_delta_HostRxBytes awc_def_Stats16_delta_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats16_delta_ElapsedUsec awc_def_Stats16_delta_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats16_delta_ElapsedSec awc_def_Stats16_delta_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats16_delta_LostSyncBett awc_def_Stats16_delta_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") - - -#define awc_RID_Stats16_clear_RidLen awc_def_Stats16_clear_RID(0x0000,0x0000,"RidLen", "Length of the RID including the length field.") -#define awc_RID_Stats16_clear_RxOverrunErr awc_def_Stats16_clear_RID(0x0002,0x0004,"Stats_RxOverrunErr", "Receive overruns -- No buffer available to handle the receive. (result is that the packet is never received)") -#define awc_RID_Stats16_clear_RxPlcpCrcErr awc_def_Stats16_clear_RID(0x0004,0x0008,"Stats_RxPlcpCrcErr", "PLCP header checksum errors (CRC16).") -#define awc_RID_Stats16_clear_RxPlcpFormat awc_def_Stats16_clear_RID(0x0006,0x000C,"Stats_RxPlcpFormat", "PLCP format errors.") -#define awc_RID_Stats16_clear_RxPlcpLength awc_def_Stats16_clear_RID(0x0008,0x0010,"Stats_RxPlcpLength", "PLCP length is incorrect.") -#define awc_RID_Stats16_clear_RxMacCrcErr awc_def_Stats16_clear_RID(0x000A,0x0014,"Stats_RxMacCrcErr", "Count of MAC CRC32 errors.") -#define awc_RID_Stats16_clear_RxMacCrcOk awc_def_Stats16_clear_RID(0x000C,0x0018,"Stats_RxMacCrcOk", "Count of MAC CRC32 received correctly.") -#define awc_RID_Stats16_clear_RxWepErr awc_def_Stats16_clear_RID(0x000E,0x001C,"Stats_RxWepErr", "Count of all WEP ICV checks that failed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_clear_RxWepOk awc_def_Stats16_clear_RID(0x0010,0x0020,"Stats_RxWepOk", "Count of all WEP ICV checks that passed. (this value is included in Stats_RxMacCrcOk)") -#define awc_RID_Stats16_clear_RetryLong awc_def_Stats16_clear_RID(0x0012,0x0024,"Stats_RetryLongCount", "of all long retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_clear_RetryShort awc_def_Stats16_clear_RID(0x0014,0x0028,"Stats_RetryShort", "Count of all short retries. (Does not include first attempt for a packet).") -#define awc_RID_Stats16_clear_MaxRetries awc_def_Stats16_clear_RID(0x0016,0x002C,"Stats_MaxRetries", "Count of number of packets that max-retried -- ie were never ACKd.") -#define awc_RID_Stats16_clear_NoAck awc_def_Stats16_clear_RID(0x0018,0x0030,"Stats_NoAck", "Count of number of times that ACK was not received.") -#define awc_RID_Stats16_clear_NoCts awc_def_Stats16_clear_RID(0x001A,0x0034,"Stats_NoCts", "Count of number of timer that CTS was not received.") -#define awc_RID_Stats16_clear_RxAck awc_def_Stats16_clear_RID(0x001C,0x0038,"Stats_RxAck", "Count of number of expected ACKs that were received.") -#define awc_RID_Stats16_clear_RxCts awc_def_Stats16_clear_RID(0x001E,0x003C,"Stats_RxCts", "Count of number of expected CTSs that were received.") -#define awc_RID_Stats16_clear_TxAck awc_def_Stats16_clear_RID(0x0020,0x0040,"Stats_TxAck", "Count of number of ACKs transmitted.") -#define awc_RID_Stats16_clear_TxRts awc_def_Stats16_clear_RID(0x0022,0x0044,"Stats_TxRts", "Count of number of RTSs transmitted.") -#define awc_RID_Stats16_clear_TxCts awc_def_Stats16_clear_RID(0x0024,0x0048,"Stats_TxCts", "Count of number of CTSs transmitted.") -#define awc_RID_Stats16_clear_TxMc awc_def_Stats16_clear_RID(0x0026,0x004C,"Stats_TxMc", " LMAC count of multicast packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_clear_TxBc awc_def_Stats16_clear_RID(0x0028,0x0050,"Stats_TxBc", " LMAC count of broadcast packets sent (uses 802.11") -#define awc_RID_Stats16_clear_TxUcFrags awc_def_Stats16_clear_RID(0x002A,0x0054,"Stats_TxUcFragsLMAC", " count of ALL unicast fragments and whole packets sent (uses 802.11 Address1).") -#define awc_RID_Stats16_clear_TxUcPackets awc_def_Stats16_clear_RID(0x002C,0x0058,"Stats_TxUcPackets", "LMAC count of unicast packets that were ACKd (uses 802.11 Address 1).") -#define awc_RID_Stats16_clear_TxBeacon awc_def_Stats16_clear_RID(0x002E,0x005C,"Stats_TxBeacon", " Count of beacon packets transmitted.") -#define awc_RID_Stats16_clear_RxBeacon awc_def_Stats16_clear_RID(0x0030,0x0060,"Stats_RxBeacon", " Count of beacon packets received matching our BSSID.") -#define awc_RID_Stats16_clear_TxSinColl awc_def_Stats16_clear_RID(0x0032,0x0064,"Stats_TxSinCollTransmit"," single collisions. **") -#define awc_RID_Stats16_clear_TxMulColl awc_def_Stats16_clear_RID(0x0034,0x0068,"Stats_TxMulCollTransmit"," multiple collisions. **") -#define awc_RID_Stats16_clear_DefersNo awc_def_Stats16_clear_RID(0x0036,0x006C,"Stats_DefersNo Transmit"," frames sent with no deferral. **") -#define awc_RID_Stats16_clear_DefersProt awc_def_Stats16_clear_RID(0x0038,0x0070,"Stats_DefersProt", " Transmit frames deferred due to protocol.") -#define awc_RID_Stats16_clear_DefersEngy awc_def_Stats16_clear_RID(0x003A,0x0074,"Stats_DefersEngy", " Transmit frames deferred due to energy detect.") -#define awc_RID_Stats16_clear_DupFram awc_def_Stats16_clear_RID(0x003C,0x0078,"Stats_DupFram", " Duplicate receive frames and fragments.") -#define awc_RID_Stats16_clear_RxFragDisc awc_def_Stats16_clear_RID(0x003E,0x007C,"Stats_RxFragDisc", " Received partial frames. (each tally could indicate the discarding of one or more fragments)") -#define awc_RID_Stats16_clear_TxAged awc_def_Stats16_clear_RID(0x0040,0x0080,"Stats_TxAged", " Transmit packets exceeding maximum transmit lifetime. **") -#define awc_RID_Stats16_clear_RxAged awc_def_Stats16_clear_RID(0x0042,0x0084,"Stats_RxAgedReceive", " packets exceeding maximum receive lifetime. **") -#define awc_RID_Stats16_clear_LostSync_Max awc_def_Stats16_clear_RID(0x0044,0x0088,"Stats_LostSync_Max", " Lost sync with our cell due to maximum retries occuring. Retry") -#define awc_RID_Stats16_clear_LostSync_Mis awc_def_Stats16_clear_RID(0x0046,0x008C,"Stats_LostSync_Mis", "Lost sync with our cell due to missing too many beacons. sedBeacons") -#define awc_RID_Stats16_clear_LostSync_Arl awc_def_Stats16_clear_RID(0x0048,0x0090,"Stats_LostSync_Arl", "Lost sync with our cell due to Average Retry Level being Exceeded exceeded.") -#define awc_RID_Stats16_clear_LostSync_Dea awc_def_Stats16_clear_RID(0x004A,0x0094,"Stats_LostSync_Dea", "Lost sync with our cell due to being deauthenticated.,thed") -#define awc_RID_Stats16_clear_LostSync_Disa awc_def_Stats16_clear_RID(0x004C,0x0098,"Stats_LostSync_Disa", " Lost sync with our cell due to being disassociated. ssoced") -#define awc_RID_Stats16_clear_LostSync_Tsf awc_def_Stats16_clear_RID(0x004E,0x009C,"Stats_LostSync_Tsf", "Lost sync with our cell due to excessive change in TSF Timingtiming.") -#define awc_RID_Stats16_clear_HostTxMc awc_def_Stats16_clear_RID(0x0050,0x00A0,"Stats_HostTxMc", "Count of multicast packets sent by the host.") -#define awc_RID_Stats16_clear_HostTxBc awc_def_Stats16_clear_RID(0x0052,0x00A4,"Stats_HostTxBc", "Count of broadcast packets sent by the host.") -#define awc_RID_Stats16_clear_HostTxUc awc_def_Stats16_clear_RID(0x0054,0x00A8,"Stats_HostTxUc", "Count of unicast packets sent by the host.") -#define awc_RID_Stats16_clear_HostTxFail awc_def_Stats16_clear_RID(0x0056,0x00AC,"Stats_HostTxFail", " Count of host transmitted packets which failed.") -#define awc_RID_Stats16_clear_HostRxMc awc_def_Stats16_clear_RID(0x0058,0x00B0,"Stats_HostRxMc", "Count of host received multicast packets.") -#define awc_RID_Stats16_clear_HostRxBc awc_def_Stats16_clear_RID(0x005A,0x00B4,"Stats_HostRxBc", "Count of host received broadcast packets.") -#define awc_RID_Stats16_clear_HostRxUc awc_def_Stats16_clear_RID(0x005C,0x00B8,"Stats_HostRxUc", "Count of host received unicast packets.") -#define awc_RID_Stats16_clear_HostRxDiscar awc_def_Stats16_clear_RID(0x005E,0x00BC,"Stats_HostRxDiscar", "Count of host received packets discarded due to:\n Host not enabling receive.\n Host failing to dequeue receive packets quickly.\n Packets being discarded due to magic packet mode.") -#define awc_RID_Stats16_clear_HmacTxMc awc_def_Stats16_clear_RID(0x0060,0x00C0,"Stats_HmacTxMc", "Count of internally generated multicast (DA) packets.") -#define awc_RID_Stats16_clear_HmacTxBc awc_def_Stats16_clear_RID(0x0062,0x00C4,"Stats_HmacTxBc", "Count of internally generated broadcast (DA) packets.") -#define awc_RID_Stats16_clear_HmacTxUc awc_def_Stats16_clear_RID(0x0064,0x00C8,"Stats_HmacTxUc", "Count of internally generated unicast (DA) packets.") -#define awc_RID_Stats16_clear_HmacTxFail awc_def_Stats16_clear_RID(0x0066,0x00CC,"Stats_HmacTxFail", " Count of internally generated transmit packets that failed.") -#define awc_RID_Stats16_clear_HmacRxMc awc_def_Stats16_clear_RID(0x0068,0x00D0,"Stats_HmacRxMc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_clear_HmacRxBc awc_def_Stats16_clear_RID(0x006A,0x00D4,"Stats_HmacRxBc", "Count of internally received broadcast (DA) packets.") -#define awc_RID_Stats16_clear_HmacRxUc awc_def_Stats16_clear_RID(0x006C,0x00D8,"Stats_HmacRxUc", "Count of internally received multicast (DA) packets.") -#define awc_RID_Stats16_clear_HmacRxDisca awc_def_Stats16_clear_RID(0x006E,0x00DC,"Stats_HmacRxDisca", " Count of internally received packets that were discarded (usually because the destination address is not for the host).") -#define awc_RID_Stats16_clear_HmacRxAcce awc_def_Stats16_clear_RID(0x0070,0x00E0,"Stats_HmacRxAcce", " Count of internally received packets that were accepted") -#define awc_RID_Stats16_clear_SsidMismatch awc_def_Stats16_clear_RID(0x0072,0x00E4,"Stats_SsidMismatch", " Count of SSID mismatches.") -#define awc_RID_Stats16_clear_ApMismatch awc_def_Stats16_clear_RID(0x0074,0x00E8,"Stats_ApMismatch", " Count of specified AP mismatches.") -#define awc_RID_Stats16_clear_RatesMismatc awc_def_Stats16_clear_RID(0x0076,0x00EC,"Stats_RatesMismatc", " Count of rate mismatches.") -#define awc_RID_Stats16_clear_AuthReject awc_def_Stats16_clear_RID(0x0078,0x00F0,"Stats_AuthReject", " Count of authentication rejections.") -#define awc_RID_Stats16_clear_AuthTimeout awc_def_Stats16_clear_RID(0x007A,0x00F4,"Stats_AuthTimeout", " Count of authentication timeouts.") -#define awc_RID_Stats16_clear_AssocReject awc_def_Stats16_clear_RID(0x007C,0x00F8,"Stats_AssocReject", " Count of association rejections.") -#define awc_RID_Stats16_clear_AssocTimeout awc_def_Stats16_clear_RID(0x007E,0x00FC,"Stats_AssocTimeout", " Count of association timeouts.") -#define awc_RID_Stats16_clear_NewReason awc_def_Stats16_clear_RID(0x0080,0x0100,"Stats_NewReason", "Count of reason/status codes of greater than 19. (Values of 0 = successful are not counted)") -#define awc_RID_Stats16_clear_AuthFail_1 awc_def_Stats16_clear_RID(0x0082,0x0104,"Stats_AuthFail_1", "Unspecified reason.") -#define awc_RID_Stats16_clear_AuthFail_2 awc_def_Stats16_clear_RID(0x0084,0x0108,"Stats_AuthFail_2", "Previous authentication no longer valid.") -#define awc_RID_Stats16_clear_AuthFail_3 awc_def_Stats16_clear_RID(0x0086,0x010C,"Stats_AuthFail_3", "Deauthenticated because sending station is leaving (has left) IBSS or ESS.") -#define awc_RID_Stats16_clear_AuthFail_4 awc_def_Stats16_clear_RID(0x0088,0x0110,"Stats_AuthFail_4", "Disassociated due to inactivity") -#define awc_RID_Stats16_clear_AuthFail_5 awc_def_Stats16_clear_RID(0x008A,0x0114,"Stats_AuthFail_5", "Disassociated because AP is unable to handle all currently associated stations.") -#define awc_RID_Stats16_clear_AuthFail_6 awc_def_Stats16_clear_RID(0x008C,0x0118,"Stats_AuthFail_6", "Class 2 Frame received from non-Authenticated station.") -#define awc_RID_Stats16_clear_AuthFail_7 awc_def_Stats16_clear_RID(0x008E,0x011C,"Stats_AuthFail_7", "Class 3 Frame received from non-Associated station.") -#define awc_RID_Stats16_clear_AuthFail_8 awc_def_Stats16_clear_RID(0x0090,0x0120,"Stats_AuthFail_8", "Disassociated because sending station is leaving (has left) " ) -#define awc_RID_Stats16_clear_AuthFail_9 awc_def_Stats16_clear_RID(0x0092,0x0124,"Stats_AuthFail_9", "Station requesting (Re)Association is not Authenticated") -#define awc_RID_Stats16_clear_AuthFail_10 awc_def_Stats16_clear_RID(0x0094,0x0128,"Stats_AuthFail_10", "Cannot support all requested capabilities in the Capability") -#define awc_RID_Stats16_clear_AuthFail_11 awc_def_Stats16_clear_RID(0x0096,0x012C,"Stats_AuthFail_11", "Reassociation denied due to inability to confirm") -#define awc_RID_Stats16_clear_AuthFail_12 awc_def_Stats16_clear_RID(0x0098,0x0130,"Stats_AuthFail_12", "Association denied due to reason outside the scope of the 802.11") -#define awc_RID_Stats16_clear_AuthFail_13 awc_def_Stats16_clear_RID(0x009A,0x0134,"Stats_AuthFail_13", "Responding station does not support the specified Auth Alogorithm") -#define awc_RID_Stats16_clear_AuthFail_14 awc_def_Stats16_clear_RID(0x009C,0x0138,"Stats_AuthFail_14", "Received an out of sequence Authentication Frame.") -#define awc_RID_Stats16_clear_AuthFail_15 awc_def_Stats16_clear_RID(0x009E,0x013C,"Stats_AuthFail_15", "Authentication rejected due to challenge failure.") -#define awc_RID_Stats16_clear_AuthFail_16 awc_def_Stats16_clear_RID(0x00A0,0x0140,"Stats_AuthFail_16", "Authentication rejected due to timeout waiting for next frame in sequence.") -#define awc_RID_Stats16_clear_AuthFail_17 awc_def_Stats16_clear_RID(0x00A2,0x0144,"Stats_AuthFail_17", "Association denied because AP is unable to handle additional associated stations.") -#define awc_RID_Stats16_clear_AuthFail_18 awc_def_Stats16_clear_RID(0x00A4,0x0148,"Stats_AuthFail_18", "Association denied due to requesting station not supportingall basic rates.") -#define awc_RID_Stats16_clear_AuthFail_19 awc_def_Stats16_clear_RID(0x00A6,0x014C,"Stats_AuthFail_19", "Reserved") -#define awc_RID_Stats16_clear_RxMan awc_def_Stats16_clear_RID(0x00A8,0x0150,"Stats_RxMan", " Count of management packets received and handled.") -#define awc_RID_Stats16_clear_TxMan awc_def_Stats16_clear_RID(0x00AA,0x0154,"Stats_TxMan", " Count of management packets transmitted.") -#define awc_RID_Stats16_clear_RxRefresh awc_def_Stats16_clear_RID(0x00AC,0x0158,"Stats_RxRefresh", " Count of null data packets received.") -#define awc_RID_Stats16_clear_TxRefresh awc_def_Stats16_clear_RID(0x00AE,0x015C,"Stats_TxRefresh", " Count of null data packets transmitted.") -#define awc_RID_Stats16_clear_RxPoll awc_def_Stats16_clear_RID(0x00B0,0x0160,"Stats_RxPoll", "Count of PS-Poll packets received.") -#define awc_RID_Stats16_clear_TxPoll awc_def_Stats16_clear_RID(0x00B2,0x0164,"Stats_TxPoll", "Count of PS-Poll packets transmitted.") -#define awc_RID_Stats16_clear_HostRetries awc_def_Stats16_clear_RID(0x00B4,0x0168,"Stats_HostRetries", " Count of long and short retries used to transmit host packets (does not include first attempt).") -#define awc_RID_Stats16_clear_LostSync_HostReq awc_def_Stats16_clear_RID(0x00B6,0x016C,"Stats_LostSync_HostReq","Lost sync with our cell due to host request.") -#define awc_RID_Stats16_clear_HostTxBytes awc_def_Stats16_clear_RID(0x00B8,0x0170,"Stats_HostTxBytes", " Count of bytes transferred from the host.") -#define awc_RID_Stats16_clear_HostRxBytes awc_def_Stats16_clear_RID(0x00BA,0x0174,"Stats_HostRxBytes", " Count of bytes transferred to the host.") -#define awc_RID_Stats16_clear_ElapsedUsec awc_def_Stats16_clear_RID(0x00BC,0x0178,"Stats_ElapsedUsec", " Total time since power up (or clear) in microseconds.") -#define awc_RID_Stats16_clear_ElapsedSec awc_def_Stats16_clear_RID(0x00BE,0x017C,"Stats_ElapsedSec", " Total time since power up (or clear) in seconds.") -#define awc_RID_Stats16_clear_LostSyncBett awc_def_Stats16_clear_RID(0x00C0,0x0180,"Stats_LostSyncBett", "Lost Sync to switch to a better access point") -/* -const struct aironet4500_rid_selector aironet4500_RID_Select_General_Config =(const struct aironet4500_rid_selector){ 0xFF10, 1,0,0, "General Configuration" }; // See notes General Configuration Many configuration items. -const struct aironet4500_rid_selector aironet4500_RID_Select_SSID_list =(const struct aironet4500_rid_selector){ 0xFF11, 1,0,0, "Valid SSID list" }; // See notes Valid SSID list List of SSIDs which the station may associate to. -const struct aironet4500_rid_selector aironet4500_RID_Select_AP_list =(const struct aironet4500_rid_selector){ 0xFF12, 1,0,0, "Valid AP list" }; // See notes Valid AP list List of APs which the station may associate to. -const struct aironet4500_rid_selector aironet4500_RID_Select_Driver_name =(const struct aironet4500_rid_selector){ 0xFF13, 1,0,0, "Driver name" }; // See notes Driver name The name and version of the driver (for debugging) -const struct aironet4500_rid_selector aironet4500_RID_Select_Encapsulation =(const struct aironet4500_rid_selector){ 0xFF14, 1,0,0, "Ethernet Protocol" }; // See notes Ethernet Protocol Rules for encapsulating ethernet payloads onto 802.11. -const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_volatile =(const struct aironet4500_rid_selector){ 0xFF15, 1,0,0, "WEP key volatile" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_WEP_nonvolatile =(const struct aironet4500_rid_selector){ 0xFF16, 1,0,0, "WEP key non-volatile" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_Modulation =(const struct aironet4500_rid_selector){ 0xFF17, 1,0,0, "Modulation" }; // -const struct aironet4500_rid_selector aironet4500_RID_Select_Active_Config =(const struct aironet4500_rid_selector){ 0xFF20, 0,1,1, "Actual Configuration" }; // Read only Actual Configuration This has the same format as the General Configuration. -const struct aironet4500_rid_selector aironet4500_RID_Select_Capabilities =(const struct aironet4500_rid_selector){ 0xFF00, 0,1,0, "Capabilities" }; // Read Only Capabilities PC4500 Information -const struct aironet4500_rid_selector aironet4500_RID_Select_AP_Info =(const struct aironet4500_rid_selector){ 0xFF01, 0,1,1, "AP Info" }; // Read Only AP Info Access Point Information -const struct aironet4500_rid_selector aironet4500_RID_Select_Radio_Info =(const struct aironet4500_rid_selector){ 0xFF02, 0,1,1, "Radio Info" }; // Read Only Radio Info Radio Information -- note radio specific -const struct aironet4500_rid_selector aironet4500_RID_Select_Status =(const struct aironet4500_rid_selector){ 0xFF50, 0,1,1, "Status" }; // Read Only Status PC4500 Current Status Information -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats =(const struct aironet4500_rid_selector){ 0xFF60, 0,1,1, "Cumulative 16-bit Statistics" }; // Read Only 16-bit Statistics Cumulative 16-bit Statistics -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_delta =(const struct aironet4500_rid_selector){ 0xFF61, 0,1,1, "Delta 16-bit Statistics" }; // Read Only 16-bit Statistics Delta 16-bit Statistics (since last clear) -const struct aironet4500_rid_selector aironet4500_RID_Select_16_stats_clear =(const struct aironet4500_rid_selector){ 0xFF62, 0,1,1, "Delta 16-bit Statistics and Clear" }; // Read Only / 16-bit Statistics Delta 16-bit Statistics and Clear -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats =(const struct aironet4500_rid_selector){ 0xFF68, 0,1,1, "Cumulative 32-bit Statistics" }; // Read Only 32-bit Statistics Cumulative 32-bit Statistics -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_delta =(const struct aironet4500_rid_selector){ 0xFF69, 0,1,1, "Delta 32-bit Statistics" }; // Read Only 32-bit Statistics Delta 32-bit Statistics (since last clear) -const struct aironet4500_rid_selector aironet4500_RID_Select_32_stats_clear =(const struct aironet4500_rid_selector){ 0xFF6A, 0,1,1, "Delta 32-bit Statistics and Clear" }; // Read Only / 32-bit Statistics Delta 32-bit Statistics and Clear -*/ - -struct aironet4500_RID awc_gen_RID[] ={ - awc_RID_gen_RidLen, - awc_RID_gen_OperatingMode_adhoc, - awc_RID_gen_OperatingMode_Infrastructure, - awc_RID_gen_OperatingMode_AP, - awc_RID_gen_OperatingMode_AP_and_repeater, - awc_RID_gen_OperatingMode_No_payload_modify, - awc_RID_gen_OperatingMode_LLC_802_3_convert, - awc_RID_gen_OperatingMode_proprietary_ext, - awc_RID_gen_OperatingMode_no_proprietary_ext, - awc_RID_gen_OperatingMode_AP_ext, - awc_RID_gen_OperatingMode_no_AP_ext, - awc_RID_gen_ReceiveMode, - awc_RID_gen_ReceiveMode_BMA, - awc_RID_gen_ReceiveMode_BA, - awc_RID_gen_ReceiveMode_A, - awc_RID_gen_ReceiveMode_802_11_monitor, - awc_RID_gen_ReceiveMode_802_11_any_monitor, - awc_RID_gen_ReceiveMode_LAN_monitor, - awc_RID_gen_ReceiveMode_802_3_hdr_disable, - awc_RID_gen_ReceiveMode_802_3_hdr_enable, - awc_RID_gen_Fragmentation_threshold, - awc_RID_gen_RTS_threshold, - awc_RID_gen_Station_Mac_Id, - awc_RID_gen_Supported_rates, - awc_RID_gen_Basic_Rate, - awc_RID_gen_Rate_500kbps, - awc_RID_gen_Rate_1Mbps, - awc_RID_gen_Rate_2Mbps, - awc_RID_gen_Rate_4Mbps, - awc_RID_gen_Rate_5Mbps, - awc_RID_gen_Rate_10Mbps, - awc_RID_gen_Rate_11Mbps, - awc_RID_gen_BasicRate_500kbps, - awc_RID_gen_BasicRate_1Mbps, - awc_RID_gen_BasicRate_2Mbps, - awc_RID_gen_BasicRate_4Mbps, - awc_RID_gen_BasicRate_5Mbps, - awc_RID_gen_BasicRate_10Mbps, - awc_RID_gen_BasicRate_11Mbps, - awc_RID_gen_Long_retry_limit, - awc_RID_gen_Short_retry_limit, - awc_RID_gen_Tx_MSDU_lifetime, - awc_RID_gen_Rx_MSDU_lifetime, - awc_RID_gen_Stationary, - awc_RID_gen_BC_MC_Ordering, - awc_RID_gen_Device_type, - awc_RID_gen_Reserved_0x0026, - awc_RID_gen_ScanMode, - awc_RID_gen_ScanMode_Active, - awc_RID_gen_ScanMode_Passive, - awc_RID_gen_ScanMode_Aironet_ext, - awc_RID_gen_ProbeDelay, - awc_RID_gen_ProbeEnergyTimeout, - awc_RID_gen_ProbeResponseTimeout, - awc_RID_gen_BeaconListenTimeout, - awc_RID_gen_IbssJoinNetTimeout, - awc_RID_gen_AuthenticationTimeout, - awc_RID_gen_AuthenticationType, - awc_RID_gen_AuthenticationType_None, - awc_RID_gen_AuthenticationType_Open, - awc_RID_gen_AuthenticationType_Shared, - awc_RID_gen_AuthenticationType_Exclude_Open, - awc_RID_gen_AssociationTimeout, - awc_RID_gen_SpecifiedAPtimeout, - awc_RID_gen_OfflineScanInterval, - awc_RID_gen_OfflineScanDuration, - awc_RID_gen_LinkLossDelay, - awc_RID_gen_MaxBeaconLostTime, - awc_RID_gen_RefreshInterval, - awc_RID_gen_PowerSaveMode, - awc_RID_gen_PowerSaveMode_CAM, - awc_RID_gen_PowerSaveMode_PSP, - awc_RID_gen_PowerSaveMode_Fast_PSP, - awc_RID_gen_SleepForDTIMs, - awc_RID_gen_ListenInterval, - awc_RID_gen_FastListenInterval, - awc_RID_gen_ListenDecay, - awc_RID_gen_FastListenDelay, - awc_RID_gen_Reserved0x005C, - awc_RID_gen_BeaconPeriod, - awc_RID_gen_AtimDuration, - awc_RID_gen_Reserved0x0064, - awc_RID_gen_DSChannel, - awc_RID_gen_Reserved0x0068, - awc_RID_gen_DTIM_Period, - awc_RID_gen_Reserved0x0006C, - awc_RID_gen_RadioSpreadType, - awc_RID_gen_RadioSpreadType_FH, - awc_RID_gen_RadioSpreadType_DS, - awc_RID_gen_RadioSpreadType_LM, - awc_RID_gen_TX_antenna_Diversity, - awc_RID_gen_TX_antenna_Diversity_default, - awc_RID_gen_TX_antenna_Diversity_1, - awc_RID_gen_TX_antenna_Diversity_2, - awc_RID_gen_TX_antenna_Diversity_both, - awc_RID_gen_RX_antenna_Diversity, - awc_RID_gen_RX_antenna_Diversity_default, - awc_RID_gen_RX_antenna_Diversity_1, - awc_RID_gen_RX_antenna_Diversity_2, - awc_RID_gen_RX_antenna_Diversity_both, - awc_RID_gen_TransmitPower, - awc_RID_gen_RSSIthreshold, - awc_RID_gen_Modulation, - awc_RID_gen_Reserved0x0079, - awc_RID_gen_NodeName, - awc_RID_gen_ARLThreshold, - awc_RID_gen_ARLDecay, - awc_RID_gen_ARLDelay, - awc_RID_gen_Unused0x0096, - awc_RID_gen_MagicPacketAction, - awc_RID_gen_MagicPacketControl, - {0} -}; - -struct aironet4500_RID awc_act_RID[]={ - awc_RID_act_RidLen, - awc_RID_act_OperatingMode_adhoc, - awc_RID_act_OperatingMode_Infrastructure, - awc_RID_act_OperatingMode_AP, - awc_RID_act_OperatingMode_AP_and_repeater, - awc_RID_act_OperatingMode_No_payload_modify, - awc_RID_act_OperatingMode_LLC_802_3_convert, - awc_RID_act_OperatingMode_proprietary_ext, - awc_RID_act_OperatingMode_no_proprietary_ext, - awc_RID_act_OperatingMode_AP_ext, - awc_RID_act_OperatingMode_no_AP_ext, - awc_RID_act_ReceiveMode, - awc_RID_act_ReceiveMode_BMA, - awc_RID_act_ReceiveMode_BA, - awc_RID_act_ReceiveMode_A, - awc_RID_act_ReceiveMode_802_11_monitor, - awc_RID_act_ReceiveMode_802_11_any_monitor, - awc_RID_act_ReceiveMode_LAN_monitor, - awc_RID_act_ReceiveMode_802_3_hdr_disable, - awc_RID_act_ReceiveMode_802_3_hdr_enable, - awc_RID_act_Fragmentation_threshold, - awc_RID_act_RTS_threshold, - awc_RID_act_Station_Mac_Id, - awc_RID_act_Supported_rates, - awc_RID_act_Basic_Rate, - awc_RID_act_Rate_500kbps, - awc_RID_act_Rate_1Mbps, - awc_RID_act_Rate_2Mbps, - awc_RID_act_Rate_4Mbps, - awc_RID_act_Rate_5Mbps, - awc_RID_act_Rate_10Mbps, - awc_RID_act_Rate_11Mbps, - awc_RID_act_BasicRate_500kbps, - awc_RID_act_BasicRate_1Mbps, - awc_RID_act_BasicRate_2Mbps, - awc_RID_act_BasicRate_4Mbps, - awc_RID_act_BasicRate_5Mbps, - awc_RID_act_BasicRate_10Mbps, - awc_RID_act_BasicRate_11Mbps, - awc_RID_act_Long_retry_limit, - awc_RID_act_Short_retry_limit, - awc_RID_act_Tx_MSDU_lifetime, - awc_RID_act_Rx_MSDU_lifetime, - awc_RID_act_Stationary, - awc_RID_act_BC_MC_Ordering, - awc_RID_act_Device_type, - awc_RID_act_Reserved_0x0026, - awc_RID_act_ScanMode, - awc_RID_act_ScanMode_Active, - awc_RID_act_ScanMode_Passive, - awc_RID_act_ScanMode_Aironet_ext, - awc_RID_act_ProbeDelay, - awc_RID_act_ProbeEnergyTimeout, - awc_RID_act_ProbeResponseTimeout, - awc_RID_act_BeaconListenTimeout, - awc_RID_act_IbssJoinNetTimeout, - awc_RID_act_AuthenticationTimeout, - awc_RID_act_AuthenticationType, - awc_RID_act_AuthenticationType_None, - awc_RID_act_AuthenticationType_Open, - awc_RID_act_AuthenticationType_Shared, - awc_RID_act_AuthenticationType_Exclude_Open, - awc_RID_act_AssociationTimeout, - awc_RID_act_SpecifiedAPtimeout, - awc_RID_act_OfflineScanInterval, - awc_RID_act_OfflineScanDuration, - awc_RID_act_LinkLossDelay, - awc_RID_act_MaxBeaconLostTime, - awc_RID_act_RefreshInterval, - awc_RID_act_PowerSaveMode, - awc_RID_act_PowerSaveMode_CAM, - awc_RID_act_PowerSaveMode_PSP, - awc_RID_act_PowerSaveMode_Fast_PSP, - awc_RID_act_SleepForDTIMs, - awc_RID_act_ListenInterval, - awc_RID_act_FastListenInterval, - awc_RID_act_ListenDecay, - awc_RID_act_FastListenDelay, - awc_RID_act_Reserved0x005C, - awc_RID_act_BeaconPeriod, - awc_RID_act_AtimDuration, - awc_RID_act_Reserved0x0064, - awc_RID_act_DSChannel, - awc_RID_act_Reserved0x0068, - awc_RID_act_DTIM_Period, - awc_RID_act_Reserved0x0006C, - awc_RID_act_RadioSpreadType, - awc_RID_act_RadioSpreadType_FH, - awc_RID_act_RadioSpreadType_DS, - awc_RID_act_RadioSpreadType_LM, - awc_RID_act_TX_antenna_Diversity, - awc_RID_act_TX_antenna_Diversity_default, - awc_RID_act_TX_antenna_Diversity_1, - awc_RID_act_TX_antenna_Diversity_2, - awc_RID_act_TX_antenna_Diversity_both, - awc_RID_act_RX_antenna_Diversity, - awc_RID_act_RX_antenna_Diversity_default, - awc_RID_act_RX_antenna_Diversity_1, - awc_RID_act_RX_antenna_Diversity_2, - awc_RID_act_RX_antenna_Diversity_both, - awc_RID_act_TransmitPower, - awc_RID_act_RSSIthreshold, - awc_RID_act_Modulation, - awc_RID_act_Reserved0x0079, - awc_RID_act_NodeName, - awc_RID_act_ARLThreshold, - awc_RID_act_ARLDecay, - awc_RID_act_ARLDelay, - awc_RID_act_Unused0x0096, - awc_RID_act_MagicPacketAction, - awc_RID_act_MagicPacketControl, - {0} -}; - - - -struct aironet4500_RID awc_SSID_RID[]={ - awc_RID_SSID_RidLen, - awc_RID_SSID_Accept_any, - awc_RID_SSIDlen1, - awc_RID_SSID1, - awc_RID_SSIDlen2, - awc_RID_SSID2, - awc_RID_SSIDlen3, - awc_RID_SSID3, - awc_RID_SSID1hex, - awc_RID_SSID2hex, - awc_RID_SSID3hex, - {0} -}; - - -struct aironet4500_RID awc_AP_List_RID[]={ - awc_RID_AP_List_RidLen, - awc_RID_AP_List_SpecifiedAP1, - awc_RID_AP_List_SpecifiedAP2, - awc_RID_AP_List_SpecifiedAP3, - awc_RID_AP_List_SpecifiedAP4, - {0} -}; - - -struct aironet4500_RID awc_Dname_RID[]={ - awc_RID_Dname_RidLen, - awc_RID_Dname_DriverName, - {0} -}; - - - - -struct aironet4500_RID awc_enc_RID[]={ - awc_RID_Enc_RidLen, - awc_RID_Enc_EtherType1, - awc_RID_Enc_Action_RX_1, - awc_RID_Enc_Action_RX_1_RFC_1042, - awc_RID_Enc_Action_RX_1_802_11, - awc_RID_Enc_Action_TX_1, - awc_RID_Enc_Action_TX_1_RFC_1042, - awc_RID_Enc_Action_TX_1_802_11, - awc_RID_Enc_EtherType2, - awc_RID_Enc_Action_RX_2, - awc_RID_Enc_Action_RX_2_RFC_1042, - awc_RID_Enc_Action_RX_2_802_11, - awc_RID_Enc_Action_TX_2, - awc_RID_Enc_Action_TX_2_RFC_1042, - awc_RID_Enc_Action_TX_2_802_11, - awc_RID_Enc_EtherType3, - awc_RID_Enc_Action_RX_3, - awc_RID_Enc_Action_RX_3_RFC_1042, - awc_RID_Enc_Action_RX_3_802_11, - awc_RID_Enc_Action_TX_3_, - awc_RID_Enc_Action_TX_3_RFC_1042, - awc_RID_Enc_Action_TX_3_802_11, - awc_RID_Enc_EtherType4, - awc_RID_Enc_Action_RX_4, - awc_RID_Enc_Action_RX_4_RFC_1042, - awc_RID_Enc_Action_RX_4_802_11, - awc_RID_Enc_Action_TX_4, - awc_RID_Enc_Action_TX_4_RFC_1042, - awc_RID_Enc_Action_TX_4_802_11, - awc_RID_Enc_EtherType5, - awc_RID_Enc_Action_RX_5, - awc_RID_Enc_Action_RX_5_RFC_1042, - awc_RID_Enc_Action_RX_5_802_11, - awc_RID_Enc_Action_TX_5, - awc_RID_Enc_Action_TX_5_RFC_1042, - awc_RID_Enc_Action_TX_5_802_11, - awc_RID_Enc_EtherType6, - awc_RID_Enc_Action_RX_6, - awc_RID_Enc_Action_RX_6_RFC_1042, - awc_RID_Enc_Action_RX_6_802_11, - awc_RID_Enc_Action_TX_6, - awc_RID_Enc_Action_TX_6_RFC_1042, - awc_RID_Enc_Action_TX_6_802_11, - awc_RID_Enc_EtherType7, - awc_RID_Enc_Action_RX_7, - awc_RID_Enc_Action_RX_7_RFC_1042, - awc_RID_Enc_Action_RX_7_802_11, - awc_RID_Enc_Action_TX_7, - awc_RID_Enc_Action_TX_7_RFC_1042, - awc_RID_Enc_Action_TX_7_802_11, - awc_RID_Enc_EtherType8, - awc_RID_Enc_Action_RX_8, - awc_RID_Enc_Action_RX_8_RFC_1042, - awc_RID_Enc_Action_RX_8_802_11, - awc_RID_Enc_Action_TX_8, - awc_RID_Enc_Action_TX_8_RFC_1042, - awc_RID_Enc_Action_TX_8_802_11, - {0} -}; - -struct aironet4500_RID awc_WEPv_RID[]={ - awc_RID_WEPv_RidLen, - awc_RID_WEPv_KeyIndex, - awc_RID_WEPv_Address, - awc_RID_WEPv_KeyLen, - awc_RID_WEPv_Key, - awc_RID_WEPv_KeyAscii, - {0} -}; - -struct aironet4500_RID awc_WEPnv_RID[]={ - awc_RID_WEPnv_RidLen, - awc_RID_WEPnv_KeyIndex, - awc_RID_WEPnv_Address, - awc_RID_WEPnv_KeyLen, - awc_RID_WEPnv_Key, - awc_RID_WEPnv_KeyAscii, - {0} -}; - -struct aironet4500_RID awc_Modulation_RID[]={ - awc_RID_Modulation_RidLen, - awc_RID_Modulation_Modulation, - {0} -}; - - - -struct aironet4500_RID awc_Cap_RID[]={ - awc_RID_Cap_RidLen, - awc_RID_Cap_OUI, - awc_RID_Cap_ProductNum, - awc_RID_Cap_ManufacturerName, - awc_RID_Cap_ProductName, - awc_RID_Cap_ProductVersion, - awc_RID_Cap_FactoryAddress, - awc_RID_Cap_AironetAddress, - awc_RID_Cap_RadioSpreadType_DS, - awc_RID_Cap_RadioSpreadType_FH, - awc_RID_Cap_RadioSpreadType_Legacy, - awc_RID_Cap_RegDomain, - awc_RID_Cap_Callid, - awc_RID_Cap_SupportedRates, - awc_RID_Cap_RxDiversity, - awc_RID_Cap_TxDiversity, - awc_RID_Cap_TxPowerLevels, - awc_RID_Cap_HardwareVersion, - awc_RID_Cap_HardwareCapabilit, - awc_RID_Cap_TemperatureRange, - awc_RID_Cap_SoftwareVersion, - awc_RID_Cap_SoftwareVersion_major, - awc_RID_Cap_SoftwareVersion_minor, - awc_RID_Cap_SoftwareSubVersion, - awc_RID_Cap_InterfaceVersion, - awc_RID_Cap_SoftwareCapabilities, - awc_RID_Cap_BootBlockVersion, - {0} -}; - - -struct aironet4500_RID awc_Status_RID[]={ - awc_RID_Status_RidLen, - awc_RID_Status_MacAddress, - awc_RID_Status_OperationalMode, - awc_RID_Status_Configured, - awc_RID_Status_MAC_Enabled, - awc_RID_Status_Receive_Enabled, - awc_RID_Status_In_Sync, - awc_RID_Status_Associated, - awc_RID_Status_Error, - awc_RID_Status_ErrorCode, - awc_RID_Status_CurrentSignalQuality, - awc_RID_Status_SSIDlength, - awc_RID_Status_SSID, - awc_RID_Status_ApName, - awc_RID_Status_CurrentBssid, - awc_RID_Status_PreviousBssid1, - awc_RID_Status_PreviousBssid2, - awc_RID_Status_PreviousBssid3, - awc_RID_Status_BeaconPeriod, - awc_RID_Status_DtimPeriod, - awc_RID_Status_AtimDuration, - awc_RID_Status_HopPeriod, - awc_RID_Status_ChannelSet, - awc_RID_Status_Channel, - awc_RID_Status_HopsToBackbone, - awc_RID_Status_ApTotalLoad, - awc_RID_Status_OurGeneratedLoad, - awc_RID_Status_AccumulatedArl, - {0} -}; - - -struct aironet4500_RID awc_AP_RID[]={ - awc_RID_AP_16RidLen, - awc_RID_AP_TIM_addr, - awc_RID_AP_Airo_addr, - {0} -}; - - -struct aironet4500_RID awc_Stats_RID[]={ - awc_RID_Stats_RidLen, - awc_RID_Stats_RxOverrunErr, - awc_RID_Stats_RxPlcpCrcErr, - awc_RID_Stats_RxPlcpFormat, - awc_RID_Stats_RxPlcpLength, - awc_RID_Stats_RxMacCrcErr, - awc_RID_Stats_RxMacCrcOk, - awc_RID_Stats_RxWepErr, - awc_RID_Stats_RxWepOk, - awc_RID_Stats_RetryLong, - awc_RID_Stats_RetryShort, - awc_RID_Stats_MaxRetries, - awc_RID_Stats_NoAck, - awc_RID_Stats_NoCts, - awc_RID_Stats_RxAck, - awc_RID_Stats_RxCts, - awc_RID_Stats_TxAck, - awc_RID_Stats_TxRts, - awc_RID_Stats_TxCts, - awc_RID_Stats_TxMc, - awc_RID_Stats_TxBc, - awc_RID_Stats_TxUcFrags, - awc_RID_Stats_TxUcPackets, - awc_RID_Stats_TxBeacon, - awc_RID_Stats_RxBeacon, - awc_RID_Stats_TxSinColl, - awc_RID_Stats_TxMulColl, - awc_RID_Stats_DefersNo, - awc_RID_Stats_DefersProt, - awc_RID_Stats_DefersEngy, - awc_RID_Stats_DupFram, - awc_RID_Stats_RxFragDisc, - awc_RID_Stats_TxAged, - awc_RID_Stats_RxAged, - awc_RID_Stats_LostSync_Max, - awc_RID_Stats_LostSync_Mis, - awc_RID_Stats_LostSync_Arl, - awc_RID_Stats_LostSync_Dea, - awc_RID_Stats_LostSync_Disa, - awc_RID_Stats_LostSync_Tsf, - awc_RID_Stats_HostTxMc, - awc_RID_Stats_HostTxBc, - awc_RID_Stats_HostTxUc, - awc_RID_Stats_HostTxFail, - awc_RID_Stats_HostRxMc, - awc_RID_Stats_HostRxBc, - awc_RID_Stats_HostRxUc, - awc_RID_Stats_HostRxDiscar, - awc_RID_Stats_HmacTxMc, - awc_RID_Stats_HmacTxBc, - awc_RID_Stats_HmacTxUc, - awc_RID_Stats_HmacTxFail, - awc_RID_Stats_HmacRxMc, - awc_RID_Stats_HmacRxBc, - awc_RID_Stats_HmacRxUc, - awc_RID_Stats_HmacRxDisca, - awc_RID_Stats_HmacRxAcce, - awc_RID_Stats_SsidMismatch, - awc_RID_Stats_ApMismatch, - awc_RID_Stats_RatesMismatc, - awc_RID_Stats_AuthReject, - awc_RID_Stats_AuthTimeout, - awc_RID_Stats_AssocReject, - awc_RID_Stats_AssocTimeout, - awc_RID_Stats_NewReason, - awc_RID_Stats_AuthFail_1, - awc_RID_Stats_AuthFail_2, - awc_RID_Stats_AuthFail_3, - awc_RID_Stats_AuthFail_4, - awc_RID_Stats_AuthFail_5, - awc_RID_Stats_AuthFail_6, - awc_RID_Stats_AuthFail_7, - awc_RID_Stats_AuthFail_8, - awc_RID_Stats_AuthFail_9, - awc_RID_Stats_AuthFail_10, - awc_RID_Stats_AuthFail_11, - awc_RID_Stats_AuthFail_12, - awc_RID_Stats_AuthFail_13, - awc_RID_Stats_AuthFail_14, - awc_RID_Stats_AuthFail_15, - awc_RID_Stats_AuthFail_16, - awc_RID_Stats_AuthFail_17, - awc_RID_Stats_AuthFail_18, - awc_RID_Stats_AuthFail_19, - awc_RID_Stats_RxMan, - awc_RID_Stats_TxMan, - awc_RID_Stats_RxRefresh, - awc_RID_Stats_TxRefresh, - awc_RID_Stats_RxPoll, - awc_RID_Stats_TxPoll, - awc_RID_Stats_HostRetries, - awc_RID_Stats_LostSync_HostReq, - awc_RID_Stats_HostTxBytes, - awc_RID_Stats_HostRxBytes, - awc_RID_Stats_ElapsedUsec, - awc_RID_Stats_ElapsedSec, - awc_RID_Stats_LostSyncBett, - {0} -}; - - - -struct aironet4500_RID awc_Stats_delta_RID[]={ - awc_RID_Stats_delta_RidLen, - awc_RID_Stats_delta_RxOverrunErr, - awc_RID_Stats_delta_RxPlcpCrcErr, - awc_RID_Stats_delta_RxPlcpFormat, - awc_RID_Stats_delta_RxPlcpLength, - awc_RID_Stats_delta_RxMacCrcErr, - awc_RID_Stats_delta_RxMacCrcOk, - awc_RID_Stats_delta_RxWepErr, - awc_RID_Stats_delta_RxWepOk, - awc_RID_Stats_delta_RetryLong, - awc_RID_Stats_delta_RetryShort, - awc_RID_Stats_delta_MaxRetries, - awc_RID_Stats_delta_NoAck, - awc_RID_Stats_delta_NoCts, - awc_RID_Stats_delta_RxAck, - awc_RID_Stats_delta_RxCts, - awc_RID_Stats_delta_TxAck, - awc_RID_Stats_delta_TxRts, - awc_RID_Stats_delta_TxCts, - awc_RID_Stats_delta_TxMc, - awc_RID_Stats_delta_TxBc, - awc_RID_Stats_delta_TxUcFrags, - awc_RID_Stats_delta_TxUcPackets, - awc_RID_Stats_delta_TxBeacon, - awc_RID_Stats_delta_RxBeacon, - awc_RID_Stats_delta_TxSinColl, - awc_RID_Stats_delta_TxMulColl, - awc_RID_Stats_delta_DefersNo, - awc_RID_Stats_delta_DefersProt, - awc_RID_Stats_delta_DefersEngy, - awc_RID_Stats_delta_DupFram, - awc_RID_Stats_delta_RxFragDisc, - awc_RID_Stats_delta_TxAged, - awc_RID_Stats_delta_RxAged, - awc_RID_Stats_delta_LostSync_Max, - awc_RID_Stats_delta_LostSync_Mis, - awc_RID_Stats_delta_LostSync_Arl, - awc_RID_Stats_delta_LostSync_Dea, - awc_RID_Stats_delta_LostSync_Disa, - awc_RID_Stats_delta_LostSync_Tsf, - awc_RID_Stats_delta_HostTxMc, - awc_RID_Stats_delta_HostTxBc, - awc_RID_Stats_delta_HostTxUc, - awc_RID_Stats_delta_HostTxFail, - awc_RID_Stats_delta_HostRxMc, - awc_RID_Stats_delta_HostRxBc, - awc_RID_Stats_delta_HostRxUc, - awc_RID_Stats_delta_HostRxDiscar, - awc_RID_Stats_delta_HmacTxMc, - awc_RID_Stats_delta_HmacTxBc, - awc_RID_Stats_delta_HmacTxUc, - awc_RID_Stats_delta_HmacTxFail, - awc_RID_Stats_delta_HmacRxMc, - awc_RID_Stats_delta_HmacRxBc, - awc_RID_Stats_delta_HmacRxUc, - awc_RID_Stats_delta_HmacRxDisca, - awc_RID_Stats_delta_HmacRxAcce, - awc_RID_Stats_delta_SsidMismatch, - awc_RID_Stats_delta_ApMismatch, - awc_RID_Stats_delta_RatesMismatc, - awc_RID_Stats_delta_AuthReject, - awc_RID_Stats_delta_AuthTimeout, - awc_RID_Stats_delta_AssocReject, - awc_RID_Stats_delta_AssocTimeout, - awc_RID_Stats_delta_NewReason, - awc_RID_Stats_delta_AuthFail_1, - awc_RID_Stats_delta_AuthFail_2, - awc_RID_Stats_delta_AuthFail_3, - awc_RID_Stats_delta_AuthFail_4, - awc_RID_Stats_delta_AuthFail_5, - awc_RID_Stats_delta_AuthFail_6, - awc_RID_Stats_delta_AuthFail_7, - awc_RID_Stats_delta_AuthFail_8, - awc_RID_Stats_delta_AuthFail_9, - awc_RID_Stats_delta_AuthFail_10, - awc_RID_Stats_delta_AuthFail_11, - awc_RID_Stats_delta_AuthFail_12, - awc_RID_Stats_delta_AuthFail_13, - awc_RID_Stats_delta_AuthFail_14, - awc_RID_Stats_delta_AuthFail_15, - awc_RID_Stats_delta_AuthFail_16, - awc_RID_Stats_delta_AuthFail_17, - awc_RID_Stats_delta_AuthFail_18, - awc_RID_Stats_delta_AuthFail_19, - awc_RID_Stats_delta_RxMan, - awc_RID_Stats_delta_TxMan, - awc_RID_Stats_delta_RxRefresh, - awc_RID_Stats_delta_TxRefresh, - awc_RID_Stats_delta_RxPoll, - awc_RID_Stats_delta_TxPoll, - awc_RID_Stats_delta_HostRetries, - awc_RID_Stats_delta_LostSync_HostReq, - awc_RID_Stats_delta_HostTxBytes, - awc_RID_Stats_delta_HostRxBytes, - awc_RID_Stats_delta_ElapsedUsec, - awc_RID_Stats_delta_ElapsedSec, - awc_RID_Stats_delta_LostSyncBett, - {0} -}; - -struct aironet4500_RID awc_Stats_clear_RID[]={ - awc_RID_Stats_clear_RidLen, - awc_RID_Stats_clear_RxOverrunErr, - awc_RID_Stats_clear_RxPlcpCrcErr, - awc_RID_Stats_clear_RxPlcpFormat, - awc_RID_Stats_clear_RxPlcpLength, - awc_RID_Stats_clear_RxMacCrcErr, - awc_RID_Stats_clear_RxMacCrcOk, - awc_RID_Stats_clear_RxWepErr, - awc_RID_Stats_clear_RxWepOk, - awc_RID_Stats_clear_RetryLong, - awc_RID_Stats_clear_RetryShort, - awc_RID_Stats_clear_MaxRetries, - awc_RID_Stats_clear_NoAck, - awc_RID_Stats_clear_NoCts, - awc_RID_Stats_clear_RxAck, - awc_RID_Stats_clear_RxCts, - awc_RID_Stats_clear_TxAck, - awc_RID_Stats_clear_TxRts, - awc_RID_Stats_clear_TxCts, - awc_RID_Stats_clear_TxMc, - awc_RID_Stats_clear_TxBc, - awc_RID_Stats_clear_TxUcFrags, - awc_RID_Stats_clear_TxUcPackets, - awc_RID_Stats_clear_TxBeacon, - awc_RID_Stats_clear_RxBeacon, - awc_RID_Stats_clear_TxSinColl, - awc_RID_Stats_clear_TxMulColl, - awc_RID_Stats_clear_DefersNo, - awc_RID_Stats_clear_DefersProt, - awc_RID_Stats_clear_DefersEngy, - awc_RID_Stats_clear_DupFram, - awc_RID_Stats_clear_RxFragDisc, - awc_RID_Stats_clear_TxAged, - awc_RID_Stats_clear_RxAged, - awc_RID_Stats_clear_LostSync_Max, - awc_RID_Stats_clear_LostSync_Mis, - awc_RID_Stats_clear_LostSync_Arl, - awc_RID_Stats_clear_LostSync_Dea, - awc_RID_Stats_clear_LostSync_Disa, - awc_RID_Stats_clear_LostSync_Tsf, - awc_RID_Stats_clear_HostTxMc, - awc_RID_Stats_clear_HostTxBc, - awc_RID_Stats_clear_HostTxUc, - awc_RID_Stats_clear_HostTxFail, - awc_RID_Stats_clear_HostRxMc, - awc_RID_Stats_clear_HostRxBc, - awc_RID_Stats_clear_HostRxUc, - awc_RID_Stats_clear_HostRxDiscar, - awc_RID_Stats_clear_HmacTxMc, - awc_RID_Stats_clear_HmacTxBc, - awc_RID_Stats_clear_HmacTxUc, - awc_RID_Stats_clear_HmacTxFail, - awc_RID_Stats_clear_HmacRxMc, - awc_RID_Stats_clear_HmacRxBc, - awc_RID_Stats_clear_HmacRxUc, - awc_RID_Stats_clear_HmacRxDisca, - awc_RID_Stats_clear_HmacRxAcce, - awc_RID_Stats_clear_SsidMismatch, - awc_RID_Stats_clear_ApMismatch, - awc_RID_Stats_clear_RatesMismatc, - awc_RID_Stats_clear_AuthReject, - awc_RID_Stats_clear_AuthTimeout, - awc_RID_Stats_clear_AssocReject, - awc_RID_Stats_clear_AssocTimeout, - awc_RID_Stats_clear_NewReason, - awc_RID_Stats_clear_AuthFail_1, - awc_RID_Stats_clear_AuthFail_2, - awc_RID_Stats_clear_AuthFail_3, - awc_RID_Stats_clear_AuthFail_4, - awc_RID_Stats_clear_AuthFail_5, - awc_RID_Stats_clear_AuthFail_6, - awc_RID_Stats_clear_AuthFail_7, - awc_RID_Stats_clear_AuthFail_8, - awc_RID_Stats_clear_AuthFail_9, - awc_RID_Stats_clear_AuthFail_10, - awc_RID_Stats_clear_AuthFail_11, - awc_RID_Stats_clear_AuthFail_12, - awc_RID_Stats_clear_AuthFail_13, - awc_RID_Stats_clear_AuthFail_14, - awc_RID_Stats_clear_AuthFail_15, - awc_RID_Stats_clear_AuthFail_16, - awc_RID_Stats_clear_AuthFail_17, - awc_RID_Stats_clear_AuthFail_18, - awc_RID_Stats_clear_AuthFail_19, - awc_RID_Stats_clear_RxMan, - awc_RID_Stats_clear_TxMan, - awc_RID_Stats_clear_RxRefresh, - awc_RID_Stats_clear_TxRefresh, - awc_RID_Stats_clear_RxPoll, - awc_RID_Stats_clear_TxPoll, - awc_RID_Stats_clear_HostRetries, - awc_RID_Stats_clear_LostSync_HostReq, - awc_RID_Stats_clear_HostTxBytes, - awc_RID_Stats_clear_HostRxBytes, - awc_RID_Stats_clear_ElapsedUsec, - awc_RID_Stats_clear_ElapsedSec, - awc_RID_Stats_clear_LostSyncBett, - {0} -}; -#ifdef AWC_USE_16BIT_STATS -struct aironet4500_RID awc_Stats16_RID[]={ - awc_RID_Stats16_RidLen, - awc_RID_Stats16_RxOverrunErr, - awc_RID_Stats16_RxPlcpCrcErr, - awc_RID_Stats16_RxPlcpFormat, - awc_RID_Stats16_RxPlcpLength, - awc_RID_Stats16_RxMacCrcErr, - awc_RID_Stats16_RxMacCrcOk, - awc_RID_Stats16_RxWepErr, - awc_RID_Stats16_RxWepOk, - awc_RID_Stats16_RetryLong, - awc_RID_Stats16_RetryShort, - awc_RID_Stats16_MaxRetries, - awc_RID_Stats16_NoAck, - awc_RID_Stats16_NoCts, - awc_RID_Stats16_RxAck, - awc_RID_Stats16_RxCts, - awc_RID_Stats16_TxAck, - awc_RID_Stats16_TxRts, - awc_RID_Stats16_TxCts, - awc_RID_Stats16_TxMc, - awc_RID_Stats16_TxBc, - awc_RID_Stats16_TxUcFrags, - awc_RID_Stats16_TxUcPackets, - awc_RID_Stats16_TxBeacon, - awc_RID_Stats16_RxBeacon, - awc_RID_Stats16_TxSinColl, - awc_RID_Stats16_TxMulColl, - awc_RID_Stats16_DefersNo, - awc_RID_Stats16_DefersProt, - awc_RID_Stats16_DefersEngy, - awc_RID_Stats16_DupFram, - awc_RID_Stats16_RxFragDisc, - awc_RID_Stats16_TxAged, - awc_RID_Stats16_RxAged, - awc_RID_Stats16_LostSync_Max, - awc_RID_Stats16_LostSync_Mis, - awc_RID_Stats16_LostSync_Arl, - awc_RID_Stats16_LostSync_Dea, - awc_RID_Stats16_LostSync_Disa, - awc_RID_Stats16_LostSync_Tsf, - awc_RID_Stats16_HostTxMc, - awc_RID_Stats16_HostTxBc, - awc_RID_Stats16_HostTxUc, - awc_RID_Stats16_HostTxFail, - awc_RID_Stats16_HostRxMc, - awc_RID_Stats16_HostRxBc, - awc_RID_Stats16_HostRxUc, - awc_RID_Stats16_HostRxDiscar, - awc_RID_Stats16_HmacTxMc, - awc_RID_Stats16_HmacTxBc, - awc_RID_Stats16_HmacTxUc, - awc_RID_Stats16_HmacTxFail, - awc_RID_Stats16_HmacRxMc, - awc_RID_Stats16_HmacRxBc, - awc_RID_Stats16_HmacRxUc, - awc_RID_Stats16_HmacRxDisca, - awc_RID_Stats16_HmacRxAcce, - awc_RID_Stats16_SsidMismatch, - awc_RID_Stats16_ApMismatch, - awc_RID_Stats16_RatesMismatc, - awc_RID_Stats16_AuthReject, - awc_RID_Stats16_AuthTimeout, - awc_RID_Stats16_AssocReject, - awc_RID_Stats16_AssocTimeout, - awc_RID_Stats16_NewReason, - awc_RID_Stats16_AuthFail_1, - awc_RID_Stats16_AuthFail_2, - awc_RID_Stats16_AuthFail_3, - awc_RID_Stats16_AuthFail_4, - awc_RID_Stats16_AuthFail_5, - awc_RID_Stats16_AuthFail_6, - awc_RID_Stats16_AuthFail_7, - awc_RID_Stats16_AuthFail_8, - awc_RID_Stats16_AuthFail_9, - awc_RID_Stats16_AuthFail_10, - awc_RID_Stats16_AuthFail_11, - awc_RID_Stats16_AuthFail_12, - awc_RID_Stats16_AuthFail_13, - awc_RID_Stats16_AuthFail_14, - awc_RID_Stats16_AuthFail_15, - awc_RID_Stats16_AuthFail_16, - awc_RID_Stats16_AuthFail_17, - awc_RID_Stats16_AuthFail_18, - awc_RID_Stats16_AuthFail_19, - awc_RID_Stats16_RxMan, - awc_RID_Stats16_TxMan, - awc_RID_Stats16_RxRefresh, - awc_RID_Stats16_TxRefresh, - awc_RID_Stats16_RxPoll, - awc_RID_Stats16_TxPoll, - awc_RID_Stats16_HostRetries, - awc_RID_Stats16_LostSync_HostReq, - awc_RID_Stats16_HostTxBytes, - awc_RID_Stats16_HostRxBytes, - awc_RID_Stats16_ElapsedUsec, - awc_RID_Stats16_ElapsedSec, - awc_RID_Stats16_LostSyncBett, - {0} -}; - -struct aironet4500_RID awc_Stats16_delta_RID[]={ - awc_RID_Stats16_delta_RidLen, - awc_RID_Stats16_delta_RxOverrunErr, - awc_RID_Stats16_delta_RxPlcpCrcErr, - awc_RID_Stats16_delta_RxPlcpFormat, - awc_RID_Stats16_delta_RxPlcpLength, - awc_RID_Stats16_delta_RxMacCrcErr, - awc_RID_Stats16_delta_RxMacCrcOk, - awc_RID_Stats16_delta_RxWepErr, - awc_RID_Stats16_delta_RxWepOk, - awc_RID_Stats16_delta_RetryLong, - awc_RID_Stats16_delta_RetryShort, - awc_RID_Stats16_delta_MaxRetries, - awc_RID_Stats16_delta_NoAck, - awc_RID_Stats16_delta_NoCts, - awc_RID_Stats16_delta_RxAck, - awc_RID_Stats16_delta_RxCts, - awc_RID_Stats16_delta_TxAck, - awc_RID_Stats16_delta_TxRts, - awc_RID_Stats16_delta_TxCts, - awc_RID_Stats16_delta_TxMc, - awc_RID_Stats16_delta_TxBc, - awc_RID_Stats16_delta_TxUcFrags, - awc_RID_Stats16_delta_TxUcPackets, - awc_RID_Stats16_delta_TxBeacon, - awc_RID_Stats16_delta_RxBeacon, - awc_RID_Stats16_delta_TxSinColl, - awc_RID_Stats16_delta_TxMulColl, - awc_RID_Stats16_delta_DefersNo, - awc_RID_Stats16_delta_DefersProt, - awc_RID_Stats16_delta_DefersEngy, - awc_RID_Stats16_delta_DupFram, - awc_RID_Stats16_delta_RxFragDisc, - awc_RID_Stats16_delta_TxAged, - awc_RID_Stats16_delta_RxAged, - awc_RID_Stats16_delta_LostSync_Max, - awc_RID_Stats16_delta_LostSync_Mis, - awc_RID_Stats16_delta_LostSync_Arl, - awc_RID_Stats16_delta_LostSync_Dea, - awc_RID_Stats16_delta_LostSync_Disa, - awc_RID_Stats16_delta_LostSync_Tsf, - awc_RID_Stats16_delta_HostTxMc, - awc_RID_Stats16_delta_HostTxBc, - awc_RID_Stats16_delta_HostTxUc, - awc_RID_Stats16_delta_HostTxFail, - awc_RID_Stats16_delta_HostRxMc, - awc_RID_Stats16_delta_HostRxBc, - awc_RID_Stats16_delta_HostRxUc, - awc_RID_Stats16_delta_HostRxDiscar, - awc_RID_Stats16_delta_HmacTxMc, - awc_RID_Stats16_delta_HmacTxBc, - awc_RID_Stats16_delta_HmacTxUc, - awc_RID_Stats16_delta_HmacTxFail, - awc_RID_Stats16_delta_HmacRxMc, - awc_RID_Stats16_delta_HmacRxBc, - awc_RID_Stats16_delta_HmacRxUc, - awc_RID_Stats16_delta_HmacRxDisca, - awc_RID_Stats16_delta_HmacRxAcce, - awc_RID_Stats16_delta_SsidMismatch, - awc_RID_Stats16_delta_ApMismatch, - awc_RID_Stats16_delta_RatesMismatc, - awc_RID_Stats16_delta_AuthReject, - awc_RID_Stats16_delta_AuthTimeout, - awc_RID_Stats16_delta_AssocReject, - awc_RID_Stats16_delta_AssocTimeout, - awc_RID_Stats16_delta_NewReason, - awc_RID_Stats16_delta_AuthFail_1, - awc_RID_Stats16_delta_AuthFail_2, - awc_RID_Stats16_delta_AuthFail_3, - awc_RID_Stats16_delta_AuthFail_4, - awc_RID_Stats16_delta_AuthFail_5, - awc_RID_Stats16_delta_AuthFail_6, - awc_RID_Stats16_delta_AuthFail_7, - awc_RID_Stats16_delta_AuthFail_8, - awc_RID_Stats16_delta_AuthFail_9, - awc_RID_Stats16_delta_AuthFail_10, - awc_RID_Stats16_delta_AuthFail_11, - awc_RID_Stats16_delta_AuthFail_12, - awc_RID_Stats16_delta_AuthFail_13, - awc_RID_Stats16_delta_AuthFail_14, - awc_RID_Stats16_delta_AuthFail_15, - awc_RID_Stats16_delta_AuthFail_16, - awc_RID_Stats16_delta_AuthFail_17, - awc_RID_Stats16_delta_AuthFail_18, - awc_RID_Stats16_delta_AuthFail_19, - awc_RID_Stats16_delta_RxMan, - awc_RID_Stats16_delta_TxMan, - awc_RID_Stats16_delta_RxRefresh, - awc_RID_Stats16_delta_TxRefresh, - awc_RID_Stats16_delta_RxPoll, - awc_RID_Stats16_delta_TxPoll, - awc_RID_Stats16_delta_HostRetries, - awc_RID_Stats16_delta_LostSync_HostReq, - awc_RID_Stats16_delta_HostTxBytes, - awc_RID_Stats16_delta_HostRxBytes, - awc_RID_Stats16_delta_ElapsedUsec, - awc_RID_Stats16_delta_ElapsedSec, - awc_RID_Stats16_delta_LostSyncBett, - {0} -}; - -struct aironet4500_RID awc_Stats16_clear_RID[]={ - awc_RID_Stats16_clear_RidLen, - awc_RID_Stats16_clear_RxOverrunErr, - awc_RID_Stats16_clear_RxPlcpCrcErr, - awc_RID_Stats16_clear_RxPlcpFormat, - awc_RID_Stats16_clear_RxPlcpLength, - awc_RID_Stats16_clear_RxMacCrcErr, - awc_RID_Stats16_clear_RxMacCrcOk, - awc_RID_Stats16_clear_RxWepErr, - awc_RID_Stats16_clear_RxWepOk, - awc_RID_Stats16_clear_RetryLong, - awc_RID_Stats16_clear_RetryShort, - awc_RID_Stats16_clear_MaxRetries, - awc_RID_Stats16_clear_NoAck, - awc_RID_Stats16_clear_NoCts, - awc_RID_Stats16_clear_RxAck, - awc_RID_Stats16_clear_RxCts, - awc_RID_Stats16_clear_TxAck, - awc_RID_Stats16_clear_TxRts, - awc_RID_Stats16_clear_TxCts, - awc_RID_Stats16_clear_TxMc, - awc_RID_Stats16_clear_TxBc, - awc_RID_Stats16_clear_TxUcFrags, - awc_RID_Stats16_clear_TxUcPackets, - awc_RID_Stats16_clear_TxBeacon, - awc_RID_Stats16_clear_RxBeacon, - awc_RID_Stats16_clear_TxSinColl, - awc_RID_Stats16_clear_TxMulColl, - awc_RID_Stats16_clear_DefersNo, - awc_RID_Stats16_clear_DefersProt, - awc_RID_Stats16_clear_DefersEngy, - awc_RID_Stats16_clear_DupFram, - awc_RID_Stats16_clear_RxFragDisc, - awc_RID_Stats16_clear_TxAged, - awc_RID_Stats16_clear_RxAged, - awc_RID_Stats16_clear_LostSync_Max, - awc_RID_Stats16_clear_LostSync_Mis, - awc_RID_Stats16_clear_LostSync_Arl, - awc_RID_Stats16_clear_LostSync_Dea, - awc_RID_Stats16_clear_LostSync_Disa, - awc_RID_Stats16_clear_LostSync_Tsf, - awc_RID_Stats16_clear_HostTxMc, - awc_RID_Stats16_clear_HostTxBc, - awc_RID_Stats16_clear_HostTxUc, - awc_RID_Stats16_clear_HostTxFail, - awc_RID_Stats16_clear_HostRxMc, - awc_RID_Stats16_clear_HostRxBc, - awc_RID_Stats16_clear_HostRxUc, - awc_RID_Stats16_clear_HostRxDiscar, - awc_RID_Stats16_clear_HmacTxMc, - awc_RID_Stats16_clear_HmacTxBc, - awc_RID_Stats16_clear_HmacTxUc, - awc_RID_Stats16_clear_HmacTxFail, - awc_RID_Stats16_clear_HmacRxMc, - awc_RID_Stats16_clear_HmacRxBc, - awc_RID_Stats16_clear_HmacRxUc, - awc_RID_Stats16_clear_HmacRxDisca, - awc_RID_Stats16_clear_HmacRxAcce, - awc_RID_Stats16_clear_SsidMismatch, - awc_RID_Stats16_clear_ApMismatch, - awc_RID_Stats16_clear_RatesMismatc, - awc_RID_Stats16_clear_AuthReject, - awc_RID_Stats16_clear_AuthTimeout, - awc_RID_Stats16_clear_AssocReject, - awc_RID_Stats16_clear_AssocTimeout, - awc_RID_Stats16_clear_NewReason, - awc_RID_Stats16_clear_AuthFail_1, - awc_RID_Stats16_clear_AuthFail_2, - awc_RID_Stats16_clear_AuthFail_3, - awc_RID_Stats16_clear_AuthFail_4, - awc_RID_Stats16_clear_AuthFail_5, - awc_RID_Stats16_clear_AuthFail_6, - awc_RID_Stats16_clear_AuthFail_7, - awc_RID_Stats16_clear_AuthFail_8, - awc_RID_Stats16_clear_AuthFail_9, - awc_RID_Stats16_clear_AuthFail_10, - awc_RID_Stats16_clear_AuthFail_11, - awc_RID_Stats16_clear_AuthFail_12, - awc_RID_Stats16_clear_AuthFail_13, - awc_RID_Stats16_clear_AuthFail_14, - awc_RID_Stats16_clear_AuthFail_15, - awc_RID_Stats16_clear_AuthFail_16, - awc_RID_Stats16_clear_AuthFail_17, - awc_RID_Stats16_clear_AuthFail_18, - awc_RID_Stats16_clear_AuthFail_19, - awc_RID_Stats16_clear_RxMan, - awc_RID_Stats16_clear_TxMan, - awc_RID_Stats16_clear_RxRefresh, - awc_RID_Stats16_clear_TxRefresh, - awc_RID_Stats16_clear_RxPoll, - awc_RID_Stats16_clear_TxPoll, - awc_RID_Stats16_clear_HostRetries, - awc_RID_Stats16_clear_LostSync_HostReq, - awc_RID_Stats16_clear_HostTxBytes, - awc_RID_Stats16_clear_HostRxBytes, - awc_RID_Stats16_clear_ElapsedUsec, - awc_RID_Stats16_clear_ElapsedSec, - awc_RID_Stats16_clear_LostSyncBett, - {0} -}; - -#endif - -struct awc_rid_dir awc_rids[]={ - // following MUST be consistent with awc_rids_setup !!! - {&aironet4500_RID_Select_General_Config,sizeof(awc_gen_RID) / sizeof(struct aironet4500_RID) ,awc_gen_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_SSID_list, sizeof(awc_SSID_RID) / sizeof(struct aironet4500_RID) , awc_SSID_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_AP_list, sizeof(awc_AP_List_RID) / sizeof(struct aironet4500_RID) , awc_AP_List_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Driver_name, sizeof(awc_Dname_RID) / sizeof(struct aironet4500_RID) , awc_Dname_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Encapsulation, sizeof(awc_enc_RID) / sizeof(struct aironet4500_RID) , awc_enc_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Active_Config, sizeof(awc_act_RID) / sizeof(struct aironet4500_RID) , awc_act_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Capabilities, sizeof(awc_Cap_RID) / sizeof(struct aironet4500_RID) , awc_Cap_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Status, sizeof(awc_Status_RID) / sizeof(struct aironet4500_RID) , awc_Status_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_AP_Info, sizeof(awc_AP_RID) / sizeof(struct aironet4500_RID) , awc_AP_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats, sizeof(awc_Stats_RID) / sizeof(struct aironet4500_RID) , awc_Stats_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats_delta, sizeof(awc_Stats_delta_RID) / sizeof(struct aironet4500_RID) , awc_Stats_delta_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_32_stats_clear, sizeof(awc_Stats_clear_RID) / sizeof(struct aironet4500_RID) , awc_Stats_clear_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_WEP_volatile, sizeof(awc_WEPv_RID) / sizeof(struct aironet4500_RID) , awc_WEPv_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_WEP_nonvolatile, sizeof(awc_WEPnv_RID) / sizeof(struct aironet4500_RID) , awc_WEPnv_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_Modulation, sizeof(awc_Modulation_RID) / sizeof(struct aironet4500_RID) , awc_Modulation_RID , NULL, NULL,0 }, - -#ifdef AWC_USE_16BIT_STATS - {&aironet4500_RID_Select_16_stats, sizeof(awc_Stats16_RID) / sizeof(struct aironet4500_RID) , awc_Stats16_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_16_stats_delta, sizeof(awc_Stats16_delta_RID) / sizeof(struct aironet4500_RID) , awc_Stats16_delta_RID , NULL, NULL,0 }, - {&aironet4500_RID_Select_16_stats_clear, sizeof(awc_Stats16_clear_RID) / sizeof(struct aironet4500_RID) , awc_Stats16_clear_RID , NULL, NULL,0 }, -#else - {NULL},{NULL},{NULL}, -#endif - - {0} - - -}; - - -int awc_nof_rids = (sizeof(awc_rids) / sizeof(struct awc_rid_dir)) -1; - - -int awc_rids_setup(struct net_device * dev){ - - struct awc_private * priv = (struct awc_private *) dev->priv; - int i=0; - while ( i < AWC_NOF_RIDS){ - if (awc_rids[i].selector) - memcpy(&priv->rid_dir[i],&awc_rids[i],sizeof(priv->rid_dir[0]) ); - else priv->rid_dir[i].selector = NULL; - i++; - } - for (i=0; i< AWC_NOF_RIDS && i < awc_nof_rids; i++){ - priv->rid_dir[i].dev = dev; - }; - - // following MUST be consistent with awc_rids !!! - priv->rid_dir[0].buff = &priv->config; // card RID mirrors - priv->rid_dir[1].buff = &priv->SSIDs; - priv->rid_dir[2].buff = &priv->fixed_APs; - priv->rid_dir[3].buff = &priv->driver_name; - priv->rid_dir[4].buff = &priv->enc_trans; - priv->rid_dir[5].buff = &priv->general_config; // - priv->rid_dir[6].buff = &priv->capabilities; - priv->rid_dir[7].buff = &priv->status; - priv->rid_dir[8].buff = &priv->AP; - priv->rid_dir[9].buff = &priv->statistics; - priv->rid_dir[10].buff = &priv->statistics_delta; - priv->rid_dir[11].buff = &priv->statistics_delta_clear; - priv->rid_dir[12].buff = &priv->wep_volatile; - priv->rid_dir[13].buff = &priv->wep_nonvolatile; - priv->rid_dir[14].buff = &priv->modulation; - - priv->rid_dir[15].buff = &priv->statistics16; - priv->rid_dir[16].buff = &priv->statistics16_delta; - priv->rid_dir[17].buff = &priv->statistics16_delta_clear; - - priv->rid_dir[0].bufflen = sizeof(priv->config); // card RID mirrors - priv->rid_dir[1].bufflen = sizeof(priv->SSIDs); - priv->rid_dir[2].bufflen = sizeof(priv->fixed_APs); - priv->rid_dir[3].bufflen = sizeof(priv->driver_name); - priv->rid_dir[4].bufflen = sizeof(priv->enc_trans); - priv->rid_dir[5].bufflen = sizeof(priv->general_config); // - priv->rid_dir[6].bufflen = sizeof(priv->capabilities); - priv->rid_dir[7].bufflen = sizeof(priv->status); - priv->rid_dir[8].bufflen = sizeof(priv->AP); - priv->rid_dir[9].bufflen = sizeof(priv->statistics); - priv->rid_dir[10].bufflen = sizeof(priv->statistics_delta); - priv->rid_dir[11].bufflen = sizeof(priv->statistics_delta_clear); - priv->rid_dir[12].bufflen = sizeof(priv->wep_volatile); - priv->rid_dir[13].bufflen = sizeof(priv->wep_nonvolatile); - priv->rid_dir[14].bufflen = sizeof(priv->modulation); - - priv->rid_dir[15].bufflen = sizeof(priv->statistics16); - priv->rid_dir[16].bufflen = sizeof(priv->statistics16_delta); - priv->rid_dir[17].bufflen = sizeof(priv->statistics16_delta_clear); - - return 0; - -}; - - - - - diff -Nru a/drivers/net/am79c961a.c b/drivers/net/am79c961a.c --- a/drivers/net/am79c961a.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/am79c961a.c Thu Feb 20 23:19:23 2003 @@ -150,7 +150,7 @@ } } #else -#error Not compatable +#error Not compatible #endif static int diff -Nru a/drivers/net/arlan-proc.c b/drivers/net/arlan-proc.c --- a/drivers/net/arlan-proc.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,1274 +0,0 @@ -#include -#include "arlan.h" - -#include - -#ifdef CONFIG_PROC_FS - - -#include - -/* void enableReceive(struct net_device* dev); -*/ - - - -#define ARLAN_STR_SIZE 0x2ff0 -#define DEV_ARLAN_INFO 1 -#define DEV_ARLAN 1 -#define SARLG(type,var) {\ - pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n", #var, READSHMB(priva->card->var)); \ - } - -#define SARLBN(type,var,nn) {\ - pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x",#var);\ - for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ - pos += sprintf(arlan_drive_info+pos, "\n"); \ - } - -#define SARLBNpln(type,var,nn) {\ - for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ - } - -#define SARLSTR(var,nn) {\ - char tmpStr[400];\ - int tmpLn = nn;\ - if (nn > 399 ) tmpLn = 399; \ - memcpy(tmpStr,(char *) priva->conf->var,tmpLn);\ - tmpStr[tmpLn] = 0; \ - pos += sprintf(arlan_drive_info+pos, "%s\t=\t%s \n",#var,priva->conf->var);\ - } - -#define SARLUC(var) SARLG(u_char, var) -#define SARLUCN(var,nn) SARLBN(u_char,var, nn) -#define SARLUS(var) SARLG(u_short, var) -#define SARLUSN(var,nn) SARLBN(u_short,var, nn) -#define SARLUI(var) SARLG(u_int, var) - -#define SARLUSA(var) {\ - u_short tmpVar;\ - memcpy(&tmpVar, (short *) priva->conf->var,2); \ - pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ -} - -#define SARLUIA(var) {\ - u_int tmpVar;\ - memcpy(&tmpVar, (int* )priva->conf->var,4); \ - pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ -} - - -static const char *arlan_diagnostic_info_string(struct net_device *dev) -{ - - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - u_char diagnosticInfo; - - READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); - - switch (diagnosticInfo) - { - case 0xFF: - return "Diagnostic info is OK"; - case 0xFE: - return "ERROR EPROM Checksum error "; - case 0xFD: - return "ERROR Local Ram Test Failed "; - case 0xFC: - return "ERROR SCC failure "; - case 0xFB: - return "ERROR BackBone failure "; - case 0xFA: - return "ERROR tranceiver not found "; - case 0xF9: - return "ERROR no more address space "; - case 0xF8: - return "ERROR Checksum error "; - case 0xF7: - return "ERROR Missing SS Code"; - case 0xF6: - return "ERROR Invalid config format"; - case 0xF5: - return "ERROR Reserved errorcode F5"; - case 0xF4: - return "ERROR Invalid spreading code/channel number"; - case 0xF3: - return "ERROR Load Code Error"; - case 0xF2: - return "ERROR Reserver errorcode F2 "; - case 0xF1: - return "ERROR Invalid command receivec by LAN card "; - case 0xF0: - return "ERROR Invalid parameter found in command "; - case 0xEF: - return "ERROR On-chip timer failure "; - case 0xEE: - return "ERROR T410 timer failure "; - case 0xED: - return "ERROR Too Many TxEnable commands "; - case 0xEC: - return "ERROR EEPROM error on radio module "; - default: - return "ERROR unknown Diagnostic info reply code "; - } -}; - -static const char *arlan_hardware_type_string(struct net_device *dev) -{ - u_char hardwareType; - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - - READSHM(hardwareType, arlan->hardwareType, u_char); - switch (hardwareType) - { - case 0x00: - return "type A450"; - case 0x01: - return "type A650 "; - case 0x04: - return "type TMA coproc"; - case 0x0D: - return "type A650E "; - case 0x18: - return "type TMA coproc Australian"; - case 0x19: - return "type A650A "; - case 0x26: - return "type TMA coproc European"; - case 0x2E: - return "type A655 "; - case 0x2F: - return "type A655A "; - case 0x30: - return "type A655E "; - case 0x0B: - return "type A670 "; - case 0x0C: - return "type A670E "; - case 0x2D: - return "type A670A "; - case 0x0F: - return "type A411T"; - case 0x16: - return "type A411TA"; - case 0x1B: - return "type A440T"; - case 0x1C: - return "type A412T"; - case 0x1E: - return "type A412TA"; - case 0x22: - return "type A411TE"; - case 0x24: - return "type A412TE"; - case 0x27: - return "type A671T "; - case 0x29: - return "type A671TA "; - case 0x2B: - return "type A671TE "; - case 0x31: - return "type A415T "; - case 0x33: - return "type A415TA "; - case 0x35: - return "type A415TE "; - case 0x37: - return "type A672"; - case 0x39: - return "type A672A "; - case 0x3B: - return "type A672T"; - case 0x6B: - return "type IC2200"; - default: - return "type A672T"; - } -} -#ifdef ARLAN_DEBUGGING -static void arlan_print_diagnostic_info(struct net_device *dev) -{ - int i; - u_char diagnosticInfo; - u_short diagnosticOffset; - u_char hardwareType; - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - - // ARLAN_DEBUG_ENTRY("arlan_print_diagnostic_info"); - - if (READSHMB(arlan->configuredStatusFlag) == 0) - printk("Arlan: Card NOT configured\n"); - else - printk("Arlan: Card is configured\n"); - - READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); - READSHM(diagnosticOffset, arlan->diagnosticOffset, u_short); - - printk(KERN_INFO "%s\n", arlan_diagnostic_info_string(dev)); - - if (diagnosticInfo != 0xff) - printk("%s arlan: Diagnostic Offset %d \n", dev->name, diagnosticOffset); - - printk("arlan: LAN CODE ID = "); - for (i = 0; i < 6; i++) - DEBUGSHM(1, "%03d:", arlan->lanCardNodeId[i], u_char); - printk("\n"); - - printk("arlan: Arlan BroadCast address = "); - for (i = 0; i < 6; i++) - DEBUGSHM(1, "%03d:", arlan->broadcastAddress[i], u_char); - printk("\n"); - - READSHM(hardwareType, arlan->hardwareType, u_char); - printk(KERN_INFO "%s\n", arlan_hardware_type_string(dev)); - - - DEBUGSHM(1, "arlan: channelNumber=%d\n", arlan->channelNumber, u_char); - DEBUGSHM(1, "arlan: channelSet=%d\n", arlan->channelSet, u_char); - DEBUGSHM(1, "arlan: spreadingCode=%d\n", arlan->spreadingCode, u_char); - DEBUGSHM(1, "arlan: radioNodeId=%d\n", arlan->radioNodeId, u_short); - DEBUGSHM(1, "arlan: SID =%d\n", arlan->SID, u_short); - DEBUGSHM(1, "arlan: rxOffset=%d\n", arlan->rxOffset, u_short); - - DEBUGSHM(1, "arlan: registration mode is %d\n", arlan->registrationMode, u_char); - - printk("arlan: name= "); - IFDEBUG(1) - - for (i = 0; i < 16; i++) - { - char c; - READSHM(c, arlan->name[i], char); - if (c) - printk("%c", c); - } - printk("\n"); - -// ARLAN_DEBUG_EXIT("arlan_print_diagnostic_info"); - -} - - -/****************************** TEST MEMORY **************/ - -static int arlan_hw_test_memory(struct net_device *dev) -{ - u_char *ptr; - int i; - int memlen = sizeof(struct arlan_shmem) - 0xF; /* avoid control register */ - volatile char *arlan_mem = (char *) (dev->mem_start); - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - char pattern; - - ptr = NULL; - - /* hold card in reset state */ - setHardwareReset(dev); - - /* test memory */ - pattern = 0; - for (i = 0; i < memlen; i++) - WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char); - - pattern = 0; - for (i = 0; i < memlen; i++) - { - char res; - READSHM(res, arlan_mem[i], char); - if (res != pattern++) - { - printk(KERN_ERR "Arlan driver memory test 1 failed \n"); - return -1; - } - } - - pattern = 0; - for (i = 0; i < memlen; i++) - WRITESHM(arlan_mem[i], ~(pattern++), char); - - pattern = 0; - for (i = 0; i < memlen; i++) - { - char res; - READSHM(res, arlan_mem[i], char); - if (res != ~(pattern++)) - { - printk(KERN_ERR "Arlan driver memory test 2 failed \n"); - return -1; - } - } - - /* zero memory */ - for (i = 0; i < memlen; i++) - WRITESHM(arlan_mem[i], 0x00, char); - - IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n"); - - /* set reset flag and then release reset */ - WRITESHM(arlan->resetFlag, 0xff, u_char); - - clearChannelAttention(dev); - clearHardwareReset(dev); - - /* wait for reset flag to become zero, we'll wait for two seconds */ - if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW)) - { - printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name); - return -1; - } - return 0; -} - -static int arlan_setup_card_by_book(struct net_device *dev) -{ - u_char irqLevel, configuredStatusFlag; - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - -// ARLAN_DEBUG_ENTRY("arlan_setup_card"); - - READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); - - IFDEBUG(10) - if (configuredStatusFlag != 0) - IFDEBUG(10) printk("arlan: CARD IS CONFIGURED\n"); - else - IFDEBUG(10) printk("arlan: card is NOT configured\n"); - - if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff)) - if (arlan_hw_test_memory(dev)) - return -1; - - DEBUGSHM(4, "arlan configuredStatus = %d \n", arlan->configuredStatusFlag, u_char); - DEBUGSHM(4, "arlan driver diagnostic: 0x%2x\n", arlan->diagnosticInfo, u_char); - - /* issue nop command - no interrupt */ - arlan_command(dev, ARLAN_COMMAND_NOOP); - if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) - return -1; - - IFDEBUG(50) printk("1st Noop successfully executed !!\n"); - - /* try to turn on the arlan interrupts */ - clearClearInterrupt(dev); - setClearInterrupt(dev); - setInterruptEnable(dev); - - /* issue nop command - with interrupt */ - - arlan_command(dev, ARLAN_COMMAND_NOOPINT); - if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) - return -1; - - - IFDEBUG(50) printk("2nd Noop successfully executed !!\n"); - - READSHM(irqLevel, arlan->irqLevel, u_char) - - if (irqLevel != dev->irq) - { - IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %d\n", irqLevel); - printk(KERN_WARNING "device driver irq set to %d - does not match\n", dev->irq); - dev->irq = irqLevel; - } - else - IFDEBUG(2) printk("irq level is OK\n"); - - - IFDEBUG(3) arlan_print_diagnostic_info(dev); - - arlan_command(dev, ARLAN_COMMAND_CONF); - - READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); - if (configuredStatusFlag == 0) - { - printk(KERN_WARNING "arlan configure failed\n"); - return -1; - } - arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); - arlan_command(dev, ARLAN_COMMAND_RX); - arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); - printk(KERN_NOTICE "%s: arlan driver version %s loaded\n", - dev->name, arlan_version); - -// ARLAN_DEBUG_EXIT("arlan_setup_card"); - - return 0; /* no errors */ -} -#endif - -#ifdef ARLAN_PROC_INTERFACE -#ifdef ARLAN_PROC_SHM_DUMP - -static char arlan_drive_info[ARLAN_STR_SIZE] = "A655\n\0"; - -static int arlan_sysctl_info(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int i; - int retv, pos, devnum; - struct arlan_private *priva = NULL; - struct net_device *dev; - pos = 0; - if (write) - { - printk("wrirte: "); - for (i = 0; i < 100; i++) - printk("adi %x \n", arlan_drive_info[i]); - } - if (ctl->procname == NULL || arlan_drive_info == NULL) - { - printk(KERN_WARNING " procname is NULL in sysctl_table or arlan_drive_info is NULL \n at arlan module\n "); - return -1; - } - devnum = ctl->procname[5] - '0'; - if (devnum < 0 || devnum > MAX_ARLANS - 1) - { - printk(KERN_WARNING "too strange devnum in procfs parse\n "); - return -1; - } - else if (arlan_device[devnum] == NULL) - { - if (ctl->procname) - pos += sprintf(arlan_drive_info + pos, "\t%s\n\n", ctl->procname); - pos += sprintf(arlan_drive_info + pos, "No device found here \n"); - goto final; - } - else - priva = arlan_device[devnum]->priv; - - if (priva == NULL) - { - printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); - return -1; - } - dev = arlan_device[devnum]; - - memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); - - pos = sprintf(arlan_drive_info, "Arlan info \n"); - /* Header Signature */ - SARLSTR(textRegion, 48); - SARLUC(resetFlag); - pos += sprintf(arlan_drive_info + pos, "diagnosticInfo\t=\t%s \n", arlan_diagnostic_info_string(dev)); - SARLUC(diagnosticInfo); - SARLUS(diagnosticOffset); - SARLUCN(_1, 12); - SARLUCN(lanCardNodeId, 6); - SARLUCN(broadcastAddress, 6); - pos += sprintf(arlan_drive_info + pos, "hardwareType =\t %s \n", arlan_hardware_type_string(dev)); - SARLUC(hardwareType); - SARLUC(majorHardwareVersion); - SARLUC(minorHardwareVersion); - SARLUC(radioModule); - SARLUC(defaultChannelSet); - SARLUCN(_2, 47); - - /* Control/Status Block - 0x0080 */ - SARLUC(interruptInProgress); - SARLUC(cntrlRegImage); - - SARLUCN(_3, 14); - SARLUC(commandByte); - SARLUCN(commandParameter, 15); - - /* Receive Status - 0x00a0 */ - SARLUC(rxStatus); - SARLUC(rxFrmType); - SARLUS(rxOffset); - SARLUS(rxLength); - SARLUCN(rxSrc, 6); - SARLUC(rxBroadcastFlag); - SARLUC(rxQuality); - SARLUC(scrambled); - SARLUCN(_4, 1); - - /* Transmit Status - 0x00b0 */ - SARLUC(txStatus); - SARLUC(txAckQuality); - SARLUC(numRetries); - SARLUCN(_5, 14); - SARLUCN(registeredRouter, 6); - SARLUCN(backboneRouter, 6); - SARLUC(registrationStatus); - SARLUC(configuredStatusFlag); - SARLUCN(_6, 1); - SARLUCN(ultimateDestAddress, 6); - SARLUCN(immedDestAddress, 6); - SARLUCN(immedSrcAddress, 6); - SARLUS(rxSequenceNumber); - SARLUC(assignedLocaltalkAddress); - SARLUCN(_7, 27); - - /* System Parameter Block */ - - /* - Driver Parameters (Novell Specific) */ - - SARLUS(txTimeout); - SARLUS(transportTime); - SARLUCN(_8, 4); - - /* - Configuration Parameters */ - SARLUC(irqLevel); - SARLUC(spreadingCode); - SARLUC(channelSet); - SARLUC(channelNumber); - SARLUS(radioNodeId); - SARLUCN(_9, 2); - SARLUC(scramblingDisable); - SARLUC(radioType); - SARLUS(routerId); - SARLUCN(_10, 9); - SARLUC(txAttenuation); - SARLUIA(systemId); - SARLUS(globalChecksum); - SARLUCN(_11, 4); - SARLUS(maxDatagramSize); - SARLUS(maxFrameSize); - SARLUC(maxRetries); - SARLUC(receiveMode); - SARLUC(priority); - SARLUC(rootOrRepeater); - SARLUCN(specifiedRouter, 6); - SARLUS(fastPollPeriod); - SARLUC(pollDecay); - SARLUSA(fastPollDelay); - SARLUC(arlThreshold); - SARLUC(arlDecay); - SARLUCN(_12, 1); - SARLUS(specRouterTimeout); - SARLUCN(_13, 5); - - /* Scrambled Area */ - SARLUIA(SID); - SARLUCN(encryptionKey, 12); - SARLUIA(_14); - SARLUSA(waitTime); - SARLUSA(lParameter); - SARLUCN(_15, 3); - SARLUS(headerSize); - SARLUS(sectionChecksum); - - SARLUC(registrationMode); - SARLUC(registrationFill); - SARLUS(pollPeriod); - SARLUS(refreshPeriod); - SARLSTR(name, 16); - SARLUCN(NID, 6); - SARLUC(localTalkAddress); - SARLUC(codeFormat); - SARLUC(numChannels); - SARLUC(channel1); - SARLUC(channel2); - SARLUC(channel3); - SARLUC(channel4); - SARLUCN(SSCode, 59); - -/* SARLUCN( _16, 0x140); - */ - /* Statistics Block - 0x0300 */ - SARLUC(hostcpuLock); - SARLUC(lancpuLock); - SARLUCN(resetTime, 18); - SARLUIA(numDatagramsTransmitted); - SARLUIA(numReTransmissions); - SARLUIA(numFramesDiscarded); - SARLUIA(numDatagramsReceived); - SARLUIA(numDuplicateReceivedFrames); - SARLUIA(numDatagramsDiscarded); - SARLUS(maxNumReTransmitDatagram); - SARLUS(maxNumReTransmitFrames); - SARLUS(maxNumConsecutiveDuplicateFrames); - /* misaligned here so we have to go to characters */ - SARLUIA(numBytesTransmitted); - SARLUIA(numBytesReceived); - SARLUIA(numCRCErrors); - SARLUIA(numLengthErrors); - SARLUIA(numAbortErrors); - SARLUIA(numTXUnderruns); - SARLUIA(numRXOverruns); - SARLUIA(numHoldOffs); - SARLUIA(numFramesTransmitted); - SARLUIA(numFramesReceived); - SARLUIA(numReceiveFramesLost); - SARLUIA(numRXBufferOverflows); - SARLUIA(numFramesDiscardedAddrMismatch); - SARLUIA(numFramesDiscardedSIDMismatch); - SARLUIA(numPollsTransmistted); - SARLUIA(numPollAcknowledges); - SARLUIA(numStatusTimeouts); - SARLUIA(numNACKReceived); - SARLUS(auxCmd); - SARLUCN(dumpPtr, 4); - SARLUC(dumpVal); - SARLUC(wireTest); - - /* next 4 seems too long for procfs, over single page ? - SARLUCN( _17, 0x86); - SARLUCN( txBuffer, 0x800); - SARLUCN( rxBuffer, 0x800); - SARLUCN( _18, 0x0bff); - */ - - pos += sprintf(arlan_drive_info + pos, "rxRing\t=\t0x"); - for (i = 0; i < 0x50; i++) - pos += sprintf(arlan_drive_info + pos, "%02x", ((char *) priva->conf)[priva->conf->rxOffset + i]); - pos += sprintf(arlan_drive_info + pos, "\n"); - - SARLUC(configStatus); - SARLUC(_22); - SARLUC(progIOCtrl); - SARLUC(shareMBase); - SARLUC(controlRegister); - - pos += sprintf(arlan_drive_info + pos, " total %d chars\n", pos); - if (ctl) - if (ctl->procname) - pos += sprintf(arlan_drive_info + pos, " driver name : %s\n", ctl->procname); -final: - *lenp = pos; - - if (!write) - retv = proc_dostring(ctl, write, filp, buffer, lenp); - else - { - *lenp = 0; - return -1; - } - return retv; -} - - -static int arlan_sysctl_info161719(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int i; - int retv, pos, devnum; - struct arlan_private *priva = NULL; - - pos = 0; - devnum = ctl->procname[5] - '0'; - if (arlan_device[devnum] == NULL) - { - pos += sprintf(arlan_drive_info + pos, "No device found here \n"); - goto final; - } - else - priva = arlan_device[devnum]->priv; - if (priva == NULL) - { - printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); - return -1; - } - memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); - SARLUCN(_16, 0xC0); - SARLUCN(_17, 0x6A); - SARLUCN(_18, 14); - SARLUCN(_19, 0x86); - SARLUCN(_21, 0x3fd); - -final: - *lenp = pos; - retv = proc_dostring(ctl, write, filp, buffer, lenp); - return retv; -} - -static int arlan_sysctl_infotxRing(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int i; - int retv, pos, devnum; - struct arlan_private *priva = NULL; - - pos = 0; - devnum = ctl->procname[5] - '0'; - if (arlan_device[devnum] == NULL) - { - pos += sprintf(arlan_drive_info + pos, "No device found here \n"); - goto final; - } - else - priva = arlan_device[devnum]->priv; - if (priva == NULL) - { - printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); - return -1; - } - memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); - SARLBNpln(u_char, txBuffer, 0x800); -final: - *lenp = pos; - retv = proc_dostring(ctl, write, filp, buffer, lenp); - return retv; -} - -static int arlan_sysctl_inforxRing(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int i; - int retv, pos, devnum; - struct arlan_private *priva = NULL; - - pos = 0; - devnum = ctl->procname[5] - '0'; - if (arlan_device[devnum] == NULL) - { - pos += sprintf(arlan_drive_info + pos, "No device found here \n"); - goto final; - } else - priva = arlan_device[devnum]->priv; - if (priva == NULL) - { - printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); - return -1; - } - memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); - SARLBNpln(u_char, rxBuffer, 0x800); -final: - *lenp = pos; - retv = proc_dostring(ctl, write, filp, buffer, lenp); - return retv; -} - -static int arlan_sysctl_info18(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int i; - int retv, pos, devnum; - struct arlan_private *priva = NULL; - - pos = 0; - devnum = ctl->procname[5] - '0'; - if (arlan_device[devnum] == NULL) - { - pos += sprintf(arlan_drive_info + pos, "No device found here \n"); - goto final; - } - else - priva = arlan_device[devnum]->priv; - if (priva == NULL) - { - printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); - return -1; - } - memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); - SARLBNpln(u_char, _18, 0x800); - -final: - *lenp = pos; - retv = proc_dostring(ctl, write, filp, buffer, lenp); - return retv; -} - - -#endif /* #ifdef ARLAN_PROC_SHM_DUMP */ - - -static char conf_reset_result[200]; - -static int arlan_configure(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int pos = 0; - int devnum = ctl->procname[6] - '0'; - struct arlan_private *priv; - - if (devnum < 0 || devnum > MAX_ARLANS - 1) - { - printk(KERN_WARNING "too strange devnum in procfs parse\n "); - return -1; - } - else if (arlan_device[devnum] != NULL) - { - priv = arlan_device[devnum]->priv; - - arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_CONF); - } - else - return -1; - - *lenp = pos; - return proc_dostring(ctl, write, filp, buffer, lenp); -} - -static int arlan_sysctl_reset(ctl_table * ctl, int write, struct file *filp, - void *buffer, size_t * lenp) -{ - int pos = 0; - int devnum = ctl->procname[5] - '0'; - struct arlan_private *priv; - - if (devnum < 0 || devnum > MAX_ARLANS - 1) - { - printk(KERN_WARNING "too strange devnum in procfs parse\n "); - return -1; - } - else if (arlan_device[devnum] != NULL) - { - priv = arlan_device[devnum]->priv; - arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_RESET); - - } else - return -1; - *lenp = pos + 3; - return proc_dostring(ctl, write, filp, buffer, lenp); -} - - -/* Place files in /proc/sys/dev/arlan */ -#define CTBLN(num,card,nam) \ - { .ctl_name = num,\ - .procname = #nam,\ - .data = &(arlan_conf[card].nam),\ - .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec} -#ifdef ARLAN_DEBUGGING - -#define ARLAN_PROC_DEBUG_ENTRIES \ - { .ctl_name = 48, .procname = "entry_exit_debug",\ - .data = &arlan_entry_and_exit_debug,\ - .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec},\ - { .ctl_name = 49, .procname = "debug", .data = &arlan_debug,\ - .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec}, -#else -#define ARLAN_PROC_DEBUG_ENTRIES -#endif - -#define ARLAN_SYSCTL_TABLE_TOTAL(cardNo)\ - CTBLN(1,cardNo,spreadingCode),\ - CTBLN(2,cardNo, channelNumber),\ - CTBLN(3,cardNo, scramblingDisable),\ - CTBLN(4,cardNo, txAttenuation),\ - CTBLN(5,cardNo, systemId), \ - CTBLN(6,cardNo, maxDatagramSize),\ - CTBLN(7,cardNo, maxFrameSize),\ - CTBLN(8,cardNo, maxRetries),\ - CTBLN(9,cardNo, receiveMode),\ - CTBLN(10,cardNo, priority),\ - CTBLN(11,cardNo, rootOrRepeater),\ - CTBLN(12,cardNo, SID),\ - CTBLN(13,cardNo, registrationMode),\ - CTBLN(14,cardNo, registrationFill),\ - CTBLN(15,cardNo, localTalkAddress),\ - CTBLN(16,cardNo, codeFormat),\ - CTBLN(17,cardNo, numChannels),\ - CTBLN(18,cardNo, channel1),\ - CTBLN(19,cardNo, channel2),\ - CTBLN(20,cardNo, channel3),\ - CTBLN(21,cardNo, channel4),\ - CTBLN(22,cardNo, txClear),\ - CTBLN(23,cardNo, txRetries),\ - CTBLN(24,cardNo, txRouting),\ - CTBLN(25,cardNo, txScrambled),\ - CTBLN(26,cardNo, rxParameter),\ - CTBLN(27,cardNo, txTimeoutMs),\ - CTBLN(28,cardNo, waitCardTimeout),\ - CTBLN(29,cardNo, channelSet), \ - {.ctl_name = 30, .procname = "name",\ - .data = arlan_conf[cardNo].siteName,\ - .maxlen = 16, .mode = 0600, .proc_handler = &proc_dostring},\ - CTBLN(31,cardNo,waitTime),\ - CTBLN(32,cardNo,lParameter),\ - CTBLN(33,cardNo,_15),\ - CTBLN(34,cardNo,headerSize),\ - CTBLN(35,cardNo,async),\ - CTBLN(36,cardNo,tx_delay_ms),\ - CTBLN(37,cardNo,retries),\ - CTBLN(38,cardNo,ReTransmitPacketMaxSize),\ - CTBLN(39,cardNo,waitReTransmitPacketMaxSize),\ - CTBLN(40,cardNo,fastReTransCount),\ - CTBLN(41,cardNo,driverRetransmissions),\ - CTBLN(42,cardNo,txAckTimeoutMs),\ - CTBLN(43,cardNo,registrationInterrupts),\ - CTBLN(44,cardNo,hardwareType),\ - CTBLN(45,cardNo,radioType),\ - CTBLN(46,cardNo,writeEEPROM),\ - CTBLN(47,cardNo,writeRadioType),\ - ARLAN_PROC_DEBUG_ENTRIES\ - CTBLN(50,cardNo,in_speed),\ - CTBLN(51,cardNo,out_speed),\ - CTBLN(52,cardNo,in_speed10),\ - CTBLN(53,cardNo,out_speed10),\ - CTBLN(54,cardNo,in_speed_max),\ - CTBLN(55,cardNo,out_speed_max),\ - CTBLN(56,cardNo,measure_rate),\ - CTBLN(57,cardNo,pre_Command_Wait),\ - CTBLN(58,cardNo,rx_tweak1),\ - CTBLN(59,cardNo,rx_tweak2),\ - CTBLN(60,cardNo,tx_queue_len),\ - - - -static ctl_table arlan_conf_table0[] = -{ - ARLAN_SYSCTL_TABLE_TOTAL(0) - -#ifdef ARLAN_PROC_SHM_DUMP - { - .ctl_name = 150, - .procname = "arlan0-txRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_infotxRing, - }, - { - .ctl_name = 151, - .procname = "arlan0-rxRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_inforxRing, - }, - { - .ctl_name = 152, - .procname = "arlan0-18", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info18, - }, - { - .ctl_name = 153, - .procname = "arlan0-ring", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info161719, - }, - { - .ctl_name = 154, - .procname = "arlan0-shm-cpy", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info, - }, -#endif - { - .ctl_name = 155, - .procname = "config0", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_configure - }, - { - .ctl_name = 156, - .procname = "reset0", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_sysctl_reset, - }, - { .ctl_name = 0 } -}; - -static ctl_table arlan_conf_table1[] = -{ - - ARLAN_SYSCTL_TABLE_TOTAL(1) - -#ifdef ARLAN_PROC_SHM_DUMP - { - .ctl_name = 150, - .procname = "arlan1-txRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_infotxRing, - }, - { - .ctl_name = 151, - .procname = "arlan1-rxRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_inforxRing, - }, - { - .ctl_name = 152, - .procname = "arlan1-18", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info18, - }, - { - .ctl_name = 153, - .procname = "arlan1-ring", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info161719, - }, - { - .ctl_name = 154, - .procname = "arlan1-shm-cpy", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info, - }, -#endif - { - .ctl_name = 155, - .procname = "config1", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_configure, - }, - { - .ctl_name = 156, - .procname = "reset1", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_sysctl_reset, - }, - { .ctl_name = 0 } -}; - -static ctl_table arlan_conf_table2[] = -{ - - ARLAN_SYSCTL_TABLE_TOTAL(2) - -#ifdef ARLAN_PROC_SHM_DUMP - { - .ctl_name = 150, - .procname = "arlan2-txRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_infotxRing, - }, - { - .ctl_name = 151, - .procname = "arlan2-rxRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_inforxRing, - }, - { - .ctl_name = 152, - .procname = "arlan2-18", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info18, - }, - { - .ctl_name = 153, - .procname = "arlan2-ring", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info161719, - }, - { - .ctl_name = 154, - .procname = "arlan2-shm-cpy", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info, - }, -#endif - { - .ctl_name = 155, - .procname = "config2", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_configure, - }, - { - .ctl_name = 156, - .procname = "reset2", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_sysctl_reset, - }, - { .ctl_name = 0 } -}; - -static ctl_table arlan_conf_table3[] = -{ - - ARLAN_SYSCTL_TABLE_TOTAL(3) - -#ifdef ARLAN_PROC_SHM_DUMP - { - .ctl_name = 150, - .procname = "arlan3-txRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_infotxRing, - }, - { - .ctl_name = 151, - .procname = "arlan3-rxRing", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_inforxRing, - }, - { - .ctl_name = 152, - .procname = "arlan3-18", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info18, - }, - { - .ctl_name = 153, - .procname = "arlan3-ring", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info161719, - }, - { - .ctl_name = 154, - .procname = "arlan3-shm-cpy", - .data = &arlan_drive_info, - .maxlen = ARLAN_STR_SIZE, - .mode = 0400, - .proc_handler = &arlan_sysctl_info, - }, -#endif - { - .ctl_name = 155, - .procname = "config3", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_configure, - }, - { - .ctl_name = 156, - .procname = "reset3", - .data = &conf_reset_result, - .maxlen = 100, - .mode = 0400, - .proc_handler = &arlan_sysctl_reset, - }, - { .ctl_name = 0 } -}; - - - -static ctl_table arlan_table[] = -{ - { - .ctl_name = 0, - .procname = "arlan0", - .maxlen = 0, - .mode = 0600, - .child = arlan_conf_table0, - }, - { - .ctl_name = 0, - .procname = "arlan1", - .maxlen = 0, - .mode = 0600, - .child = arlan_conf_table1, - }, - { - .ctl_name = 0, - .procname = "arlan2", - .maxlen = 0, - .mode = 0600, - .child = arlan_conf_table2, - }, - { - .ctl_name = 0, - .procname = "arlan3", - .maxlen = 0, - .mode = 0600, - .child = arlan_conf_table3, - }, - { .ctl_name = 0 } -}; - -#else - -static ctl_table arlan_table[MAX_ARLANS + 1] = -{ - { .ctl_name = 0 } -}; -#endif -#else - -static ctl_table arlan_table[MAX_ARLANS + 1] = -{ - { .ctl_name = 0 } -}; -#endif - - -// static int mmtu = 1234; - -static ctl_table arlan_root_table[] = -{ - { - .ctl_name = 254, - .procname = "arlan", - .maxlen = 0, - .mode = 0555, - .child = arlan_table, - }, - { .ctl_name = 0 } -}; - -/* Make sure that /proc/sys/dev is there */ -//static ctl_table arlan_device_root_table[] = -//{ -// {CTL_DEV, "dev", NULL, 0, 0555, arlan_root_table}, -// {0} -//}; - - - -static struct ctl_table_header *arlan_device_sysctl_header; - -int init_arlan_proc(void) -{ - - int i = 0; - if (arlan_device_sysctl_header) - return 0; - for (i = 0; i < MAX_ARLANS && arlan_device[i]; i++) - arlan_table[i].ctl_name = i + 1; - arlan_device_sysctl_header = register_sysctl_table(arlan_root_table, 0); - if (!arlan_device_sysctl_header) - return -1; - - return 0; - -}; - - - -#ifdef MODULE - -int init_module(void) -{ - - return init_arlan_proc(); -}; - -void cleanup_module(void) -{ - unregister_sysctl_table(arlan_device_sysctl_header); - arlan_device_sysctl_header = NULL; - - return; -}; - -#endif // MODULE -MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/arlan.c b/drivers/net/arlan.c --- a/drivers/net/arlan.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,2077 +0,0 @@ -/* - * Copyright (C) 1997 Cullen Jennings - * Copyright (C) 1998 Elmer Joandiu, elmer@ylenurme.ee - * GNU General Public License applies - * This module provides support for the Arlan 655 card made by Aironet - */ - -#include -#include "arlan.h" - -#if BITS_PER_LONG != 32 -# error FIXME: this driver requires a 32-bit platform -#endif - -static const char *arlan_version = "C.Jennigs 97 & Elmer.Joandi@ut.ee Oct'98, http://www.ylenurme.ee/~elmer/655/"; - -struct net_device *arlan_device[MAX_ARLANS]; -int last_arlan; - -static int SID = SIDUNKNOWN; -static int radioNodeId = radioNodeIdUNKNOWN; -static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; -static char *siteName = siteNameUNKNOWN; -static int mem = memUNKNOWN; -int arlan_debug = debugUNKNOWN; -static int probe = probeUNKNOWN; -static int numDevices = numDevicesUNKNOWN; -static int spreadingCode = spreadingCodeUNKNOWN; -static int channelNumber = channelNumberUNKNOWN; -static int channelSet = channelSetUNKNOWN; -static int systemId = systemIdUNKNOWN; -static int registrationMode = registrationModeUNKNOWN; -static int keyStart; -static int tx_delay_ms; -static int retries = 5; -static int async = 1; -static int tx_queue_len = 1; -static int arlan_EEPROM_bad; - -#ifdef ARLAN_DEBUGGING - -static int arlan_entry_debug; -static int arlan_exit_debug; -static int testMemory = testMemoryUNKNOWN; -static int irq = irqUNKNOWN; -static int txScrambled = 1; -static int mdebug; -#endif - -#if LINUX_VERSION_CODE > 0x20100 -MODULE_PARM(irq, "i"); -MODULE_PARM(mem, "i"); -MODULE_PARM(probe, "i"); -MODULE_PARM(arlan_debug, "i"); -MODULE_PARM(numDevices, "i"); -MODULE_PARM(testMemory, "i"); -MODULE_PARM(spreadingCode, "i"); -MODULE_PARM(channelNumber, "i"); -MODULE_PARM(channelSet, "i"); -MODULE_PARM(systemId, "i"); -MODULE_PARM(registrationMode, "i"); -MODULE_PARM(radioNodeId, "i"); -MODULE_PARM(SID, "i"); -MODULE_PARM(txScrambled, "i"); -MODULE_PARM(keyStart, "i"); -MODULE_PARM(mdebug, "i"); -MODULE_PARM(tx_delay_ms, "i"); -MODULE_PARM(retries, "i"); -MODULE_PARM(async, "i"); -MODULE_PARM(tx_queue_len, "i"); -MODULE_PARM(arlan_entry_debug, "i"); -MODULE_PARM(arlan_exit_debug, "i"); -MODULE_PARM(arlan_entry_and_exit_debug, "i"); -MODULE_PARM(arlan_EEPROM_bad, "i"); -MODULE_PARM_DESC(irq, "(unused)"); -MODULE_PARM_DESC(mem, "Arlan memory address for single device probing"); -MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)"); -MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)"); -MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1"); -MODULE_PARM_DESC(testMemory, "(unused)"); -MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)"); -MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions"); -#ifdef ARLAN_ENTRY_EXIT_DEBUGGING -MODULE_PARM_DESC(arlan_entry_debug, "Arlan driver function entry debugging"); -MODULE_PARM_DESC(arlan_exit_debug, "Arlan driver function exit debugging"); -MODULE_PARM_DESC(arlan_entry_and_exit_debug, "Arlan driver function entry and exit debugging"); -#else -MODULE_PARM_DESC(arlan_entry_debug, "(ignored)"); -MODULE_PARM_DESC(arlan_exit_debug, "(ignored)"); -MODULE_PARM_DESC(arlan_entry_and_exit_debug, "(ignored)"); -#endif - -EXPORT_SYMBOL(arlan_device); -EXPORT_SYMBOL(arlan_conf); -EXPORT_SYMBOL(last_arlan); - - -// #warning kernel 2.1.110 tested -#define myATOMIC_INIT(a,b) atomic_set(&(a),b) - -#else -#define test_and_set_bit set_bit -#if LINUX_VERSION_CODE != 0x20024 - // #warning kernel 2.0.36 tested -#endif -#define myATOMIC_INIT(a,b) a = b; - -#endif - -struct arlan_conf_stru arlan_conf[MAX_ARLANS]; -static int arlans_found; - -static int arlan_probe_here(struct net_device *dev, int ioaddr); -static int arlan_open(struct net_device *dev); -static int arlan_tx(struct sk_buff *skb, struct net_device *dev); -static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs); -static int arlan_close(struct net_device *dev); -static struct net_device_stats * - arlan_statistics (struct net_device *dev); -static void arlan_set_multicast (struct net_device *dev); -static int arlan_hw_tx (struct net_device* dev, char *buf, int length ); -static int arlan_hw_config (struct net_device * dev); -static void arlan_tx_done_interrupt (struct net_device * dev, int status); -static void arlan_rx_interrupt (struct net_device * dev, u_char rxStatus, u_short, u_short); -static void arlan_process_interrupt (struct net_device * dev); -static void arlan_tx_timeout (struct net_device *dev); -int arlan_command(struct net_device * dev, int command); - -EXPORT_SYMBOL(arlan_command); - -static inline long long arlan_time(void) -{ - struct timeval timev; - do_gettimeofday(&timev); - return ((long long) timev.tv_sec * 1000000 + timev.tv_usec); -}; - -#ifdef ARLAN_ENTRY_EXIT_DEBUGGING -#define ARLAN_DEBUG_ENTRY(name) \ - {\ - struct timeval timev;\ - do_gettimeofday(&timev);\ - if (arlan_entry_debug || arlan_entry_and_exit_debug)\ - printk("--->>>" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec));\ - } -#define ARLAN_DEBUG_EXIT(name) \ - {\ - struct timeval timev;\ - do_gettimeofday(&timev);\ - if (arlan_exit_debug || arlan_entry_and_exit_debug)\ - printk("<<<---" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec) );\ - } -#else -#define ARLAN_DEBUG_ENTRY(name) -#define ARLAN_DEBUG_EXIT(name) -#endif - - -#define arlan_interrupt_ack(dev)\ - clearClearInterrupt(dev);\ - setClearInterrupt(dev); - - -#define ARLAN_COMMAND_LOCK(dev) \ - if (atomic_dec_and_test(&((struct arlan_private * )dev->priv)->card_users))\ - arlan_wait_command_complete_short(dev,__LINE__); -#define ARLAN_COMMAND_UNLOCK(dev) \ - atomic_inc(&((struct arlan_private * )dev->priv)->card_users); - - -#define ARLAN_COMMAND_INC(dev) \ - {((struct arlan_private *) dev->priv)->under_command++;} -#define ARLAN_COMMAND_ZERO(dev) \ - {((struct arlan_private *) dev->priv)->under_command =0;} -#define ARLAN_UNDER_COMMAND(dev)\ - (((struct arlan_private *) dev->priv)->under_command) - -#define ARLAN_COMMAND_START(dev) ARLAN_COMMAND_INC(dev) -#define ARLAN_COMMAND_END(dev) ARLAN_COMMAND_ZERO(dev) -#define ARLAN_TOGGLE_START(dev)\ - {((struct arlan_private *) dev->priv)->under_toggle++;} -#define ARLAN_TOGGLE_END(dev)\ - {((struct arlan_private *) dev->priv)->under_toggle=0;} -#define ARLAN_UNDER_TOGGLE(dev)\ - (((struct arlan_private *) dev->priv)->under_toggle) - - - -static inline int arlan_drop_tx(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - priv->stats.tx_errors++; - if (priv->Conf->tx_delay_ms) - { - priv->tx_done_delayed = jiffies + priv->Conf->tx_delay_ms * HZ / 1000 + 1; - } - else - { - priv->waiting_command_mask &= ~ARLAN_COMMAND_TX; - TXHEAD(dev).offset = 0; - TXTAIL(dev).offset = 0; - priv->txLast = 0; - priv->txOffset = 0; - priv->bad = 0; - if (!priv->under_reset && !priv->under_config) - netif_wake_queue (dev); - } - return 1; -}; - - -int arlan_command(struct net_device *dev, int command_p) -{ - - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; - struct arlan_private *priv = (struct arlan_private *) dev->priv; - int udelayed = 0; - int i = 0; - long long time_mks = arlan_time(); - - ARLAN_DEBUG_ENTRY("arlan_command"); - - if (priv->card_polling_interval) - priv->card_polling_interval = 1; - - if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) - printk(KERN_DEBUG "arlan_command, %lx lock %lx commandByte %x waiting %x incoming %x \n", - jiffies, priv->command_lock, READSHMB(arlan->commandByte), - priv->waiting_command_mask, command_p); - - priv->waiting_command_mask |= command_p; - - if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) - if (jiffies - priv->lastReset < 5 * HZ) - priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET; - - if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ACK) - { - arlan_interrupt_ack(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ACK; - } - if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ENABLE) - { - setInterruptEnable(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ENABLE; - } - - /* Card access serializing lock */ - - if (test_and_set_bit(0, (void *) &priv->command_lock)) - { - if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) - printk(KERN_DEBUG "arlan_command: entered when command locked \n"); - goto command_busy_end; - } - /* Check cards status and waiting */ - - if (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW)) - { - while (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW)) - { - if (READSHMB(arlan->resetFlag) || - READSHMB(arlan->commandByte)) /* || - (readControlRegister(dev) & ARLAN_ACCESS)) - */ - udelay(40); - else - priv->waiting_command_mask &= ~(ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW); - - udelayed++; - - if (priv->waiting_command_mask & ARLAN_COMMAND_LONG_WAIT_NOW) - { - if (udelayed * 40 > 1000000) - { - printk(KERN_ERR "%s long wait too long \n", dev->name); - priv->waiting_command_mask |= ARLAN_COMMAND_RESET; - break; - } - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_WAIT_NOW) - { - if (udelayed * 40 > 1000) - { - printk(KERN_ERR "%s short wait too long \n", dev->name); - goto bad_end; - } - } - } - } - else - { - i = 0; - while ((READSHMB(arlan->resetFlag) || - READSHMB(arlan->commandByte)) && - conf->pre_Command_Wait > (i++) * 10) - udelay(10); - - - if ((READSHMB(arlan->resetFlag) || - READSHMB(arlan->commandByte)) && - !(priv->waiting_command_mask & ARLAN_COMMAND_RESET)) - { - goto card_busy_end; - } - } - if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) - priv->under_reset = 1; - if (priv->waiting_command_mask & ARLAN_COMMAND_CONF) - priv->under_config = 1; - - /* Issuing command */ - arlan_lock_card_access(dev); - if (priv->waiting_command_mask & ARLAN_COMMAND_POWERUP) - { - // if (readControlRegister(dev) & (ARLAN_ACCESS && ARLAN_POWER)) - setPowerOn(dev); - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERUP; - priv->waiting_command_mask |= ARLAN_COMMAND_RESET; - priv->card_polling_interval = HZ / 10; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_ACTIVATE) - { - WRITESHMB(arlan->commandByte, ARLAN_COM_ACTIVATE); - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_ACTIVATE; - priv->card_polling_interval = HZ / 10; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_RX_ABORT) - { - if (priv->rx_command_given) - { - WRITESHMB(arlan->commandByte, ARLAN_COM_RX_ABORT); - arlan_interrupt_lancpu(dev); - priv->rx_command_given = 0; - } - priv->waiting_command_mask &= ~ARLAN_COMMAND_RX_ABORT; - priv->card_polling_interval = 1; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_TX_ABORT) - { - if (priv->tx_command_given) - { - WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ABORT); - arlan_interrupt_lancpu(dev); - priv->tx_command_given = 0; - } - priv->waiting_command_mask &= ~ARLAN_COMMAND_TX_ABORT; - priv->card_polling_interval = 1; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) - { - priv->under_reset=1; - netif_stop_queue (dev); - - arlan_drop_tx(dev); - if (priv->tx_command_given || priv->rx_command_given) - { - printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name); - }; - netif_stop_queue (dev); - if (arlan_debug & ARLAN_DEBUG_RESET) - printk(KERN_ERR "%s: Doing chip reset\n", dev->name); - priv->lastReset = jiffies; - WRITESHM(arlan->commandByte, 0, u_char); - /* hold card in reset state */ - setHardwareReset(dev); - /* set reset flag and then release reset */ - WRITESHM(arlan->resetFlag, 0xff, u_char); - clearChannelAttention(dev); - clearHardwareReset(dev); - priv->numResets++; - priv->card_polling_interval = HZ / 4; - priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET; - priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK; -// priv->waiting_command_mask |= ARLAN_COMMAND_INT_RENABLE; -// priv->waiting_command_mask |= ARLAN_COMMAND_RX; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RACK) - { - clearHardwareReset(dev); - clearClearInterrupt(dev); - setClearInterrupt(dev); - setInterruptEnable(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RACK; - priv->waiting_command_mask |= ARLAN_COMMAND_CONF; - priv->under_config = 1; - priv->under_reset = 0; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RENABLE) - { - setInterruptEnable(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RENABLE; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF) - { - if (priv->tx_command_given || priv->rx_command_given) - { - printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name); - } - arlan_drop_tx(dev); - setInterruptEnable(dev); - arlan_hw_config(dev); - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF; - priv->card_polling_interval = HZ / 10; -// priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK; -// priv->waiting_command_mask |= ARLAN_COMMAND_INT_ENABLE; - priv->waiting_command_mask |= ARLAN_COMMAND_CONF_WAIT; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF_WAIT) - { - if (READSHMB(arlan->configuredStatusFlag) != 0 && - READSHMB(arlan->diagnosticInfo) == 0xff) - { - priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF_WAIT; - priv->waiting_command_mask |= ARLAN_COMMAND_RX; - priv->waiting_command_mask |= ARLAN_COMMAND_TBUSY_CLEAR; - priv->card_polling_interval = HZ / 10; - priv->tx_command_given = 0; - priv->under_config = 0; - } - else - { - priv->card_polling_interval = 1; - if (arlan_debug & ARLAN_DEBUG_TIMING) - printk(KERN_ERR "configure delayed \n"); - } - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_RX) - { - if (!registrationBad(dev)) - { - setInterruptEnable(dev); - memset_io((void *) arlan->commandParameter, 0, 0xf); - WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_RX_ENABLE); - WRITESHMB(arlan->commandParameter[0], conf->rxParameter); - arlan_interrupt_lancpu(dev); - priv->rx_command_given = 0; // mnjah, bad - priv->last_rx_time = arlan_time(); - priv->waiting_command_mask &= ~ARLAN_COMMAND_RX; - priv->card_polling_interval = 1; - } - else - priv->card_polling_interval = 2; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_TBUSY_CLEAR) - { - if ( !registrationBad(dev) && - (netif_queue_stopped(dev) || !netif_running(dev)) ) - { - priv->waiting_command_mask &= ~ARLAN_COMMAND_TBUSY_CLEAR; - netif_wake_queue (dev); - }; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_TX) - { - if (!test_and_set_bit(0, (void *) &priv->tx_command_given)) - { - if ((time_mks - priv->last_tx_time > conf->rx_tweak1) || - (time_mks - priv->last_rx_int_ack_time < conf->rx_tweak2)) - { - setInterruptEnable(dev); - memset_io((void *) arlan->commandParameter, 0, 0xf); - WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ENABLE | ARLAN_COM_INT); - memcpy_toio((void *) arlan->commandParameter, &TXLAST(dev), 14); -// for ( i=1 ; i < 15 ; i++) printk("%02x:",READSHMB(arlan->commandParameter[i])); - priv->last_command_was_rx = 0; - priv->tx_last_sent = jiffies; - arlan_interrupt_lancpu(dev); - priv->last_tx_time = arlan_time(); - priv->tx_command_given = 1; - priv->waiting_command_mask &= ~ARLAN_COMMAND_TX; - priv->card_polling_interval = 1; - } - else - { - priv->tx_command_given = 0; - priv->card_polling_interval = 1; - } - } - else if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) - printk(KERN_ERR "tx command when tx chain locked \n"); - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOPINT) - { - { - WRITESHMB(arlan->commandByte, ARLAN_COM_NOP | ARLAN_COM_INT); - } - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOPINT; - priv->card_polling_interval = HZ / 3; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOP) - { - WRITESHMB(arlan->commandByte, ARLAN_COM_NOP); - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOP; - priv->card_polling_interval = HZ / 3; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_SLOW_POLL) - { - WRITESHMB(arlan->commandByte, ARLAN_COM_GOTO_SLOW_POLL); - arlan_interrupt_lancpu(dev); - priv->waiting_command_mask &= ~ARLAN_COMMAND_SLOW_POLL; - priv->card_polling_interval = HZ / 3; - } - else if (priv->waiting_command_mask & ARLAN_COMMAND_POWERDOWN) - { - setPowerOff(dev); - if (arlan_debug & ARLAN_DEBUG_CARD_STATE) - printk(KERN_WARNING "%s: Arlan Going Standby\n", dev->name); - priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERDOWN; - priv->card_polling_interval = 3 * HZ; - } - arlan_unlock_card_access(dev); - for (i = 0; READSHMB(arlan->commandByte) && i < 20; i++) - udelay(10); - if (READSHMB(arlan->commandByte)) - if (arlan_debug & ARLAN_DEBUG_CARD_STATE) - printk(KERN_ERR "card busy leaving command %x \n", priv->waiting_command_mask); - - priv->command_lock = 0; - ARLAN_DEBUG_EXIT("arlan_command"); - priv->last_command_buff_free_time = jiffies; - return 0; - -card_busy_end: - if (jiffies - priv->last_command_buff_free_time > HZ) - priv->waiting_command_mask |= ARLAN_COMMAND_CLEAN_AND_RESET; - - if (arlan_debug & ARLAN_DEBUG_CARD_STATE) - printk(KERN_ERR "%s arlan_command card busy end \n", dev->name); - priv->command_lock = 0; - ARLAN_DEBUG_EXIT("arlan_command"); - return 1; - -bad_end: - printk(KERN_ERR "%s arlan_command bad end \n", dev->name); - - priv->command_lock = 0; - ARLAN_DEBUG_EXIT("arlan_command"); - - return -1; - -command_busy_end: - if (arlan_debug & ARLAN_DEBUG_CARD_STATE) - printk(KERN_ERR "%s arlan_command command busy end \n", dev->name); - ARLAN_DEBUG_EXIT("arlan_command"); - return 2; - -}; - -static inline void arlan_command_process(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - int times = 0; - while (priv->waiting_command_mask && times < 8) - { - if (priv->waiting_command_mask) - { - if (arlan_command(dev, 0)) - break; - times++; - } - /* if long command, we wont repeat trying */ ; - if (priv->card_polling_interval > 1) - break; - times++; - } -} - - -static inline void arlan_retransmit_now(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - - ARLAN_DEBUG_ENTRY("arlan_retransmit_now"); - if (TXLAST(dev).offset == 0) - { - if (TXHEAD(dev).offset) - { - priv->txLast = 0; - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to head \n"); - - } - else if (TXTAIL(dev).offset) - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to tail \n"); - priv->txLast = 1; - } - else - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "ReTransmit buff empty"); - priv->txOffset = 0; - netif_wake_queue (dev); - return; - - } - arlan_command(dev, ARLAN_COMMAND_TX); - - priv->nof_tx++; - - priv->Conf->driverRetransmissions++; - priv->retransmissions++; - - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("Retransmit %d bytes \n", TXLAST(dev).length); - - ARLAN_DEBUG_EXIT("arlan_retransmit_now"); -} - - - -static void arlan_registration_timer(unsigned long data) -{ - struct net_device *dev = (struct net_device *) data; - struct arlan_private *priv = (struct arlan_private *) dev->priv; - - int lostTime = ((int) (jiffies - priv->registrationLastSeen)) * 1000 / HZ; - int bh_mark_needed = 0; - int next_tick = 1; - - - priv->timer_chain_active = 1; - - - if (registrationBad(dev)) - { - //debug=100; - priv->registrationLostCount++; - if (lostTime > 7000 && lostTime < 7200) - { - printk(KERN_NOTICE "%s registration Lost \n", dev->name); - } - if (lostTime / priv->reRegisterExp > 2000) - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF); - if (lostTime / (priv->reRegisterExp) > 3500) - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); - if (priv->reRegisterExp < 400) - priv->reRegisterExp += 2; - if (lostTime > 7200) - { - next_tick = HZ; - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); - } - } - else - { - if (priv->Conf->registrationMode && lostTime > 10000 && - priv->registrationLostCount) - { - printk(KERN_NOTICE "%s registration is back after %d milliseconds\n", dev->name, - ((int) (jiffies - priv->registrationLastSeen) * 1000) / HZ); - } - priv->registrationLastSeen = jiffies; - priv->registrationLostCount = 0; - priv->reRegisterExp = 1; - if (!netif_running(dev) ) - netif_wake_queue(dev); - if (priv->tx_last_sent > priv->tx_last_cleared && - jiffies - priv->tx_last_sent > 5*HZ ){ - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); - priv->tx_last_cleared = jiffies; - }; - } - - - if (!registrationBad(dev) && priv->ReTransmitRequested) - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk(KERN_ERR "Retransmit from timer \n"); - priv->ReTransmitRequested = 0; - arlan_retransmit_now(dev); - } - if (!registrationBad(dev) && - time_after(jiffies, priv->tx_done_delayed) && - priv->tx_done_delayed != 0) - { - TXLAST(dev).offset = 0; - if (priv->txLast) - priv->txLast = 0; - else if (TXTAIL(dev).offset) - priv->txLast = 1; - if (TXLAST(dev).offset) - { - arlan_retransmit_now(dev); - dev->trans_start = jiffies; - } - if (!(TXHEAD(dev).offset && TXTAIL(dev).offset)) - { - priv->txOffset = 0; - netif_wake_queue (dev); - } - priv->tx_done_delayed = 0; - bh_mark_needed = 1; - } - if (bh_mark_needed) - { - priv->txOffset = 0; - netif_wake_queue (dev); - } - arlan_process_interrupt(dev); - - if (next_tick < priv->card_polling_interval) - next_tick = priv->card_polling_interval; - - priv->timer_chain_active = 0; - priv->timer.expires = jiffies + next_tick; - - add_timer(&priv->timer); -} - - -#ifdef ARLAN_DEBUGGING - -static void arlan_print_registers(struct net_device *dev, int line) -{ - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - - u_char hostcpuLock, lancpuLock, controlRegister, cntrlRegImage, - txStatus, rxStatus, interruptInProgress, commandByte; - - - ARLAN_DEBUG_ENTRY("arlan_print_registers"); - READSHM(interruptInProgress, arlan->interruptInProgress, u_char); - READSHM(hostcpuLock, arlan->hostcpuLock, u_char); - READSHM(lancpuLock, arlan->lancpuLock, u_char); - READSHM(controlRegister, arlan->controlRegister, u_char); - READSHM(cntrlRegImage, arlan->cntrlRegImage, u_char); - READSHM(txStatus, arlan->txStatus, u_char); - READSHM(rxStatus, arlan->rxStatus, u_char); - READSHM(commandByte, arlan->commandByte, u_char); - - printk(KERN_WARNING "line %04d IP %02x HL %02x LL %02x CB %02x CR %02x CRI %02x TX %02x RX %02x\n", - line, interruptInProgress, hostcpuLock, lancpuLock, commandByte, - controlRegister, cntrlRegImage, txStatus, rxStatus); - - ARLAN_DEBUG_EXIT("arlan_print_registers"); -} -#endif - - -static int arlan_hw_tx(struct net_device *dev, char *buf, int length) -{ - int i; - - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = priv->card; - struct arlan_conf_stru *conf = priv->Conf; - - int tailStarts = 0x800; - int headEnds = 0x0; - - - ARLAN_DEBUG_ENTRY("arlan_hw_tx"); - if (TXHEAD(dev).offset) - headEnds = (((TXHEAD(dev).offset + TXHEAD(dev).length - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 1) * 64; - if (TXTAIL(dev).offset) - tailStarts = 0x800 - (((TXTAIL(dev).offset - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 2) * 64; - - - if (!TXHEAD(dev).offset && length < tailStarts) - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk(KERN_ERR "TXHEAD insert, tailStart %d\n", tailStarts); - - TXHEAD(dev).offset = - (((int) arlan->txBuffer) - ((int) arlan)); - TXHEAD(dev).length = length - ARLAN_FAKE_HDR_LEN; - for (i = 0; i < 6; i++) - TXHEAD(dev).dest[i] = buf[i]; - TXHEAD(dev).clear = conf->txClear; - TXHEAD(dev).retries = conf->txRetries; /* 0 is use default */ - TXHEAD(dev).routing = conf->txRouting; - TXHEAD(dev).scrambled = conf->txScrambled; - memcpy_toio(((char *) arlan + TXHEAD(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXHEAD(dev).length); - } - else if (!TXTAIL(dev).offset && length < (0x800 - headEnds)) - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk(KERN_ERR "TXTAIL insert, headEnd %d\n", headEnds); - - TXTAIL(dev).offset = - (((int) arlan->txBuffer) - ((int) arlan)) + 0x800 - (length / 64 + 2) * 64; - TXTAIL(dev).length = length - ARLAN_FAKE_HDR_LEN; - for (i = 0; i < 6; i++) - TXTAIL(dev).dest[i] = buf[i]; - TXTAIL(dev).clear = conf->txClear; - TXTAIL(dev).retries = conf->txRetries; - TXTAIL(dev).routing = conf->txRouting; - TXTAIL(dev).scrambled = conf->txScrambled; - memcpy_toio(((char *) arlan + TXTAIL(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXTAIL(dev).length); - } - else - { - netif_stop_queue (dev); - return -1; - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk(KERN_ERR "TX TAIL & HEAD full, return, tailStart %d headEnd %d\n", tailStarts, headEnds); - } - priv->out_bytes += length; - priv->out_bytes10 += length; - if (conf->measure_rate < 1) - conf->measure_rate = 1; - if (jiffies - priv->out_time > conf->measure_rate * HZ) - { - conf->out_speed = priv->out_bytes / conf->measure_rate; - priv->out_bytes = 0; - priv->out_time = jiffies; - } - if (jiffies - priv->out_time10 > conf->measure_rate * HZ * 10) - { - conf->out_speed10 = priv->out_bytes10 / (10 * conf->measure_rate); - priv->out_bytes10 = 0; - priv->out_time10 = jiffies; - } - if (TXHEAD(dev).offset && TXTAIL(dev).offset) - { - netif_stop_queue (dev); - return 0; - } - else - netif_start_queue (dev); - - - IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) - printk(KERN_WARNING "%s Transmit t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name, - (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2], (unsigned char) buf[3], - (unsigned char) buf[4], (unsigned char) buf[5], (unsigned char) buf[6], (unsigned char) buf[7], - (unsigned char) buf[8], (unsigned char) buf[9], (unsigned char) buf[10], (unsigned char) buf[11]); - - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "TX command prepare for buffer %d\n", priv->txLast); - - arlan_command(dev, ARLAN_COMMAND_TX); - - priv->last_command_was_rx = 0; - priv->tx_last_sent = jiffies; - priv->nof_tx++; - - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("%s TX Qued %d bytes \n", dev->name, length); - - ARLAN_DEBUG_EXIT("arlan_hw_tx"); - - return 0; -} - - -static int arlan_hw_config(struct net_device *dev) -{ - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; - struct arlan_private *priv = (struct arlan_private *) dev->priv; - - ARLAN_DEBUG_ENTRY("arlan_hw_config"); - - printk(KERN_NOTICE "%s arlan configure called \n", dev->name); - if (arlan_EEPROM_bad) - printk(KERN_NOTICE "arlan configure with eeprom bad option \n"); - - - WRITESHM(arlan->spreadingCode, conf->spreadingCode, u_char); - WRITESHM(arlan->channelSet, conf->channelSet, u_char); - - if (arlan_EEPROM_bad) - WRITESHM(arlan->defaultChannelSet, conf->channelSet, u_char); - - WRITESHM(arlan->channelNumber, conf->channelNumber, u_char); - - WRITESHM(arlan->scramblingDisable, conf->scramblingDisable, u_char); - WRITESHM(arlan->txAttenuation, conf->txAttenuation, u_char); - - WRITESHM(arlan->systemId, conf->systemId, u_int); - - WRITESHM(arlan->maxRetries, conf->maxRetries, u_char); - WRITESHM(arlan->receiveMode, conf->receiveMode, u_char); - WRITESHM(arlan->priority, conf->priority, u_char); - WRITESHM(arlan->rootOrRepeater, conf->rootOrRepeater, u_char); - WRITESHM(arlan->SID, conf->SID, u_int); - - WRITESHM(arlan->registrationMode, conf->registrationMode, u_char); - - WRITESHM(arlan->registrationFill, conf->registrationFill, u_char); - WRITESHM(arlan->localTalkAddress, conf->localTalkAddress, u_char); - WRITESHM(arlan->codeFormat, conf->codeFormat, u_char); - WRITESHM(arlan->numChannels, conf->numChannels, u_char); - WRITESHM(arlan->channel1, conf->channel1, u_char); - WRITESHM(arlan->channel2, conf->channel2, u_char); - WRITESHM(arlan->channel3, conf->channel3, u_char); - WRITESHM(arlan->channel4, conf->channel4, u_char); - WRITESHM(arlan->radioNodeId, conf->radioNodeId, u_short); - WRITESHM(arlan->SID, conf->SID, u_int); - WRITESHM(arlan->waitTime, conf->waitTime, u_short); - WRITESHM(arlan->lParameter, conf->lParameter, u_short); - memcpy_toio(&(arlan->_15), &(conf->_15), 3); - WRITESHM(arlan->_15, conf->_15, u_short); - WRITESHM(arlan->headerSize, conf->headerSize, u_short); - if (arlan_EEPROM_bad) - WRITESHM(arlan->hardwareType, conf->hardwareType, u_char); - WRITESHM(arlan->radioType, conf->radioType, u_char); - if (arlan_EEPROM_bad) - WRITESHM(arlan->radioModule, conf->radioType, u_char); - - memcpy_toio(arlan->encryptionKey + keyStart, encryptionKey, 8); - memcpy_toio(arlan->name, conf->siteName, 16); - - WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_CONF); /* do configure */ - memset_io(arlan->commandParameter, 0, 0xf); /* 0xf */ - memset_io(arlan->commandParameter + 1, 0, 2); - if (conf->writeEEPROM) - { - memset_io(arlan->commandParameter, conf->writeEEPROM, 1); -// conf->writeEEPROM=0; - } - if (conf->registrationMode && conf->registrationInterrupts) - memset_io(arlan->commandParameter + 3, 1, 1); - else - memset_io(arlan->commandParameter + 3, 0, 1); - - priv->irq_test_done = 0; - - if (conf->tx_queue_len) - dev->tx_queue_len = conf->tx_queue_len; - udelay(100); - - ARLAN_DEBUG_EXIT("arlan_hw_config"); - return 0; -} - - -static int arlan_read_card_configuration(struct net_device *dev) -{ - u_char tlx415; - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; - - ARLAN_DEBUG_ENTRY("arlan_read_card_configuration"); - - if (radioNodeId == radioNodeIdUNKNOWN) - { - READSHM(conf->radioNodeId, arlan->radioNodeId, u_short); - } - else - conf->radioNodeId = radioNodeId; - - if (SID == SIDUNKNOWN) - { - READSHM(conf->SID, arlan->SID, u_int); - } - else conf->SID = SID; - - if (spreadingCode == spreadingCodeUNKNOWN) - { - READSHM(conf->spreadingCode, arlan->spreadingCode, u_char); - } - else - conf->spreadingCode = spreadingCode; - - if (channelSet == channelSetUNKNOWN) - { - READSHM(conf->channelSet, arlan->channelSet, u_char); - } - else conf->channelSet = channelSet; - - if (channelNumber == channelNumberUNKNOWN) - { - READSHM(conf->channelNumber, arlan->channelNumber, u_char); - } - else conf->channelNumber = channelNumber; - - READSHM(conf->scramblingDisable, arlan->scramblingDisable, u_char); - READSHM(conf->txAttenuation, arlan->txAttenuation, u_char); - - if (systemId == systemIdUNKNOWN) - { - READSHM(conf->systemId, arlan->systemId, u_int); - } - else conf->systemId = systemId; - - READSHM(conf->maxDatagramSize, arlan->maxDatagramSize, u_short); - READSHM(conf->maxFrameSize, arlan->maxFrameSize, u_short); - READSHM(conf->maxRetries, arlan->maxRetries, u_char); - READSHM(conf->receiveMode, arlan->receiveMode, u_char); - READSHM(conf->priority, arlan->priority, u_char); - READSHM(conf->rootOrRepeater, arlan->rootOrRepeater, u_char); - - if (SID == SIDUNKNOWN) - { - READSHM(conf->SID, arlan->SID, u_int); - } - else conf->SID = SID; - - if (registrationMode == registrationModeUNKNOWN) - { - READSHM(conf->registrationMode, arlan->registrationMode, u_char); - } - else conf->registrationMode = registrationMode; - - READSHM(conf->registrationFill, arlan->registrationFill, u_char); - READSHM(conf->localTalkAddress, arlan->localTalkAddress, u_char); - READSHM(conf->codeFormat, arlan->codeFormat, u_char); - READSHM(conf->numChannels, arlan->numChannels, u_char); - READSHM(conf->channel1, arlan->channel1, u_char); - READSHM(conf->channel2, arlan->channel2, u_char); - READSHM(conf->channel3, arlan->channel3, u_char); - READSHM(conf->channel4, arlan->channel4, u_char); - READSHM(conf->waitTime, arlan->waitTime, u_short); - READSHM(conf->lParameter, arlan->lParameter, u_short); - READSHM(conf->_15, arlan->_15, u_short); - READSHM(conf->headerSize, arlan->headerSize, u_short); - READSHM(conf->hardwareType, arlan->hardwareType, u_char); - READSHM(conf->radioType, arlan->radioModule, u_char); - - if (conf->radioType == 0) - conf->radioType = 0xc; - - WRITESHM(arlan->configStatus, 0xA5, u_char); - READSHM(tlx415, arlan->configStatus, u_char); - - if (tlx415 != 0xA5) - printk(KERN_INFO "%s tlx415 chip \n", dev->name); - - conf->txClear = 0; - conf->txRetries = 1; - conf->txRouting = 1; - conf->txScrambled = 0; - conf->rxParameter = 1; - conf->txTimeoutMs = 4000; - conf->waitCardTimeout = 100000; - conf->receiveMode = ARLAN_RCV_CLEAN; - memcpy_fromio(conf->siteName, arlan->name, 16); - conf->siteName[16] = '\0'; - conf->retries = retries; - conf->tx_delay_ms = tx_delay_ms; - conf->async = async; - conf->ReTransmitPacketMaxSize = 200; - conf->waitReTransmitPacketMaxSize = 200; - conf->txAckTimeoutMs = 900; - conf->fastReTransCount = 3; - - ARLAN_DEBUG_EXIT("arlan_read_card_configuration"); - - return 0; -} - - -static int lastFoundAt = 0xbe000; - - -/* - * 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 arlan_check_fingerprint(int memaddr) -{ - static char probeText[] = "TELESYSTEM SLW INC. ARLAN \0"; - char tempBuf[49]; - volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr; - - ARLAN_DEBUG_ENTRY("arlan_check_fingerprint"); - if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){ - // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",virt_to_phys((void*)memaddr)); - return -ENODEV; - }; - memcpy_fromio(tempBuf, arlan->textRegion, 29); - tempBuf[30] = 0; - - /* check for card at this address */ - if (0 != strncmp(tempBuf, probeText, 29)){ -// not release_mem_region(virt_to_phys((void*)memaddr),0x2000); - return -ENODEV; - } - -// printk(KERN_INFO "arlan found at 0x%x \n",memaddr); - ARLAN_DEBUG_EXIT("arlan_check_fingerprint"); - - return 0; - - -} - -static int __init arlan_probe_everywhere(struct net_device *dev) -{ - int m; - int probed = 0; - int found = 0; - - SET_MODULE_OWNER(dev); - - ARLAN_DEBUG_ENTRY("arlan_probe_everywhere"); - if (mem != 0 && numDevices == 1) /* Check a single specified location. */ - { - if (arlan_probe_here(dev, (int) phys_to_virt( mem) ) == 0) - return 0; - else - return -ENODEV; - } - for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000) - { - if (arlan_probe_here(dev, m) == 0) - { - found++; - lastFoundAt = (int)virt_to_phys((void*)m); - break; - } - probed++; - } - if (found == 0 && probed != 0) - { - if (lastFoundAt == 0xbe000) - printk(KERN_ERR "arlan: No Arlan devices found \n"); - return -ENODEV; - } - else - return 0; - - ARLAN_DEBUG_EXIT("arlan_probe_everywhere"); - - return -ENODEV; -} - - -static int arlan_change_mtu(struct net_device *dev, int new_mtu) -{ - struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; - - ARLAN_DEBUG_ENTRY("arlan_change_mtu"); - if (new_mtu > 2032) - return -EINVAL; - dev->mtu = new_mtu; - if (new_mtu < 256) - new_mtu = 256; /* cards book suggests 1600 */ - conf->maxDatagramSize = new_mtu; - conf->maxFrameSize = new_mtu + 48; - - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF); - printk(KERN_NOTICE "%s mtu changed to %d \n", dev->name, new_mtu); - - ARLAN_DEBUG_EXIT("arlan_change_mtu"); - - return 0; -} - -static int arlan_mac_addr(struct net_device *dev, void *p) -{ - struct sockaddr *addr = p; - - - ARLAN_DEBUG_ENTRY("arlan_mac_addr"); - return -EINVAL; - - if (!netif_running(dev)) - return -EBUSY; - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - - ARLAN_DEBUG_EXIT("arlan_mac_addr"); - return 0; -} - - - - -static int __init - arlan_allocate_device(int num, struct net_device *devs) -{ - - struct net_device *dev; - struct arlan_private *ap; - - ARLAN_DEBUG_ENTRY("arlan_allocate_device"); - - if (!devs) { - dev = init_etherdev(0, sizeof(struct arlan_private) + sizeof(struct arlan_shmem)); - if (!dev) { - printk(KERN_ERR "ARLAN: init_etherdev failed\n"); - return 0; - } - ap = dev->priv; - ap->conf = dev->priv + sizeof(struct arlan_private); - ap->init_etherdev_alloc = 1; - } else { - dev = devs; - dev->priv = kmalloc(sizeof(struct arlan_private) + sizeof(struct arlan_shmem), GFP_KERNEL); - if (!dev->priv) { - printk(KERN_ERR "ARLAN: kmalloc of dev->priv failed\n"); - return 0; - } - ap = dev->priv; - ap->conf = dev->priv + sizeof(struct arlan_private); - memset(ap, 0, sizeof(*ap)); - } - - /* Fill in the 'dev' fields. */ - dev->base_addr = 0; - dev->mem_start = 0; - dev->mem_end = 0; - dev->mtu = 1500; - dev->flags = 0; /* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */ - dev->irq = 0; - dev->dma = 0; - dev->tx_queue_len = tx_queue_len; - ether_setup(dev); - dev->tx_queue_len = tx_queue_len; - dev->open = arlan_open; - dev->stop = arlan_close; - dev->hard_start_xmit = arlan_tx; - dev->get_stats = arlan_statistics; - dev->set_multicast_list = arlan_set_multicast; - dev->change_mtu = arlan_change_mtu; - dev->set_mac_address = arlan_mac_addr; - dev->tx_timeout = arlan_tx_timeout; - dev->watchdog_timeo = 3*HZ; - - ((struct arlan_private *) dev->priv)->irq_test_done = 0; - arlan_device[num] = dev; - ((struct arlan_private *) arlan_device[num]->priv)->Conf = &(arlan_conf[num]); - - ((struct arlan_private *) dev->priv)->Conf->pre_Command_Wait = 40; - ((struct arlan_private *) dev->priv)->Conf->rx_tweak1 = 30; - ((struct arlan_private *) dev->priv)->Conf->rx_tweak2 = 0; - - ARLAN_DEBUG_EXIT("arlan_allocate_device"); - return (int) dev; -} - - -static int __init arlan_probe_here(struct net_device *dev, int memaddr) -{ - volatile struct arlan_shmem *arlan; - - ARLAN_DEBUG_ENTRY("arlan_probe_here"); - - if (arlan_check_fingerprint(memaddr)) - return -ENODEV; - - printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, (int) virt_to_phys((void*)memaddr)); - - if (!arlan_allocate_device(arlans_found, dev)) - return -1; - - ((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr; - arlan = (void *) memaddr; - - dev->mem_start = memaddr; - dev->mem_end = memaddr + 0x1FFF; - - if (dev->irq < 2) - { - READSHM(dev->irq, arlan->irqLevel, u_char); - } else if (dev->irq == 2) - dev->irq = 9; - - arlan_read_card_configuration(dev); - - ARLAN_DEBUG_EXIT("arlan_probe_here"); - return 0; -} - - - - -static int arlan_open(struct net_device *dev) -{ - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = priv->card; - int ret = 0; - - ARLAN_DEBUG_ENTRY("arlan_open"); - - if (dev->mem_start == 0) - ret = arlan_probe_everywhere(dev); - if (ret != 0) - return ret; - - arlan = ((struct arlan_private *) dev->priv)->card; - ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev); - if (ret) - { - printk(KERN_ERR "%s: unable to get IRQ %d .\n", - dev->name, dev->irq); - return ret; - } - - - priv->bad = 0; - priv->lastReset = 0; - priv->reset = 0; - priv->open_time = jiffies; - memcpy_fromio(dev->dev_addr, arlan->lanCardNodeId, 6); - memset(dev->broadcast, 0xff, 6); - priv->txOffset = 0; - dev->tx_queue_len = tx_queue_len; - priv->interrupt_processing_active = 0; - priv->command_lock = 0; - - netif_start_queue (dev); - - init_MUTEX(&priv->card_lock); - myATOMIC_INIT(priv->card_users, 1); /* damn 2.0.33 */ - priv->registrationLostCount = 0; - priv->registrationLastSeen = jiffies; - priv->txLast = 0; - priv->tx_command_given = 0; - priv->rx_command_given = 0; - - priv->reRegisterExp = 1; - priv->nof_tx = 0; - priv->nof_tx_ack = 0; - priv->last_command_was_rx = 0; - priv->tx_last_sent = jiffies - 1; - priv->tx_last_cleared = jiffies; - priv->Conf->writeEEPROM = 0; - priv->Conf->registrationInterrupts = 1; - - init_timer(&priv->timer); - priv->timer.expires = jiffies + HZ / 10; - priv->timer.data = (unsigned long) dev; - priv->timer.function = &arlan_registration_timer; /* timer handler */ - - arlan_command(dev, ARLAN_COMMAND_POWERUP | ARLAN_COMMAND_LONG_WAIT_NOW); - mdelay(200); - add_timer(&priv->timer); - -#ifdef CONFIG_PROC_FS -#ifndef MODULE - if (arlan_device[0]) - init_arlan_proc(); -#endif -#endif - ARLAN_DEBUG_EXIT("arlan_open"); - return 0; -} - - -static void arlan_tx_timeout (struct net_device *dev) -{ - printk(KERN_ERR "%s: arlan transmit timed out, kernel decided\n", dev->name); - /* Try to restart the adaptor. */ - arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); - // dev->trans_start = jiffies; - // netif_start_queue (dev); -} - - -static int arlan_tx(struct sk_buff *skb, struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - short length; - unsigned char *buf; - - ARLAN_DEBUG_ENTRY("arlan_tx"); - - length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; - buf = skb->data; - - if (priv->txOffset + length + 0x12 > 0x800) { - printk(KERN_ERR "TX RING overflow \n"); - netif_stop_queue (dev); - } - - if (arlan_hw_tx(dev, buf, length) == -1) - goto bad_end; - - dev->trans_start = jiffies; - - dev_kfree_skb(skb); - - arlan_process_interrupt(dev); - priv->tx_chain_active = 0; - ARLAN_DEBUG_EXIT("arlan_tx"); - return 0; - -bad_end: - arlan_process_interrupt(dev); - priv->tx_chain_active = 0; - netif_stop_queue (dev); - ARLAN_DEBUG_EXIT("arlan_tx"); - return 1; -} - - -static inline int DoNotReTransmitCrap(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - if (TXLAST(dev).length < priv->Conf->ReTransmitPacketMaxSize) - return 1; - return 0; - -} - -static inline int DoNotWaitReTransmitCrap(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - if (TXLAST(dev).length < priv->Conf->waitReTransmitPacketMaxSize) - return 1; - return 0; -} - -static inline void arlan_queue_retransmit(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - ARLAN_DEBUG_ENTRY("arlan_queue_retransmit"); - - if (DoNotWaitReTransmitCrap(dev)) - { - arlan_drop_tx(dev); - } else - priv->ReTransmitRequested++; - - ARLAN_DEBUG_EXIT("arlan_queue_retransmit"); -}; - -static inline void RetryOrFail(struct net_device *dev) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - ARLAN_DEBUG_ENTRY("RetryOrFail"); - - if (priv->retransmissions > priv->Conf->retries || - DoNotReTransmitCrap(dev)) - { - arlan_drop_tx(dev); - } - else if (priv->bad <= priv->Conf->fastReTransCount) - { - arlan_retransmit_now(dev); - } - else arlan_queue_retransmit(dev); - - ARLAN_DEBUG_EXIT("RetryOrFail"); -} - - -static void arlan_tx_done_interrupt(struct net_device *dev, int status) -{ - struct arlan_private *priv = ((struct arlan_private *) dev->priv); - - ARLAN_DEBUG_ENTRY("arlan_tx_done_interrupt"); - - priv->tx_last_cleared = jiffies; - priv->tx_command_given = 0; - priv->nof_tx_ack++; - switch (status) - { - case 1: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit OK\n"); - priv->stats.tx_packets++; - priv->bad = 0; - priv->reset = 0; - priv->retransmissions = 0; - if (priv->Conf->tx_delay_ms) - { - priv->tx_done_delayed = jiffies + (priv->Conf->tx_delay_ms * HZ) / 1000 + 1;; - } - else - { - TXLAST(dev).offset = 0; - if (priv->txLast) - priv->txLast = 0; - else if (TXTAIL(dev).offset) - priv->txLast = 1; - if (TXLAST(dev).offset) - { - arlan_retransmit_now(dev); - dev->trans_start = jiffies; - } - if (!TXHEAD(dev).offset || !TXTAIL(dev).offset) - { - priv->txOffset = 0; - netif_wake_queue (dev); - } - } - } - break; - - case 2: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit timed out\n"); - priv->bad += 1; - //arlan_queue_retransmit(dev); - RetryOrFail(dev); - } - break; - - case 3: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit max retries\n"); - priv->bad += 1; - priv->reset = 0; - //arlan_queue_retransmit(dev); - RetryOrFail(dev); - } - break; - - case 4: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit aborted\n"); - priv->bad += 1; - arlan_queue_retransmit(dev); - //RetryOrFail(dev); - } - break; - - case 5: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit not registered\n"); - priv->bad += 1; - //debug=101; - arlan_queue_retransmit(dev); - } - break; - - case 6: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit destination full\n"); - priv->bad += 1; - priv->reset = 0; - //arlan_drop_tx(dev); - arlan_queue_retransmit(dev); - } - break; - - case 7: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit unknown ack\n"); - priv->bad += 1; - priv->reset = 0; - arlan_queue_retransmit(dev); - } - break; - - case 8: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit dest mail box full\n"); - priv->bad += 1; - priv->reset = 0; - //arlan_drop_tx(dev); - arlan_queue_retransmit(dev); - } - break; - - case 9: - { - IFDEBUG(ARLAN_DEBUG_TX_CHAIN) - printk("arlan intr: transmit root dest not reg.\n"); - priv->bad += 1; - priv->reset = 1; - //arlan_drop_tx(dev); - arlan_queue_retransmit(dev); - } - break; - - default: - { - printk(KERN_ERR "arlan intr: transmit status unknown\n"); - priv->bad += 1; - priv->reset = 1; - arlan_drop_tx(dev); - } - } - - ARLAN_DEBUG_EXIT("arlan_tx_done_interrupt"); -} - - -static void arlan_rx_interrupt(struct net_device *dev, u_char rxStatus, u_short rxOffset, u_short pkt_len) -{ - char *skbtmp; - int i = 0; - - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = priv->card; - struct arlan_conf_stru *conf = priv->Conf; - - - ARLAN_DEBUG_ENTRY("arlan_rx_interrupt"); - // by spec, not WRITESHMB(arlan->rxStatus,0x00); - // prohibited here arlan_command(dev, ARLAN_COMMAND_RX); - - if (pkt_len < 10 || pkt_len > 2048) - { - printk(KERN_WARNING "%s: got too short or long packet, len %d \n", dev->name, pkt_len); - return; - } - if (rxOffset + pkt_len > 0x2000) - { - printk("%s: got too long packet, len %d offset %x\n", dev->name, pkt_len, rxOffset); - return; - } - priv->in_bytes += pkt_len; - priv->in_bytes10 += pkt_len; - if (conf->measure_rate < 1) - conf->measure_rate = 1; - if (jiffies - priv->in_time > conf->measure_rate * HZ) - { - conf->in_speed = priv->in_bytes / conf->measure_rate; - priv->in_bytes = 0; - priv->in_time = jiffies; - } - if (jiffies - priv->in_time10 > conf->measure_rate * HZ * 10) - { - conf->in_speed10 = priv->in_bytes10 / (10 * conf->measure_rate); - priv->in_bytes10 = 0; - priv->in_time10 = jiffies; - } - DEBUGSHM(1, "arlan rcv pkt rxStatus= %d ", arlan->rxStatus, u_char); - switch (rxStatus) - { - case 1: - case 2: - case 3: - { - /* Malloc up new buffer. */ - struct sk_buff *skb; - - DEBUGSHM(50, "arlan recv pkt offs=%d\n", arlan->rxOffset, u_short); - DEBUGSHM(1, "arlan rxFrmType = %d \n", arlan->rxFrmType, u_char); - DEBUGSHM(1, KERN_INFO "arlan rx scrambled = %d \n", arlan->scrambled, u_char); - - /* here we do multicast filtering to avoid slow 8-bit memcopy */ -#ifdef ARLAN_MULTICAST - if (!(dev->flags & IFF_ALLMULTI) && - !(dev->flags & IFF_PROMISC) && - dev->mc_list) - { - char hw_dst_addr[6]; - struct dev_mc_list *dmi = dev->mc_list; - int i; - - memcpy_fromio(hw_dst_addr, arlan->ultimateDestAddress, 6); - if (hw_dst_addr[0] == 0x01) - { - if (mdebug) - if (hw_dst_addr[1] == 0x00) - printk(KERN_ERR "%s mcast 0x0100 \n", dev->name); - else if (hw_dst_addr[1] == 0x40) - printk(KERN_ERR "%s m/bcast 0x0140 \n", dev->name); - while (dmi) - { if (dmi->dmi_addrlen == 6) - { - if (arlan_debug & ARLAN_DEBUG_HEADER_DUMP) - printk(KERN_ERR "%s mcl %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name, - dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2], - dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]); - for (i = 0; i < 6; i++) - if (dmi->dmi_addr[i] != hw_dst_addr[i]) - break; - if (i == 6) - break; - } - else - printk(KERN_ERR "%s: invalid multicast address length given.\n", dev->name); - dmi = dmi->next; - } - /* we reach here if multicast filtering is on and packet - * is multicast and not for receive */ - goto end_of_interrupt; - } - } -#endif // ARLAN_MULTICAST - /* multicast filtering ends here */ - pkt_len += ARLAN_FAKE_HDR_LEN; - - skb = dev_alloc_skb(pkt_len + 4); - if (skb == NULL) - { - printk(KERN_ERR "%s: Memory squeeze, dropping packet.\n", dev->name); - priv->stats.rx_dropped++; - break; - } - skb_reserve(skb, 2); - skb->dev = dev; - skbtmp = skb_put(skb, pkt_len); - - memcpy_fromio(skbtmp + ARLAN_FAKE_HDR_LEN, ((char *) arlan) + rxOffset, pkt_len - ARLAN_FAKE_HDR_LEN); - memcpy_fromio(skbtmp, arlan->ultimateDestAddress, 6); - memcpy_fromio(skbtmp + 6, arlan->rxSrc, 6); - WRITESHMB(arlan->rxStatus, 0x00); - arlan_command(dev, ARLAN_COMMAND_RX); - - IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) - { - char immedDestAddress[6]; - char immedSrcAddress[6]; - memcpy_fromio(immedDestAddress, arlan->immedDestAddress, 6); - memcpy_fromio(immedSrcAddress, arlan->immedSrcAddress, 6); - - printk(KERN_WARNING "%s t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x imd %2x:%2x:%2x:%2x:%2x:%2x ims %2x:%2x:%2x:%2x:%2x:%2x\n", dev->name, - (unsigned char) skbtmp[0], (unsigned char) skbtmp[1], (unsigned char) skbtmp[2], (unsigned char) skbtmp[3], - (unsigned char) skbtmp[4], (unsigned char) skbtmp[5], (unsigned char) skbtmp[6], (unsigned char) skbtmp[7], - (unsigned char) skbtmp[8], (unsigned char) skbtmp[9], (unsigned char) skbtmp[10], (unsigned char) skbtmp[11], - immedDestAddress[0], immedDestAddress[1], immedDestAddress[2], - immedDestAddress[3], immedDestAddress[4], immedDestAddress[5], - immedSrcAddress[0], immedSrcAddress[1], immedSrcAddress[2], - immedSrcAddress[3], immedSrcAddress[4], immedSrcAddress[5]); - } - skb->protocol = eth_type_trans(skb, dev); - IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) - if (skb->protocol != 0x608 && skb->protocol != 0x8) - { - for (i = 0; i <= 22; i++) - printk("%02x:", (u_char) skbtmp[i + 12]); - printk(KERN_ERR "\n"); - printk(KERN_WARNING "arlan kernel pkt type trans %x \n", skb->protocol); - } - netif_rx(skb); - dev->last_rx = jiffies; - priv->stats.rx_packets++; - priv->stats.rx_bytes += pkt_len; - } - break; - - default: - printk(KERN_ERR "arlan intr: received unknown status\n"); - priv->stats.rx_crc_errors++; - break; - } - ARLAN_DEBUG_EXIT("arlan_rx_interrupt"); -} - -static void arlan_process_interrupt(struct net_device *dev) -{ - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = priv->card; - u_char rxStatus = READSHMB(arlan->rxStatus); - u_char txStatus = READSHMB(arlan->txStatus); - u_short rxOffset = READSHMS(arlan->rxOffset); - u_short pkt_len = READSHMS(arlan->rxLength); - int interrupt_count = 0; - - ARLAN_DEBUG_ENTRY("arlan_process_interrupt"); - - if (test_and_set_bit(0, (void *) &priv->interrupt_processing_active)) - { - if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) - printk(KERN_ERR "interrupt chain reentering \n"); - goto end_int_process; - } - while ((rxStatus || txStatus || priv->interrupt_ack_requested) - && (interrupt_count < 5)) - { - if (rxStatus) - priv->last_rx_int_ack_time = arlan_time(); - - arlan_command(dev, ARLAN_COMMAND_INT_ACK); - arlan_command(dev, ARLAN_COMMAND_INT_ENABLE); - - IFDEBUG(ARLAN_DEBUG_INTERRUPT) - printk(KERN_ERR "%s: got IRQ rx %x tx %x comm %x rxOff %x rxLen %x \n", - dev->name, rxStatus, txStatus, READSHMB(arlan->commandByte), - rxOffset, pkt_len); - - if (rxStatus == 0 && txStatus == 0) - { - priv->last_command_was_rx = 0; - if (priv->irq_test_done) - { - if (!registrationBad(dev)) - IFDEBUG(ARLAN_DEBUG_INTERRUPT) printk(KERN_ERR "%s unknown interrupt(nop? regLost ?) reason tx %d rx %d ", - dev->name, txStatus, rxStatus); - } else { - IFDEBUG(ARLAN_DEBUG_INTERRUPT) - printk(KERN_INFO "%s irq $%d test OK \n", dev->name, dev->irq); - - } - priv->interrupt_ack_requested = 0; - goto ends; - } - if (txStatus != 0) - { - WRITESHMB(arlan->txStatus, 0x00); - arlan_tx_done_interrupt(dev, txStatus); - goto ends; - } - if (rxStatus == 1 || rxStatus == 2) - { /* a packet waiting */ - arlan_rx_interrupt(dev, rxStatus, rxOffset, pkt_len); - goto ends; - } - if (rxStatus > 2 && rxStatus < 0xff) - { - priv->last_command_was_rx = 0; - WRITESHMB(arlan->rxStatus, 0x00); - printk(KERN_ERR "%s unknown rxStatus reason tx %d rx %d ", - dev->name, txStatus, rxStatus); - goto ends; - } - if (rxStatus == 0xff) - { - priv->last_command_was_rx = 0; - WRITESHMB(arlan->rxStatus, 0x00); - arlan_command(dev, ARLAN_COMMAND_RX); - if (registrationBad(dev)) - netif_device_detach(dev); - if (!registrationBad(dev)) - { - priv->registrationLastSeen = jiffies; - if (!netif_queue_stopped(dev) && !priv->under_reset && !priv->under_config) - netif_wake_queue (dev); - } - goto ends; - } -ends: - - arlan_command_process(dev); - - rxStatus = READSHMB(arlan->rxStatus); - txStatus = READSHMB(arlan->txStatus); - rxOffset = READSHMS(arlan->rxOffset); - pkt_len = READSHMS(arlan->rxLength); - - - priv->irq_test_done = 1; - - interrupt_count++; - } - priv->interrupt_processing_active = 0; - -end_int_process: - arlan_command_process(dev); - - ARLAN_DEBUG_EXIT("arlan_process_interrupt"); - return; -} - -static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = priv->card; - u_char rxStatus = READSHMB(arlan->rxStatus); - u_char txStatus = READSHMB(arlan->txStatus); - - ARLAN_DEBUG_ENTRY("arlan_interrupt"); - - - if (!rxStatus && !txStatus) - priv->interrupt_ack_requested++; - - arlan_process_interrupt(dev); - - priv->irq_test_done = 1; - - ARLAN_DEBUG_EXIT("arlan_interrupt"); - return; - -} - - -static int arlan_close(struct net_device *dev) -{ - struct arlan_private *priv = (struct arlan_private *) dev->priv; - - if (!dev) - { - printk(KERN_CRIT "arlan: No Device\n"); - return 0; - } - priv = (struct arlan_private *) dev->priv; - if (!priv) - { - printk(KERN_CRIT "arlan: No Device priv \n"); - return 0; - } - ARLAN_DEBUG_ENTRY("arlan_close"); - - del_timer(&priv->timer); - - arlan_command(dev, ARLAN_COMMAND_POWERDOWN); - - IFDEBUG(ARLAN_DEBUG_STARTUP) - printk(KERN_NOTICE "%s: Closing device\n", dev->name); - - priv->open_time = 0; - netif_stop_queue(dev); - free_irq(dev->irq, dev); - - ARLAN_DEBUG_EXIT("arlan_close"); - return 0; -} - -#ifdef ARLAN_DEBUGGING -static long alignLong(volatile u_char * ptr) -{ - long ret; - memcpy_fromio(&ret, (void *) ptr, 4); - return ret; -} -#endif - -/* - * Get the current statistics. - * This may be called with the card open or closed. - */ - -static struct net_device_stats *arlan_statistics(struct net_device *dev) -{ - struct arlan_private *priv = (struct arlan_private *) dev->priv; - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - - - ARLAN_DEBUG_ENTRY("arlan_statistics"); - - /* Update the statistics from the device registers. */ - - READSHM(priv->stats.collisions, arlan->numReTransmissions, u_int); - READSHM(priv->stats.rx_crc_errors, arlan->numCRCErrors, u_int); - READSHM(priv->stats.rx_dropped, arlan->numFramesDiscarded, u_int); - READSHM(priv->stats.rx_fifo_errors, arlan->numRXBufferOverflows, u_int); - READSHM(priv->stats.rx_frame_errors, arlan->numReceiveFramesLost, u_int); - READSHM(priv->stats.rx_over_errors, arlan->numRXOverruns, u_int); - READSHM(priv->stats.rx_packets, arlan->numDatagramsReceived, u_int); - READSHM(priv->stats.tx_aborted_errors, arlan->numAbortErrors, u_int); - READSHM(priv->stats.tx_carrier_errors, arlan->numStatusTimeouts, u_int); - READSHM(priv->stats.tx_dropped, arlan->numDatagramsDiscarded, u_int); - READSHM(priv->stats.tx_fifo_errors, arlan->numTXUnderruns, u_int); - READSHM(priv->stats.tx_packets, arlan->numDatagramsTransmitted, u_int); - READSHM(priv->stats.tx_window_errors, arlan->numHoldOffs, u_int); - - ARLAN_DEBUG_EXIT("arlan_statistics"); - - return &priv->stats; -} - - -static void arlan_set_multicast(struct net_device *dev) -{ - volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; - struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; - int board_conf_needed = 0; - - - ARLAN_DEBUG_ENTRY("arlan_set_multicast"); - - if (dev->flags & IFF_PROMISC) - { - unsigned char recMode; - READSHM(recMode, arlan->receiveMode, u_char); - conf->receiveMode = (ARLAN_RCV_PROMISC | ARLAN_RCV_CONTROL); - if (conf->receiveMode != recMode) - board_conf_needed = 1; - } - else - { - /* turn off promiscuous mode */ - unsigned char recMode; - READSHM(recMode, arlan->receiveMode, u_char); - conf->receiveMode = ARLAN_RCV_CLEAN | ARLAN_RCV_CONTROL; - if (conf->receiveMode != recMode) - board_conf_needed = 1; - } - if (board_conf_needed) - arlan_command(dev, ARLAN_COMMAND_CONF); - - ARLAN_DEBUG_EXIT("arlan_set_multicast"); -} - - -int __init arlan_probe(struct net_device *dev) -{ - printk("Arlan driver %s\n", arlan_version); - - if (arlan_probe_everywhere(dev)) - return -ENODEV; - - arlans_found++; - - if (arlans_found == 1) - siteName = kmalloc(100, GFP_KERNEL); - return 0; -} - -#ifdef MODULE - -static int __init arlan_find_devices(void) -{ - int m; - int found = 0; - - ARLAN_DEBUG_ENTRY("arlan_find_devices"); - if (mem != 0 && numDevices == 1) /* Check a single specified location. */ - return 1; - for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000) - { - if (arlan_check_fingerprint(m) == 0) - found++; - } - ARLAN_DEBUG_EXIT("arlan_find_devices"); - - return found; -} - -int init_module(void) -{ - int i = 0; - - ARLAN_DEBUG_ENTRY("init_module"); - - if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN) - return -EINVAL; - - numDevices = arlan_find_devices(); - if (numDevices == 0) - return -ENODEV; - - siteName = kmalloc(100, GFP_KERNEL); - if(siteName==NULL) - return -ENOMEM; - - for (i = 0; i < numDevices && i < MAX_ARLANS; i++) - { - if (!arlan_allocate_device(i, NULL)) - return -ENOMEM; - - if (arlan_device[i] == NULL) - return -ENOMEM; - - if (probe) - arlan_probe_everywhere(arlan_device[i]); -// arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); - } - printk(KERN_INFO "Arlan driver %s\n", arlan_version); - ARLAN_DEBUG_EXIT("init_module"); - return 0; -} - - -void cleanup_module(void) -{ - int i = 0; - struct arlan_private *ap; - - ARLAN_DEBUG_ENTRY("cleanup_module"); - - IFDEBUG(ARLAN_DEBUG_SHUTDOWN) - printk(KERN_INFO "arlan: unloading module\n"); - for (i = 0; i < MAX_ARLANS; i++) - { - if (arlan_device[i]) - { - arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); - -// release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 ); - unregister_netdev(arlan_device[i]); - ap = arlan_device[i]->priv; - if (ap->init_etherdev_alloc) { - kfree(arlan_device[i]); - arlan_device[i] = NULL; - } else { - kfree(ap); - ap = NULL; - } - } - } - ARLAN_DEBUG_EXIT("cleanup_module"); -} - - -#endif -MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/arlan.h b/drivers/net/arlan.h --- a/drivers/net/arlan.h Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,577 +0,0 @@ -/* - * Copyright (C) 1997 Cullen Jennings - * Copyright (C) 1998 Elmer.Joandi@ut.ee, +37-255-13500 - * GNU General Public License applies - */ -#include - -#include -#include -#include -#include -#include -#include /* For the statistics structure. */ -#include /* For ARPHRD_ETHER */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -//#define ARLAN_DEBUGGING 1 - -#define ARLAN_PROC_INTERFACE -#define MAX_ARLANS 4 /* not more than 4 ! */ -#define ARLAN_PROC_SHM_DUMP /* shows all card registers, makes driver way larger */ - -#define ARLAN_MAX_MULTICAST_ADDRS 16 -#define ARLAN_RCV_CLEAN 0 -#define ARLAN_RCV_PROMISC 1 -#define ARLAN_RCV_CONTROL 2 - - -#ifdef CONFIG_PROC_FS -extern int init_arlan_proc(void); -#endif - -extern struct net_device *arlan_device[MAX_ARLANS]; -extern int arlan_debug; -extern char * siteName; -extern int arlan_entry_debug; -extern int arlan_exit_debug; -extern int testMemory; -extern const char* arlan_version; -extern int arlan_command(struct net_device * dev, int command); - -#define SIDUNKNOWN -1 -#define radioNodeIdUNKNOWN -1 -#define encryptionKeyUNKNOWN '\0'; -#define irqUNKNOWN 0 -#define memUNKNOWN 0 -#define debugUNKNOWN 0 -#define probeUNKNOWN 1 -#define numDevicesUNKNOWN 1 -#define testMemoryUNKNOWN 1 -#define spreadingCodeUNKNOWN 0 -#define channelNumberUNKNOWN 0 -#define channelSetUNKNOWN 0 -#define systemIdUNKNOWN -1 -#define registrationModeUNKNOWN -1 -#define siteNameUNKNOWN "LinuxSite" - - - -#define IFDEBUG( L ) if ( (L) & arlan_debug ) -#define ARLAN_FAKE_HDR_LEN 12 - -#ifdef ARLAN_DEBUGGING - #define DEBUG 1 - #define ARLAN_ENTRY_EXIT_DEBUGGING 1 - #define ARLAN_DEBUG(a,b) printk(KERN_DEBUG a, b) -#else - #define ARLAN_DEBUG(a,b) -#endif - -struct arlan_shmem -{ - /* Header Signature */ - volatile char textRegion[48]; - volatile u_char resetFlag; - volatile u_char diagnosticInfo; - volatile u_short diagnosticOffset; - volatile u_char _1[12]; - volatile u_char lanCardNodeId[6]; - volatile u_char broadcastAddress[6]; - volatile u_char hardwareType; - volatile u_char majorHardwareVersion; - volatile u_char minorHardwareVersion; - volatile u_char radioModule;// shows EEPROM, can be overridden at 0x111 - volatile u_char defaultChannelSet; // shows EEProm, can be overriiden at 0x10A - volatile u_char _2[47]; - - /* Control/Status Block - 0x0080 */ - volatile u_char interruptInProgress; /* not used by lancpu */ - volatile u_char cntrlRegImage; /* not used by lancpu */ - volatile u_char _3[13]; - volatile u_char dumpByte; - volatile u_char commandByte; /* non-zero = active */ - volatile u_char commandParameter[15]; - - /* Receive Status - 0x00a0 */ - volatile u_char rxStatus; /* 1- data, 2-control, 0xff - registr change */ - volatile u_char rxFrmType; - volatile u_short rxOffset; - volatile u_short rxLength; - volatile u_char rxSrc[6]; - volatile u_char rxBroadcastFlag; - volatile u_char rxQuality; - volatile u_char scrambled; - volatile u_char _4[1]; - - /* Transmit Status - 0x00b0 */ - volatile u_char txStatus; - volatile u_char txAckQuality; - volatile u_char numRetries; - volatile u_char _5[14]; - volatile u_char registeredRouter[6]; - volatile u_char backboneRouter[6]; - volatile u_char registrationStatus; - volatile u_char configuredStatusFlag; - volatile u_char _6[1]; - volatile u_char ultimateDestAddress[6]; - volatile u_char immedDestAddress[6]; - volatile u_char immedSrcAddress[6]; - volatile u_short rxSequenceNumber; - volatile u_char assignedLocaltalkAddress; - volatile u_char _7[27]; - - /* System Parameter Block */ - - /* - Driver Parameters (Novell Specific) */ - - volatile u_short txTimeout; - volatile u_short transportTime; - volatile u_char _8[4]; - - /* - Configuration Parameters */ - volatile u_char irqLevel; - volatile u_char spreadingCode; - volatile u_char channelSet; - volatile u_char channelNumber; - volatile u_short radioNodeId; - volatile u_char _9[2]; - volatile u_char scramblingDisable; - volatile u_char radioType; - volatile u_short routerId; - volatile u_char _10[9]; - volatile u_char txAttenuation; - volatile u_char systemId[4]; - volatile u_short globalChecksum; - volatile u_char _11[4]; - volatile u_short maxDatagramSize; - volatile u_short maxFrameSize; - volatile u_char maxRetries; - volatile u_char receiveMode; - volatile u_char priority; - volatile u_char rootOrRepeater; - volatile u_char specifiedRouter[6]; - volatile u_short fastPollPeriod; - volatile u_char pollDecay; - volatile u_char fastPollDelay[2]; - volatile u_char arlThreshold; - volatile u_char arlDecay; - volatile u_char _12[1]; - volatile u_short specRouterTimeout; - volatile u_char _13[5]; - - /* Scrambled Area */ - volatile u_char SID[4]; - volatile u_char encryptionKey[12]; - volatile u_char _14[2]; - volatile u_char waitTime[2]; - volatile u_char lParameter[2]; - volatile u_char _15[3]; - volatile u_short headerSize; - volatile u_short sectionChecksum; - - volatile u_char registrationMode; - volatile u_char registrationFill; - volatile u_short pollPeriod; - volatile u_short refreshPeriod; - volatile u_char name[16]; - volatile u_char NID[6]; - volatile u_char localTalkAddress; - volatile u_char codeFormat; - volatile u_char numChannels; - volatile u_char channel1; - volatile u_char channel2; - volatile u_char channel3; - volatile u_char channel4; - volatile u_char SSCode[59]; - - volatile u_char _16[0xC0]; - volatile u_short auxCmd; - volatile u_char dumpPtr[4]; - volatile u_char dumpVal; - volatile u_char _17[0x6A]; - volatile u_char wireTest; - volatile u_char _18[14]; - - /* Statistics Block - 0x0300 */ - volatile u_char hostcpuLock; - volatile u_char lancpuLock; - volatile u_char resetTime[18]; - - volatile u_char numDatagramsTransmitted[4]; - volatile u_char numReTransmissions[4]; - volatile u_char numFramesDiscarded[4]; - volatile u_char numDatagramsReceived[4]; - volatile u_char numDuplicateReceivedFrames[4]; - volatile u_char numDatagramsDiscarded[4]; - - volatile u_short maxNumReTransmitDatagram; - volatile u_short maxNumReTransmitFrames; - volatile u_short maxNumConsecutiveDuplicateFrames; - /* misaligned here so we have to go to characters */ - - volatile u_char numBytesTransmitted[4]; - volatile u_char numBytesReceived[4]; - volatile u_char numCRCErrors[4]; - volatile u_char numLengthErrors[4]; - volatile u_char numAbortErrors[4]; - volatile u_char numTXUnderruns[4]; - volatile u_char numRXOverruns[4]; - volatile u_char numHoldOffs[4]; - volatile u_char numFramesTransmitted[4]; - volatile u_char numFramesReceived[4]; - volatile u_char numReceiveFramesLost[4]; - volatile u_char numRXBufferOverflows[4]; - volatile u_char numFramesDiscardedAddrMismatch[4]; - volatile u_char numFramesDiscardedSIDMismatch[4]; - volatile u_char numPollsTransmistted[4]; - volatile u_char numPollAcknowledges[4]; - volatile u_char numStatusTimeouts[4]; - volatile u_char numNACKReceived[4]; - - volatile u_char _19[0x86]; - - volatile u_char txBuffer[0x800]; - volatile u_char rxBuffer[0x800]; - - volatile u_char _20[0x800]; - volatile u_char _21[0x3fb]; - volatile u_char configStatus; - volatile u_char _22; - volatile u_char progIOCtrl; - volatile u_char shareMBase; - volatile u_char controlRegister; -}; - -struct arlan_conf_stru { - int spreadingCode; - int channelSet; - int channelNumber; - int scramblingDisable; - int txAttenuation; - int systemId; - int maxDatagramSize; - int maxFrameSize; - int maxRetries; - int receiveMode; - int priority; - int rootOrRepeater; - int SID; - int radioNodeId; - int registrationMode; - int registrationFill; - int localTalkAddress; - int codeFormat; - int numChannels; - int channel1; - int channel2; - int channel3; - int channel4; - int txClear; - int txRetries; - int txRouting; - int txScrambled; - int rxParameter; - int txTimeoutMs; - int txAckTimeoutMs; - int waitCardTimeout; - int waitTime; - int lParameter; - int _15; - int headerSize; - int async; - int retries; - int tx_delay_ms; - int waitReTransmitPacketMaxSize; - int ReTransmitPacketMaxSize; - int fastReTransCount; - int driverRetransmissions; - int registrationInterrupts; - int hardwareType; - int radioType; - int writeRadioType; - int writeEEPROM; - char siteName[17]; - int measure_rate; - int in_speed; - int out_speed; - int in_speed10; - int out_speed10; - int in_speed_max; - int out_speed_max; - int pre_Command_Wait; - int rx_tweak1; - int rx_tweak2; - int tx_queue_len; -}; - -extern struct arlan_conf_stru arlan_conf[MAX_ARLANS]; - -struct TxParam -{ - volatile short offset; - volatile short length; - volatile u_char dest[6]; - volatile unsigned char clear; - volatile unsigned char retries; - volatile unsigned char routing; - volatile unsigned char scrambled; -}; - -struct TxRingPoint { - struct TxParam txParam; - - -}; - -#define TX_RING_SIZE 2 -/* Information that need to be kept for each board. */ -struct arlan_private { - struct net_device_stats stats; - long open_time; /* Useless example local info. */ - struct arlan_shmem * card; - struct arlan_shmem * conf; - struct TxParam txParam; - int multicastLength; - char multicastList[ARLAN_MAX_MULTICAST_ADDRS][6]; - int promiscModeEnabled; - struct arlan_conf_stru * Conf; - int bad; - int reset; - long long lastReset; - struct timer_list timer; - struct timer_list tx_delay_timer; - struct timer_list tx_retry_timer; - struct timer_list rx_check_timer; - struct semaphore card_lock; - atomic_t card_users; - atomic_t delay_on; - atomic_t retr_on; - int registrationLostCount; - int reRegisterExp; - int nof_tx; - int nof_tx_ack; - int last_nof_tx; - int last_nof_tx_ack; - int irq_test_done; - int last_command_was_rx; - struct TxParam txRing[TX_RING_SIZE]; - char reTransmitBuff[0x800]; - volatile int txLast; - volatile int txNew; - volatile int txOffset; - volatile char ReTransmitRequested; - volatile long long tx_done_delayed; - volatile long long registrationLastSeen; - volatile char under_command; - volatile char under_toggle; - volatile long long tx_last_sent; - volatile long long tx_last_cleared; - volatile u_char under_tx; - volatile int retransmissions; - volatile int tx_chain_active; - volatile int timer_chain_active; - volatile int interrupt_ack_requested; - volatile long command_lock; - volatile int rx_command_needed; - volatile int tx_command_needed; - volatile int waiting_command_mask; - volatile int card_polling_interval; - volatile int last_command_buff_free_time; - volatile int numResets; - volatile int under_reset; - volatile int under_config; - volatile int rx_command_given; - volatile long tx_command_given; - volatile long interrupt_processing_active; - volatile long long last_tx_time; - volatile long long last_rx_time; - volatile long long last_rx_int_ack_time; - int in_bytes; - int out_bytes; - int in_time; - int out_time; - int in_time10; - int out_time10; - int in_bytes10; - int out_bytes10; - int init_etherdev_alloc; -}; - - - -#define ARLAN_CLEAR 0x00 -#define ARLAN_RESET 0x01 -#define ARLAN_CHANNEL_ATTENTION 0x02 -#define ARLAN_INTERRUPT_ENABLE 0x04 -#define ARLAN_CLEAR_INTERRUPT 0x08 -#define ARLAN_POWER 0x40 -#define ARLAN_ACCESS 0x80 - -#define ARLAN_COM_CONF 0x01 -#define ARLAN_COM_RX_ENABLE 0x03 -#define ARLAN_COM_RX_ABORT 0x04 -#define ARLAN_COM_TX_ENABLE 0x05 -#define ARLAN_COM_TX_ABORT 0x06 -#define ARLAN_COM_NOP 0x07 -#define ARLAN_COM_STANDBY 0x08 -#define ARLAN_COM_ACTIVATE 0x09 -#define ARLAN_COM_GOTO_SLOW_POLL 0x0a -#define ARLAN_COM_INT 0x80 - - -#define TXLAST(dev) (((struct arlan_private *)dev->priv)->txRing[((struct arlan_private *)dev->priv)->txLast]) -#define TXHEAD(dev) (((struct arlan_private *)dev->priv)->txRing[0]) -#define TXTAIL(dev) (((struct arlan_private *)dev->priv)->txRing[1]) - -#define TXBuffStart(dev) \ - ((int)(((struct arlan_private *)dev->priv)->card)->txBuffer) - ((int)(((struct arlan_private *)dev->priv)->card) ) -#define TXBuffEnd(dev) \ - ((int)(((struct arlan_private *)dev->priv)->card)->rxBuffer) - ((int)(((struct arlan_private *)dev->priv)->card) - -#define READSHM(to,from,atype) {\ - atype tmp;\ - memcpy_fromio(&(tmp),&(from),sizeof(atype));\ - to = tmp;\ - } - -#define READSHMEM(from,atype)\ - atype from; \ - READSHM(from, arlan->from, atype); - -#define WRITESHM(to,from,atype) \ - { atype tmpSHM = from;\ - memcpy_toio(&(to),&tmpSHM,sizeof(atype));\ - } - -#define DEBUGSHM(levelSHM,stringSHM,stuff,atype) \ - { atype tmpSHM; \ - memcpy_fromio(&tmpSHM,&(stuff),sizeof(atype));\ - IFDEBUG(levelSHM) printk(stringSHM,tmpSHM);\ - } - -#define WRITESHMB(to, val) \ - writeb(val,&(to)) -#define READSHMB(to) \ - readb(&(to)) -#define WRITESHMS(to, val) \ - writew(val,&(to)) -#define READSHMS(to) \ - readw(&(to)) -#define WRITESHMI(to, val) \ - writel(val,&(to)) -#define READSHMI(to) \ - readl(&(to)) - - - - - -#define registrationBad(dev)\ - ( ( READSHMB(((struct arlan_private *)dev->priv)->card->registrationMode) > 0) && \ - ( READSHMB(((struct arlan_private *)dev->priv)->card->registrationStatus) == 0) ) - - -#define readControlRegister(dev)\ - READSHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage) - -#define writeControlRegister(dev, v){\ - WRITESHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage ,((v) &0xF) );\ - WRITESHMB(((struct arlan_private *)dev->priv)->card->controlRegister ,(v) );} - - -#define arlan_interrupt_lancpu(dev) {\ - int cr; \ - \ - priv->under_toggle++; \ - cr = readControlRegister(dev);\ - if (cr & ARLAN_CHANNEL_ATTENTION){ \ - writeControlRegister(dev, (cr & ~ARLAN_CHANNEL_ATTENTION));\ - }else \ - writeControlRegister(dev, (cr | ARLAN_CHANNEL_ATTENTION));\ - priv->under_toggle=0; \ -} - -#define clearChannelAttention(dev){ \ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CHANNEL_ATTENTION);} -#define setHardwareReset(dev) {\ - writeControlRegister(dev,readControlRegister(dev) | ARLAN_RESET);} -#define clearHardwareReset(dev) {\ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_RESET);} -#define setInterruptEnable(dev){\ - writeControlRegister(dev,readControlRegister(dev) | ARLAN_INTERRUPT_ENABLE) ;} -#define clearInterruptEnable(dev){\ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_INTERRUPT_ENABLE) ;} -#define setClearInterrupt(dev){\ - writeControlRegister(dev,readControlRegister(dev) | ARLAN_CLEAR_INTERRUPT) ;} -#define clearClearInterrupt(dev){\ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CLEAR_INTERRUPT);} -#define setPowerOff(dev){\ - writeControlRegister(dev,readControlRegister(dev) | (ARLAN_POWER && ARLAN_ACCESS));\ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);} -#define setPowerOn(dev){\ - writeControlRegister(dev,readControlRegister(dev) & ~(ARLAN_POWER)); } -#define arlan_lock_card_access(dev){\ - writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);} -#define arlan_unlock_card_access(dev){\ - writeControlRegister(dev,readControlRegister(dev) | ARLAN_ACCESS ); } - - - - -#define ARLAN_COMMAND_RX 0x000001 -#define ARLAN_COMMAND_NOOP 0x000002 -#define ARLAN_COMMAND_NOOPINT 0x000004 -#define ARLAN_COMMAND_TX 0x000008 -#define ARLAN_COMMAND_CONF 0x000010 -#define ARLAN_COMMAND_RESET 0x000020 -#define ARLAN_COMMAND_TX_ABORT 0x000040 -#define ARLAN_COMMAND_RX_ABORT 0x000080 -#define ARLAN_COMMAND_POWERDOWN 0x000100 -#define ARLAN_COMMAND_POWERUP 0x000200 -#define ARLAN_COMMAND_SLOW_POLL 0x000400 -#define ARLAN_COMMAND_ACTIVATE 0x000800 -#define ARLAN_COMMAND_INT_ACK 0x001000 -#define ARLAN_COMMAND_INT_ENABLE 0x002000 -#define ARLAN_COMMAND_WAIT_NOW 0x004000 -#define ARLAN_COMMAND_LONG_WAIT_NOW 0x008000 -#define ARLAN_COMMAND_STANDBY 0x010000 -#define ARLAN_COMMAND_INT_RACK 0x020000 -#define ARLAN_COMMAND_INT_RENABLE 0x040000 -#define ARLAN_COMMAND_CONF_WAIT 0x080000 -#define ARLAN_COMMAND_TBUSY_CLEAR 0x100000 -#define ARLAN_COMMAND_CLEAN_AND_CONF (ARLAN_COMMAND_TX_ABORT\ - | ARLAN_COMMAND_RX_ABORT\ - | ARLAN_COMMAND_CONF) -#define ARLAN_COMMAND_CLEAN_AND_RESET (ARLAN_COMMAND_TX_ABORT\ - | ARLAN_COMMAND_RX_ABORT\ - | ARLAN_COMMAND_RESET) - - - -#define ARLAN_DEBUG_CHAIN_LOCKS 0x00001 -#define ARLAN_DEBUG_RESET 0x00002 -#define ARLAN_DEBUG_TIMING 0x00004 -#define ARLAN_DEBUG_CARD_STATE 0x00008 -#define ARLAN_DEBUG_TX_CHAIN 0x00010 -#define ARLAN_DEBUG_MULTICAST 0x00020 -#define ARLAN_DEBUG_HEADER_DUMP 0x00040 -#define ARLAN_DEBUG_INTERRUPT 0x00080 -#define ARLAN_DEBUG_STARTUP 0x00100 -#define ARLAN_DEBUG_SHUTDOWN 0x00200 - diff -Nru a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c --- a/drivers/net/au1000_eth.c Thu Feb 20 23:19:22 2003 +++ b/drivers/net/au1000_eth.c Thu Feb 20 23:19:22 2003 @@ -110,7 +110,7 @@ /* - * Base address and interupt of the Au1xxx ethernet macs + * Base address and interrupt of the Au1xxx ethernet macs */ static struct { unsigned int port; @@ -465,7 +465,7 @@ mii_status = mdio_read(dev, phy_addr, MII_STATUS); if (mii_status == 0xffff || mii_status == 0x0000) - /* the mii is not accessable, try next one */ + /* the mii is not accessible, try next one */ continue; phy_id0 = mdio_read(dev, phy_addr, MII_PHY_ID0); diff -Nru a/drivers/net/bonding.c b/drivers/net/bonding.c --- a/drivers/net/bonding.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/bonding.c Thu Feb 20 23:19:23 2003 @@ -2547,7 +2547,7 @@ /* * in XOR mode, we determine the output device by performing xor on - * the source and destination hw adresses. If this device is not + * the source and destination hw addresses. If this device is not * enabled, find the next slave following this xor slave. */ static int bond_xmit_xor(struct sk_buff *skb, struct net_device *dev) diff -Nru a/drivers/net/dgrs_plx9060.h b/drivers/net/dgrs_plx9060.h --- a/drivers/net/dgrs_plx9060.h Thu Feb 20 23:19:21 2003 +++ b/drivers/net/dgrs_plx9060.h Thu Feb 20 23:19:21 2003 @@ -18,7 +18,7 @@ #define PCI_INT_LINE 0x3C /* - * Registers accessable directly from PCI and local side. + * Registers accessible directly from PCI and local side. * Offset is from PCI side. Add PLX_LCL_OFFSET for local address. */ #define PLX_LCL_OFFSET 0x80 /* Offset of regs from local side */ diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c --- a/drivers/net/e1000/e1000_main.c Thu Feb 20 23:19:21 2003 +++ b/drivers/net/e1000/e1000_main.c Thu Feb 20 23:19:21 2003 @@ -1150,7 +1150,7 @@ * * The set_multi entry point is called whenever the multicast address * list or the network interface flags are updated. This routine is - * resposible for configuring the hardware for proper multicast, + * responsible for configuring the hardware for proper multicast, * promiscuous mode, and all-multi behavior. **/ diff -Nru a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c --- a/drivers/net/irda/vlsi_ir.c Thu Feb 20 23:19:19 2003 +++ b/drivers/net/irda/vlsi_ir.c Thu Feb 20 23:19:19 2003 @@ -26,7 +26,6 @@ MODULE_DESCRIPTION("IrDA SIR/MIR/FIR driver for VLSI 82C147"); MODULE_AUTHOR("Martin Diehl "); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; #define DRIVER_NAME "vlsi_ir" #define DRIVER_VERSION "v0.4" diff -Nru a/drivers/net/lasi_82596.c b/drivers/net/lasi_82596.c --- a/drivers/net/lasi_82596.c Thu Feb 20 23:19:20 2003 +++ b/drivers/net/lasi_82596.c Thu Feb 20 23:19:20 2003 @@ -181,7 +181,6 @@ MODULE_LICENSE("GPL"); MODULE_PARM(i596_debug, "i"); MODULE_PARM_DESC(i596_debug, "lasi_82596 debug mask"); -EXPORT_NO_SYMBOLS; /* Copy frames shorter than rx_copybreak, otherwise pass on up in * a full sized sk_buff. Value of 100 stolen from tulip.c (!alpha). diff -Nru a/drivers/net/natsemi.c b/drivers/net/natsemi.c --- a/drivers/net/natsemi.c Thu Feb 20 23:19:19 2003 +++ b/drivers/net/natsemi.c Thu Feb 20 23:19:19 2003 @@ -2608,7 +2608,7 @@ if (wol) { /* restart the NIC in WOL mode. * The nic must be stopped for this. - * FIXME: use the WOL interupt + * FIXME: use the WOL interrupt */ enable_wol_mode(dev, 0); } else { diff -Nru a/drivers/net/pcmcia/Kconfig b/drivers/net/pcmcia/Kconfig --- a/drivers/net/pcmcia/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/net/pcmcia/Kconfig Thu Feb 20 23:19:23 2003 @@ -153,34 +153,6 @@ The module will be called ibmtr_cs. If you want to compile it as a module, say M here and read . -config NET_PCMCIA_RADIO - bool "Pcmcia Wireless LAN" - depends on NET_PCMCIA - help - Say Y here if you would like to use a PCMCIA (PC-card) device to - connect to a wireless local area network. Then say Y to the driver - for your particular card below. - - To use your PC-cards, you will need supporting software from David - Hinds' pcmcia-cs package (see the file - for location). You also want to check out the PCMCIA-HOWTO, - available from . - -config PCMCIA_RAYCS - tristate "Aviator/Raytheon 2.4MHz wireless support" - depends on NET_PCMCIA_RADIO && PCMCIA - ---help--- - Say Y here if you intend to attach an Aviator/Raytheon PCMCIA - (PC-card) wireless Ethernet networking card to your computer. - Please read the file for - details. - - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called ray_cs. If you want to compile it as a - module, say M here and read . If - unsure, say N. - config AIRONET4500_CS tristate "Aironet 4500/4800 PCMCIA support" depends on NET_PCMCIA_RADIO && AIRONET4500 && PCMCIA diff -Nru a/drivers/net/pcmcia/Makefile b/drivers/net/pcmcia/Makefile --- a/drivers/net/pcmcia/Makefile Thu Feb 20 23:19:19 2003 +++ b/drivers/net/pcmcia/Makefile Thu Feb 20 23:19:19 2003 @@ -14,7 +14,6 @@ obj-$(CONFIG_PCMCIA_AXNET) += axnet_cs.o # 16-bit wireless client drivers -obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o obj-$(CONFIG_AIRONET4500_CS) += aironet4500_cs.o obj-$(CONFIG_PCMCIA_IBMTR) += ibmtr_cs.o diff -Nru a/drivers/net/pcmcia/ray_cs.c b/drivers/net/pcmcia/ray_cs.c --- a/drivers/net/pcmcia/ray_cs.c Thu Feb 20 23:19:21 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,3012 +0,0 @@ -/*============================================================================= - * - * A PCMCIA client driver for the Raylink wireless LAN card. - * The starting point for this module was the skeleton.c in the - * PCMCIA 2.9.12 package written by David Hinds, dahinds@users.sourceforge.net - * - * - * Copyright (c) 1998 Corey Thomas (corey@world.std.com) - * - * This driver is free software; you can redistribute it and/or modify - * it under the terms of version 2 only of the GNU General Public License as - * published by the Free Software Foundation. - * - * It 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 - * - * Changes: - * Arnaldo Carvalho de Melo - 08/08/2000 - * - reorganize kmallocs in ray_attach, checking all for failure - * and releasing the previous allocations if one fails - * - * -=============================================================================*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_NET_PCMCIA_RADIO -#include - -#include -#include -#include -#include - -/* Warning : these stuff will slow down the driver... */ -#define WIRELESS_SPY /* Enable spying addresses */ -/* Definitions we need for spy */ -typedef struct iw_statistics iw_stats; -typedef struct iw_quality iw_qual; -typedef u_char mac_addr[ETH_ALEN]; /* Hardware address */ -#endif /* CONFIG_NET_PCMCIA_RADIO */ - -#include "rayctl.h" -#include "ray_cs.h" - -/* All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If - you do not define PCMCIA_DEBUG at all, all the debug code will be - left out. If you compile with PCMCIA_DEBUG=0, the debug code will - be present but disabled -- but it can then be enabled for specific - modules at load time with a 'pc_debug=#' option to insmod. -*/ - -#ifdef RAYLINK_DEBUG -#define PCMCIA_DEBUG RAYLINK_DEBUG -#endif -#ifdef PCMCIA_DEBUG -static int ray_debug; -static int pc_debug = PCMCIA_DEBUG; -MODULE_PARM(pc_debug, "i"); -/* #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args); */ -#define DEBUG(n, args...) if (pc_debug>(n)) printk(args); -#else -#define DEBUG(n, args...) -#endif -/** Prototypes based on PCMCIA skeleton driver *******************************/ -static void ray_config(dev_link_t *link); -static void ray_release(u_long arg); -static int ray_event(event_t event, int priority, event_callback_args_t *args); -static dev_link_t *ray_attach(void); -static void ray_detach(dev_link_t *); - -/***** Prototypes indicated by device structure ******************************/ -static int ray_dev_close(struct net_device *dev); -static int ray_dev_config(struct net_device *dev, struct ifmap *map); -static struct net_device_stats *ray_get_stats(struct net_device *dev); -static int ray_dev_init(struct net_device *dev); -static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); -static int ray_open(struct net_device *dev); -static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev); -static void set_multicast_list(struct net_device *dev); -static void ray_update_multi_list(struct net_device *dev, int all); -static int translate_frame(ray_dev_t *local, struct tx_msg *ptx, - unsigned char *data, int len); -static void ray_build_header(ray_dev_t *local, struct tx_msg *ptx, UCHAR msg_type, - unsigned char *data); -static void untranslate(ray_dev_t *local, struct sk_buff *skb, int len); -#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ -static iw_stats * ray_get_wireless_stats(struct net_device * dev); -#endif /* WIRELESS_EXT > 7 */ - -/***** Prototypes for raylink functions **************************************/ -static int asc_to_int(char a); -static void authenticate(ray_dev_t *local); -static int build_auth_frame(ray_dev_t *local, UCHAR *dest, int auth_type); -static void authenticate_timeout(u_long); -static int get_free_ccs(ray_dev_t *local); -static int get_free_tx_ccs(ray_dev_t *local); -static void init_startup_params(ray_dev_t *local); -static int parse_addr(char *in_str, UCHAR *out); -static int ray_hw_xmit(unsigned char* data, int len, struct net_device* dev, UCHAR type); -static int ray_init(struct net_device *dev); -static int interrupt_ecf(ray_dev_t *local, int ccs); -static void ray_reset(struct net_device *dev); -static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len); -static void verify_dl_startup(u_long); - -/* Prototypes for interrpt time functions **********************************/ -static void ray_interrupt (int reg, void *dev_id, struct pt_regs *regs); -static void clear_interrupt(ray_dev_t *local); -static void rx_deauthenticate(ray_dev_t *local, struct rcs *prcs, - unsigned int pkt_addr, int rx_len); -static int copy_from_rx_buff(ray_dev_t *local, UCHAR *dest, int pkt_addr, int len); -static void ray_rx(struct net_device *dev, ray_dev_t *local, struct rcs *prcs); -static void release_frag_chain(ray_dev_t *local, struct rcs *prcs); -static void rx_authenticate(ray_dev_t *local, struct rcs *prcs, - unsigned int pkt_addr, int rx_len); -static void rx_data(struct net_device *dev, struct rcs *prcs, unsigned int pkt_addr, - int rx_len); -static void associate(ray_dev_t *local); - -/* Card command functions */ -static int dl_startup_params(struct net_device *dev); -static void join_net(u_long local); -static void start_net(u_long local); -/* void start_net(ray_dev_t *local); */ - -/* Create symbol table for registering with kernel in init_module */ -EXPORT_SYMBOL(ray_dev_ioctl); -EXPORT_SYMBOL(ray_rx); - -/*===========================================================================*/ -/* Parameters that can be set with 'insmod' */ -/* Bit map of interrupts to choose from */ -/* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */ -static u_long irq_mask = 0xdeb8; - -/* ADHOC=0, Infrastructure=1 */ -static int net_type = ADHOC; - -/* Hop dwell time in Kus (1024 us units defined by 802.11) */ -static int hop_dwell = 128; - -/* Beacon period in Kus */ -static int beacon_period = 256; - -/* power save mode (0 = off, 1 = save power) */ -static int psm; - -/* String for network's Extended Service Set ID. 32 Characters max */ -static char *essid; - -/* Default to encapsulation unless translation requested */ -static int translate = 1; - -static int country = USA; - -static int sniffer; - -static int bc; - -/* 48 bit physical card address if overriding card's real physical - * address is required. Since IEEE 802.11 addresses are 48 bits - * like ethernet, an int can't be used, so a string is used. To - * allow use of addresses starting with a decimal digit, the first - * character must be a letter and will be ignored. This letter is - * followed by up to 12 hex digits which are the address. If less - * than 12 digits are used, the address will be left filled with 0's. - * Note that bit 0 of the first byte is the broadcast bit, and evil - * things will happen if it is not 0 in a card address. - */ -static char *phy_addr = NULL; - - -/* The dev_info variable is the "key" that is used to match up this - device driver with appropriate cards, through the card configuration - database. -*/ -static dev_info_t dev_info = "ray_cs"; - -/* A linked list of "instances" of the ray device. Each actual - PCMCIA card corresponds to one device instance, and is described - by one dev_link_t structure (defined in ds.h). -*/ -static dev_link_t *dev_list = NULL; - -/* A dev_link_t structure has fields for most things that are needed - to keep track of a socket, but there will usually be some device - specific information that also needs to be kept track of. The - 'priv' pointer in a dev_link_t structure can be used to point to - a device-specific private data structure, like this. -*/ -static unsigned int ray_mem_speed = 500; - -MODULE_AUTHOR("Corey Thomas "); -MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver"); -MODULE_LICENSE("GPL"); - -MODULE_PARM(irq_mask,"i"); -MODULE_PARM(net_type,"i"); -MODULE_PARM(hop_dwell,"i"); -MODULE_PARM(beacon_period,"i"); -MODULE_PARM(psm,"i"); -MODULE_PARM(essid,"s"); -MODULE_PARM(translate,"i"); -MODULE_PARM(country,"i"); -MODULE_PARM(sniffer,"i"); -MODULE_PARM(bc,"i"); -MODULE_PARM(phy_addr,"s"); -MODULE_PARM(ray_mem_speed, "i"); - -static UCHAR b5_default_startup_parms[] = { - 0, 0, /* Adhoc station */ - 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, /* Active scan, CA Mode */ - 0, 0, 0, 0, 0, 0, /* No default MAC addr */ - 0x7f, 0xff, /* Frag threshold */ - 0x00, 0x80, /* Hop time 128 Kus*/ - 0x01, 0x00, /* Beacon period 256 Kus */ - 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/ - 0x1d, 0x82, 0x4e, /* SIFS, DIFS, PIFS */ - 0x7f, 0xff, /* RTS threshold */ - 0x04, 0xe2, 0x38, 0xA4, /* scan_dwell, max_scan_dwell */ - 0x05, /* assoc resp timeout thresh */ - 0x08, 0x02, 0x08, /* adhoc, infra, super cycle max*/ - 0, /* Promiscuous mode */ - 0x0c, 0x0bd, /* Unique word */ - 0x32, /* Slot time */ - 0xff, 0xff, /* roam-low snr, low snr count */ - 0x05, 0xff, /* Infra, adhoc missed bcn thresh */ - 0x01, 0x0b, 0x4f, /* USA, hop pattern, hop pat length */ -/* b4 - b5 differences start here */ - 0x00, 0x3f, /* CW max */ - 0x00, 0x0f, /* CW min */ - 0x04, 0x08, /* Noise gain, limit offset */ - 0x28, 0x28, /* det rssi, med busy offsets */ - 7, /* det sync thresh */ - 0, 2, 2, /* test mode, min, max */ - 0, /* allow broadcast SSID probe resp */ - 0, 0, /* privacy must start, can join */ - 2, 0, 0, 0, 0, 0, 0, 0 /* basic rate set */ -}; - -static UCHAR b4_default_startup_parms[] = { - 0, 0, /* Adhoc station */ - 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, /* Active scan, CA Mode */ - 0, 0, 0, 0, 0, 0, /* No default MAC addr */ - 0x7f, 0xff, /* Frag threshold */ - 0x02, 0x00, /* Hop time */ - 0x00, 0x01, /* Beacon period */ - 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/ - 0x1d, 0x82, 0xce, /* SIFS, DIFS, PIFS */ - 0x7f, 0xff, /* RTS threshold */ - 0xfb, 0x1e, 0xc7, 0x5c, /* scan_dwell, max_scan_dwell */ - 0x05, /* assoc resp timeout thresh */ - 0x04, 0x02, 0x4, /* adhoc, infra, super cycle max*/ - 0, /* Promiscuous mode */ - 0x0c, 0x0bd, /* Unique word */ - 0x4e, /* Slot time (TBD seems wrong)*/ - 0xff, 0xff, /* roam-low snr, low snr count */ - 0x05, 0xff, /* Infra, adhoc missed bcn thresh */ - 0x01, 0x0b, 0x4e, /* USA, hop pattern, hop pat length */ -/* b4 - b5 differences start here */ - 0x3f, 0x0f, /* CW max, min */ - 0x04, 0x08, /* Noise gain, limit offset */ - 0x28, 0x28, /* det rssi, med busy offsets */ - 7, /* det sync thresh */ - 0, 2, 2 /* test mode, min, max*/ -}; -/*===========================================================================*/ -static unsigned char eth2_llc[] = {0xaa, 0xaa, 3, 0, 0, 0}; - -static char hop_pattern_length[] = { 1, - USA_HOP_MOD, EUROPE_HOP_MOD, - JAPAN_HOP_MOD, KOREA_HOP_MOD, - SPAIN_HOP_MOD, FRANCE_HOP_MOD, - ISRAEL_HOP_MOD, AUSTRALIA_HOP_MOD, - JAPAN_TEST_HOP_MOD -}; - -static char rcsid[] = "Raylink/WebGear wireless LAN - Corey "; - -/*===========================================================================*/ -static void cs_error(client_handle_t handle, int func, int ret) -{ - error_info_t err = { func, ret }; - pcmcia_report_error(handle, &err); -} -/*====================================================================== - - This bit of code is used to avoid unregistering network devices - at inappropriate times. 2.2 and later kernels are fairly picky - about when this can happen. - -======================================================================*/ - -static void flush_stale_links(void) -{ - dev_link_t *link, *next; - for (link = dev_list; link; link = next) { - next = link->next; - if (link->state & DEV_STALE_LINK) - ray_detach(link); - } -} - -/*============================================================================= - ray_attach() creates an "instance" of the driver, allocating - local data structures for one device. The device is registered - with Card Services. - The dev_link structure is initialized, but we don't actually - configure the card at this point -- we wait until we receive a - card insertion event. -=============================================================================*/ -static dev_link_t *ray_attach(void) -{ - client_reg_t client_reg; - dev_link_t *link; - ray_dev_t *local; - int ret; - struct net_device *dev; - - DEBUG(1, "ray_attach()\n"); - flush_stale_links(); - - /* Initialize the dev_link_t structure */ - link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); - - if (!link) - return NULL; - - /* Allocate space for private device-specific data */ - dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); - - if (!dev) - goto fail_alloc_dev; - - local = kmalloc(sizeof(ray_dev_t), GFP_KERNEL); - - if (!local) - goto fail_alloc_local; - - memset(link, 0, sizeof(struct dev_link_t)); - memset(dev, 0, sizeof(struct net_device)); - memset(local, 0, sizeof(ray_dev_t)); - - init_timer(&link->release); - link->release.function = &ray_release; - link->release.data = (u_long)link; - - /* The io structure describes IO port mapping. None used here */ - link->io.NumPorts1 = 0; - link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; - link->io.IOAddrLines = 5; - - /* Interrupt setup. For PCMCIA, driver takes what's given */ - link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; - link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID; - link->irq.IRQInfo2 = irq_mask; - link->irq.Handler = &ray_interrupt; - - /* General socket configuration */ - link->conf.Attributes = CONF_ENABLE_IRQ; - link->conf.Vcc = 50; - link->conf.IntType = INT_MEMORY_AND_IO; - link->conf.ConfigIndex = 1; - link->conf.Present = PRESENT_OPTION; - - link->priv = dev; - link->irq.Instance = dev; - - dev->priv = local; - local->finder = link; - local->card_status = CARD_INSERTED; - local->authentication_state = UNAUTHENTICATED; - local->num_multi = 0; - DEBUG(2,"ray_attach link = %p, dev = %p, local = %p, intr = %p\n", - link,dev,local,&ray_interrupt); - - /* Raylink entries in the device structure */ - dev->hard_start_xmit = &ray_dev_start_xmit; - dev->set_config = &ray_dev_config; - dev->get_stats = &ray_get_stats; - dev->do_ioctl = &ray_dev_ioctl; -#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ - dev->get_wireless_stats = ray_get_wireless_stats; -#endif - - dev->set_multicast_list = &set_multicast_list; - - DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n"); - ether_setup(dev); - dev->init = &ray_dev_init; - dev->open = &ray_open; - dev->stop = &ray_dev_close; - netif_stop_queue(dev); - - /* Register with Card Services */ - link->next = dev_list; - dev_list = link; - client_reg.dev_info = &dev_info; - client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; - client_reg.EventMask = - CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | - CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | - CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; - client_reg.event_handler = &ray_event; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - - DEBUG(2,"ray_cs ray_attach calling CardServices(RegisterClient...)\n"); - - init_timer(&local->timer); - - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - printk("ray_cs ray_attach RegisterClient unhappy - detaching\n"); - cs_error(link->handle, RegisterClient, ret); - ray_detach(link); - return NULL; - } - DEBUG(2,"ray_cs ray_attach ending\n"); - return link; - -fail_alloc_local: - kfree(dev); -fail_alloc_dev: - kfree(link); - return NULL; -} /* ray_attach */ -/*============================================================================= - This deletes a driver "instance". The device is de-registered - with Card Services. If it has been released, all local data - structures are freed. Otherwise, the structures will be freed - when the device is released. -=============================================================================*/ -static void ray_detach(dev_link_t *link) -{ - dev_link_t **linkp; - - DEBUG(1, "ray_detach(0x%p)\n", link); - - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) - if (*linkp == link) break; - if (*linkp == NULL) - return; - - /* If the device is currently configured and active, we won't - actually delete it yet. Instead, it is marked so that when - the release() function is called, that will trigger a proper - detach(). - */ - del_timer(&link->release); - if (link->state & DEV_CONFIG) { - ray_release((u_long)link); - if(link->state & DEV_STALE_CONFIG) { - link->state |= DEV_STALE_LINK; - return; - } - } - - /* Break the link with Card Services */ - if (link->handle) - pcmcia_deregister_client(link->handle); - - /* Unlink device structure, free pieces */ - *linkp = link->next; - if (link->priv) { - struct net_device *dev = link->priv; - if (link->dev) unregister_netdev(dev); - if (dev->priv) - kfree(dev->priv); - kfree(link->priv); - } - kfree(link); - DEBUG(2,"ray_cs ray_detach ending\n"); -} /* ray_detach */ -/*============================================================================= - ray_config() is run after a CARD_INSERTION event - is received, to configure the PCMCIA socket, and to make the - ethernet device available to the system. -=============================================================================*/ -#define CS_CHECK(fn, args...) \ -while ((last_ret=fn(args))!=0) goto cs_failed -#define MAX_TUPLE_SIZE 128 -static void ray_config(dev_link_t *link) -{ - client_handle_t handle = link->handle; - tuple_t tuple; - cisparse_t parse; - int last_fn = 0, last_ret = 0; - int i; - u_char buf[MAX_TUPLE_SIZE]; - win_req_t req; - memreq_t mem; - struct net_device *dev = (struct net_device *)link->priv; - ray_dev_t *local = (ray_dev_t *)dev->priv; - - DEBUG(1, "ray_config(0x%p)\n", link); - - /* This reads the card's CONFIG tuple to find its configuration regs */ - tuple.DesiredTuple = CISTPL_CONFIG; - CS_CHECK(pcmcia_get_first_tuple, handle, &tuple); - tuple.TupleData = buf; - tuple.TupleDataMax = MAX_TUPLE_SIZE; - tuple.TupleOffset = 0; - CS_CHECK(pcmcia_get_tuple_data, handle, &tuple); - CS_CHECK(pcmcia_parse_tuple, handle, &tuple, &parse); - link->conf.ConfigBase = parse.config.base; - link->conf.Present = parse.config.rmask[0]; - - /* Determine card type and firmware version */ - buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0; - tuple.DesiredTuple = CISTPL_VERS_1; - CS_CHECK(pcmcia_get_first_tuple, handle, &tuple); - tuple.TupleData = buf; - tuple.TupleDataMax = MAX_TUPLE_SIZE; - tuple.TupleOffset = 2; - CS_CHECK(pcmcia_get_tuple_data, handle, &tuple); - - for (i=0; istate |= DEV_CONFIG; - - /* Now allocate an interrupt line. Note that this does not - actually assign a handler to the interrupt. - */ - CS_CHECK(pcmcia_request_irq, link->handle, &link->irq); - dev->irq = link->irq.AssignedIRQ; - - /* This actually configures the PCMCIA socket -- setting up - the I/O windows and the interrupt mapping. - */ - CS_CHECK(pcmcia_request_configuration, link->handle, &link->conf); - -/*** Set up 32k window for shared memory (transmit and control) ************/ - req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; - req.Base = 0; - req.Size = 0x8000; - req.AccessSpeed = ray_mem_speed; - CS_CHECK(pcmcia_request_window, &link->handle, &req, &link->win); - mem.CardOffset = 0x0000; mem.Page = 0; - CS_CHECK(pcmcia_map_mem_page, link->win, &mem); - local->sram = (UCHAR *)(ioremap(req.Base,req.Size)); - -/*** Set up 16k window for shared memory (receive buffer) ***************/ - req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; - req.Base = 0; - req.Size = 0x4000; - req.AccessSpeed = ray_mem_speed; - CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->rmem_handle); - mem.CardOffset = 0x8000; mem.Page = 0; - CS_CHECK(pcmcia_map_mem_page, local->rmem_handle, &mem); - local->rmem = (UCHAR *)(ioremap(req.Base,req.Size)); - -/*** Set up window for attribute memory ***********************************/ - req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | WIN_ENABLE | WIN_USE_WAIT; - req.Base = 0; - req.Size = 0x1000; - req.AccessSpeed = ray_mem_speed; - CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->amem_handle); - mem.CardOffset = 0x0000; mem.Page = 0; - CS_CHECK(pcmcia_map_mem_page, local->amem_handle, &mem); - local->amem = (UCHAR *)(ioremap(req.Base,req.Size)); - - DEBUG(3,"ray_config sram=%p\n",local->sram); - DEBUG(3,"ray_config rmem=%p\n",local->rmem); - DEBUG(3,"ray_config amem=%p\n",local->amem); - if (ray_init(dev) < 0) { - ray_release((u_long)link); - return; - } - - i = register_netdev(dev); - if (i != 0) { - printk("ray_config register_netdev() failed\n"); - ray_release((u_long)link); - return; - } - - strcpy(local->node.dev_name, dev->name); - link->dev = &local->node; - - link->state &= ~DEV_CONFIG_PENDING; - printk(KERN_INFO "%s: RayLink, irq %d, hw_addr ", - dev->name, dev->irq); - for (i = 0; i < 6; i++) - printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); - - return; - -cs_failed: - cs_error(link->handle, last_fn, last_ret); - - ray_release((u_long)link); -} /* ray_config */ -/*===========================================================================*/ -static int ray_init(struct net_device *dev) -{ - int i; - UCHAR *p; - struct ccs *pccs; - ray_dev_t *local = (ray_dev_t *)dev->priv; - dev_link_t *link = local->finder; - DEBUG(1, "ray_init(0x%p)\n", dev); - if (!(link->state & DEV_PRESENT)) { - DEBUG(0,"ray_init - device not present\n"); - return -1; - } - - local->net_type = net_type; - local->sta_type = TYPE_STA; - - /* Copy the startup results to local memory */ - memcpy_fromio(&local->startup_res, local->sram + ECF_TO_HOST_BASE,\ - sizeof(struct startup_res_6)); - - /* Check Power up test status and get mac address from card */ - if (local->startup_res.startup_word != 0x80) { - printk(KERN_INFO "ray_init ERROR card status = %2x\n", - local->startup_res.startup_word); - local->card_status = CARD_INIT_ERROR; - return -1; - } - - local->fw_ver = local->startup_res.firmware_version[0]; - local->fw_bld = local->startup_res.firmware_version[1]; - local->fw_var = local->startup_res.firmware_version[2]; - DEBUG(1,"ray_init firmware version %d.%d \n",local->fw_ver, local->fw_bld); - - local->tib_length = 0x20; - if ((local->fw_ver == 5) && (local->fw_bld >= 30)) - local->tib_length = local->startup_res.tib_length; - DEBUG(2,"ray_init tib_length = 0x%02x\n", local->tib_length); - /* Initialize CCS's to buffer free state */ - pccs = (struct ccs *)(local->sram + CCS_BASE); - for (i=0; ibuffer_status); - } - init_startup_params(local); - - /* copy mac address to startup parameters */ - if (parse_addr(phy_addr, local->sparm.b4.a_mac_addr)) - { - p = local->sparm.b4.a_mac_addr; - } - else - { - memcpy(&local->sparm.b4.a_mac_addr, - &local->startup_res.station_addr, ADDRLEN); - p = local->sparm.b4.a_mac_addr; - } - - clear_interrupt(local); /* Clear any interrupt from the card */ - local->card_status = CARD_AWAITING_PARAM; - DEBUG(2,"ray_init ending\n"); - return 0; -} /* ray_init */ -/*===========================================================================*/ -/* Download startup parameters to the card and command it to read them */ -static int dl_startup_params(struct net_device *dev) -{ - int ccsindex; - ray_dev_t *local = (ray_dev_t *)dev->priv; - struct ccs *pccs; - dev_link_t *link = local->finder; - - DEBUG(1,"dl_startup_params entered\n"); - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs dl_startup_params - device not present\n"); - return -1; - } - - /* Copy parameters to host to ECF area */ - if (local->fw_ver == 0x55) - memcpy_toio(local->sram + HOST_TO_ECF_BASE, &local->sparm.b4, - sizeof(struct b4_startup_params)); - else - memcpy_toio(local->sram + HOST_TO_ECF_BASE, &local->sparm.b5, - sizeof(struct b5_startup_params)); - - - /* Fill in the CCS fields for the ECF */ - if ((ccsindex = get_free_ccs(local)) < 0) return -1; - local->dl_param_ccs = ccsindex; - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - writeb(CCS_DOWNLOAD_STARTUP_PARAMS, &pccs->cmd); - DEBUG(2,"dl_startup_params start ccsindex = %d\n", local->dl_param_ccs); - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - printk(KERN_INFO "ray dl_startup_params failed - " - "ECF not ready for intr\n"); - local->card_status = CARD_DL_PARAM_ERROR; - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - return -2; - } - local->card_status = CARD_DL_PARAM; - /* Start kernel timer to wait for dl startup to complete. */ - local->timer.expires = jiffies + HZ/2; - local->timer.data = (long)local; - local->timer.function = &verify_dl_startup; - add_timer(&local->timer); - DEBUG(2,"ray_cs dl_startup_params started timer for verify_dl_startup\n"); - return 0; -} /* dl_startup_params */ -/*===========================================================================*/ -static void init_startup_params(ray_dev_t *local) -{ - int i; - - if (country > JAPAN_TEST) country = USA; - else - if (country < USA) country = USA; - /* structure for hop time and beacon period is defined here using - * New 802.11D6.1 format. Card firmware is still using old format - * until version 6. - * Before After - * a_hop_time ms byte a_hop_time ms byte - * a_hop_time 2s byte a_hop_time ls byte - * a_hop_time ls byte a_beacon_period ms byte - * a_beacon_period a_beacon_period ls byte - * - * a_hop_time = uS a_hop_time = KuS - * a_beacon_period = hops a_beacon_period = KuS - */ /* 64ms = 010000 */ - if (local->fw_ver == 0x55) { - memcpy((UCHAR *)&local->sparm.b4, b4_default_startup_parms, - sizeof(struct b4_startup_params)); - /* Translate sane kus input values to old build 4/5 format */ - /* i = hop time in uS truncated to 3 bytes */ - i = (hop_dwell * 1024) & 0xffffff; - local->sparm.b4.a_hop_time[0] = (i >> 16) & 0xff; - local->sparm.b4.a_hop_time[1] = (i >> 8) & 0xff; - local->sparm.b4.a_beacon_period[0] = 0; - local->sparm.b4.a_beacon_period[1] = - ((beacon_period/hop_dwell) - 1) & 0xff; - local->sparm.b4.a_curr_country_code = country; - local->sparm.b4.a_hop_pattern_length = - hop_pattern_length[(int)country] - 1; - if (bc) - { - local->sparm.b4.a_ack_timeout = 0x50; - local->sparm.b4.a_sifs = 0x3f; - } - } - else { /* Version 5 uses real kus values */ - memcpy((UCHAR *)&local->sparm.b5, b5_default_startup_parms, - sizeof(struct b5_startup_params)); - - local->sparm.b5.a_hop_time[0] = (hop_dwell >> 8) & 0xff; - local->sparm.b5.a_hop_time[1] = hop_dwell & 0xff; - local->sparm.b5.a_beacon_period[0] = (beacon_period >> 8) & 0xff; - local->sparm.b5.a_beacon_period[1] = beacon_period & 0xff; - if (psm) - local->sparm.b5.a_power_mgt_state = 1; - local->sparm.b5.a_curr_country_code = country; - local->sparm.b5.a_hop_pattern_length = - hop_pattern_length[(int)country]; - } - - local->sparm.b4.a_network_type = net_type & 0x01; - local->sparm.b4.a_acting_as_ap_status = TYPE_STA; - - if (essid != NULL) - strncpy(local->sparm.b4.a_current_ess_id, essid, ESSID_SIZE); -} /* init_startup_params */ -/*===========================================================================*/ -static void verify_dl_startup(u_long data) -{ - ray_dev_t *local = (ray_dev_t *)data; - struct ccs *pccs = ((struct ccs *)(local->sram + CCS_BASE)) + local->dl_param_ccs; - UCHAR status; - dev_link_t *link = local->finder; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs verify_dl_startup - device not present\n"); - return; - } -#ifdef PCMCIA_DEBUG - if (pc_debug > 2) { - int i; - printk(KERN_DEBUG "verify_dl_startup parameters sent via ccs %d:\n", - local->dl_param_ccs); - for (i=0; isram + HOST_TO_ECF_BASE + i)); - } - printk("\n"); - } -#endif - - status = readb(&pccs->buffer_status); - if (status!= CCS_BUFFER_FREE) - { - printk(KERN_INFO "Download startup params failed. Status = %d\n", - status); - local->card_status = CARD_DL_PARAM_ERROR; - return; - } - if (local->sparm.b4.a_network_type == ADHOC) - start_net((u_long)local); - else - join_net((u_long)local); - - return; -} /* end verify_dl_startup */ -/*===========================================================================*/ -/* Command card to start a network */ -static void start_net(u_long data) -{ - ray_dev_t *local = (ray_dev_t *)data; - struct ccs *pccs; - int ccsindex; - dev_link_t *link = local->finder; - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs start_net - device not present\n"); - return; - } - /* Fill in the CCS fields for the ECF */ - if ((ccsindex = get_free_ccs(local)) < 0) return; - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - writeb(CCS_START_NETWORK, &pccs->cmd); - writeb(0, &pccs->var.start_network.update_param); - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(1,"ray start net failed - card not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - return; - } - local->card_status = CARD_DOING_ACQ; - return; -} /* end start_net */ -/*===========================================================================*/ -/* Command card to join a network */ -static void join_net(u_long data) -{ - ray_dev_t *local = (ray_dev_t *)data; - - struct ccs *pccs; - int ccsindex; - dev_link_t *link = local->finder; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs join_net - device not present\n"); - return; - } - /* Fill in the CCS fields for the ECF */ - if ((ccsindex = get_free_ccs(local)) < 0) return; - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - writeb(CCS_JOIN_NETWORK, &pccs->cmd); - writeb(0, &pccs->var.join_network.update_param); - writeb(0, &pccs->var.join_network.net_initiated); - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(1,"ray join net failed - card not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - return; - } - local->card_status = CARD_DOING_ACQ; - return; -} -/*============================================================================ - After a card is removed, ray_release() will unregister the net - device, and release the PCMCIA configuration. If the device is - still open, this will be postponed until it is closed. -=============================================================================*/ -static void ray_release(u_long arg) -{ - dev_link_t *link = (dev_link_t *)arg; - struct net_device *dev = link->priv; - ray_dev_t *local = dev->priv; - int i; - - DEBUG(1, "ray_release(0x%p)\n", link); - /* If the device is currently in use, we won't release until it - is actually closed. - */ - if (link->open) { - DEBUG(1, "ray_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; - } - del_timer(&local->timer); - link->state &= ~DEV_CONFIG; - - iounmap(local->sram); - iounmap(local->rmem); - iounmap(local->amem); - /* Do bother checking to see if these succeed or not */ - i = pcmcia_release_window(link->win); - if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i); - i = pcmcia_release_window(local->amem_handle); - if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i); - i = pcmcia_release_window(local->rmem_handle); - if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i); - i = pcmcia_release_configuration(link->handle); - if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseConfiguration ret = %x\n",i); - i = pcmcia_release_irq(link->handle, &link->irq); - if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseIRQ ret = %x\n",i); - - DEBUG(2,"ray_release ending\n"); -} /* ray_release */ -/*============================================================================= - The card status event handler. Mostly, this schedules other - stuff to run after an event is received. A CARD_REMOVAL event - also sets some flags to discourage the net drivers from trying - to talk to the card any more. - - When a CARD_REMOVAL event is received, we immediately set a flag - to block future accesses to this device. All the functions that - actually access the device should check this flag to make sure - the card is still present. -=============================================================================*/ -static int ray_event(event_t event, int priority, - event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - struct net_device *dev = link->priv; - ray_dev_t *local = (ray_dev_t *)dev->priv; - DEBUG(1, "ray_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - netif_device_detach(dev); - if (link->state & DEV_CONFIG) { - mod_timer(&link->release, jiffies + HZ/20); - del_timer(&local->timer); - } - break; - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - ray_config(link); - break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) { - if (link->open) - netif_device_detach(dev); - - pcmcia_release_configuration(link->handle); - } - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - pcmcia_request_configuration(link->handle, &link->conf); - if (link->open) { - ray_reset(dev); - netif_device_attach(dev); - } - } - break; - } - return 0; - DEBUG(2,"ray_event ending\n"); -} /* ray_event */ -/*===========================================================================*/ -int ray_dev_init(struct net_device *dev) -{ -#ifdef RAY_IMMEDIATE_INIT - int i; -#endif /* RAY_IMMEDIATE_INIT */ - ray_dev_t *local = dev->priv; - dev_link_t *link = local->finder; - - DEBUG(1,"ray_dev_init(dev=%p)\n",dev); - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_dev_init - device not present\n"); - return -1; - } -#ifdef RAY_IMMEDIATE_INIT - /* Download startup parameters */ - if ( (i = dl_startup_params(dev)) < 0) - { - printk(KERN_INFO "ray_dev_init dl_startup_params failed - " - "returns 0x%x\n",i); - return -1; - } -#else /* RAY_IMMEDIATE_INIT */ - /* Postpone the card init so that we can still configure the card, - * for example using the Wireless Extensions. The init will happen - * in ray_open() - Jean II */ - DEBUG(1,"ray_dev_init: postponing card init to ray_open() ; Status = %d\n", - local->card_status); -#endif /* RAY_IMMEDIATE_INIT */ - - /* copy mac and broadcast addresses to linux device */ - memcpy(&dev->dev_addr, &local->sparm.b4.a_mac_addr, ADDRLEN); - memset(dev->broadcast, 0xff, ETH_ALEN); - - DEBUG(2,"ray_dev_init ending\n"); - return 0; -} -/*===========================================================================*/ -static int ray_dev_config(struct net_device *dev, struct ifmap *map) -{ - ray_dev_t *local = dev->priv; - dev_link_t *link = local->finder; - /* Dummy routine to satisfy device structure */ - DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev,map); - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_dev_config - device not present\n"); - return -1; - } - - return 0; -} -/*===========================================================================*/ -static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - ray_dev_t *local = dev->priv; - dev_link_t *link = local->finder; - short length = skb->len; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_dev_start_xmit - device not present\n"); - return -1; - } - DEBUG(3,"ray_dev_start_xmit(skb=%p, dev=%p)\n",skb,dev); - if (local->authentication_state == NEED_TO_AUTH) { - DEBUG(0,"ray_cs Sending authentication request.\n"); - if (!build_auth_frame (local, local->auth_id, OPEN_AUTH_REQUEST)) { - local->authentication_state = AUTHENTICATED; - netif_stop_queue(dev); - return 1; - } - } - - if (length < ETH_ZLEN) - { - skb = skb_padto(skb, ETH_ZLEN); - if (skb == NULL) - return 0; - length = ETH_ZLEN; - } - switch (ray_hw_xmit( skb->data, length, dev, DATA_TYPE)) { - case XMIT_NO_CCS: - case XMIT_NEED_AUTH: - netif_stop_queue(dev); - return 1; - case XMIT_NO_INTR: - case XMIT_MSG_BAD: - case XMIT_OK: - default: - dev->trans_start = jiffies; - dev_kfree_skb(skb); - return 0; - } - return 0; -} /* ray_dev_start_xmit */ -/*===========================================================================*/ -static int ray_hw_xmit(unsigned char* data, int len, struct net_device* dev, - UCHAR msg_type) -{ - ray_dev_t *local = (ray_dev_t *)dev->priv; - struct ccs *pccs; - int ccsindex; - int offset; - struct tx_msg *ptx; /* Address of xmit buffer in PC space */ - short int addr; /* Address of xmit buffer in card space */ - - DEBUG(3,"ray_hw_xmit(data=%p, len=%d, dev=%p)\n",data,len,dev); - if (len + TX_HEADER_LENGTH > TX_BUF_SIZE) - { - printk(KERN_INFO "ray_hw_xmit packet too large: %d bytes\n",len); - return XMIT_MSG_BAD; - } - switch (ccsindex = get_free_tx_ccs(local)) { - case ECCSBUSY: - DEBUG(2,"ray_hw_xmit tx_ccs table busy\n"); - case ECCSFULL: - DEBUG(2,"ray_hw_xmit No free tx ccs\n"); - case ECARDGONE: - netif_stop_queue(dev); - return XMIT_NO_CCS; - default: - break; - } - addr = TX_BUF_BASE + (ccsindex << 11); - - if (msg_type == DATA_TYPE) { - local->stats.tx_bytes += len; - local->stats.tx_packets++; - } - - ptx = (struct tx_msg *)(local->sram + addr); - - ray_build_header(local, ptx, msg_type, data); - if (translate) { - offset = translate_frame(local, ptx, data, len); - } - else { /* Encapsulate frame */ - /* TBD TIB length will move address of ptx->var */ - memcpy_toio(&ptx->var, data, len); - offset = 0; - } - - /* fill in the CCS */ - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - len += TX_HEADER_LENGTH + offset; - writeb(CCS_TX_REQUEST, &pccs->cmd); - writeb(addr >> 8, &pccs->var.tx_request.tx_data_ptr[0]); - writeb(local->tib_length, &pccs->var.tx_request.tx_data_ptr[1]); - writeb(len >> 8, &pccs->var.tx_request.tx_data_length[0]); - writeb(len & 0xff, &pccs->var.tx_request.tx_data_length[1]); -/* TBD still need psm_cam? */ - writeb(PSM_CAM, &pccs->var.tx_request.pow_sav_mode); - writeb(local->net_default_tx_rate, &pccs->var.tx_request.tx_rate); - writeb(0, &pccs->var.tx_request.antenna); - DEBUG(3,"ray_hw_xmit default_tx_rate = 0x%x\n",\ - local->net_default_tx_rate); - - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(2,"ray_hw_xmit failed - ECF not ready for intr\n"); -/* TBD very inefficient to copy packet to buffer, and then not - send it, but the alternative is to queue the messages and that - won't be done for a while. Maybe set tbusy until a CCS is free? -*/ - writeb(CCS_BUFFER_FREE, &pccs->buffer_status); - return XMIT_NO_INTR; - } - return XMIT_OK; -} /* end ray_hw_xmit */ -/*===========================================================================*/ -static int translate_frame(ray_dev_t *local, struct tx_msg *ptx, unsigned char *data, - int len) -{ - unsigned short int proto = ((struct ethhdr *)data)->h_proto; - if (ntohs(proto) >= 1536) { /* DIX II ethernet frame */ - DEBUG(3,"ray_cs translate_frame DIX II\n"); - /* Copy LLC header to card buffer */ - memcpy_toio((UCHAR *)&ptx->var, eth2_llc, sizeof(eth2_llc)); - memcpy_toio( ((UCHAR *)&ptx->var) + sizeof(eth2_llc), (UCHAR *)&proto, 2); - if ((proto == 0xf380) || (proto == 0x3781)) { - /* This is the selective translation table, only 2 entries */ - writeb(0xf8, (UCHAR *) &((struct snaphdr_t *)ptx->var)->org[3]); - } - /* Copy body of ethernet packet without ethernet header */ - memcpy_toio((UCHAR *)&ptx->var + sizeof(struct snaphdr_t), \ - data + ETH_HLEN, len - ETH_HLEN); - return (int) sizeof(struct snaphdr_t) - ETH_HLEN; - } - else { /* already 802 type, and proto is length */ - DEBUG(3,"ray_cs translate_frame 802\n"); - if (proto == 0xffff) { /* evil netware IPX 802.3 without LLC */ - DEBUG(3,"ray_cs translate_frame evil IPX\n"); - memcpy_toio((UCHAR *)&ptx->var, data + ETH_HLEN, len - ETH_HLEN); - return 0 - ETH_HLEN; - } - memcpy_toio((UCHAR *)&ptx->var, data + ETH_HLEN, len - ETH_HLEN); - return 0 - ETH_HLEN; - } - /* TBD do other frame types */ -} /* end translate_frame */ -/*===========================================================================*/ -static void ray_build_header(ray_dev_t *local, struct tx_msg *ptx, UCHAR msg_type, - unsigned char *data) -{ - writeb(PROTOCOL_VER | msg_type, &ptx->mac.frame_ctl_1); -/*** IEEE 802.11 Address field assignments ************* - TODS FROMDS addr_1 addr_2 addr_3 addr_4 -Adhoc 0 0 dest src (terminal) BSSID N/A -AP to Terminal 0 1 dest AP(BSSID) source N/A -Terminal to AP 1 0 AP(BSSID) src (terminal) dest N/A -AP to AP 1 1 dest AP src AP dest source -*******************************************************/ - if (local->net_type == ADHOC) { - writeb(0, &ptx->mac.frame_ctl_2); - memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, 2 * ADDRLEN); - memcpy_toio(ptx->mac.addr_3, local->bss_id, ADDRLEN); - } - else /* infrastructure */ - { - if (local->sparm.b4.a_acting_as_ap_status) - { - writeb(FC2_FROM_DS, &ptx->mac.frame_ctl_2); - memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, ADDRLEN); - memcpy_toio(ptx->mac.addr_2, local->bss_id, 6); - memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_source, ADDRLEN); - } - else /* Terminal */ - { - writeb(FC2_TO_DS, &ptx->mac.frame_ctl_2); - memcpy_toio(ptx->mac.addr_1, local->bss_id, ADDRLEN); - memcpy_toio(ptx->mac.addr_2, ((struct ethhdr *)data)->h_source, ADDRLEN); - memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_dest, ADDRLEN); - } - } -} /* end encapsulate_frame */ - - -/*===========================================================================*/ - -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) -{ - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "ray_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; -} - -/*====================================================================*/ - -static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - ray_dev_t *local = (ray_dev_t *)dev->priv; - dev_link_t *link = local->finder; - int err = 0; -#if WIRELESS_EXT > 7 - struct iwreq *wrq = (struct iwreq *) ifr; -#endif /* WIRELESS_EXT > 7 */ - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_dev_ioctl - device not present\n"); - return -1; - } - DEBUG(2,"ray_cs IOCTL dev=%p, ifr=%p, cmd = 0x%x\n",dev,ifr,cmd); - /* Validate the command */ - switch (cmd) - { - case SIOCETHTOOL: - err = netdev_ethtool_ioctl(dev, (void *) ifr->ifr_data); - break; - -#if WIRELESS_EXT > 7 - /* --------------- WIRELESS EXTENSIONS --------------- */ - /* Get name */ - case SIOCGIWNAME: - strcpy(wrq->u.name, "IEEE 802.11-FH"); - break; - - /* Get frequency/channel */ - case SIOCGIWFREQ: - wrq->u.freq.m = local->sparm.b5.a_hop_pattern; - wrq->u.freq.e = 0; - break; - - /* Set frequency/channel */ - case SIOCSIWFREQ: - /* Reject if card is already initialised */ - if(local->card_status != CARD_AWAITING_PARAM) - { - err = -EBUSY; - break; - } - - /* Setting by channel number */ - if ((wrq->u.freq.m > USA_HOP_MOD) || (wrq->u.freq.e > 0)) - err = -EOPNOTSUPP; - else - local->sparm.b5.a_hop_pattern = wrq->u.freq.m; - break; - - /* Get current network name (ESSID) */ - case SIOCGIWESSID: - if (wrq->u.data.pointer) - { - char essid[IW_ESSID_MAX_SIZE + 1]; - /* Get the essid that was set */ - memcpy(essid, local->sparm.b5.a_current_ess_id, - IW_ESSID_MAX_SIZE); - essid[IW_ESSID_MAX_SIZE] = '\0'; - - /* Push it out ! */ - wrq->u.data.length = strlen(essid) + 1; - wrq->u.data.flags = 1; /* active */ - copy_to_user(wrq->u.data.pointer, essid, sizeof(essid)); - } - break; - - /* Set desired network name (ESSID) */ - case SIOCSIWESSID: - /* Reject if card is already initialised */ - if(local->card_status != CARD_AWAITING_PARAM) - { - err = -EBUSY; - break; - } - - if (wrq->u.data.pointer) - { - char card_essid[IW_ESSID_MAX_SIZE + 1]; - - /* Check if we asked for `any' */ - if(wrq->u.data.flags == 0) - { - /* Corey : can you do that ? */ - err = -EOPNOTSUPP; - } - else - { - /* Check the size of the string */ - if(wrq->u.data.length > - IW_ESSID_MAX_SIZE + 1) - { - err = -E2BIG; - break; - } - if (copy_from_user(card_essid, - wrq->u.data.pointer, - wrq->u.data.length)) { - err = -EFAULT; - break; - } - card_essid[IW_ESSID_MAX_SIZE] = '\0'; - - /* Set the ESSID in the card */ - memcpy(local->sparm.b5.a_current_ess_id, card_essid, - IW_ESSID_MAX_SIZE); - } - } - break; - - /* Get current Access Point (BSSID in our case) */ - case SIOCGIWAP: - memcpy(wrq->u.ap_addr.sa_data, local->bss_id, ETH_ALEN); - wrq->u.ap_addr.sa_family = ARPHRD_ETHER; - break; - - /* Get the current bit-rate */ - case SIOCGIWRATE: - if(local->net_default_tx_rate == 3) - wrq->u.bitrate.value = 2000000; /* Hum... */ - else - wrq->u.bitrate.value = local->net_default_tx_rate * 500000; - wrq->u.bitrate.fixed = 0; /* We are in auto mode */ - break; - - /* Set the desired bit-rate */ - case SIOCSIWRATE: - /* Check if rate is in range */ - if((wrq->u.bitrate.value != 1000000) && - (wrq->u.bitrate.value != 2000000)) - { - err = -EINVAL; - break; - } - /* Hack for 1.5 Mb/s instead of 2 Mb/s */ - if((local->fw_ver == 0x55) && /* Please check */ - (wrq->u.bitrate.value == 2000000)) - local->net_default_tx_rate = 3; - else - local->net_default_tx_rate = wrq->u.bitrate.value/500000; - break; - - /* Get the current RTS threshold */ - case SIOCGIWRTS: - wrq->u.rts.value = (local->sparm.b5.a_rts_threshold[0] << 8) - + local->sparm.b5.a_rts_threshold[1]; -#if WIRELESS_EXT > 8 - wrq->u.rts.disabled = (wrq->u.rts.value == 32767); -#endif /* WIRELESS_EXT > 8 */ - wrq->u.rts.fixed = 1; - break; - - /* Set the desired RTS threshold */ - case SIOCSIWRTS: - { - int rthr = wrq->u.rts.value; - - /* Reject if card is already initialised */ - if(local->card_status != CARD_AWAITING_PARAM) - { - err = -EBUSY; - break; - } - - /* if(wrq->u.rts.fixed == 0) we should complain */ -#if WIRELESS_EXT > 8 - if(wrq->u.rts.disabled) - rthr = 32767; - else -#endif /* WIRELESS_EXT > 8 */ - if((rthr < 0) || (rthr > 2347)) /* What's the max packet size ??? */ - { - err = -EINVAL; - break; - } - local->sparm.b5.a_rts_threshold[0] = (rthr >> 8) & 0xFF; - local->sparm.b5.a_rts_threshold[1] = rthr & 0xFF; - } - break; - - /* Get the current fragmentation threshold */ - case SIOCGIWFRAG: - wrq->u.frag.value = (local->sparm.b5.a_frag_threshold[0] << 8) - + local->sparm.b5.a_frag_threshold[1]; -#if WIRELESS_EXT > 8 - wrq->u.frag.disabled = (wrq->u.frag.value == 32767); -#endif /* WIRELESS_EXT > 8 */ - wrq->u.frag.fixed = 1; - break; - - /* Set the desired fragmentation threshold */ - case SIOCSIWFRAG: - { - int fthr = wrq->u.frag.value; - - /* Reject if card is already initialised */ - if(local->card_status != CARD_AWAITING_PARAM) - { - err = -EBUSY; - break; - } - - /* if(wrq->u.frag.fixed == 0) should complain */ -#if WIRELESS_EXT > 8 - if(wrq->u.frag.disabled) - fthr = 32767; - else -#endif /* WIRELESS_EXT > 8 */ - if((fthr < 256) || (fthr > 2347)) /* To check out ! */ - { - err = -EINVAL; - break; - } - local->sparm.b5.a_frag_threshold[0] = (fthr >> 8) & 0xFF; - local->sparm.b5.a_frag_threshold[1] = fthr & 0xFF; - } - break; - -#endif /* WIRELESS_EXT > 7 */ -#if WIRELESS_EXT > 8 - - /* Get the current mode of operation */ - case SIOCGIWMODE: - if(local->sparm.b5.a_network_type) - wrq->u.mode = IW_MODE_INFRA; - else - wrq->u.mode = IW_MODE_ADHOC; - break; - - /* Set the current mode of operation */ - case SIOCSIWMODE: - { - char card_mode = 1; - - /* Reject if card is already initialised */ - if(local->card_status != CARD_AWAITING_PARAM) - { - err = -EBUSY; - break; - } - - switch (wrq->u.mode) - { - case IW_MODE_ADHOC: - card_mode = 0; - // Fall through - case IW_MODE_INFRA: - local->sparm.b5.a_network_type = card_mode; - break; - default: - err = -EINVAL; - } - } - break; - -#endif /* WIRELESS_EXT > 8 */ -#if WIRELESS_EXT > 7 - /* ------------------ IWSPY SUPPORT ------------------ */ - /* Define the range (variations) of above parameters */ - case SIOCGIWRANGE: - /* Basic checking... */ - if(wrq->u.data.pointer != (caddr_t) 0) - { - struct iw_range range; - memset((char *) &range, 0, sizeof(struct iw_range)); - - /* Set the length (very important for backward compatibility) */ - wrq->u.data.length = sizeof(struct iw_range); - -#if WIRELESS_EXT > 10 - /* Set the Wireless Extension versions */ - range.we_version_compiled = WIRELESS_EXT; - range.we_version_source = 9; -#endif /* WIRELESS_EXT > 10 */ - - /* Set information in the range struct */ - range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */ - range.num_channels = hop_pattern_length[(int)country]; - range.num_frequency = 0; - range.max_qual.qual = 0; - range.max_qual.level = 255; /* What's the correct value ? */ - range.max_qual.noise = 255; /* Idem */ - range.num_bitrates = 2; - range.bitrate[0] = 1000000; /* 1 Mb/s */ - range.bitrate[1] = 2000000; /* 2 Mb/s */ - - /* Copy structure to the user buffer */ - if(copy_to_user(wrq->u.data.pointer, &range, - sizeof(struct iw_range))) - err = -EFAULT; - } - break; - -#ifdef WIRELESS_SPY - /* Set addresses to spy */ - case SIOCSIWSPY: - /* Check the number of addresses */ - if(wrq->u.data.length > IW_MAX_SPY) - { - err = -E2BIG; - break; - } - local->spy_number = wrq->u.data.length; - - /* If there is some addresses to copy */ - if(local->spy_number > 0) - { - struct sockaddr address[IW_MAX_SPY]; - int i; - - /* Copy addresses to the driver */ - if(copy_from_user(address, wrq->u.data.pointer, - sizeof(struct sockaddr) * local->spy_number)) - { - err = -EFAULT; - break; - } - - /* Copy addresses to the lp structure */ - for(i = 0; i < local->spy_number; i++) - memcpy(local->spy_address[i], address[i].sa_data, ETH_ALEN); - - /* Reset structure... */ - memset(local->spy_stat, 0x00, sizeof(iw_qual) * IW_MAX_SPY); - -#ifdef DEBUG_IOCTL_INFO - printk(KERN_DEBUG "SetSpy - Set of new addresses is :\n"); - for(i = 0; i < local->spy_number; i++) - printk(KERN_DEBUG "%02X:%02X:%02X:%02X:%02X:%02X\n", - local->spy_address[i][0], - local->spy_address[i][1], - local->spy_address[i][2], - local->spy_address[i][3], - local->spy_address[i][4], - local->spy_address[i][5]); -#endif /* DEBUG_IOCTL_INFO */ - } - break; - - /* Get the spy list and spy stats */ - case SIOCGIWSPY: - /* Set the number of addresses */ - wrq->u.data.length = local->spy_number; - - /* If the user want to have the addresses back... */ - if((local->spy_number > 0) && (wrq->u.data.pointer != (caddr_t) 0)) - { - struct sockaddr address[IW_MAX_SPY]; - int i; - - /* Copy addresses from the lp structure */ - for(i = 0; i < local->spy_number; i++) - { - memcpy(address[i].sa_data, local->spy_address[i], ETH_ALEN); - address[i].sa_family = ARPHRD_ETHER; - } - - /* Copy addresses to the user buffer */ - if(copy_to_user(wrq->u.data.pointer, address, - sizeof(struct sockaddr) * local->spy_number)) - { - err = -EFAULT; - break; - } - - /* Copy stats to the user buffer (just after) */ - if(copy_to_user(wrq->u.data.pointer + - (sizeof(struct sockaddr) * local->spy_number), - local->spy_stat, sizeof(iw_qual) * local->spy_number)) - { - err = -EFAULT; - break; - } - - /* Reset updated flags */ - for(i = 0; i < local->spy_number; i++) - local->spy_stat[i].updated = 0x0; - } /* if(pointer != NULL) */ - - break; -#endif /* WIRELESS_SPY */ - - /* ------------------ PRIVATE IOCTL ------------------ */ -#ifndef SIOCIWFIRSTPRIV -#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE -#endif /* SIOCIWFIRSTPRIV */ -#define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */ -#define SIOCGIPFRAMING SIOCIWFIRSTPRIV + 1 /* Get framing mode */ -#define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */ - case SIOCSIPFRAMING: - if(!capable(CAP_NET_ADMIN)) /* For private IOCTLs, we need to check permissions */ - { - err = -EPERM; - break; - } - translate = *(wrq->u.name); /* Set framing mode */ - break; - case SIOCGIPFRAMING: - *(wrq->u.name) = translate; - break; - case SIOCGIPCOUNTRY: - *(wrq->u.name) = country; - break; - case SIOCGIWPRIV: - /* Export our "private" intercace */ - if(wrq->u.data.pointer != (caddr_t) 0) - { - struct iw_priv_args priv[] = - { /* cmd, set_args, get_args, name */ - { SIOCSIPFRAMING, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "set_framing" }, - { SIOCGIPFRAMING, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_framing" }, - { SIOCGIPCOUNTRY, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_country" }, - }; - /* Set the number of ioctl available */ - wrq->u.data.length = 3; - /* Copy structure to the user buffer */ - if(copy_to_user(wrq->u.data.pointer, (u_char *) priv, - sizeof(priv))) - err = -EFAULT; - } - break; -#endif /* WIRELESS_EXT > 7 */ - - - default: - DEBUG(0,"ray_dev_ioctl cmd = 0x%x\n", cmd); - err = -EOPNOTSUPP; - } - return err; -} /* end ray_dev_ioctl */ -/*===========================================================================*/ -#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ -static iw_stats * ray_get_wireless_stats(struct net_device * dev) -{ - ray_dev_t * local = (ray_dev_t *) dev->priv; - dev_link_t *link = local->finder; - struct status *p = (struct status *)(local->sram + STATUS_BASE); - - if(local == (ray_dev_t *) NULL) - return (iw_stats *) NULL; - - local->wstats.status = local->card_status; -#ifdef WIRELESS_SPY - if((local->spy_number > 0) && (local->sparm.b5.a_network_type == 0)) - { - /* Get it from the first node in spy list */ - local->wstats.qual.qual = local->spy_stat[0].qual; - local->wstats.qual.level = local->spy_stat[0].level; - local->wstats.qual.noise = local->spy_stat[0].noise; - local->wstats.qual.updated = local->spy_stat[0].updated; - } -#endif /* WIRELESS_SPY */ - - if((link->state & DEV_PRESENT)) { - local->wstats.qual.noise = readb(&p->rxnoise); - local->wstats.qual.updated |= 4; - } - - return &local->wstats; -} /* end ray_get_wireless_stats */ -#endif /* WIRELESS_EXT > 7 */ -/*===========================================================================*/ -static int ray_open(struct net_device *dev) -{ - dev_link_t *link; - ray_dev_t *local = (ray_dev_t *)dev->priv; - - MOD_INC_USE_COUNT; - - DEBUG(1, "ray_open('%s')\n", dev->name); - - for (link = dev_list; link; link = link->next) - if (link->priv == dev) break; - if (!DEV_OK(link)) { - MOD_DEC_USE_COUNT; - return -ENODEV; - } - - if (link->open == 0) local->num_multi = 0; - link->open++; - - /* If the card is not started, time to start it ! - Jean II */ - if(local->card_status == CARD_AWAITING_PARAM) { - int i; - - DEBUG(1,"ray_open: doing init now !\n"); - - /* Download startup parameters */ - if ( (i = dl_startup_params(dev)) < 0) - { - printk(KERN_INFO "ray_dev_init dl_startup_params failed - " - "returns 0x%x\n",i); - return -1; - } - } - - if (sniffer) netif_stop_queue(dev); - else netif_start_queue(dev); - - DEBUG(2,"ray_open ending\n"); - return 0; -} /* end ray_open */ -/*===========================================================================*/ -static int ray_dev_close(struct net_device *dev) -{ - dev_link_t *link; - - DEBUG(1, "ray_dev_close('%s')\n", dev->name); - - for (link = dev_list; link; link = link->next) - if (link->priv == dev) break; - if (link == NULL) - return -ENODEV; - - link->open--; - netif_stop_queue(dev); - if (link->state & DEV_STALE_CONFIG) - mod_timer(&link->release, jiffies + HZ/20); - - /* In here, we should stop the hardware (stop card from beeing active) - * and set local->card_status to CARD_AWAITING_PARAM, so that while the - * card is closed we can chage its configuration. - * Probably also need a COR reset to get sane state - Jean II */ - - MOD_DEC_USE_COUNT; - - return 0; -} /* end ray_dev_close */ -/*===========================================================================*/ -static void ray_reset(struct net_device *dev) { - DEBUG(1,"ray_reset entered\n"); - return; -} -/*===========================================================================*/ -/* Cause a firmware interrupt if it is ready for one */ -/* Return nonzero if not ready */ -static int interrupt_ecf(ray_dev_t *local, int ccs) -{ - int i = 50; - dev_link_t *link = local->finder; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); - return -1; - } - DEBUG(2,"interrupt_ecf(local=%p, ccs = 0x%x\n",local,ccs); - - while ( i && - (readb(local->amem + CIS_OFFSET + ECF_INTR_OFFSET) & ECF_INTR_SET)) - i--; - if (i == 0) { - DEBUG(2,"ray_cs interrupt_ecf card not ready for interrupt\n"); - return -1; - } - /* Fill the mailbox, then kick the card */ - writeb(ccs, local->sram + SCB_BASE); - writeb(ECF_INTR_SET, local->amem + CIS_OFFSET + ECF_INTR_OFFSET); - return 0; -} /* interrupt_ecf */ -/*===========================================================================*/ -/* Get next free transmit CCS */ -/* Return - index of current tx ccs */ -static int get_free_tx_ccs(ray_dev_t *local) -{ - int i; - struct ccs *pccs = (struct ccs *)(local->sram + CCS_BASE); - dev_link_t *link = local->finder; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); - return ECARDGONE; - } - - if (test_and_set_bit(0,&local->tx_ccs_lock)) { - DEBUG(1,"ray_cs tx_ccs_lock busy\n"); - return ECCSBUSY; - } - - for (i=0; i < NUMBER_OF_TX_CCS; i++) { - if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { - writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); - writeb(CCS_END_LIST, &(pccs+i)->link); - local->tx_ccs_lock = 0; - return i; - } - } - local->tx_ccs_lock = 0; - DEBUG(2,"ray_cs ERROR no free tx CCS for raylink card\n"); - return ECCSFULL; -} /* get_free_tx_ccs */ -/*===========================================================================*/ -/* Get next free CCS */ -/* Return - index of current ccs */ -static int get_free_ccs(ray_dev_t *local) -{ - int i; - struct ccs *pccs = (struct ccs *)(local->sram + CCS_BASE); - dev_link_t *link = local->finder; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs get_free_ccs - device not present\n"); - return ECARDGONE; - } - if (test_and_set_bit(0,&local->ccs_lock)) { - DEBUG(1,"ray_cs ccs_lock busy\n"); - return ECCSBUSY; - } - - for (i = NUMBER_OF_TX_CCS; i < NUMBER_OF_CCS; i++) { - if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { - writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); - writeb(CCS_END_LIST, &(pccs+i)->link); - local->ccs_lock = 0; - return i; - } - } - local->ccs_lock = 0; - DEBUG(1,"ray_cs ERROR no free CCS for raylink card\n"); - return ECCSFULL; -} /* get_free_ccs */ -/*===========================================================================*/ -static void authenticate_timeout(u_long data) -{ - ray_dev_t *local = (ray_dev_t *)data; - del_timer(&local->timer); - printk(KERN_INFO "ray_cs Authentication with access point failed" - " - timeout\n"); - join_net((u_long)local); -} -/*===========================================================================*/ -static int asc_to_int(char a) -{ - if (a < '0') return -1; - if (a <= '9') return (a - '0'); - if (a < 'A') return -1; - if (a <= 'F') return (10 + a - 'A'); - if (a < 'a') return -1; - if (a <= 'f') return (10 + a - 'a'); - return -1; -} -/*===========================================================================*/ -static int parse_addr(char *in_str, UCHAR *out) -{ - int len; - int i,j,k; - int status; - - if (in_str == NULL) return 0; - if ((len = strlen(in_str)) < 2) return 0; - memset(out, 0, ADDRLEN); - - status = 1; - j = len - 1; - if (j > 12) j = 12; - i = 5; - - while (j > 0) - { - if ((k = asc_to_int(in_str[j--])) != -1) out[i] = k; - else return 0; - - if (j == 0) break; - if ((k = asc_to_int(in_str[j--])) != -1) out[i] += k << 4; - else return 0; - if (!i--) break; - } - return status; -} -/*===========================================================================*/ -static struct net_device_stats *ray_get_stats(struct net_device *dev) -{ - ray_dev_t *local = (ray_dev_t *)dev->priv; - dev_link_t *link = local->finder; - struct status *p = (struct status *)(local->sram + STATUS_BASE); - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs net_device_stats - device not present\n"); - return &local->stats; - } - if (readb(&p->mrx_overflow_for_host)) - { - local->stats.rx_over_errors += ntohs(readb(&p->mrx_overflow)); - writeb(0,&p->mrx_overflow); - writeb(0,&p->mrx_overflow_for_host); - } - if (readb(&p->mrx_checksum_error_for_host)) - { - local->stats.rx_crc_errors += ntohs(readb(&p->mrx_checksum_error)); - writeb(0,&p->mrx_checksum_error); - writeb(0,&p->mrx_checksum_error_for_host); - } - if (readb(&p->rx_hec_error_for_host)) - { - local->stats.rx_frame_errors += ntohs(readb(&p->rx_hec_error)); - writeb(0,&p->rx_hec_error); - writeb(0,&p->rx_hec_error_for_host); - } - return &local->stats; -} -/*===========================================================================*/ -static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len) -{ - ray_dev_t *local = (ray_dev_t *)dev->priv; - dev_link_t *link = local->finder; - int ccsindex; - int i; - struct ccs *pccs; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_update_parm - device not present\n"); - return; - } - - if ((ccsindex = get_free_ccs(local)) < 0) - { - DEBUG(0,"ray_update_parm - No free ccs\n"); - return; - } - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - writeb(CCS_UPDATE_PARAMS, &pccs->cmd); - writeb(objid, &pccs->var.update_param.object_id); - writeb(1, &pccs->var.update_param.number_objects); - writeb(0, &pccs->var.update_param.failure_cause); - for (i=0; isram + HOST_TO_ECF_BASE); - } - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(0,"ray_cs associate failed - ECF not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - } -} -/*===========================================================================*/ -static void ray_update_multi_list(struct net_device *dev, int all) -{ - struct dev_mc_list *dmi, **dmip; - int ccsindex; - struct ccs *pccs; - int i = 0; - ray_dev_t *local = (ray_dev_t *)dev->priv; - dev_link_t *link = local->finder; - UCHAR *p = local->sram + HOST_TO_ECF_BASE; - - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_update_multi_list - device not present\n"); - return; - } - else - DEBUG(2,"ray_update_multi_list(%p)\n",dev); - if ((ccsindex = get_free_ccs(local)) < 0) - { - DEBUG(1,"ray_update_multi - No free ccs\n"); - return; - } - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - writeb(CCS_UPDATE_MULTICAST_LIST, &pccs->cmd); - - if (all) { - writeb(0xff, &pccs->var); - local->num_multi = 0xff; - } - else { - /* Copy the kernel's list of MC addresses to card */ - for (dmip=&dev->mc_list; (dmi=*dmip)!=NULL; dmip=&dmi->next) { - memcpy_toio(p, dmi->dmi_addr, ETH_ALEN); - DEBUG(1,"ray_update_multi add addr %02x%02x%02x%02x%02x%02x\n",dmi->dmi_addr[0],dmi->dmi_addr[1],dmi->dmi_addr[2],dmi->dmi_addr[3],dmi->dmi_addr[4],dmi->dmi_addr[5]); - p += ETH_ALEN; - i++; - } - if (i > 256/ADDRLEN) i = 256/ADDRLEN; - writeb((UCHAR)i, &pccs->var); - DEBUG(1,"ray_cs update_multi %d addresses in list\n", i); - /* Interrupt the firmware to process the command */ - local->num_multi = i; - } - if (interrupt_ecf(local, ccsindex)) { - DEBUG(1,"ray_cs update_multi failed - ECF not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - } -} /* end ray_update_multi_list */ -/*===========================================================================*/ -static void set_multicast_list(struct net_device *dev) -{ - ray_dev_t *local = (ray_dev_t *)dev->priv; - UCHAR promisc; - - DEBUG(2,"ray_cs set_multicast_list(%p)\n",dev); - - if (dev->flags & IFF_PROMISC) - { - if (local->sparm.b5.a_promiscuous_mode == 0) { - DEBUG(1,"ray_cs set_multicast_list promisc on\n"); - local->sparm.b5.a_promiscuous_mode = 1; - promisc = 1; - ray_update_parm(dev, OBJID_promiscuous_mode, \ - &promisc, sizeof(promisc)); - } - } - else { - if (local->sparm.b5.a_promiscuous_mode == 1) { - DEBUG(1,"ray_cs set_multicast_list promisc off\n"); - local->sparm.b5.a_promiscuous_mode = 0; - promisc = 0; - ray_update_parm(dev, OBJID_promiscuous_mode, \ - &promisc, sizeof(promisc)); - } - } - - if (dev->flags & IFF_ALLMULTI) ray_update_multi_list(dev, 1); - else - { - if (local->num_multi != dev->mc_count) ray_update_multi_list(dev, 0); - } -} /* end set_multicast_list */ -/*============================================================================= - * All routines below here are run at interrupt time. -=============================================================================*/ -static void ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) -{ - struct net_device *dev = (struct net_device *)dev_id; - dev_link_t *link; - ray_dev_t *local; - struct ccs *pccs; - struct rcs *prcs; - UCHAR rcsindex; - UCHAR tmp; - UCHAR cmd; - UCHAR status; - - if (dev == NULL) /* Note that we want interrupts with dev->start == 0 */ - return; - - DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev); - - local = (ray_dev_t *)dev->priv; - link = (dev_link_t *)local->finder; - if ( ! (link->state & DEV_PRESENT) || link->state & DEV_SUSPEND ) { - DEBUG(2,"ray_cs interrupt from device not present or suspended.\n"); - return; - } - rcsindex = readb(&((struct scb *)(local->sram))->rcs_index); - - if (rcsindex >= (NUMBER_OF_CCS + NUMBER_OF_RCS)) - { - DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex); - clear_interrupt(local); - return; - } - if (rcsindex < NUMBER_OF_CCS) /* If it's a returned CCS */ - { - pccs = ((struct ccs *) (local->sram + CCS_BASE)) + rcsindex; - cmd = readb(&pccs->cmd); - status = readb(&pccs->buffer_status); - switch (cmd) - { - case CCS_DOWNLOAD_STARTUP_PARAMS: /* Happens in firmware someday */ - del_timer(&local->timer); - if (status == CCS_COMMAND_COMPLETE) { - DEBUG(1,"ray_cs interrupt download_startup_parameters OK\n"); - } - else { - DEBUG(1,"ray_cs interrupt download_startup_parameters fail\n"); - } - break; - case CCS_UPDATE_PARAMS: - DEBUG(1,"ray_cs interrupt update params done\n"); - if (status != CCS_COMMAND_COMPLETE) { - tmp = readb(&pccs->var.update_param.failure_cause); - DEBUG(0,"ray_cs interrupt update params failed - reason %d\n",tmp); - } - break; - case CCS_REPORT_PARAMS: - DEBUG(1,"ray_cs interrupt report params done\n"); - break; - case CCS_UPDATE_MULTICAST_LIST: /* Note that this CCS isn't returned */ - DEBUG(1,"ray_cs interrupt CCS Update Multicast List done\n"); - break; - case CCS_UPDATE_POWER_SAVINGS_MODE: - DEBUG(1,"ray_cs interrupt update power save mode done\n"); - break; - case CCS_START_NETWORK: - case CCS_JOIN_NETWORK: - if (status == CCS_COMMAND_COMPLETE) { - if (readb(&pccs->var.start_network.net_initiated) == 1) { - DEBUG(0,"ray_cs interrupt network \"%s\" started\n",\ - local->sparm.b4.a_current_ess_id); - } - else { - DEBUG(0,"ray_cs interrupt network \"%s\" joined\n",\ - local->sparm.b4.a_current_ess_id); - } - memcpy_fromio(&local->bss_id,pccs->var.start_network.bssid,ADDRLEN); - - if (local->fw_ver == 0x55) local->net_default_tx_rate = 3; - else local->net_default_tx_rate = - readb(&pccs->var.start_network.net_default_tx_rate); - local->encryption = readb(&pccs->var.start_network.encryption); - if (!sniffer && (local->net_type == INFRA) - && !(local->sparm.b4.a_acting_as_ap_status)) { - authenticate(local); - } - local->card_status = CARD_ACQ_COMPLETE; - } - else { - local->card_status = CARD_ACQ_FAILED; - - del_timer(&local->timer); - local->timer.expires = jiffies + HZ*5; - local->timer.data = (long)local; - if (status == CCS_START_NETWORK) { - DEBUG(0,"ray_cs interrupt network \"%s\" start failed\n",\ - local->sparm.b4.a_current_ess_id); - local->timer.function = &start_net; - } - else { - DEBUG(0,"ray_cs interrupt network \"%s\" join failed\n",\ - local->sparm.b4.a_current_ess_id); - local->timer.function = &join_net; - } - add_timer(&local->timer); - } - break; - case CCS_START_ASSOCIATION: - if (status == CCS_COMMAND_COMPLETE) { - local->card_status = CARD_ASSOC_COMPLETE; - DEBUG(0,"ray_cs association successful\n"); - } - else - { - DEBUG(0,"ray_cs association failed,\n"); - local->card_status = CARD_ASSOC_FAILED; - join_net((u_long)local); - } - break; - case CCS_TX_REQUEST: - if (status == CCS_COMMAND_COMPLETE) { - DEBUG(3,"ray_cs interrupt tx request complete\n"); - } - else { - DEBUG(1,"ray_cs interrupt tx request failed\n"); - } - if (!sniffer) netif_start_queue(dev); - netif_wake_queue(dev); - break; - case CCS_TEST_MEMORY: - DEBUG(1,"ray_cs interrupt mem test done\n"); - break; - case CCS_SHUTDOWN: - DEBUG(1,"ray_cs interrupt Unexpected CCS returned - Shutdown\n"); - break; - case CCS_DUMP_MEMORY: - DEBUG(1,"ray_cs interrupt dump memory done\n"); - break; - case CCS_START_TIMER: - DEBUG(2,"ray_cs interrupt DING - raylink timer expired\n"); - break; - default: - DEBUG(1,"ray_cs interrupt Unexpected CCS 0x%x returned 0x%x\n",\ - rcsindex, cmd); - } - writeb(CCS_BUFFER_FREE, &pccs->buffer_status); - } - else /* It's an RCS */ - { - prcs = ((struct rcs *)(local->sram + CCS_BASE)) + rcsindex; - - switch (readb(&prcs->interrupt_id)) - { - case PROCESS_RX_PACKET: - ray_rx(dev, local, prcs); - break; - case REJOIN_NET_COMPLETE: - DEBUG(1,"ray_cs interrupt rejoin net complete\n"); - local->card_status = CARD_ACQ_COMPLETE; - /* do we need to clear tx buffers CCS's? */ - if (local->sparm.b4.a_network_type == ADHOC) { - if (!sniffer) netif_start_queue(dev); - } - else { - memcpy_fromio(&local->bss_id, prcs->var.rejoin_net_complete.bssid, ADDRLEN); - DEBUG(1,"ray_cs new BSSID = %02x%02x%02x%02x%02x%02x\n",\ - local->bss_id[0], local->bss_id[1], local->bss_id[2],\ - local->bss_id[3], local->bss_id[4], local->bss_id[5]); - if (!sniffer) authenticate(local); - } - break; - case ROAMING_INITIATED: - DEBUG(1,"ray_cs interrupt roaming initiated\n"); - netif_stop_queue(dev); - local->card_status = CARD_DOING_ACQ; - break; - case JAPAN_CALL_SIGN_RXD: - DEBUG(1,"ray_cs interrupt japan call sign rx\n"); - break; - default: - DEBUG(1,"ray_cs Unexpected interrupt for RCS 0x%x cmd = 0x%x\n",\ - rcsindex, (unsigned int) readb(&prcs->interrupt_id)); - break; - } - writeb(CCS_BUFFER_FREE, &prcs->buffer_status); - } - clear_interrupt(local); -} /* ray_interrupt */ -/*===========================================================================*/ -static void ray_rx(struct net_device *dev, ray_dev_t *local, struct rcs *prcs) -{ - int rx_len; - unsigned int pkt_addr; - UCHAR *pmsg; - DEBUG(4,"ray_rx process rx packet\n"); - - /* Calculate address of packet within Rx buffer */ - pkt_addr = ((readb(&prcs->var.rx_packet.rx_data_ptr[0]) << 8) - + readb(&prcs->var.rx_packet.rx_data_ptr[1])) & RX_BUFF_END; - /* Length of first packet fragment */ - rx_len = (readb(&prcs->var.rx_packet.rx_data_length[0]) << 8) - + readb(&prcs->var.rx_packet.rx_data_length[1]); - - local->last_rsl = readb(&prcs->var.rx_packet.rx_sig_lev); - pmsg = local->rmem + pkt_addr; - switch(readb(pmsg)) - { - case DATA_TYPE: - DEBUG(4,"ray_rx data type\n"); - rx_data(dev, prcs, pkt_addr, rx_len); - break; - case AUTHENTIC_TYPE: - DEBUG(4,"ray_rx authentic type\n"); - if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); - else rx_authenticate(local, prcs, pkt_addr, rx_len); - break; - case DEAUTHENTIC_TYPE: - DEBUG(4,"ray_rx deauth type\n"); - if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); - else rx_deauthenticate(local, prcs, pkt_addr, rx_len); - break; - case NULL_MSG_TYPE: - DEBUG(3,"ray_cs rx NULL msg\n"); - break; - case BEACON_TYPE: - DEBUG(4,"ray_rx beacon type\n"); - if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); - - copy_from_rx_buff(local, (UCHAR *)&local->last_bcn, pkt_addr, - rx_len < sizeof(struct beacon_rx) ? - rx_len : sizeof(struct beacon_rx)); - - local->beacon_rxed = 1; - /* Get the statistics so the card counters never overflow */ - ray_get_stats(dev); - break; - default: - DEBUG(0,"ray_cs unknown pkt type %2x\n", (unsigned int) readb(pmsg)); - break; - } - -} /* end ray_rx */ -/*===========================================================================*/ -static void rx_data(struct net_device *dev, struct rcs *prcs, unsigned int pkt_addr, - int rx_len) -{ - struct sk_buff *skb = NULL; - struct rcs *prcslink = prcs; - ray_dev_t *local = dev->priv; - UCHAR *rx_ptr; - int total_len; - int tmp; -#ifdef WIRELESS_SPY - int siglev = local->last_rsl; - u_char linksrcaddr[ETH_ALEN]; /* Other end of the wireless link */ -#endif - - if (!sniffer) { - if (translate) { -/* TBD length needs fixing for translated header */ - if (rx_len < (ETH_HLEN + RX_MAC_HEADER_LENGTH) || - rx_len > (dev->mtu + RX_MAC_HEADER_LENGTH + ETH_HLEN + FCS_LEN)) - { - DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len); - return; - } - } - else /* encapsulated ethernet */ { - if (rx_len < (ETH_HLEN + RX_MAC_HEADER_LENGTH) || - rx_len > (dev->mtu + RX_MAC_HEADER_LENGTH + ETH_HLEN + FCS_LEN)) - { - DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len); - return; - } - } - } - DEBUG(4,"ray_cs rx_data packet\n"); - /* If fragmented packet, verify sizes of fragments add up */ - if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) { - DEBUG(1,"ray_cs rx'ed fragment\n"); - tmp = (readb(&prcs->var.rx_packet.totalpacketlength[0]) << 8) - + readb(&prcs->var.rx_packet.totalpacketlength[1]); - total_len = tmp; - prcslink = prcs; - do { - tmp -= (readb(&prcslink->var.rx_packet.rx_data_length[0]) << 8) - + readb(&prcslink->var.rx_packet.rx_data_length[1]); - if (readb(&prcslink->var.rx_packet.next_frag_rcs_index) == 0xFF - || tmp < 0) break; - prcslink = ((struct rcs *)(local->sram + CCS_BASE)) - + readb(&prcslink->link_field); - } while (1); - - if (tmp < 0) - { - DEBUG(0,"ray_cs rx_data fragment lengths don't add up\n"); - local->stats.rx_dropped++; - release_frag_chain(local, prcs); - return; - } - } - else { /* Single unfragmented packet */ - total_len = rx_len; - } - - skb = dev_alloc_skb( total_len+5 ); - if (skb == NULL) - { - DEBUG(0,"ray_cs rx_data could not allocate skb\n"); - local->stats.rx_dropped++; - if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) - release_frag_chain(local, prcs); - return; - } - skb_reserve( skb, 2); /* Align IP on 16 byte (TBD check this)*/ - skb->dev = dev; - - DEBUG(4,"ray_cs rx_data total_len = %x, rx_len = %x\n",total_len,rx_len); - -/************************/ - /* Reserve enough room for the whole damn packet. */ - rx_ptr = skb_put( skb, total_len); - /* Copy the whole packet to sk_buff */ - rx_ptr += copy_from_rx_buff(local, rx_ptr, pkt_addr & RX_BUFF_END, rx_len); - /* Get source address */ -#ifdef WIRELESS_SPY - memcpy(linksrcaddr, ((struct mac_header *)skb->data)->addr_2, ETH_ALEN); -#endif - /* Now, deal with encapsulation/translation/sniffer */ - if (!sniffer) { - if (!translate) { - /* Encapsulated ethernet, so just lop off 802.11 MAC header */ -/* TBD reserve skb_reserve( skb, RX_MAC_HEADER_LENGTH); */ - skb_pull( skb, RX_MAC_HEADER_LENGTH); - } - else { - /* Do translation */ - untranslate(local, skb, total_len); - } - } - else - { /* sniffer mode, so just pass whole packet */ }; - -/************************/ - /* Now pick up the rest of the fragments if any */ - tmp = 17; - if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) { - prcslink = prcs; - DEBUG(1,"ray_cs rx_data in fragment loop\n"); - do { - prcslink = ((struct rcs *)(local->sram + CCS_BASE)) - + readb(&prcslink->var.rx_packet.next_frag_rcs_index); - rx_len = (( readb(&prcslink->var.rx_packet.rx_data_length[0]) << 8) - + readb(&prcslink->var.rx_packet.rx_data_length[1])) - & RX_BUFF_END; - pkt_addr = (( readb(&prcslink->var.rx_packet.rx_data_ptr[0]) << 8) - + readb(&prcslink->var.rx_packet.rx_data_ptr[1])) - & RX_BUFF_END; - - rx_ptr += copy_from_rx_buff(local, rx_ptr, pkt_addr, rx_len); - - } while (tmp-- && - readb(&prcslink->var.rx_packet.next_frag_rcs_index) != 0xFF); - release_frag_chain(local, prcs); - } - - skb->protocol = eth_type_trans(skb,dev); - netif_rx(skb); - dev->last_rx = jiffies; - local->stats.rx_packets++; - local->stats.rx_bytes += total_len; - - /* Gather signal strength per address */ -#ifdef WIRELESS_SPY - /* For the Access Point or the node having started the ad-hoc net - * note : ad-hoc work only in some specific configurations, but we - * kludge in ray_get_wireless_stats... */ - if(!memcmp(linksrcaddr, local->bss_id, ETH_ALEN)) - { - /* Update statistics */ - /*local->wstats.qual.qual = none ? */ - local->wstats.qual.level = siglev; - /*local->wstats.qual.noise = none ? */ - local->wstats.qual.updated = 0x2; - } - /* Now, for the addresses in the spy list */ - { - int i; - /* Look all addresses */ - for(i = 0; i < local->spy_number; i++) - /* If match */ - if(!memcmp(linksrcaddr, local->spy_address[i], ETH_ALEN)) - { - /* Update statistics */ - /*local->spy_stat[i].qual = none ? */ - local->spy_stat[i].level = siglev; - /*local->spy_stat[i].noise = none ? */ - local->spy_stat[i].updated = 0x2; - } - } -#endif /* WIRELESS_SPY */ -} /* end rx_data */ -/*===========================================================================*/ -static void untranslate(ray_dev_t *local, struct sk_buff *skb, int len) -{ - snaphdr_t *psnap = (snaphdr_t *)(skb->data + RX_MAC_HEADER_LENGTH); - struct mac_header *pmac = (struct mac_header *)skb->data; - unsigned short type = *(unsigned short *)psnap->ethertype; - unsigned int xsap = *(unsigned int *)psnap & 0x00ffffff; - unsigned int org = (*(unsigned int *)psnap->org) & 0x00ffffff; - int delta; - struct ethhdr *peth; - UCHAR srcaddr[ADDRLEN]; - UCHAR destaddr[ADDRLEN]; - - if (pmac->frame_ctl_2 & FC2_FROM_DS) { - if (pmac->frame_ctl_2 & FC2_TO_DS) { /* AP to AP */ - memcpy(destaddr, pmac->addr_3, ADDRLEN); - memcpy(srcaddr, ((unsigned char *)pmac->addr_3) + ADDRLEN, ADDRLEN); - } else { /* AP to terminal */ - memcpy(destaddr, pmac->addr_1, ADDRLEN); - memcpy(srcaddr, pmac->addr_3, ADDRLEN); - } - } else { /* Terminal to AP */ - if (pmac->frame_ctl_2 & FC2_TO_DS) { - memcpy(destaddr, pmac->addr_3, ADDRLEN); - memcpy(srcaddr, pmac->addr_2, ADDRLEN); - } else { /* Adhoc */ - memcpy(destaddr, pmac->addr_1, ADDRLEN); - memcpy(srcaddr, pmac->addr_2, ADDRLEN); - } - } - -#ifdef PCMCIA_DEBUG - if (pc_debug > 3) { - int i; - printk(KERN_DEBUG "skb->data before untranslate"); - for (i=0;i<64;i++) - printk("%02x ",skb->data[i]); - printk("\n" KERN_DEBUG "type = %08x, xsap = %08x, org = %08x\n", - type,xsap,org); - printk(KERN_DEBUG "untranslate skb->data = %p\n",skb->data); - } -#endif - - if ( xsap != SNAP_ID) { - /* not a snap type so leave it alone */ - DEBUG(3,"ray_cs untranslate NOT SNAP %x\n", *(unsigned int *)psnap & 0x00ffffff); - - delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; - peth = (struct ethhdr *)(skb->data + delta); - peth->h_proto = htons(len - RX_MAC_HEADER_LENGTH); - } - else { /* Its a SNAP */ - if (org == BRIDGE_ENCAP) { /* EtherII and nuke the LLC */ - DEBUG(3,"ray_cs untranslate Bridge encap\n"); - delta = RX_MAC_HEADER_LENGTH - + sizeof(struct snaphdr_t) - ETH_HLEN; - peth = (struct ethhdr *)(skb->data + delta); - peth->h_proto = type; - } - else { - if (org == RFC1042_ENCAP) { - switch (type) { - case RAY_IPX_TYPE: - case APPLEARP_TYPE: - DEBUG(3,"ray_cs untranslate RFC IPX/AARP\n"); - delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; - peth = (struct ethhdr *)(skb->data + delta); - peth->h_proto = htons(len - RX_MAC_HEADER_LENGTH); - break; - default: - DEBUG(3,"ray_cs untranslate RFC default\n"); - delta = RX_MAC_HEADER_LENGTH + - sizeof(struct snaphdr_t) - ETH_HLEN; - peth = (struct ethhdr *)(skb->data + delta); - peth->h_proto = type; - break; - } - } - else { - printk("ray_cs untranslate very confused by packet\n"); - delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; - peth = (struct ethhdr *)(skb->data + delta); - peth->h_proto = type; - } - } - } -/* TBD reserve skb_reserve(skb, delta); */ - skb_pull(skb, delta); - DEBUG(3,"untranslate after skb_pull(%d), skb->data = %p\n",delta,skb->data); - memcpy(peth->h_dest, destaddr, ADDRLEN); - memcpy(peth->h_source, srcaddr, ADDRLEN); -#ifdef PCMCIA_DEBUG - if (pc_debug > 3) { - int i; - printk(KERN_DEBUG "skb->data after untranslate:"); - for (i=0;i<64;i++) - printk("%02x ",skb->data[i]); - printk("\n"); - } -#endif -} /* end untranslate */ -/*===========================================================================*/ -/* Copy data from circular receive buffer to PC memory. - * dest = destination address in PC memory - * pkt_addr = source address in receive buffer - * len = length of packet to copy - */ -static int copy_from_rx_buff(ray_dev_t *local, UCHAR *dest, int pkt_addr, int length) -{ - int wrap_bytes = (pkt_addr + length) - (RX_BUFF_END + 1); - if (wrap_bytes <= 0) - { - memcpy_fromio(dest,local->rmem + pkt_addr,length); - } - else /* Packet wrapped in circular buffer */ - { - memcpy_fromio(dest,local->rmem+pkt_addr,length - wrap_bytes); - memcpy_fromio(dest + length - wrap_bytes, local->rmem, wrap_bytes); - } - return length; -} -/*===========================================================================*/ -static void release_frag_chain(ray_dev_t *local, struct rcs* prcs) -{ - struct rcs *prcslink = prcs; - int tmp = 17; - unsigned rcsindex = readb(&prcs->var.rx_packet.next_frag_rcs_index); - - while (tmp--) { - writeb(CCS_BUFFER_FREE, &prcslink->buffer_status); - if (rcsindex >= (NUMBER_OF_CCS + NUMBER_OF_RCS)) { - DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex); - break; - } - prcslink = ((struct rcs *)(local->sram + CCS_BASE)) + rcsindex; - rcsindex = readb(&prcslink->var.rx_packet.next_frag_rcs_index); - } - writeb(CCS_BUFFER_FREE, &prcslink->buffer_status); -} -/*===========================================================================*/ -static void authenticate(ray_dev_t *local) -{ - dev_link_t *link = local->finder; - DEBUG(0,"ray_cs Starting authentication.\n"); - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs authenticate - device not present\n"); - return; - } - - del_timer(&local->timer); - if (build_auth_frame(local, local->bss_id, OPEN_AUTH_REQUEST)) { - local->timer.function = &join_net; - } - else { - local->timer.function = &authenticate_timeout; - } - local->timer.expires = jiffies + HZ*2; - local->timer.data = (long)local; - add_timer(&local->timer); - local->authentication_state = AWAITING_RESPONSE; -} /* end authenticate */ -/*===========================================================================*/ -static void rx_authenticate(ray_dev_t *local, struct rcs *prcs, - unsigned int pkt_addr, int rx_len) -{ - UCHAR buff[256]; - struct rx_msg *msg = (struct rx_msg *)buff; - - del_timer(&local->timer); - - copy_from_rx_buff(local, buff, pkt_addr, rx_len & 0xff); - /* if we are trying to get authenticated */ - if (local->sparm.b4.a_network_type == ADHOC) { - DEBUG(1,"ray_cs rx_auth var= %02x %02x %02x %02x %02x %02x\n", msg->var[0],msg->var[1],msg->var[2],msg->var[3],msg->var[4],msg->var[5]); - if (msg->var[2] == 1) { - DEBUG(0,"ray_cs Sending authentication response.\n"); - if (!build_auth_frame (local, msg->mac.addr_2, OPEN_AUTH_RESPONSE)) { - local->authentication_state = NEED_TO_AUTH; - memcpy(local->auth_id, msg->mac.addr_2, ADDRLEN); - } - } - } - else /* Infrastructure network */ - { - if (local->authentication_state == AWAITING_RESPONSE) { - /* Verify authentication sequence #2 and success */ - if (msg->var[2] == 2) { - if ((msg->var[3] | msg->var[4]) == 0) { - DEBUG(1,"Authentication successful\n"); - local->card_status = CARD_AUTH_COMPLETE; - associate(local); - local->authentication_state = AUTHENTICATED; - } - else { - DEBUG(0,"Authentication refused\n"); - local->card_status = CARD_AUTH_REFUSED; - join_net((u_long)local); - local->authentication_state = UNAUTHENTICATED; - } - } - } - } - -} /* end rx_authenticate */ -/*===========================================================================*/ -static void associate(ray_dev_t *local) -{ - struct ccs *pccs; - dev_link_t *link = local->finder; - struct net_device *dev = link->priv; - int ccsindex; - if (!(link->state & DEV_PRESENT)) { - DEBUG(2,"ray_cs associate - device not present\n"); - return; - } - /* If no tx buffers available, return*/ - if ((ccsindex = get_free_ccs(local)) < 0) - { -/* TBD should never be here but... what if we are? */ - DEBUG(1,"ray_cs associate - No free ccs\n"); - return; - } - DEBUG(1,"ray_cs Starting association with access point\n"); - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - /* fill in the CCS */ - writeb(CCS_START_ASSOCIATION, &pccs->cmd); - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(1,"ray_cs associate failed - ECF not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - - del_timer(&local->timer); - local->timer.expires = jiffies + HZ*2; - local->timer.data = (long)local; - local->timer.function = &join_net; - add_timer(&local->timer); - local->card_status = CARD_ASSOC_FAILED; - return; - } - if (!sniffer) netif_start_queue(dev); - -} /* end associate */ -/*===========================================================================*/ -static void rx_deauthenticate(ray_dev_t *local, struct rcs *prcs, - unsigned int pkt_addr, int rx_len) -{ -/* UCHAR buff[256]; - struct rx_msg *msg = (struct rx_msg *)buff; -*/ - DEBUG(0,"Deauthentication frame received\n"); - local->authentication_state = UNAUTHENTICATED; - /* Need to reauthenticate or rejoin depending on reason code */ -/* copy_from_rx_buff(local, buff, pkt_addr, rx_len & 0xff); - */ -} -/*===========================================================================*/ -static void clear_interrupt(ray_dev_t *local) -{ - writeb(0, local->amem + CIS_OFFSET + HCS_INTR_OFFSET); -} -/*===========================================================================*/ -#ifdef CONFIG_PROC_FS -#define MAXDATA (PAGE_SIZE - 80) - -static char *card_status[] = { - "Card inserted - uninitialized", /* 0 */ - "Card not downloaded", /* 1 */ - "Waiting for download parameters", /* 2 */ - "Card doing acquisition", /* 3 */ - "Acquisition complete", /* 4 */ - "Authentication complete", /* 5 */ - "Association complete", /* 6 */ - "???", "???", "???", "???", /* 7 8 9 10 undefined */ - "Card init error", /* 11 */ - "Download parameters error", /* 12 */ - "???", /* 13 */ - "Acquisition failed", /* 14 */ - "Authentication refused", /* 15 */ - "Association failed" /* 16 */ -}; - -static char *nettype[] = {"Adhoc", "Infra "}; -static char *framing[] = {"Encapsulation", "Translation"} -; -/*===========================================================================*/ -static int ray_cs_proc_read(char *buf, char **start, off_t offset, int len) -{ -/* Print current values which are not available via other means - * eg ifconfig - */ - int i; - dev_link_t *link; - struct net_device *dev; - ray_dev_t *local; - UCHAR *p; - struct freq_hop_element *pfh; - UCHAR c[33]; - - link = dev_list; - if (!link) - return 0; - dev = (struct net_device *)link->priv; - if (!dev) - return 0; - local = (ray_dev_t *)dev->priv; - if (!local) - return 0; - - len = 0; - - len += sprintf(buf + len, "Raylink Wireless LAN driver status\n"); - len += sprintf(buf + len, "%s\n", rcsid); - /* build 4 does not report version, and field is 0x55 after memtest */ - len += sprintf(buf + len, "Firmware version = "); - if (local->fw_ver == 0x55) - len += sprintf(buf + len, "4 - Use dump_cis for more details\n"); - else - len += sprintf(buf + len, "%2d.%02d.%02d\n", - local->fw_ver, local->fw_bld, local->fw_var); - - for (i=0; i<32; i++) c[i] = local->sparm.b5.a_current_ess_id[i]; - c[32] = 0; - len += sprintf(buf + len, "%s network ESSID = \"%s\"\n", - nettype[local->sparm.b5.a_network_type], c); - - p = local->bss_id; - len += sprintf(buf + len, - "BSSID = %02x:%02x:%02x:%02x:%02x:%02x\n", - p[0],p[1],p[2],p[3],p[4],p[5]); - - len += sprintf(buf + len, "Country code = %d\n", - local->sparm.b5.a_curr_country_code); - - i = local->card_status; - if (i < 0) i = 10; - if (i > 16) i = 10; - len += sprintf(buf + len, "Card status = %s\n", card_status[i]); - - len += sprintf(buf + len, "Framing mode = %s\n",framing[translate]); - - len += sprintf(buf + len, "Last pkt signal lvl = %d\n", local->last_rsl); - - if (local->beacon_rxed) { - /* Pull some fields out of last beacon received */ - len += sprintf(buf + len, "Beacon Interval = %d Kus\n", - local->last_bcn.beacon_intvl[0] - + 256 * local->last_bcn.beacon_intvl[1]); - - p = local->last_bcn.elements; - if (p[0] == C_ESSID_ELEMENT_ID) p += p[1] + 2; - else { - len += sprintf(buf + len, "Parse beacon failed at essid element id = %d\n",p[0]); - return len; - } - - if (p[0] == C_SUPPORTED_RATES_ELEMENT_ID) { - len += sprintf(buf + len, "Supported rate codes = "); - for (i=2; idwell_time[0] + 256 * pfh->dwell_time[1]); - len += sprintf(buf + len, "Hop set = %d \n", pfh->hop_set); - len += sprintf(buf + len, "Hop pattern = %d \n", pfh->hop_pattern); - len += sprintf(buf + len, "Hop index = %d \n", pfh->hop_index); - p += p[1] + 2; - } - else { - len += sprintf(buf + len, "Parse beacon failed at FH param element\n"); - return len; - } - } else { - len += sprintf(buf + len, "No beacons received\n"); - } - return len; -} - -#endif -/*===========================================================================*/ -static int build_auth_frame(ray_dev_t *local, UCHAR *dest, int auth_type) -{ - int addr; - struct ccs *pccs; - struct tx_msg *ptx; - int ccsindex; - - /* If no tx buffers available, return */ - if ((ccsindex = get_free_tx_ccs(local)) < 0) - { - DEBUG(1,"ray_cs send authenticate - No free tx ccs\n"); - return -1; - } - - pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; - - /* Address in card space */ - addr = TX_BUF_BASE + (ccsindex << 11); - /* fill in the CCS */ - writeb(CCS_TX_REQUEST, &pccs->cmd); - writeb(addr >> 8, pccs->var.tx_request.tx_data_ptr); - writeb(0x20, pccs->var.tx_request.tx_data_ptr + 1); - writeb(TX_AUTHENTICATE_LENGTH_MSB, pccs->var.tx_request.tx_data_length); - writeb(TX_AUTHENTICATE_LENGTH_LSB,pccs->var.tx_request.tx_data_length + 1); - writeb(0, &pccs->var.tx_request.pow_sav_mode); - - ptx = (struct tx_msg *)(local->sram + addr); - /* fill in the mac header */ - writeb(PROTOCOL_VER | AUTHENTIC_TYPE, &ptx->mac.frame_ctl_1); - writeb(0, &ptx->mac.frame_ctl_2); - - memcpy_toio(ptx->mac.addr_1, dest, ADDRLEN); - memcpy_toio(ptx->mac.addr_2, local->sparm.b4.a_mac_addr, ADDRLEN); - memcpy_toio(ptx->mac.addr_3, local->bss_id, ADDRLEN); - - /* Fill in msg body with protocol 00 00, sequence 01 00 ,status 00 00 */ - memset_io(ptx->var, 0, 6); - writeb(auth_type & 0xff, ptx->var + 2); - - /* Interrupt the firmware to process the command */ - if (interrupt_ecf(local, ccsindex)) { - DEBUG(1,"ray_cs send authentication request failed - ECF not ready for intr\n"); - writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); - return -1; - } - return 0; -} /* End build_auth_frame */ - -/*===========================================================================*/ -#ifdef CONFIG_PROC_FS -static void raycs_write(const char *name, write_proc_t *w, void *data) -{ - struct proc_dir_entry * entry = create_proc_entry(name, S_IFREG | S_IWUSR, NULL); - if (entry) { - entry->write_proc = w; - entry->data = data; - } -} - -static int write_essid(struct file *file, const char *buffer, unsigned long count, void *data) -{ - static char proc_essid[33]; - int len = count; - - if (len > 32) - len = 32; - memset(proc_essid, 0, 33); - if (copy_from_user(proc_essid, buffer, len)) - return -EFAULT; - essid = proc_essid; - return count; -} - -static int write_int(struct file *file, const char *buffer, unsigned long count, void *data) -{ - static char proc_number[10]; - char *p; - int nr, len; - - if (!count) - return 0; - - if (count > 9) - return -EINVAL; - if (copy_from_user(proc_number, buffer, count)) - return -EFAULT; - p = proc_number; - nr = 0; - len = count; - do { - unsigned int c = *p - '0'; - if (c > 9) - return -EINVAL; - nr = nr*10 + c; - p++; - } while (--len); - *(int *)data = nr; - return count; -} -#endif - -static int __init init_ray_cs(void) -{ - int rc; - - DEBUG(1, "%s\n", rcsid); - rc = register_pcmcia_driver(&dev_info, &ray_attach, &ray_detach); - DEBUG(1, "raylink init_module register_pcmcia_driver returns 0x%x\n",rc); - -#ifdef CONFIG_PROC_FS - proc_mkdir("driver/ray_cs", 0); - - create_proc_info_entry("driver/ray_cs/ray_cs", 0, NULL, &ray_cs_proc_read); - raycs_write("driver/ray_cs/essid", write_essid, NULL); - raycs_write("driver/ray_cs/net_type", write_int, &net_type); - raycs_write("driver/ray_cs/translate", write_int, &translate); -#endif - if (translate != 0) translate = 1; - return 0; -} /* init_ray_cs */ - -/*===========================================================================*/ - -static void __exit exit_ray_cs(void) -{ - DEBUG(0, "ray_cs: cleanup_module\n"); - - -#ifdef CONFIG_PROC_FS - remove_proc_entry("ray_cs", proc_root_driver); -#endif - - unregister_pcmcia_driver(&dev_info); - while (dev_list != NULL) - ray_detach(dev_list); - -#ifdef CONFIG_PROC_FS - remove_proc_entry("driver/ray_cs/ray_cs", NULL); - remove_proc_entry("driver/ray_cs/essid", NULL); - remove_proc_entry("driver/ray_cs/net_type", NULL); - remove_proc_entry("driver/ray_cs/translate", NULL); - remove_proc_entry("driver/ray_cs", NULL); -#endif -} /* exit_ray_cs */ - -module_init(init_ray_cs); -module_exit(exit_ray_cs); - -/*===========================================================================*/ diff -Nru a/drivers/net/pcmcia/ray_cs.h b/drivers/net/pcmcia/ray_cs.h --- a/drivers/net/pcmcia/ray_cs.h Thu Feb 20 23:19:23 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,78 +0,0 @@ -/* Raytheon wireless LAN PCMCIA card driver for Linux - A PCMCIA client driver for the Raylink wireless network card - Written by Corey Thomas -*/ - -#ifndef RAYLINK_H - -struct beacon_rx { - struct mac_header mac; - UCHAR timestamp[8]; - UCHAR beacon_intvl[2]; - UCHAR capability[2]; - UCHAR elements[sizeof(struct essid_element) - + sizeof(struct rates_element) - + sizeof(struct freq_hop_element) - + sizeof(struct japan_call_sign_element) - + sizeof(struct tim_element)]; -}; - -/* Return values for get_free{,_tx}_ccs */ -#define ECCSFULL (-1) -#define ECCSBUSY (-2) -#define ECARDGONE (-3) - -typedef struct ray_dev_t { - int card_status; - int authentication_state; - dev_node_t node; - window_handle_t amem_handle; /* handle to window for attribute memory */ - window_handle_t rmem_handle; /* handle to window for rx buffer on card */ - UCHAR *sram; /* pointer to beginning of shared RAM */ - UCHAR *amem; /* pointer to attribute mem window */ - UCHAR *rmem; /* pointer to receive buffer window */ - dev_link_t *finder; /* pointer back to dev_link_t for card */ - struct timer_list timer; - long tx_ccs_lock; - long ccs_lock; - int dl_param_ccs; - union { - struct b4_startup_params b4; - struct b5_startup_params b5; - } sparm; - int timeout_flag; - UCHAR supported_rates[8]; - UCHAR japan_call_sign[12]; - struct startup_res_6 startup_res; - int num_multi; - /* Network parameters from start/join */ - UCHAR bss_id[6]; - UCHAR auth_id[6]; - UCHAR net_default_tx_rate; - UCHAR encryption; - struct net_device_stats stats; - - UCHAR net_type; - UCHAR sta_type; - UCHAR fw_ver; - UCHAR fw_bld; - UCHAR fw_var; - UCHAR ASIC_version; - UCHAR assoc_id[2]; - UCHAR tib_length; - UCHAR last_rsl; - int beacon_rxed; - struct beacon_rx last_bcn; -#ifdef WIRELESS_EXT - iw_stats wstats; /* Wireless specific stats */ -#endif -#ifdef WIRELESS_SPY - int spy_number; /* Number of addresses to spy */ - mac_addr spy_address[IW_MAX_SPY + 1]; /* The addresses to spy */ - iw_qual spy_stat[IW_MAX_SPY + 1]; /* Statistics gathered */ -#endif /* WIRELESS_SPY */ - -} ray_dev_t; -/*****************************************************************************/ - -#endif /* RAYLINK_H */ diff -Nru a/drivers/net/pcmcia/rayctl.h b/drivers/net/pcmcia/rayctl.h --- a/drivers/net/pcmcia/rayctl.h Thu Feb 20 23:19:20 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,732 +0,0 @@ -#ifndef RAYLINK_H - -typedef unsigned char UCHAR; - -/****** IEEE 802.11 constants ************************************************/ -#define ADDRLEN 6 -/* Frame control 1 bit fields */ -#define PROTOCOL_VER 0x00 -#define DATA_TYPE 0x08 -#define ASSOC_REQ_TYPE 0x00 -#define ASSOC_RESP_TYPE 0x10 -#define REASSOC_REQ_TYPE 0x20 -#define REASSOC_RESP_TYPE 0x30 -#define NULL_MSG_TYPE 0x48 -#define BEACON_TYPE 0x80 -#define DISASSOC_TYPE 0xA0 -#define PSPOLL_TYPE 0xA4 -#define AUTHENTIC_TYPE 0xB0 -#define DEAUTHENTIC_TYPE 0xC0 -/* Frame control 2 bit fields */ -#define FC2_TO_DS 0x01 -#define FC2_FROM_DS 0x02 -#define FC2_MORE_FRAG 0x04 -#define FC2_RETRY 0x08 -#define FC2_PSM 0x10 -#define FC2_MORE_DATA 0x20 -#define FC2_WEP 0x40 -#define FC2_ORDER 0x80 -/*****************************************************************************/ -/* 802.11 element ID's and lengths */ -#define C_BP_CAPABILITY_ESS 0x01 -#define C_BP_CAPABILITY_IBSS 0x02 -#define C_BP_CAPABILITY_CF_POLLABLE 0x04 -#define C_BP_CAPABILITY_CF_POLL_REQUEST 0x08 -#define C_BP_CAPABILITY_PRIVACY 0x10 - -#define C_ESSID_ELEMENT_ID 0 -#define C_ESSID_ELEMENT_MAX_LENGTH 32 - -#define C_SUPPORTED_RATES_ELEMENT_ID 1 -#define C_SUPPORTED_RATES_ELEMENT_LENGTH 2 - -#define C_FH_PARAM_SET_ELEMENT_ID 2 -#define C_FH_PARAM_SET_ELEMENT_LNGTH 5 - -#define C_CF_PARAM_SET_ELEMENT_ID 4 -#define C_CF_PARAM_SET_ELEMENT_LNGTH 6 - -#define C_TIM_ELEMENT_ID 5 -#define C_TIM_BITMAP_LENGTH 251 -#define C_TIM_BMCAST_BIT 0x01 - -#define C_IBSS_ELEMENT_ID 6 -#define C_IBSS_ELEMENT_LENGTH 2 - -#define C_JAPAN_CALL_SIGN_ELEMENT_ID 51 -#define C_JAPAN_CALL_SIGN_ELEMENT_LNGTH 12 - -#define C_DISASSOC_REASON_CODE_LEN 2 -#define C_DISASSOC_REASON_CODE_DEFAULT 8 - -#define C_CRC_LEN 4 -#define C_NUM_SUPPORTED_RATES 8 -/****** IEEE 802.11 mac header for type data packets *************************/ -struct mac_header { - UCHAR frame_ctl_1; - UCHAR frame_ctl_2; - UCHAR duration_lsb; - UCHAR duration_msb; - UCHAR addr_1[ADDRLEN]; - UCHAR addr_2[ADDRLEN]; - UCHAR addr_3[ADDRLEN]; - UCHAR seq_frag_num[2]; -/* UCHAR addr_4[ADDRLEN]; *//* only present for AP to AP (TO DS and FROM DS */ -}; -/****** IEEE 802.11 frame element structures *********************************/ -struct essid_element -{ - UCHAR id; - UCHAR length; - UCHAR text[C_ESSID_ELEMENT_MAX_LENGTH]; -}; -struct rates_element -{ - UCHAR id; - UCHAR length; - UCHAR value[8]; -}; -struct freq_hop_element -{ - UCHAR id; - UCHAR length; - UCHAR dwell_time[2]; - UCHAR hop_set; - UCHAR hop_pattern; - UCHAR hop_index; -}; -struct tim_element -{ - UCHAR id; - UCHAR length; - UCHAR dtim_count; - UCHAR dtim_period; - UCHAR bitmap_control; - UCHAR tim[C_TIM_BITMAP_LENGTH]; -}; -struct ibss_element -{ - UCHAR id; - UCHAR length; - UCHAR atim_window[2]; -}; -struct japan_call_sign_element -{ - UCHAR id; - UCHAR length; - UCHAR call_sign[12]; -}; -/****** Beacon message structures ********************************************/ -/* .elements is a large lump of max size because elements are variable size */ -struct infra_beacon -{ - UCHAR timestamp[8]; - UCHAR beacon_intvl[2]; - UCHAR capability[2]; - UCHAR elements[sizeof(struct essid_element) - + sizeof(struct rates_element) - + sizeof(struct freq_hop_element) - + sizeof(struct japan_call_sign_element) - + sizeof(struct tim_element)]; -}; -struct adhoc_beacon -{ - UCHAR timestamp[8]; - UCHAR beacon_intvl[2]; - UCHAR capability[2]; - UCHAR elements[sizeof(struct essid_element) - + sizeof(struct rates_element) - + sizeof(struct freq_hop_element) - + sizeof(struct japan_call_sign_element) - + sizeof(struct ibss_element)]; -}; -/*****************************************************************************/ -/*****************************************************************************/ -/* #define C_MAC_HDR_2_WEP 0x40 */ -/* TX/RX CCS constants */ -#define TX_HEADER_LENGTH 0x1C -#define RX_MAC_HEADER_LENGTH 0x18 -#define TX_AUTHENTICATE_LENGTH (TX_HEADER_LENGTH + 6) -#define TX_AUTHENTICATE_LENGTH_MSB (TX_AUTHENTICATE_LENGTH >> 8) -#define TX_AUTHENTICATE_LENGTH_LSB (TX_AUTHENTICATE_LENGTH & 0xff) -#define TX_DEAUTHENTICATE_LENGTH (TX_HEADER_LENGTH + 2) -#define TX_DEAUTHENTICATE_LENGTH_MSB (TX_AUTHENTICATE_LENGTH >> 8) -#define TX_DEAUTHENTICATE_LENGTH_LSB (TX_AUTHENTICATE_LENGTH & 0xff) -#define FCS_LEN 4 - -#define ADHOC 0 -#define INFRA 1 - -#define TYPE_STA 0 -#define TYPE_AP 1 - -#define PASSIVE_SCAN 1 -#define ACTIVE_SCAN 1 - -#define PSM_CAM 0 - -/* Country codes */ -#define USA 1 -#define EUROPE 2 -#define JAPAN 3 -#define KOREA 4 -#define SPAIN 5 -#define FRANCE 6 -#define ISRAEL 7 -#define AUSTRALIA 8 -#define JAPAN_TEST 9 - -/* Hop pattern lengths */ -#define USA_HOP_MOD 79 -#define EUROPE_HOP_MOD 79 -#define JAPAN_HOP_MOD 23 -#define KOREA_HOP_MOD 23 -#define SPAIN_HOP_MOD 27 -#define FRANCE_HOP_MOD 35 -#define ISRAEL_HOP_MOD 35 -#define AUSTRALIA_HOP_MOD 47 -#define JAPAN_TEST_HOP_MOD 23 - -#define ESSID_SIZE 32 -/**********************************************************************/ -/* CIS Register Constants */ -#define CIS_OFFSET 0x0f00 -/* Configuration Option Register (0x0F00) */ -#define COR_OFFSET 0x00 -#define COR_SOFT_RESET 0x80 -#define COR_LEVEL_IRQ 0x40 -#define COR_CONFIG_NUM 0x01 -#define COR_DEFAULT (COR_LEVEL_IRQ | COR_CONFIG_NUM) - -/* Card Configuration and Status Register (0x0F01) */ -#define CCSR_OFFSET 0x01 -#define CCSR_HOST_INTR_PENDING 0x01 -#define CCSR_POWER_DOWN 0x04 - -/* HCS Interrupt Register (0x0F05) */ -#define HCS_INTR_OFFSET 0x05 -/* #define HCS_INTR_OFFSET 0x0A */ -#define HCS_INTR_CLEAR 0x00 - -/* ECF Interrupt Register (0x0F06) */ -#define ECF_INTR_OFFSET 0x06 -/* #define ECF_INTR_OFFSET 0x0C */ -#define ECF_INTR_SET 0x01 - -/* Authorization Register 0 (0x0F08) */ -#define AUTH_0_ON 0x57 - -/* Authorization Register 1 (0x0F09) */ -#define AUTH_1_ON 0x82 - -/* Program Mode Register (0x0F0A) */ -#define PC2PM 0x02 -#define PC2CAL 0x10 -#define PC2MLSE 0x20 - -/* PC Test Mode Register (0x0F0B) */ -#define PC_TEST_MODE 0x08 - -/* Frequency Control Word (0x0F10) */ -/* Range 0x02 - 0xA6 */ - -/* Test Mode Control 1-4 (0x0F14 - 0x0F17) */ - -/**********************************************************************/ - -/* Shared RAM Area */ -#define SCB_BASE 0x0000 -#define STATUS_BASE 0x0100 -#define HOST_TO_ECF_BASE 0x0200 -#define ECF_TO_HOST_BASE 0x0300 -#define CCS_BASE 0x0400 -#define RCS_BASE 0x0800 -#define INFRA_TIM_BASE 0x0C00 -#define SSID_LIST_BASE 0x0D00 -#define TX_BUF_BASE 0x1000 -#define RX_BUF_BASE 0x8000 - -#define NUMBER_OF_CCS 64 -#define NUMBER_OF_RCS 64 -/*#define NUMBER_OF_TX_CCS 14 */ -#define NUMBER_OF_TX_CCS 14 - -#define TX_BUF_SIZE (2048 - sizeof(struct tx_msg)) -#define RX_BUFF_END 0x3FFF -/* Values for buffer_status */ -#define CCS_BUFFER_FREE 0 -#define CCS_BUFFER_BUSY 1 -#define CCS_COMMAND_COMPLETE 2 -#define CCS_COMMAND_FAILED 3 - -/* Values for cmd */ -#define CCS_DOWNLOAD_STARTUP_PARAMS 1 -#define CCS_UPDATE_PARAMS 2 -#define CCS_REPORT_PARAMS 3 -#define CCS_UPDATE_MULTICAST_LIST 4 -#define CCS_UPDATE_POWER_SAVINGS_MODE 5 -#define CCS_START_NETWORK 6 -#define CCS_JOIN_NETWORK 7 -#define CCS_START_ASSOCIATION 8 -#define CCS_TX_REQUEST 9 -#define CCS_TEST_MEMORY 0xa -#define CCS_SHUTDOWN 0xb -#define CCS_DUMP_MEMORY 0xc -#define CCS_START_TIMER 0xe -#define CCS_LAST_CMD CCS_START_TIMER - -/* Values for link field */ -#define CCS_END_LIST 0xff - -/* values for buffer_status field */ -#define RCS_BUFFER_FREE 0 -#define RCS_BUFFER_BUSY 1 -#define RCS_COMPLETE 2 -#define RCS_FAILED 3 -#define RCS_BUFFER_RELEASE 0xFF - -/* values for interrupt_id field */ -#define PROCESS_RX_PACKET 0x80 /* */ -#define REJOIN_NET_COMPLETE 0x81 /* RCS ID: Rejoin Net Complete */ -#define ROAMING_INITIATED 0x82 /* RCS ID: Roaming Initiated */ -#define JAPAN_CALL_SIGN_RXD 0x83 /* RCS ID: New Japan Call Sign */ - -/*****************************************************************************/ -/* Memory types for dump memory command */ -#define C_MEM_PROG 0 -#define C_MEM_XDATA 1 -#define C_MEM_SFR 2 -#define C_MEM_IDATA 3 - -/*** Return values for hw_xmit **********/ -#define XMIT_OK (0) -#define XMIT_MSG_BAD (-1) -#define XMIT_NO_CCS (-2) -#define XMIT_NO_INTR (-3) -#define XMIT_NEED_AUTH (-4) - -/*** Values for card status */ -#define CARD_INSERTED (0) - -#define CARD_AWAITING_PARAM (1) -#define CARD_INIT_ERROR (11) - -#define CARD_DL_PARAM (2) -#define CARD_DL_PARAM_ERROR (12) - -#define CARD_DOING_ACQ (3) - -#define CARD_ACQ_COMPLETE (4) -#define CARD_ACQ_FAILED (14) - -#define CARD_AUTH_COMPLETE (5) -#define CARD_AUTH_REFUSED (15) - -#define CARD_ASSOC_COMPLETE (6) -#define CARD_ASSOC_FAILED (16) - -/*** Values for authentication_state ***********************************/ -#define UNAUTHENTICATED (0) -#define AWAITING_RESPONSE (1) -#define AUTHENTICATED (2) -#define NEED_TO_AUTH (3) - -/*** Values for authentication type ************************************/ -#define OPEN_AUTH_REQUEST (1) -#define OPEN_AUTH_RESPONSE (2) -#define BROADCAST_DEAUTH (0xc0) -/*** Values for timer functions ****************************************/ -#define TODO_NOTHING (0) -#define TODO_VERIFY_DL_START (-1) -#define TODO_START_NET (-2) -#define TODO_JOIN_NET (-3) -#define TODO_AUTHENTICATE_TIMEOUT (-4) -#define TODO_SEND_CCS (-5) -/***********************************************************************/ -/* Parameter passing structure for update/report parameter CCS's */ -struct object_id { - void *object_addr; - unsigned char object_length; -}; - -#define OBJID_network_type 0 -#define OBJID_acting_as_ap_status 1 -#define OBJID_current_ess_id 2 -#define OBJID_scanning_mode 3 -#define OBJID_power_mgt_state 4 -#define OBJID_mac_address 5 -#define OBJID_frag_threshold 6 -#define OBJID_hop_time 7 -#define OBJID_beacon_period 8 -#define OBJID_dtim_period 9 -#define OBJID_retry_max 10 -#define OBJID_ack_timeout 11 -#define OBJID_sifs 12 -#define OBJID_difs 13 -#define OBJID_pifs 14 -#define OBJID_rts_threshold 15 -#define OBJID_scan_dwell_time 16 -#define OBJID_max_scan_dwell_time 17 -#define OBJID_assoc_resp_timeout 18 -#define OBJID_adhoc_scan_cycle_max 19 -#define OBJID_infra_scan_cycle_max 20 -#define OBJID_infra_super_cycle_max 21 -#define OBJID_promiscuous_mode 22 -#define OBJID_unique_word 23 -#define OBJID_slot_time 24 -#define OBJID_roaming_low_snr 25 -#define OBJID_low_snr_count_thresh 26 -#define OBJID_infra_missed_bcn 27 -#define OBJID_adhoc_missed_bcn 28 -#define OBJID_curr_country_code 29 -#define OBJID_hop_pattern 30 -#define OBJID_reserved 31 -#define OBJID_cw_max_msb 32 -#define OBJID_cw_min_msb 33 -#define OBJID_noise_filter_gain 34 -#define OBJID_noise_limit_offset 35 -#define OBJID_det_rssi_thresh_offset 36 -#define OBJID_med_busy_thresh_offset 37 -#define OBJID_det_sync_thresh 38 -#define OBJID_test_mode 39 -#define OBJID_test_min_chan_num 40 -#define OBJID_test_max_chan_num 41 -#define OBJID_allow_bcast_ID_prbrsp 42 -#define OBJID_privacy_must_start 43 -#define OBJID_privacy_can_join 44 -#define OBJID_basic_rate_set 45 - -/**** Configuration/Status/Control Area ***************************/ -/* System Control Block (SCB) Area - * Located at Shared RAM offset 0 - */ -struct scb { - UCHAR ccs_index; - UCHAR rcs_index; -}; - -/****** Status area at Shared RAM offset 0x0100 ******************************/ -struct status { - UCHAR mrx_overflow_for_host; /* 0=ECF may write, 1=host may write*/ - UCHAR mrx_checksum_error_for_host; /* 0=ECF may write, 1=host may write*/ - UCHAR rx_hec_error_for_host; /* 0=ECF may write, 1=host may write*/ - UCHAR reserved1; - short mrx_overflow; /* ECF increments on rx overflow */ - short mrx_checksum_error; /* ECF increments on rx CRC error */ - short rx_hec_error; /* ECF incs on mac header CRC error */ - UCHAR rxnoise; /* Average RSL measurement */ -}; - -/****** Host-to-ECF Data Area at Shared RAM offset 0x200 *********************/ -struct host_to_ecf_area { - -}; - -/****** ECF-to-Host Data Area at Shared RAM offset 0x0300 ********************/ -struct startup_res_518 { - UCHAR startup_word; - UCHAR station_addr[ADDRLEN]; - UCHAR calc_prog_chksum; - UCHAR calc_cis_chksum; - UCHAR ecf_spare[7]; - UCHAR japan_call_sign[12]; -}; - -struct startup_res_6 { - UCHAR startup_word; - UCHAR station_addr[ADDRLEN]; - UCHAR reserved; - UCHAR supp_rates[8]; - UCHAR japan_call_sign[12]; - UCHAR calc_prog_chksum; - UCHAR calc_cis_chksum; - UCHAR firmware_version[3]; - UCHAR asic_version; - UCHAR tib_length; -}; - -struct start_join_net_params { - UCHAR net_type; - UCHAR ssid[ESSID_SIZE]; - UCHAR reserved; - UCHAR privacy_can_join; -}; - -/****** Command Control Structure area at Shared ram offset 0x0400 ***********/ -/* Structures for command specific parameters (ccs.var) */ -struct update_param_cmd { - UCHAR object_id; - UCHAR number_objects; - UCHAR failure_cause; -}; -struct report_param_cmd { - UCHAR object_id; - UCHAR number_objects; - UCHAR failure_cause; - UCHAR length; -}; -struct start_network_cmd { - UCHAR update_param; - UCHAR bssid[ADDRLEN]; - UCHAR net_initiated; - UCHAR net_default_tx_rate; - UCHAR encryption; -}; -struct join_network_cmd { - UCHAR update_param; - UCHAR bssid[ADDRLEN]; - UCHAR net_initiated; - UCHAR net_default_tx_rate; - UCHAR encryption; -}; -struct tx_requested_cmd { - - UCHAR tx_data_ptr[2]; - UCHAR tx_data_length[2]; - UCHAR host_reserved[2]; - UCHAR reserved[3]; - UCHAR tx_rate; - UCHAR pow_sav_mode; - UCHAR retries; - UCHAR antenna; -}; -struct tx_requested_cmd_4 { - - UCHAR tx_data_ptr[2]; - UCHAR tx_data_length[2]; - UCHAR dest_addr[ADDRLEN]; - UCHAR pow_sav_mode; - UCHAR retries; - UCHAR station_id; -}; -struct memory_dump_cmd { - UCHAR memory_type; - UCHAR memory_ptr[2]; - UCHAR length; -}; -struct update_association_cmd { - UCHAR status; - UCHAR aid[2]; -}; -struct start_timer_cmd { - UCHAR duration[2]; -}; - -struct ccs { - UCHAR buffer_status; /* 0 = buffer free, 1 = buffer busy */ - /* 2 = command complete, 3 = failed */ - UCHAR cmd; /* command to ECF */ - UCHAR link; /* link to next CCS, FF=end of list */ - /* command specific parameters */ - union { - char reserved[13]; - struct update_param_cmd update_param; - struct report_param_cmd report_param; - UCHAR nummulticast; - UCHAR mode; - struct start_network_cmd start_network; - struct join_network_cmd join_network; - struct tx_requested_cmd tx_request; - struct memory_dump_cmd memory_dump; - struct update_association_cmd update_assoc; - struct start_timer_cmd start_timer; - } var; -}; - -/*****************************************************************************/ -/* Transmit buffer structures */ -struct tib_structure { - UCHAR ccs_index; - UCHAR psm; - UCHAR pass_fail; - UCHAR retry_count; - UCHAR max_retries; - UCHAR frags_remaining; - UCHAR no_rb; - UCHAR rts_reqd; - UCHAR csma_tx_cntrl_2; - UCHAR sifs_tx_cntrl_2; - UCHAR tx_dma_addr_1[2]; - UCHAR tx_dma_addr_2[2]; - UCHAR var_dur_2mhz[2]; - UCHAR var_dur_1mhz[2]; - UCHAR max_dur_2mhz[2]; - UCHAR max_dur_1mhz[2]; - UCHAR hdr_len; - UCHAR max_frag_len[2]; - UCHAR var_len[2]; - UCHAR phy_hdr_4; - UCHAR mac_hdr_1; - UCHAR mac_hdr_2; - UCHAR sid[2]; -}; - -struct phy_header { - UCHAR sfd[2]; - UCHAR hdr_3; - UCHAR hdr_4; -}; -struct rx_msg { - struct mac_header mac; - UCHAR var[1]; -}; - -struct tx_msg { - struct tib_structure tib; - struct phy_header phy; - struct mac_header mac; - UCHAR var[1]; -}; - -/****** ECF Receive Control Stucture (RCS) Area at Shared RAM offset 0x0800 */ -/* Structures for command specific parameters (rcs.var) */ -struct rx_packet_cmd { - UCHAR rx_data_ptr[2]; - UCHAR rx_data_length[2]; - UCHAR rx_sig_lev; - UCHAR next_frag_rcs_index; - UCHAR totalpacketlength[2]; -}; -struct rejoin_net_cmplt_cmd { - UCHAR reserved; - UCHAR bssid[ADDRLEN]; -}; -struct japan_call_sign_rxd { - UCHAR rxd_call_sign[8]; - UCHAR reserved[5]; -}; - -struct rcs { - UCHAR buffer_status; - UCHAR interrupt_id; - UCHAR link_field; - /* command specific parameters */ - union { - UCHAR reserved[13]; - struct rx_packet_cmd rx_packet; - struct rejoin_net_cmplt_cmd rejoin_net_complete; - struct japan_call_sign_rxd japan_call_sign; - } var; -}; - -/****** Startup parameter structures for both versions of firmware ***********/ -struct b4_startup_params { - UCHAR a_network_type; /* C_ADHOC, C_INFRA */ - UCHAR a_acting_as_ap_status; /* C_TYPE_STA, C_TYPE_AP */ - UCHAR a_current_ess_id[ESSID_SIZE]; /* Null terminated unless 32 long */ - UCHAR a_scanning_mode; /* passive 0, active 1 */ - UCHAR a_power_mgt_state; /* CAM 0, */ - UCHAR a_mac_addr[ADDRLEN]; /* */ - UCHAR a_frag_threshold[2]; /* 512 */ - UCHAR a_hop_time[2]; /* 16k * 2**n, n=0-4 in Kus */ - UCHAR a_beacon_period[2]; /* n * a_hop_time in Kus */ - UCHAR a_dtim_period; /* in beacons */ - UCHAR a_retry_max; /* */ - UCHAR a_ack_timeout; /* */ - UCHAR a_sifs; /* */ - UCHAR a_difs; /* */ - UCHAR a_pifs; /* */ - UCHAR a_rts_threshold[2]; /* */ - UCHAR a_scan_dwell_time[2]; /* */ - UCHAR a_max_scan_dwell_time[2]; /* */ - UCHAR a_assoc_resp_timeout_thresh; /* */ - UCHAR a_adhoc_scan_cycle_max; /* */ - UCHAR a_infra_scan_cycle_max; /* */ - UCHAR a_infra_super_scan_cycle_max; /* */ - UCHAR a_promiscuous_mode; /* */ - UCHAR a_unique_word[2]; /* */ - UCHAR a_slot_time; /* */ - UCHAR a_roaming_low_snr_thresh; /* */ - UCHAR a_low_snr_count_thresh; /* */ - UCHAR a_infra_missed_bcn_thresh; /* */ - UCHAR a_adhoc_missed_bcn_thresh; /* */ - UCHAR a_curr_country_code; /* C_USA */ - UCHAR a_hop_pattern; /* */ - UCHAR a_hop_pattern_length; /* */ -/* b4 - b5 differences start here */ - UCHAR a_cw_max; /* */ - UCHAR a_cw_min; /* */ - UCHAR a_noise_filter_gain; /* */ - UCHAR a_noise_limit_offset; /* */ - UCHAR a_det_rssi_thresh_offset; /* */ - UCHAR a_med_busy_thresh_offset; /* */ - UCHAR a_det_sync_thresh; /* */ - UCHAR a_test_mode; /* */ - UCHAR a_test_min_chan_num; /* */ - UCHAR a_test_max_chan_num; /* */ - UCHAR a_rx_tx_delay; /* */ - UCHAR a_current_bss_id[ADDRLEN]; /* */ - UCHAR a_hop_set; /* */ -}; -struct b5_startup_params { - UCHAR a_network_type; /* C_ADHOC, C_INFRA */ - UCHAR a_acting_as_ap_status; /* C_TYPE_STA, C_TYPE_AP */ - UCHAR a_current_ess_id[ESSID_SIZE]; /* Null terminated unless 32 long */ - UCHAR a_scanning_mode; /* passive 0, active 1 */ - UCHAR a_power_mgt_state; /* CAM 0, */ - UCHAR a_mac_addr[ADDRLEN]; /* */ - UCHAR a_frag_threshold[2]; /* 512 */ - UCHAR a_hop_time[2]; /* 16k * 2**n, n=0-4 in Kus */ - UCHAR a_beacon_period[2]; /* n * a_hop_time in Kus */ - UCHAR a_dtim_period; /* in beacons */ - UCHAR a_retry_max; /* 4 */ - UCHAR a_ack_timeout; /* */ - UCHAR a_sifs; /* */ - UCHAR a_difs; /* */ - UCHAR a_pifs; /* */ - UCHAR a_rts_threshold[2]; /* */ - UCHAR a_scan_dwell_time[2]; /* */ - UCHAR a_max_scan_dwell_time[2]; /* */ - UCHAR a_assoc_resp_timeout_thresh; /* */ - UCHAR a_adhoc_scan_cycle_max; /* */ - UCHAR a_infra_scan_cycle_max; /* */ - UCHAR a_infra_super_scan_cycle_max; /* */ - UCHAR a_promiscuous_mode; /* */ - UCHAR a_unique_word[2]; /* */ - UCHAR a_slot_time; /* */ - UCHAR a_roaming_low_snr_thresh; /* */ - UCHAR a_low_snr_count_thresh; /* */ - UCHAR a_infra_missed_bcn_thresh; /* */ - UCHAR a_adhoc_missed_bcn_thresh; /* */ - UCHAR a_curr_country_code; /* C_USA */ - UCHAR a_hop_pattern; /* */ - UCHAR a_hop_pattern_length; /* */ -/* b4 - b5 differences start here */ - UCHAR a_cw_max[2]; /* */ - UCHAR a_cw_min[2]; /* */ - UCHAR a_noise_filter_gain; /* */ - UCHAR a_noise_limit_offset; /* */ - UCHAR a_det_rssi_thresh_offset; /* */ - UCHAR a_med_busy_thresh_offset; /* */ - UCHAR a_det_sync_thresh; /* */ - UCHAR a_test_mode; /* */ - UCHAR a_test_min_chan_num; /* */ - UCHAR a_test_max_chan_num; /* */ - UCHAR a_allow_bcast_SSID_probe_rsp; - UCHAR a_privacy_must_start; - UCHAR a_privacy_can_join; - UCHAR a_basic_rate_set[8]; -}; - -/*****************************************************************************/ -#define RAY_IOCG_PARMS (SIOCDEVPRIVATE) -#define RAY_IOCS_PARMS (SIOCDEVPRIVATE + 1) -#define RAY_DO_CMD (SIOCDEVPRIVATE + 2) - -/****** ethernet <-> 802.11 translation **************************************/ -typedef struct snaphdr_t -{ - UCHAR dsap; - UCHAR ssap; - UCHAR ctrl; - UCHAR org[3]; - UCHAR ethertype[2]; -} snaphdr_t; - -#define BRIDGE_ENCAP 0xf80000 -#define RFC1042_ENCAP 0 -#define SNAP_ID 0x0003aaaa -#define RAY_IPX_TYPE 0x8137 -#define APPLEARP_TYPE 0x80f3 -/*****************************************************************************/ -#endif /* #ifndef RAYLINK_H */ diff -Nru a/drivers/net/setup.c b/drivers/net/setup.c --- a/drivers/net/setup.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/setup.c Thu Feb 20 23:19:23 2003 @@ -14,10 +14,6 @@ extern int dmascc_init(void); -extern int awc4500_pci_probe(void); -extern int awc4500_isa_probe(void); -extern int awc4500_pnp_probe(void); -extern int awc4500_365_probe(void); extern int arcnet_init(void); extern int scc_enet_init(void); extern int fec_enet_init(void); @@ -79,23 +75,6 @@ {lmc_setup, 0}, #endif -/* -* -* Wireless non-HAM -* -*/ -#ifdef CONFIG_AIRONET4500_NONCS - -#ifdef CONFIG_AIRONET4500_PCI - {awc4500_pci_probe,0}, -#endif - -#ifdef CONFIG_AIRONET4500_PNP - {awc4500_pnp_probe,0}, -#endif - -#endif - /* * Token Ring Drivers */ diff -Nru a/drivers/net/sis900.c b/drivers/net/sis900.c --- a/drivers/net/sis900.c Thu Feb 20 23:19:21 2003 +++ b/drivers/net/sis900.c Thu Feb 20 23:19:21 2003 @@ -526,7 +526,7 @@ mii_status = mdio_read(net_dev, phy_addr, MII_STATUS); if (mii_status == 0xffff || mii_status == 0x0000) - /* the mii is not accessable, try next one */ + /* the mii is not accessible, try next one */ continue; if ((mii_phy = kmalloc(sizeof(struct mii_phy), GFP_KERNEL)) == NULL) { diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c --- a/drivers/net/sk98lin/skge.c Thu Feb 20 23:19:20 2003 +++ b/drivers/net/sk98lin/skge.c Thu Feb 20 23:19:20 2003 @@ -2516,7 +2516,7 @@ /* * Do not set the Limit to 0, because this could cause * wrap around with ReQueue'ed buffers (a buffer could - * be requeued in the same position, made accessable to + * be requeued in the same position, made accessible to * the hardware, and the hardware could change its * contents! */ diff -Nru a/drivers/net/sk98lin/skgeinit.c b/drivers/net/sk98lin/skgeinit.c --- a/drivers/net/sk98lin/skgeinit.c Thu Feb 20 23:19:22 2003 +++ b/drivers/net/sk98lin/skgeinit.c Thu Feb 20 23:19:22 2003 @@ -181,7 +181,7 @@ * * Revision 1.21 1998/10/20 12:11:56 malthoff * Don't dendy the Queue config if the size of the unused - * rx qeueu is zero. + * rx queue is zero. * * Revision 1.20 1998/10/19 07:27:58 malthoff * SkGeInitRamIface() is public to be called by diagnostics. @@ -1781,7 +1781,7 @@ * Returns: * 0: success * 1: Number of MACs exceeds SK_MAX_MACS ( after level 1) - * 2: Adapter not present or not accessable + * 2: Adapter not present or not accessible * 3: Illegal initialization level * 4: Initialization Level 1 Call missing * 5: Unexpected PHY type detected @@ -1808,7 +1808,7 @@ /* Initialization Level 1 */ RetVal = SkGeInit1(pAC, IoC); - /* Check if the adapter seems to be accessable */ + /* Check if the adapter seems to be accessible */ SK_OUT32(IoC, B2_IRQM_INI, 0x11335577L); SK_IN32(IoC, B2_IRQM_INI, &DWord); SK_OUT32(IoC, B2_IRQM_INI, 0x00000000L); diff -Nru a/drivers/net/skfp/pmf.c b/drivers/net/skfp/pmf.c --- a/drivers/net/skfp/pmf.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/skfp/pmf.c Thu Feb 20 23:19:23 2003 @@ -122,7 +122,7 @@ /* * PRIVATE EXTENSIONS - * only accessable locally to get/set passwd + * only accessible locally to get/set passwd */ { SMT_P10F0,AC_GR, MOFFSA(fddiPRPMFPasswd), "8" } , { SMT_P10F1,AC_GR, MOFFSS(fddiPRPMFStation), "8" } , @@ -211,7 +211,7 @@ /* * PRIVATE EXTENSIONS - * only accessable locally to get/set TMIN + * only accessible locally to get/set TMIN */ { SMT_P20F0,AC_NA } , { SMT_P20F1,AC_GR, MOFFMS(fddiMACT_Min), "lT" } , diff -Nru a/drivers/net/strip.c b/drivers/net/strip.c --- a/drivers/net/strip.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,2877 +0,0 @@ -/* - * Copyright 1996 The Board of Trustees of The Leland Stanford - * Junior University. All Rights Reserved. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies. Stanford University - * makes no representations about the suitability of this - * software for any purpose. It is provided "as is" without - * express or implied warranty. - * - * strip.c This module implements Starmode Radio IP (STRIP) - * for kernel-based devices like TTY. It interfaces between a - * raw TTY, and the kernel's INET protocol layers (via DDI). - * - * Version: @(#)strip.c 1.3 July 1997 - * - * Author: Stuart Cheshire - * - * Fixes: v0.9 12th Feb 1996 (SC) - * New byte stuffing (2+6 run-length encoding) - * New watchdog timer task - * New Protocol key (SIP0) - * - * v0.9.1 3rd March 1996 (SC) - * Changed to dynamic device allocation -- no more compile - * time (or boot time) limit on the number of STRIP devices. - * - * v0.9.2 13th March 1996 (SC) - * Uses arp cache lookups (but doesn't send arp packets yet) - * - * v0.9.3 17th April 1996 (SC) - * Fixed bug where STR_ERROR flag was getting set unneccessarily - * (causing otherwise good packets to be unneccessarily dropped) - * - * v0.9.4 27th April 1996 (SC) - * First attempt at using "&COMMAND" Starmode AT commands - * - * v0.9.5 29th May 1996 (SC) - * First attempt at sending (unicast) ARP packets - * - * v0.9.6 5th June 1996 (Elliot) - * Put "message level" tags in every "printk" statement - * - * v0.9.7 13th June 1996 (laik) - * Added support for the /proc fs - * - * v0.9.8 July 1996 (Mema) - * Added packet logging - * - * v1.0 November 1996 (SC) - * Fixed (severe) memory leaks in the /proc fs code - * Fixed race conditions in the logging code - * - * v1.1 January 1997 (SC) - * Deleted packet logging (use tcpdump instead) - * Added support for Metricom Firmware v204 features - * (like message checksums) - * - * v1.2 January 1997 (SC) - * Put portables list back in - * - * v1.3 July 1997 (SC) - * Made STRIP driver set the radio's baud rate automatically. - * It is no longer necessarily to manually set the radio's - * rate permanently to 115200 -- the driver handles setting - * the rate automatically. - */ - -#ifdef MODULE -static const char StripVersion[] = "1.3-STUART.CHESHIRE-MODULAR"; -#else -static const char StripVersion[] = "1.3-STUART.CHESHIRE"; -#endif - -#define TICKLE_TIMERS 0 -#define EXT_COUNTERS 1 - - -/************************************************************************/ -/* Header files */ - -#include -#include -#include -#include -#include -#include -#include - -/* - * isdigit() and isspace() use the ctype[] array, which is not available - * to kernel modules. If compiling as a module, use a local definition - * of isdigit() and isspace() until _ctype is added to ksyms. - */ -#ifdef MODULE -# define isdigit(c) ('0' <= (c) && (c) <= '9') -# define isspace(c) ((c) == ' ' || (c) == '\t') -#else -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -/************************************************************************/ -/* Useful structures and definitions */ - -/* - * A MetricomKey identifies the protocol being carried inside a Metricom - * Starmode packet. - */ - -typedef union -{ - __u8 c[4]; - __u32 l; -} MetricomKey; - -/* - * An IP address can be viewed as four bytes in memory (which is what it is) or as - * a single 32-bit long (which is convenient for assignment, equality testing etc.) - */ - -typedef union -{ - __u8 b[4]; - __u32 l; -} IPaddr; - -/* - * A MetricomAddressString is used to hold a printable representation of - * a Metricom address. - */ - -typedef struct -{ - __u8 c[24]; -} MetricomAddressString; - -/* Encapsulation can expand packet of size x to 65/64x + 1 - * Sent packet looks like "*
*" - * 1 1 1-18 1 4 ? 1 - * eg. *0000-1234*SIP0 - * We allow 31 bytes for the stars, the key, the address and the s - */ -#define STRIP_ENCAP_SIZE(X) (32 + (X)*65L/64L) - -/* - * A STRIP_Header is never really sent over the radio, but making a dummy - * header for internal use within the kernel that looks like an Ethernet - * header makes certain other software happier. For example, tcpdump - * already understands Ethernet headers. - */ - -typedef struct -{ - MetricomAddress dst_addr; /* Destination address, e.g. "0000-1234" */ - MetricomAddress src_addr; /* Source address, e.g. "0000-5678" */ - unsigned short protocol; /* The protocol type, using Ethernet codes */ -} STRIP_Header; - -typedef struct -{ - char c[60]; -} MetricomNode; - -#define NODE_TABLE_SIZE 32 -typedef struct -{ - struct timeval timestamp; - int num_nodes; - MetricomNode node[NODE_TABLE_SIZE]; -} MetricomNodeTable; - -enum { FALSE = 0, TRUE = 1 }; - -/* - * Holds the radio's firmware version. - */ -typedef struct -{ - char c[50]; -} FirmwareVersion; - -/* - * Holds the radio's serial number. - */ -typedef struct -{ - char c[18]; -} SerialNumber; - -/* - * Holds the radio's battery voltage. - */ -typedef struct -{ - char c[11]; -} BatteryVoltage; - -typedef struct -{ - char c[8]; -} char8; - -enum -{ - NoStructure = 0, /* Really old firmware */ - StructuredMessages = 1, /* Parsable AT response msgs */ - ChecksummedMessages = 2 /* Parsable AT response msgs with checksums */ -} FirmwareLevel; - -struct strip -{ - int magic; - /* - * These are pointers to the malloc()ed frame buffers. - */ - - unsigned char *rx_buff; /* buffer for received IP packet*/ - unsigned char *sx_buff; /* buffer for received serial data*/ - int sx_count; /* received serial data counter */ - int sx_size; /* Serial buffer size */ - unsigned char *tx_buff; /* transmitter buffer */ - unsigned char *tx_head; /* pointer to next byte to XMIT */ - int tx_left; /* bytes left in XMIT queue */ - int tx_size; /* Serial buffer size */ - - /* - * STRIP interface statistics. - */ - - unsigned long rx_packets; /* inbound frames counter */ - unsigned long tx_packets; /* outbound frames counter */ - unsigned long rx_errors; /* Parity, etc. errors */ - unsigned long tx_errors; /* Planned stuff */ - unsigned long rx_dropped; /* No memory for skb */ - unsigned long tx_dropped; /* When MTU change */ - unsigned long rx_over_errors; /* Frame bigger then STRIP buf. */ - - unsigned long pps_timer; /* Timer to determine pps */ - unsigned long rx_pps_count; /* Counter to determine pps */ - unsigned long tx_pps_count; /* Counter to determine pps */ - unsigned long sx_pps_count; /* Counter to determine pps */ - unsigned long rx_average_pps; /* rx packets per second * 8 */ - unsigned long tx_average_pps; /* tx packets per second * 8 */ - unsigned long sx_average_pps; /* sent packets per second * 8 */ - -#ifdef EXT_COUNTERS - unsigned long rx_bytes; /* total received bytes */ - unsigned long tx_bytes; /* total received bytes */ - unsigned long rx_rbytes; /* bytes thru radio i/f */ - unsigned long tx_rbytes; /* bytes thru radio i/f */ - unsigned long rx_sbytes; /* tot bytes thru serial i/f */ - unsigned long tx_sbytes; /* tot bytes thru serial i/f */ - unsigned long rx_ebytes; /* tot stat/err bytes */ - unsigned long tx_ebytes; /* tot stat/err bytes */ -#endif - - /* - * Internal variables. - */ - - struct strip *next; /* The next struct in the list */ - struct strip **referrer; /* The pointer that points to us*/ - int discard; /* Set if serial error */ - int working; /* Is radio working correctly? */ - int firmware_level; /* Message structuring level */ - int next_command; /* Next periodic command */ - unsigned int user_baud; /* The user-selected baud rate */ - int mtu; /* Our mtu (to spot changes!) */ - long watchdog_doprobe; /* Next time to test the radio */ - long watchdog_doreset; /* Time to do next reset */ - long gratuitous_arp; /* Time to send next ARP refresh*/ - long arp_interval; /* Next ARP interval */ - struct timer_list idle_timer; /* For periodic wakeup calls */ - MetricomAddress true_dev_addr; /* True address of radio */ - int manual_dev_addr; /* Hack: See note below */ - - FirmwareVersion firmware_version; /* The radio's firmware version */ - SerialNumber serial_number; /* The radio's serial number */ - BatteryVoltage battery_voltage; /* The radio's battery voltage */ - - /* - * Other useful structures. - */ - - struct tty_struct *tty; /* ptr to TTY structure */ - struct net_device dev; /* Our device structure */ - - /* - * Neighbour radio records - */ - - MetricomNodeTable portables; - MetricomNodeTable poletops; -}; - -/* - * Note: manual_dev_addr hack - * - * It is not possible to change the hardware address of a Metricom radio, - * or to send packets with a user-specified hardware source address, thus - * trying to manually set a hardware source address is a questionable - * thing to do. However, if the user *does* manually set the hardware - * source address of a STRIP interface, then the kernel will believe it, - * and use it in certain places. For example, the hardware address listed - * by ifconfig will be the manual address, not the true one. - * (Both addresses are listed in /proc/net/strip.) - * Also, ARP packets will be sent out giving the user-specified address as - * the source address, not the real address. This is dangerous, because - * it means you won't receive any replies -- the ARP replies will go to - * the specified address, which will be some other radio. The case where - * this is useful is when that other radio is also connected to the same - * machine. This allows you to connect a pair of radios to one machine, - * and to use one exclusively for inbound traffic, and the other - * exclusively for outbound traffic. Pretty neat, huh? - * - * Here's the full procedure to set this up: - * - * 1. "slattach" two interfaces, e.g. st0 for outgoing packets, - * and st1 for incoming packets - * - * 2. "ifconfig" st0 (outbound radio) to have the hardware address - * which is the real hardware address of st1 (inbound radio). - * Now when it sends out packets, it will masquerade as st1, and - * replies will be sent to that radio, which is exactly what we want. - * - * 3. Set the route table entry ("route add default ..." or - * "route add -net ...", as appropriate) to send packets via the st0 - * interface (outbound radio). Do not add any route which sends packets - * out via the st1 interface -- that radio is for inbound traffic only. - * - * 4. "ifconfig" st1 (inbound radio) to have hardware address zero. - * This tells the STRIP driver to "shut down" that interface and not - * send any packets through it. In particular, it stops sending the - * periodic gratuitous ARP packets that a STRIP interface normally sends. - * Also, when packets arrive on that interface, it will search the - * interface list to see if there is another interface who's manual - * hardware address matches its own real address (i.e. st0 in this - * example) and if so it will transfer ownership of the skbuff to - * that interface, so that it looks to the kernel as if the packet - * arrived on that interface. This is necessary because when the - * kernel sends an ARP packet on st0, it expects to get a reply on - * st0, and if it sees the reply come from st1 then it will ignore - * it (to be accurate, it puts the entry in the ARP table, but - * labelled in such a way that st0 can't use it). - * - * Thanks to Petros Maniatis for coming up with the idea of splitting - * inbound and outbound traffic between two interfaces, which turned - * out to be really easy to implement, even if it is a bit of a hack. - * - * Having set a manual address on an interface, you can restore it - * to automatic operation (where the address is automatically kept - * consistent with the real address of the radio) by setting a manual - * address of all ones, e.g. "ifconfig st0 hw strip FFFFFFFFFFFF" - * This 'turns off' manual override mode for the device address. - * - * Note: The IEEE 802 headers reported in tcpdump will show the *real* - * radio addresses the packets were sent and received from, so that you - * can see what is really going on with packets, and which interfaces - * they are really going through. - */ - - -/************************************************************************/ -/* Constants */ - -/* - * CommandString1 works on all radios - * Other CommandStrings are only used with firmware that provides structured responses. - * - * ats319=1 Enables Info message for node additions and deletions - * ats319=2 Enables Info message for a new best node - * ats319=4 Enables checksums - * ats319=8 Enables ACK messages - */ - -static const int MaxCommandStringLength = 32; -static const int CompatibilityCommand = 1; - -static const char CommandString0[] = "*&COMMAND*ATS319=7"; /* Turn on checksums & info messages */ -static const char CommandString1[] = "*&COMMAND*ATS305?"; /* Query radio name */ -static const char CommandString2[] = "*&COMMAND*ATS325?"; /* Query battery voltage */ -static const char CommandString3[] = "*&COMMAND*ATS300?"; /* Query version information */ -static const char CommandString4[] = "*&COMMAND*ATS311?"; /* Query poletop list */ -static const char CommandString5[] = "*&COMMAND*AT~LA"; /* Query portables list */ -typedef struct { const char *string; long length; } StringDescriptor; - -static const StringDescriptor CommandString[] = - { - { CommandString0, sizeof(CommandString0)-1 }, - { CommandString1, sizeof(CommandString1)-1 }, - { CommandString2, sizeof(CommandString2)-1 }, - { CommandString3, sizeof(CommandString3)-1 }, - { CommandString4, sizeof(CommandString4)-1 }, - { CommandString5, sizeof(CommandString5)-1 } - }; - -#define GOT_ALL_RADIO_INFO(S) \ - ((S)->firmware_version.c[0] && \ - (S)->battery_voltage.c[0] && \ - memcmp(&(S)->true_dev_addr, zero_address.c, sizeof(zero_address))) - -static const char hextable[16] = "0123456789ABCDEF"; - -static const MetricomAddress zero_address; -static const MetricomAddress broadcast_address = { { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF } }; - -static const MetricomKey SIP0Key = { { "SIP0" } }; -static const MetricomKey ARP0Key = { { "ARP0" } }; -static const MetricomKey ATR_Key = { { "ATR " } }; -static const MetricomKey ACK_Key = { { "ACK_" } }; -static const MetricomKey INF_Key = { { "INF_" } }; -static const MetricomKey ERR_Key = { { "ERR_" } }; - -static const long MaxARPInterval = 60 * HZ; /* One minute */ - -/* - * Maximum Starmode packet length is 1183 bytes. Allowing 4 bytes for - * protocol key, 4 bytes for checksum, one byte for CR, and 65/64 expansion - * for STRIP encoding, that translates to a maximum payload MTU of 1155. - * Note: A standard NFS 1K data packet is a total of 0x480 (1152) bytes - * long, including IP header, UDP header, and NFS header. Setting the STRIP - * MTU to 1152 allows us to send default sized NFS packets without fragmentation. - */ -static const unsigned short MAX_SEND_MTU = 1152; -static const unsigned short MAX_RECV_MTU = 1500; /* Hoping for Ethernet sized packets in the future! */ -static const unsigned short DEFAULT_STRIP_MTU = 1152; -static const int STRIP_MAGIC = 0x5303; -static const long LongTime = 0x7FFFFFFF; - - -/************************************************************************/ -/* Global variables */ - -static struct strip *struct_strip_list; - - -/************************************************************************/ -/* Macros */ - -/* Returns TRUE if text T begins with prefix P */ -#define has_prefix(T,L,P) (((L) >= sizeof(P)-1) && !strncmp((T), (P), sizeof(P)-1)) - -/* Returns TRUE if text T of length L is equal to string S */ -#define text_equal(T,L,S) (((L) == sizeof(S)-1) && !strncmp((T), (S), sizeof(S)-1)) - -#define READHEX(X) ((X)>='0' && (X)<='9' ? (X)-'0' : \ - (X)>='a' && (X)<='f' ? (X)-'a'+10 : \ - (X)>='A' && (X)<='F' ? (X)-'A'+10 : 0 ) - -#define READHEX16(X) ((__u16)(READHEX(X))) - -#define READDEC(X) ((X)>='0' && (X)<='9' ? (X)-'0' : 0) - -#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) -#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) -#define ELEMENTS_OF(X) (sizeof(X) / sizeof((X)[0])) -#define ARRAY_END(X) (&((X)[ELEMENTS_OF(X)])) - -#define JIFFIE_TO_SEC(X) ((X) / HZ) - - -/************************************************************************/ -/* Utility routines */ - -typedef unsigned long InterruptStatus; - -static inline InterruptStatus DisableInterrupts(void) -{ - InterruptStatus x; - save_flags(x); - cli(); - return(x); -} - -static inline void RestoreInterrupts(InterruptStatus x) -{ - restore_flags(x); -} - -static int arp_query(unsigned char *haddr, u32 paddr, struct net_device * dev) -{ - struct neighbour *neighbor_entry; - - neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev); - - if (neighbor_entry != NULL) - { - neighbor_entry->used = jiffies; - if (neighbor_entry->nud_state & NUD_VALID) - { - memcpy(haddr, neighbor_entry->ha, dev->addr_len); - return 1; - } - } - return 0; -} - -static void DumpData(char *msg, struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - static const int MAX_DumpData = 80; - __u8 pkt_text[MAX_DumpData], *p = pkt_text; - - *p++ = '\"'; - - while (ptr= 32 && *ptr <= 126) - { - *p++ = *ptr; - } - else - { - sprintf(p, "\\%02X", *ptr); - p+= 3; - } - } - ptr++; - } - - if (ptr == end) - { - *p++ = '\"'; - } - - *p++ = 0; - - printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev.name, msg, pkt_text); -} - -#if 0 -static void HexDump(char *msg, struct strip *strip_info, __u8 *start, __u8 *end) -{ - __u8 *ptr = start; - printk(KERN_INFO "%s: %s: %d bytes\n", strip_info->dev.name, msg, end-ptr); - - while (ptr < end) - { - long offset = ptr - start; - __u8 text[80], *p = text; - while (ptr < end && p < &text[16*3]) - { - *p++ = hextable[*ptr >> 4]; - *p++ = hextable[*ptr++ & 0xF]; - *p++ = ' '; - } - p[-1] = 0; - printk(KERN_INFO "%s: %4lX %s\n", strip_info->dev.name, offset, text); - } -} -#endif - - -/************************************************************************/ -/* Byte stuffing/unstuffing routines */ - -/* Stuffing scheme: - * 00 Unused (reserved character) - * 01-3F Run of 2-64 different characters - * 40-7F Run of 1-64 different characters plus a single zero at the end - * 80-BF Run of 1-64 of the same character - * C0-FF Run of 1-64 zeroes (ASCII 0) - */ - -typedef enum -{ - Stuff_Diff = 0x00, - Stuff_DiffZero = 0x40, - Stuff_Same = 0x80, - Stuff_Zero = 0xC0, - Stuff_NoCode = 0xFF, /* Special code, meaning no code selected */ - - Stuff_CodeMask = 0xC0, - Stuff_CountMask = 0x3F, - Stuff_MaxCount = 0x3F, - Stuff_Magic = 0x0D /* The value we are eliminating */ -} StuffingCode; - -/* StuffData encodes the data starting at "src" for "length" bytes. - * It writes it to the buffer pointed to by "dst" (which must be at least - * as long as 1 + 65/64 of the input length). The output may be up to 1.6% - * larger than the input for pathological input, but will usually be smaller. - * StuffData returns the new value of the dst pointer as its result. - * "code_ptr_ptr" points to a "__u8 *" which is used to hold encoding state - * between calls, allowing an encoded packet to be incrementally built up - * from small parts. On the first call, the "__u8 *" pointed to should be - * initialized to NULL; between subsequent calls the calling routine should - * leave the value alone and simply pass it back unchanged so that the - * encoder can recover its current state. - */ - -#define StuffData_FinishBlock(X) \ -(*code_ptr = (X) ^ Stuff_Magic, code = Stuff_NoCode) - -static __u8 *StuffData(__u8 *src, __u32 length, __u8 *dst, __u8 **code_ptr_ptr) -{ - __u8 *end = src + length; - __u8 *code_ptr = *code_ptr_ptr; - __u8 code = Stuff_NoCode, count = 0; - - if (!length) - return(dst); - - if (code_ptr) - { - /* - * Recover state from last call, if applicable - */ - code = (*code_ptr ^ Stuff_Magic) & Stuff_CodeMask; - count = (*code_ptr ^ Stuff_Magic) & Stuff_CountMask; - } - - while (src < end) - { - switch (code) - { - /* Stuff_NoCode: If no current code, select one */ - case Stuff_NoCode: - /* Record where we're going to put this code */ - code_ptr = dst++; - count = 0; /* Reset the count (zero means one instance) */ - /* Tentatively start a new block */ - if (*src == 0) - { - code = Stuff_Zero; - src++; - } - else - { - code = Stuff_Same; - *dst++ = *src++ ^ Stuff_Magic; - } - /* Note: We optimistically assume run of same -- */ - /* which will be fixed later in Stuff_Same */ - /* if it turns out not to be true. */ - break; - - /* Stuff_Zero: We already have at least one zero encoded */ - case Stuff_Zero: - /* If another zero, count it, else finish this code block */ - if (*src == 0) - { - count++; - src++; - } - else - { - StuffData_FinishBlock(Stuff_Zero + count); - } - break; - - /* Stuff_Same: We already have at least one byte encoded */ - case Stuff_Same: - /* If another one the same, count it */ - if ((*src ^ Stuff_Magic) == code_ptr[1]) - { - count++; - src++; - break; - } - /* else, this byte does not match this block. */ - /* If we already have two or more bytes encoded, finish this code block */ - if (count) - { - StuffData_FinishBlock(Stuff_Same + count); - break; - } - /* else, we only have one so far, so switch to Stuff_Diff code */ - code = Stuff_Diff; - /* and fall through to Stuff_Diff case below - * Note cunning cleverness here: case Stuff_Diff compares - * the current character with the previous two to see if it - * has a run of three the same. Won't this be an error if - * there aren't two previous characters stored to compare with? - * No. Because we know the current character is *not* the same - * as the previous one, the first test below will necessarily - * fail and the send half of the "if" won't be executed. - */ - - /* Stuff_Diff: We have at least two *different* bytes encoded */ - case Stuff_Diff: - /* If this is a zero, must encode a Stuff_DiffZero, and begin a new block */ - if (*src == 0) - { - StuffData_FinishBlock(Stuff_DiffZero + count); - } - /* else, if we have three in a row, it is worth starting a Stuff_Same block */ - else if ((*src ^ Stuff_Magic)==dst[-1] && dst[-1]==dst[-2]) - { - /* Back off the last two characters we encoded */ - code += count-2; - /* Note: "Stuff_Diff + 0" is an illegal code */ - if (code == Stuff_Diff + 0) - { - code = Stuff_Same + 0; - } - StuffData_FinishBlock(code); - code_ptr = dst-2; - /* dst[-1] already holds the correct value */ - count = 2; /* 2 means three bytes encoded */ - code = Stuff_Same; - } - /* else, another different byte, so add it to the block */ - else - { - *dst++ = *src ^ Stuff_Magic; - count++; - } - src++; /* Consume the byte */ - break; - } - if (count == Stuff_MaxCount) - { - StuffData_FinishBlock(code + count); - } - } - if (code == Stuff_NoCode) - { - *code_ptr_ptr = NULL; - } - else - { - *code_ptr_ptr = code_ptr; - StuffData_FinishBlock(code + count); - } - return(dst); -} - -/* - * UnStuffData decodes the data at "src", up to (but not including) "end". - * It writes the decoded data into the buffer pointed to by "dst", up to a - * maximum of "dst_length", and returns the new value of "src" so that a - * follow-on call can read more data, continuing from where the first left off. - * - * There are three types of results: - * 1. The source data runs out before extracting "dst_length" bytes: - * UnStuffData returns NULL to indicate failure. - * 2. The source data produces exactly "dst_length" bytes: - * UnStuffData returns new_src = end to indicate that all bytes were consumed. - * 3. "dst_length" bytes are extracted, with more remaining. - * UnStuffData returns new_src < end to indicate that there are more bytes - * to be read. - * - * Note: The decoding may be destructive, in that it may alter the source - * data in the process of decoding it (this is necessary to allow a follow-on - * call to resume correctly). - */ - -static __u8 *UnStuffData(__u8 *src, __u8 *end, __u8 *dst, __u32 dst_length) -{ - __u8 *dst_end = dst + dst_length; - /* Sanity check */ - if (!src || !end || !dst || !dst_length) - return(NULL); - while (src < end && dst < dst_end) - { - int count = (*src ^ Stuff_Magic) & Stuff_CountMask; - switch ((*src ^ Stuff_Magic) & Stuff_CodeMask) - { - case Stuff_Diff: - if (src+1+count >= end) - return(NULL); - do - { - *dst++ = *++src ^ Stuff_Magic; - } - while(--count >= 0 && dst < dst_end); - if (count < 0) - src += 1; - else - { - if (count == 0) - *src = Stuff_Same ^ Stuff_Magic; - else - *src = (Stuff_Diff + count) ^ Stuff_Magic; - } - break; - case Stuff_DiffZero: - if (src+1+count >= end) - return(NULL); - do - { - *dst++ = *++src ^ Stuff_Magic; - } - while(--count >= 0 && dst < dst_end); - if (count < 0) - *src = Stuff_Zero ^ Stuff_Magic; - else - *src = (Stuff_DiffZero + count) ^ Stuff_Magic; - break; - case Stuff_Same: - if (src+1 >= end) - return(NULL); - do - { - *dst++ = src[1] ^ Stuff_Magic; - } - while(--count >= 0 && dst < dst_end); - if (count < 0) - src += 2; - else - *src = (Stuff_Same + count) ^ Stuff_Magic; - break; - case Stuff_Zero: - do - { - *dst++ = 0; - } - while(--count >= 0 && dst < dst_end); - if (count < 0) - src += 1; - else - *src = (Stuff_Zero + count) ^ Stuff_Magic; - break; - } - } - if (dst < dst_end) - return(NULL); - else - return(src); -} - - -/************************************************************************/ -/* General routines for STRIP */ - -/* - * get_baud returns the current baud rate, as one of the constants defined in - * termbits.h - * If the user has issued a baud rate override using the 'setserial' command - * and the logical current rate is set to 38.4, then the true baud rate - * currently in effect (57.6 or 115.2) is returned. - */ -static unsigned int get_baud(struct tty_struct *tty) - { - if (!tty || !tty->termios) return(0); - if ((tty->termios->c_cflag & CBAUD) == B38400 && tty->driver_data) - { - struct async_struct *info = (struct async_struct *)tty->driver_data; - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI ) return(B57600); - if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) return(B115200); - } - return(tty->termios->c_cflag & CBAUD); - } - -/* - * set_baud sets the baud rate to the rate defined by baudcode - * Note: The rate B38400 should be avoided, because the user may have - * issued a 'setserial' speed override to map that to a different speed. - * We could achieve a true rate of 38400 if we needed to by cancelling - * any user speed override that is in place, but that might annoy the - * user, so it is simplest to just avoid using 38400. - */ -static void set_baud(struct tty_struct *tty, unsigned int baudcode) - { - struct termios old_termios = *(tty->termios); - tty->termios->c_cflag &= ~CBAUD; /* Clear the old baud setting */ - tty->termios->c_cflag |= baudcode; /* Set the new baud setting */ - tty->driver.set_termios(tty, &old_termios); - } - -/* - * Convert a string to a Metricom Address. - */ - -#define IS_RADIO_ADDRESS(p) ( \ - isdigit((p)[0]) && isdigit((p)[1]) && isdigit((p)[2]) && isdigit((p)[3]) && \ - (p)[4] == '-' && \ - isdigit((p)[5]) && isdigit((p)[6]) && isdigit((p)[7]) && isdigit((p)[8]) ) - -static int string_to_radio_address(MetricomAddress *addr, __u8 *p) -{ - if (!IS_RADIO_ADDRESS(p)) return(1); - addr->c[0] = 0; - addr->c[1] = 0; - addr->c[2] = READHEX(p[0]) << 4 | READHEX(p[1]); - addr->c[3] = READHEX(p[2]) << 4 | READHEX(p[3]); - addr->c[4] = READHEX(p[5]) << 4 | READHEX(p[6]); - addr->c[5] = READHEX(p[7]) << 4 | READHEX(p[8]); - return(0); -} - -/* - * Convert a Metricom Address to a string. - */ - -static __u8 *radio_address_to_string(const MetricomAddress *addr, MetricomAddressString *p) -{ - sprintf(p->c, "%02X%02X-%02X%02X", addr->c[2], addr->c[3], addr->c[4], addr->c[5]); - return(p->c); -} - -/* - * Note: Must make sure sx_size is big enough to receive a stuffed - * MAX_RECV_MTU packet. Additionally, we also want to ensure that it's - * big enough to receive a large radio neighbour list (currently 4K). - */ - -static int allocate_buffers(struct strip *strip_info) -{ - struct net_device *dev = &strip_info->dev; - int sx_size = MAX(STRIP_ENCAP_SIZE(MAX_RECV_MTU), 4096); - int tx_size = STRIP_ENCAP_SIZE(dev->mtu) + MaxCommandStringLength; - __u8 *r = kmalloc(MAX_RECV_MTU, GFP_ATOMIC); - __u8 *s = kmalloc(sx_size, GFP_ATOMIC); - __u8 *t = kmalloc(tx_size, GFP_ATOMIC); - if (r && s && t) - { - strip_info->rx_buff = r; - strip_info->sx_buff = s; - strip_info->tx_buff = t; - strip_info->sx_size = sx_size; - strip_info->tx_size = tx_size; - strip_info->mtu = dev->mtu; - return(1); - } - if (r) kfree(r); - if (s) kfree(s); - if (t) kfree(t); - return(0); -} - -/* - * MTU has been changed by the IP layer. Unfortunately we are not told - * about this, but we spot it ourselves and fix things up. We could be in - * an upcall from the tty driver, or in an ip packet queue. - */ - -static void strip_changedmtu(struct strip *strip_info) -{ - int old_mtu = strip_info->mtu; - struct net_device *dev = &strip_info->dev; - unsigned char *orbuff = strip_info->rx_buff; - unsigned char *osbuff = strip_info->sx_buff; - unsigned char *otbuff = strip_info->tx_buff; - InterruptStatus intstat; - - if (dev->mtu > MAX_SEND_MTU) - { - printk(KERN_ERR "%s: MTU exceeds maximum allowable (%d), MTU change cancelled.\n", - strip_info->dev.name, MAX_SEND_MTU); - dev->mtu = old_mtu; - return; - } - - /* - * Have to disable interrupts here because we're reallocating and resizing - * the serial buffers, and we can't have data arriving in them while we're - * moving them around in memory. This may cause data to be lost on the serial - * port, but hopefully people won't change MTU that often. - * Also note, this may not work on a symmetric multi-processor system. - */ - intstat = DisableInterrupts(); - - if (!allocate_buffers(strip_info)) - { - RestoreInterrupts(intstat); - printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n", - strip_info->dev.name); - dev->mtu = old_mtu; - return; - } - - if (strip_info->sx_count) - { - if (strip_info->sx_count <= strip_info->sx_size) - memcpy(strip_info->sx_buff, osbuff, strip_info->sx_count); - else - { - strip_info->discard = strip_info->sx_count; - strip_info->rx_over_errors++; - } - } - - if (strip_info->tx_left) - { - if (strip_info->tx_left <= strip_info->tx_size) - memcpy(strip_info->tx_buff, strip_info->tx_head, strip_info->tx_left); - else - { - strip_info->tx_left = 0; - strip_info->tx_dropped++; - } - } - strip_info->tx_head = strip_info->tx_buff; - - RestoreInterrupts(intstat); - - printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n", - strip_info->dev.name, old_mtu, strip_info->mtu); - - if (orbuff) kfree(orbuff); - if (osbuff) kfree(osbuff); - if (otbuff) kfree(otbuff); -} - -static void strip_unlock(struct strip *strip_info) -{ - /* - * Set the timer to go off in one second. - */ - strip_info->idle_timer.expires = jiffies + 1*HZ; - add_timer(&strip_info->idle_timer); - netif_wake_queue(&strip_info->dev); -} - - -/************************************************************************/ -/* Callback routines for exporting information through /proc */ - -/* - * This function updates the total amount of data printed so far. It then - * determines if the amount of data printed into a buffer has reached the - * offset requested. If it hasn't, then the buffer is shifted over so that - * the next bit of data can be printed over the old bit. If the total - * amount printed so far exceeds the total amount requested, then this - * function returns 1, otherwise 0. - */ -static int -shift_buffer(char *buffer, int requested_offset, int requested_len, - int *total, int *slop, char **buf) -{ - int printed; - - /* printk(KERN_DEBUG "shift: buffer: %d o: %d l: %d t: %d buf: %d\n", - (int) buffer, requested_offset, requested_len, *total, - (int) *buf); */ - printed = *buf - buffer; - if (*total + printed <= requested_offset) { - *total += printed; - *buf = buffer; - } - else { - if (*total < requested_offset) { - *slop = requested_offset - *total; - } - *total = requested_offset + printed - *slop; - } - if (*total > requested_offset + requested_len) { - return 1; - } - else { - return 0; - } -} - -/* - * This function calculates the actual start of the requested data - * in the buffer. It also calculates actual length of data returned, - * which could be less that the amount of data requested. - */ -static int -calc_start_len(char *buffer, char **start, int requested_offset, - int requested_len, int total, char *buf) -{ - int return_len, buffer_len; - - buffer_len = buf - buffer; - if (buffer_len >= 4095) { - printk(KERN_ERR "STRIP: exceeded /proc buffer size\n"); - } - - /* - * There may be bytes before and after the - * chunk that was actually requested. - */ - return_len = total - requested_offset; - if (return_len < 0) { - return_len = 0; - } - *start = buf - return_len; - if (return_len > requested_len) { - return_len = requested_len; - } - /* printk(KERN_DEBUG "return_len: %d\n", return_len); */ - return return_len; -} - -/* - * If the time is in the near future, time_delta prints the number of - * seconds to go into the buffer and returns the address of the buffer. - * If the time is not in the near future, it returns the address of the - * string "Not scheduled" The buffer must be long enough to contain the - * ascii representation of the number plus 9 charactes for the " seconds" - * and the null character. - */ -static char *time_delta(char buffer[], long time) -{ - time -= jiffies; - if (time > LongTime / 2) return("Not scheduled"); - if(time < 0) time = 0; /* Don't print negative times */ - sprintf(buffer, "%ld seconds", time / HZ); - return(buffer); -} - -static int sprintf_neighbours(char *buffer, MetricomNodeTable *table, char *title) -{ - /* We wrap this in a do/while loop, so if the table changes */ - /* while we're reading it, we just go around and try again. */ - struct timeval t; - char *ptr; - do - { - int i; - t = table->timestamp; - ptr = buffer; - if (table->num_nodes) ptr += sprintf(ptr, "\n %s\n", title); - for (i=0; inum_nodes; i++) - { - InterruptStatus intstat = DisableInterrupts(); - MetricomNode node = table->node[i]; - RestoreInterrupts(intstat); - ptr += sprintf(ptr, " %s\n", node.c); - } - } while (table->timestamp.tv_sec != t.tv_sec || table->timestamp.tv_usec != t.tv_usec); - return ptr - buffer; -} - -/* - * This function prints radio status information into the specified buffer. - * I think the buffer size is 4K, so this routine should never print more - * than 4K of data into it. With the maximum of 32 portables and 32 poletops - * reported, the routine outputs 3107 bytes into the buffer. - */ -static int -sprintf_status_info(char *buffer, struct strip *strip_info) -{ - char temp[32]; - char *p = buffer; - MetricomAddressString addr_string; - - /* First, we must copy all of our data to a safe place, */ - /* in case a serial interrupt comes in and changes it. */ - InterruptStatus intstat = DisableInterrupts(); - int tx_left = strip_info->tx_left; - unsigned long rx_average_pps = strip_info->rx_average_pps; - unsigned long tx_average_pps = strip_info->tx_average_pps; - unsigned long sx_average_pps = strip_info->sx_average_pps; - int working = strip_info->working; - int firmware_level = strip_info->firmware_level; - long watchdog_doprobe = strip_info->watchdog_doprobe; - long watchdog_doreset = strip_info->watchdog_doreset; - long gratuitous_arp = strip_info->gratuitous_arp; - long arp_interval = strip_info->arp_interval; - FirmwareVersion firmware_version = strip_info->firmware_version; - SerialNumber serial_number = strip_info->serial_number; - BatteryVoltage battery_voltage = strip_info->battery_voltage; - char* if_name = strip_info->dev.name; - MetricomAddress true_dev_addr = strip_info->true_dev_addr; - MetricomAddress dev_dev_addr = *(MetricomAddress*)strip_info->dev.dev_addr; - int manual_dev_addr = strip_info->manual_dev_addr; -#ifdef EXT_COUNTERS - unsigned long rx_bytes = strip_info->rx_bytes; - unsigned long tx_bytes = strip_info->tx_bytes; - unsigned long rx_rbytes = strip_info->rx_rbytes; - unsigned long tx_rbytes = strip_info->tx_rbytes; - unsigned long rx_sbytes = strip_info->rx_sbytes; - unsigned long tx_sbytes = strip_info->tx_sbytes; - unsigned long rx_ebytes = strip_info->rx_ebytes; - unsigned long tx_ebytes = strip_info->tx_ebytes; -#endif - RestoreInterrupts(intstat); - - p += sprintf(p, "\nInterface name\t\t%s\n", if_name); - p += sprintf(p, " Radio working:\t\t%s\n", working ? "Yes" : "No"); - radio_address_to_string(&true_dev_addr, &addr_string); - p += sprintf(p, " Radio address:\t\t%s\n", addr_string.c); - if (manual_dev_addr) - { - radio_address_to_string(&dev_dev_addr, &addr_string); - p += sprintf(p, " Device address:\t%s\n", addr_string.c); - } - p += sprintf(p, " Firmware version:\t%s", !working ? "Unknown" : - !firmware_level ? "Should be upgraded" : - firmware_version.c); - if (firmware_level >= ChecksummedMessages) p += sprintf(p, " (Checksums Enabled)"); - p += sprintf(p, "\n"); - p += sprintf(p, " Serial number:\t\t%s\n", serial_number.c); - p += sprintf(p, " Battery voltage:\t%s\n", battery_voltage.c); - p += sprintf(p, " Transmit queue (bytes):%d\n", tx_left); - p += sprintf(p, " Receive packet rate: %ld packets per second\n", rx_average_pps / 8); - p += sprintf(p, " Transmit packet rate: %ld packets per second\n", tx_average_pps / 8); - p += sprintf(p, " Sent packet rate: %ld packets per second\n", sx_average_pps / 8); - p += sprintf(p, " Next watchdog probe:\t%s\n", time_delta(temp, watchdog_doprobe)); - p += sprintf(p, " Next watchdog reset:\t%s\n", time_delta(temp, watchdog_doreset)); - p += sprintf(p, " Next gratuitous ARP:\t"); - - if (!memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address))) - p += sprintf(p, "Disabled\n"); - else - { - p += sprintf(p, "%s\n", time_delta(temp, gratuitous_arp)); - p += sprintf(p, " Next ARP interval:\t%ld seconds\n", JIFFIE_TO_SEC(arp_interval)); - } - - if (working) - { -#ifdef EXT_COUNTERS - p += sprintf(p, "\n"); - p += sprintf(p, " Total bytes: \trx:\t%lu\ttx:\t%lu\n", rx_bytes, tx_bytes); - p += sprintf(p, " thru radio: \trx:\t%lu\ttx:\t%lu\n", rx_rbytes, tx_rbytes); - p += sprintf(p, " thru serial port: \trx:\t%lu\ttx:\t%lu\n", rx_sbytes, tx_sbytes); - p += sprintf(p, " Total stat/err bytes:\trx:\t%lu\ttx:\t%lu\n", rx_ebytes, tx_ebytes); -#endif - p += sprintf_neighbours(p, &strip_info->poletops, "Poletops:"); - p += sprintf_neighbours(p, &strip_info->portables, "Portables:"); - } - - return p - buffer; -} - -/* - * This function is exports status information from the STRIP driver through - * the /proc file system. - */ - -static int get_status_info(char *buffer, char **start, off_t req_offset, int req_len) -{ - int total = 0, slop = 0; - struct strip *strip_info = struct_strip_list; - char *buf = buffer; - - buf += sprintf(buf, "strip_version: %s\n", StripVersion); - if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) goto exit; - - while (strip_info != NULL) - { - buf += sprintf_status_info(buf, strip_info); - if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) break; - strip_info = strip_info->next; - } - exit: - return(calc_start_len(buffer, start, req_offset, req_len, total, buf)); -} - -/************************************************************************/ -/* Sending routines */ - -static void ResetRadio(struct strip *strip_info) -{ - struct tty_struct *tty = strip_info->tty; - static const char init[] = "ate0q1dt**starmode\r**"; - StringDescriptor s = { init, sizeof(init)-1 }; - - /* - * If the radio isn't working anymore, - * we should clear the old status information. - */ - if (strip_info->working) - { - printk(KERN_INFO "%s: No response: Resetting radio.\n", strip_info->dev.name); - strip_info->firmware_version.c[0] = '\0'; - strip_info->serial_number.c[0] = '\0'; - strip_info->battery_voltage.c[0] = '\0'; - strip_info->portables.num_nodes = 0; - do_gettimeofday(&strip_info->portables.timestamp); - strip_info->poletops.num_nodes = 0; - do_gettimeofday(&strip_info->poletops.timestamp); - } - - strip_info->pps_timer = jiffies; - strip_info->rx_pps_count = 0; - strip_info->tx_pps_count = 0; - strip_info->sx_pps_count = 0; - strip_info->rx_average_pps = 0; - strip_info->tx_average_pps = 0; - strip_info->sx_average_pps = 0; - - /* Mark radio address as unknown */ - *(MetricomAddress*)&strip_info->true_dev_addr = zero_address; - if (!strip_info->manual_dev_addr) - *(MetricomAddress*)strip_info->dev.dev_addr = zero_address; - strip_info->working = FALSE; - strip_info->firmware_level = NoStructure; - strip_info->next_command = CompatibilityCommand; - strip_info->watchdog_doprobe = jiffies + 10 * HZ; - strip_info->watchdog_doreset = jiffies + 1 * HZ; - - /* If the user has selected a baud rate above 38.4 see what magic we have to do */ - if (strip_info->user_baud > B38400) - { - /* - * Subtle stuff: Pay attention :-) - * If the serial port is currently at the user's selected (>38.4) rate, - * then we temporarily switch to 19.2 and issue the ATS304 command - * to tell the radio to switch to the user's selected rate. - * If the serial port is not currently at that rate, that means we just - * issued the ATS304 command last time through, so this time we restore - * the user's selected rate and issue the normal starmode reset string. - */ - if (strip_info->user_baud == get_baud(tty)) - { - static const char b0[] = "ate0q1s304=57600\r"; - static const char b1[] = "ate0q1s304=115200\r"; - static const StringDescriptor baudstring[2] = - { { b0, sizeof(b0)-1 }, { b1, sizeof(b1)-1 } }; - set_baud(tty, B19200); - if (strip_info->user_baud == B57600 ) s = baudstring[0]; - else if (strip_info->user_baud == B115200) s = baudstring[1]; - else s = baudstring[1]; /* For now */ - } - else set_baud(tty, strip_info->user_baud); - } - - tty->driver.write(tty, 0, s.string, s.length); -#ifdef EXT_COUNTERS - strip_info->tx_ebytes += s.length; -#endif -} - -/* - * Called by the driver when there's room for more data. If we have - * more packets to send, we send them here. - */ - -static void strip_write_some_more(struct tty_struct *tty) -{ - struct strip *strip_info = (struct strip *) tty->disc_data; - - /* First make sure we're connected. */ - if (!strip_info || strip_info->magic != STRIP_MAGIC || - !netif_running(&strip_info->dev)) - return; - - if (strip_info->tx_left > 0) - { - /* - * If some data left, send it - * Note: There's a kernel design bug here. The write_wakeup routine has to - * know how many bytes were written in the previous call, but the number of - * bytes written is returned as the result of the tty->driver.write call, - * and there's no guarantee that the tty->driver.write routine will have - * returned before the write_wakeup routine is invoked. If the PC has fast - * Serial DMA hardware, then it's quite possible that the write could complete - * almost instantaneously, meaning that my write_wakeup routine could be - * called immediately, before tty->driver.write has had a chance to return - * the number of bytes that it wrote. In an attempt to guard against this, - * I disable interrupts around the call to tty->driver.write, although even - * this might not work on a symmetric multi-processor system. - */ - InterruptStatus intstat = DisableInterrupts(); - int num_written = tty->driver.write(tty, 0, strip_info->tx_head, strip_info->tx_left); - strip_info->tx_left -= num_written; - strip_info->tx_head += num_written; -#ifdef EXT_COUNTERS - strip_info->tx_sbytes += num_written; -#endif - RestoreInterrupts(intstat); - } - else /* Else start transmission of another packet */ - { - tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); - strip_unlock(strip_info); - } -} - -static __u8 *add_checksum(__u8 *buffer, __u8 *end) -{ - __u16 sum = 0; - __u8 *p = buffer; - while (p < end) sum += *p++; - end[3] = hextable[sum & 0xF]; sum >>= 4; - end[2] = hextable[sum & 0xF]; sum >>= 4; - end[1] = hextable[sum & 0xF]; sum >>= 4; - end[0] = hextable[sum & 0xF]; - return(end+4); -} - -static unsigned char *strip_make_packet(unsigned char *buffer, struct strip *strip_info, struct sk_buff *skb) -{ - __u8 *ptr = buffer; - __u8 *stuffstate = NULL; - STRIP_Header *header = (STRIP_Header *)skb->data; - MetricomAddress haddr = header->dst_addr; - int len = skb->len - sizeof(STRIP_Header); - MetricomKey key; - - /*HexDump("strip_make_packet", strip_info, skb->data, skb->data + skb->len);*/ - - if (header->protocol == htons(ETH_P_IP)) key = SIP0Key; - else if (header->protocol == htons(ETH_P_ARP)) key = ARP0Key; - else - { - printk(KERN_ERR "%s: strip_make_packet: Unknown packet type 0x%04X\n", - strip_info->dev.name, ntohs(header->protocol)); - return(NULL); - } - - if (len > strip_info->mtu) - { - printk(KERN_ERR "%s: Dropping oversized transmit packet: %d bytes\n", - strip_info->dev.name, len); - return(NULL); - } - - /* - * If we're sending to ourselves, discard the packet. - * (Metricom radios choke if they try to send a packet to their own address.) - */ - if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) - { - printk(KERN_ERR "%s: Dropping packet addressed to self\n", strip_info->dev.name); - return(NULL); - } - - /* - * If this is a broadcast packet, send it to our designated Metricom - * 'broadcast hub' radio (First byte of address being 0xFF means broadcast) - */ - if (haddr.c[0] == 0xFF) - { - u32 brd = 0; - struct in_device *in_dev = in_dev_get(&strip_info->dev); - if (in_dev == NULL) - return NULL; - read_lock(&in_dev->lock); - if (in_dev->ifa_list) - brd = in_dev->ifa_list->ifa_broadcast; - read_unlock(&in_dev->lock); - in_dev_put(in_dev); - - /* arp_query returns 1 if it succeeds in looking up the address, 0 if it fails */ - if (!arp_query(haddr.c, brd, &strip_info->dev)) - { - printk(KERN_ERR "%s: Unable to send packet (no broadcast hub configured)\n", - strip_info->dev.name); - return(NULL); - } - /* - * If we are the broadcast hub, don't bother sending to ourselves. - * (Metricom radios choke if they try to send a packet to their own address.) - */ - if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) return(NULL); - } - - *ptr++ = 0x0D; - *ptr++ = '*'; - *ptr++ = hextable[haddr.c[2] >> 4]; - *ptr++ = hextable[haddr.c[2] & 0xF]; - *ptr++ = hextable[haddr.c[3] >> 4]; - *ptr++ = hextable[haddr.c[3] & 0xF]; - *ptr++ = '-'; - *ptr++ = hextable[haddr.c[4] >> 4]; - *ptr++ = hextable[haddr.c[4] & 0xF]; - *ptr++ = hextable[haddr.c[5] >> 4]; - *ptr++ = hextable[haddr.c[5] & 0xF]; - *ptr++ = '*'; - *ptr++ = key.c[0]; - *ptr++ = key.c[1]; - *ptr++ = key.c[2]; - *ptr++ = key.c[3]; - - ptr = StuffData(skb->data + sizeof(STRIP_Header), len, ptr, &stuffstate); - - if (strip_info->firmware_level >= ChecksummedMessages) ptr = add_checksum(buffer+1, ptr); - - *ptr++ = 0x0D; - return(ptr); -} - -static void strip_send(struct strip *strip_info, struct sk_buff *skb) -{ - MetricomAddress haddr; - unsigned char *ptr = strip_info->tx_buff; - int doreset = (long)jiffies - strip_info->watchdog_doreset >= 0; - int doprobe = (long)jiffies - strip_info->watchdog_doprobe >= 0 && !doreset; - u32 addr, brd; - - /* - * 1. If we have a packet, encapsulate it and put it in the buffer - */ - if (skb) - { - char *newptr = strip_make_packet(ptr, strip_info, skb); - strip_info->tx_pps_count++; - if (!newptr) strip_info->tx_dropped++; - else - { - ptr = newptr; - strip_info->sx_pps_count++; - strip_info->tx_packets++; /* Count another successful packet */ -#ifdef EXT_COUNTERS - strip_info->tx_bytes += skb->len; - strip_info->tx_rbytes += ptr - strip_info->tx_buff; -#endif - /*DumpData("Sending:", strip_info, strip_info->tx_buff, ptr);*/ - /*HexDump("Sending", strip_info, strip_info->tx_buff, ptr);*/ - } - } - - /* - * 2. If it is time for another tickle, tack it on, after the packet - */ - if (doprobe) - { - StringDescriptor ts = CommandString[strip_info->next_command]; -#if TICKLE_TIMERS - { - struct timeval tv; - do_gettimeofday(&tv); - printk(KERN_INFO "**** Sending tickle string %d at %02d.%06d\n", - strip_info->next_command, tv.tv_sec % 100, tv.tv_usec); - } -#endif - if (ptr == strip_info->tx_buff) *ptr++ = 0x0D; - - *ptr++ = '*'; /* First send "**" to provoke an error message */ - *ptr++ = '*'; - - /* Then add the command */ - memcpy(ptr, ts.string, ts.length); - - /* Add a checksum ? */ - if (strip_info->firmware_level < ChecksummedMessages) ptr += ts.length; - else ptr = add_checksum(ptr, ptr + ts.length); - - *ptr++ = 0x0D; /* Terminate the command with a */ - - /* Cycle to next periodic command? */ - if (strip_info->firmware_level >= StructuredMessages) - if (++strip_info->next_command >= ELEMENTS_OF(CommandString)) - strip_info->next_command = 0; -#ifdef EXT_COUNTERS - strip_info->tx_ebytes += ts.length; -#endif - strip_info->watchdog_doprobe = jiffies + 10 * HZ; - strip_info->watchdog_doreset = jiffies + 1 * HZ; - /*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev.name);*/ - } - - /* - * 3. Set up the strip_info ready to send the data (if any). - */ - strip_info->tx_head = strip_info->tx_buff; - strip_info->tx_left = ptr - strip_info->tx_buff; - strip_info->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP); - - /* - * 4. Debugging check to make sure we're not overflowing the buffer. - */ - if (strip_info->tx_size - strip_info->tx_left < 20) - printk(KERN_ERR "%s: Sending%5d bytes;%5d bytes free.\n", strip_info->dev.name, - strip_info->tx_left, strip_info->tx_size - strip_info->tx_left); - - /* - * 5. If watchdog has expired, reset the radio. Note: if there's data waiting in - * the buffer, strip_write_some_more will send it after the reset has finished - */ - if (doreset) { ResetRadio(strip_info); return; } - - if (1) { - struct in_device *in_dev = in_dev_get(&strip_info->dev); - brd = addr = 0; - if (in_dev) { - read_lock(&in_dev->lock); - if (in_dev->ifa_list) { - brd = in_dev->ifa_list->ifa_broadcast; - addr = in_dev->ifa_list->ifa_local; - } - read_unlock(&in_dev->lock); - in_dev_put(in_dev); - } - } - - - /* - * 6. If it is time for a periodic ARP, queue one up to be sent. - * We only do this if: - * 1. The radio is working - * 2. It's time to send another periodic ARP - * 3. We really know what our address is (and it is not manually set to zero) - * 4. We have a designated broadcast address configured - * If we queue up an ARP packet when we don't have a designated broadcast - * address configured, then the packet will just have to be discarded in - * strip_make_packet. This is not fatal, but it causes misleading information - * to be displayed in tcpdump. tcpdump will report that periodic APRs are - * being sent, when in fact they are not, because they are all being dropped - * in the strip_make_packet routine. - */ - if (strip_info->working && (long)jiffies - strip_info->gratuitous_arp >= 0 && - memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) && - arp_query(haddr.c, brd, &strip_info->dev)) - { - /*printk(KERN_INFO "%s: Sending gratuitous ARP with interval %ld\n", - strip_info->dev.name, strip_info->arp_interval / HZ);*/ - strip_info->gratuitous_arp = jiffies + strip_info->arp_interval; - strip_info->arp_interval *= 2; - if (strip_info->arp_interval > MaxARPInterval) - strip_info->arp_interval = MaxARPInterval; - if (addr) - arp_send( - ARPOP_REPLY, ETH_P_ARP, - addr, /* Target address of ARP packet is our address */ - &strip_info->dev, /* Device to send packet on */ - addr, /* Source IP address this ARP packet comes from */ - NULL, /* Destination HW address is NULL (broadcast it) */ - strip_info->dev.dev_addr, /* Source HW address is our HW address */ - strip_info->dev.dev_addr); /* Target HW address is our HW address (redundant) */ - } - - /* - * 7. All ready. Start the transmission - */ - strip_write_some_more(strip_info->tty); -} - -/* Encapsulate a datagram and kick it into a TTY queue. */ -static int strip_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct strip *strip_info = (struct strip *)(dev->priv); - - if (!netif_running(dev)) - { - printk(KERN_ERR "%s: xmit call when iface is down\n", dev->name); - return(1); - } - - netif_stop_queue(dev); - - del_timer(&strip_info->idle_timer); - - /* See if someone has been ifconfigging */ - if (strip_info->mtu != strip_info->dev.mtu) - strip_changedmtu(strip_info); - - if (jiffies - strip_info->pps_timer > HZ) - { - unsigned long t = jiffies - strip_info->pps_timer; - unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t/2) / t; - unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t/2) / t; - unsigned long sx_pps_count = (strip_info->sx_pps_count * HZ * 8 + t/2) / t; - - strip_info->pps_timer = jiffies; - strip_info->rx_pps_count = 0; - strip_info->tx_pps_count = 0; - strip_info->sx_pps_count = 0; - - strip_info->rx_average_pps = (strip_info->rx_average_pps + rx_pps_count + 1) / 2; - strip_info->tx_average_pps = (strip_info->tx_average_pps + tx_pps_count + 1) / 2; - strip_info->sx_average_pps = (strip_info->sx_average_pps + sx_pps_count + 1) / 2; - - if (rx_pps_count / 8 >= 10) - printk(KERN_INFO "%s: WARNING: Receiving %ld packets per second.\n", - strip_info->dev.name, rx_pps_count / 8); - if (tx_pps_count / 8 >= 10) - printk(KERN_INFO "%s: WARNING: Tx %ld packets per second.\n", - strip_info->dev.name, tx_pps_count / 8); - if (sx_pps_count / 8 >= 10) - printk(KERN_INFO "%s: WARNING: Sending %ld packets per second.\n", - strip_info->dev.name, sx_pps_count / 8); - } - - strip_send(strip_info, skb); - - if (skb) - dev_kfree_skb(skb); - return(0); -} - -/* - * IdleTask periodically calls strip_xmit, so even when we have no IP packets - * to send for an extended period of time, the watchdog processing still gets - * done to ensure that the radio stays in Starmode - */ - -static void strip_IdleTask(unsigned long parameter) -{ - strip_xmit(NULL, (struct net_device *)parameter); -} - -/* - * Create the MAC header for an arbitrary protocol layer - * - * saddr!=NULL means use this specific address (n/a for Metricom) - * saddr==NULL means use default device source address - * daddr!=NULL means use this destination address - * daddr==NULL means leave destination address alone - * (e.g. unresolved arp -- kernel will call - * rebuild_header later to fill in the address) - */ - -static int strip_header(struct sk_buff *skb, struct net_device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len) -{ - struct strip *strip_info = (struct strip *)(dev->priv); - STRIP_Header *header = (STRIP_Header *)skb_push(skb, sizeof(STRIP_Header)); - - /*printk(KERN_INFO "%s: strip_header 0x%04X %s\n", dev->name, type, - type == ETH_P_IP ? "IP" : type == ETH_P_ARP ? "ARP" : "");*/ - - header->src_addr = strip_info->true_dev_addr; - header->protocol = htons(type); - - /*HexDump("strip_header", (struct strip *)(dev->priv), skb->data, skb->data + skb->len);*/ - - if (!daddr) return(-dev->hard_header_len); - - header->dst_addr = *(MetricomAddress*)daddr; - return(dev->hard_header_len); -} - -/* - * Rebuild the MAC header. This is called after an ARP - * (or in future other address resolution) has completed on this - * sk_buff. We now let ARP fill in the other fields. - * I think this should return zero if packet is ready to send, - * or non-zero if it needs more time to do an address lookup - */ - -static int strip_rebuild_header(struct sk_buff *skb) -{ -#ifdef CONFIG_INET - STRIP_Header *header = (STRIP_Header *) skb->data; - - /* Arp find returns zero if if knows the address, */ - /* or if it doesn't know the address it sends an ARP packet and returns non-zero */ - return arp_find(header->dst_addr.c, skb)? 1 : 0; -#else - return 0; -#endif -} - - -/************************************************************************/ -/* Receiving routines */ - -static int strip_receive_room(struct tty_struct *tty) -{ - return 0x10000; /* We can handle an infinite amount of data. :-) */ -} - -/* - * This function parses the response to the ATS300? command, - * extracting the radio version and serial number. - */ -static void get_radio_version(struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - __u8 *p, *value_begin, *value_end; - int len; - - /* Determine the beginning of the second line of the payload */ - p = ptr; - while (p < end && *p != 10) p++; - if (p >= end) return; - p++; - value_begin = p; - - /* Determine the end of line */ - while (p < end && *p != 10) p++; - if (p >= end) return; - value_end = p; - p++; - - len = value_end - value_begin; - len = MIN(len, sizeof(FirmwareVersion) - 1); - if (strip_info->firmware_version.c[0] == 0) - printk(KERN_INFO "%s: Radio Firmware: %.*s\n", - strip_info->dev.name, len, value_begin); - sprintf(strip_info->firmware_version.c, "%.*s", len, value_begin); - - /* Look for the first colon */ - while (p < end && *p != ':') p++; - if (p >= end) return; - /* Skip over the space */ - p += 2; - len = sizeof(SerialNumber) - 1; - if (p + len <= end) { - sprintf(strip_info->serial_number.c, "%.*s", len, p); - } - else { - printk(KERN_DEBUG "STRIP: radio serial number shorter (%d) than expected (%d)\n", - end - p, len); - } -} - -/* - * This function parses the response to the ATS325? command, - * extracting the radio battery voltage. - */ -static void get_radio_voltage(struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - int len; - - len = sizeof(BatteryVoltage) - 1; - if (ptr + len <= end) { - sprintf(strip_info->battery_voltage.c, "%.*s", len, ptr); - } - else { - printk(KERN_DEBUG "STRIP: radio voltage string shorter (%d) than expected (%d)\n", - end - ptr, len); - } -} - -/* - * This function parses the responses to the AT~LA and ATS311 commands, - * which list the radio's neighbours. - */ -static void get_radio_neighbours(MetricomNodeTable *table, __u8 *ptr, __u8 *end) -{ - table->num_nodes = 0; - while (ptr < end && table->num_nodes < NODE_TABLE_SIZE) - { - MetricomNode *node = &table->node[table->num_nodes++]; - char *dst = node->c, *limit = dst + sizeof(*node) - 1; - while (ptr < end && *ptr <= 32) ptr++; - while (ptr < end && dst < limit && *ptr != 10) *dst++ = *ptr++; - *dst++ = 0; - while (ptr < end && ptr[-1] != 10) ptr++; - } - do_gettimeofday(&table->timestamp); -} - -static int get_radio_address(struct strip *strip_info, __u8 *p) -{ - MetricomAddress addr; - - if (string_to_radio_address(&addr, p)) return(1); - - /* See if our radio address has changed */ - if (memcmp(strip_info->true_dev_addr.c, addr.c, sizeof(addr))) - { - MetricomAddressString addr_string; - radio_address_to_string(&addr, &addr_string); - printk(KERN_INFO "%s: Radio address = %s\n", strip_info->dev.name, addr_string.c); - strip_info->true_dev_addr = addr; - if (!strip_info->manual_dev_addr) *(MetricomAddress*)strip_info->dev.dev_addr = addr; - /* Give the radio a few seconds to get its head straight, then send an arp */ - strip_info->gratuitous_arp = jiffies + 15 * HZ; - strip_info->arp_interval = 1 * HZ; - } - return(0); -} - -static int verify_checksum(struct strip *strip_info) -{ - __u8 *p = strip_info->sx_buff; - __u8 *end = strip_info->sx_buff + strip_info->sx_count - 4; - u_short sum = (READHEX16(end[0]) << 12) | (READHEX16(end[1]) << 8) | - (READHEX16(end[2]) << 4) | (READHEX16(end[3])); - while (p < end) sum -= *p++; - if (sum == 0 && strip_info->firmware_level == StructuredMessages) - { - strip_info->firmware_level = ChecksummedMessages; - printk(KERN_INFO "%s: Radio provides message checksums\n", strip_info->dev.name); - } - return(sum == 0); -} - -static void RecvErr(char *msg, struct strip *strip_info) -{ - __u8 *ptr = strip_info->sx_buff; - __u8 *end = strip_info->sx_buff + strip_info->sx_count; - DumpData(msg, strip_info, ptr, end); - strip_info->rx_errors++; -} - -static void RecvErr_Message(struct strip *strip_info, __u8 *sendername, const __u8 *msg, u_long len) -{ - if (has_prefix(msg, len, "001")) /* Not in StarMode! */ - { - RecvErr("Error Msg:", strip_info); - printk(KERN_INFO "%s: Radio %s is not in StarMode\n", - strip_info->dev.name, sendername); - } - - else if (has_prefix(msg, len, "002")) /* Remap handle */ - { - /* We ignore "Remap handle" messages for now */ - } - - else if (has_prefix(msg, len, "003")) /* Can't resolve name */ - { - RecvErr("Error Msg:", strip_info); - printk(KERN_INFO "%s: Destination radio name is unknown\n", - strip_info->dev.name); - } - - else if (has_prefix(msg, len, "004")) /* Name too small or missing */ - { - strip_info->watchdog_doreset = jiffies + LongTime; -#if TICKLE_TIMERS - { - struct timeval tv; - do_gettimeofday(&tv); - printk(KERN_INFO "**** Got ERR_004 response at %02d.%06d\n", - tv.tv_sec % 100, tv.tv_usec); - } -#endif - if (!strip_info->working) - { - strip_info->working = TRUE; - printk(KERN_INFO "%s: Radio now in starmode\n", strip_info->dev.name); - /* - * If the radio has just entered a working state, we should do our first - * probe ASAP, so that we find out our radio address etc. without delay. - */ - strip_info->watchdog_doprobe = jiffies; - } - if (strip_info->firmware_level == NoStructure && sendername) - { - strip_info->firmware_level = StructuredMessages; - strip_info->next_command = 0; /* Try to enable checksums ASAP */ - printk(KERN_INFO "%s: Radio provides structured messages\n", strip_info->dev.name); - } - if (strip_info->firmware_level >= StructuredMessages) - { - /* - * If this message has a valid checksum on the end, then the call to verify_checksum - * will elevate the firmware_level to ChecksummedMessages for us. (The actual return - * code from verify_checksum is ignored here.) - */ - verify_checksum(strip_info); - /* - * If the radio has structured messages but we don't yet have all our information about it, - * we should do probes without delay, until we have gathered all the information - */ - if (!GOT_ALL_RADIO_INFO(strip_info)) strip_info->watchdog_doprobe = jiffies; - } - } - - else if (has_prefix(msg, len, "005")) /* Bad count specification */ - RecvErr("Error Msg:", strip_info); - - else if (has_prefix(msg, len, "006")) /* Header too big */ - RecvErr("Error Msg:", strip_info); - - else if (has_prefix(msg, len, "007")) /* Body too big */ - { - RecvErr("Error Msg:", strip_info); - printk(KERN_ERR "%s: Error! Packet size too big for radio.\n", - strip_info->dev.name); - } - - else if (has_prefix(msg, len, "008")) /* Bad character in name */ - { - RecvErr("Error Msg:", strip_info); - printk(KERN_ERR "%s: Radio name contains illegal character\n", - strip_info->dev.name); - } - - else if (has_prefix(msg, len, "009")) /* No count or line terminator */ - RecvErr("Error Msg:", strip_info); - - else if (has_prefix(msg, len, "010")) /* Invalid checksum */ - RecvErr("Error Msg:", strip_info); - - else if (has_prefix(msg, len, "011")) /* Checksum didn't match */ - RecvErr("Error Msg:", strip_info); - - else if (has_prefix(msg, len, "012")) /* Failed to transmit packet */ - RecvErr("Error Msg:", strip_info); - - else - RecvErr("Error Msg:", strip_info); -} - -static void process_AT_response(struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - u_long len; - __u8 *p = ptr; - while (p < end && p[-1] != 10) p++; /* Skip past first newline character */ - /* Now ptr points to the AT command, and p points to the text of the response. */ - len = p-ptr; - -#if TICKLE_TIMERS - { - struct timeval tv; - do_gettimeofday(&tv); - printk(KERN_INFO "**** Got AT response %.7s at %02d.%06d\n", - ptr, tv.tv_sec % 100, tv.tv_usec); - } -#endif - - if (has_prefix(ptr, len, "ATS300?" )) get_radio_version(strip_info, p, end); - else if (has_prefix(ptr, len, "ATS305?" )) get_radio_address(strip_info, p); - else if (has_prefix(ptr, len, "ATS311?" )) get_radio_neighbours(&strip_info->poletops, p, end); - else if (has_prefix(ptr, len, "ATS319=7")) verify_checksum(strip_info); - else if (has_prefix(ptr, len, "ATS325?" )) get_radio_voltage(strip_info, p, end); - else if (has_prefix(ptr, len, "AT~LA" )) get_radio_neighbours(&strip_info->portables, p, end); - else RecvErr("Unknown AT Response:", strip_info); -} - -static void process_ACK(struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - /* Currently we don't do anything with ACKs from the radio */ -} - -static void process_Info(struct strip *strip_info, __u8 *ptr, __u8 *end) -{ - if (ptr+16 > end) RecvErr("Bad Info Msg:", strip_info); -} - -static struct net_device *get_strip_dev(struct strip *strip_info) -{ - /* If our hardware address is *manually set* to zero, and we know our */ - /* real radio hardware address, try to find another strip device that has been */ - /* manually set to that address that we can 'transfer ownership' of this packet to */ - if (strip_info->manual_dev_addr && - !memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) && - memcmp(&strip_info->true_dev_addr, zero_address.c, sizeof(zero_address))) - { - struct net_device *dev; - read_lock_bh(&dev_base_lock); - dev = dev_base; - while (dev) - { - if (dev->type == strip_info->dev.type && - !memcmp(dev->dev_addr, &strip_info->true_dev_addr, sizeof(MetricomAddress))) - { - printk(KERN_INFO "%s: Transferred packet ownership to %s.\n", - strip_info->dev.name, dev->name); - read_unlock_bh(&dev_base_lock); - return(dev); - } - dev = dev->next; - } - read_unlock_bh(&dev_base_lock); - } - return(&strip_info->dev); -} - -/* - * Send one completely decapsulated datagram to the next layer. - */ - -static void deliver_packet(struct strip *strip_info, STRIP_Header *header, __u16 packetlen) -{ - struct sk_buff *skb = dev_alloc_skb(sizeof(STRIP_Header) + packetlen); - if (!skb) - { - printk(KERN_ERR "%s: memory squeeze, dropping packet.\n", strip_info->dev.name); - strip_info->rx_dropped++; - } - else - { - memcpy(skb_put(skb, sizeof(STRIP_Header)), header, sizeof(STRIP_Header)); - memcpy(skb_put(skb, packetlen), strip_info->rx_buff, packetlen); - skb->dev = get_strip_dev(strip_info); - skb->protocol = header->protocol; - skb->mac.raw = skb->data; - - /* Having put a fake header on the front of the sk_buff for the */ - /* benefit of tools like tcpdump, skb_pull now 'consumes' that */ - /* fake header before we hand the packet up to the next layer. */ - skb_pull(skb, sizeof(STRIP_Header)); - - /* Finally, hand the packet up to the next layer (e.g. IP or ARP, etc.) */ - strip_info->rx_packets++; - strip_info->rx_pps_count++; -#ifdef EXT_COUNTERS - strip_info->rx_bytes += packetlen; -#endif - skb->dev->last_rx = jiffies; - netif_rx(skb); - } -} - -static void process_IP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end) -{ - __u16 packetlen; - - /* Decode start of the IP packet header */ - ptr = UnStuffData(ptr, end, strip_info->rx_buff, 4); - if (!ptr) - { - RecvErr("IP Packet too short", strip_info); - return; - } - - packetlen = ((__u16)strip_info->rx_buff[2] << 8) | strip_info->rx_buff[3]; - - if (packetlen > MAX_RECV_MTU) - { - printk(KERN_INFO "%s: Dropping oversized received IP packet: %d bytes\n", - strip_info->dev.name, packetlen); - strip_info->rx_dropped++; - return; - } - - /*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev.name, packetlen);*/ - - /* Decode remainder of the IP packet */ - ptr = UnStuffData(ptr, end, strip_info->rx_buff+4, packetlen-4); - if (!ptr) - { - RecvErr("IP Packet too short", strip_info); - return; - } - - if (ptr < end) - { - RecvErr("IP Packet too long", strip_info); - return; - } - - header->protocol = htons(ETH_P_IP); - - deliver_packet(strip_info, header, packetlen); -} - -static void process_ARP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end) -{ - __u16 packetlen; - struct arphdr *arphdr = (struct arphdr *)strip_info->rx_buff; - - /* Decode start of the ARP packet */ - ptr = UnStuffData(ptr, end, strip_info->rx_buff, 8); - if (!ptr) - { - RecvErr("ARP Packet too short", strip_info); - return; - } - - packetlen = 8 + (arphdr->ar_hln + arphdr->ar_pln) * 2; - - if (packetlen > MAX_RECV_MTU) - { - printk(KERN_INFO "%s: Dropping oversized received ARP packet: %d bytes\n", - strip_info->dev.name, packetlen); - strip_info->rx_dropped++; - return; - } - - /*printk(KERN_INFO "%s: Got %d byte ARP %s\n", - strip_info->dev.name, packetlen, - ntohs(arphdr->ar_op) == ARPOP_REQUEST ? "request" : "reply");*/ - - /* Decode remainder of the ARP packet */ - ptr = UnStuffData(ptr, end, strip_info->rx_buff+8, packetlen-8); - if (!ptr) - { - RecvErr("ARP Packet too short", strip_info); - return; - } - - if (ptr < end) - { - RecvErr("ARP Packet too long", strip_info); - return; - } - - header->protocol = htons(ETH_P_ARP); - - deliver_packet(strip_info, header, packetlen); -} - -/* - * process_text_message processes a -terminated block of data received - * from the radio that doesn't begin with a '*' character. All normal - * Starmode communication messages with the radio begin with a '*', - * so any text that does not indicates a serial port error, a radio that - * is in Hayes command mode instead of Starmode, or a radio with really - * old firmware that doesn't frame its Starmode responses properly. - */ -static void process_text_message(struct strip *strip_info) -{ - __u8 *msg = strip_info->sx_buff; - int len = strip_info->sx_count; - - /* Check for anything that looks like it might be our radio name */ - /* (This is here for backwards compatibility with old firmware) */ - if (len == 9 && get_radio_address(strip_info, msg) == 0) return; - - if (text_equal(msg, len, "OK" )) return; /* Ignore 'OK' responses from prior commands */ - if (text_equal(msg, len, "ERROR" )) return; /* Ignore 'ERROR' messages */ - if (has_prefix(msg, len, "ate0q1" )) return; /* Ignore character echo back from the radio */ - - /* Catch other error messages */ - /* (This is here for backwards compatibility with old firmware) */ - if (has_prefix(msg, len, "ERR_")) { RecvErr_Message(strip_info, NULL, &msg[4], len-4); return; } - - RecvErr("No initial *", strip_info); -} - -/* - * process_message processes a -terminated block of data received - * from the radio. If the radio is not in Starmode or has old firmware, - * it may be a line of text in response to an AT command. Ideally, with - * a current radio that's properly in Starmode, all data received should - * be properly framed and checksummed radio message blocks, containing - * either a starmode packet, or a other communication from the radio - * firmware, like "INF_" Info messages and &COMMAND responses. - */ -static void process_message(struct strip *strip_info) -{ - STRIP_Header header = { zero_address, zero_address, 0 }; - __u8 *ptr = strip_info->sx_buff; - __u8 *end = strip_info->sx_buff + strip_info->sx_count; - __u8 sendername[32], *sptr = sendername; - MetricomKey key; - - /*HexDump("Receiving", strip_info, ptr, end);*/ - - /* Check for start of address marker, and then skip over it */ - if (*ptr == '*') ptr++; - else { process_text_message(strip_info); return; } - - /* Copy out the return address */ - while (ptr < end && *ptr != '*' && sptr < ARRAY_END(sendername)-1) *sptr++ = *ptr++; - *sptr = 0; /* Null terminate the sender name */ - - /* Check for end of address marker, and skip over it */ - if (ptr >= end || *ptr != '*') - { - RecvErr("No second *", strip_info); - return; - } - ptr++; /* Skip the second '*' */ - - /* If the sender name is "&COMMAND", ignore this 'packet' */ - /* (This is here for backwards compatibility with old firmware) */ - if (!strcmp(sendername, "&COMMAND")) - { - strip_info->firmware_level = NoStructure; - strip_info->next_command = CompatibilityCommand; - return; - } - - if (ptr+4 > end) - { - RecvErr("No proto key", strip_info); - return; - } - - /* Get the protocol key out of the buffer */ - key.c[0] = *ptr++; - key.c[1] = *ptr++; - key.c[2] = *ptr++; - key.c[3] = *ptr++; - - /* If we're using checksums, verify the checksum at the end of the packet */ - if (strip_info->firmware_level >= ChecksummedMessages) - { - end -= 4; /* Chop the last four bytes off the packet (they're the checksum) */ - if (ptr > end) - { - RecvErr("Missing Checksum", strip_info); - return; - } - if (!verify_checksum(strip_info)) - { - RecvErr("Bad Checksum", strip_info); - return; - } - } - - /*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev.name, sendername);*/ - - /* - * Fill in (pseudo) source and destination addresses in the packet. - * We assume that the destination address was our address (the radio does not - * tell us this). If the radio supplies a source address, then we use it. - */ - header.dst_addr = strip_info->true_dev_addr; - string_to_radio_address(&header.src_addr, sendername); - -#ifdef EXT_COUNTERS - if (key.l == SIP0Key.l) { - strip_info->rx_rbytes += (end - ptr); - process_IP_packet(strip_info, &header, ptr, end); - } else if (key.l == ARP0Key.l) { - strip_info->rx_rbytes += (end - ptr); - process_ARP_packet(strip_info, &header, ptr, end); - } else if (key.l == ATR_Key.l) { - strip_info->rx_ebytes += (end - ptr); - process_AT_response(strip_info, ptr, end); - } else if (key.l == ACK_Key.l) { - strip_info->rx_ebytes += (end - ptr); - process_ACK(strip_info, ptr, end); - } else if (key.l == INF_Key.l) { - strip_info->rx_ebytes += (end - ptr); - process_Info(strip_info, ptr, end); - } else if (key.l == ERR_Key.l) { - strip_info->rx_ebytes += (end - ptr); - RecvErr_Message(strip_info, sendername, ptr, end-ptr); - } else RecvErr("Unrecognized protocol key", strip_info); -#else - if (key.l == SIP0Key.l) process_IP_packet (strip_info, &header, ptr, end); - else if (key.l == ARP0Key.l) process_ARP_packet (strip_info, &header, ptr, end); - else if (key.l == ATR_Key.l) process_AT_response(strip_info, ptr, end); - else if (key.l == ACK_Key.l) process_ACK (strip_info, ptr, end); - else if (key.l == INF_Key.l) process_Info (strip_info, ptr, end); - else if (key.l == ERR_Key.l) RecvErr_Message (strip_info, sendername, ptr, end-ptr); - else RecvErr("Unrecognized protocol key", strip_info); -#endif -} - -#define TTYERROR(X) ((X) == TTY_BREAK ? "Break" : \ - (X) == TTY_FRAME ? "Framing Error" : \ - (X) == TTY_PARITY ? "Parity Error" : \ - (X) == TTY_OVERRUN ? "Hardware Overrun" : "Unknown Error") - -/* - * Handle the 'receiver data ready' interrupt. - * This function is called by the 'tty_io' module in the kernel when - * a block of STRIP data has been received, which can now be decapsulated - * and sent on to some IP layer for further processing. - */ - -static void -strip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) -{ - struct strip *strip_info = (struct strip *) tty->disc_data; - const unsigned char *end = cp + count; - - if (!strip_info || strip_info->magic != STRIP_MAGIC - || !netif_running(&strip_info->dev)) - return; - - /* Argh! mtu change time! - costs us the packet part received at the change */ - if (strip_info->mtu != strip_info->dev.mtu) - strip_changedmtu(strip_info); - -#if 0 - { - struct timeval tv; - do_gettimeofday(&tv); - printk(KERN_INFO "**** strip_receive_buf: %3d bytes at %02d.%06d\n", - count, tv.tv_sec % 100, tv.tv_usec); - } -#endif - -#ifdef EXT_COUNTERS - strip_info->rx_sbytes += count; -#endif - - /* Read the characters out of the buffer */ - while (cp < end) - { - if (fp && *fp) printk(KERN_INFO "%s: %s on serial port\n", strip_info->dev.name, TTYERROR(*fp)); - if (fp && *fp++ && !strip_info->discard) /* If there's a serial error, record it */ - { - /* If we have some characters in the buffer, discard them */ - strip_info->discard = strip_info->sx_count; - strip_info->rx_errors++; - } - - /* Leading control characters (CR, NL, Tab, etc.) are ignored */ - if (strip_info->sx_count > 0 || *cp >= ' ') - { - if (*cp == 0x0D) /* If end of packet, decide what to do with it */ - { - if (strip_info->sx_count > 3000) - printk(KERN_INFO "%s: Cut a %d byte packet (%d bytes remaining)%s\n", - strip_info->dev.name, strip_info->sx_count, end-cp-1, - strip_info->discard ? " (discarded)" : ""); - if (strip_info->sx_count > strip_info->sx_size) - { - strip_info->rx_over_errors++; - printk(KERN_INFO "%s: sx_buff overflow (%d bytes total)\n", - strip_info->dev.name, strip_info->sx_count); - } - else if (strip_info->discard) - printk(KERN_INFO "%s: Discarding bad packet (%d/%d)\n", - strip_info->dev.name, strip_info->discard, strip_info->sx_count); - else process_message(strip_info); - strip_info->discard = 0; - strip_info->sx_count = 0; - } - else - { - /* Make sure we have space in the buffer */ - if (strip_info->sx_count < strip_info->sx_size) - strip_info->sx_buff[strip_info->sx_count] = *cp; - strip_info->sx_count++; - } - } - cp++; - } -} - - -/************************************************************************/ -/* General control routines */ - -static int set_mac_address(struct strip *strip_info, MetricomAddress *addr) -{ - /* - * We're using a manually specified address if the address is set - * to anything other than all ones. Setting the address to all ones - * disables manual mode and goes back to automatic address determination - * (tracking the true address that the radio has). - */ - strip_info->manual_dev_addr = memcmp(addr->c, broadcast_address.c, sizeof(broadcast_address)); - if (strip_info->manual_dev_addr) - *(MetricomAddress*)strip_info->dev.dev_addr = *addr; - else *(MetricomAddress*)strip_info->dev.dev_addr = strip_info->true_dev_addr; - return 0; -} - -static int dev_set_mac_address(struct net_device *dev, void *addr) -{ - struct strip *strip_info = (struct strip *)(dev->priv); - struct sockaddr *sa = addr; - printk(KERN_INFO "%s: strip_set_dev_mac_address called\n", dev->name); - set_mac_address(strip_info, (MetricomAddress *)sa->sa_data); - return 0; -} - -static struct net_device_stats *strip_get_stats(struct net_device *dev) -{ - static struct net_device_stats stats; - struct strip *strip_info = (struct strip *)(dev->priv); - - memset(&stats, 0, sizeof(struct net_device_stats)); - - stats.rx_packets = strip_info->rx_packets; - stats.tx_packets = strip_info->tx_packets; - stats.rx_dropped = strip_info->rx_dropped; - stats.tx_dropped = strip_info->tx_dropped; - stats.tx_errors = strip_info->tx_errors; - stats.rx_errors = strip_info->rx_errors; - stats.rx_over_errors = strip_info->rx_over_errors; - return(&stats); -} - - -/************************************************************************/ -/* Opening and closing */ - -/* - * Here's the order things happen: - * When the user runs "slattach -p strip ..." - * 1. The TTY module calls strip_open - * 2. strip_open calls strip_alloc - * 3. strip_alloc calls register_netdev - * 4. register_netdev calls strip_dev_init - * 5. then strip_open finishes setting up the strip_info - * - * When the user runs "ifconfig st up address netmask ..." - * 6. strip_open_low gets called - * - * When the user runs "ifconfig st down" - * 7. strip_close_low gets called - * - * When the user kills the slattach process - * 8. strip_close gets called - * 9. strip_close calls dev_close - * 10. if the device is still up, then dev_close calls strip_close_low - * 11. strip_close calls strip_free - */ - -/* Open the low-level part of the STRIP channel. Easy! */ - -static int strip_open_low(struct net_device *dev) -{ - struct strip *strip_info = (struct strip *)(dev->priv); -#if 0 - struct in_device *in_dev = dev->ip_ptr; -#endif - - if (strip_info->tty == NULL) - return(-ENODEV); - - if (!allocate_buffers(strip_info)) - return(-ENOMEM); - - strip_info->sx_count = 0; - strip_info->tx_left = 0; - - strip_info->discard = 0; - strip_info->working = FALSE; - strip_info->firmware_level = NoStructure; - strip_info->next_command = CompatibilityCommand; - strip_info->user_baud = get_baud(strip_info->tty); - -#if 0 - /* - * Needed because address '0' is special - * - * --ANK Needed it or not needed, it does not matter at all. - * Make it at user level, guys. - */ - - if (in_dev->ifa_list->ifa_address == 0) - in_dev->ifa_list->ifa_address = ntohl(0xC0A80001); -#endif - printk(KERN_INFO "%s: Initializing Radio.\n", strip_info->dev.name); - ResetRadio(strip_info); - strip_info->idle_timer.expires = jiffies + 1*HZ; - add_timer(&strip_info->idle_timer); - netif_wake_queue(dev); - return(0); -} - - -/* - * Close the low-level part of the STRIP channel. Easy! - */ - -static int strip_close_low(struct net_device *dev) -{ - struct strip *strip_info = (struct strip *)(dev->priv); - - if (strip_info->tty == NULL) - return -EBUSY; - strip_info->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); - - netif_stop_queue(dev); - - /* - * Free all STRIP frame buffers. - */ - if (strip_info->rx_buff) - { - kfree(strip_info->rx_buff); - strip_info->rx_buff = NULL; - } - if (strip_info->sx_buff) - { - kfree(strip_info->sx_buff); - strip_info->sx_buff = NULL; - } - if (strip_info->tx_buff) - { - kfree(strip_info->tx_buff); - strip_info->tx_buff = NULL; - } - del_timer(&strip_info->idle_timer); - return 0; -} - -/* - * This routine is called by DDI when the - * (dynamically assigned) device is registered - */ - -static int strip_dev_init(struct net_device *dev) -{ - /* - * Finish setting up the DEVICE info. - */ - - dev->trans_start = 0; - dev->last_rx = 0; - dev->tx_queue_len = 30; /* Drop after 30 frames queued */ - - dev->flags = 0; - dev->mtu = DEFAULT_STRIP_MTU; - dev->type = ARPHRD_METRICOM; /* dtang */ - dev->hard_header_len = sizeof(STRIP_Header); - /* - * dev->priv Already holds a pointer to our struct strip - */ - - *(MetricomAddress*)&dev->broadcast = broadcast_address; - dev->dev_addr[0] = 0; - dev->addr_len = sizeof(MetricomAddress); - - /* - * Pointers to interface service routines. - */ - - dev->open = strip_open_low; - dev->stop = strip_close_low; - dev->hard_start_xmit = strip_xmit; - dev->hard_header = strip_header; - dev->rebuild_header = strip_rebuild_header; - dev->set_mac_address = dev_set_mac_address; - dev->get_stats = strip_get_stats; - return 0; -} - -/* - * Free a STRIP channel. - */ - -static void strip_free(struct strip *strip_info) -{ - *(strip_info->referrer) = strip_info->next; - if (strip_info->next) - strip_info->next->referrer = strip_info->referrer; - strip_info->magic = 0; - kfree(strip_info); -} - -/* - * Allocate a new free STRIP channel - */ - -static struct strip *strip_alloc(void) -{ - int channel_id = 0; - struct strip **s = &struct_strip_list; - struct strip *strip_info = (struct strip *) - kmalloc(sizeof(struct strip), GFP_KERNEL); - - if (!strip_info) - return(NULL); /* If no more memory, return */ - - /* - * Clear the allocated memory - */ - - memset(strip_info, 0, sizeof(struct strip)); - - /* - * Search the list to find where to put our new entry - * (and in the process decide what channel number it is - * going to be) - */ - - while (*s && (*s)->dev.base_addr == channel_id) - { - channel_id++; - s = &(*s)->next; - } - - /* - * Fill in the link pointers - */ - - strip_info->next = *s; - if (*s) - (*s)->referrer = &strip_info->next; - strip_info->referrer = s; - *s = strip_info; - - strip_info->magic = STRIP_MAGIC; - strip_info->tty = NULL; - - strip_info->gratuitous_arp = jiffies + LongTime; - strip_info->arp_interval = 0; - init_timer(&strip_info->idle_timer); - strip_info->idle_timer.data = (long)&strip_info->dev; - strip_info->idle_timer.function = strip_IdleTask; - - /* Note: strip_info->if_name is currently 8 characters long */ - sprintf(strip_info->dev.name, "st%d", channel_id); - strip_info->dev.base_addr = channel_id; - strip_info->dev.priv = (void*)strip_info; - strip_info->dev.next = NULL; - strip_info->dev.init = strip_dev_init; - - return(strip_info); -} - -/* - * Open the high-level part of the STRIP channel. - * This function is called by the TTY module when the - * STRIP line discipline is called for. Because we are - * sure the tty line exists, we only have to link it to - * a free STRIP channel... - */ - -static int strip_open(struct tty_struct *tty) -{ - struct strip *strip_info = (struct strip *) tty->disc_data; - - /* - * First make sure we're not already connected. - */ - - if (strip_info && strip_info->magic == STRIP_MAGIC) - return -EEXIST; - - /* - * OK. Find a free STRIP channel to use. - */ - if ((strip_info = strip_alloc()) == NULL) - return -ENFILE; - - /* - * Register our newly created device so it can be ifconfig'd - * strip_dev_init() will be called as a side-effect - */ - - if (register_netdev(&strip_info->dev) != 0) - { - printk(KERN_ERR "strip: register_netdev() failed.\n"); - strip_free(strip_info); - return -ENFILE; - } - - strip_info->tty = tty; - tty->disc_data = strip_info; - if (tty->driver.flush_buffer) - tty->driver.flush_buffer(tty); - if (tty->ldisc.flush_buffer) - tty->ldisc.flush_buffer(tty); - - /* - * Restore default settings - */ - - strip_info->dev.type = ARPHRD_METRICOM; /* dtang */ - - /* - * Set tty options - */ - - tty->termios->c_iflag |= IGNBRK |IGNPAR;/* Ignore breaks and parity errors. */ - tty->termios->c_cflag |= CLOCAL; /* Ignore modem control signals. */ - tty->termios->c_cflag &= ~HUPCL; /* Don't close on hup */ - - MOD_INC_USE_COUNT; - - printk(KERN_INFO "STRIP: device \"%s\" activated\n", strip_info->dev.name); - - /* - * Done. We have linked the TTY line to a channel. - */ - return(strip_info->dev.base_addr); -} - -/* - * Close down a STRIP channel. - * This means flushing out any pending queues, and then restoring the - * TTY line discipline to what it was before it got hooked to STRIP - * (which usually is TTY again). - */ - -static void strip_close(struct tty_struct *tty) -{ - struct strip *strip_info = (struct strip *) tty->disc_data; - - /* - * First make sure we're connected. - */ - - if (!strip_info || strip_info->magic != STRIP_MAGIC) - return; - - unregister_netdev(&strip_info->dev); - - tty->disc_data = 0; - strip_info->tty = NULL; - printk(KERN_INFO "STRIP: device \"%s\" closed down\n", strip_info->dev.name); - strip_free(strip_info); - tty->disc_data = NULL; - MOD_DEC_USE_COUNT; -} - - -/************************************************************************/ -/* Perform I/O control calls on an active STRIP channel. */ - -static int strip_ioctl(struct tty_struct *tty, struct file *file, - unsigned int cmd, unsigned long arg) -{ - struct strip *strip_info = (struct strip *) tty->disc_data; - - /* - * First make sure we're connected. - */ - - if (!strip_info || strip_info->magic != STRIP_MAGIC) - return -EINVAL; - - switch(cmd) - { - case SIOCGIFNAME: - return copy_to_user((void*)arg, strip_info->dev.name, - strlen(strip_info->dev.name) + 1) ? - -EFAULT : 0; - break; - case SIOCSIFHWADDR: - { - MetricomAddress addr; - printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev.name); - return copy_from_user(&addr, (void*)arg, sizeof(MetricomAddress)) ? - -EFAULT : set_mac_address(strip_info, &addr); - break; - } - /* - * Allow stty to read, but not set, the serial port - */ - - case TCGETS: - case TCGETA: - return n_tty_ioctl(tty, (struct file *) file, cmd, - (unsigned long) arg); - break; - default: - return -ENOIOCTLCMD; - break; - } -} - - -/************************************************************************/ -/* Initialization */ - -static struct tty_ldisc strip_ldisc = { - .magic = TTY_LDISC_MAGIC, - .name = "strip", - .open = strip_open, - .close = strip_close, - .ioctl = strip_ioctl, - .receive_buf = strip_receive_buf, - .receive_room = strip_receive_room, - .write_wakeup = strip_write_some_more, -}; - -/* - * Initialize the STRIP driver. - * This routine is called at boot time, to bootstrap the multi-channel - * STRIP driver - */ - -static char signon[] __initdata = KERN_INFO "STRIP: Version %s (unlimited channels)\n"; - -static int __init strip_init_driver(void) -{ - int status; - - printk(signon, StripVersion); - - /* - * Fill in our line protocol discipline, and register it - */ - if ((status = tty_register_ldisc(N_STRIP, &strip_ldisc))) - printk(KERN_ERR "STRIP: can't register line discipline (err = %d)\n", status); - - /* - * Register the status file with /proc - */ - proc_net_create("strip", S_IFREG | S_IRUGO, get_status_info); - - return status; -} -module_init(strip_init_driver); - -static const char signoff[] __exitdata = KERN_INFO "STRIP: Module Unloaded\n"; - -static void __exit strip_exit_driver(void) -{ - int i; - while (struct_strip_list) - strip_free(struct_strip_list); - - /* Unregister with the /proc/net file here. */ - proc_net_remove("strip"); - - if ((i = tty_register_ldisc(N_STRIP, NULL))) - printk(KERN_ERR "STRIP: can't unregister line discipline (err = %d)\n", i); - - printk(signoff); -} -module_exit(strip_exit_driver); - -MODULE_AUTHOR("Stuart Cheshire "); -MODULE_DESCRIPTION("Starmode Radio IP (STRIP) Device Driver"); -MODULE_LICENSE("Dual BSD/GPL"); - -MODULE_SUPPORTED_DEVICE("Starmode Radio IP (STRIP) modem"); - diff -Nru a/drivers/net/tc35815.c b/drivers/net/tc35815.c --- a/drivers/net/tc35815.c Thu Feb 20 23:19:19 2003 +++ b/drivers/net/tc35815.c Thu Feb 20 23:19:19 2003 @@ -1227,7 +1227,7 @@ lp->rfd_cur = next_rfd; } - /* re-enable BL/FDA Exhaust interupts. */ + /* re-enable BL/FDA Exhaust interrupts. */ if (fd_free_count) { tc_writel(tc_readl(&tr->Int_En) | Int_FDAExEn, &tr->Int_En); if (buf_free_count) diff -Nru a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c --- a/drivers/net/tulip/dmfe.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/tulip/dmfe.c Thu Feb 20 23:19:23 2003 @@ -1337,7 +1337,7 @@ /* * Send a setup frame for DM9132 - * This setup frame initilize DM910X addres filter mode + * This setup frame initilize DM910X address filter mode */ static void dm9132_id_table(struct DEVICE *dev, int mc_cnt) @@ -1380,7 +1380,7 @@ /* * Send a setup frame for DM9102/DM9102A - * This setup frame initilize DM910X addres filter mode + * This setup frame initilize DM910X address filter mode */ static void send_filter_frame(struct DEVICE *dev, int mc_cnt) @@ -1673,11 +1673,11 @@ phy_write_1bit(ioaddr, PHY_DATA_0); phy_write_1bit(ioaddr, PHY_DATA_1); - /* Send Phy addres */ + /* Send Phy address */ for (i = 0x10; i > 0; i = i >> 1) phy_write_1bit(ioaddr, phy_addr & i ? PHY_DATA_1 : PHY_DATA_0); - /* Send register addres */ + /* Send register address */ for (i = 0x10; i > 0; i = i >> 1) phy_write_1bit(ioaddr, offset & i ? PHY_DATA_1 : PHY_DATA_0); @@ -1722,11 +1722,11 @@ phy_write_1bit(ioaddr, PHY_DATA_1); phy_write_1bit(ioaddr, PHY_DATA_0); - /* Send Phy addres */ + /* Send Phy address */ for (i = 0x10; i > 0; i = i >> 1) phy_write_1bit(ioaddr, phy_addr & i ? PHY_DATA_1 : PHY_DATA_0); - /* Send register addres */ + /* Send register address */ for (i = 0x10; i > 0; i = i >> 1) phy_write_1bit(ioaddr, offset & i ? PHY_DATA_1 : PHY_DATA_0); diff -Nru a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c --- a/drivers/net/tulip/interrupt.c Thu Feb 20 23:19:20 2003 +++ b/drivers/net/tulip/interrupt.c Thu Feb 20 23:19:20 2003 @@ -501,7 +501,7 @@ dev->name, csr5); #ifdef CONFIG_NET_HW_FLOWCONTROL if (tp->fc_bit && (test_bit(tp->fc_bit, &netdev_fc_xoff))) - if (net_ratelimit()) printk("BUG!! enabling interupt when FC off (timerintr.) \n"); + if (net_ratelimit()) printk("BUG!! enabling interrupt when FC off (timerintr.) \n"); #endif outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7); tp->ttimer = 0; diff -Nru a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig --- a/drivers/net/wireless/Kconfig Thu Feb 20 23:19:20 2003 +++ b/drivers/net/wireless/Kconfig Thu Feb 20 23:19:20 2003 @@ -1,6 +1,73 @@ # # Wireless LAN device configuration # + +menu "Wireless LAN (non-hamradio)" + depends on NETDEVICES + +config NET_RADIO + bool "Wireless LAN (non-hamradio)" + ---help--- + Support for wireless LANs and everything having to do with radio, + but not with amateur radio or FM broadcasting. + + Saying Y here also enables the Wireless Extensions (creates + /proc/net/wireless and enables ifconfig access). The Wireless + Extension is a generic API allowing a driver to expose to the user + space configuration and statistics specific to common Wireless LANs. + The beauty of it is that a single set of tool can support all the + variations of Wireless LANs, regardless of their type (as long as + the driver supports Wireless Extension). Another advantage is that + these parameters may be changed on the fly without restarting the + driver (or Linux). If you wish to use Wireless Extensions with + wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch + the tools from + . + + Some user-level drivers for scarab devices which don't require + special kernel support are available from + . + +config STRIP + tristate "STRIP (Metricom starmode radio IP)" + depends on NET_RADIO && INET + ---help--- + Say Y if you have a Metricom radio and intend to use Starmode Radio + IP. STRIP is a radio protocol developed for the MosquitoNet project + (on the WWW at ) to send Internet + traffic using Metricom radios. Metricom radios are small, battery + powered, 100kbit/sec packet radio transceivers, about the size and + weight of a cellular telephone. (You may also have heard them called + "Metricom modems" but we avoid the term "modem" because it misleads + many people into thinking that you can plug a Metricom modem into a + phone line and use it as a modem.) + + You can use STRIP on any Linux machine with a serial port, although + it is obviously most useful for people with laptop computers. If you + think you might get a Metricom radio in the future, there is no harm + in saying Y to STRIP now, except that it makes the kernel a bit + bigger. + + You can also compile this as a module ( = code which can be inserted + in and removed from the running kernel whenever you want), say M + here and read . The module will be + called strip. + +config ARLAN + tristate "Aironet Arlan 655 & IC2200 DS support" + depends on NET_RADIO && ISA + ---help--- + Aironet makes Arlan, a class of wireless LAN adapters. These use the + www.Telxon.com chip, which is also used on several similar cards. + This driver is tested on the 655 and IC2200 series cards. Look at + for the latest information. + + The driver is built as two modules, arlan and arlan-proc. The latter + is the /proc interface and is not needed most of time. + + On some computers the card ends up in non-valid state after some + time. Use a ping-reset script to clear it. + comment "Wireless ISA/PCI cards support" depends on NET_RADIO && (ISA || PCI || ALL_PPC || PCMCIA) @@ -182,9 +249,39 @@ for location). You also want to check out the PCMCIA-HOWTO, available from . +config NET_PCMCIA_RADIO + bool "PCMCIA Wireless LAN" + depends on NET_PCMCIA + help + Say Y here if you would like to use a PCMCIA (PC-card) device to + connect to a wireless local area network. Then say Y to the driver + for your particular card below. + + To use your PC-cards, you will need supporting software from David + Hinds' pcmcia-cs package (see the file + for location). You also want to check out the PCMCIA-HOWTO, + available from . + +config PCMCIA_RAYCS + tristate "Aviator/Raytheon 2.4MHz wireless support" + depends on NET_PCMCIA_RADIO && PCMCIA + ---help--- + Say Y here if you intend to attach an Aviator/Raytheon PCMCIA + (PC-card) wireless Ethernet networking card to your computer. + Please read the file for + details. + + This driver is also available as a module ( = code which can be + inserted in and removed from the running kernel whenever you want). + The module will be called ray_cs. If you want to compile it as a + module, say M here and read . If + unsure, say N. + # yes, this works even when no drivers are selected config NET_WIRELESS bool depends on NET_RADIO && (ISA || PCI || ALL_PPC || PCMCIA) default y + +endmenu diff -Nru a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile --- a/drivers/net/wireless/Makefile Thu Feb 20 23:19:24 2003 +++ b/drivers/net/wireless/Makefile Thu Feb 20 23:19:24 2003 @@ -2,6 +2,9 @@ # Makefile for the Linux Wireless network device drivers. # +obj-$(CONFIG_STRIP) += strip.o +obj-$(CONFIG_ARLAN) += arlan.o arlan-proc.o + # Obsolete cards obj-$(CONFIG_WAVELAN) += wavelan.o obj-$(CONFIG_PCMCIA_NETWAVE) += netwave_cs.o @@ -15,3 +18,7 @@ obj-$(CONFIG_AIRO) += airo.o obj-$(CONFIG_AIRO_CS) += airo_cs.o airo.o + +# 16-bit wireless PCMCIA client drivers +obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o + diff -Nru a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c --- a/drivers/net/wireless/airo.c Thu Feb 20 23:19:19 2003 +++ b/drivers/net/wireless/airo.c Thu Feb 20 23:19:20 2003 @@ -4002,6 +4002,10 @@ { struct net_device *dev; + if (pci_enable_device(pdev)) + return -ENODEV; + pci_set_master(pdev); + dev = init_airo_card(pdev->irq, pdev->resource[2].start, 0); if (!dev) return -ENODEV; diff -Nru a/drivers/net/wireless/airport.c b/drivers/net/wireless/airport.c --- a/drivers/net/wireless/airport.c Thu Feb 20 23:19:23 2003 +++ b/drivers/net/wireless/airport.c Thu Feb 20 23:19:23 2003 @@ -267,7 +267,6 @@ MODULE_AUTHOR("Benjamin Herrenschmidt "); MODULE_DESCRIPTION("Driver for the Apple Airport wireless card."); MODULE_LICENSE("Dual MPL/GPL"); -EXPORT_NO_SYMBOLS; static int __init init_airport(void) diff -Nru a/drivers/net/wireless/arlan-proc.c b/drivers/net/wireless/arlan-proc.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/arlan-proc.c Thu Feb 20 23:19:22 2003 @@ -0,0 +1,1274 @@ +#include +#include "arlan.h" + +#include + +#ifdef CONFIG_PROC_FS + + +#include + +/* void enableReceive(struct net_device* dev); +*/ + + + +#define ARLAN_STR_SIZE 0x2ff0 +#define DEV_ARLAN_INFO 1 +#define DEV_ARLAN 1 +#define SARLG(type,var) {\ + pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n", #var, READSHMB(priva->card->var)); \ + } + +#define SARLBN(type,var,nn) {\ + pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x",#var);\ + for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ + pos += sprintf(arlan_drive_info+pos, "\n"); \ + } + +#define SARLBNpln(type,var,nn) {\ + for (i=0; i < nn; i++ ) pos += sprintf(arlan_drive_info+pos, "%02x",READSHMB(priva->card->var[i]));\ + } + +#define SARLSTR(var,nn) {\ + char tmpStr[400];\ + int tmpLn = nn;\ + if (nn > 399 ) tmpLn = 399; \ + memcpy(tmpStr,(char *) priva->conf->var,tmpLn);\ + tmpStr[tmpLn] = 0; \ + pos += sprintf(arlan_drive_info+pos, "%s\t=\t%s \n",#var,priva->conf->var);\ + } + +#define SARLUC(var) SARLG(u_char, var) +#define SARLUCN(var,nn) SARLBN(u_char,var, nn) +#define SARLUS(var) SARLG(u_short, var) +#define SARLUSN(var,nn) SARLBN(u_short,var, nn) +#define SARLUI(var) SARLG(u_int, var) + +#define SARLUSA(var) {\ + u_short tmpVar;\ + memcpy(&tmpVar, (short *) priva->conf->var,2); \ + pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ +} + +#define SARLUIA(var) {\ + u_int tmpVar;\ + memcpy(&tmpVar, (int* )priva->conf->var,4); \ + pos += sprintf(arlan_drive_info+pos, "%s\t=\t0x%x\n",#var, tmpVar);\ +} + + +static const char *arlan_diagnostic_info_string(struct net_device *dev) +{ + + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + u_char diagnosticInfo; + + READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); + + switch (diagnosticInfo) + { + case 0xFF: + return "Diagnostic info is OK"; + case 0xFE: + return "ERROR EPROM Checksum error "; + case 0xFD: + return "ERROR Local Ram Test Failed "; + case 0xFC: + return "ERROR SCC failure "; + case 0xFB: + return "ERROR BackBone failure "; + case 0xFA: + return "ERROR tranceiver not found "; + case 0xF9: + return "ERROR no more address space "; + case 0xF8: + return "ERROR Checksum error "; + case 0xF7: + return "ERROR Missing SS Code"; + case 0xF6: + return "ERROR Invalid config format"; + case 0xF5: + return "ERROR Reserved errorcode F5"; + case 0xF4: + return "ERROR Invalid spreading code/channel number"; + case 0xF3: + return "ERROR Load Code Error"; + case 0xF2: + return "ERROR Reserver errorcode F2 "; + case 0xF1: + return "ERROR Invalid command receivec by LAN card "; + case 0xF0: + return "ERROR Invalid parameter found in command "; + case 0xEF: + return "ERROR On-chip timer failure "; + case 0xEE: + return "ERROR T410 timer failure "; + case 0xED: + return "ERROR Too Many TxEnable commands "; + case 0xEC: + return "ERROR EEPROM error on radio module "; + default: + return "ERROR unknown Diagnostic info reply code "; + } +}; + +static const char *arlan_hardware_type_string(struct net_device *dev) +{ + u_char hardwareType; + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + + READSHM(hardwareType, arlan->hardwareType, u_char); + switch (hardwareType) + { + case 0x00: + return "type A450"; + case 0x01: + return "type A650 "; + case 0x04: + return "type TMA coproc"; + case 0x0D: + return "type A650E "; + case 0x18: + return "type TMA coproc Australian"; + case 0x19: + return "type A650A "; + case 0x26: + return "type TMA coproc European"; + case 0x2E: + return "type A655 "; + case 0x2F: + return "type A655A "; + case 0x30: + return "type A655E "; + case 0x0B: + return "type A670 "; + case 0x0C: + return "type A670E "; + case 0x2D: + return "type A670A "; + case 0x0F: + return "type A411T"; + case 0x16: + return "type A411TA"; + case 0x1B: + return "type A440T"; + case 0x1C: + return "type A412T"; + case 0x1E: + return "type A412TA"; + case 0x22: + return "type A411TE"; + case 0x24: + return "type A412TE"; + case 0x27: + return "type A671T "; + case 0x29: + return "type A671TA "; + case 0x2B: + return "type A671TE "; + case 0x31: + return "type A415T "; + case 0x33: + return "type A415TA "; + case 0x35: + return "type A415TE "; + case 0x37: + return "type A672"; + case 0x39: + return "type A672A "; + case 0x3B: + return "type A672T"; + case 0x6B: + return "type IC2200"; + default: + return "type A672T"; + } +} +#ifdef ARLAN_DEBUGGING +static void arlan_print_diagnostic_info(struct net_device *dev) +{ + int i; + u_char diagnosticInfo; + u_short diagnosticOffset; + u_char hardwareType; + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + + // ARLAN_DEBUG_ENTRY("arlan_print_diagnostic_info"); + + if (READSHMB(arlan->configuredStatusFlag) == 0) + printk("Arlan: Card NOT configured\n"); + else + printk("Arlan: Card is configured\n"); + + READSHM(diagnosticInfo, arlan->diagnosticInfo, u_char); + READSHM(diagnosticOffset, arlan->diagnosticOffset, u_short); + + printk(KERN_INFO "%s\n", arlan_diagnostic_info_string(dev)); + + if (diagnosticInfo != 0xff) + printk("%s arlan: Diagnostic Offset %d \n", dev->name, diagnosticOffset); + + printk("arlan: LAN CODE ID = "); + for (i = 0; i < 6; i++) + DEBUGSHM(1, "%03d:", arlan->lanCardNodeId[i], u_char); + printk("\n"); + + printk("arlan: Arlan BroadCast address = "); + for (i = 0; i < 6; i++) + DEBUGSHM(1, "%03d:", arlan->broadcastAddress[i], u_char); + printk("\n"); + + READSHM(hardwareType, arlan->hardwareType, u_char); + printk(KERN_INFO "%s\n", arlan_hardware_type_string(dev)); + + + DEBUGSHM(1, "arlan: channelNumber=%d\n", arlan->channelNumber, u_char); + DEBUGSHM(1, "arlan: channelSet=%d\n", arlan->channelSet, u_char); + DEBUGSHM(1, "arlan: spreadingCode=%d\n", arlan->spreadingCode, u_char); + DEBUGSHM(1, "arlan: radioNodeId=%d\n", arlan->radioNodeId, u_short); + DEBUGSHM(1, "arlan: SID =%d\n", arlan->SID, u_short); + DEBUGSHM(1, "arlan: rxOffset=%d\n", arlan->rxOffset, u_short); + + DEBUGSHM(1, "arlan: registration mode is %d\n", arlan->registrationMode, u_char); + + printk("arlan: name= "); + IFDEBUG(1) + + for (i = 0; i < 16; i++) + { + char c; + READSHM(c, arlan->name[i], char); + if (c) + printk("%c", c); + } + printk("\n"); + +// ARLAN_DEBUG_EXIT("arlan_print_diagnostic_info"); + +} + + +/****************************** TEST MEMORY **************/ + +static int arlan_hw_test_memory(struct net_device *dev) +{ + u_char *ptr; + int i; + int memlen = sizeof(struct arlan_shmem) - 0xF; /* avoid control register */ + volatile char *arlan_mem = (char *) (dev->mem_start); + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + char pattern; + + ptr = NULL; + + /* hold card in reset state */ + setHardwareReset(dev); + + /* test memory */ + pattern = 0; + for (i = 0; i < memlen; i++) + WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char); + + pattern = 0; + for (i = 0; i < memlen; i++) + { + char res; + READSHM(res, arlan_mem[i], char); + if (res != pattern++) + { + printk(KERN_ERR "Arlan driver memory test 1 failed \n"); + return -1; + } + } + + pattern = 0; + for (i = 0; i < memlen; i++) + WRITESHM(arlan_mem[i], ~(pattern++), char); + + pattern = 0; + for (i = 0; i < memlen; i++) + { + char res; + READSHM(res, arlan_mem[i], char); + if (res != ~(pattern++)) + { + printk(KERN_ERR "Arlan driver memory test 2 failed \n"); + return -1; + } + } + + /* zero memory */ + for (i = 0; i < memlen; i++) + WRITESHM(arlan_mem[i], 0x00, char); + + IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n"); + + /* set reset flag and then release reset */ + WRITESHM(arlan->resetFlag, 0xff, u_char); + + clearChannelAttention(dev); + clearHardwareReset(dev); + + /* wait for reset flag to become zero, we'll wait for two seconds */ + if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW)) + { + printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name); + return -1; + } + return 0; +} + +static int arlan_setup_card_by_book(struct net_device *dev) +{ + u_char irqLevel, configuredStatusFlag; + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + +// ARLAN_DEBUG_ENTRY("arlan_setup_card"); + + READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); + + IFDEBUG(10) + if (configuredStatusFlag != 0) + IFDEBUG(10) printk("arlan: CARD IS CONFIGURED\n"); + else + IFDEBUG(10) printk("arlan: card is NOT configured\n"); + + if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff)) + if (arlan_hw_test_memory(dev)) + return -1; + + DEBUGSHM(4, "arlan configuredStatus = %d \n", arlan->configuredStatusFlag, u_char); + DEBUGSHM(4, "arlan driver diagnostic: 0x%2x\n", arlan->diagnosticInfo, u_char); + + /* issue nop command - no interrupt */ + arlan_command(dev, ARLAN_COMMAND_NOOP); + if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) + return -1; + + IFDEBUG(50) printk("1st Noop successfully executed !!\n"); + + /* try to turn on the arlan interrupts */ + clearClearInterrupt(dev); + setClearInterrupt(dev); + setInterruptEnable(dev); + + /* issue nop command - with interrupt */ + + arlan_command(dev, ARLAN_COMMAND_NOOPINT); + if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) + return -1; + + + IFDEBUG(50) printk("2nd Noop successfully executed !!\n"); + + READSHM(irqLevel, arlan->irqLevel, u_char) + + if (irqLevel != dev->irq) + { + IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %d\n", irqLevel); + printk(KERN_WARNING "device driver irq set to %d - does not match\n", dev->irq); + dev->irq = irqLevel; + } + else + IFDEBUG(2) printk("irq level is OK\n"); + + + IFDEBUG(3) arlan_print_diagnostic_info(dev); + + arlan_command(dev, ARLAN_COMMAND_CONF); + + READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); + if (configuredStatusFlag == 0) + { + printk(KERN_WARNING "arlan configure failed\n"); + return -1; + } + arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); + arlan_command(dev, ARLAN_COMMAND_RX); + arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); + printk(KERN_NOTICE "%s: arlan driver version %s loaded\n", + dev->name, arlan_version); + +// ARLAN_DEBUG_EXIT("arlan_setup_card"); + + return 0; /* no errors */ +} +#endif + +#ifdef ARLAN_PROC_INTERFACE +#ifdef ARLAN_PROC_SHM_DUMP + +static char arlan_drive_info[ARLAN_STR_SIZE] = "A655\n\0"; + +static int arlan_sysctl_info(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int i; + int retv, pos, devnum; + struct arlan_private *priva = NULL; + struct net_device *dev; + pos = 0; + if (write) + { + printk("wrirte: "); + for (i = 0; i < 100; i++) + printk("adi %x \n", arlan_drive_info[i]); + } + if (ctl->procname == NULL || arlan_drive_info == NULL) + { + printk(KERN_WARNING " procname is NULL in sysctl_table or arlan_drive_info is NULL \n at arlan module\n "); + return -1; + } + devnum = ctl->procname[5] - '0'; + if (devnum < 0 || devnum > MAX_ARLANS - 1) + { + printk(KERN_WARNING "too strange devnum in procfs parse\n "); + return -1; + } + else if (arlan_device[devnum] == NULL) + { + if (ctl->procname) + pos += sprintf(arlan_drive_info + pos, "\t%s\n\n", ctl->procname); + pos += sprintf(arlan_drive_info + pos, "No device found here \n"); + goto final; + } + else + priva = arlan_device[devnum]->priv; + + if (priva == NULL) + { + printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); + return -1; + } + dev = arlan_device[devnum]; + + memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); + + pos = sprintf(arlan_drive_info, "Arlan info \n"); + /* Header Signature */ + SARLSTR(textRegion, 48); + SARLUC(resetFlag); + pos += sprintf(arlan_drive_info + pos, "diagnosticInfo\t=\t%s \n", arlan_diagnostic_info_string(dev)); + SARLUC(diagnosticInfo); + SARLUS(diagnosticOffset); + SARLUCN(_1, 12); + SARLUCN(lanCardNodeId, 6); + SARLUCN(broadcastAddress, 6); + pos += sprintf(arlan_drive_info + pos, "hardwareType =\t %s \n", arlan_hardware_type_string(dev)); + SARLUC(hardwareType); + SARLUC(majorHardwareVersion); + SARLUC(minorHardwareVersion); + SARLUC(radioModule); + SARLUC(defaultChannelSet); + SARLUCN(_2, 47); + + /* Control/Status Block - 0x0080 */ + SARLUC(interruptInProgress); + SARLUC(cntrlRegImage); + + SARLUCN(_3, 14); + SARLUC(commandByte); + SARLUCN(commandParameter, 15); + + /* Receive Status - 0x00a0 */ + SARLUC(rxStatus); + SARLUC(rxFrmType); + SARLUS(rxOffset); + SARLUS(rxLength); + SARLUCN(rxSrc, 6); + SARLUC(rxBroadcastFlag); + SARLUC(rxQuality); + SARLUC(scrambled); + SARLUCN(_4, 1); + + /* Transmit Status - 0x00b0 */ + SARLUC(txStatus); + SARLUC(txAckQuality); + SARLUC(numRetries); + SARLUCN(_5, 14); + SARLUCN(registeredRouter, 6); + SARLUCN(backboneRouter, 6); + SARLUC(registrationStatus); + SARLUC(configuredStatusFlag); + SARLUCN(_6, 1); + SARLUCN(ultimateDestAddress, 6); + SARLUCN(immedDestAddress, 6); + SARLUCN(immedSrcAddress, 6); + SARLUS(rxSequenceNumber); + SARLUC(assignedLocaltalkAddress); + SARLUCN(_7, 27); + + /* System Parameter Block */ + + /* - Driver Parameters (Novell Specific) */ + + SARLUS(txTimeout); + SARLUS(transportTime); + SARLUCN(_8, 4); + + /* - Configuration Parameters */ + SARLUC(irqLevel); + SARLUC(spreadingCode); + SARLUC(channelSet); + SARLUC(channelNumber); + SARLUS(radioNodeId); + SARLUCN(_9, 2); + SARLUC(scramblingDisable); + SARLUC(radioType); + SARLUS(routerId); + SARLUCN(_10, 9); + SARLUC(txAttenuation); + SARLUIA(systemId); + SARLUS(globalChecksum); + SARLUCN(_11, 4); + SARLUS(maxDatagramSize); + SARLUS(maxFrameSize); + SARLUC(maxRetries); + SARLUC(receiveMode); + SARLUC(priority); + SARLUC(rootOrRepeater); + SARLUCN(specifiedRouter, 6); + SARLUS(fastPollPeriod); + SARLUC(pollDecay); + SARLUSA(fastPollDelay); + SARLUC(arlThreshold); + SARLUC(arlDecay); + SARLUCN(_12, 1); + SARLUS(specRouterTimeout); + SARLUCN(_13, 5); + + /* Scrambled Area */ + SARLUIA(SID); + SARLUCN(encryptionKey, 12); + SARLUIA(_14); + SARLUSA(waitTime); + SARLUSA(lParameter); + SARLUCN(_15, 3); + SARLUS(headerSize); + SARLUS(sectionChecksum); + + SARLUC(registrationMode); + SARLUC(registrationFill); + SARLUS(pollPeriod); + SARLUS(refreshPeriod); + SARLSTR(name, 16); + SARLUCN(NID, 6); + SARLUC(localTalkAddress); + SARLUC(codeFormat); + SARLUC(numChannels); + SARLUC(channel1); + SARLUC(channel2); + SARLUC(channel3); + SARLUC(channel4); + SARLUCN(SSCode, 59); + +/* SARLUCN( _16, 0x140); + */ + /* Statistics Block - 0x0300 */ + SARLUC(hostcpuLock); + SARLUC(lancpuLock); + SARLUCN(resetTime, 18); + SARLUIA(numDatagramsTransmitted); + SARLUIA(numReTransmissions); + SARLUIA(numFramesDiscarded); + SARLUIA(numDatagramsReceived); + SARLUIA(numDuplicateReceivedFrames); + SARLUIA(numDatagramsDiscarded); + SARLUS(maxNumReTransmitDatagram); + SARLUS(maxNumReTransmitFrames); + SARLUS(maxNumConsecutiveDuplicateFrames); + /* misaligned here so we have to go to characters */ + SARLUIA(numBytesTransmitted); + SARLUIA(numBytesReceived); + SARLUIA(numCRCErrors); + SARLUIA(numLengthErrors); + SARLUIA(numAbortErrors); + SARLUIA(numTXUnderruns); + SARLUIA(numRXOverruns); + SARLUIA(numHoldOffs); + SARLUIA(numFramesTransmitted); + SARLUIA(numFramesReceived); + SARLUIA(numReceiveFramesLost); + SARLUIA(numRXBufferOverflows); + SARLUIA(numFramesDiscardedAddrMismatch); + SARLUIA(numFramesDiscardedSIDMismatch); + SARLUIA(numPollsTransmistted); + SARLUIA(numPollAcknowledges); + SARLUIA(numStatusTimeouts); + SARLUIA(numNACKReceived); + SARLUS(auxCmd); + SARLUCN(dumpPtr, 4); + SARLUC(dumpVal); + SARLUC(wireTest); + + /* next 4 seems too long for procfs, over single page ? + SARLUCN( _17, 0x86); + SARLUCN( txBuffer, 0x800); + SARLUCN( rxBuffer, 0x800); + SARLUCN( _18, 0x0bff); + */ + + pos += sprintf(arlan_drive_info + pos, "rxRing\t=\t0x"); + for (i = 0; i < 0x50; i++) + pos += sprintf(arlan_drive_info + pos, "%02x", ((char *) priva->conf)[priva->conf->rxOffset + i]); + pos += sprintf(arlan_drive_info + pos, "\n"); + + SARLUC(configStatus); + SARLUC(_22); + SARLUC(progIOCtrl); + SARLUC(shareMBase); + SARLUC(controlRegister); + + pos += sprintf(arlan_drive_info + pos, " total %d chars\n", pos); + if (ctl) + if (ctl->procname) + pos += sprintf(arlan_drive_info + pos, " driver name : %s\n", ctl->procname); +final: + *lenp = pos; + + if (!write) + retv = proc_dostring(ctl, write, filp, buffer, lenp); + else + { + *lenp = 0; + return -1; + } + return retv; +} + + +static int arlan_sysctl_info161719(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int i; + int retv, pos, devnum; + struct arlan_private *priva = NULL; + + pos = 0; + devnum = ctl->procname[5] - '0'; + if (arlan_device[devnum] == NULL) + { + pos += sprintf(arlan_drive_info + pos, "No device found here \n"); + goto final; + } + else + priva = arlan_device[devnum]->priv; + if (priva == NULL) + { + printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); + return -1; + } + memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); + SARLUCN(_16, 0xC0); + SARLUCN(_17, 0x6A); + SARLUCN(_18, 14); + SARLUCN(_19, 0x86); + SARLUCN(_21, 0x3fd); + +final: + *lenp = pos; + retv = proc_dostring(ctl, write, filp, buffer, lenp); + return retv; +} + +static int arlan_sysctl_infotxRing(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int i; + int retv, pos, devnum; + struct arlan_private *priva = NULL; + + pos = 0; + devnum = ctl->procname[5] - '0'; + if (arlan_device[devnum] == NULL) + { + pos += sprintf(arlan_drive_info + pos, "No device found here \n"); + goto final; + } + else + priva = arlan_device[devnum]->priv; + if (priva == NULL) + { + printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); + return -1; + } + memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); + SARLBNpln(u_char, txBuffer, 0x800); +final: + *lenp = pos; + retv = proc_dostring(ctl, write, filp, buffer, lenp); + return retv; +} + +static int arlan_sysctl_inforxRing(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int i; + int retv, pos, devnum; + struct arlan_private *priva = NULL; + + pos = 0; + devnum = ctl->procname[5] - '0'; + if (arlan_device[devnum] == NULL) + { + pos += sprintf(arlan_drive_info + pos, "No device found here \n"); + goto final; + } else + priva = arlan_device[devnum]->priv; + if (priva == NULL) + { + printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); + return -1; + } + memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); + SARLBNpln(u_char, rxBuffer, 0x800); +final: + *lenp = pos; + retv = proc_dostring(ctl, write, filp, buffer, lenp); + return retv; +} + +static int arlan_sysctl_info18(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int i; + int retv, pos, devnum; + struct arlan_private *priva = NULL; + + pos = 0; + devnum = ctl->procname[5] - '0'; + if (arlan_device[devnum] == NULL) + { + pos += sprintf(arlan_drive_info + pos, "No device found here \n"); + goto final; + } + else + priva = arlan_device[devnum]->priv; + if (priva == NULL) + { + printk(KERN_WARNING " Could not find the device private in arlan procsys, bad\n "); + return -1; + } + memcpy_fromio(priva->conf, priva->card, sizeof(struct arlan_shmem)); + SARLBNpln(u_char, _18, 0x800); + +final: + *lenp = pos; + retv = proc_dostring(ctl, write, filp, buffer, lenp); + return retv; +} + + +#endif /* #ifdef ARLAN_PROC_SHM_DUMP */ + + +static char conf_reset_result[200]; + +static int arlan_configure(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int pos = 0; + int devnum = ctl->procname[6] - '0'; + struct arlan_private *priv; + + if (devnum < 0 || devnum > MAX_ARLANS - 1) + { + printk(KERN_WARNING "too strange devnum in procfs parse\n "); + return -1; + } + else if (arlan_device[devnum] != NULL) + { + priv = arlan_device[devnum]->priv; + + arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_CONF); + } + else + return -1; + + *lenp = pos; + return proc_dostring(ctl, write, filp, buffer, lenp); +} + +static int arlan_sysctl_reset(ctl_table * ctl, int write, struct file *filp, + void *buffer, size_t * lenp) +{ + int pos = 0; + int devnum = ctl->procname[5] - '0'; + struct arlan_private *priv; + + if (devnum < 0 || devnum > MAX_ARLANS - 1) + { + printk(KERN_WARNING "too strange devnum in procfs parse\n "); + return -1; + } + else if (arlan_device[devnum] != NULL) + { + priv = arlan_device[devnum]->priv; + arlan_command(arlan_device[devnum], ARLAN_COMMAND_CLEAN_AND_RESET); + + } else + return -1; + *lenp = pos + 3; + return proc_dostring(ctl, write, filp, buffer, lenp); +} + + +/* Place files in /proc/sys/dev/arlan */ +#define CTBLN(num,card,nam) \ + { .ctl_name = num,\ + .procname = #nam,\ + .data = &(arlan_conf[card].nam),\ + .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec} +#ifdef ARLAN_DEBUGGING + +#define ARLAN_PROC_DEBUG_ENTRIES \ + { .ctl_name = 48, .procname = "entry_exit_debug",\ + .data = &arlan_entry_and_exit_debug,\ + .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec},\ + { .ctl_name = 49, .procname = "debug", .data = &arlan_debug,\ + .maxlen = sizeof(int), .mode = 0600, .proc_handler = &proc_dointvec}, +#else +#define ARLAN_PROC_DEBUG_ENTRIES +#endif + +#define ARLAN_SYSCTL_TABLE_TOTAL(cardNo)\ + CTBLN(1,cardNo,spreadingCode),\ + CTBLN(2,cardNo, channelNumber),\ + CTBLN(3,cardNo, scramblingDisable),\ + CTBLN(4,cardNo, txAttenuation),\ + CTBLN(5,cardNo, systemId), \ + CTBLN(6,cardNo, maxDatagramSize),\ + CTBLN(7,cardNo, maxFrameSize),\ + CTBLN(8,cardNo, maxRetries),\ + CTBLN(9,cardNo, receiveMode),\ + CTBLN(10,cardNo, priority),\ + CTBLN(11,cardNo, rootOrRepeater),\ + CTBLN(12,cardNo, SID),\ + CTBLN(13,cardNo, registrationMode),\ + CTBLN(14,cardNo, registrationFill),\ + CTBLN(15,cardNo, localTalkAddress),\ + CTBLN(16,cardNo, codeFormat),\ + CTBLN(17,cardNo, numChannels),\ + CTBLN(18,cardNo, channel1),\ + CTBLN(19,cardNo, channel2),\ + CTBLN(20,cardNo, channel3),\ + CTBLN(21,cardNo, channel4),\ + CTBLN(22,cardNo, txClear),\ + CTBLN(23,cardNo, txRetries),\ + CTBLN(24,cardNo, txRouting),\ + CTBLN(25,cardNo, txScrambled),\ + CTBLN(26,cardNo, rxParameter),\ + CTBLN(27,cardNo, txTimeoutMs),\ + CTBLN(28,cardNo, waitCardTimeout),\ + CTBLN(29,cardNo, channelSet), \ + {.ctl_name = 30, .procname = "name",\ + .data = arlan_conf[cardNo].siteName,\ + .maxlen = 16, .mode = 0600, .proc_handler = &proc_dostring},\ + CTBLN(31,cardNo,waitTime),\ + CTBLN(32,cardNo,lParameter),\ + CTBLN(33,cardNo,_15),\ + CTBLN(34,cardNo,headerSize),\ + CTBLN(35,cardNo,async),\ + CTBLN(36,cardNo,tx_delay_ms),\ + CTBLN(37,cardNo,retries),\ + CTBLN(38,cardNo,ReTransmitPacketMaxSize),\ + CTBLN(39,cardNo,waitReTransmitPacketMaxSize),\ + CTBLN(40,cardNo,fastReTransCount),\ + CTBLN(41,cardNo,driverRetransmissions),\ + CTBLN(42,cardNo,txAckTimeoutMs),\ + CTBLN(43,cardNo,registrationInterrupts),\ + CTBLN(44,cardNo,hardwareType),\ + CTBLN(45,cardNo,radioType),\ + CTBLN(46,cardNo,writeEEPROM),\ + CTBLN(47,cardNo,writeRadioType),\ + ARLAN_PROC_DEBUG_ENTRIES\ + CTBLN(50,cardNo,in_speed),\ + CTBLN(51,cardNo,out_speed),\ + CTBLN(52,cardNo,in_speed10),\ + CTBLN(53,cardNo,out_speed10),\ + CTBLN(54,cardNo,in_speed_max),\ + CTBLN(55,cardNo,out_speed_max),\ + CTBLN(56,cardNo,measure_rate),\ + CTBLN(57,cardNo,pre_Command_Wait),\ + CTBLN(58,cardNo,rx_tweak1),\ + CTBLN(59,cardNo,rx_tweak2),\ + CTBLN(60,cardNo,tx_queue_len),\ + + + +static ctl_table arlan_conf_table0[] = +{ + ARLAN_SYSCTL_TABLE_TOTAL(0) + +#ifdef ARLAN_PROC_SHM_DUMP + { + .ctl_name = 150, + .procname = "arlan0-txRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_infotxRing, + }, + { + .ctl_name = 151, + .procname = "arlan0-rxRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_inforxRing, + }, + { + .ctl_name = 152, + .procname = "arlan0-18", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info18, + }, + { + .ctl_name = 153, + .procname = "arlan0-ring", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info161719, + }, + { + .ctl_name = 154, + .procname = "arlan0-shm-cpy", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info, + }, +#endif + { + .ctl_name = 155, + .procname = "config0", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_configure + }, + { + .ctl_name = 156, + .procname = "reset0", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_sysctl_reset, + }, + { .ctl_name = 0 } +}; + +static ctl_table arlan_conf_table1[] = +{ + + ARLAN_SYSCTL_TABLE_TOTAL(1) + +#ifdef ARLAN_PROC_SHM_DUMP + { + .ctl_name = 150, + .procname = "arlan1-txRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_infotxRing, + }, + { + .ctl_name = 151, + .procname = "arlan1-rxRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_inforxRing, + }, + { + .ctl_name = 152, + .procname = "arlan1-18", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info18, + }, + { + .ctl_name = 153, + .procname = "arlan1-ring", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info161719, + }, + { + .ctl_name = 154, + .procname = "arlan1-shm-cpy", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info, + }, +#endif + { + .ctl_name = 155, + .procname = "config1", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_configure, + }, + { + .ctl_name = 156, + .procname = "reset1", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_sysctl_reset, + }, + { .ctl_name = 0 } +}; + +static ctl_table arlan_conf_table2[] = +{ + + ARLAN_SYSCTL_TABLE_TOTAL(2) + +#ifdef ARLAN_PROC_SHM_DUMP + { + .ctl_name = 150, + .procname = "arlan2-txRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_infotxRing, + }, + { + .ctl_name = 151, + .procname = "arlan2-rxRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_inforxRing, + }, + { + .ctl_name = 152, + .procname = "arlan2-18", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info18, + }, + { + .ctl_name = 153, + .procname = "arlan2-ring", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info161719, + }, + { + .ctl_name = 154, + .procname = "arlan2-shm-cpy", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info, + }, +#endif + { + .ctl_name = 155, + .procname = "config2", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_configure, + }, + { + .ctl_name = 156, + .procname = "reset2", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_sysctl_reset, + }, + { .ctl_name = 0 } +}; + +static ctl_table arlan_conf_table3[] = +{ + + ARLAN_SYSCTL_TABLE_TOTAL(3) + +#ifdef ARLAN_PROC_SHM_DUMP + { + .ctl_name = 150, + .procname = "arlan3-txRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_infotxRing, + }, + { + .ctl_name = 151, + .procname = "arlan3-rxRing", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_inforxRing, + }, + { + .ctl_name = 152, + .procname = "arlan3-18", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info18, + }, + { + .ctl_name = 153, + .procname = "arlan3-ring", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info161719, + }, + { + .ctl_name = 154, + .procname = "arlan3-shm-cpy", + .data = &arlan_drive_info, + .maxlen = ARLAN_STR_SIZE, + .mode = 0400, + .proc_handler = &arlan_sysctl_info, + }, +#endif + { + .ctl_name = 155, + .procname = "config3", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_configure, + }, + { + .ctl_name = 156, + .procname = "reset3", + .data = &conf_reset_result, + .maxlen = 100, + .mode = 0400, + .proc_handler = &arlan_sysctl_reset, + }, + { .ctl_name = 0 } +}; + + + +static ctl_table arlan_table[] = +{ + { + .ctl_name = 0, + .procname = "arlan0", + .maxlen = 0, + .mode = 0600, + .child = arlan_conf_table0, + }, + { + .ctl_name = 0, + .procname = "arlan1", + .maxlen = 0, + .mode = 0600, + .child = arlan_conf_table1, + }, + { + .ctl_name = 0, + .procname = "arlan2", + .maxlen = 0, + .mode = 0600, + .child = arlan_conf_table2, + }, + { + .ctl_name = 0, + .procname = "arlan3", + .maxlen = 0, + .mode = 0600, + .child = arlan_conf_table3, + }, + { .ctl_name = 0 } +}; + +#else + +static ctl_table arlan_table[MAX_ARLANS + 1] = +{ + { .ctl_name = 0 } +}; +#endif +#else + +static ctl_table arlan_table[MAX_ARLANS + 1] = +{ + { .ctl_name = 0 } +}; +#endif + + +// static int mmtu = 1234; + +static ctl_table arlan_root_table[] = +{ + { + .ctl_name = 254, + .procname = "arlan", + .maxlen = 0, + .mode = 0555, + .child = arlan_table, + }, + { .ctl_name = 0 } +}; + +/* Make sure that /proc/sys/dev is there */ +//static ctl_table arlan_device_root_table[] = +//{ +// {CTL_DEV, "dev", NULL, 0, 0555, arlan_root_table}, +// {0} +//}; + + + +static struct ctl_table_header *arlan_device_sysctl_header; + +int init_arlan_proc(void) +{ + + int i = 0; + if (arlan_device_sysctl_header) + return 0; + for (i = 0; i < MAX_ARLANS && arlan_device[i]; i++) + arlan_table[i].ctl_name = i + 1; + arlan_device_sysctl_header = register_sysctl_table(arlan_root_table, 0); + if (!arlan_device_sysctl_header) + return -1; + + return 0; + +}; + + + +#ifdef MODULE + +int init_module(void) +{ + + return init_arlan_proc(); +}; + +void cleanup_module(void) +{ + unregister_sysctl_table(arlan_device_sysctl_header); + arlan_device_sysctl_header = NULL; + + return; +}; + +#endif // MODULE +MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/wireless/arlan.c b/drivers/net/wireless/arlan.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/arlan.c Thu Feb 20 23:19:22 2003 @@ -0,0 +1,2077 @@ +/* + * Copyright (C) 1997 Cullen Jennings + * Copyright (C) 1998 Elmer Joandiu, elmer@ylenurme.ee + * GNU General Public License applies + * This module provides support for the Arlan 655 card made by Aironet + */ + +#include +#include "arlan.h" + +#if BITS_PER_LONG != 32 +# error FIXME: this driver requires a 32-bit platform +#endif + +static const char *arlan_version = "C.Jennigs 97 & Elmer.Joandi@ut.ee Oct'98, http://www.ylenurme.ee/~elmer/655/"; + +struct net_device *arlan_device[MAX_ARLANS]; +int last_arlan; + +static int SID = SIDUNKNOWN; +static int radioNodeId = radioNodeIdUNKNOWN; +static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; +static char *siteName = siteNameUNKNOWN; +static int mem = memUNKNOWN; +int arlan_debug = debugUNKNOWN; +static int probe = probeUNKNOWN; +static int numDevices = numDevicesUNKNOWN; +static int spreadingCode = spreadingCodeUNKNOWN; +static int channelNumber = channelNumberUNKNOWN; +static int channelSet = channelSetUNKNOWN; +static int systemId = systemIdUNKNOWN; +static int registrationMode = registrationModeUNKNOWN; +static int keyStart; +static int tx_delay_ms; +static int retries = 5; +static int async = 1; +static int tx_queue_len = 1; +static int arlan_EEPROM_bad; + +#ifdef ARLAN_DEBUGGING + +static int arlan_entry_debug; +static int arlan_exit_debug; +static int testMemory = testMemoryUNKNOWN; +static int irq = irqUNKNOWN; +static int txScrambled = 1; +static int mdebug; +#endif + +#if LINUX_VERSION_CODE > 0x20100 +MODULE_PARM(irq, "i"); +MODULE_PARM(mem, "i"); +MODULE_PARM(probe, "i"); +MODULE_PARM(arlan_debug, "i"); +MODULE_PARM(numDevices, "i"); +MODULE_PARM(testMemory, "i"); +MODULE_PARM(spreadingCode, "i"); +MODULE_PARM(channelNumber, "i"); +MODULE_PARM(channelSet, "i"); +MODULE_PARM(systemId, "i"); +MODULE_PARM(registrationMode, "i"); +MODULE_PARM(radioNodeId, "i"); +MODULE_PARM(SID, "i"); +MODULE_PARM(txScrambled, "i"); +MODULE_PARM(keyStart, "i"); +MODULE_PARM(mdebug, "i"); +MODULE_PARM(tx_delay_ms, "i"); +MODULE_PARM(retries, "i"); +MODULE_PARM(async, "i"); +MODULE_PARM(tx_queue_len, "i"); +MODULE_PARM(arlan_entry_debug, "i"); +MODULE_PARM(arlan_exit_debug, "i"); +MODULE_PARM(arlan_entry_and_exit_debug, "i"); +MODULE_PARM(arlan_EEPROM_bad, "i"); +MODULE_PARM_DESC(irq, "(unused)"); +MODULE_PARM_DESC(mem, "Arlan memory address for single device probing"); +MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)"); +MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)"); +MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1"); +MODULE_PARM_DESC(testMemory, "(unused)"); +MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)"); +MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions"); +#ifdef ARLAN_ENTRY_EXIT_DEBUGGING +MODULE_PARM_DESC(arlan_entry_debug, "Arlan driver function entry debugging"); +MODULE_PARM_DESC(arlan_exit_debug, "Arlan driver function exit debugging"); +MODULE_PARM_DESC(arlan_entry_and_exit_debug, "Arlan driver function entry and exit debugging"); +#else +MODULE_PARM_DESC(arlan_entry_debug, "(ignored)"); +MODULE_PARM_DESC(arlan_exit_debug, "(ignored)"); +MODULE_PARM_DESC(arlan_entry_and_exit_debug, "(ignored)"); +#endif + +EXPORT_SYMBOL(arlan_device); +EXPORT_SYMBOL(arlan_conf); +EXPORT_SYMBOL(last_arlan); + + +// #warning kernel 2.1.110 tested +#define myATOMIC_INIT(a,b) atomic_set(&(a),b) + +#else +#define test_and_set_bit set_bit +#if LINUX_VERSION_CODE != 0x20024 + // #warning kernel 2.0.36 tested +#endif +#define myATOMIC_INIT(a,b) a = b; + +#endif + +struct arlan_conf_stru arlan_conf[MAX_ARLANS]; +static int arlans_found; + +static int arlan_probe_here(struct net_device *dev, int ioaddr); +static int arlan_open(struct net_device *dev); +static int arlan_tx(struct sk_buff *skb, struct net_device *dev); +static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static int arlan_close(struct net_device *dev); +static struct net_device_stats * + arlan_statistics (struct net_device *dev); +static void arlan_set_multicast (struct net_device *dev); +static int arlan_hw_tx (struct net_device* dev, char *buf, int length ); +static int arlan_hw_config (struct net_device * dev); +static void arlan_tx_done_interrupt (struct net_device * dev, int status); +static void arlan_rx_interrupt (struct net_device * dev, u_char rxStatus, u_short, u_short); +static void arlan_process_interrupt (struct net_device * dev); +static void arlan_tx_timeout (struct net_device *dev); +int arlan_command(struct net_device * dev, int command); + +EXPORT_SYMBOL(arlan_command); + +static inline long long arlan_time(void) +{ + struct timeval timev; + do_gettimeofday(&timev); + return ((long long) timev.tv_sec * 1000000 + timev.tv_usec); +}; + +#ifdef ARLAN_ENTRY_EXIT_DEBUGGING +#define ARLAN_DEBUG_ENTRY(name) \ + {\ + struct timeval timev;\ + do_gettimeofday(&timev);\ + if (arlan_entry_debug || arlan_entry_and_exit_debug)\ + printk("--->>>" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec));\ + } +#define ARLAN_DEBUG_EXIT(name) \ + {\ + struct timeval timev;\ + do_gettimeofday(&timev);\ + if (arlan_exit_debug || arlan_entry_and_exit_debug)\ + printk("<<<---" name " %ld " "\n",((long int) timev.tv_sec * 1000000 + timev.tv_usec) );\ + } +#else +#define ARLAN_DEBUG_ENTRY(name) +#define ARLAN_DEBUG_EXIT(name) +#endif + + +#define arlan_interrupt_ack(dev)\ + clearClearInterrupt(dev);\ + setClearInterrupt(dev); + + +#define ARLAN_COMMAND_LOCK(dev) \ + if (atomic_dec_and_test(&((struct arlan_private * )dev->priv)->card_users))\ + arlan_wait_command_complete_short(dev,__LINE__); +#define ARLAN_COMMAND_UNLOCK(dev) \ + atomic_inc(&((struct arlan_private * )dev->priv)->card_users); + + +#define ARLAN_COMMAND_INC(dev) \ + {((struct arlan_private *) dev->priv)->under_command++;} +#define ARLAN_COMMAND_ZERO(dev) \ + {((struct arlan_private *) dev->priv)->under_command =0;} +#define ARLAN_UNDER_COMMAND(dev)\ + (((struct arlan_private *) dev->priv)->under_command) + +#define ARLAN_COMMAND_START(dev) ARLAN_COMMAND_INC(dev) +#define ARLAN_COMMAND_END(dev) ARLAN_COMMAND_ZERO(dev) +#define ARLAN_TOGGLE_START(dev)\ + {((struct arlan_private *) dev->priv)->under_toggle++;} +#define ARLAN_TOGGLE_END(dev)\ + {((struct arlan_private *) dev->priv)->under_toggle=0;} +#define ARLAN_UNDER_TOGGLE(dev)\ + (((struct arlan_private *) dev->priv)->under_toggle) + + + +static inline int arlan_drop_tx(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + priv->stats.tx_errors++; + if (priv->Conf->tx_delay_ms) + { + priv->tx_done_delayed = jiffies + priv->Conf->tx_delay_ms * HZ / 1000 + 1; + } + else + { + priv->waiting_command_mask &= ~ARLAN_COMMAND_TX; + TXHEAD(dev).offset = 0; + TXTAIL(dev).offset = 0; + priv->txLast = 0; + priv->txOffset = 0; + priv->bad = 0; + if (!priv->under_reset && !priv->under_config) + netif_wake_queue (dev); + } + return 1; +}; + + +int arlan_command(struct net_device *dev, int command_p) +{ + + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; + struct arlan_private *priv = (struct arlan_private *) dev->priv; + int udelayed = 0; + int i = 0; + long long time_mks = arlan_time(); + + ARLAN_DEBUG_ENTRY("arlan_command"); + + if (priv->card_polling_interval) + priv->card_polling_interval = 1; + + if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) + printk(KERN_DEBUG "arlan_command, %lx lock %lx commandByte %x waiting %x incoming %x \n", + jiffies, priv->command_lock, READSHMB(arlan->commandByte), + priv->waiting_command_mask, command_p); + + priv->waiting_command_mask |= command_p; + + if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) + if (jiffies - priv->lastReset < 5 * HZ) + priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET; + + if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ACK) + { + arlan_interrupt_ack(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ACK; + } + if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ENABLE) + { + setInterruptEnable(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ENABLE; + } + + /* Card access serializing lock */ + + if (test_and_set_bit(0, (void *) &priv->command_lock)) + { + if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) + printk(KERN_DEBUG "arlan_command: entered when command locked \n"); + goto command_busy_end; + } + /* Check cards status and waiting */ + + if (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW)) + { + while (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW)) + { + if (READSHMB(arlan->resetFlag) || + READSHMB(arlan->commandByte)) /* || + (readControlRegister(dev) & ARLAN_ACCESS)) + */ + udelay(40); + else + priv->waiting_command_mask &= ~(ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW); + + udelayed++; + + if (priv->waiting_command_mask & ARLAN_COMMAND_LONG_WAIT_NOW) + { + if (udelayed * 40 > 1000000) + { + printk(KERN_ERR "%s long wait too long \n", dev->name); + priv->waiting_command_mask |= ARLAN_COMMAND_RESET; + break; + } + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_WAIT_NOW) + { + if (udelayed * 40 > 1000) + { + printk(KERN_ERR "%s short wait too long \n", dev->name); + goto bad_end; + } + } + } + } + else + { + i = 0; + while ((READSHMB(arlan->resetFlag) || + READSHMB(arlan->commandByte)) && + conf->pre_Command_Wait > (i++) * 10) + udelay(10); + + + if ((READSHMB(arlan->resetFlag) || + READSHMB(arlan->commandByte)) && + !(priv->waiting_command_mask & ARLAN_COMMAND_RESET)) + { + goto card_busy_end; + } + } + if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) + priv->under_reset = 1; + if (priv->waiting_command_mask & ARLAN_COMMAND_CONF) + priv->under_config = 1; + + /* Issuing command */ + arlan_lock_card_access(dev); + if (priv->waiting_command_mask & ARLAN_COMMAND_POWERUP) + { + // if (readControlRegister(dev) & (ARLAN_ACCESS && ARLAN_POWER)) + setPowerOn(dev); + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERUP; + priv->waiting_command_mask |= ARLAN_COMMAND_RESET; + priv->card_polling_interval = HZ / 10; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_ACTIVATE) + { + WRITESHMB(arlan->commandByte, ARLAN_COM_ACTIVATE); + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_ACTIVATE; + priv->card_polling_interval = HZ / 10; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_RX_ABORT) + { + if (priv->rx_command_given) + { + WRITESHMB(arlan->commandByte, ARLAN_COM_RX_ABORT); + arlan_interrupt_lancpu(dev); + priv->rx_command_given = 0; + } + priv->waiting_command_mask &= ~ARLAN_COMMAND_RX_ABORT; + priv->card_polling_interval = 1; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_TX_ABORT) + { + if (priv->tx_command_given) + { + WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ABORT); + arlan_interrupt_lancpu(dev); + priv->tx_command_given = 0; + } + priv->waiting_command_mask &= ~ARLAN_COMMAND_TX_ABORT; + priv->card_polling_interval = 1; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_RESET) + { + priv->under_reset=1; + netif_stop_queue (dev); + + arlan_drop_tx(dev); + if (priv->tx_command_given || priv->rx_command_given) + { + printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name); + }; + netif_stop_queue (dev); + if (arlan_debug & ARLAN_DEBUG_RESET) + printk(KERN_ERR "%s: Doing chip reset\n", dev->name); + priv->lastReset = jiffies; + WRITESHM(arlan->commandByte, 0, u_char); + /* hold card in reset state */ + setHardwareReset(dev); + /* set reset flag and then release reset */ + WRITESHM(arlan->resetFlag, 0xff, u_char); + clearChannelAttention(dev); + clearHardwareReset(dev); + priv->numResets++; + priv->card_polling_interval = HZ / 4; + priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET; + priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK; +// priv->waiting_command_mask |= ARLAN_COMMAND_INT_RENABLE; +// priv->waiting_command_mask |= ARLAN_COMMAND_RX; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RACK) + { + clearHardwareReset(dev); + clearClearInterrupt(dev); + setClearInterrupt(dev); + setInterruptEnable(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RACK; + priv->waiting_command_mask |= ARLAN_COMMAND_CONF; + priv->under_config = 1; + priv->under_reset = 0; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RENABLE) + { + setInterruptEnable(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RENABLE; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF) + { + if (priv->tx_command_given || priv->rx_command_given) + { + printk(KERN_ERR "%s: Reset under tx or rx command \n", dev->name); + } + arlan_drop_tx(dev); + setInterruptEnable(dev); + arlan_hw_config(dev); + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF; + priv->card_polling_interval = HZ / 10; +// priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK; +// priv->waiting_command_mask |= ARLAN_COMMAND_INT_ENABLE; + priv->waiting_command_mask |= ARLAN_COMMAND_CONF_WAIT; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF_WAIT) + { + if (READSHMB(arlan->configuredStatusFlag) != 0 && + READSHMB(arlan->diagnosticInfo) == 0xff) + { + priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF_WAIT; + priv->waiting_command_mask |= ARLAN_COMMAND_RX; + priv->waiting_command_mask |= ARLAN_COMMAND_TBUSY_CLEAR; + priv->card_polling_interval = HZ / 10; + priv->tx_command_given = 0; + priv->under_config = 0; + } + else + { + priv->card_polling_interval = 1; + if (arlan_debug & ARLAN_DEBUG_TIMING) + printk(KERN_ERR "configure delayed \n"); + } + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_RX) + { + if (!registrationBad(dev)) + { + setInterruptEnable(dev); + memset_io((void *) arlan->commandParameter, 0, 0xf); + WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_RX_ENABLE); + WRITESHMB(arlan->commandParameter[0], conf->rxParameter); + arlan_interrupt_lancpu(dev); + priv->rx_command_given = 0; // mnjah, bad + priv->last_rx_time = arlan_time(); + priv->waiting_command_mask &= ~ARLAN_COMMAND_RX; + priv->card_polling_interval = 1; + } + else + priv->card_polling_interval = 2; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_TBUSY_CLEAR) + { + if ( !registrationBad(dev) && + (netif_queue_stopped(dev) || !netif_running(dev)) ) + { + priv->waiting_command_mask &= ~ARLAN_COMMAND_TBUSY_CLEAR; + netif_wake_queue (dev); + }; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_TX) + { + if (!test_and_set_bit(0, (void *) &priv->tx_command_given)) + { + if ((time_mks - priv->last_tx_time > conf->rx_tweak1) || + (time_mks - priv->last_rx_int_ack_time < conf->rx_tweak2)) + { + setInterruptEnable(dev); + memset_io((void *) arlan->commandParameter, 0, 0xf); + WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ENABLE | ARLAN_COM_INT); + memcpy_toio((void *) arlan->commandParameter, &TXLAST(dev), 14); +// for ( i=1 ; i < 15 ; i++) printk("%02x:",READSHMB(arlan->commandParameter[i])); + priv->last_command_was_rx = 0; + priv->tx_last_sent = jiffies; + arlan_interrupt_lancpu(dev); + priv->last_tx_time = arlan_time(); + priv->tx_command_given = 1; + priv->waiting_command_mask &= ~ARLAN_COMMAND_TX; + priv->card_polling_interval = 1; + } + else + { + priv->tx_command_given = 0; + priv->card_polling_interval = 1; + } + } + else if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) + printk(KERN_ERR "tx command when tx chain locked \n"); + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOPINT) + { + { + WRITESHMB(arlan->commandByte, ARLAN_COM_NOP | ARLAN_COM_INT); + } + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOPINT; + priv->card_polling_interval = HZ / 3; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOP) + { + WRITESHMB(arlan->commandByte, ARLAN_COM_NOP); + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOP; + priv->card_polling_interval = HZ / 3; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_SLOW_POLL) + { + WRITESHMB(arlan->commandByte, ARLAN_COM_GOTO_SLOW_POLL); + arlan_interrupt_lancpu(dev); + priv->waiting_command_mask &= ~ARLAN_COMMAND_SLOW_POLL; + priv->card_polling_interval = HZ / 3; + } + else if (priv->waiting_command_mask & ARLAN_COMMAND_POWERDOWN) + { + setPowerOff(dev); + if (arlan_debug & ARLAN_DEBUG_CARD_STATE) + printk(KERN_WARNING "%s: Arlan Going Standby\n", dev->name); + priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERDOWN; + priv->card_polling_interval = 3 * HZ; + } + arlan_unlock_card_access(dev); + for (i = 0; READSHMB(arlan->commandByte) && i < 20; i++) + udelay(10); + if (READSHMB(arlan->commandByte)) + if (arlan_debug & ARLAN_DEBUG_CARD_STATE) + printk(KERN_ERR "card busy leaving command %x \n", priv->waiting_command_mask); + + priv->command_lock = 0; + ARLAN_DEBUG_EXIT("arlan_command"); + priv->last_command_buff_free_time = jiffies; + return 0; + +card_busy_end: + if (jiffies - priv->last_command_buff_free_time > HZ) + priv->waiting_command_mask |= ARLAN_COMMAND_CLEAN_AND_RESET; + + if (arlan_debug & ARLAN_DEBUG_CARD_STATE) + printk(KERN_ERR "%s arlan_command card busy end \n", dev->name); + priv->command_lock = 0; + ARLAN_DEBUG_EXIT("arlan_command"); + return 1; + +bad_end: + printk(KERN_ERR "%s arlan_command bad end \n", dev->name); + + priv->command_lock = 0; + ARLAN_DEBUG_EXIT("arlan_command"); + + return -1; + +command_busy_end: + if (arlan_debug & ARLAN_DEBUG_CARD_STATE) + printk(KERN_ERR "%s arlan_command command busy end \n", dev->name); + ARLAN_DEBUG_EXIT("arlan_command"); + return 2; + +}; + +static inline void arlan_command_process(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + int times = 0; + while (priv->waiting_command_mask && times < 8) + { + if (priv->waiting_command_mask) + { + if (arlan_command(dev, 0)) + break; + times++; + } + /* if long command, we wont repeat trying */ ; + if (priv->card_polling_interval > 1) + break; + times++; + } +} + + +static inline void arlan_retransmit_now(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + + ARLAN_DEBUG_ENTRY("arlan_retransmit_now"); + if (TXLAST(dev).offset == 0) + { + if (TXHEAD(dev).offset) + { + priv->txLast = 0; + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to head \n"); + + } + else if (TXTAIL(dev).offset) + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to tail \n"); + priv->txLast = 1; + } + else + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "ReTransmit buff empty"); + priv->txOffset = 0; + netif_wake_queue (dev); + return; + + } + arlan_command(dev, ARLAN_COMMAND_TX); + + priv->nof_tx++; + + priv->Conf->driverRetransmissions++; + priv->retransmissions++; + + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("Retransmit %d bytes \n", TXLAST(dev).length); + + ARLAN_DEBUG_EXIT("arlan_retransmit_now"); +} + + + +static void arlan_registration_timer(unsigned long data) +{ + struct net_device *dev = (struct net_device *) data; + struct arlan_private *priv = (struct arlan_private *) dev->priv; + + int lostTime = ((int) (jiffies - priv->registrationLastSeen)) * 1000 / HZ; + int bh_mark_needed = 0; + int next_tick = 1; + + + priv->timer_chain_active = 1; + + + if (registrationBad(dev)) + { + //debug=100; + priv->registrationLostCount++; + if (lostTime > 7000 && lostTime < 7200) + { + printk(KERN_NOTICE "%s registration Lost \n", dev->name); + } + if (lostTime / priv->reRegisterExp > 2000) + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF); + if (lostTime / (priv->reRegisterExp) > 3500) + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); + if (priv->reRegisterExp < 400) + priv->reRegisterExp += 2; + if (lostTime > 7200) + { + next_tick = HZ; + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); + } + } + else + { + if (priv->Conf->registrationMode && lostTime > 10000 && + priv->registrationLostCount) + { + printk(KERN_NOTICE "%s registration is back after %d milliseconds\n", dev->name, + ((int) (jiffies - priv->registrationLastSeen) * 1000) / HZ); + } + priv->registrationLastSeen = jiffies; + priv->registrationLostCount = 0; + priv->reRegisterExp = 1; + if (!netif_running(dev) ) + netif_wake_queue(dev); + if (priv->tx_last_sent > priv->tx_last_cleared && + jiffies - priv->tx_last_sent > 5*HZ ){ + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); + priv->tx_last_cleared = jiffies; + }; + } + + + if (!registrationBad(dev) && priv->ReTransmitRequested) + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk(KERN_ERR "Retransmit from timer \n"); + priv->ReTransmitRequested = 0; + arlan_retransmit_now(dev); + } + if (!registrationBad(dev) && + time_after(jiffies, priv->tx_done_delayed) && + priv->tx_done_delayed != 0) + { + TXLAST(dev).offset = 0; + if (priv->txLast) + priv->txLast = 0; + else if (TXTAIL(dev).offset) + priv->txLast = 1; + if (TXLAST(dev).offset) + { + arlan_retransmit_now(dev); + dev->trans_start = jiffies; + } + if (!(TXHEAD(dev).offset && TXTAIL(dev).offset)) + { + priv->txOffset = 0; + netif_wake_queue (dev); + } + priv->tx_done_delayed = 0; + bh_mark_needed = 1; + } + if (bh_mark_needed) + { + priv->txOffset = 0; + netif_wake_queue (dev); + } + arlan_process_interrupt(dev); + + if (next_tick < priv->card_polling_interval) + next_tick = priv->card_polling_interval; + + priv->timer_chain_active = 0; + priv->timer.expires = jiffies + next_tick; + + add_timer(&priv->timer); +} + + +#ifdef ARLAN_DEBUGGING + +static void arlan_print_registers(struct net_device *dev, int line) +{ + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + + u_char hostcpuLock, lancpuLock, controlRegister, cntrlRegImage, + txStatus, rxStatus, interruptInProgress, commandByte; + + + ARLAN_DEBUG_ENTRY("arlan_print_registers"); + READSHM(interruptInProgress, arlan->interruptInProgress, u_char); + READSHM(hostcpuLock, arlan->hostcpuLock, u_char); + READSHM(lancpuLock, arlan->lancpuLock, u_char); + READSHM(controlRegister, arlan->controlRegister, u_char); + READSHM(cntrlRegImage, arlan->cntrlRegImage, u_char); + READSHM(txStatus, arlan->txStatus, u_char); + READSHM(rxStatus, arlan->rxStatus, u_char); + READSHM(commandByte, arlan->commandByte, u_char); + + printk(KERN_WARNING "line %04d IP %02x HL %02x LL %02x CB %02x CR %02x CRI %02x TX %02x RX %02x\n", + line, interruptInProgress, hostcpuLock, lancpuLock, commandByte, + controlRegister, cntrlRegImage, txStatus, rxStatus); + + ARLAN_DEBUG_EXIT("arlan_print_registers"); +} +#endif + + +static int arlan_hw_tx(struct net_device *dev, char *buf, int length) +{ + int i; + + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = priv->card; + struct arlan_conf_stru *conf = priv->Conf; + + int tailStarts = 0x800; + int headEnds = 0x0; + + + ARLAN_DEBUG_ENTRY("arlan_hw_tx"); + if (TXHEAD(dev).offset) + headEnds = (((TXHEAD(dev).offset + TXHEAD(dev).length - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 1) * 64; + if (TXTAIL(dev).offset) + tailStarts = 0x800 - (((TXTAIL(dev).offset - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 2) * 64; + + + if (!TXHEAD(dev).offset && length < tailStarts) + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk(KERN_ERR "TXHEAD insert, tailStart %d\n", tailStarts); + + TXHEAD(dev).offset = + (((int) arlan->txBuffer) - ((int) arlan)); + TXHEAD(dev).length = length - ARLAN_FAKE_HDR_LEN; + for (i = 0; i < 6; i++) + TXHEAD(dev).dest[i] = buf[i]; + TXHEAD(dev).clear = conf->txClear; + TXHEAD(dev).retries = conf->txRetries; /* 0 is use default */ + TXHEAD(dev).routing = conf->txRouting; + TXHEAD(dev).scrambled = conf->txScrambled; + memcpy_toio(((char *) arlan + TXHEAD(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXHEAD(dev).length); + } + else if (!TXTAIL(dev).offset && length < (0x800 - headEnds)) + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk(KERN_ERR "TXTAIL insert, headEnd %d\n", headEnds); + + TXTAIL(dev).offset = + (((int) arlan->txBuffer) - ((int) arlan)) + 0x800 - (length / 64 + 2) * 64; + TXTAIL(dev).length = length - ARLAN_FAKE_HDR_LEN; + for (i = 0; i < 6; i++) + TXTAIL(dev).dest[i] = buf[i]; + TXTAIL(dev).clear = conf->txClear; + TXTAIL(dev).retries = conf->txRetries; + TXTAIL(dev).routing = conf->txRouting; + TXTAIL(dev).scrambled = conf->txScrambled; + memcpy_toio(((char *) arlan + TXTAIL(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXTAIL(dev).length); + } + else + { + netif_stop_queue (dev); + return -1; + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk(KERN_ERR "TX TAIL & HEAD full, return, tailStart %d headEnd %d\n", tailStarts, headEnds); + } + priv->out_bytes += length; + priv->out_bytes10 += length; + if (conf->measure_rate < 1) + conf->measure_rate = 1; + if (jiffies - priv->out_time > conf->measure_rate * HZ) + { + conf->out_speed = priv->out_bytes / conf->measure_rate; + priv->out_bytes = 0; + priv->out_time = jiffies; + } + if (jiffies - priv->out_time10 > conf->measure_rate * HZ * 10) + { + conf->out_speed10 = priv->out_bytes10 / (10 * conf->measure_rate); + priv->out_bytes10 = 0; + priv->out_time10 = jiffies; + } + if (TXHEAD(dev).offset && TXTAIL(dev).offset) + { + netif_stop_queue (dev); + return 0; + } + else + netif_start_queue (dev); + + + IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) + printk(KERN_WARNING "%s Transmit t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name, + (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2], (unsigned char) buf[3], + (unsigned char) buf[4], (unsigned char) buf[5], (unsigned char) buf[6], (unsigned char) buf[7], + (unsigned char) buf[8], (unsigned char) buf[9], (unsigned char) buf[10], (unsigned char) buf[11]); + + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "TX command prepare for buffer %d\n", priv->txLast); + + arlan_command(dev, ARLAN_COMMAND_TX); + + priv->last_command_was_rx = 0; + priv->tx_last_sent = jiffies; + priv->nof_tx++; + + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("%s TX Qued %d bytes \n", dev->name, length); + + ARLAN_DEBUG_EXIT("arlan_hw_tx"); + + return 0; +} + + +static int arlan_hw_config(struct net_device *dev) +{ + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; + struct arlan_private *priv = (struct arlan_private *) dev->priv; + + ARLAN_DEBUG_ENTRY("arlan_hw_config"); + + printk(KERN_NOTICE "%s arlan configure called \n", dev->name); + if (arlan_EEPROM_bad) + printk(KERN_NOTICE "arlan configure with eeprom bad option \n"); + + + WRITESHM(arlan->spreadingCode, conf->spreadingCode, u_char); + WRITESHM(arlan->channelSet, conf->channelSet, u_char); + + if (arlan_EEPROM_bad) + WRITESHM(arlan->defaultChannelSet, conf->channelSet, u_char); + + WRITESHM(arlan->channelNumber, conf->channelNumber, u_char); + + WRITESHM(arlan->scramblingDisable, conf->scramblingDisable, u_char); + WRITESHM(arlan->txAttenuation, conf->txAttenuation, u_char); + + WRITESHM(arlan->systemId, conf->systemId, u_int); + + WRITESHM(arlan->maxRetries, conf->maxRetries, u_char); + WRITESHM(arlan->receiveMode, conf->receiveMode, u_char); + WRITESHM(arlan->priority, conf->priority, u_char); + WRITESHM(arlan->rootOrRepeater, conf->rootOrRepeater, u_char); + WRITESHM(arlan->SID, conf->SID, u_int); + + WRITESHM(arlan->registrationMode, conf->registrationMode, u_char); + + WRITESHM(arlan->registrationFill, conf->registrationFill, u_char); + WRITESHM(arlan->localTalkAddress, conf->localTalkAddress, u_char); + WRITESHM(arlan->codeFormat, conf->codeFormat, u_char); + WRITESHM(arlan->numChannels, conf->numChannels, u_char); + WRITESHM(arlan->channel1, conf->channel1, u_char); + WRITESHM(arlan->channel2, conf->channel2, u_char); + WRITESHM(arlan->channel3, conf->channel3, u_char); + WRITESHM(arlan->channel4, conf->channel4, u_char); + WRITESHM(arlan->radioNodeId, conf->radioNodeId, u_short); + WRITESHM(arlan->SID, conf->SID, u_int); + WRITESHM(arlan->waitTime, conf->waitTime, u_short); + WRITESHM(arlan->lParameter, conf->lParameter, u_short); + memcpy_toio(&(arlan->_15), &(conf->_15), 3); + WRITESHM(arlan->_15, conf->_15, u_short); + WRITESHM(arlan->headerSize, conf->headerSize, u_short); + if (arlan_EEPROM_bad) + WRITESHM(arlan->hardwareType, conf->hardwareType, u_char); + WRITESHM(arlan->radioType, conf->radioType, u_char); + if (arlan_EEPROM_bad) + WRITESHM(arlan->radioModule, conf->radioType, u_char); + + memcpy_toio(arlan->encryptionKey + keyStart, encryptionKey, 8); + memcpy_toio(arlan->name, conf->siteName, 16); + + WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_CONF); /* do configure */ + memset_io(arlan->commandParameter, 0, 0xf); /* 0xf */ + memset_io(arlan->commandParameter + 1, 0, 2); + if (conf->writeEEPROM) + { + memset_io(arlan->commandParameter, conf->writeEEPROM, 1); +// conf->writeEEPROM=0; + } + if (conf->registrationMode && conf->registrationInterrupts) + memset_io(arlan->commandParameter + 3, 1, 1); + else + memset_io(arlan->commandParameter + 3, 0, 1); + + priv->irq_test_done = 0; + + if (conf->tx_queue_len) + dev->tx_queue_len = conf->tx_queue_len; + udelay(100); + + ARLAN_DEBUG_EXIT("arlan_hw_config"); + return 0; +} + + +static int arlan_read_card_configuration(struct net_device *dev) +{ + u_char tlx415; + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; + + ARLAN_DEBUG_ENTRY("arlan_read_card_configuration"); + + if (radioNodeId == radioNodeIdUNKNOWN) + { + READSHM(conf->radioNodeId, arlan->radioNodeId, u_short); + } + else + conf->radioNodeId = radioNodeId; + + if (SID == SIDUNKNOWN) + { + READSHM(conf->SID, arlan->SID, u_int); + } + else conf->SID = SID; + + if (spreadingCode == spreadingCodeUNKNOWN) + { + READSHM(conf->spreadingCode, arlan->spreadingCode, u_char); + } + else + conf->spreadingCode = spreadingCode; + + if (channelSet == channelSetUNKNOWN) + { + READSHM(conf->channelSet, arlan->channelSet, u_char); + } + else conf->channelSet = channelSet; + + if (channelNumber == channelNumberUNKNOWN) + { + READSHM(conf->channelNumber, arlan->channelNumber, u_char); + } + else conf->channelNumber = channelNumber; + + READSHM(conf->scramblingDisable, arlan->scramblingDisable, u_char); + READSHM(conf->txAttenuation, arlan->txAttenuation, u_char); + + if (systemId == systemIdUNKNOWN) + { + READSHM(conf->systemId, arlan->systemId, u_int); + } + else conf->systemId = systemId; + + READSHM(conf->maxDatagramSize, arlan->maxDatagramSize, u_short); + READSHM(conf->maxFrameSize, arlan->maxFrameSize, u_short); + READSHM(conf->maxRetries, arlan->maxRetries, u_char); + READSHM(conf->receiveMode, arlan->receiveMode, u_char); + READSHM(conf->priority, arlan->priority, u_char); + READSHM(conf->rootOrRepeater, arlan->rootOrRepeater, u_char); + + if (SID == SIDUNKNOWN) + { + READSHM(conf->SID, arlan->SID, u_int); + } + else conf->SID = SID; + + if (registrationMode == registrationModeUNKNOWN) + { + READSHM(conf->registrationMode, arlan->registrationMode, u_char); + } + else conf->registrationMode = registrationMode; + + READSHM(conf->registrationFill, arlan->registrationFill, u_char); + READSHM(conf->localTalkAddress, arlan->localTalkAddress, u_char); + READSHM(conf->codeFormat, arlan->codeFormat, u_char); + READSHM(conf->numChannels, arlan->numChannels, u_char); + READSHM(conf->channel1, arlan->channel1, u_char); + READSHM(conf->channel2, arlan->channel2, u_char); + READSHM(conf->channel3, arlan->channel3, u_char); + READSHM(conf->channel4, arlan->channel4, u_char); + READSHM(conf->waitTime, arlan->waitTime, u_short); + READSHM(conf->lParameter, arlan->lParameter, u_short); + READSHM(conf->_15, arlan->_15, u_short); + READSHM(conf->headerSize, arlan->headerSize, u_short); + READSHM(conf->hardwareType, arlan->hardwareType, u_char); + READSHM(conf->radioType, arlan->radioModule, u_char); + + if (conf->radioType == 0) + conf->radioType = 0xc; + + WRITESHM(arlan->configStatus, 0xA5, u_char); + READSHM(tlx415, arlan->configStatus, u_char); + + if (tlx415 != 0xA5) + printk(KERN_INFO "%s tlx415 chip \n", dev->name); + + conf->txClear = 0; + conf->txRetries = 1; + conf->txRouting = 1; + conf->txScrambled = 0; + conf->rxParameter = 1; + conf->txTimeoutMs = 4000; + conf->waitCardTimeout = 100000; + conf->receiveMode = ARLAN_RCV_CLEAN; + memcpy_fromio(conf->siteName, arlan->name, 16); + conf->siteName[16] = '\0'; + conf->retries = retries; + conf->tx_delay_ms = tx_delay_ms; + conf->async = async; + conf->ReTransmitPacketMaxSize = 200; + conf->waitReTransmitPacketMaxSize = 200; + conf->txAckTimeoutMs = 900; + conf->fastReTransCount = 3; + + ARLAN_DEBUG_EXIT("arlan_read_card_configuration"); + + return 0; +} + + +static int lastFoundAt = 0xbe000; + + +/* + * 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 arlan_check_fingerprint(int memaddr) +{ + static char probeText[] = "TELESYSTEM SLW INC. ARLAN \0"; + char tempBuf[49]; + volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr; + + ARLAN_DEBUG_ENTRY("arlan_check_fingerprint"); + if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){ + // printk(KERN_WARNING "arlan: memory region %lx excluded from probing \n",virt_to_phys((void*)memaddr)); + return -ENODEV; + }; + memcpy_fromio(tempBuf, arlan->textRegion, 29); + tempBuf[30] = 0; + + /* check for card at this address */ + if (0 != strncmp(tempBuf, probeText, 29)){ +// not release_mem_region(virt_to_phys((void*)memaddr),0x2000); + return -ENODEV; + } + +// printk(KERN_INFO "arlan found at 0x%x \n",memaddr); + ARLAN_DEBUG_EXIT("arlan_check_fingerprint"); + + return 0; + + +} + +static int __init arlan_probe_everywhere(struct net_device *dev) +{ + int m; + int probed = 0; + int found = 0; + + SET_MODULE_OWNER(dev); + + ARLAN_DEBUG_ENTRY("arlan_probe_everywhere"); + if (mem != 0 && numDevices == 1) /* Check a single specified location. */ + { + if (arlan_probe_here(dev, (int) phys_to_virt( mem) ) == 0) + return 0; + else + return -ENODEV; + } + for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000) + { + if (arlan_probe_here(dev, m) == 0) + { + found++; + lastFoundAt = (int)virt_to_phys((void*)m); + break; + } + probed++; + } + if (found == 0 && probed != 0) + { + if (lastFoundAt == 0xbe000) + printk(KERN_ERR "arlan: No Arlan devices found \n"); + return -ENODEV; + } + else + return 0; + + ARLAN_DEBUG_EXIT("arlan_probe_everywhere"); + + return -ENODEV; +} + + +static int arlan_change_mtu(struct net_device *dev, int new_mtu) +{ + struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; + + ARLAN_DEBUG_ENTRY("arlan_change_mtu"); + if (new_mtu > 2032) + return -EINVAL; + dev->mtu = new_mtu; + if (new_mtu < 256) + new_mtu = 256; /* cards book suggests 1600 */ + conf->maxDatagramSize = new_mtu; + conf->maxFrameSize = new_mtu + 48; + + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF); + printk(KERN_NOTICE "%s mtu changed to %d \n", dev->name, new_mtu); + + ARLAN_DEBUG_EXIT("arlan_change_mtu"); + + return 0; +} + +static int arlan_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + + + ARLAN_DEBUG_ENTRY("arlan_mac_addr"); + return -EINVAL; + + if (!netif_running(dev)) + return -EBUSY; + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + + ARLAN_DEBUG_EXIT("arlan_mac_addr"); + return 0; +} + + + + +static int __init + arlan_allocate_device(int num, struct net_device *devs) +{ + + struct net_device *dev; + struct arlan_private *ap; + + ARLAN_DEBUG_ENTRY("arlan_allocate_device"); + + if (!devs) { + dev = init_etherdev(0, sizeof(struct arlan_private) + sizeof(struct arlan_shmem)); + if (!dev) { + printk(KERN_ERR "ARLAN: init_etherdev failed\n"); + return 0; + } + ap = dev->priv; + ap->conf = dev->priv + sizeof(struct arlan_private); + ap->init_etherdev_alloc = 1; + } else { + dev = devs; + dev->priv = kmalloc(sizeof(struct arlan_private) + sizeof(struct arlan_shmem), GFP_KERNEL); + if (!dev->priv) { + printk(KERN_ERR "ARLAN: kmalloc of dev->priv failed\n"); + return 0; + } + ap = dev->priv; + ap->conf = dev->priv + sizeof(struct arlan_private); + memset(ap, 0, sizeof(*ap)); + } + + /* Fill in the 'dev' fields. */ + dev->base_addr = 0; + dev->mem_start = 0; + dev->mem_end = 0; + dev->mtu = 1500; + dev->flags = 0; /* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */ + dev->irq = 0; + dev->dma = 0; + dev->tx_queue_len = tx_queue_len; + ether_setup(dev); + dev->tx_queue_len = tx_queue_len; + dev->open = arlan_open; + dev->stop = arlan_close; + dev->hard_start_xmit = arlan_tx; + dev->get_stats = arlan_statistics; + dev->set_multicast_list = arlan_set_multicast; + dev->change_mtu = arlan_change_mtu; + dev->set_mac_address = arlan_mac_addr; + dev->tx_timeout = arlan_tx_timeout; + dev->watchdog_timeo = 3*HZ; + + ((struct arlan_private *) dev->priv)->irq_test_done = 0; + arlan_device[num] = dev; + ((struct arlan_private *) arlan_device[num]->priv)->Conf = &(arlan_conf[num]); + + ((struct arlan_private *) dev->priv)->Conf->pre_Command_Wait = 40; + ((struct arlan_private *) dev->priv)->Conf->rx_tweak1 = 30; + ((struct arlan_private *) dev->priv)->Conf->rx_tweak2 = 0; + + ARLAN_DEBUG_EXIT("arlan_allocate_device"); + return (int) dev; +} + + +static int __init arlan_probe_here(struct net_device *dev, int memaddr) +{ + volatile struct arlan_shmem *arlan; + + ARLAN_DEBUG_ENTRY("arlan_probe_here"); + + if (arlan_check_fingerprint(memaddr)) + return -ENODEV; + + printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, (int) virt_to_phys((void*)memaddr)); + + if (!arlan_allocate_device(arlans_found, dev)) + return -1; + + ((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr; + arlan = (void *) memaddr; + + dev->mem_start = memaddr; + dev->mem_end = memaddr + 0x1FFF; + + if (dev->irq < 2) + { + READSHM(dev->irq, arlan->irqLevel, u_char); + } else if (dev->irq == 2) + dev->irq = 9; + + arlan_read_card_configuration(dev); + + ARLAN_DEBUG_EXIT("arlan_probe_here"); + return 0; +} + + + + +static int arlan_open(struct net_device *dev) +{ + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = priv->card; + int ret = 0; + + ARLAN_DEBUG_ENTRY("arlan_open"); + + if (dev->mem_start == 0) + ret = arlan_probe_everywhere(dev); + if (ret != 0) + return ret; + + arlan = ((struct arlan_private *) dev->priv)->card; + ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev); + if (ret) + { + printk(KERN_ERR "%s: unable to get IRQ %d .\n", + dev->name, dev->irq); + return ret; + } + + + priv->bad = 0; + priv->lastReset = 0; + priv->reset = 0; + priv->open_time = jiffies; + memcpy_fromio(dev->dev_addr, arlan->lanCardNodeId, 6); + memset(dev->broadcast, 0xff, 6); + priv->txOffset = 0; + dev->tx_queue_len = tx_queue_len; + priv->interrupt_processing_active = 0; + priv->command_lock = 0; + + netif_start_queue (dev); + + init_MUTEX(&priv->card_lock); + myATOMIC_INIT(priv->card_users, 1); /* damn 2.0.33 */ + priv->registrationLostCount = 0; + priv->registrationLastSeen = jiffies; + priv->txLast = 0; + priv->tx_command_given = 0; + priv->rx_command_given = 0; + + priv->reRegisterExp = 1; + priv->nof_tx = 0; + priv->nof_tx_ack = 0; + priv->last_command_was_rx = 0; + priv->tx_last_sent = jiffies - 1; + priv->tx_last_cleared = jiffies; + priv->Conf->writeEEPROM = 0; + priv->Conf->registrationInterrupts = 1; + + init_timer(&priv->timer); + priv->timer.expires = jiffies + HZ / 10; + priv->timer.data = (unsigned long) dev; + priv->timer.function = &arlan_registration_timer; /* timer handler */ + + arlan_command(dev, ARLAN_COMMAND_POWERUP | ARLAN_COMMAND_LONG_WAIT_NOW); + mdelay(200); + add_timer(&priv->timer); + +#ifdef CONFIG_PROC_FS +#ifndef MODULE + if (arlan_device[0]) + init_arlan_proc(); +#endif +#endif + ARLAN_DEBUG_EXIT("arlan_open"); + return 0; +} + + +static void arlan_tx_timeout (struct net_device *dev) +{ + printk(KERN_ERR "%s: arlan transmit timed out, kernel decided\n", dev->name); + /* Try to restart the adaptor. */ + arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET); + // dev->trans_start = jiffies; + // netif_start_queue (dev); +} + + +static int arlan_tx(struct sk_buff *skb, struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + short length; + unsigned char *buf; + + ARLAN_DEBUG_ENTRY("arlan_tx"); + + length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; + buf = skb->data; + + if (priv->txOffset + length + 0x12 > 0x800) { + printk(KERN_ERR "TX RING overflow \n"); + netif_stop_queue (dev); + } + + if (arlan_hw_tx(dev, buf, length) == -1) + goto bad_end; + + dev->trans_start = jiffies; + + dev_kfree_skb(skb); + + arlan_process_interrupt(dev); + priv->tx_chain_active = 0; + ARLAN_DEBUG_EXIT("arlan_tx"); + return 0; + +bad_end: + arlan_process_interrupt(dev); + priv->tx_chain_active = 0; + netif_stop_queue (dev); + ARLAN_DEBUG_EXIT("arlan_tx"); + return 1; +} + + +static inline int DoNotReTransmitCrap(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + if (TXLAST(dev).length < priv->Conf->ReTransmitPacketMaxSize) + return 1; + return 0; + +} + +static inline int DoNotWaitReTransmitCrap(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + if (TXLAST(dev).length < priv->Conf->waitReTransmitPacketMaxSize) + return 1; + return 0; +} + +static inline void arlan_queue_retransmit(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + ARLAN_DEBUG_ENTRY("arlan_queue_retransmit"); + + if (DoNotWaitReTransmitCrap(dev)) + { + arlan_drop_tx(dev); + } else + priv->ReTransmitRequested++; + + ARLAN_DEBUG_EXIT("arlan_queue_retransmit"); +}; + +static inline void RetryOrFail(struct net_device *dev) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + ARLAN_DEBUG_ENTRY("RetryOrFail"); + + if (priv->retransmissions > priv->Conf->retries || + DoNotReTransmitCrap(dev)) + { + arlan_drop_tx(dev); + } + else if (priv->bad <= priv->Conf->fastReTransCount) + { + arlan_retransmit_now(dev); + } + else arlan_queue_retransmit(dev); + + ARLAN_DEBUG_EXIT("RetryOrFail"); +} + + +static void arlan_tx_done_interrupt(struct net_device *dev, int status) +{ + struct arlan_private *priv = ((struct arlan_private *) dev->priv); + + ARLAN_DEBUG_ENTRY("arlan_tx_done_interrupt"); + + priv->tx_last_cleared = jiffies; + priv->tx_command_given = 0; + priv->nof_tx_ack++; + switch (status) + { + case 1: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit OK\n"); + priv->stats.tx_packets++; + priv->bad = 0; + priv->reset = 0; + priv->retransmissions = 0; + if (priv->Conf->tx_delay_ms) + { + priv->tx_done_delayed = jiffies + (priv->Conf->tx_delay_ms * HZ) / 1000 + 1;; + } + else + { + TXLAST(dev).offset = 0; + if (priv->txLast) + priv->txLast = 0; + else if (TXTAIL(dev).offset) + priv->txLast = 1; + if (TXLAST(dev).offset) + { + arlan_retransmit_now(dev); + dev->trans_start = jiffies; + } + if (!TXHEAD(dev).offset || !TXTAIL(dev).offset) + { + priv->txOffset = 0; + netif_wake_queue (dev); + } + } + } + break; + + case 2: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit timed out\n"); + priv->bad += 1; + //arlan_queue_retransmit(dev); + RetryOrFail(dev); + } + break; + + case 3: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit max retries\n"); + priv->bad += 1; + priv->reset = 0; + //arlan_queue_retransmit(dev); + RetryOrFail(dev); + } + break; + + case 4: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit aborted\n"); + priv->bad += 1; + arlan_queue_retransmit(dev); + //RetryOrFail(dev); + } + break; + + case 5: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit not registered\n"); + priv->bad += 1; + //debug=101; + arlan_queue_retransmit(dev); + } + break; + + case 6: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit destination full\n"); + priv->bad += 1; + priv->reset = 0; + //arlan_drop_tx(dev); + arlan_queue_retransmit(dev); + } + break; + + case 7: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit unknown ack\n"); + priv->bad += 1; + priv->reset = 0; + arlan_queue_retransmit(dev); + } + break; + + case 8: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit dest mail box full\n"); + priv->bad += 1; + priv->reset = 0; + //arlan_drop_tx(dev); + arlan_queue_retransmit(dev); + } + break; + + case 9: + { + IFDEBUG(ARLAN_DEBUG_TX_CHAIN) + printk("arlan intr: transmit root dest not reg.\n"); + priv->bad += 1; + priv->reset = 1; + //arlan_drop_tx(dev); + arlan_queue_retransmit(dev); + } + break; + + default: + { + printk(KERN_ERR "arlan intr: transmit status unknown\n"); + priv->bad += 1; + priv->reset = 1; + arlan_drop_tx(dev); + } + } + + ARLAN_DEBUG_EXIT("arlan_tx_done_interrupt"); +} + + +static void arlan_rx_interrupt(struct net_device *dev, u_char rxStatus, u_short rxOffset, u_short pkt_len) +{ + char *skbtmp; + int i = 0; + + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = priv->card; + struct arlan_conf_stru *conf = priv->Conf; + + + ARLAN_DEBUG_ENTRY("arlan_rx_interrupt"); + // by spec, not WRITESHMB(arlan->rxStatus,0x00); + // prohibited here arlan_command(dev, ARLAN_COMMAND_RX); + + if (pkt_len < 10 || pkt_len > 2048) + { + printk(KERN_WARNING "%s: got too short or long packet, len %d \n", dev->name, pkt_len); + return; + } + if (rxOffset + pkt_len > 0x2000) + { + printk("%s: got too long packet, len %d offset %x\n", dev->name, pkt_len, rxOffset); + return; + } + priv->in_bytes += pkt_len; + priv->in_bytes10 += pkt_len; + if (conf->measure_rate < 1) + conf->measure_rate = 1; + if (jiffies - priv->in_time > conf->measure_rate * HZ) + { + conf->in_speed = priv->in_bytes / conf->measure_rate; + priv->in_bytes = 0; + priv->in_time = jiffies; + } + if (jiffies - priv->in_time10 > conf->measure_rate * HZ * 10) + { + conf->in_speed10 = priv->in_bytes10 / (10 * conf->measure_rate); + priv->in_bytes10 = 0; + priv->in_time10 = jiffies; + } + DEBUGSHM(1, "arlan rcv pkt rxStatus= %d ", arlan->rxStatus, u_char); + switch (rxStatus) + { + case 1: + case 2: + case 3: + { + /* Malloc up new buffer. */ + struct sk_buff *skb; + + DEBUGSHM(50, "arlan recv pkt offs=%d\n", arlan->rxOffset, u_short); + DEBUGSHM(1, "arlan rxFrmType = %d \n", arlan->rxFrmType, u_char); + DEBUGSHM(1, KERN_INFO "arlan rx scrambled = %d \n", arlan->scrambled, u_char); + + /* here we do multicast filtering to avoid slow 8-bit memcopy */ +#ifdef ARLAN_MULTICAST + if (!(dev->flags & IFF_ALLMULTI) && + !(dev->flags & IFF_PROMISC) && + dev->mc_list) + { + char hw_dst_addr[6]; + struct dev_mc_list *dmi = dev->mc_list; + int i; + + memcpy_fromio(hw_dst_addr, arlan->ultimateDestAddress, 6); + if (hw_dst_addr[0] == 0x01) + { + if (mdebug) + if (hw_dst_addr[1] == 0x00) + printk(KERN_ERR "%s mcast 0x0100 \n", dev->name); + else if (hw_dst_addr[1] == 0x40) + printk(KERN_ERR "%s m/bcast 0x0140 \n", dev->name); + while (dmi) + { if (dmi->dmi_addrlen == 6) + { + if (arlan_debug & ARLAN_DEBUG_HEADER_DUMP) + printk(KERN_ERR "%s mcl %2x:%2x:%2x:%2x:%2x:%2x \n", dev->name, + dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2], + dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]); + for (i = 0; i < 6; i++) + if (dmi->dmi_addr[i] != hw_dst_addr[i]) + break; + if (i == 6) + break; + } + else + printk(KERN_ERR "%s: invalid multicast address length given.\n", dev->name); + dmi = dmi->next; + } + /* we reach here if multicast filtering is on and packet + * is multicast and not for receive */ + goto end_of_interrupt; + } + } +#endif // ARLAN_MULTICAST + /* multicast filtering ends here */ + pkt_len += ARLAN_FAKE_HDR_LEN; + + skb = dev_alloc_skb(pkt_len + 4); + if (skb == NULL) + { + printk(KERN_ERR "%s: Memory squeeze, dropping packet.\n", dev->name); + priv->stats.rx_dropped++; + break; + } + skb_reserve(skb, 2); + skb->dev = dev; + skbtmp = skb_put(skb, pkt_len); + + memcpy_fromio(skbtmp + ARLAN_FAKE_HDR_LEN, ((char *) arlan) + rxOffset, pkt_len - ARLAN_FAKE_HDR_LEN); + memcpy_fromio(skbtmp, arlan->ultimateDestAddress, 6); + memcpy_fromio(skbtmp + 6, arlan->rxSrc, 6); + WRITESHMB(arlan->rxStatus, 0x00); + arlan_command(dev, ARLAN_COMMAND_RX); + + IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) + { + char immedDestAddress[6]; + char immedSrcAddress[6]; + memcpy_fromio(immedDestAddress, arlan->immedDestAddress, 6); + memcpy_fromio(immedSrcAddress, arlan->immedSrcAddress, 6); + + printk(KERN_WARNING "%s t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x imd %2x:%2x:%2x:%2x:%2x:%2x ims %2x:%2x:%2x:%2x:%2x:%2x\n", dev->name, + (unsigned char) skbtmp[0], (unsigned char) skbtmp[1], (unsigned char) skbtmp[2], (unsigned char) skbtmp[3], + (unsigned char) skbtmp[4], (unsigned char) skbtmp[5], (unsigned char) skbtmp[6], (unsigned char) skbtmp[7], + (unsigned char) skbtmp[8], (unsigned char) skbtmp[9], (unsigned char) skbtmp[10], (unsigned char) skbtmp[11], + immedDestAddress[0], immedDestAddress[1], immedDestAddress[2], + immedDestAddress[3], immedDestAddress[4], immedDestAddress[5], + immedSrcAddress[0], immedSrcAddress[1], immedSrcAddress[2], + immedSrcAddress[3], immedSrcAddress[4], immedSrcAddress[5]); + } + skb->protocol = eth_type_trans(skb, dev); + IFDEBUG(ARLAN_DEBUG_HEADER_DUMP) + if (skb->protocol != 0x608 && skb->protocol != 0x8) + { + for (i = 0; i <= 22; i++) + printk("%02x:", (u_char) skbtmp[i + 12]); + printk(KERN_ERR "\n"); + printk(KERN_WARNING "arlan kernel pkt type trans %x \n", skb->protocol); + } + netif_rx(skb); + dev->last_rx = jiffies; + priv->stats.rx_packets++; + priv->stats.rx_bytes += pkt_len; + } + break; + + default: + printk(KERN_ERR "arlan intr: received unknown status\n"); + priv->stats.rx_crc_errors++; + break; + } + ARLAN_DEBUG_EXIT("arlan_rx_interrupt"); +} + +static void arlan_process_interrupt(struct net_device *dev) +{ + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = priv->card; + u_char rxStatus = READSHMB(arlan->rxStatus); + u_char txStatus = READSHMB(arlan->txStatus); + u_short rxOffset = READSHMS(arlan->rxOffset); + u_short pkt_len = READSHMS(arlan->rxLength); + int interrupt_count = 0; + + ARLAN_DEBUG_ENTRY("arlan_process_interrupt"); + + if (test_and_set_bit(0, (void *) &priv->interrupt_processing_active)) + { + if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS) + printk(KERN_ERR "interrupt chain reentering \n"); + goto end_int_process; + } + while ((rxStatus || txStatus || priv->interrupt_ack_requested) + && (interrupt_count < 5)) + { + if (rxStatus) + priv->last_rx_int_ack_time = arlan_time(); + + arlan_command(dev, ARLAN_COMMAND_INT_ACK); + arlan_command(dev, ARLAN_COMMAND_INT_ENABLE); + + IFDEBUG(ARLAN_DEBUG_INTERRUPT) + printk(KERN_ERR "%s: got IRQ rx %x tx %x comm %x rxOff %x rxLen %x \n", + dev->name, rxStatus, txStatus, READSHMB(arlan->commandByte), + rxOffset, pkt_len); + + if (rxStatus == 0 && txStatus == 0) + { + priv->last_command_was_rx = 0; + if (priv->irq_test_done) + { + if (!registrationBad(dev)) + IFDEBUG(ARLAN_DEBUG_INTERRUPT) printk(KERN_ERR "%s unknown interrupt(nop? regLost ?) reason tx %d rx %d ", + dev->name, txStatus, rxStatus); + } else { + IFDEBUG(ARLAN_DEBUG_INTERRUPT) + printk(KERN_INFO "%s irq $%d test OK \n", dev->name, dev->irq); + + } + priv->interrupt_ack_requested = 0; + goto ends; + } + if (txStatus != 0) + { + WRITESHMB(arlan->txStatus, 0x00); + arlan_tx_done_interrupt(dev, txStatus); + goto ends; + } + if (rxStatus == 1 || rxStatus == 2) + { /* a packet waiting */ + arlan_rx_interrupt(dev, rxStatus, rxOffset, pkt_len); + goto ends; + } + if (rxStatus > 2 && rxStatus < 0xff) + { + priv->last_command_was_rx = 0; + WRITESHMB(arlan->rxStatus, 0x00); + printk(KERN_ERR "%s unknown rxStatus reason tx %d rx %d ", + dev->name, txStatus, rxStatus); + goto ends; + } + if (rxStatus == 0xff) + { + priv->last_command_was_rx = 0; + WRITESHMB(arlan->rxStatus, 0x00); + arlan_command(dev, ARLAN_COMMAND_RX); + if (registrationBad(dev)) + netif_device_detach(dev); + if (!registrationBad(dev)) + { + priv->registrationLastSeen = jiffies; + if (!netif_queue_stopped(dev) && !priv->under_reset && !priv->under_config) + netif_wake_queue (dev); + } + goto ends; + } +ends: + + arlan_command_process(dev); + + rxStatus = READSHMB(arlan->rxStatus); + txStatus = READSHMB(arlan->txStatus); + rxOffset = READSHMS(arlan->rxOffset); + pkt_len = READSHMS(arlan->rxLength); + + + priv->irq_test_done = 1; + + interrupt_count++; + } + priv->interrupt_processing_active = 0; + +end_int_process: + arlan_command_process(dev); + + ARLAN_DEBUG_EXIT("arlan_process_interrupt"); + return; +} + +static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev = dev_id; + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = priv->card; + u_char rxStatus = READSHMB(arlan->rxStatus); + u_char txStatus = READSHMB(arlan->txStatus); + + ARLAN_DEBUG_ENTRY("arlan_interrupt"); + + + if (!rxStatus && !txStatus) + priv->interrupt_ack_requested++; + + arlan_process_interrupt(dev); + + priv->irq_test_done = 1; + + ARLAN_DEBUG_EXIT("arlan_interrupt"); + return; + +} + + +static int arlan_close(struct net_device *dev) +{ + struct arlan_private *priv = (struct arlan_private *) dev->priv; + + if (!dev) + { + printk(KERN_CRIT "arlan: No Device\n"); + return 0; + } + priv = (struct arlan_private *) dev->priv; + if (!priv) + { + printk(KERN_CRIT "arlan: No Device priv \n"); + return 0; + } + ARLAN_DEBUG_ENTRY("arlan_close"); + + del_timer(&priv->timer); + + arlan_command(dev, ARLAN_COMMAND_POWERDOWN); + + IFDEBUG(ARLAN_DEBUG_STARTUP) + printk(KERN_NOTICE "%s: Closing device\n", dev->name); + + priv->open_time = 0; + netif_stop_queue(dev); + free_irq(dev->irq, dev); + + ARLAN_DEBUG_EXIT("arlan_close"); + return 0; +} + +#ifdef ARLAN_DEBUGGING +static long alignLong(volatile u_char * ptr) +{ + long ret; + memcpy_fromio(&ret, (void *) ptr, 4); + return ret; +} +#endif + +/* + * Get the current statistics. + * This may be called with the card open or closed. + */ + +static struct net_device_stats *arlan_statistics(struct net_device *dev) +{ + struct arlan_private *priv = (struct arlan_private *) dev->priv; + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + + + ARLAN_DEBUG_ENTRY("arlan_statistics"); + + /* Update the statistics from the device registers. */ + + READSHM(priv->stats.collisions, arlan->numReTransmissions, u_int); + READSHM(priv->stats.rx_crc_errors, arlan->numCRCErrors, u_int); + READSHM(priv->stats.rx_dropped, arlan->numFramesDiscarded, u_int); + READSHM(priv->stats.rx_fifo_errors, arlan->numRXBufferOverflows, u_int); + READSHM(priv->stats.rx_frame_errors, arlan->numReceiveFramesLost, u_int); + READSHM(priv->stats.rx_over_errors, arlan->numRXOverruns, u_int); + READSHM(priv->stats.rx_packets, arlan->numDatagramsReceived, u_int); + READSHM(priv->stats.tx_aborted_errors, arlan->numAbortErrors, u_int); + READSHM(priv->stats.tx_carrier_errors, arlan->numStatusTimeouts, u_int); + READSHM(priv->stats.tx_dropped, arlan->numDatagramsDiscarded, u_int); + READSHM(priv->stats.tx_fifo_errors, arlan->numTXUnderruns, u_int); + READSHM(priv->stats.tx_packets, arlan->numDatagramsTransmitted, u_int); + READSHM(priv->stats.tx_window_errors, arlan->numHoldOffs, u_int); + + ARLAN_DEBUG_EXIT("arlan_statistics"); + + return &priv->stats; +} + + +static void arlan_set_multicast(struct net_device *dev) +{ + volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; + struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf; + int board_conf_needed = 0; + + + ARLAN_DEBUG_ENTRY("arlan_set_multicast"); + + if (dev->flags & IFF_PROMISC) + { + unsigned char recMode; + READSHM(recMode, arlan->receiveMode, u_char); + conf->receiveMode = (ARLAN_RCV_PROMISC | ARLAN_RCV_CONTROL); + if (conf->receiveMode != recMode) + board_conf_needed = 1; + } + else + { + /* turn off promiscuous mode */ + unsigned char recMode; + READSHM(recMode, arlan->receiveMode, u_char); + conf->receiveMode = ARLAN_RCV_CLEAN | ARLAN_RCV_CONTROL; + if (conf->receiveMode != recMode) + board_conf_needed = 1; + } + if (board_conf_needed) + arlan_command(dev, ARLAN_COMMAND_CONF); + + ARLAN_DEBUG_EXIT("arlan_set_multicast"); +} + + +int __init arlan_probe(struct net_device *dev) +{ + printk("Arlan driver %s\n", arlan_version); + + if (arlan_probe_everywhere(dev)) + return -ENODEV; + + arlans_found++; + + if (arlans_found == 1) + siteName = kmalloc(100, GFP_KERNEL); + return 0; +} + +#ifdef MODULE + +static int __init arlan_find_devices(void) +{ + int m; + int found = 0; + + ARLAN_DEBUG_ENTRY("arlan_find_devices"); + if (mem != 0 && numDevices == 1) /* Check a single specified location. */ + return 1; + for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000) + { + if (arlan_check_fingerprint(m) == 0) + found++; + } + ARLAN_DEBUG_EXIT("arlan_find_devices"); + + return found; +} + +int init_module(void) +{ + int i = 0; + + ARLAN_DEBUG_ENTRY("init_module"); + + if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN) + return -EINVAL; + + numDevices = arlan_find_devices(); + if (numDevices == 0) + return -ENODEV; + + siteName = kmalloc(100, GFP_KERNEL); + if(siteName==NULL) + return -ENOMEM; + + for (i = 0; i < numDevices && i < MAX_ARLANS; i++) + { + if (!arlan_allocate_device(i, NULL)) + return -ENOMEM; + + if (arlan_device[i] == NULL) + return -ENOMEM; + + if (probe) + arlan_probe_everywhere(arlan_device[i]); +// arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); + } + printk(KERN_INFO "Arlan driver %s\n", arlan_version); + ARLAN_DEBUG_EXIT("init_module"); + return 0; +} + + +void cleanup_module(void) +{ + int i = 0; + struct arlan_private *ap; + + ARLAN_DEBUG_ENTRY("cleanup_module"); + + IFDEBUG(ARLAN_DEBUG_SHUTDOWN) + printk(KERN_INFO "arlan: unloading module\n"); + for (i = 0; i < MAX_ARLANS; i++) + { + if (arlan_device[i]) + { + arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN ); + +// release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 ); + unregister_netdev(arlan_device[i]); + ap = arlan_device[i]->priv; + if (ap->init_etherdev_alloc) { + kfree(arlan_device[i]); + arlan_device[i] = NULL; + } else { + kfree(ap); + ap = NULL; + } + } + } + ARLAN_DEBUG_EXIT("cleanup_module"); +} + + +#endif +MODULE_LICENSE("GPL"); diff -Nru a/drivers/net/wireless/arlan.h b/drivers/net/wireless/arlan.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/arlan.h Thu Feb 20 23:19:22 2003 @@ -0,0 +1,577 @@ +/* + * Copyright (C) 1997 Cullen Jennings + * Copyright (C) 1998 Elmer.Joandi@ut.ee, +37-255-13500 + * GNU General Public License applies + */ +#include + +#include +#include +#include +#include +#include +#include /* For the statistics structure. */ +#include /* For ARPHRD_ETHER */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +//#define ARLAN_DEBUGGING 1 + +#define ARLAN_PROC_INTERFACE +#define MAX_ARLANS 4 /* not more than 4 ! */ +#define ARLAN_PROC_SHM_DUMP /* shows all card registers, makes driver way larger */ + +#define ARLAN_MAX_MULTICAST_ADDRS 16 +#define ARLAN_RCV_CLEAN 0 +#define ARLAN_RCV_PROMISC 1 +#define ARLAN_RCV_CONTROL 2 + + +#ifdef CONFIG_PROC_FS +extern int init_arlan_proc(void); +#endif + +extern struct net_device *arlan_device[MAX_ARLANS]; +extern int arlan_debug; +extern char * siteName; +extern int arlan_entry_debug; +extern int arlan_exit_debug; +extern int testMemory; +extern const char* arlan_version; +extern int arlan_command(struct net_device * dev, int command); + +#define SIDUNKNOWN -1 +#define radioNodeIdUNKNOWN -1 +#define encryptionKeyUNKNOWN '\0'; +#define irqUNKNOWN 0 +#define memUNKNOWN 0 +#define debugUNKNOWN 0 +#define probeUNKNOWN 1 +#define numDevicesUNKNOWN 1 +#define testMemoryUNKNOWN 1 +#define spreadingCodeUNKNOWN 0 +#define channelNumberUNKNOWN 0 +#define channelSetUNKNOWN 0 +#define systemIdUNKNOWN -1 +#define registrationModeUNKNOWN -1 +#define siteNameUNKNOWN "LinuxSite" + + + +#define IFDEBUG( L ) if ( (L) & arlan_debug ) +#define ARLAN_FAKE_HDR_LEN 12 + +#ifdef ARLAN_DEBUGGING + #define DEBUG 1 + #define ARLAN_ENTRY_EXIT_DEBUGGING 1 + #define ARLAN_DEBUG(a,b) printk(KERN_DEBUG a, b) +#else + #define ARLAN_DEBUG(a,b) +#endif + +struct arlan_shmem +{ + /* Header Signature */ + volatile char textRegion[48]; + volatile u_char resetFlag; + volatile u_char diagnosticInfo; + volatile u_short diagnosticOffset; + volatile u_char _1[12]; + volatile u_char lanCardNodeId[6]; + volatile u_char broadcastAddress[6]; + volatile u_char hardwareType; + volatile u_char majorHardwareVersion; + volatile u_char minorHardwareVersion; + volatile u_char radioModule;// shows EEPROM, can be overridden at 0x111 + volatile u_char defaultChannelSet; // shows EEProm, can be overriiden at 0x10A + volatile u_char _2[47]; + + /* Control/Status Block - 0x0080 */ + volatile u_char interruptInProgress; /* not used by lancpu */ + volatile u_char cntrlRegImage; /* not used by lancpu */ + volatile u_char _3[13]; + volatile u_char dumpByte; + volatile u_char commandByte; /* non-zero = active */ + volatile u_char commandParameter[15]; + + /* Receive Status - 0x00a0 */ + volatile u_char rxStatus; /* 1- data, 2-control, 0xff - registr change */ + volatile u_char rxFrmType; + volatile u_short rxOffset; + volatile u_short rxLength; + volatile u_char rxSrc[6]; + volatile u_char rxBroadcastFlag; + volatile u_char rxQuality; + volatile u_char scrambled; + volatile u_char _4[1]; + + /* Transmit Status - 0x00b0 */ + volatile u_char txStatus; + volatile u_char txAckQuality; + volatile u_char numRetries; + volatile u_char _5[14]; + volatile u_char registeredRouter[6]; + volatile u_char backboneRouter[6]; + volatile u_char registrationStatus; + volatile u_char configuredStatusFlag; + volatile u_char _6[1]; + volatile u_char ultimateDestAddress[6]; + volatile u_char immedDestAddress[6]; + volatile u_char immedSrcAddress[6]; + volatile u_short rxSequenceNumber; + volatile u_char assignedLocaltalkAddress; + volatile u_char _7[27]; + + /* System Parameter Block */ + + /* - Driver Parameters (Novell Specific) */ + + volatile u_short txTimeout; + volatile u_short transportTime; + volatile u_char _8[4]; + + /* - Configuration Parameters */ + volatile u_char irqLevel; + volatile u_char spreadingCode; + volatile u_char channelSet; + volatile u_char channelNumber; + volatile u_short radioNodeId; + volatile u_char _9[2]; + volatile u_char scramblingDisable; + volatile u_char radioType; + volatile u_short routerId; + volatile u_char _10[9]; + volatile u_char txAttenuation; + volatile u_char systemId[4]; + volatile u_short globalChecksum; + volatile u_char _11[4]; + volatile u_short maxDatagramSize; + volatile u_short maxFrameSize; + volatile u_char maxRetries; + volatile u_char receiveMode; + volatile u_char priority; + volatile u_char rootOrRepeater; + volatile u_char specifiedRouter[6]; + volatile u_short fastPollPeriod; + volatile u_char pollDecay; + volatile u_char fastPollDelay[2]; + volatile u_char arlThreshold; + volatile u_char arlDecay; + volatile u_char _12[1]; + volatile u_short specRouterTimeout; + volatile u_char _13[5]; + + /* Scrambled Area */ + volatile u_char SID[4]; + volatile u_char encryptionKey[12]; + volatile u_char _14[2]; + volatile u_char waitTime[2]; + volatile u_char lParameter[2]; + volatile u_char _15[3]; + volatile u_short headerSize; + volatile u_short sectionChecksum; + + volatile u_char registrationMode; + volatile u_char registrationFill; + volatile u_short pollPeriod; + volatile u_short refreshPeriod; + volatile u_char name[16]; + volatile u_char NID[6]; + volatile u_char localTalkAddress; + volatile u_char codeFormat; + volatile u_char numChannels; + volatile u_char channel1; + volatile u_char channel2; + volatile u_char channel3; + volatile u_char channel4; + volatile u_char SSCode[59]; + + volatile u_char _16[0xC0]; + volatile u_short auxCmd; + volatile u_char dumpPtr[4]; + volatile u_char dumpVal; + volatile u_char _17[0x6A]; + volatile u_char wireTest; + volatile u_char _18[14]; + + /* Statistics Block - 0x0300 */ + volatile u_char hostcpuLock; + volatile u_char lancpuLock; + volatile u_char resetTime[18]; + + volatile u_char numDatagramsTransmitted[4]; + volatile u_char numReTransmissions[4]; + volatile u_char numFramesDiscarded[4]; + volatile u_char numDatagramsReceived[4]; + volatile u_char numDuplicateReceivedFrames[4]; + volatile u_char numDatagramsDiscarded[4]; + + volatile u_short maxNumReTransmitDatagram; + volatile u_short maxNumReTransmitFrames; + volatile u_short maxNumConsecutiveDuplicateFrames; + /* misaligned here so we have to go to characters */ + + volatile u_char numBytesTransmitted[4]; + volatile u_char numBytesReceived[4]; + volatile u_char numCRCErrors[4]; + volatile u_char numLengthErrors[4]; + volatile u_char numAbortErrors[4]; + volatile u_char numTXUnderruns[4]; + volatile u_char numRXOverruns[4]; + volatile u_char numHoldOffs[4]; + volatile u_char numFramesTransmitted[4]; + volatile u_char numFramesReceived[4]; + volatile u_char numReceiveFramesLost[4]; + volatile u_char numRXBufferOverflows[4]; + volatile u_char numFramesDiscardedAddrMismatch[4]; + volatile u_char numFramesDiscardedSIDMismatch[4]; + volatile u_char numPollsTransmistted[4]; + volatile u_char numPollAcknowledges[4]; + volatile u_char numStatusTimeouts[4]; + volatile u_char numNACKReceived[4]; + + volatile u_char _19[0x86]; + + volatile u_char txBuffer[0x800]; + volatile u_char rxBuffer[0x800]; + + volatile u_char _20[0x800]; + volatile u_char _21[0x3fb]; + volatile u_char configStatus; + volatile u_char _22; + volatile u_char progIOCtrl; + volatile u_char shareMBase; + volatile u_char controlRegister; +}; + +struct arlan_conf_stru { + int spreadingCode; + int channelSet; + int channelNumber; + int scramblingDisable; + int txAttenuation; + int systemId; + int maxDatagramSize; + int maxFrameSize; + int maxRetries; + int receiveMode; + int priority; + int rootOrRepeater; + int SID; + int radioNodeId; + int registrationMode; + int registrationFill; + int localTalkAddress; + int codeFormat; + int numChannels; + int channel1; + int channel2; + int channel3; + int channel4; + int txClear; + int txRetries; + int txRouting; + int txScrambled; + int rxParameter; + int txTimeoutMs; + int txAckTimeoutMs; + int waitCardTimeout; + int waitTime; + int lParameter; + int _15; + int headerSize; + int async; + int retries; + int tx_delay_ms; + int waitReTransmitPacketMaxSize; + int ReTransmitPacketMaxSize; + int fastReTransCount; + int driverRetransmissions; + int registrationInterrupts; + int hardwareType; + int radioType; + int writeRadioType; + int writeEEPROM; + char siteName[17]; + int measure_rate; + int in_speed; + int out_speed; + int in_speed10; + int out_speed10; + int in_speed_max; + int out_speed_max; + int pre_Command_Wait; + int rx_tweak1; + int rx_tweak2; + int tx_queue_len; +}; + +extern struct arlan_conf_stru arlan_conf[MAX_ARLANS]; + +struct TxParam +{ + volatile short offset; + volatile short length; + volatile u_char dest[6]; + volatile unsigned char clear; + volatile unsigned char retries; + volatile unsigned char routing; + volatile unsigned char scrambled; +}; + +struct TxRingPoint { + struct TxParam txParam; + + +}; + +#define TX_RING_SIZE 2 +/* Information that need to be kept for each board. */ +struct arlan_private { + struct net_device_stats stats; + long open_time; /* Useless example local info. */ + struct arlan_shmem * card; + struct arlan_shmem * conf; + struct TxParam txParam; + int multicastLength; + char multicastList[ARLAN_MAX_MULTICAST_ADDRS][6]; + int promiscModeEnabled; + struct arlan_conf_stru * Conf; + int bad; + int reset; + long long lastReset; + struct timer_list timer; + struct timer_list tx_delay_timer; + struct timer_list tx_retry_timer; + struct timer_list rx_check_timer; + struct semaphore card_lock; + atomic_t card_users; + atomic_t delay_on; + atomic_t retr_on; + int registrationLostCount; + int reRegisterExp; + int nof_tx; + int nof_tx_ack; + int last_nof_tx; + int last_nof_tx_ack; + int irq_test_done; + int last_command_was_rx; + struct TxParam txRing[TX_RING_SIZE]; + char reTransmitBuff[0x800]; + volatile int txLast; + volatile int txNew; + volatile int txOffset; + volatile char ReTransmitRequested; + volatile long long tx_done_delayed; + volatile long long registrationLastSeen; + volatile char under_command; + volatile char under_toggle; + volatile long long tx_last_sent; + volatile long long tx_last_cleared; + volatile u_char under_tx; + volatile int retransmissions; + volatile int tx_chain_active; + volatile int timer_chain_active; + volatile int interrupt_ack_requested; + volatile long command_lock; + volatile int rx_command_needed; + volatile int tx_command_needed; + volatile int waiting_command_mask; + volatile int card_polling_interval; + volatile int last_command_buff_free_time; + volatile int numResets; + volatile int under_reset; + volatile int under_config; + volatile int rx_command_given; + volatile long tx_command_given; + volatile long interrupt_processing_active; + volatile long long last_tx_time; + volatile long long last_rx_time; + volatile long long last_rx_int_ack_time; + int in_bytes; + int out_bytes; + int in_time; + int out_time; + int in_time10; + int out_time10; + int in_bytes10; + int out_bytes10; + int init_etherdev_alloc; +}; + + + +#define ARLAN_CLEAR 0x00 +#define ARLAN_RESET 0x01 +#define ARLAN_CHANNEL_ATTENTION 0x02 +#define ARLAN_INTERRUPT_ENABLE 0x04 +#define ARLAN_CLEAR_INTERRUPT 0x08 +#define ARLAN_POWER 0x40 +#define ARLAN_ACCESS 0x80 + +#define ARLAN_COM_CONF 0x01 +#define ARLAN_COM_RX_ENABLE 0x03 +#define ARLAN_COM_RX_ABORT 0x04 +#define ARLAN_COM_TX_ENABLE 0x05 +#define ARLAN_COM_TX_ABORT 0x06 +#define ARLAN_COM_NOP 0x07 +#define ARLAN_COM_STANDBY 0x08 +#define ARLAN_COM_ACTIVATE 0x09 +#define ARLAN_COM_GOTO_SLOW_POLL 0x0a +#define ARLAN_COM_INT 0x80 + + +#define TXLAST(dev) (((struct arlan_private *)dev->priv)->txRing[((struct arlan_private *)dev->priv)->txLast]) +#define TXHEAD(dev) (((struct arlan_private *)dev->priv)->txRing[0]) +#define TXTAIL(dev) (((struct arlan_private *)dev->priv)->txRing[1]) + +#define TXBuffStart(dev) \ + ((int)(((struct arlan_private *)dev->priv)->card)->txBuffer) - ((int)(((struct arlan_private *)dev->priv)->card) ) +#define TXBuffEnd(dev) \ + ((int)(((struct arlan_private *)dev->priv)->card)->rxBuffer) - ((int)(((struct arlan_private *)dev->priv)->card) + +#define READSHM(to,from,atype) {\ + atype tmp;\ + memcpy_fromio(&(tmp),&(from),sizeof(atype));\ + to = tmp;\ + } + +#define READSHMEM(from,atype)\ + atype from; \ + READSHM(from, arlan->from, atype); + +#define WRITESHM(to,from,atype) \ + { atype tmpSHM = from;\ + memcpy_toio(&(to),&tmpSHM,sizeof(atype));\ + } + +#define DEBUGSHM(levelSHM,stringSHM,stuff,atype) \ + { atype tmpSHM; \ + memcpy_fromio(&tmpSHM,&(stuff),sizeof(atype));\ + IFDEBUG(levelSHM) printk(stringSHM,tmpSHM);\ + } + +#define WRITESHMB(to, val) \ + writeb(val,&(to)) +#define READSHMB(to) \ + readb(&(to)) +#define WRITESHMS(to, val) \ + writew(val,&(to)) +#define READSHMS(to) \ + readw(&(to)) +#define WRITESHMI(to, val) \ + writel(val,&(to)) +#define READSHMI(to) \ + readl(&(to)) + + + + + +#define registrationBad(dev)\ + ( ( READSHMB(((struct arlan_private *)dev->priv)->card->registrationMode) > 0) && \ + ( READSHMB(((struct arlan_private *)dev->priv)->card->registrationStatus) == 0) ) + + +#define readControlRegister(dev)\ + READSHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage) + +#define writeControlRegister(dev, v){\ + WRITESHMB(((struct arlan_private *)dev->priv)->card->cntrlRegImage ,((v) &0xF) );\ + WRITESHMB(((struct arlan_private *)dev->priv)->card->controlRegister ,(v) );} + + +#define arlan_interrupt_lancpu(dev) {\ + int cr; \ + \ + priv->under_toggle++; \ + cr = readControlRegister(dev);\ + if (cr & ARLAN_CHANNEL_ATTENTION){ \ + writeControlRegister(dev, (cr & ~ARLAN_CHANNEL_ATTENTION));\ + }else \ + writeControlRegister(dev, (cr | ARLAN_CHANNEL_ATTENTION));\ + priv->under_toggle=0; \ +} + +#define clearChannelAttention(dev){ \ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CHANNEL_ATTENTION);} +#define setHardwareReset(dev) {\ + writeControlRegister(dev,readControlRegister(dev) | ARLAN_RESET);} +#define clearHardwareReset(dev) {\ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_RESET);} +#define setInterruptEnable(dev){\ + writeControlRegister(dev,readControlRegister(dev) | ARLAN_INTERRUPT_ENABLE) ;} +#define clearInterruptEnable(dev){\ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_INTERRUPT_ENABLE) ;} +#define setClearInterrupt(dev){\ + writeControlRegister(dev,readControlRegister(dev) | ARLAN_CLEAR_INTERRUPT) ;} +#define clearClearInterrupt(dev){\ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_CLEAR_INTERRUPT);} +#define setPowerOff(dev){\ + writeControlRegister(dev,readControlRegister(dev) | (ARLAN_POWER && ARLAN_ACCESS));\ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);} +#define setPowerOn(dev){\ + writeControlRegister(dev,readControlRegister(dev) & ~(ARLAN_POWER)); } +#define arlan_lock_card_access(dev){\ + writeControlRegister(dev,readControlRegister(dev) & ~ARLAN_ACCESS);} +#define arlan_unlock_card_access(dev){\ + writeControlRegister(dev,readControlRegister(dev) | ARLAN_ACCESS ); } + + + + +#define ARLAN_COMMAND_RX 0x000001 +#define ARLAN_COMMAND_NOOP 0x000002 +#define ARLAN_COMMAND_NOOPINT 0x000004 +#define ARLAN_COMMAND_TX 0x000008 +#define ARLAN_COMMAND_CONF 0x000010 +#define ARLAN_COMMAND_RESET 0x000020 +#define ARLAN_COMMAND_TX_ABORT 0x000040 +#define ARLAN_COMMAND_RX_ABORT 0x000080 +#define ARLAN_COMMAND_POWERDOWN 0x000100 +#define ARLAN_COMMAND_POWERUP 0x000200 +#define ARLAN_COMMAND_SLOW_POLL 0x000400 +#define ARLAN_COMMAND_ACTIVATE 0x000800 +#define ARLAN_COMMAND_INT_ACK 0x001000 +#define ARLAN_COMMAND_INT_ENABLE 0x002000 +#define ARLAN_COMMAND_WAIT_NOW 0x004000 +#define ARLAN_COMMAND_LONG_WAIT_NOW 0x008000 +#define ARLAN_COMMAND_STANDBY 0x010000 +#define ARLAN_COMMAND_INT_RACK 0x020000 +#define ARLAN_COMMAND_INT_RENABLE 0x040000 +#define ARLAN_COMMAND_CONF_WAIT 0x080000 +#define ARLAN_COMMAND_TBUSY_CLEAR 0x100000 +#define ARLAN_COMMAND_CLEAN_AND_CONF (ARLAN_COMMAND_TX_ABORT\ + | ARLAN_COMMAND_RX_ABORT\ + | ARLAN_COMMAND_CONF) +#define ARLAN_COMMAND_CLEAN_AND_RESET (ARLAN_COMMAND_TX_ABORT\ + | ARLAN_COMMAND_RX_ABORT\ + | ARLAN_COMMAND_RESET) + + + +#define ARLAN_DEBUG_CHAIN_LOCKS 0x00001 +#define ARLAN_DEBUG_RESET 0x00002 +#define ARLAN_DEBUG_TIMING 0x00004 +#define ARLAN_DEBUG_CARD_STATE 0x00008 +#define ARLAN_DEBUG_TX_CHAIN 0x00010 +#define ARLAN_DEBUG_MULTICAST 0x00020 +#define ARLAN_DEBUG_HEADER_DUMP 0x00040 +#define ARLAN_DEBUG_INTERRUPT 0x00080 +#define ARLAN_DEBUG_STARTUP 0x00100 +#define ARLAN_DEBUG_SHUTDOWN 0x00200 + diff -Nru a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c --- a/drivers/net/wireless/orinoco.c Thu Feb 20 23:19:24 2003 +++ b/drivers/net/wireless/orinoco.c Thu Feb 20 23:19:24 2003 @@ -289,7 +289,7 @@ * which are used as the dev->open, dev->stop, priv->reset * callbacks if none are specified when alloc_orinocodev() is * called. - * o Removed orinoco_plx_interupt() and orinoco_pci_interrupt(). + * o Removed orinoco_plx_interrupt() and orinoco_pci_interrupt(). * They didn't do anything. * * v0.12 -> v0.12a - 4 Jul 2002 - David Gibson diff -Nru a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/ray_cs.c Thu Feb 20 23:19:21 2003 @@ -0,0 +1,3012 @@ +/*============================================================================= + * + * A PCMCIA client driver for the Raylink wireless LAN card. + * The starting point for this module was the skeleton.c in the + * PCMCIA 2.9.12 package written by David Hinds, dahinds@users.sourceforge.net + * + * + * Copyright (c) 1998 Corey Thomas (corey@world.std.com) + * + * This driver is free software; you can redistribute it and/or modify + * it under the terms of version 2 only of the GNU General Public License as + * published by the Free Software Foundation. + * + * It 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 + * + * Changes: + * Arnaldo Carvalho de Melo - 08/08/2000 + * - reorganize kmallocs in ray_attach, checking all for failure + * and releasing the previous allocations if one fails + * + * +=============================================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_NET_PCMCIA_RADIO +#include + +#include +#include +#include +#include + +/* Warning : these stuff will slow down the driver... */ +#define WIRELESS_SPY /* Enable spying addresses */ +/* Definitions we need for spy */ +typedef struct iw_statistics iw_stats; +typedef struct iw_quality iw_qual; +typedef u_char mac_addr[ETH_ALEN]; /* Hardware address */ +#endif /* CONFIG_NET_PCMCIA_RADIO */ + +#include "rayctl.h" +#include "ray_cs.h" + +/* All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If + you do not define PCMCIA_DEBUG at all, all the debug code will be + left out. If you compile with PCMCIA_DEBUG=0, the debug code will + be present but disabled -- but it can then be enabled for specific + modules at load time with a 'pc_debug=#' option to insmod. +*/ + +#ifdef RAYLINK_DEBUG +#define PCMCIA_DEBUG RAYLINK_DEBUG +#endif +#ifdef PCMCIA_DEBUG +static int ray_debug; +static int pc_debug = PCMCIA_DEBUG; +MODULE_PARM(pc_debug, "i"); +/* #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args); */ +#define DEBUG(n, args...) if (pc_debug>(n)) printk(args); +#else +#define DEBUG(n, args...) +#endif +/** Prototypes based on PCMCIA skeleton driver *******************************/ +static void ray_config(dev_link_t *link); +static void ray_release(u_long arg); +static int ray_event(event_t event, int priority, event_callback_args_t *args); +static dev_link_t *ray_attach(void); +static void ray_detach(dev_link_t *); + +/***** Prototypes indicated by device structure ******************************/ +static int ray_dev_close(struct net_device *dev); +static int ray_dev_config(struct net_device *dev, struct ifmap *map); +static struct net_device_stats *ray_get_stats(struct net_device *dev); +static int ray_dev_init(struct net_device *dev); +static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); +static int ray_open(struct net_device *dev); +static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev); +static void set_multicast_list(struct net_device *dev); +static void ray_update_multi_list(struct net_device *dev, int all); +static int translate_frame(ray_dev_t *local, struct tx_msg *ptx, + unsigned char *data, int len); +static void ray_build_header(ray_dev_t *local, struct tx_msg *ptx, UCHAR msg_type, + unsigned char *data); +static void untranslate(ray_dev_t *local, struct sk_buff *skb, int len); +#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ +static iw_stats * ray_get_wireless_stats(struct net_device * dev); +#endif /* WIRELESS_EXT > 7 */ + +/***** Prototypes for raylink functions **************************************/ +static int asc_to_int(char a); +static void authenticate(ray_dev_t *local); +static int build_auth_frame(ray_dev_t *local, UCHAR *dest, int auth_type); +static void authenticate_timeout(u_long); +static int get_free_ccs(ray_dev_t *local); +static int get_free_tx_ccs(ray_dev_t *local); +static void init_startup_params(ray_dev_t *local); +static int parse_addr(char *in_str, UCHAR *out); +static int ray_hw_xmit(unsigned char* data, int len, struct net_device* dev, UCHAR type); +static int ray_init(struct net_device *dev); +static int interrupt_ecf(ray_dev_t *local, int ccs); +static void ray_reset(struct net_device *dev); +static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len); +static void verify_dl_startup(u_long); + +/* Prototypes for interrpt time functions **********************************/ +static void ray_interrupt (int reg, void *dev_id, struct pt_regs *regs); +static void clear_interrupt(ray_dev_t *local); +static void rx_deauthenticate(ray_dev_t *local, struct rcs *prcs, + unsigned int pkt_addr, int rx_len); +static int copy_from_rx_buff(ray_dev_t *local, UCHAR *dest, int pkt_addr, int len); +static void ray_rx(struct net_device *dev, ray_dev_t *local, struct rcs *prcs); +static void release_frag_chain(ray_dev_t *local, struct rcs *prcs); +static void rx_authenticate(ray_dev_t *local, struct rcs *prcs, + unsigned int pkt_addr, int rx_len); +static void rx_data(struct net_device *dev, struct rcs *prcs, unsigned int pkt_addr, + int rx_len); +static void associate(ray_dev_t *local); + +/* Card command functions */ +static int dl_startup_params(struct net_device *dev); +static void join_net(u_long local); +static void start_net(u_long local); +/* void start_net(ray_dev_t *local); */ + +/* Create symbol table for registering with kernel in init_module */ +EXPORT_SYMBOL(ray_dev_ioctl); +EXPORT_SYMBOL(ray_rx); + +/*===========================================================================*/ +/* Parameters that can be set with 'insmod' */ +/* Bit map of interrupts to choose from */ +/* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */ +static u_long irq_mask = 0xdeb8; + +/* ADHOC=0, Infrastructure=1 */ +static int net_type = ADHOC; + +/* Hop dwell time in Kus (1024 us units defined by 802.11) */ +static int hop_dwell = 128; + +/* Beacon period in Kus */ +static int beacon_period = 256; + +/* power save mode (0 = off, 1 = save power) */ +static int psm; + +/* String for network's Extended Service Set ID. 32 Characters max */ +static char *essid; + +/* Default to encapsulation unless translation requested */ +static int translate = 1; + +static int country = USA; + +static int sniffer; + +static int bc; + +/* 48 bit physical card address if overriding card's real physical + * address is required. Since IEEE 802.11 addresses are 48 bits + * like ethernet, an int can't be used, so a string is used. To + * allow use of addresses starting with a decimal digit, the first + * character must be a letter and will be ignored. This letter is + * followed by up to 12 hex digits which are the address. If less + * than 12 digits are used, the address will be left filled with 0's. + * Note that bit 0 of the first byte is the broadcast bit, and evil + * things will happen if it is not 0 in a card address. + */ +static char *phy_addr = NULL; + + +/* The dev_info variable is the "key" that is used to match up this + device driver with appropriate cards, through the card configuration + database. +*/ +static dev_info_t dev_info = "ray_cs"; + +/* A linked list of "instances" of the ray device. Each actual + PCMCIA card corresponds to one device instance, and is described + by one dev_link_t structure (defined in ds.h). +*/ +static dev_link_t *dev_list = NULL; + +/* A dev_link_t structure has fields for most things that are needed + to keep track of a socket, but there will usually be some device + specific information that also needs to be kept track of. The + 'priv' pointer in a dev_link_t structure can be used to point to + a device-specific private data structure, like this. +*/ +static unsigned int ray_mem_speed = 500; + +MODULE_AUTHOR("Corey Thomas "); +MODULE_DESCRIPTION("Raylink/WebGear wireless LAN driver"); +MODULE_LICENSE("GPL"); + +MODULE_PARM(irq_mask,"i"); +MODULE_PARM(net_type,"i"); +MODULE_PARM(hop_dwell,"i"); +MODULE_PARM(beacon_period,"i"); +MODULE_PARM(psm,"i"); +MODULE_PARM(essid,"s"); +MODULE_PARM(translate,"i"); +MODULE_PARM(country,"i"); +MODULE_PARM(sniffer,"i"); +MODULE_PARM(bc,"i"); +MODULE_PARM(phy_addr,"s"); +MODULE_PARM(ray_mem_speed, "i"); + +static UCHAR b5_default_startup_parms[] = { + 0, 0, /* Adhoc station */ + 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, /* Active scan, CA Mode */ + 0, 0, 0, 0, 0, 0, /* No default MAC addr */ + 0x7f, 0xff, /* Frag threshold */ + 0x00, 0x80, /* Hop time 128 Kus*/ + 0x01, 0x00, /* Beacon period 256 Kus */ + 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/ + 0x1d, 0x82, 0x4e, /* SIFS, DIFS, PIFS */ + 0x7f, 0xff, /* RTS threshold */ + 0x04, 0xe2, 0x38, 0xA4, /* scan_dwell, max_scan_dwell */ + 0x05, /* assoc resp timeout thresh */ + 0x08, 0x02, 0x08, /* adhoc, infra, super cycle max*/ + 0, /* Promiscuous mode */ + 0x0c, 0x0bd, /* Unique word */ + 0x32, /* Slot time */ + 0xff, 0xff, /* roam-low snr, low snr count */ + 0x05, 0xff, /* Infra, adhoc missed bcn thresh */ + 0x01, 0x0b, 0x4f, /* USA, hop pattern, hop pat length */ +/* b4 - b5 differences start here */ + 0x00, 0x3f, /* CW max */ + 0x00, 0x0f, /* CW min */ + 0x04, 0x08, /* Noise gain, limit offset */ + 0x28, 0x28, /* det rssi, med busy offsets */ + 7, /* det sync thresh */ + 0, 2, 2, /* test mode, min, max */ + 0, /* allow broadcast SSID probe resp */ + 0, 0, /* privacy must start, can join */ + 2, 0, 0, 0, 0, 0, 0, 0 /* basic rate set */ +}; + +static UCHAR b4_default_startup_parms[] = { + 0, 0, /* Adhoc station */ + 'L','I','N','U','X', 0, 0, 0, /* 32 char ESSID */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, /* Active scan, CA Mode */ + 0, 0, 0, 0, 0, 0, /* No default MAC addr */ + 0x7f, 0xff, /* Frag threshold */ + 0x02, 0x00, /* Hop time */ + 0x00, 0x01, /* Beacon period */ + 0x01, 0x07, 0xa3, /* DTIM, retries, ack timeout*/ + 0x1d, 0x82, 0xce, /* SIFS, DIFS, PIFS */ + 0x7f, 0xff, /* RTS threshold */ + 0xfb, 0x1e, 0xc7, 0x5c, /* scan_dwell, max_scan_dwell */ + 0x05, /* assoc resp timeout thresh */ + 0x04, 0x02, 0x4, /* adhoc, infra, super cycle max*/ + 0, /* Promiscuous mode */ + 0x0c, 0x0bd, /* Unique word */ + 0x4e, /* Slot time (TBD seems wrong)*/ + 0xff, 0xff, /* roam-low snr, low snr count */ + 0x05, 0xff, /* Infra, adhoc missed bcn thresh */ + 0x01, 0x0b, 0x4e, /* USA, hop pattern, hop pat length */ +/* b4 - b5 differences start here */ + 0x3f, 0x0f, /* CW max, min */ + 0x04, 0x08, /* Noise gain, limit offset */ + 0x28, 0x28, /* det rssi, med busy offsets */ + 7, /* det sync thresh */ + 0, 2, 2 /* test mode, min, max*/ +}; +/*===========================================================================*/ +static unsigned char eth2_llc[] = {0xaa, 0xaa, 3, 0, 0, 0}; + +static char hop_pattern_length[] = { 1, + USA_HOP_MOD, EUROPE_HOP_MOD, + JAPAN_HOP_MOD, KOREA_HOP_MOD, + SPAIN_HOP_MOD, FRANCE_HOP_MOD, + ISRAEL_HOP_MOD, AUSTRALIA_HOP_MOD, + JAPAN_TEST_HOP_MOD +}; + +static char rcsid[] = "Raylink/WebGear wireless LAN - Corey "; + +/*===========================================================================*/ +static void cs_error(client_handle_t handle, int func, int ret) +{ + error_info_t err = { func, ret }; + pcmcia_report_error(handle, &err); +} +/*====================================================================== + + This bit of code is used to avoid unregistering network devices + at inappropriate times. 2.2 and later kernels are fairly picky + about when this can happen. + +======================================================================*/ + +static void flush_stale_links(void) +{ + dev_link_t *link, *next; + for (link = dev_list; link; link = next) { + next = link->next; + if (link->state & DEV_STALE_LINK) + ray_detach(link); + } +} + +/*============================================================================= + ray_attach() creates an "instance" of the driver, allocating + local data structures for one device. The device is registered + with Card Services. + The dev_link structure is initialized, but we don't actually + configure the card at this point -- we wait until we receive a + card insertion event. +=============================================================================*/ +static dev_link_t *ray_attach(void) +{ + client_reg_t client_reg; + dev_link_t *link; + ray_dev_t *local; + int ret; + struct net_device *dev; + + DEBUG(1, "ray_attach()\n"); + flush_stale_links(); + + /* Initialize the dev_link_t structure */ + link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL); + + if (!link) + return NULL; + + /* Allocate space for private device-specific data */ + dev = kmalloc(sizeof(struct net_device), GFP_KERNEL); + + if (!dev) + goto fail_alloc_dev; + + local = kmalloc(sizeof(ray_dev_t), GFP_KERNEL); + + if (!local) + goto fail_alloc_local; + + memset(link, 0, sizeof(struct dev_link_t)); + memset(dev, 0, sizeof(struct net_device)); + memset(local, 0, sizeof(ray_dev_t)); + + init_timer(&link->release); + link->release.function = &ray_release; + link->release.data = (u_long)link; + + /* The io structure describes IO port mapping. None used here */ + link->io.NumPorts1 = 0; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = 5; + + /* Interrupt setup. For PCMCIA, driver takes what's given */ + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; + link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID; + link->irq.IRQInfo2 = irq_mask; + link->irq.Handler = &ray_interrupt; + + /* General socket configuration */ + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.Vcc = 50; + link->conf.IntType = INT_MEMORY_AND_IO; + link->conf.ConfigIndex = 1; + link->conf.Present = PRESENT_OPTION; + + link->priv = dev; + link->irq.Instance = dev; + + dev->priv = local; + local->finder = link; + local->card_status = CARD_INSERTED; + local->authentication_state = UNAUTHENTICATED; + local->num_multi = 0; + DEBUG(2,"ray_attach link = %p, dev = %p, local = %p, intr = %p\n", + link,dev,local,&ray_interrupt); + + /* Raylink entries in the device structure */ + dev->hard_start_xmit = &ray_dev_start_xmit; + dev->set_config = &ray_dev_config; + dev->get_stats = &ray_get_stats; + dev->do_ioctl = &ray_dev_ioctl; +#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ + dev->get_wireless_stats = ray_get_wireless_stats; +#endif + + dev->set_multicast_list = &set_multicast_list; + + DEBUG(2,"ray_cs ray_attach calling ether_setup.)\n"); + ether_setup(dev); + dev->init = &ray_dev_init; + dev->open = &ray_open; + dev->stop = &ray_dev_close; + netif_stop_queue(dev); + + /* Register with Card Services */ + link->next = dev_list; + dev_list = link; + client_reg.dev_info = &dev_info; + client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; + client_reg.EventMask = + CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | + CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | + CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; + client_reg.event_handler = &ray_event; + client_reg.Version = 0x0210; + client_reg.event_callback_args.client_data = link; + + DEBUG(2,"ray_cs ray_attach calling CardServices(RegisterClient...)\n"); + + init_timer(&local->timer); + + ret = pcmcia_register_client(&link->handle, &client_reg); + if (ret != 0) { + printk("ray_cs ray_attach RegisterClient unhappy - detaching\n"); + cs_error(link->handle, RegisterClient, ret); + ray_detach(link); + return NULL; + } + DEBUG(2,"ray_cs ray_attach ending\n"); + return link; + +fail_alloc_local: + kfree(dev); +fail_alloc_dev: + kfree(link); + return NULL; +} /* ray_attach */ +/*============================================================================= + This deletes a driver "instance". The device is de-registered + with Card Services. If it has been released, all local data + structures are freed. Otherwise, the structures will be freed + when the device is released. +=============================================================================*/ +static void ray_detach(dev_link_t *link) +{ + dev_link_t **linkp; + + DEBUG(1, "ray_detach(0x%p)\n", link); + + /* Locate device structure */ + for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) + if (*linkp == link) break; + if (*linkp == NULL) + return; + + /* If the device is currently configured and active, we won't + actually delete it yet. Instead, it is marked so that when + the release() function is called, that will trigger a proper + detach(). + */ + del_timer(&link->release); + if (link->state & DEV_CONFIG) { + ray_release((u_long)link); + if(link->state & DEV_STALE_CONFIG) { + link->state |= DEV_STALE_LINK; + return; + } + } + + /* Break the link with Card Services */ + if (link->handle) + pcmcia_deregister_client(link->handle); + + /* Unlink device structure, free pieces */ + *linkp = link->next; + if (link->priv) { + struct net_device *dev = link->priv; + if (link->dev) unregister_netdev(dev); + if (dev->priv) + kfree(dev->priv); + kfree(link->priv); + } + kfree(link); + DEBUG(2,"ray_cs ray_detach ending\n"); +} /* ray_detach */ +/*============================================================================= + ray_config() is run after a CARD_INSERTION event + is received, to configure the PCMCIA socket, and to make the + ethernet device available to the system. +=============================================================================*/ +#define CS_CHECK(fn, args...) \ +while ((last_ret=fn(args))!=0) goto cs_failed +#define MAX_TUPLE_SIZE 128 +static void ray_config(dev_link_t *link) +{ + client_handle_t handle = link->handle; + tuple_t tuple; + cisparse_t parse; + int last_fn = 0, last_ret = 0; + int i; + u_char buf[MAX_TUPLE_SIZE]; + win_req_t req; + memreq_t mem; + struct net_device *dev = (struct net_device *)link->priv; + ray_dev_t *local = (ray_dev_t *)dev->priv; + + DEBUG(1, "ray_config(0x%p)\n", link); + + /* This reads the card's CONFIG tuple to find its configuration regs */ + tuple.DesiredTuple = CISTPL_CONFIG; + CS_CHECK(pcmcia_get_first_tuple, handle, &tuple); + tuple.TupleData = buf; + tuple.TupleDataMax = MAX_TUPLE_SIZE; + tuple.TupleOffset = 0; + CS_CHECK(pcmcia_get_tuple_data, handle, &tuple); + CS_CHECK(pcmcia_parse_tuple, handle, &tuple, &parse); + link->conf.ConfigBase = parse.config.base; + link->conf.Present = parse.config.rmask[0]; + + /* Determine card type and firmware version */ + buf[0] = buf[MAX_TUPLE_SIZE - 1] = 0; + tuple.DesiredTuple = CISTPL_VERS_1; + CS_CHECK(pcmcia_get_first_tuple, handle, &tuple); + tuple.TupleData = buf; + tuple.TupleDataMax = MAX_TUPLE_SIZE; + tuple.TupleOffset = 2; + CS_CHECK(pcmcia_get_tuple_data, handle, &tuple); + + for (i=0; istate |= DEV_CONFIG; + + /* Now allocate an interrupt line. Note that this does not + actually assign a handler to the interrupt. + */ + CS_CHECK(pcmcia_request_irq, link->handle, &link->irq); + dev->irq = link->irq.AssignedIRQ; + + /* This actually configures the PCMCIA socket -- setting up + the I/O windows and the interrupt mapping. + */ + CS_CHECK(pcmcia_request_configuration, link->handle, &link->conf); + +/*** Set up 32k window for shared memory (transmit and control) ************/ + req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; + req.Base = 0; + req.Size = 0x8000; + req.AccessSpeed = ray_mem_speed; + CS_CHECK(pcmcia_request_window, &link->handle, &req, &link->win); + mem.CardOffset = 0x0000; mem.Page = 0; + CS_CHECK(pcmcia_map_mem_page, link->win, &mem); + local->sram = (UCHAR *)(ioremap(req.Base,req.Size)); + +/*** Set up 16k window for shared memory (receive buffer) ***************/ + req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT; + req.Base = 0; + req.Size = 0x4000; + req.AccessSpeed = ray_mem_speed; + CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->rmem_handle); + mem.CardOffset = 0x8000; mem.Page = 0; + CS_CHECK(pcmcia_map_mem_page, local->rmem_handle, &mem); + local->rmem = (UCHAR *)(ioremap(req.Base,req.Size)); + +/*** Set up window for attribute memory ***********************************/ + req.Attributes = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | WIN_ENABLE | WIN_USE_WAIT; + req.Base = 0; + req.Size = 0x1000; + req.AccessSpeed = ray_mem_speed; + CS_CHECK(pcmcia_request_window, &link->handle, &req, &local->amem_handle); + mem.CardOffset = 0x0000; mem.Page = 0; + CS_CHECK(pcmcia_map_mem_page, local->amem_handle, &mem); + local->amem = (UCHAR *)(ioremap(req.Base,req.Size)); + + DEBUG(3,"ray_config sram=%p\n",local->sram); + DEBUG(3,"ray_config rmem=%p\n",local->rmem); + DEBUG(3,"ray_config amem=%p\n",local->amem); + if (ray_init(dev) < 0) { + ray_release((u_long)link); + return; + } + + i = register_netdev(dev); + if (i != 0) { + printk("ray_config register_netdev() failed\n"); + ray_release((u_long)link); + return; + } + + strcpy(local->node.dev_name, dev->name); + link->dev = &local->node; + + link->state &= ~DEV_CONFIG_PENDING; + printk(KERN_INFO "%s: RayLink, irq %d, hw_addr ", + dev->name, dev->irq); + for (i = 0; i < 6; i++) + printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n")); + + return; + +cs_failed: + cs_error(link->handle, last_fn, last_ret); + + ray_release((u_long)link); +} /* ray_config */ +/*===========================================================================*/ +static int ray_init(struct net_device *dev) +{ + int i; + UCHAR *p; + struct ccs *pccs; + ray_dev_t *local = (ray_dev_t *)dev->priv; + dev_link_t *link = local->finder; + DEBUG(1, "ray_init(0x%p)\n", dev); + if (!(link->state & DEV_PRESENT)) { + DEBUG(0,"ray_init - device not present\n"); + return -1; + } + + local->net_type = net_type; + local->sta_type = TYPE_STA; + + /* Copy the startup results to local memory */ + memcpy_fromio(&local->startup_res, local->sram + ECF_TO_HOST_BASE,\ + sizeof(struct startup_res_6)); + + /* Check Power up test status and get mac address from card */ + if (local->startup_res.startup_word != 0x80) { + printk(KERN_INFO "ray_init ERROR card status = %2x\n", + local->startup_res.startup_word); + local->card_status = CARD_INIT_ERROR; + return -1; + } + + local->fw_ver = local->startup_res.firmware_version[0]; + local->fw_bld = local->startup_res.firmware_version[1]; + local->fw_var = local->startup_res.firmware_version[2]; + DEBUG(1,"ray_init firmware version %d.%d \n",local->fw_ver, local->fw_bld); + + local->tib_length = 0x20; + if ((local->fw_ver == 5) && (local->fw_bld >= 30)) + local->tib_length = local->startup_res.tib_length; + DEBUG(2,"ray_init tib_length = 0x%02x\n", local->tib_length); + /* Initialize CCS's to buffer free state */ + pccs = (struct ccs *)(local->sram + CCS_BASE); + for (i=0; ibuffer_status); + } + init_startup_params(local); + + /* copy mac address to startup parameters */ + if (parse_addr(phy_addr, local->sparm.b4.a_mac_addr)) + { + p = local->sparm.b4.a_mac_addr; + } + else + { + memcpy(&local->sparm.b4.a_mac_addr, + &local->startup_res.station_addr, ADDRLEN); + p = local->sparm.b4.a_mac_addr; + } + + clear_interrupt(local); /* Clear any interrupt from the card */ + local->card_status = CARD_AWAITING_PARAM; + DEBUG(2,"ray_init ending\n"); + return 0; +} /* ray_init */ +/*===========================================================================*/ +/* Download startup parameters to the card and command it to read them */ +static int dl_startup_params(struct net_device *dev) +{ + int ccsindex; + ray_dev_t *local = (ray_dev_t *)dev->priv; + struct ccs *pccs; + dev_link_t *link = local->finder; + + DEBUG(1,"dl_startup_params entered\n"); + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs dl_startup_params - device not present\n"); + return -1; + } + + /* Copy parameters to host to ECF area */ + if (local->fw_ver == 0x55) + memcpy_toio(local->sram + HOST_TO_ECF_BASE, &local->sparm.b4, + sizeof(struct b4_startup_params)); + else + memcpy_toio(local->sram + HOST_TO_ECF_BASE, &local->sparm.b5, + sizeof(struct b5_startup_params)); + + + /* Fill in the CCS fields for the ECF */ + if ((ccsindex = get_free_ccs(local)) < 0) return -1; + local->dl_param_ccs = ccsindex; + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + writeb(CCS_DOWNLOAD_STARTUP_PARAMS, &pccs->cmd); + DEBUG(2,"dl_startup_params start ccsindex = %d\n", local->dl_param_ccs); + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + printk(KERN_INFO "ray dl_startup_params failed - " + "ECF not ready for intr\n"); + local->card_status = CARD_DL_PARAM_ERROR; + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + return -2; + } + local->card_status = CARD_DL_PARAM; + /* Start kernel timer to wait for dl startup to complete. */ + local->timer.expires = jiffies + HZ/2; + local->timer.data = (long)local; + local->timer.function = &verify_dl_startup; + add_timer(&local->timer); + DEBUG(2,"ray_cs dl_startup_params started timer for verify_dl_startup\n"); + return 0; +} /* dl_startup_params */ +/*===========================================================================*/ +static void init_startup_params(ray_dev_t *local) +{ + int i; + + if (country > JAPAN_TEST) country = USA; + else + if (country < USA) country = USA; + /* structure for hop time and beacon period is defined here using + * New 802.11D6.1 format. Card firmware is still using old format + * until version 6. + * Before After + * a_hop_time ms byte a_hop_time ms byte + * a_hop_time 2s byte a_hop_time ls byte + * a_hop_time ls byte a_beacon_period ms byte + * a_beacon_period a_beacon_period ls byte + * + * a_hop_time = uS a_hop_time = KuS + * a_beacon_period = hops a_beacon_period = KuS + */ /* 64ms = 010000 */ + if (local->fw_ver == 0x55) { + memcpy((UCHAR *)&local->sparm.b4, b4_default_startup_parms, + sizeof(struct b4_startup_params)); + /* Translate sane kus input values to old build 4/5 format */ + /* i = hop time in uS truncated to 3 bytes */ + i = (hop_dwell * 1024) & 0xffffff; + local->sparm.b4.a_hop_time[0] = (i >> 16) & 0xff; + local->sparm.b4.a_hop_time[1] = (i >> 8) & 0xff; + local->sparm.b4.a_beacon_period[0] = 0; + local->sparm.b4.a_beacon_period[1] = + ((beacon_period/hop_dwell) - 1) & 0xff; + local->sparm.b4.a_curr_country_code = country; + local->sparm.b4.a_hop_pattern_length = + hop_pattern_length[(int)country] - 1; + if (bc) + { + local->sparm.b4.a_ack_timeout = 0x50; + local->sparm.b4.a_sifs = 0x3f; + } + } + else { /* Version 5 uses real kus values */ + memcpy((UCHAR *)&local->sparm.b5, b5_default_startup_parms, + sizeof(struct b5_startup_params)); + + local->sparm.b5.a_hop_time[0] = (hop_dwell >> 8) & 0xff; + local->sparm.b5.a_hop_time[1] = hop_dwell & 0xff; + local->sparm.b5.a_beacon_period[0] = (beacon_period >> 8) & 0xff; + local->sparm.b5.a_beacon_period[1] = beacon_period & 0xff; + if (psm) + local->sparm.b5.a_power_mgt_state = 1; + local->sparm.b5.a_curr_country_code = country; + local->sparm.b5.a_hop_pattern_length = + hop_pattern_length[(int)country]; + } + + local->sparm.b4.a_network_type = net_type & 0x01; + local->sparm.b4.a_acting_as_ap_status = TYPE_STA; + + if (essid != NULL) + strncpy(local->sparm.b4.a_current_ess_id, essid, ESSID_SIZE); +} /* init_startup_params */ +/*===========================================================================*/ +static void verify_dl_startup(u_long data) +{ + ray_dev_t *local = (ray_dev_t *)data; + struct ccs *pccs = ((struct ccs *)(local->sram + CCS_BASE)) + local->dl_param_ccs; + UCHAR status; + dev_link_t *link = local->finder; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs verify_dl_startup - device not present\n"); + return; + } +#ifdef PCMCIA_DEBUG + if (pc_debug > 2) { + int i; + printk(KERN_DEBUG "verify_dl_startup parameters sent via ccs %d:\n", + local->dl_param_ccs); + for (i=0; isram + HOST_TO_ECF_BASE + i)); + } + printk("\n"); + } +#endif + + status = readb(&pccs->buffer_status); + if (status!= CCS_BUFFER_FREE) + { + printk(KERN_INFO "Download startup params failed. Status = %d\n", + status); + local->card_status = CARD_DL_PARAM_ERROR; + return; + } + if (local->sparm.b4.a_network_type == ADHOC) + start_net((u_long)local); + else + join_net((u_long)local); + + return; +} /* end verify_dl_startup */ +/*===========================================================================*/ +/* Command card to start a network */ +static void start_net(u_long data) +{ + ray_dev_t *local = (ray_dev_t *)data; + struct ccs *pccs; + int ccsindex; + dev_link_t *link = local->finder; + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs start_net - device not present\n"); + return; + } + /* Fill in the CCS fields for the ECF */ + if ((ccsindex = get_free_ccs(local)) < 0) return; + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + writeb(CCS_START_NETWORK, &pccs->cmd); + writeb(0, &pccs->var.start_network.update_param); + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(1,"ray start net failed - card not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + return; + } + local->card_status = CARD_DOING_ACQ; + return; +} /* end start_net */ +/*===========================================================================*/ +/* Command card to join a network */ +static void join_net(u_long data) +{ + ray_dev_t *local = (ray_dev_t *)data; + + struct ccs *pccs; + int ccsindex; + dev_link_t *link = local->finder; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs join_net - device not present\n"); + return; + } + /* Fill in the CCS fields for the ECF */ + if ((ccsindex = get_free_ccs(local)) < 0) return; + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + writeb(CCS_JOIN_NETWORK, &pccs->cmd); + writeb(0, &pccs->var.join_network.update_param); + writeb(0, &pccs->var.join_network.net_initiated); + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(1,"ray join net failed - card not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + return; + } + local->card_status = CARD_DOING_ACQ; + return; +} +/*============================================================================ + After a card is removed, ray_release() will unregister the net + device, and release the PCMCIA configuration. If the device is + still open, this will be postponed until it is closed. +=============================================================================*/ +static void ray_release(u_long arg) +{ + dev_link_t *link = (dev_link_t *)arg; + struct net_device *dev = link->priv; + ray_dev_t *local = dev->priv; + int i; + + DEBUG(1, "ray_release(0x%p)\n", link); + /* If the device is currently in use, we won't release until it + is actually closed. + */ + if (link->open) { + DEBUG(1, "ray_cs: release postponed, '%s' still open\n", + link->dev->dev_name); + link->state |= DEV_STALE_CONFIG; + return; + } + del_timer(&local->timer); + link->state &= ~DEV_CONFIG; + + iounmap(local->sram); + iounmap(local->rmem); + iounmap(local->amem); + /* Do bother checking to see if these succeed or not */ + i = pcmcia_release_window(link->win); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(link->win) ret = %x\n",i); + i = pcmcia_release_window(local->amem_handle); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->amem) ret = %x\n",i); + i = pcmcia_release_window(local->rmem_handle); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseWindow(local->rmem) ret = %x\n",i); + i = pcmcia_release_configuration(link->handle); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseConfiguration ret = %x\n",i); + i = pcmcia_release_irq(link->handle, &link->irq); + if ( i != CS_SUCCESS ) DEBUG(0,"ReleaseIRQ ret = %x\n",i); + + DEBUG(2,"ray_release ending\n"); +} /* ray_release */ +/*============================================================================= + The card status event handler. Mostly, this schedules other + stuff to run after an event is received. A CARD_REMOVAL event + also sets some flags to discourage the net drivers from trying + to talk to the card any more. + + When a CARD_REMOVAL event is received, we immediately set a flag + to block future accesses to this device. All the functions that + actually access the device should check this flag to make sure + the card is still present. +=============================================================================*/ +static int ray_event(event_t event, int priority, + event_callback_args_t *args) +{ + dev_link_t *link = args->client_data; + struct net_device *dev = link->priv; + ray_dev_t *local = (ray_dev_t *)dev->priv; + DEBUG(1, "ray_event(0x%06x)\n", event); + + switch (event) { + case CS_EVENT_CARD_REMOVAL: + link->state &= ~DEV_PRESENT; + netif_device_detach(dev); + if (link->state & DEV_CONFIG) { + mod_timer(&link->release, jiffies + HZ/20); + del_timer(&local->timer); + } + break; + case CS_EVENT_CARD_INSERTION: + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + ray_config(link); + break; + case CS_EVENT_PM_SUSPEND: + link->state |= DEV_SUSPEND; + /* Fall through... */ + case CS_EVENT_RESET_PHYSICAL: + if (link->state & DEV_CONFIG) { + if (link->open) + netif_device_detach(dev); + + pcmcia_release_configuration(link->handle); + } + break; + case CS_EVENT_PM_RESUME: + link->state &= ~DEV_SUSPEND; + /* Fall through... */ + case CS_EVENT_CARD_RESET: + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + if (link->open) { + ray_reset(dev); + netif_device_attach(dev); + } + } + break; + } + return 0; + DEBUG(2,"ray_event ending\n"); +} /* ray_event */ +/*===========================================================================*/ +int ray_dev_init(struct net_device *dev) +{ +#ifdef RAY_IMMEDIATE_INIT + int i; +#endif /* RAY_IMMEDIATE_INIT */ + ray_dev_t *local = dev->priv; + dev_link_t *link = local->finder; + + DEBUG(1,"ray_dev_init(dev=%p)\n",dev); + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_dev_init - device not present\n"); + return -1; + } +#ifdef RAY_IMMEDIATE_INIT + /* Download startup parameters */ + if ( (i = dl_startup_params(dev)) < 0) + { + printk(KERN_INFO "ray_dev_init dl_startup_params failed - " + "returns 0x%x\n",i); + return -1; + } +#else /* RAY_IMMEDIATE_INIT */ + /* Postpone the card init so that we can still configure the card, + * for example using the Wireless Extensions. The init will happen + * in ray_open() - Jean II */ + DEBUG(1,"ray_dev_init: postponing card init to ray_open() ; Status = %d\n", + local->card_status); +#endif /* RAY_IMMEDIATE_INIT */ + + /* copy mac and broadcast addresses to linux device */ + memcpy(&dev->dev_addr, &local->sparm.b4.a_mac_addr, ADDRLEN); + memset(dev->broadcast, 0xff, ETH_ALEN); + + DEBUG(2,"ray_dev_init ending\n"); + return 0; +} +/*===========================================================================*/ +static int ray_dev_config(struct net_device *dev, struct ifmap *map) +{ + ray_dev_t *local = dev->priv; + dev_link_t *link = local->finder; + /* Dummy routine to satisfy device structure */ + DEBUG(1,"ray_dev_config(dev=%p,ifmap=%p)\n",dev,map); + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_dev_config - device not present\n"); + return -1; + } + + return 0; +} +/*===========================================================================*/ +static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + ray_dev_t *local = dev->priv; + dev_link_t *link = local->finder; + short length = skb->len; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_dev_start_xmit - device not present\n"); + return -1; + } + DEBUG(3,"ray_dev_start_xmit(skb=%p, dev=%p)\n",skb,dev); + if (local->authentication_state == NEED_TO_AUTH) { + DEBUG(0,"ray_cs Sending authentication request.\n"); + if (!build_auth_frame (local, local->auth_id, OPEN_AUTH_REQUEST)) { + local->authentication_state = AUTHENTICATED; + netif_stop_queue(dev); + return 1; + } + } + + if (length < ETH_ZLEN) + { + skb = skb_padto(skb, ETH_ZLEN); + if (skb == NULL) + return 0; + length = ETH_ZLEN; + } + switch (ray_hw_xmit( skb->data, length, dev, DATA_TYPE)) { + case XMIT_NO_CCS: + case XMIT_NEED_AUTH: + netif_stop_queue(dev); + return 1; + case XMIT_NO_INTR: + case XMIT_MSG_BAD: + case XMIT_OK: + default: + dev->trans_start = jiffies; + dev_kfree_skb(skb); + return 0; + } + return 0; +} /* ray_dev_start_xmit */ +/*===========================================================================*/ +static int ray_hw_xmit(unsigned char* data, int len, struct net_device* dev, + UCHAR msg_type) +{ + ray_dev_t *local = (ray_dev_t *)dev->priv; + struct ccs *pccs; + int ccsindex; + int offset; + struct tx_msg *ptx; /* Address of xmit buffer in PC space */ + short int addr; /* Address of xmit buffer in card space */ + + DEBUG(3,"ray_hw_xmit(data=%p, len=%d, dev=%p)\n",data,len,dev); + if (len + TX_HEADER_LENGTH > TX_BUF_SIZE) + { + printk(KERN_INFO "ray_hw_xmit packet too large: %d bytes\n",len); + return XMIT_MSG_BAD; + } + switch (ccsindex = get_free_tx_ccs(local)) { + case ECCSBUSY: + DEBUG(2,"ray_hw_xmit tx_ccs table busy\n"); + case ECCSFULL: + DEBUG(2,"ray_hw_xmit No free tx ccs\n"); + case ECARDGONE: + netif_stop_queue(dev); + return XMIT_NO_CCS; + default: + break; + } + addr = TX_BUF_BASE + (ccsindex << 11); + + if (msg_type == DATA_TYPE) { + local->stats.tx_bytes += len; + local->stats.tx_packets++; + } + + ptx = (struct tx_msg *)(local->sram + addr); + + ray_build_header(local, ptx, msg_type, data); + if (translate) { + offset = translate_frame(local, ptx, data, len); + } + else { /* Encapsulate frame */ + /* TBD TIB length will move address of ptx->var */ + memcpy_toio(&ptx->var, data, len); + offset = 0; + } + + /* fill in the CCS */ + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + len += TX_HEADER_LENGTH + offset; + writeb(CCS_TX_REQUEST, &pccs->cmd); + writeb(addr >> 8, &pccs->var.tx_request.tx_data_ptr[0]); + writeb(local->tib_length, &pccs->var.tx_request.tx_data_ptr[1]); + writeb(len >> 8, &pccs->var.tx_request.tx_data_length[0]); + writeb(len & 0xff, &pccs->var.tx_request.tx_data_length[1]); +/* TBD still need psm_cam? */ + writeb(PSM_CAM, &pccs->var.tx_request.pow_sav_mode); + writeb(local->net_default_tx_rate, &pccs->var.tx_request.tx_rate); + writeb(0, &pccs->var.tx_request.antenna); + DEBUG(3,"ray_hw_xmit default_tx_rate = 0x%x\n",\ + local->net_default_tx_rate); + + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(2,"ray_hw_xmit failed - ECF not ready for intr\n"); +/* TBD very inefficient to copy packet to buffer, and then not + send it, but the alternative is to queue the messages and that + won't be done for a while. Maybe set tbusy until a CCS is free? +*/ + writeb(CCS_BUFFER_FREE, &pccs->buffer_status); + return XMIT_NO_INTR; + } + return XMIT_OK; +} /* end ray_hw_xmit */ +/*===========================================================================*/ +static int translate_frame(ray_dev_t *local, struct tx_msg *ptx, unsigned char *data, + int len) +{ + unsigned short int proto = ((struct ethhdr *)data)->h_proto; + if (ntohs(proto) >= 1536) { /* DIX II ethernet frame */ + DEBUG(3,"ray_cs translate_frame DIX II\n"); + /* Copy LLC header to card buffer */ + memcpy_toio((UCHAR *)&ptx->var, eth2_llc, sizeof(eth2_llc)); + memcpy_toio( ((UCHAR *)&ptx->var) + sizeof(eth2_llc), (UCHAR *)&proto, 2); + if ((proto == 0xf380) || (proto == 0x3781)) { + /* This is the selective translation table, only 2 entries */ + writeb(0xf8, (UCHAR *) &((struct snaphdr_t *)ptx->var)->org[3]); + } + /* Copy body of ethernet packet without ethernet header */ + memcpy_toio((UCHAR *)&ptx->var + sizeof(struct snaphdr_t), \ + data + ETH_HLEN, len - ETH_HLEN); + return (int) sizeof(struct snaphdr_t) - ETH_HLEN; + } + else { /* already 802 type, and proto is length */ + DEBUG(3,"ray_cs translate_frame 802\n"); + if (proto == 0xffff) { /* evil netware IPX 802.3 without LLC */ + DEBUG(3,"ray_cs translate_frame evil IPX\n"); + memcpy_toio((UCHAR *)&ptx->var, data + ETH_HLEN, len - ETH_HLEN); + return 0 - ETH_HLEN; + } + memcpy_toio((UCHAR *)&ptx->var, data + ETH_HLEN, len - ETH_HLEN); + return 0 - ETH_HLEN; + } + /* TBD do other frame types */ +} /* end translate_frame */ +/*===========================================================================*/ +static void ray_build_header(ray_dev_t *local, struct tx_msg *ptx, UCHAR msg_type, + unsigned char *data) +{ + writeb(PROTOCOL_VER | msg_type, &ptx->mac.frame_ctl_1); +/*** IEEE 802.11 Address field assignments ************* + TODS FROMDS addr_1 addr_2 addr_3 addr_4 +Adhoc 0 0 dest src (terminal) BSSID N/A +AP to Terminal 0 1 dest AP(BSSID) source N/A +Terminal to AP 1 0 AP(BSSID) src (terminal) dest N/A +AP to AP 1 1 dest AP src AP dest source +*******************************************************/ + if (local->net_type == ADHOC) { + writeb(0, &ptx->mac.frame_ctl_2); + memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, 2 * ADDRLEN); + memcpy_toio(ptx->mac.addr_3, local->bss_id, ADDRLEN); + } + else /* infrastructure */ + { + if (local->sparm.b4.a_acting_as_ap_status) + { + writeb(FC2_FROM_DS, &ptx->mac.frame_ctl_2); + memcpy_toio(ptx->mac.addr_1, ((struct ethhdr *)data)->h_dest, ADDRLEN); + memcpy_toio(ptx->mac.addr_2, local->bss_id, 6); + memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_source, ADDRLEN); + } + else /* Terminal */ + { + writeb(FC2_TO_DS, &ptx->mac.frame_ctl_2); + memcpy_toio(ptx->mac.addr_1, local->bss_id, ADDRLEN); + memcpy_toio(ptx->mac.addr_2, ((struct ethhdr *)data)->h_source, ADDRLEN); + memcpy_toio(ptx->mac.addr_3, ((struct ethhdr *)data)->h_dest, ADDRLEN); + } + } +} /* end encapsulate_frame */ + + +/*===========================================================================*/ + +static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +{ + u32 ethcmd; + + if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) + return -EFAULT; + + switch (ethcmd) { + case ETHTOOL_GDRVINFO: { + struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; + strncpy(info.driver, "ray_cs", sizeof(info.driver)-1); + if (copy_to_user(useraddr, &info, sizeof(info))) + return -EFAULT; + return 0; + } + } + + return -EOPNOTSUPP; +} + +/*====================================================================*/ + +static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ + ray_dev_t *local = (ray_dev_t *)dev->priv; + dev_link_t *link = local->finder; + int err = 0; +#if WIRELESS_EXT > 7 + struct iwreq *wrq = (struct iwreq *) ifr; +#endif /* WIRELESS_EXT > 7 */ + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_dev_ioctl - device not present\n"); + return -1; + } + DEBUG(2,"ray_cs IOCTL dev=%p, ifr=%p, cmd = 0x%x\n",dev,ifr,cmd); + /* Validate the command */ + switch (cmd) + { + case SIOCETHTOOL: + err = netdev_ethtool_ioctl(dev, (void *) ifr->ifr_data); + break; + +#if WIRELESS_EXT > 7 + /* --------------- WIRELESS EXTENSIONS --------------- */ + /* Get name */ + case SIOCGIWNAME: + strcpy(wrq->u.name, "IEEE 802.11-FH"); + break; + + /* Get frequency/channel */ + case SIOCGIWFREQ: + wrq->u.freq.m = local->sparm.b5.a_hop_pattern; + wrq->u.freq.e = 0; + break; + + /* Set frequency/channel */ + case SIOCSIWFREQ: + /* Reject if card is already initialised */ + if(local->card_status != CARD_AWAITING_PARAM) + { + err = -EBUSY; + break; + } + + /* Setting by channel number */ + if ((wrq->u.freq.m > USA_HOP_MOD) || (wrq->u.freq.e > 0)) + err = -EOPNOTSUPP; + else + local->sparm.b5.a_hop_pattern = wrq->u.freq.m; + break; + + /* Get current network name (ESSID) */ + case SIOCGIWESSID: + if (wrq->u.data.pointer) + { + char essid[IW_ESSID_MAX_SIZE + 1]; + /* Get the essid that was set */ + memcpy(essid, local->sparm.b5.a_current_ess_id, + IW_ESSID_MAX_SIZE); + essid[IW_ESSID_MAX_SIZE] = '\0'; + + /* Push it out ! */ + wrq->u.data.length = strlen(essid) + 1; + wrq->u.data.flags = 1; /* active */ + copy_to_user(wrq->u.data.pointer, essid, sizeof(essid)); + } + break; + + /* Set desired network name (ESSID) */ + case SIOCSIWESSID: + /* Reject if card is already initialised */ + if(local->card_status != CARD_AWAITING_PARAM) + { + err = -EBUSY; + break; + } + + if (wrq->u.data.pointer) + { + char card_essid[IW_ESSID_MAX_SIZE + 1]; + + /* Check if we asked for `any' */ + if(wrq->u.data.flags == 0) + { + /* Corey : can you do that ? */ + err = -EOPNOTSUPP; + } + else + { + /* Check the size of the string */ + if(wrq->u.data.length > + IW_ESSID_MAX_SIZE + 1) + { + err = -E2BIG; + break; + } + if (copy_from_user(card_essid, + wrq->u.data.pointer, + wrq->u.data.length)) { + err = -EFAULT; + break; + } + card_essid[IW_ESSID_MAX_SIZE] = '\0'; + + /* Set the ESSID in the card */ + memcpy(local->sparm.b5.a_current_ess_id, card_essid, + IW_ESSID_MAX_SIZE); + } + } + break; + + /* Get current Access Point (BSSID in our case) */ + case SIOCGIWAP: + memcpy(wrq->u.ap_addr.sa_data, local->bss_id, ETH_ALEN); + wrq->u.ap_addr.sa_family = ARPHRD_ETHER; + break; + + /* Get the current bit-rate */ + case SIOCGIWRATE: + if(local->net_default_tx_rate == 3) + wrq->u.bitrate.value = 2000000; /* Hum... */ + else + wrq->u.bitrate.value = local->net_default_tx_rate * 500000; + wrq->u.bitrate.fixed = 0; /* We are in auto mode */ + break; + + /* Set the desired bit-rate */ + case SIOCSIWRATE: + /* Check if rate is in range */ + if((wrq->u.bitrate.value != 1000000) && + (wrq->u.bitrate.value != 2000000)) + { + err = -EINVAL; + break; + } + /* Hack for 1.5 Mb/s instead of 2 Mb/s */ + if((local->fw_ver == 0x55) && /* Please check */ + (wrq->u.bitrate.value == 2000000)) + local->net_default_tx_rate = 3; + else + local->net_default_tx_rate = wrq->u.bitrate.value/500000; + break; + + /* Get the current RTS threshold */ + case SIOCGIWRTS: + wrq->u.rts.value = (local->sparm.b5.a_rts_threshold[0] << 8) + + local->sparm.b5.a_rts_threshold[1]; +#if WIRELESS_EXT > 8 + wrq->u.rts.disabled = (wrq->u.rts.value == 32767); +#endif /* WIRELESS_EXT > 8 */ + wrq->u.rts.fixed = 1; + break; + + /* Set the desired RTS threshold */ + case SIOCSIWRTS: + { + int rthr = wrq->u.rts.value; + + /* Reject if card is already initialised */ + if(local->card_status != CARD_AWAITING_PARAM) + { + err = -EBUSY; + break; + } + + /* if(wrq->u.rts.fixed == 0) we should complain */ +#if WIRELESS_EXT > 8 + if(wrq->u.rts.disabled) + rthr = 32767; + else +#endif /* WIRELESS_EXT > 8 */ + if((rthr < 0) || (rthr > 2347)) /* What's the max packet size ??? */ + { + err = -EINVAL; + break; + } + local->sparm.b5.a_rts_threshold[0] = (rthr >> 8) & 0xFF; + local->sparm.b5.a_rts_threshold[1] = rthr & 0xFF; + } + break; + + /* Get the current fragmentation threshold */ + case SIOCGIWFRAG: + wrq->u.frag.value = (local->sparm.b5.a_frag_threshold[0] << 8) + + local->sparm.b5.a_frag_threshold[1]; +#if WIRELESS_EXT > 8 + wrq->u.frag.disabled = (wrq->u.frag.value == 32767); +#endif /* WIRELESS_EXT > 8 */ + wrq->u.frag.fixed = 1; + break; + + /* Set the desired fragmentation threshold */ + case SIOCSIWFRAG: + { + int fthr = wrq->u.frag.value; + + /* Reject if card is already initialised */ + if(local->card_status != CARD_AWAITING_PARAM) + { + err = -EBUSY; + break; + } + + /* if(wrq->u.frag.fixed == 0) should complain */ +#if WIRELESS_EXT > 8 + if(wrq->u.frag.disabled) + fthr = 32767; + else +#endif /* WIRELESS_EXT > 8 */ + if((fthr < 256) || (fthr > 2347)) /* To check out ! */ + { + err = -EINVAL; + break; + } + local->sparm.b5.a_frag_threshold[0] = (fthr >> 8) & 0xFF; + local->sparm.b5.a_frag_threshold[1] = fthr & 0xFF; + } + break; + +#endif /* WIRELESS_EXT > 7 */ +#if WIRELESS_EXT > 8 + + /* Get the current mode of operation */ + case SIOCGIWMODE: + if(local->sparm.b5.a_network_type) + wrq->u.mode = IW_MODE_INFRA; + else + wrq->u.mode = IW_MODE_ADHOC; + break; + + /* Set the current mode of operation */ + case SIOCSIWMODE: + { + char card_mode = 1; + + /* Reject if card is already initialised */ + if(local->card_status != CARD_AWAITING_PARAM) + { + err = -EBUSY; + break; + } + + switch (wrq->u.mode) + { + case IW_MODE_ADHOC: + card_mode = 0; + // Fall through + case IW_MODE_INFRA: + local->sparm.b5.a_network_type = card_mode; + break; + default: + err = -EINVAL; + } + } + break; + +#endif /* WIRELESS_EXT > 8 */ +#if WIRELESS_EXT > 7 + /* ------------------ IWSPY SUPPORT ------------------ */ + /* Define the range (variations) of above parameters */ + case SIOCGIWRANGE: + /* Basic checking... */ + if(wrq->u.data.pointer != (caddr_t) 0) + { + struct iw_range range; + memset((char *) &range, 0, sizeof(struct iw_range)); + + /* Set the length (very important for backward compatibility) */ + wrq->u.data.length = sizeof(struct iw_range); + +#if WIRELESS_EXT > 10 + /* Set the Wireless Extension versions */ + range.we_version_compiled = WIRELESS_EXT; + range.we_version_source = 9; +#endif /* WIRELESS_EXT > 10 */ + + /* Set information in the range struct */ + range.throughput = 1.1 * 1000 * 1000; /* Put the right number here */ + range.num_channels = hop_pattern_length[(int)country]; + range.num_frequency = 0; + range.max_qual.qual = 0; + range.max_qual.level = 255; /* What's the correct value ? */ + range.max_qual.noise = 255; /* Idem */ + range.num_bitrates = 2; + range.bitrate[0] = 1000000; /* 1 Mb/s */ + range.bitrate[1] = 2000000; /* 2 Mb/s */ + + /* Copy structure to the user buffer */ + if(copy_to_user(wrq->u.data.pointer, &range, + sizeof(struct iw_range))) + err = -EFAULT; + } + break; + +#ifdef WIRELESS_SPY + /* Set addresses to spy */ + case SIOCSIWSPY: + /* Check the number of addresses */ + if(wrq->u.data.length > IW_MAX_SPY) + { + err = -E2BIG; + break; + } + local->spy_number = wrq->u.data.length; + + /* If there is some addresses to copy */ + if(local->spy_number > 0) + { + struct sockaddr address[IW_MAX_SPY]; + int i; + + /* Copy addresses to the driver */ + if(copy_from_user(address, wrq->u.data.pointer, + sizeof(struct sockaddr) * local->spy_number)) + { + err = -EFAULT; + break; + } + + /* Copy addresses to the lp structure */ + for(i = 0; i < local->spy_number; i++) + memcpy(local->spy_address[i], address[i].sa_data, ETH_ALEN); + + /* Reset structure... */ + memset(local->spy_stat, 0x00, sizeof(iw_qual) * IW_MAX_SPY); + +#ifdef DEBUG_IOCTL_INFO + printk(KERN_DEBUG "SetSpy - Set of new addresses is :\n"); + for(i = 0; i < local->spy_number; i++) + printk(KERN_DEBUG "%02X:%02X:%02X:%02X:%02X:%02X\n", + local->spy_address[i][0], + local->spy_address[i][1], + local->spy_address[i][2], + local->spy_address[i][3], + local->spy_address[i][4], + local->spy_address[i][5]); +#endif /* DEBUG_IOCTL_INFO */ + } + break; + + /* Get the spy list and spy stats */ + case SIOCGIWSPY: + /* Set the number of addresses */ + wrq->u.data.length = local->spy_number; + + /* If the user want to have the addresses back... */ + if((local->spy_number > 0) && (wrq->u.data.pointer != (caddr_t) 0)) + { + struct sockaddr address[IW_MAX_SPY]; + int i; + + /* Copy addresses from the lp structure */ + for(i = 0; i < local->spy_number; i++) + { + memcpy(address[i].sa_data, local->spy_address[i], ETH_ALEN); + address[i].sa_family = ARPHRD_ETHER; + } + + /* Copy addresses to the user buffer */ + if(copy_to_user(wrq->u.data.pointer, address, + sizeof(struct sockaddr) * local->spy_number)) + { + err = -EFAULT; + break; + } + + /* Copy stats to the user buffer (just after) */ + if(copy_to_user(wrq->u.data.pointer + + (sizeof(struct sockaddr) * local->spy_number), + local->spy_stat, sizeof(iw_qual) * local->spy_number)) + { + err = -EFAULT; + break; + } + + /* Reset updated flags */ + for(i = 0; i < local->spy_number; i++) + local->spy_stat[i].updated = 0x0; + } /* if(pointer != NULL) */ + + break; +#endif /* WIRELESS_SPY */ + + /* ------------------ PRIVATE IOCTL ------------------ */ +#ifndef SIOCIWFIRSTPRIV +#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE +#endif /* SIOCIWFIRSTPRIV */ +#define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */ +#define SIOCGIPFRAMING SIOCIWFIRSTPRIV + 1 /* Get framing mode */ +#define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */ + case SIOCSIPFRAMING: + if(!capable(CAP_NET_ADMIN)) /* For private IOCTLs, we need to check permissions */ + { + err = -EPERM; + break; + } + translate = *(wrq->u.name); /* Set framing mode */ + break; + case SIOCGIPFRAMING: + *(wrq->u.name) = translate; + break; + case SIOCGIPCOUNTRY: + *(wrq->u.name) = country; + break; + case SIOCGIWPRIV: + /* Export our "private" intercace */ + if(wrq->u.data.pointer != (caddr_t) 0) + { + struct iw_priv_args priv[] = + { /* cmd, set_args, get_args, name */ + { SIOCSIPFRAMING, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 0, "set_framing" }, + { SIOCGIPFRAMING, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_framing" }, + { SIOCGIPCOUNTRY, 0, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "get_country" }, + }; + /* Set the number of ioctl available */ + wrq->u.data.length = 3; + /* Copy structure to the user buffer */ + if(copy_to_user(wrq->u.data.pointer, (u_char *) priv, + sizeof(priv))) + err = -EFAULT; + } + break; +#endif /* WIRELESS_EXT > 7 */ + + + default: + DEBUG(0,"ray_dev_ioctl cmd = 0x%x\n", cmd); + err = -EOPNOTSUPP; + } + return err; +} /* end ray_dev_ioctl */ +/*===========================================================================*/ +#if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ +static iw_stats * ray_get_wireless_stats(struct net_device * dev) +{ + ray_dev_t * local = (ray_dev_t *) dev->priv; + dev_link_t *link = local->finder; + struct status *p = (struct status *)(local->sram + STATUS_BASE); + + if(local == (ray_dev_t *) NULL) + return (iw_stats *) NULL; + + local->wstats.status = local->card_status; +#ifdef WIRELESS_SPY + if((local->spy_number > 0) && (local->sparm.b5.a_network_type == 0)) + { + /* Get it from the first node in spy list */ + local->wstats.qual.qual = local->spy_stat[0].qual; + local->wstats.qual.level = local->spy_stat[0].level; + local->wstats.qual.noise = local->spy_stat[0].noise; + local->wstats.qual.updated = local->spy_stat[0].updated; + } +#endif /* WIRELESS_SPY */ + + if((link->state & DEV_PRESENT)) { + local->wstats.qual.noise = readb(&p->rxnoise); + local->wstats.qual.updated |= 4; + } + + return &local->wstats; +} /* end ray_get_wireless_stats */ +#endif /* WIRELESS_EXT > 7 */ +/*===========================================================================*/ +static int ray_open(struct net_device *dev) +{ + dev_link_t *link; + ray_dev_t *local = (ray_dev_t *)dev->priv; + + MOD_INC_USE_COUNT; + + DEBUG(1, "ray_open('%s')\n", dev->name); + + for (link = dev_list; link; link = link->next) + if (link->priv == dev) break; + if (!DEV_OK(link)) { + MOD_DEC_USE_COUNT; + return -ENODEV; + } + + if (link->open == 0) local->num_multi = 0; + link->open++; + + /* If the card is not started, time to start it ! - Jean II */ + if(local->card_status == CARD_AWAITING_PARAM) { + int i; + + DEBUG(1,"ray_open: doing init now !\n"); + + /* Download startup parameters */ + if ( (i = dl_startup_params(dev)) < 0) + { + printk(KERN_INFO "ray_dev_init dl_startup_params failed - " + "returns 0x%x\n",i); + return -1; + } + } + + if (sniffer) netif_stop_queue(dev); + else netif_start_queue(dev); + + DEBUG(2,"ray_open ending\n"); + return 0; +} /* end ray_open */ +/*===========================================================================*/ +static int ray_dev_close(struct net_device *dev) +{ + dev_link_t *link; + + DEBUG(1, "ray_dev_close('%s')\n", dev->name); + + for (link = dev_list; link; link = link->next) + if (link->priv == dev) break; + if (link == NULL) + return -ENODEV; + + link->open--; + netif_stop_queue(dev); + if (link->state & DEV_STALE_CONFIG) + mod_timer(&link->release, jiffies + HZ/20); + + /* In here, we should stop the hardware (stop card from beeing active) + * and set local->card_status to CARD_AWAITING_PARAM, so that while the + * card is closed we can chage its configuration. + * Probably also need a COR reset to get sane state - Jean II */ + + MOD_DEC_USE_COUNT; + + return 0; +} /* end ray_dev_close */ +/*===========================================================================*/ +static void ray_reset(struct net_device *dev) { + DEBUG(1,"ray_reset entered\n"); + return; +} +/*===========================================================================*/ +/* Cause a firmware interrupt if it is ready for one */ +/* Return nonzero if not ready */ +static int interrupt_ecf(ray_dev_t *local, int ccs) +{ + int i = 50; + dev_link_t *link = local->finder; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs interrupt_ecf - device not present\n"); + return -1; + } + DEBUG(2,"interrupt_ecf(local=%p, ccs = 0x%x\n",local,ccs); + + while ( i && + (readb(local->amem + CIS_OFFSET + ECF_INTR_OFFSET) & ECF_INTR_SET)) + i--; + if (i == 0) { + DEBUG(2,"ray_cs interrupt_ecf card not ready for interrupt\n"); + return -1; + } + /* Fill the mailbox, then kick the card */ + writeb(ccs, local->sram + SCB_BASE); + writeb(ECF_INTR_SET, local->amem + CIS_OFFSET + ECF_INTR_OFFSET); + return 0; +} /* interrupt_ecf */ +/*===========================================================================*/ +/* Get next free transmit CCS */ +/* Return - index of current tx ccs */ +static int get_free_tx_ccs(ray_dev_t *local) +{ + int i; + struct ccs *pccs = (struct ccs *)(local->sram + CCS_BASE); + dev_link_t *link = local->finder; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs get_free_tx_ccs - device not present\n"); + return ECARDGONE; + } + + if (test_and_set_bit(0,&local->tx_ccs_lock)) { + DEBUG(1,"ray_cs tx_ccs_lock busy\n"); + return ECCSBUSY; + } + + for (i=0; i < NUMBER_OF_TX_CCS; i++) { + if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { + writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); + writeb(CCS_END_LIST, &(pccs+i)->link); + local->tx_ccs_lock = 0; + return i; + } + } + local->tx_ccs_lock = 0; + DEBUG(2,"ray_cs ERROR no free tx CCS for raylink card\n"); + return ECCSFULL; +} /* get_free_tx_ccs */ +/*===========================================================================*/ +/* Get next free CCS */ +/* Return - index of current ccs */ +static int get_free_ccs(ray_dev_t *local) +{ + int i; + struct ccs *pccs = (struct ccs *)(local->sram + CCS_BASE); + dev_link_t *link = local->finder; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs get_free_ccs - device not present\n"); + return ECARDGONE; + } + if (test_and_set_bit(0,&local->ccs_lock)) { + DEBUG(1,"ray_cs ccs_lock busy\n"); + return ECCSBUSY; + } + + for (i = NUMBER_OF_TX_CCS; i < NUMBER_OF_CCS; i++) { + if (readb(&(pccs+i)->buffer_status) == CCS_BUFFER_FREE) { + writeb(CCS_BUFFER_BUSY, &(pccs+i)->buffer_status); + writeb(CCS_END_LIST, &(pccs+i)->link); + local->ccs_lock = 0; + return i; + } + } + local->ccs_lock = 0; + DEBUG(1,"ray_cs ERROR no free CCS for raylink card\n"); + return ECCSFULL; +} /* get_free_ccs */ +/*===========================================================================*/ +static void authenticate_timeout(u_long data) +{ + ray_dev_t *local = (ray_dev_t *)data; + del_timer(&local->timer); + printk(KERN_INFO "ray_cs Authentication with access point failed" + " - timeout\n"); + join_net((u_long)local); +} +/*===========================================================================*/ +static int asc_to_int(char a) +{ + if (a < '0') return -1; + if (a <= '9') return (a - '0'); + if (a < 'A') return -1; + if (a <= 'F') return (10 + a - 'A'); + if (a < 'a') return -1; + if (a <= 'f') return (10 + a - 'a'); + return -1; +} +/*===========================================================================*/ +static int parse_addr(char *in_str, UCHAR *out) +{ + int len; + int i,j,k; + int status; + + if (in_str == NULL) return 0; + if ((len = strlen(in_str)) < 2) return 0; + memset(out, 0, ADDRLEN); + + status = 1; + j = len - 1; + if (j > 12) j = 12; + i = 5; + + while (j > 0) + { + if ((k = asc_to_int(in_str[j--])) != -1) out[i] = k; + else return 0; + + if (j == 0) break; + if ((k = asc_to_int(in_str[j--])) != -1) out[i] += k << 4; + else return 0; + if (!i--) break; + } + return status; +} +/*===========================================================================*/ +static struct net_device_stats *ray_get_stats(struct net_device *dev) +{ + ray_dev_t *local = (ray_dev_t *)dev->priv; + dev_link_t *link = local->finder; + struct status *p = (struct status *)(local->sram + STATUS_BASE); + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs net_device_stats - device not present\n"); + return &local->stats; + } + if (readb(&p->mrx_overflow_for_host)) + { + local->stats.rx_over_errors += ntohs(readb(&p->mrx_overflow)); + writeb(0,&p->mrx_overflow); + writeb(0,&p->mrx_overflow_for_host); + } + if (readb(&p->mrx_checksum_error_for_host)) + { + local->stats.rx_crc_errors += ntohs(readb(&p->mrx_checksum_error)); + writeb(0,&p->mrx_checksum_error); + writeb(0,&p->mrx_checksum_error_for_host); + } + if (readb(&p->rx_hec_error_for_host)) + { + local->stats.rx_frame_errors += ntohs(readb(&p->rx_hec_error)); + writeb(0,&p->rx_hec_error); + writeb(0,&p->rx_hec_error_for_host); + } + return &local->stats; +} +/*===========================================================================*/ +static void ray_update_parm(struct net_device *dev, UCHAR objid, UCHAR *value, int len) +{ + ray_dev_t *local = (ray_dev_t *)dev->priv; + dev_link_t *link = local->finder; + int ccsindex; + int i; + struct ccs *pccs; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_update_parm - device not present\n"); + return; + } + + if ((ccsindex = get_free_ccs(local)) < 0) + { + DEBUG(0,"ray_update_parm - No free ccs\n"); + return; + } + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + writeb(CCS_UPDATE_PARAMS, &pccs->cmd); + writeb(objid, &pccs->var.update_param.object_id); + writeb(1, &pccs->var.update_param.number_objects); + writeb(0, &pccs->var.update_param.failure_cause); + for (i=0; isram + HOST_TO_ECF_BASE); + } + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(0,"ray_cs associate failed - ECF not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + } +} +/*===========================================================================*/ +static void ray_update_multi_list(struct net_device *dev, int all) +{ + struct dev_mc_list *dmi, **dmip; + int ccsindex; + struct ccs *pccs; + int i = 0; + ray_dev_t *local = (ray_dev_t *)dev->priv; + dev_link_t *link = local->finder; + UCHAR *p = local->sram + HOST_TO_ECF_BASE; + + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_update_multi_list - device not present\n"); + return; + } + else + DEBUG(2,"ray_update_multi_list(%p)\n",dev); + if ((ccsindex = get_free_ccs(local)) < 0) + { + DEBUG(1,"ray_update_multi - No free ccs\n"); + return; + } + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + writeb(CCS_UPDATE_MULTICAST_LIST, &pccs->cmd); + + if (all) { + writeb(0xff, &pccs->var); + local->num_multi = 0xff; + } + else { + /* Copy the kernel's list of MC addresses to card */ + for (dmip=&dev->mc_list; (dmi=*dmip)!=NULL; dmip=&dmi->next) { + memcpy_toio(p, dmi->dmi_addr, ETH_ALEN); + DEBUG(1,"ray_update_multi add addr %02x%02x%02x%02x%02x%02x\n",dmi->dmi_addr[0],dmi->dmi_addr[1],dmi->dmi_addr[2],dmi->dmi_addr[3],dmi->dmi_addr[4],dmi->dmi_addr[5]); + p += ETH_ALEN; + i++; + } + if (i > 256/ADDRLEN) i = 256/ADDRLEN; + writeb((UCHAR)i, &pccs->var); + DEBUG(1,"ray_cs update_multi %d addresses in list\n", i); + /* Interrupt the firmware to process the command */ + local->num_multi = i; + } + if (interrupt_ecf(local, ccsindex)) { + DEBUG(1,"ray_cs update_multi failed - ECF not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + } +} /* end ray_update_multi_list */ +/*===========================================================================*/ +static void set_multicast_list(struct net_device *dev) +{ + ray_dev_t *local = (ray_dev_t *)dev->priv; + UCHAR promisc; + + DEBUG(2,"ray_cs set_multicast_list(%p)\n",dev); + + if (dev->flags & IFF_PROMISC) + { + if (local->sparm.b5.a_promiscuous_mode == 0) { + DEBUG(1,"ray_cs set_multicast_list promisc on\n"); + local->sparm.b5.a_promiscuous_mode = 1; + promisc = 1; + ray_update_parm(dev, OBJID_promiscuous_mode, \ + &promisc, sizeof(promisc)); + } + } + else { + if (local->sparm.b5.a_promiscuous_mode == 1) { + DEBUG(1,"ray_cs set_multicast_list promisc off\n"); + local->sparm.b5.a_promiscuous_mode = 0; + promisc = 0; + ray_update_parm(dev, OBJID_promiscuous_mode, \ + &promisc, sizeof(promisc)); + } + } + + if (dev->flags & IFF_ALLMULTI) ray_update_multi_list(dev, 1); + else + { + if (local->num_multi != dev->mc_count) ray_update_multi_list(dev, 0); + } +} /* end set_multicast_list */ +/*============================================================================= + * All routines below here are run at interrupt time. +=============================================================================*/ +static void ray_interrupt(int irq, void *dev_id, struct pt_regs * regs) +{ + struct net_device *dev = (struct net_device *)dev_id; + dev_link_t *link; + ray_dev_t *local; + struct ccs *pccs; + struct rcs *prcs; + UCHAR rcsindex; + UCHAR tmp; + UCHAR cmd; + UCHAR status; + + if (dev == NULL) /* Note that we want interrupts with dev->start == 0 */ + return; + + DEBUG(4,"ray_cs: interrupt for *dev=%p\n",dev); + + local = (ray_dev_t *)dev->priv; + link = (dev_link_t *)local->finder; + if ( ! (link->state & DEV_PRESENT) || link->state & DEV_SUSPEND ) { + DEBUG(2,"ray_cs interrupt from device not present or suspended.\n"); + return; + } + rcsindex = readb(&((struct scb *)(local->sram))->rcs_index); + + if (rcsindex >= (NUMBER_OF_CCS + NUMBER_OF_RCS)) + { + DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex); + clear_interrupt(local); + return; + } + if (rcsindex < NUMBER_OF_CCS) /* If it's a returned CCS */ + { + pccs = ((struct ccs *) (local->sram + CCS_BASE)) + rcsindex; + cmd = readb(&pccs->cmd); + status = readb(&pccs->buffer_status); + switch (cmd) + { + case CCS_DOWNLOAD_STARTUP_PARAMS: /* Happens in firmware someday */ + del_timer(&local->timer); + if (status == CCS_COMMAND_COMPLETE) { + DEBUG(1,"ray_cs interrupt download_startup_parameters OK\n"); + } + else { + DEBUG(1,"ray_cs interrupt download_startup_parameters fail\n"); + } + break; + case CCS_UPDATE_PARAMS: + DEBUG(1,"ray_cs interrupt update params done\n"); + if (status != CCS_COMMAND_COMPLETE) { + tmp = readb(&pccs->var.update_param.failure_cause); + DEBUG(0,"ray_cs interrupt update params failed - reason %d\n",tmp); + } + break; + case CCS_REPORT_PARAMS: + DEBUG(1,"ray_cs interrupt report params done\n"); + break; + case CCS_UPDATE_MULTICAST_LIST: /* Note that this CCS isn't returned */ + DEBUG(1,"ray_cs interrupt CCS Update Multicast List done\n"); + break; + case CCS_UPDATE_POWER_SAVINGS_MODE: + DEBUG(1,"ray_cs interrupt update power save mode done\n"); + break; + case CCS_START_NETWORK: + case CCS_JOIN_NETWORK: + if (status == CCS_COMMAND_COMPLETE) { + if (readb(&pccs->var.start_network.net_initiated) == 1) { + DEBUG(0,"ray_cs interrupt network \"%s\" started\n",\ + local->sparm.b4.a_current_ess_id); + } + else { + DEBUG(0,"ray_cs interrupt network \"%s\" joined\n",\ + local->sparm.b4.a_current_ess_id); + } + memcpy_fromio(&local->bss_id,pccs->var.start_network.bssid,ADDRLEN); + + if (local->fw_ver == 0x55) local->net_default_tx_rate = 3; + else local->net_default_tx_rate = + readb(&pccs->var.start_network.net_default_tx_rate); + local->encryption = readb(&pccs->var.start_network.encryption); + if (!sniffer && (local->net_type == INFRA) + && !(local->sparm.b4.a_acting_as_ap_status)) { + authenticate(local); + } + local->card_status = CARD_ACQ_COMPLETE; + } + else { + local->card_status = CARD_ACQ_FAILED; + + del_timer(&local->timer); + local->timer.expires = jiffies + HZ*5; + local->timer.data = (long)local; + if (status == CCS_START_NETWORK) { + DEBUG(0,"ray_cs interrupt network \"%s\" start failed\n",\ + local->sparm.b4.a_current_ess_id); + local->timer.function = &start_net; + } + else { + DEBUG(0,"ray_cs interrupt network \"%s\" join failed\n",\ + local->sparm.b4.a_current_ess_id); + local->timer.function = &join_net; + } + add_timer(&local->timer); + } + break; + case CCS_START_ASSOCIATION: + if (status == CCS_COMMAND_COMPLETE) { + local->card_status = CARD_ASSOC_COMPLETE; + DEBUG(0,"ray_cs association successful\n"); + } + else + { + DEBUG(0,"ray_cs association failed,\n"); + local->card_status = CARD_ASSOC_FAILED; + join_net((u_long)local); + } + break; + case CCS_TX_REQUEST: + if (status == CCS_COMMAND_COMPLETE) { + DEBUG(3,"ray_cs interrupt tx request complete\n"); + } + else { + DEBUG(1,"ray_cs interrupt tx request failed\n"); + } + if (!sniffer) netif_start_queue(dev); + netif_wake_queue(dev); + break; + case CCS_TEST_MEMORY: + DEBUG(1,"ray_cs interrupt mem test done\n"); + break; + case CCS_SHUTDOWN: + DEBUG(1,"ray_cs interrupt Unexpected CCS returned - Shutdown\n"); + break; + case CCS_DUMP_MEMORY: + DEBUG(1,"ray_cs interrupt dump memory done\n"); + break; + case CCS_START_TIMER: + DEBUG(2,"ray_cs interrupt DING - raylink timer expired\n"); + break; + default: + DEBUG(1,"ray_cs interrupt Unexpected CCS 0x%x returned 0x%x\n",\ + rcsindex, cmd); + } + writeb(CCS_BUFFER_FREE, &pccs->buffer_status); + } + else /* It's an RCS */ + { + prcs = ((struct rcs *)(local->sram + CCS_BASE)) + rcsindex; + + switch (readb(&prcs->interrupt_id)) + { + case PROCESS_RX_PACKET: + ray_rx(dev, local, prcs); + break; + case REJOIN_NET_COMPLETE: + DEBUG(1,"ray_cs interrupt rejoin net complete\n"); + local->card_status = CARD_ACQ_COMPLETE; + /* do we need to clear tx buffers CCS's? */ + if (local->sparm.b4.a_network_type == ADHOC) { + if (!sniffer) netif_start_queue(dev); + } + else { + memcpy_fromio(&local->bss_id, prcs->var.rejoin_net_complete.bssid, ADDRLEN); + DEBUG(1,"ray_cs new BSSID = %02x%02x%02x%02x%02x%02x\n",\ + local->bss_id[0], local->bss_id[1], local->bss_id[2],\ + local->bss_id[3], local->bss_id[4], local->bss_id[5]); + if (!sniffer) authenticate(local); + } + break; + case ROAMING_INITIATED: + DEBUG(1,"ray_cs interrupt roaming initiated\n"); + netif_stop_queue(dev); + local->card_status = CARD_DOING_ACQ; + break; + case JAPAN_CALL_SIGN_RXD: + DEBUG(1,"ray_cs interrupt japan call sign rx\n"); + break; + default: + DEBUG(1,"ray_cs Unexpected interrupt for RCS 0x%x cmd = 0x%x\n",\ + rcsindex, (unsigned int) readb(&prcs->interrupt_id)); + break; + } + writeb(CCS_BUFFER_FREE, &prcs->buffer_status); + } + clear_interrupt(local); +} /* ray_interrupt */ +/*===========================================================================*/ +static void ray_rx(struct net_device *dev, ray_dev_t *local, struct rcs *prcs) +{ + int rx_len; + unsigned int pkt_addr; + UCHAR *pmsg; + DEBUG(4,"ray_rx process rx packet\n"); + + /* Calculate address of packet within Rx buffer */ + pkt_addr = ((readb(&prcs->var.rx_packet.rx_data_ptr[0]) << 8) + + readb(&prcs->var.rx_packet.rx_data_ptr[1])) & RX_BUFF_END; + /* Length of first packet fragment */ + rx_len = (readb(&prcs->var.rx_packet.rx_data_length[0]) << 8) + + readb(&prcs->var.rx_packet.rx_data_length[1]); + + local->last_rsl = readb(&prcs->var.rx_packet.rx_sig_lev); + pmsg = local->rmem + pkt_addr; + switch(readb(pmsg)) + { + case DATA_TYPE: + DEBUG(4,"ray_rx data type\n"); + rx_data(dev, prcs, pkt_addr, rx_len); + break; + case AUTHENTIC_TYPE: + DEBUG(4,"ray_rx authentic type\n"); + if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); + else rx_authenticate(local, prcs, pkt_addr, rx_len); + break; + case DEAUTHENTIC_TYPE: + DEBUG(4,"ray_rx deauth type\n"); + if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); + else rx_deauthenticate(local, prcs, pkt_addr, rx_len); + break; + case NULL_MSG_TYPE: + DEBUG(3,"ray_cs rx NULL msg\n"); + break; + case BEACON_TYPE: + DEBUG(4,"ray_rx beacon type\n"); + if (sniffer) rx_data(dev, prcs, pkt_addr, rx_len); + + copy_from_rx_buff(local, (UCHAR *)&local->last_bcn, pkt_addr, + rx_len < sizeof(struct beacon_rx) ? + rx_len : sizeof(struct beacon_rx)); + + local->beacon_rxed = 1; + /* Get the statistics so the card counters never overflow */ + ray_get_stats(dev); + break; + default: + DEBUG(0,"ray_cs unknown pkt type %2x\n", (unsigned int) readb(pmsg)); + break; + } + +} /* end ray_rx */ +/*===========================================================================*/ +static void rx_data(struct net_device *dev, struct rcs *prcs, unsigned int pkt_addr, + int rx_len) +{ + struct sk_buff *skb = NULL; + struct rcs *prcslink = prcs; + ray_dev_t *local = dev->priv; + UCHAR *rx_ptr; + int total_len; + int tmp; +#ifdef WIRELESS_SPY + int siglev = local->last_rsl; + u_char linksrcaddr[ETH_ALEN]; /* Other end of the wireless link */ +#endif + + if (!sniffer) { + if (translate) { +/* TBD length needs fixing for translated header */ + if (rx_len < (ETH_HLEN + RX_MAC_HEADER_LENGTH) || + rx_len > (dev->mtu + RX_MAC_HEADER_LENGTH + ETH_HLEN + FCS_LEN)) + { + DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len); + return; + } + } + else /* encapsulated ethernet */ { + if (rx_len < (ETH_HLEN + RX_MAC_HEADER_LENGTH) || + rx_len > (dev->mtu + RX_MAC_HEADER_LENGTH + ETH_HLEN + FCS_LEN)) + { + DEBUG(0,"ray_cs invalid packet length %d received \n",rx_len); + return; + } + } + } + DEBUG(4,"ray_cs rx_data packet\n"); + /* If fragmented packet, verify sizes of fragments add up */ + if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) { + DEBUG(1,"ray_cs rx'ed fragment\n"); + tmp = (readb(&prcs->var.rx_packet.totalpacketlength[0]) << 8) + + readb(&prcs->var.rx_packet.totalpacketlength[1]); + total_len = tmp; + prcslink = prcs; + do { + tmp -= (readb(&prcslink->var.rx_packet.rx_data_length[0]) << 8) + + readb(&prcslink->var.rx_packet.rx_data_length[1]); + if (readb(&prcslink->var.rx_packet.next_frag_rcs_index) == 0xFF + || tmp < 0) break; + prcslink = ((struct rcs *)(local->sram + CCS_BASE)) + + readb(&prcslink->link_field); + } while (1); + + if (tmp < 0) + { + DEBUG(0,"ray_cs rx_data fragment lengths don't add up\n"); + local->stats.rx_dropped++; + release_frag_chain(local, prcs); + return; + } + } + else { /* Single unfragmented packet */ + total_len = rx_len; + } + + skb = dev_alloc_skb( total_len+5 ); + if (skb == NULL) + { + DEBUG(0,"ray_cs rx_data could not allocate skb\n"); + local->stats.rx_dropped++; + if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) + release_frag_chain(local, prcs); + return; + } + skb_reserve( skb, 2); /* Align IP on 16 byte (TBD check this)*/ + skb->dev = dev; + + DEBUG(4,"ray_cs rx_data total_len = %x, rx_len = %x\n",total_len,rx_len); + +/************************/ + /* Reserve enough room for the whole damn packet. */ + rx_ptr = skb_put( skb, total_len); + /* Copy the whole packet to sk_buff */ + rx_ptr += copy_from_rx_buff(local, rx_ptr, pkt_addr & RX_BUFF_END, rx_len); + /* Get source address */ +#ifdef WIRELESS_SPY + memcpy(linksrcaddr, ((struct mac_header *)skb->data)->addr_2, ETH_ALEN); +#endif + /* Now, deal with encapsulation/translation/sniffer */ + if (!sniffer) { + if (!translate) { + /* Encapsulated ethernet, so just lop off 802.11 MAC header */ +/* TBD reserve skb_reserve( skb, RX_MAC_HEADER_LENGTH); */ + skb_pull( skb, RX_MAC_HEADER_LENGTH); + } + else { + /* Do translation */ + untranslate(local, skb, total_len); + } + } + else + { /* sniffer mode, so just pass whole packet */ }; + +/************************/ + /* Now pick up the rest of the fragments if any */ + tmp = 17; + if (readb(&prcs->var.rx_packet.next_frag_rcs_index) != 0xFF) { + prcslink = prcs; + DEBUG(1,"ray_cs rx_data in fragment loop\n"); + do { + prcslink = ((struct rcs *)(local->sram + CCS_BASE)) + + readb(&prcslink->var.rx_packet.next_frag_rcs_index); + rx_len = (( readb(&prcslink->var.rx_packet.rx_data_length[0]) << 8) + + readb(&prcslink->var.rx_packet.rx_data_length[1])) + & RX_BUFF_END; + pkt_addr = (( readb(&prcslink->var.rx_packet.rx_data_ptr[0]) << 8) + + readb(&prcslink->var.rx_packet.rx_data_ptr[1])) + & RX_BUFF_END; + + rx_ptr += copy_from_rx_buff(local, rx_ptr, pkt_addr, rx_len); + + } while (tmp-- && + readb(&prcslink->var.rx_packet.next_frag_rcs_index) != 0xFF); + release_frag_chain(local, prcs); + } + + skb->protocol = eth_type_trans(skb,dev); + netif_rx(skb); + dev->last_rx = jiffies; + local->stats.rx_packets++; + local->stats.rx_bytes += total_len; + + /* Gather signal strength per address */ +#ifdef WIRELESS_SPY + /* For the Access Point or the node having started the ad-hoc net + * note : ad-hoc work only in some specific configurations, but we + * kludge in ray_get_wireless_stats... */ + if(!memcmp(linksrcaddr, local->bss_id, ETH_ALEN)) + { + /* Update statistics */ + /*local->wstats.qual.qual = none ? */ + local->wstats.qual.level = siglev; + /*local->wstats.qual.noise = none ? */ + local->wstats.qual.updated = 0x2; + } + /* Now, for the addresses in the spy list */ + { + int i; + /* Look all addresses */ + for(i = 0; i < local->spy_number; i++) + /* If match */ + if(!memcmp(linksrcaddr, local->spy_address[i], ETH_ALEN)) + { + /* Update statistics */ + /*local->spy_stat[i].qual = none ? */ + local->spy_stat[i].level = siglev; + /*local->spy_stat[i].noise = none ? */ + local->spy_stat[i].updated = 0x2; + } + } +#endif /* WIRELESS_SPY */ +} /* end rx_data */ +/*===========================================================================*/ +static void untranslate(ray_dev_t *local, struct sk_buff *skb, int len) +{ + snaphdr_t *psnap = (snaphdr_t *)(skb->data + RX_MAC_HEADER_LENGTH); + struct mac_header *pmac = (struct mac_header *)skb->data; + unsigned short type = *(unsigned short *)psnap->ethertype; + unsigned int xsap = *(unsigned int *)psnap & 0x00ffffff; + unsigned int org = (*(unsigned int *)psnap->org) & 0x00ffffff; + int delta; + struct ethhdr *peth; + UCHAR srcaddr[ADDRLEN]; + UCHAR destaddr[ADDRLEN]; + + if (pmac->frame_ctl_2 & FC2_FROM_DS) { + if (pmac->frame_ctl_2 & FC2_TO_DS) { /* AP to AP */ + memcpy(destaddr, pmac->addr_3, ADDRLEN); + memcpy(srcaddr, ((unsigned char *)pmac->addr_3) + ADDRLEN, ADDRLEN); + } else { /* AP to terminal */ + memcpy(destaddr, pmac->addr_1, ADDRLEN); + memcpy(srcaddr, pmac->addr_3, ADDRLEN); + } + } else { /* Terminal to AP */ + if (pmac->frame_ctl_2 & FC2_TO_DS) { + memcpy(destaddr, pmac->addr_3, ADDRLEN); + memcpy(srcaddr, pmac->addr_2, ADDRLEN); + } else { /* Adhoc */ + memcpy(destaddr, pmac->addr_1, ADDRLEN); + memcpy(srcaddr, pmac->addr_2, ADDRLEN); + } + } + +#ifdef PCMCIA_DEBUG + if (pc_debug > 3) { + int i; + printk(KERN_DEBUG "skb->data before untranslate"); + for (i=0;i<64;i++) + printk("%02x ",skb->data[i]); + printk("\n" KERN_DEBUG "type = %08x, xsap = %08x, org = %08x\n", + type,xsap,org); + printk(KERN_DEBUG "untranslate skb->data = %p\n",skb->data); + } +#endif + + if ( xsap != SNAP_ID) { + /* not a snap type so leave it alone */ + DEBUG(3,"ray_cs untranslate NOT SNAP %x\n", *(unsigned int *)psnap & 0x00ffffff); + + delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; + peth = (struct ethhdr *)(skb->data + delta); + peth->h_proto = htons(len - RX_MAC_HEADER_LENGTH); + } + else { /* Its a SNAP */ + if (org == BRIDGE_ENCAP) { /* EtherII and nuke the LLC */ + DEBUG(3,"ray_cs untranslate Bridge encap\n"); + delta = RX_MAC_HEADER_LENGTH + + sizeof(struct snaphdr_t) - ETH_HLEN; + peth = (struct ethhdr *)(skb->data + delta); + peth->h_proto = type; + } + else { + if (org == RFC1042_ENCAP) { + switch (type) { + case RAY_IPX_TYPE: + case APPLEARP_TYPE: + DEBUG(3,"ray_cs untranslate RFC IPX/AARP\n"); + delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; + peth = (struct ethhdr *)(skb->data + delta); + peth->h_proto = htons(len - RX_MAC_HEADER_LENGTH); + break; + default: + DEBUG(3,"ray_cs untranslate RFC default\n"); + delta = RX_MAC_HEADER_LENGTH + + sizeof(struct snaphdr_t) - ETH_HLEN; + peth = (struct ethhdr *)(skb->data + delta); + peth->h_proto = type; + break; + } + } + else { + printk("ray_cs untranslate very confused by packet\n"); + delta = RX_MAC_HEADER_LENGTH - ETH_HLEN; + peth = (struct ethhdr *)(skb->data + delta); + peth->h_proto = type; + } + } + } +/* TBD reserve skb_reserve(skb, delta); */ + skb_pull(skb, delta); + DEBUG(3,"untranslate after skb_pull(%d), skb->data = %p\n",delta,skb->data); + memcpy(peth->h_dest, destaddr, ADDRLEN); + memcpy(peth->h_source, srcaddr, ADDRLEN); +#ifdef PCMCIA_DEBUG + if (pc_debug > 3) { + int i; + printk(KERN_DEBUG "skb->data after untranslate:"); + for (i=0;i<64;i++) + printk("%02x ",skb->data[i]); + printk("\n"); + } +#endif +} /* end untranslate */ +/*===========================================================================*/ +/* Copy data from circular receive buffer to PC memory. + * dest = destination address in PC memory + * pkt_addr = source address in receive buffer + * len = length of packet to copy + */ +static int copy_from_rx_buff(ray_dev_t *local, UCHAR *dest, int pkt_addr, int length) +{ + int wrap_bytes = (pkt_addr + length) - (RX_BUFF_END + 1); + if (wrap_bytes <= 0) + { + memcpy_fromio(dest,local->rmem + pkt_addr,length); + } + else /* Packet wrapped in circular buffer */ + { + memcpy_fromio(dest,local->rmem+pkt_addr,length - wrap_bytes); + memcpy_fromio(dest + length - wrap_bytes, local->rmem, wrap_bytes); + } + return length; +} +/*===========================================================================*/ +static void release_frag_chain(ray_dev_t *local, struct rcs* prcs) +{ + struct rcs *prcslink = prcs; + int tmp = 17; + unsigned rcsindex = readb(&prcs->var.rx_packet.next_frag_rcs_index); + + while (tmp--) { + writeb(CCS_BUFFER_FREE, &prcslink->buffer_status); + if (rcsindex >= (NUMBER_OF_CCS + NUMBER_OF_RCS)) { + DEBUG(1,"ray_cs interrupt bad rcsindex = 0x%x\n",rcsindex); + break; + } + prcslink = ((struct rcs *)(local->sram + CCS_BASE)) + rcsindex; + rcsindex = readb(&prcslink->var.rx_packet.next_frag_rcs_index); + } + writeb(CCS_BUFFER_FREE, &prcslink->buffer_status); +} +/*===========================================================================*/ +static void authenticate(ray_dev_t *local) +{ + dev_link_t *link = local->finder; + DEBUG(0,"ray_cs Starting authentication.\n"); + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs authenticate - device not present\n"); + return; + } + + del_timer(&local->timer); + if (build_auth_frame(local, local->bss_id, OPEN_AUTH_REQUEST)) { + local->timer.function = &join_net; + } + else { + local->timer.function = &authenticate_timeout; + } + local->timer.expires = jiffies + HZ*2; + local->timer.data = (long)local; + add_timer(&local->timer); + local->authentication_state = AWAITING_RESPONSE; +} /* end authenticate */ +/*===========================================================================*/ +static void rx_authenticate(ray_dev_t *local, struct rcs *prcs, + unsigned int pkt_addr, int rx_len) +{ + UCHAR buff[256]; + struct rx_msg *msg = (struct rx_msg *)buff; + + del_timer(&local->timer); + + copy_from_rx_buff(local, buff, pkt_addr, rx_len & 0xff); + /* if we are trying to get authenticated */ + if (local->sparm.b4.a_network_type == ADHOC) { + DEBUG(1,"ray_cs rx_auth var= %02x %02x %02x %02x %02x %02x\n", msg->var[0],msg->var[1],msg->var[2],msg->var[3],msg->var[4],msg->var[5]); + if (msg->var[2] == 1) { + DEBUG(0,"ray_cs Sending authentication response.\n"); + if (!build_auth_frame (local, msg->mac.addr_2, OPEN_AUTH_RESPONSE)) { + local->authentication_state = NEED_TO_AUTH; + memcpy(local->auth_id, msg->mac.addr_2, ADDRLEN); + } + } + } + else /* Infrastructure network */ + { + if (local->authentication_state == AWAITING_RESPONSE) { + /* Verify authentication sequence #2 and success */ + if (msg->var[2] == 2) { + if ((msg->var[3] | msg->var[4]) == 0) { + DEBUG(1,"Authentication successful\n"); + local->card_status = CARD_AUTH_COMPLETE; + associate(local); + local->authentication_state = AUTHENTICATED; + } + else { + DEBUG(0,"Authentication refused\n"); + local->card_status = CARD_AUTH_REFUSED; + join_net((u_long)local); + local->authentication_state = UNAUTHENTICATED; + } + } + } + } + +} /* end rx_authenticate */ +/*===========================================================================*/ +static void associate(ray_dev_t *local) +{ + struct ccs *pccs; + dev_link_t *link = local->finder; + struct net_device *dev = link->priv; + int ccsindex; + if (!(link->state & DEV_PRESENT)) { + DEBUG(2,"ray_cs associate - device not present\n"); + return; + } + /* If no tx buffers available, return*/ + if ((ccsindex = get_free_ccs(local)) < 0) + { +/* TBD should never be here but... what if we are? */ + DEBUG(1,"ray_cs associate - No free ccs\n"); + return; + } + DEBUG(1,"ray_cs Starting association with access point\n"); + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + /* fill in the CCS */ + writeb(CCS_START_ASSOCIATION, &pccs->cmd); + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(1,"ray_cs associate failed - ECF not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + + del_timer(&local->timer); + local->timer.expires = jiffies + HZ*2; + local->timer.data = (long)local; + local->timer.function = &join_net; + add_timer(&local->timer); + local->card_status = CARD_ASSOC_FAILED; + return; + } + if (!sniffer) netif_start_queue(dev); + +} /* end associate */ +/*===========================================================================*/ +static void rx_deauthenticate(ray_dev_t *local, struct rcs *prcs, + unsigned int pkt_addr, int rx_len) +{ +/* UCHAR buff[256]; + struct rx_msg *msg = (struct rx_msg *)buff; +*/ + DEBUG(0,"Deauthentication frame received\n"); + local->authentication_state = UNAUTHENTICATED; + /* Need to reauthenticate or rejoin depending on reason code */ +/* copy_from_rx_buff(local, buff, pkt_addr, rx_len & 0xff); + */ +} +/*===========================================================================*/ +static void clear_interrupt(ray_dev_t *local) +{ + writeb(0, local->amem + CIS_OFFSET + HCS_INTR_OFFSET); +} +/*===========================================================================*/ +#ifdef CONFIG_PROC_FS +#define MAXDATA (PAGE_SIZE - 80) + +static char *card_status[] = { + "Card inserted - uninitialized", /* 0 */ + "Card not downloaded", /* 1 */ + "Waiting for download parameters", /* 2 */ + "Card doing acquisition", /* 3 */ + "Acquisition complete", /* 4 */ + "Authentication complete", /* 5 */ + "Association complete", /* 6 */ + "???", "???", "???", "???", /* 7 8 9 10 undefined */ + "Card init error", /* 11 */ + "Download parameters error", /* 12 */ + "???", /* 13 */ + "Acquisition failed", /* 14 */ + "Authentication refused", /* 15 */ + "Association failed" /* 16 */ +}; + +static char *nettype[] = {"Adhoc", "Infra "}; +static char *framing[] = {"Encapsulation", "Translation"} +; +/*===========================================================================*/ +static int ray_cs_proc_read(char *buf, char **start, off_t offset, int len) +{ +/* Print current values which are not available via other means + * eg ifconfig + */ + int i; + dev_link_t *link; + struct net_device *dev; + ray_dev_t *local; + UCHAR *p; + struct freq_hop_element *pfh; + UCHAR c[33]; + + link = dev_list; + if (!link) + return 0; + dev = (struct net_device *)link->priv; + if (!dev) + return 0; + local = (ray_dev_t *)dev->priv; + if (!local) + return 0; + + len = 0; + + len += sprintf(buf + len, "Raylink Wireless LAN driver status\n"); + len += sprintf(buf + len, "%s\n", rcsid); + /* build 4 does not report version, and field is 0x55 after memtest */ + len += sprintf(buf + len, "Firmware version = "); + if (local->fw_ver == 0x55) + len += sprintf(buf + len, "4 - Use dump_cis for more details\n"); + else + len += sprintf(buf + len, "%2d.%02d.%02d\n", + local->fw_ver, local->fw_bld, local->fw_var); + + for (i=0; i<32; i++) c[i] = local->sparm.b5.a_current_ess_id[i]; + c[32] = 0; + len += sprintf(buf + len, "%s network ESSID = \"%s\"\n", + nettype[local->sparm.b5.a_network_type], c); + + p = local->bss_id; + len += sprintf(buf + len, + "BSSID = %02x:%02x:%02x:%02x:%02x:%02x\n", + p[0],p[1],p[2],p[3],p[4],p[5]); + + len += sprintf(buf + len, "Country code = %d\n", + local->sparm.b5.a_curr_country_code); + + i = local->card_status; + if (i < 0) i = 10; + if (i > 16) i = 10; + len += sprintf(buf + len, "Card status = %s\n", card_status[i]); + + len += sprintf(buf + len, "Framing mode = %s\n",framing[translate]); + + len += sprintf(buf + len, "Last pkt signal lvl = %d\n", local->last_rsl); + + if (local->beacon_rxed) { + /* Pull some fields out of last beacon received */ + len += sprintf(buf + len, "Beacon Interval = %d Kus\n", + local->last_bcn.beacon_intvl[0] + + 256 * local->last_bcn.beacon_intvl[1]); + + p = local->last_bcn.elements; + if (p[0] == C_ESSID_ELEMENT_ID) p += p[1] + 2; + else { + len += sprintf(buf + len, "Parse beacon failed at essid element id = %d\n",p[0]); + return len; + } + + if (p[0] == C_SUPPORTED_RATES_ELEMENT_ID) { + len += sprintf(buf + len, "Supported rate codes = "); + for (i=2; idwell_time[0] + 256 * pfh->dwell_time[1]); + len += sprintf(buf + len, "Hop set = %d \n", pfh->hop_set); + len += sprintf(buf + len, "Hop pattern = %d \n", pfh->hop_pattern); + len += sprintf(buf + len, "Hop index = %d \n", pfh->hop_index); + p += p[1] + 2; + } + else { + len += sprintf(buf + len, "Parse beacon failed at FH param element\n"); + return len; + } + } else { + len += sprintf(buf + len, "No beacons received\n"); + } + return len; +} + +#endif +/*===========================================================================*/ +static int build_auth_frame(ray_dev_t *local, UCHAR *dest, int auth_type) +{ + int addr; + struct ccs *pccs; + struct tx_msg *ptx; + int ccsindex; + + /* If no tx buffers available, return */ + if ((ccsindex = get_free_tx_ccs(local)) < 0) + { + DEBUG(1,"ray_cs send authenticate - No free tx ccs\n"); + return -1; + } + + pccs = ((struct ccs *)(local->sram + CCS_BASE)) + ccsindex; + + /* Address in card space */ + addr = TX_BUF_BASE + (ccsindex << 11); + /* fill in the CCS */ + writeb(CCS_TX_REQUEST, &pccs->cmd); + writeb(addr >> 8, pccs->var.tx_request.tx_data_ptr); + writeb(0x20, pccs->var.tx_request.tx_data_ptr + 1); + writeb(TX_AUTHENTICATE_LENGTH_MSB, pccs->var.tx_request.tx_data_length); + writeb(TX_AUTHENTICATE_LENGTH_LSB,pccs->var.tx_request.tx_data_length + 1); + writeb(0, &pccs->var.tx_request.pow_sav_mode); + + ptx = (struct tx_msg *)(local->sram + addr); + /* fill in the mac header */ + writeb(PROTOCOL_VER | AUTHENTIC_TYPE, &ptx->mac.frame_ctl_1); + writeb(0, &ptx->mac.frame_ctl_2); + + memcpy_toio(ptx->mac.addr_1, dest, ADDRLEN); + memcpy_toio(ptx->mac.addr_2, local->sparm.b4.a_mac_addr, ADDRLEN); + memcpy_toio(ptx->mac.addr_3, local->bss_id, ADDRLEN); + + /* Fill in msg body with protocol 00 00, sequence 01 00 ,status 00 00 */ + memset_io(ptx->var, 0, 6); + writeb(auth_type & 0xff, ptx->var + 2); + + /* Interrupt the firmware to process the command */ + if (interrupt_ecf(local, ccsindex)) { + DEBUG(1,"ray_cs send authentication request failed - ECF not ready for intr\n"); + writeb(CCS_BUFFER_FREE, &(pccs++)->buffer_status); + return -1; + } + return 0; +} /* End build_auth_frame */ + +/*===========================================================================*/ +#ifdef CONFIG_PROC_FS +static void raycs_write(const char *name, write_proc_t *w, void *data) +{ + struct proc_dir_entry * entry = create_proc_entry(name, S_IFREG | S_IWUSR, NULL); + if (entry) { + entry->write_proc = w; + entry->data = data; + } +} + +static int write_essid(struct file *file, const char *buffer, unsigned long count, void *data) +{ + static char proc_essid[33]; + int len = count; + + if (len > 32) + len = 32; + memset(proc_essid, 0, 33); + if (copy_from_user(proc_essid, buffer, len)) + return -EFAULT; + essid = proc_essid; + return count; +} + +static int write_int(struct file *file, const char *buffer, unsigned long count, void *data) +{ + static char proc_number[10]; + char *p; + int nr, len; + + if (!count) + return 0; + + if (count > 9) + return -EINVAL; + if (copy_from_user(proc_number, buffer, count)) + return -EFAULT; + p = proc_number; + nr = 0; + len = count; + do { + unsigned int c = *p - '0'; + if (c > 9) + return -EINVAL; + nr = nr*10 + c; + p++; + } while (--len); + *(int *)data = nr; + return count; +} +#endif + +static int __init init_ray_cs(void) +{ + int rc; + + DEBUG(1, "%s\n", rcsid); + rc = register_pcmcia_driver(&dev_info, &ray_attach, &ray_detach); + DEBUG(1, "raylink init_module register_pcmcia_driver returns 0x%x\n",rc); + +#ifdef CONFIG_PROC_FS + proc_mkdir("driver/ray_cs", 0); + + create_proc_info_entry("driver/ray_cs/ray_cs", 0, NULL, &ray_cs_proc_read); + raycs_write("driver/ray_cs/essid", write_essid, NULL); + raycs_write("driver/ray_cs/net_type", write_int, &net_type); + raycs_write("driver/ray_cs/translate", write_int, &translate); +#endif + if (translate != 0) translate = 1; + return 0; +} /* init_ray_cs */ + +/*===========================================================================*/ + +static void __exit exit_ray_cs(void) +{ + DEBUG(0, "ray_cs: cleanup_module\n"); + + +#ifdef CONFIG_PROC_FS + remove_proc_entry("ray_cs", proc_root_driver); +#endif + + unregister_pcmcia_driver(&dev_info); + while (dev_list != NULL) + ray_detach(dev_list); + +#ifdef CONFIG_PROC_FS + remove_proc_entry("driver/ray_cs/ray_cs", NULL); + remove_proc_entry("driver/ray_cs/essid", NULL); + remove_proc_entry("driver/ray_cs/net_type", NULL); + remove_proc_entry("driver/ray_cs/translate", NULL); + remove_proc_entry("driver/ray_cs", NULL); +#endif +} /* exit_ray_cs */ + +module_init(init_ray_cs); +module_exit(exit_ray_cs); + +/*===========================================================================*/ diff -Nru a/drivers/net/wireless/ray_cs.h b/drivers/net/wireless/ray_cs.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/ray_cs.h Thu Feb 20 23:19:23 2003 @@ -0,0 +1,78 @@ +/* Raytheon wireless LAN PCMCIA card driver for Linux + A PCMCIA client driver for the Raylink wireless network card + Written by Corey Thomas +*/ + +#ifndef RAYLINK_H + +struct beacon_rx { + struct mac_header mac; + UCHAR timestamp[8]; + UCHAR beacon_intvl[2]; + UCHAR capability[2]; + UCHAR elements[sizeof(struct essid_element) + + sizeof(struct rates_element) + + sizeof(struct freq_hop_element) + + sizeof(struct japan_call_sign_element) + + sizeof(struct tim_element)]; +}; + +/* Return values for get_free{,_tx}_ccs */ +#define ECCSFULL (-1) +#define ECCSBUSY (-2) +#define ECARDGONE (-3) + +typedef struct ray_dev_t { + int card_status; + int authentication_state; + dev_node_t node; + window_handle_t amem_handle; /* handle to window for attribute memory */ + window_handle_t rmem_handle; /* handle to window for rx buffer on card */ + UCHAR *sram; /* pointer to beginning of shared RAM */ + UCHAR *amem; /* pointer to attribute mem window */ + UCHAR *rmem; /* pointer to receive buffer window */ + dev_link_t *finder; /* pointer back to dev_link_t for card */ + struct timer_list timer; + long tx_ccs_lock; + long ccs_lock; + int dl_param_ccs; + union { + struct b4_startup_params b4; + struct b5_startup_params b5; + } sparm; + int timeout_flag; + UCHAR supported_rates[8]; + UCHAR japan_call_sign[12]; + struct startup_res_6 startup_res; + int num_multi; + /* Network parameters from start/join */ + UCHAR bss_id[6]; + UCHAR auth_id[6]; + UCHAR net_default_tx_rate; + UCHAR encryption; + struct net_device_stats stats; + + UCHAR net_type; + UCHAR sta_type; + UCHAR fw_ver; + UCHAR fw_bld; + UCHAR fw_var; + UCHAR ASIC_version; + UCHAR assoc_id[2]; + UCHAR tib_length; + UCHAR last_rsl; + int beacon_rxed; + struct beacon_rx last_bcn; +#ifdef WIRELESS_EXT + iw_stats wstats; /* Wireless specific stats */ +#endif +#ifdef WIRELESS_SPY + int spy_number; /* Number of addresses to spy */ + mac_addr spy_address[IW_MAX_SPY + 1]; /* The addresses to spy */ + iw_qual spy_stat[IW_MAX_SPY + 1]; /* Statistics gathered */ +#endif /* WIRELESS_SPY */ + +} ray_dev_t; +/*****************************************************************************/ + +#endif /* RAYLINK_H */ diff -Nru a/drivers/net/wireless/rayctl.h b/drivers/net/wireless/rayctl.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/rayctl.h Thu Feb 20 23:19:20 2003 @@ -0,0 +1,732 @@ +#ifndef RAYLINK_H + +typedef unsigned char UCHAR; + +/****** IEEE 802.11 constants ************************************************/ +#define ADDRLEN 6 +/* Frame control 1 bit fields */ +#define PROTOCOL_VER 0x00 +#define DATA_TYPE 0x08 +#define ASSOC_REQ_TYPE 0x00 +#define ASSOC_RESP_TYPE 0x10 +#define REASSOC_REQ_TYPE 0x20 +#define REASSOC_RESP_TYPE 0x30 +#define NULL_MSG_TYPE 0x48 +#define BEACON_TYPE 0x80 +#define DISASSOC_TYPE 0xA0 +#define PSPOLL_TYPE 0xA4 +#define AUTHENTIC_TYPE 0xB0 +#define DEAUTHENTIC_TYPE 0xC0 +/* Frame control 2 bit fields */ +#define FC2_TO_DS 0x01 +#define FC2_FROM_DS 0x02 +#define FC2_MORE_FRAG 0x04 +#define FC2_RETRY 0x08 +#define FC2_PSM 0x10 +#define FC2_MORE_DATA 0x20 +#define FC2_WEP 0x40 +#define FC2_ORDER 0x80 +/*****************************************************************************/ +/* 802.11 element ID's and lengths */ +#define C_BP_CAPABILITY_ESS 0x01 +#define C_BP_CAPABILITY_IBSS 0x02 +#define C_BP_CAPABILITY_CF_POLLABLE 0x04 +#define C_BP_CAPABILITY_CF_POLL_REQUEST 0x08 +#define C_BP_CAPABILITY_PRIVACY 0x10 + +#define C_ESSID_ELEMENT_ID 0 +#define C_ESSID_ELEMENT_MAX_LENGTH 32 + +#define C_SUPPORTED_RATES_ELEMENT_ID 1 +#define C_SUPPORTED_RATES_ELEMENT_LENGTH 2 + +#define C_FH_PARAM_SET_ELEMENT_ID 2 +#define C_FH_PARAM_SET_ELEMENT_LNGTH 5 + +#define C_CF_PARAM_SET_ELEMENT_ID 4 +#define C_CF_PARAM_SET_ELEMENT_LNGTH 6 + +#define C_TIM_ELEMENT_ID 5 +#define C_TIM_BITMAP_LENGTH 251 +#define C_TIM_BMCAST_BIT 0x01 + +#define C_IBSS_ELEMENT_ID 6 +#define C_IBSS_ELEMENT_LENGTH 2 + +#define C_JAPAN_CALL_SIGN_ELEMENT_ID 51 +#define C_JAPAN_CALL_SIGN_ELEMENT_LNGTH 12 + +#define C_DISASSOC_REASON_CODE_LEN 2 +#define C_DISASSOC_REASON_CODE_DEFAULT 8 + +#define C_CRC_LEN 4 +#define C_NUM_SUPPORTED_RATES 8 +/****** IEEE 802.11 mac header for type data packets *************************/ +struct mac_header { + UCHAR frame_ctl_1; + UCHAR frame_ctl_2; + UCHAR duration_lsb; + UCHAR duration_msb; + UCHAR addr_1[ADDRLEN]; + UCHAR addr_2[ADDRLEN]; + UCHAR addr_3[ADDRLEN]; + UCHAR seq_frag_num[2]; +/* UCHAR addr_4[ADDRLEN]; *//* only present for AP to AP (TO DS and FROM DS */ +}; +/****** IEEE 802.11 frame element structures *********************************/ +struct essid_element +{ + UCHAR id; + UCHAR length; + UCHAR text[C_ESSID_ELEMENT_MAX_LENGTH]; +}; +struct rates_element +{ + UCHAR id; + UCHAR length; + UCHAR value[8]; +}; +struct freq_hop_element +{ + UCHAR id; + UCHAR length; + UCHAR dwell_time[2]; + UCHAR hop_set; + UCHAR hop_pattern; + UCHAR hop_index; +}; +struct tim_element +{ + UCHAR id; + UCHAR length; + UCHAR dtim_count; + UCHAR dtim_period; + UCHAR bitmap_control; + UCHAR tim[C_TIM_BITMAP_LENGTH]; +}; +struct ibss_element +{ + UCHAR id; + UCHAR length; + UCHAR atim_window[2]; +}; +struct japan_call_sign_element +{ + UCHAR id; + UCHAR length; + UCHAR call_sign[12]; +}; +/****** Beacon message structures ********************************************/ +/* .elements is a large lump of max size because elements are variable size */ +struct infra_beacon +{ + UCHAR timestamp[8]; + UCHAR beacon_intvl[2]; + UCHAR capability[2]; + UCHAR elements[sizeof(struct essid_element) + + sizeof(struct rates_element) + + sizeof(struct freq_hop_element) + + sizeof(struct japan_call_sign_element) + + sizeof(struct tim_element)]; +}; +struct adhoc_beacon +{ + UCHAR timestamp[8]; + UCHAR beacon_intvl[2]; + UCHAR capability[2]; + UCHAR elements[sizeof(struct essid_element) + + sizeof(struct rates_element) + + sizeof(struct freq_hop_element) + + sizeof(struct japan_call_sign_element) + + sizeof(struct ibss_element)]; +}; +/*****************************************************************************/ +/*****************************************************************************/ +/* #define C_MAC_HDR_2_WEP 0x40 */ +/* TX/RX CCS constants */ +#define TX_HEADER_LENGTH 0x1C +#define RX_MAC_HEADER_LENGTH 0x18 +#define TX_AUTHENTICATE_LENGTH (TX_HEADER_LENGTH + 6) +#define TX_AUTHENTICATE_LENGTH_MSB (TX_AUTHENTICATE_LENGTH >> 8) +#define TX_AUTHENTICATE_LENGTH_LSB (TX_AUTHENTICATE_LENGTH & 0xff) +#define TX_DEAUTHENTICATE_LENGTH (TX_HEADER_LENGTH + 2) +#define TX_DEAUTHENTICATE_LENGTH_MSB (TX_AUTHENTICATE_LENGTH >> 8) +#define TX_DEAUTHENTICATE_LENGTH_LSB (TX_AUTHENTICATE_LENGTH & 0xff) +#define FCS_LEN 4 + +#define ADHOC 0 +#define INFRA 1 + +#define TYPE_STA 0 +#define TYPE_AP 1 + +#define PASSIVE_SCAN 1 +#define ACTIVE_SCAN 1 + +#define PSM_CAM 0 + +/* Country codes */ +#define USA 1 +#define EUROPE 2 +#define JAPAN 3 +#define KOREA 4 +#define SPAIN 5 +#define FRANCE 6 +#define ISRAEL 7 +#define AUSTRALIA 8 +#define JAPAN_TEST 9 + +/* Hop pattern lengths */ +#define USA_HOP_MOD 79 +#define EUROPE_HOP_MOD 79 +#define JAPAN_HOP_MOD 23 +#define KOREA_HOP_MOD 23 +#define SPAIN_HOP_MOD 27 +#define FRANCE_HOP_MOD 35 +#define ISRAEL_HOP_MOD 35 +#define AUSTRALIA_HOP_MOD 47 +#define JAPAN_TEST_HOP_MOD 23 + +#define ESSID_SIZE 32 +/**********************************************************************/ +/* CIS Register Constants */ +#define CIS_OFFSET 0x0f00 +/* Configuration Option Register (0x0F00) */ +#define COR_OFFSET 0x00 +#define COR_SOFT_RESET 0x80 +#define COR_LEVEL_IRQ 0x40 +#define COR_CONFIG_NUM 0x01 +#define COR_DEFAULT (COR_LEVEL_IRQ | COR_CONFIG_NUM) + +/* Card Configuration and Status Register (0x0F01) */ +#define CCSR_OFFSET 0x01 +#define CCSR_HOST_INTR_PENDING 0x01 +#define CCSR_POWER_DOWN 0x04 + +/* HCS Interrupt Register (0x0F05) */ +#define HCS_INTR_OFFSET 0x05 +/* #define HCS_INTR_OFFSET 0x0A */ +#define HCS_INTR_CLEAR 0x00 + +/* ECF Interrupt Register (0x0F06) */ +#define ECF_INTR_OFFSET 0x06 +/* #define ECF_INTR_OFFSET 0x0C */ +#define ECF_INTR_SET 0x01 + +/* Authorization Register 0 (0x0F08) */ +#define AUTH_0_ON 0x57 + +/* Authorization Register 1 (0x0F09) */ +#define AUTH_1_ON 0x82 + +/* Program Mode Register (0x0F0A) */ +#define PC2PM 0x02 +#define PC2CAL 0x10 +#define PC2MLSE 0x20 + +/* PC Test Mode Register (0x0F0B) */ +#define PC_TEST_MODE 0x08 + +/* Frequency Control Word (0x0F10) */ +/* Range 0x02 - 0xA6 */ + +/* Test Mode Control 1-4 (0x0F14 - 0x0F17) */ + +/**********************************************************************/ + +/* Shared RAM Area */ +#define SCB_BASE 0x0000 +#define STATUS_BASE 0x0100 +#define HOST_TO_ECF_BASE 0x0200 +#define ECF_TO_HOST_BASE 0x0300 +#define CCS_BASE 0x0400 +#define RCS_BASE 0x0800 +#define INFRA_TIM_BASE 0x0C00 +#define SSID_LIST_BASE 0x0D00 +#define TX_BUF_BASE 0x1000 +#define RX_BUF_BASE 0x8000 + +#define NUMBER_OF_CCS 64 +#define NUMBER_OF_RCS 64 +/*#define NUMBER_OF_TX_CCS 14 */ +#define NUMBER_OF_TX_CCS 14 + +#define TX_BUF_SIZE (2048 - sizeof(struct tx_msg)) +#define RX_BUFF_END 0x3FFF +/* Values for buffer_status */ +#define CCS_BUFFER_FREE 0 +#define CCS_BUFFER_BUSY 1 +#define CCS_COMMAND_COMPLETE 2 +#define CCS_COMMAND_FAILED 3 + +/* Values for cmd */ +#define CCS_DOWNLOAD_STARTUP_PARAMS 1 +#define CCS_UPDATE_PARAMS 2 +#define CCS_REPORT_PARAMS 3 +#define CCS_UPDATE_MULTICAST_LIST 4 +#define CCS_UPDATE_POWER_SAVINGS_MODE 5 +#define CCS_START_NETWORK 6 +#define CCS_JOIN_NETWORK 7 +#define CCS_START_ASSOCIATION 8 +#define CCS_TX_REQUEST 9 +#define CCS_TEST_MEMORY 0xa +#define CCS_SHUTDOWN 0xb +#define CCS_DUMP_MEMORY 0xc +#define CCS_START_TIMER 0xe +#define CCS_LAST_CMD CCS_START_TIMER + +/* Values for link field */ +#define CCS_END_LIST 0xff + +/* values for buffer_status field */ +#define RCS_BUFFER_FREE 0 +#define RCS_BUFFER_BUSY 1 +#define RCS_COMPLETE 2 +#define RCS_FAILED 3 +#define RCS_BUFFER_RELEASE 0xFF + +/* values for interrupt_id field */ +#define PROCESS_RX_PACKET 0x80 /* */ +#define REJOIN_NET_COMPLETE 0x81 /* RCS ID: Rejoin Net Complete */ +#define ROAMING_INITIATED 0x82 /* RCS ID: Roaming Initiated */ +#define JAPAN_CALL_SIGN_RXD 0x83 /* RCS ID: New Japan Call Sign */ + +/*****************************************************************************/ +/* Memory types for dump memory command */ +#define C_MEM_PROG 0 +#define C_MEM_XDATA 1 +#define C_MEM_SFR 2 +#define C_MEM_IDATA 3 + +/*** Return values for hw_xmit **********/ +#define XMIT_OK (0) +#define XMIT_MSG_BAD (-1) +#define XMIT_NO_CCS (-2) +#define XMIT_NO_INTR (-3) +#define XMIT_NEED_AUTH (-4) + +/*** Values for card status */ +#define CARD_INSERTED (0) + +#define CARD_AWAITING_PARAM (1) +#define CARD_INIT_ERROR (11) + +#define CARD_DL_PARAM (2) +#define CARD_DL_PARAM_ERROR (12) + +#define CARD_DOING_ACQ (3) + +#define CARD_ACQ_COMPLETE (4) +#define CARD_ACQ_FAILED (14) + +#define CARD_AUTH_COMPLETE (5) +#define CARD_AUTH_REFUSED (15) + +#define CARD_ASSOC_COMPLETE (6) +#define CARD_ASSOC_FAILED (16) + +/*** Values for authentication_state ***********************************/ +#define UNAUTHENTICATED (0) +#define AWAITING_RESPONSE (1) +#define AUTHENTICATED (2) +#define NEED_TO_AUTH (3) + +/*** Values for authentication type ************************************/ +#define OPEN_AUTH_REQUEST (1) +#define OPEN_AUTH_RESPONSE (2) +#define BROADCAST_DEAUTH (0xc0) +/*** Values for timer functions ****************************************/ +#define TODO_NOTHING (0) +#define TODO_VERIFY_DL_START (-1) +#define TODO_START_NET (-2) +#define TODO_JOIN_NET (-3) +#define TODO_AUTHENTICATE_TIMEOUT (-4) +#define TODO_SEND_CCS (-5) +/***********************************************************************/ +/* Parameter passing structure for update/report parameter CCS's */ +struct object_id { + void *object_addr; + unsigned char object_length; +}; + +#define OBJID_network_type 0 +#define OBJID_acting_as_ap_status 1 +#define OBJID_current_ess_id 2 +#define OBJID_scanning_mode 3 +#define OBJID_power_mgt_state 4 +#define OBJID_mac_address 5 +#define OBJID_frag_threshold 6 +#define OBJID_hop_time 7 +#define OBJID_beacon_period 8 +#define OBJID_dtim_period 9 +#define OBJID_retry_max 10 +#define OBJID_ack_timeout 11 +#define OBJID_sifs 12 +#define OBJID_difs 13 +#define OBJID_pifs 14 +#define OBJID_rts_threshold 15 +#define OBJID_scan_dwell_time 16 +#define OBJID_max_scan_dwell_time 17 +#define OBJID_assoc_resp_timeout 18 +#define OBJID_adhoc_scan_cycle_max 19 +#define OBJID_infra_scan_cycle_max 20 +#define OBJID_infra_super_cycle_max 21 +#define OBJID_promiscuous_mode 22 +#define OBJID_unique_word 23 +#define OBJID_slot_time 24 +#define OBJID_roaming_low_snr 25 +#define OBJID_low_snr_count_thresh 26 +#define OBJID_infra_missed_bcn 27 +#define OBJID_adhoc_missed_bcn 28 +#define OBJID_curr_country_code 29 +#define OBJID_hop_pattern 30 +#define OBJID_reserved 31 +#define OBJID_cw_max_msb 32 +#define OBJID_cw_min_msb 33 +#define OBJID_noise_filter_gain 34 +#define OBJID_noise_limit_offset 35 +#define OBJID_det_rssi_thresh_offset 36 +#define OBJID_med_busy_thresh_offset 37 +#define OBJID_det_sync_thresh 38 +#define OBJID_test_mode 39 +#define OBJID_test_min_chan_num 40 +#define OBJID_test_max_chan_num 41 +#define OBJID_allow_bcast_ID_prbrsp 42 +#define OBJID_privacy_must_start 43 +#define OBJID_privacy_can_join 44 +#define OBJID_basic_rate_set 45 + +/**** Configuration/Status/Control Area ***************************/ +/* System Control Block (SCB) Area + * Located at Shared RAM offset 0 + */ +struct scb { + UCHAR ccs_index; + UCHAR rcs_index; +}; + +/****** Status area at Shared RAM offset 0x0100 ******************************/ +struct status { + UCHAR mrx_overflow_for_host; /* 0=ECF may write, 1=host may write*/ + UCHAR mrx_checksum_error_for_host; /* 0=ECF may write, 1=host may write*/ + UCHAR rx_hec_error_for_host; /* 0=ECF may write, 1=host may write*/ + UCHAR reserved1; + short mrx_overflow; /* ECF increments on rx overflow */ + short mrx_checksum_error; /* ECF increments on rx CRC error */ + short rx_hec_error; /* ECF incs on mac header CRC error */ + UCHAR rxnoise; /* Average RSL measurement */ +}; + +/****** Host-to-ECF Data Area at Shared RAM offset 0x200 *********************/ +struct host_to_ecf_area { + +}; + +/****** ECF-to-Host Data Area at Shared RAM offset 0x0300 ********************/ +struct startup_res_518 { + UCHAR startup_word; + UCHAR station_addr[ADDRLEN]; + UCHAR calc_prog_chksum; + UCHAR calc_cis_chksum; + UCHAR ecf_spare[7]; + UCHAR japan_call_sign[12]; +}; + +struct startup_res_6 { + UCHAR startup_word; + UCHAR station_addr[ADDRLEN]; + UCHAR reserved; + UCHAR supp_rates[8]; + UCHAR japan_call_sign[12]; + UCHAR calc_prog_chksum; + UCHAR calc_cis_chksum; + UCHAR firmware_version[3]; + UCHAR asic_version; + UCHAR tib_length; +}; + +struct start_join_net_params { + UCHAR net_type; + UCHAR ssid[ESSID_SIZE]; + UCHAR reserved; + UCHAR privacy_can_join; +}; + +/****** Command Control Structure area at Shared ram offset 0x0400 ***********/ +/* Structures for command specific parameters (ccs.var) */ +struct update_param_cmd { + UCHAR object_id; + UCHAR number_objects; + UCHAR failure_cause; +}; +struct report_param_cmd { + UCHAR object_id; + UCHAR number_objects; + UCHAR failure_cause; + UCHAR length; +}; +struct start_network_cmd { + UCHAR update_param; + UCHAR bssid[ADDRLEN]; + UCHAR net_initiated; + UCHAR net_default_tx_rate; + UCHAR encryption; +}; +struct join_network_cmd { + UCHAR update_param; + UCHAR bssid[ADDRLEN]; + UCHAR net_initiated; + UCHAR net_default_tx_rate; + UCHAR encryption; +}; +struct tx_requested_cmd { + + UCHAR tx_data_ptr[2]; + UCHAR tx_data_length[2]; + UCHAR host_reserved[2]; + UCHAR reserved[3]; + UCHAR tx_rate; + UCHAR pow_sav_mode; + UCHAR retries; + UCHAR antenna; +}; +struct tx_requested_cmd_4 { + + UCHAR tx_data_ptr[2]; + UCHAR tx_data_length[2]; + UCHAR dest_addr[ADDRLEN]; + UCHAR pow_sav_mode; + UCHAR retries; + UCHAR station_id; +}; +struct memory_dump_cmd { + UCHAR memory_type; + UCHAR memory_ptr[2]; + UCHAR length; +}; +struct update_association_cmd { + UCHAR status; + UCHAR aid[2]; +}; +struct start_timer_cmd { + UCHAR duration[2]; +}; + +struct ccs { + UCHAR buffer_status; /* 0 = buffer free, 1 = buffer busy */ + /* 2 = command complete, 3 = failed */ + UCHAR cmd; /* command to ECF */ + UCHAR link; /* link to next CCS, FF=end of list */ + /* command specific parameters */ + union { + char reserved[13]; + struct update_param_cmd update_param; + struct report_param_cmd report_param; + UCHAR nummulticast; + UCHAR mode; + struct start_network_cmd start_network; + struct join_network_cmd join_network; + struct tx_requested_cmd tx_request; + struct memory_dump_cmd memory_dump; + struct update_association_cmd update_assoc; + struct start_timer_cmd start_timer; + } var; +}; + +/*****************************************************************************/ +/* Transmit buffer structures */ +struct tib_structure { + UCHAR ccs_index; + UCHAR psm; + UCHAR pass_fail; + UCHAR retry_count; + UCHAR max_retries; + UCHAR frags_remaining; + UCHAR no_rb; + UCHAR rts_reqd; + UCHAR csma_tx_cntrl_2; + UCHAR sifs_tx_cntrl_2; + UCHAR tx_dma_addr_1[2]; + UCHAR tx_dma_addr_2[2]; + UCHAR var_dur_2mhz[2]; + UCHAR var_dur_1mhz[2]; + UCHAR max_dur_2mhz[2]; + UCHAR max_dur_1mhz[2]; + UCHAR hdr_len; + UCHAR max_frag_len[2]; + UCHAR var_len[2]; + UCHAR phy_hdr_4; + UCHAR mac_hdr_1; + UCHAR mac_hdr_2; + UCHAR sid[2]; +}; + +struct phy_header { + UCHAR sfd[2]; + UCHAR hdr_3; + UCHAR hdr_4; +}; +struct rx_msg { + struct mac_header mac; + UCHAR var[1]; +}; + +struct tx_msg { + struct tib_structure tib; + struct phy_header phy; + struct mac_header mac; + UCHAR var[1]; +}; + +/****** ECF Receive Control Stucture (RCS) Area at Shared RAM offset 0x0800 */ +/* Structures for command specific parameters (rcs.var) */ +struct rx_packet_cmd { + UCHAR rx_data_ptr[2]; + UCHAR rx_data_length[2]; + UCHAR rx_sig_lev; + UCHAR next_frag_rcs_index; + UCHAR totalpacketlength[2]; +}; +struct rejoin_net_cmplt_cmd { + UCHAR reserved; + UCHAR bssid[ADDRLEN]; +}; +struct japan_call_sign_rxd { + UCHAR rxd_call_sign[8]; + UCHAR reserved[5]; +}; + +struct rcs { + UCHAR buffer_status; + UCHAR interrupt_id; + UCHAR link_field; + /* command specific parameters */ + union { + UCHAR reserved[13]; + struct rx_packet_cmd rx_packet; + struct rejoin_net_cmplt_cmd rejoin_net_complete; + struct japan_call_sign_rxd japan_call_sign; + } var; +}; + +/****** Startup parameter structures for both versions of firmware ***********/ +struct b4_startup_params { + UCHAR a_network_type; /* C_ADHOC, C_INFRA */ + UCHAR a_acting_as_ap_status; /* C_TYPE_STA, C_TYPE_AP */ + UCHAR a_current_ess_id[ESSID_SIZE]; /* Null terminated unless 32 long */ + UCHAR a_scanning_mode; /* passive 0, active 1 */ + UCHAR a_power_mgt_state; /* CAM 0, */ + UCHAR a_mac_addr[ADDRLEN]; /* */ + UCHAR a_frag_threshold[2]; /* 512 */ + UCHAR a_hop_time[2]; /* 16k * 2**n, n=0-4 in Kus */ + UCHAR a_beacon_period[2]; /* n * a_hop_time in Kus */ + UCHAR a_dtim_period; /* in beacons */ + UCHAR a_retry_max; /* */ + UCHAR a_ack_timeout; /* */ + UCHAR a_sifs; /* */ + UCHAR a_difs; /* */ + UCHAR a_pifs; /* */ + UCHAR a_rts_threshold[2]; /* */ + UCHAR a_scan_dwell_time[2]; /* */ + UCHAR a_max_scan_dwell_time[2]; /* */ + UCHAR a_assoc_resp_timeout_thresh; /* */ + UCHAR a_adhoc_scan_cycle_max; /* */ + UCHAR a_infra_scan_cycle_max; /* */ + UCHAR a_infra_super_scan_cycle_max; /* */ + UCHAR a_promiscuous_mode; /* */ + UCHAR a_unique_word[2]; /* */ + UCHAR a_slot_time; /* */ + UCHAR a_roaming_low_snr_thresh; /* */ + UCHAR a_low_snr_count_thresh; /* */ + UCHAR a_infra_missed_bcn_thresh; /* */ + UCHAR a_adhoc_missed_bcn_thresh; /* */ + UCHAR a_curr_country_code; /* C_USA */ + UCHAR a_hop_pattern; /* */ + UCHAR a_hop_pattern_length; /* */ +/* b4 - b5 differences start here */ + UCHAR a_cw_max; /* */ + UCHAR a_cw_min; /* */ + UCHAR a_noise_filter_gain; /* */ + UCHAR a_noise_limit_offset; /* */ + UCHAR a_det_rssi_thresh_offset; /* */ + UCHAR a_med_busy_thresh_offset; /* */ + UCHAR a_det_sync_thresh; /* */ + UCHAR a_test_mode; /* */ + UCHAR a_test_min_chan_num; /* */ + UCHAR a_test_max_chan_num; /* */ + UCHAR a_rx_tx_delay; /* */ + UCHAR a_current_bss_id[ADDRLEN]; /* */ + UCHAR a_hop_set; /* */ +}; +struct b5_startup_params { + UCHAR a_network_type; /* C_ADHOC, C_INFRA */ + UCHAR a_acting_as_ap_status; /* C_TYPE_STA, C_TYPE_AP */ + UCHAR a_current_ess_id[ESSID_SIZE]; /* Null terminated unless 32 long */ + UCHAR a_scanning_mode; /* passive 0, active 1 */ + UCHAR a_power_mgt_state; /* CAM 0, */ + UCHAR a_mac_addr[ADDRLEN]; /* */ + UCHAR a_frag_threshold[2]; /* 512 */ + UCHAR a_hop_time[2]; /* 16k * 2**n, n=0-4 in Kus */ + UCHAR a_beacon_period[2]; /* n * a_hop_time in Kus */ + UCHAR a_dtim_period; /* in beacons */ + UCHAR a_retry_max; /* 4 */ + UCHAR a_ack_timeout; /* */ + UCHAR a_sifs; /* */ + UCHAR a_difs; /* */ + UCHAR a_pifs; /* */ + UCHAR a_rts_threshold[2]; /* */ + UCHAR a_scan_dwell_time[2]; /* */ + UCHAR a_max_scan_dwell_time[2]; /* */ + UCHAR a_assoc_resp_timeout_thresh; /* */ + UCHAR a_adhoc_scan_cycle_max; /* */ + UCHAR a_infra_scan_cycle_max; /* */ + UCHAR a_infra_super_scan_cycle_max; /* */ + UCHAR a_promiscuous_mode; /* */ + UCHAR a_unique_word[2]; /* */ + UCHAR a_slot_time; /* */ + UCHAR a_roaming_low_snr_thresh; /* */ + UCHAR a_low_snr_count_thresh; /* */ + UCHAR a_infra_missed_bcn_thresh; /* */ + UCHAR a_adhoc_missed_bcn_thresh; /* */ + UCHAR a_curr_country_code; /* C_USA */ + UCHAR a_hop_pattern; /* */ + UCHAR a_hop_pattern_length; /* */ +/* b4 - b5 differences start here */ + UCHAR a_cw_max[2]; /* */ + UCHAR a_cw_min[2]; /* */ + UCHAR a_noise_filter_gain; /* */ + UCHAR a_noise_limit_offset; /* */ + UCHAR a_det_rssi_thresh_offset; /* */ + UCHAR a_med_busy_thresh_offset; /* */ + UCHAR a_det_sync_thresh; /* */ + UCHAR a_test_mode; /* */ + UCHAR a_test_min_chan_num; /* */ + UCHAR a_test_max_chan_num; /* */ + UCHAR a_allow_bcast_SSID_probe_rsp; + UCHAR a_privacy_must_start; + UCHAR a_privacy_can_join; + UCHAR a_basic_rate_set[8]; +}; + +/*****************************************************************************/ +#define RAY_IOCG_PARMS (SIOCDEVPRIVATE) +#define RAY_IOCS_PARMS (SIOCDEVPRIVATE + 1) +#define RAY_DO_CMD (SIOCDEVPRIVATE + 2) + +/****** ethernet <-> 802.11 translation **************************************/ +typedef struct snaphdr_t +{ + UCHAR dsap; + UCHAR ssap; + UCHAR ctrl; + UCHAR org[3]; + UCHAR ethertype[2]; +} snaphdr_t; + +#define BRIDGE_ENCAP 0xf80000 +#define RFC1042_ENCAP 0 +#define SNAP_ID 0x0003aaaa +#define RAY_IPX_TYPE 0x8137 +#define APPLEARP_TYPE 0x80f3 +/*****************************************************************************/ +#endif /* #ifndef RAYLINK_H */ diff -Nru a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/strip.c Thu Feb 20 23:19:22 2003 @@ -0,0 +1,2877 @@ +/* + * Copyright 1996 The Board of Trustees of The Leland Stanford + * Junior University. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies. Stanford University + * makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without + * express or implied warranty. + * + * strip.c This module implements Starmode Radio IP (STRIP) + * for kernel-based devices like TTY. It interfaces between a + * raw TTY, and the kernel's INET protocol layers (via DDI). + * + * Version: @(#)strip.c 1.3 July 1997 + * + * Author: Stuart Cheshire + * + * Fixes: v0.9 12th Feb 1996 (SC) + * New byte stuffing (2+6 run-length encoding) + * New watchdog timer task + * New Protocol key (SIP0) + * + * v0.9.1 3rd March 1996 (SC) + * Changed to dynamic device allocation -- no more compile + * time (or boot time) limit on the number of STRIP devices. + * + * v0.9.2 13th March 1996 (SC) + * Uses arp cache lookups (but doesn't send arp packets yet) + * + * v0.9.3 17th April 1996 (SC) + * Fixed bug where STR_ERROR flag was getting set unneccessarily + * (causing otherwise good packets to be unneccessarily dropped) + * + * v0.9.4 27th April 1996 (SC) + * First attempt at using "&COMMAND" Starmode AT commands + * + * v0.9.5 29th May 1996 (SC) + * First attempt at sending (unicast) ARP packets + * + * v0.9.6 5th June 1996 (Elliot) + * Put "message level" tags in every "printk" statement + * + * v0.9.7 13th June 1996 (laik) + * Added support for the /proc fs + * + * v0.9.8 July 1996 (Mema) + * Added packet logging + * + * v1.0 November 1996 (SC) + * Fixed (severe) memory leaks in the /proc fs code + * Fixed race conditions in the logging code + * + * v1.1 January 1997 (SC) + * Deleted packet logging (use tcpdump instead) + * Added support for Metricom Firmware v204 features + * (like message checksums) + * + * v1.2 January 1997 (SC) + * Put portables list back in + * + * v1.3 July 1997 (SC) + * Made STRIP driver set the radio's baud rate automatically. + * It is no longer necessarily to manually set the radio's + * rate permanently to 115200 -- the driver handles setting + * the rate automatically. + */ + +#ifdef MODULE +static const char StripVersion[] = "1.3-STUART.CHESHIRE-MODULAR"; +#else +static const char StripVersion[] = "1.3-STUART.CHESHIRE"; +#endif + +#define TICKLE_TIMERS 0 +#define EXT_COUNTERS 1 + + +/************************************************************************/ +/* Header files */ + +#include +#include +#include +#include +#include +#include +#include + +/* + * isdigit() and isspace() use the ctype[] array, which is not available + * to kernel modules. If compiling as a module, use a local definition + * of isdigit() and isspace() until _ctype is added to ksyms. + */ +#ifdef MODULE +# define isdigit(c) ('0' <= (c) && (c) <= '9') +# define isspace(c) ((c) == ' ' || (c) == '\t') +#else +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +/************************************************************************/ +/* Useful structures and definitions */ + +/* + * A MetricomKey identifies the protocol being carried inside a Metricom + * Starmode packet. + */ + +typedef union +{ + __u8 c[4]; + __u32 l; +} MetricomKey; + +/* + * An IP address can be viewed as four bytes in memory (which is what it is) or as + * a single 32-bit long (which is convenient for assignment, equality testing etc.) + */ + +typedef union +{ + __u8 b[4]; + __u32 l; +} IPaddr; + +/* + * A MetricomAddressString is used to hold a printable representation of + * a Metricom address. + */ + +typedef struct +{ + __u8 c[24]; +} MetricomAddressString; + +/* Encapsulation can expand packet of size x to 65/64x + 1 + * Sent packet looks like "*
*" + * 1 1 1-18 1 4 ? 1 + * eg. *0000-1234*SIP0 + * We allow 31 bytes for the stars, the key, the address and the s + */ +#define STRIP_ENCAP_SIZE(X) (32 + (X)*65L/64L) + +/* + * A STRIP_Header is never really sent over the radio, but making a dummy + * header for internal use within the kernel that looks like an Ethernet + * header makes certain other software happier. For example, tcpdump + * already understands Ethernet headers. + */ + +typedef struct +{ + MetricomAddress dst_addr; /* Destination address, e.g. "0000-1234" */ + MetricomAddress src_addr; /* Source address, e.g. "0000-5678" */ + unsigned short protocol; /* The protocol type, using Ethernet codes */ +} STRIP_Header; + +typedef struct +{ + char c[60]; +} MetricomNode; + +#define NODE_TABLE_SIZE 32 +typedef struct +{ + struct timeval timestamp; + int num_nodes; + MetricomNode node[NODE_TABLE_SIZE]; +} MetricomNodeTable; + +enum { FALSE = 0, TRUE = 1 }; + +/* + * Holds the radio's firmware version. + */ +typedef struct +{ + char c[50]; +} FirmwareVersion; + +/* + * Holds the radio's serial number. + */ +typedef struct +{ + char c[18]; +} SerialNumber; + +/* + * Holds the radio's battery voltage. + */ +typedef struct +{ + char c[11]; +} BatteryVoltage; + +typedef struct +{ + char c[8]; +} char8; + +enum +{ + NoStructure = 0, /* Really old firmware */ + StructuredMessages = 1, /* Parsable AT response msgs */ + ChecksummedMessages = 2 /* Parsable AT response msgs with checksums */ +} FirmwareLevel; + +struct strip +{ + int magic; + /* + * These are pointers to the malloc()ed frame buffers. + */ + + unsigned char *rx_buff; /* buffer for received IP packet*/ + unsigned char *sx_buff; /* buffer for received serial data*/ + int sx_count; /* received serial data counter */ + int sx_size; /* Serial buffer size */ + unsigned char *tx_buff; /* transmitter buffer */ + unsigned char *tx_head; /* pointer to next byte to XMIT */ + int tx_left; /* bytes left in XMIT queue */ + int tx_size; /* Serial buffer size */ + + /* + * STRIP interface statistics. + */ + + unsigned long rx_packets; /* inbound frames counter */ + unsigned long tx_packets; /* outbound frames counter */ + unsigned long rx_errors; /* Parity, etc. errors */ + unsigned long tx_errors; /* Planned stuff */ + unsigned long rx_dropped; /* No memory for skb */ + unsigned long tx_dropped; /* When MTU change */ + unsigned long rx_over_errors; /* Frame bigger then STRIP buf. */ + + unsigned long pps_timer; /* Timer to determine pps */ + unsigned long rx_pps_count; /* Counter to determine pps */ + unsigned long tx_pps_count; /* Counter to determine pps */ + unsigned long sx_pps_count; /* Counter to determine pps */ + unsigned long rx_average_pps; /* rx packets per second * 8 */ + unsigned long tx_average_pps; /* tx packets per second * 8 */ + unsigned long sx_average_pps; /* sent packets per second * 8 */ + +#ifdef EXT_COUNTERS + unsigned long rx_bytes; /* total received bytes */ + unsigned long tx_bytes; /* total received bytes */ + unsigned long rx_rbytes; /* bytes thru radio i/f */ + unsigned long tx_rbytes; /* bytes thru radio i/f */ + unsigned long rx_sbytes; /* tot bytes thru serial i/f */ + unsigned long tx_sbytes; /* tot bytes thru serial i/f */ + unsigned long rx_ebytes; /* tot stat/err bytes */ + unsigned long tx_ebytes; /* tot stat/err bytes */ +#endif + + /* + * Internal variables. + */ + + struct strip *next; /* The next struct in the list */ + struct strip **referrer; /* The pointer that points to us*/ + int discard; /* Set if serial error */ + int working; /* Is radio working correctly? */ + int firmware_level; /* Message structuring level */ + int next_command; /* Next periodic command */ + unsigned int user_baud; /* The user-selected baud rate */ + int mtu; /* Our mtu (to spot changes!) */ + long watchdog_doprobe; /* Next time to test the radio */ + long watchdog_doreset; /* Time to do next reset */ + long gratuitous_arp; /* Time to send next ARP refresh*/ + long arp_interval; /* Next ARP interval */ + struct timer_list idle_timer; /* For periodic wakeup calls */ + MetricomAddress true_dev_addr; /* True address of radio */ + int manual_dev_addr; /* Hack: See note below */ + + FirmwareVersion firmware_version; /* The radio's firmware version */ + SerialNumber serial_number; /* The radio's serial number */ + BatteryVoltage battery_voltage; /* The radio's battery voltage */ + + /* + * Other useful structures. + */ + + struct tty_struct *tty; /* ptr to TTY structure */ + struct net_device dev; /* Our device structure */ + + /* + * Neighbour radio records + */ + + MetricomNodeTable portables; + MetricomNodeTable poletops; +}; + +/* + * Note: manual_dev_addr hack + * + * It is not possible to change the hardware address of a Metricom radio, + * or to send packets with a user-specified hardware source address, thus + * trying to manually set a hardware source address is a questionable + * thing to do. However, if the user *does* manually set the hardware + * source address of a STRIP interface, then the kernel will believe it, + * and use it in certain places. For example, the hardware address listed + * by ifconfig will be the manual address, not the true one. + * (Both addresses are listed in /proc/net/strip.) + * Also, ARP packets will be sent out giving the user-specified address as + * the source address, not the real address. This is dangerous, because + * it means you won't receive any replies -- the ARP replies will go to + * the specified address, which will be some other radio. The case where + * this is useful is when that other radio is also connected to the same + * machine. This allows you to connect a pair of radios to one machine, + * and to use one exclusively for inbound traffic, and the other + * exclusively for outbound traffic. Pretty neat, huh? + * + * Here's the full procedure to set this up: + * + * 1. "slattach" two interfaces, e.g. st0 for outgoing packets, + * and st1 for incoming packets + * + * 2. "ifconfig" st0 (outbound radio) to have the hardware address + * which is the real hardware address of st1 (inbound radio). + * Now when it sends out packets, it will masquerade as st1, and + * replies will be sent to that radio, which is exactly what we want. + * + * 3. Set the route table entry ("route add default ..." or + * "route add -net ...", as appropriate) to send packets via the st0 + * interface (outbound radio). Do not add any route which sends packets + * out via the st1 interface -- that radio is for inbound traffic only. + * + * 4. "ifconfig" st1 (inbound radio) to have hardware address zero. + * This tells the STRIP driver to "shut down" that interface and not + * send any packets through it. In particular, it stops sending the + * periodic gratuitous ARP packets that a STRIP interface normally sends. + * Also, when packets arrive on that interface, it will search the + * interface list to see if there is another interface who's manual + * hardware address matches its own real address (i.e. st0 in this + * example) and if so it will transfer ownership of the skbuff to + * that interface, so that it looks to the kernel as if the packet + * arrived on that interface. This is necessary because when the + * kernel sends an ARP packet on st0, it expects to get a reply on + * st0, and if it sees the reply come from st1 then it will ignore + * it (to be accurate, it puts the entry in the ARP table, but + * labelled in such a way that st0 can't use it). + * + * Thanks to Petros Maniatis for coming up with the idea of splitting + * inbound and outbound traffic between two interfaces, which turned + * out to be really easy to implement, even if it is a bit of a hack. + * + * Having set a manual address on an interface, you can restore it + * to automatic operation (where the address is automatically kept + * consistent with the real address of the radio) by setting a manual + * address of all ones, e.g. "ifconfig st0 hw strip FFFFFFFFFFFF" + * This 'turns off' manual override mode for the device address. + * + * Note: The IEEE 802 headers reported in tcpdump will show the *real* + * radio addresses the packets were sent and received from, so that you + * can see what is really going on with packets, and which interfaces + * they are really going through. + */ + + +/************************************************************************/ +/* Constants */ + +/* + * CommandString1 works on all radios + * Other CommandStrings are only used with firmware that provides structured responses. + * + * ats319=1 Enables Info message for node additions and deletions + * ats319=2 Enables Info message for a new best node + * ats319=4 Enables checksums + * ats319=8 Enables ACK messages + */ + +static const int MaxCommandStringLength = 32; +static const int CompatibilityCommand = 1; + +static const char CommandString0[] = "*&COMMAND*ATS319=7"; /* Turn on checksums & info messages */ +static const char CommandString1[] = "*&COMMAND*ATS305?"; /* Query radio name */ +static const char CommandString2[] = "*&COMMAND*ATS325?"; /* Query battery voltage */ +static const char CommandString3[] = "*&COMMAND*ATS300?"; /* Query version information */ +static const char CommandString4[] = "*&COMMAND*ATS311?"; /* Query poletop list */ +static const char CommandString5[] = "*&COMMAND*AT~LA"; /* Query portables list */ +typedef struct { const char *string; long length; } StringDescriptor; + +static const StringDescriptor CommandString[] = + { + { CommandString0, sizeof(CommandString0)-1 }, + { CommandString1, sizeof(CommandString1)-1 }, + { CommandString2, sizeof(CommandString2)-1 }, + { CommandString3, sizeof(CommandString3)-1 }, + { CommandString4, sizeof(CommandString4)-1 }, + { CommandString5, sizeof(CommandString5)-1 } + }; + +#define GOT_ALL_RADIO_INFO(S) \ + ((S)->firmware_version.c[0] && \ + (S)->battery_voltage.c[0] && \ + memcmp(&(S)->true_dev_addr, zero_address.c, sizeof(zero_address))) + +static const char hextable[16] = "0123456789ABCDEF"; + +static const MetricomAddress zero_address; +static const MetricomAddress broadcast_address = { { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF } }; + +static const MetricomKey SIP0Key = { { "SIP0" } }; +static const MetricomKey ARP0Key = { { "ARP0" } }; +static const MetricomKey ATR_Key = { { "ATR " } }; +static const MetricomKey ACK_Key = { { "ACK_" } }; +static const MetricomKey INF_Key = { { "INF_" } }; +static const MetricomKey ERR_Key = { { "ERR_" } }; + +static const long MaxARPInterval = 60 * HZ; /* One minute */ + +/* + * Maximum Starmode packet length is 1183 bytes. Allowing 4 bytes for + * protocol key, 4 bytes for checksum, one byte for CR, and 65/64 expansion + * for STRIP encoding, that translates to a maximum payload MTU of 1155. + * Note: A standard NFS 1K data packet is a total of 0x480 (1152) bytes + * long, including IP header, UDP header, and NFS header. Setting the STRIP + * MTU to 1152 allows us to send default sized NFS packets without fragmentation. + */ +static const unsigned short MAX_SEND_MTU = 1152; +static const unsigned short MAX_RECV_MTU = 1500; /* Hoping for Ethernet sized packets in the future! */ +static const unsigned short DEFAULT_STRIP_MTU = 1152; +static const int STRIP_MAGIC = 0x5303; +static const long LongTime = 0x7FFFFFFF; + + +/************************************************************************/ +/* Global variables */ + +static struct strip *struct_strip_list; + + +/************************************************************************/ +/* Macros */ + +/* Returns TRUE if text T begins with prefix P */ +#define has_prefix(T,L,P) (((L) >= sizeof(P)-1) && !strncmp((T), (P), sizeof(P)-1)) + +/* Returns TRUE if text T of length L is equal to string S */ +#define text_equal(T,L,S) (((L) == sizeof(S)-1) && !strncmp((T), (S), sizeof(S)-1)) + +#define READHEX(X) ((X)>='0' && (X)<='9' ? (X)-'0' : \ + (X)>='a' && (X)<='f' ? (X)-'a'+10 : \ + (X)>='A' && (X)<='F' ? (X)-'A'+10 : 0 ) + +#define READHEX16(X) ((__u16)(READHEX(X))) + +#define READDEC(X) ((X)>='0' && (X)<='9' ? (X)-'0' : 0) + +#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) +#define ELEMENTS_OF(X) (sizeof(X) / sizeof((X)[0])) +#define ARRAY_END(X) (&((X)[ELEMENTS_OF(X)])) + +#define JIFFIE_TO_SEC(X) ((X) / HZ) + + +/************************************************************************/ +/* Utility routines */ + +typedef unsigned long InterruptStatus; + +static inline InterruptStatus DisableInterrupts(void) +{ + InterruptStatus x; + save_flags(x); + cli(); + return(x); +} + +static inline void RestoreInterrupts(InterruptStatus x) +{ + restore_flags(x); +} + +static int arp_query(unsigned char *haddr, u32 paddr, struct net_device * dev) +{ + struct neighbour *neighbor_entry; + + neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev); + + if (neighbor_entry != NULL) + { + neighbor_entry->used = jiffies; + if (neighbor_entry->nud_state & NUD_VALID) + { + memcpy(haddr, neighbor_entry->ha, dev->addr_len); + return 1; + } + } + return 0; +} + +static void DumpData(char *msg, struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + static const int MAX_DumpData = 80; + __u8 pkt_text[MAX_DumpData], *p = pkt_text; + + *p++ = '\"'; + + while (ptr= 32 && *ptr <= 126) + { + *p++ = *ptr; + } + else + { + sprintf(p, "\\%02X", *ptr); + p+= 3; + } + } + ptr++; + } + + if (ptr == end) + { + *p++ = '\"'; + } + + *p++ = 0; + + printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev.name, msg, pkt_text); +} + +#if 0 +static void HexDump(char *msg, struct strip *strip_info, __u8 *start, __u8 *end) +{ + __u8 *ptr = start; + printk(KERN_INFO "%s: %s: %d bytes\n", strip_info->dev.name, msg, end-ptr); + + while (ptr < end) + { + long offset = ptr - start; + __u8 text[80], *p = text; + while (ptr < end && p < &text[16*3]) + { + *p++ = hextable[*ptr >> 4]; + *p++ = hextable[*ptr++ & 0xF]; + *p++ = ' '; + } + p[-1] = 0; + printk(KERN_INFO "%s: %4lX %s\n", strip_info->dev.name, offset, text); + } +} +#endif + + +/************************************************************************/ +/* Byte stuffing/unstuffing routines */ + +/* Stuffing scheme: + * 00 Unused (reserved character) + * 01-3F Run of 2-64 different characters + * 40-7F Run of 1-64 different characters plus a single zero at the end + * 80-BF Run of 1-64 of the same character + * C0-FF Run of 1-64 zeroes (ASCII 0) + */ + +typedef enum +{ + Stuff_Diff = 0x00, + Stuff_DiffZero = 0x40, + Stuff_Same = 0x80, + Stuff_Zero = 0xC0, + Stuff_NoCode = 0xFF, /* Special code, meaning no code selected */ + + Stuff_CodeMask = 0xC0, + Stuff_CountMask = 0x3F, + Stuff_MaxCount = 0x3F, + Stuff_Magic = 0x0D /* The value we are eliminating */ +} StuffingCode; + +/* StuffData encodes the data starting at "src" for "length" bytes. + * It writes it to the buffer pointed to by "dst" (which must be at least + * as long as 1 + 65/64 of the input length). The output may be up to 1.6% + * larger than the input for pathological input, but will usually be smaller. + * StuffData returns the new value of the dst pointer as its result. + * "code_ptr_ptr" points to a "__u8 *" which is used to hold encoding state + * between calls, allowing an encoded packet to be incrementally built up + * from small parts. On the first call, the "__u8 *" pointed to should be + * initialized to NULL; between subsequent calls the calling routine should + * leave the value alone and simply pass it back unchanged so that the + * encoder can recover its current state. + */ + +#define StuffData_FinishBlock(X) \ +(*code_ptr = (X) ^ Stuff_Magic, code = Stuff_NoCode) + +static __u8 *StuffData(__u8 *src, __u32 length, __u8 *dst, __u8 **code_ptr_ptr) +{ + __u8 *end = src + length; + __u8 *code_ptr = *code_ptr_ptr; + __u8 code = Stuff_NoCode, count = 0; + + if (!length) + return(dst); + + if (code_ptr) + { + /* + * Recover state from last call, if applicable + */ + code = (*code_ptr ^ Stuff_Magic) & Stuff_CodeMask; + count = (*code_ptr ^ Stuff_Magic) & Stuff_CountMask; + } + + while (src < end) + { + switch (code) + { + /* Stuff_NoCode: If no current code, select one */ + case Stuff_NoCode: + /* Record where we're going to put this code */ + code_ptr = dst++; + count = 0; /* Reset the count (zero means one instance) */ + /* Tentatively start a new block */ + if (*src == 0) + { + code = Stuff_Zero; + src++; + } + else + { + code = Stuff_Same; + *dst++ = *src++ ^ Stuff_Magic; + } + /* Note: We optimistically assume run of same -- */ + /* which will be fixed later in Stuff_Same */ + /* if it turns out not to be true. */ + break; + + /* Stuff_Zero: We already have at least one zero encoded */ + case Stuff_Zero: + /* If another zero, count it, else finish this code block */ + if (*src == 0) + { + count++; + src++; + } + else + { + StuffData_FinishBlock(Stuff_Zero + count); + } + break; + + /* Stuff_Same: We already have at least one byte encoded */ + case Stuff_Same: + /* If another one the same, count it */ + if ((*src ^ Stuff_Magic) == code_ptr[1]) + { + count++; + src++; + break; + } + /* else, this byte does not match this block. */ + /* If we already have two or more bytes encoded, finish this code block */ + if (count) + { + StuffData_FinishBlock(Stuff_Same + count); + break; + } + /* else, we only have one so far, so switch to Stuff_Diff code */ + code = Stuff_Diff; + /* and fall through to Stuff_Diff case below + * Note cunning cleverness here: case Stuff_Diff compares + * the current character with the previous two to see if it + * has a run of three the same. Won't this be an error if + * there aren't two previous characters stored to compare with? + * No. Because we know the current character is *not* the same + * as the previous one, the first test below will necessarily + * fail and the send half of the "if" won't be executed. + */ + + /* Stuff_Diff: We have at least two *different* bytes encoded */ + case Stuff_Diff: + /* If this is a zero, must encode a Stuff_DiffZero, and begin a new block */ + if (*src == 0) + { + StuffData_FinishBlock(Stuff_DiffZero + count); + } + /* else, if we have three in a row, it is worth starting a Stuff_Same block */ + else if ((*src ^ Stuff_Magic)==dst[-1] && dst[-1]==dst[-2]) + { + /* Back off the last two characters we encoded */ + code += count-2; + /* Note: "Stuff_Diff + 0" is an illegal code */ + if (code == Stuff_Diff + 0) + { + code = Stuff_Same + 0; + } + StuffData_FinishBlock(code); + code_ptr = dst-2; + /* dst[-1] already holds the correct value */ + count = 2; /* 2 means three bytes encoded */ + code = Stuff_Same; + } + /* else, another different byte, so add it to the block */ + else + { + *dst++ = *src ^ Stuff_Magic; + count++; + } + src++; /* Consume the byte */ + break; + } + if (count == Stuff_MaxCount) + { + StuffData_FinishBlock(code + count); + } + } + if (code == Stuff_NoCode) + { + *code_ptr_ptr = NULL; + } + else + { + *code_ptr_ptr = code_ptr; + StuffData_FinishBlock(code + count); + } + return(dst); +} + +/* + * UnStuffData decodes the data at "src", up to (but not including) "end". + * It writes the decoded data into the buffer pointed to by "dst", up to a + * maximum of "dst_length", and returns the new value of "src" so that a + * follow-on call can read more data, continuing from where the first left off. + * + * There are three types of results: + * 1. The source data runs out before extracting "dst_length" bytes: + * UnStuffData returns NULL to indicate failure. + * 2. The source data produces exactly "dst_length" bytes: + * UnStuffData returns new_src = end to indicate that all bytes were consumed. + * 3. "dst_length" bytes are extracted, with more remaining. + * UnStuffData returns new_src < end to indicate that there are more bytes + * to be read. + * + * Note: The decoding may be destructive, in that it may alter the source + * data in the process of decoding it (this is necessary to allow a follow-on + * call to resume correctly). + */ + +static __u8 *UnStuffData(__u8 *src, __u8 *end, __u8 *dst, __u32 dst_length) +{ + __u8 *dst_end = dst + dst_length; + /* Sanity check */ + if (!src || !end || !dst || !dst_length) + return(NULL); + while (src < end && dst < dst_end) + { + int count = (*src ^ Stuff_Magic) & Stuff_CountMask; + switch ((*src ^ Stuff_Magic) & Stuff_CodeMask) + { + case Stuff_Diff: + if (src+1+count >= end) + return(NULL); + do + { + *dst++ = *++src ^ Stuff_Magic; + } + while(--count >= 0 && dst < dst_end); + if (count < 0) + src += 1; + else + { + if (count == 0) + *src = Stuff_Same ^ Stuff_Magic; + else + *src = (Stuff_Diff + count) ^ Stuff_Magic; + } + break; + case Stuff_DiffZero: + if (src+1+count >= end) + return(NULL); + do + { + *dst++ = *++src ^ Stuff_Magic; + } + while(--count >= 0 && dst < dst_end); + if (count < 0) + *src = Stuff_Zero ^ Stuff_Magic; + else + *src = (Stuff_DiffZero + count) ^ Stuff_Magic; + break; + case Stuff_Same: + if (src+1 >= end) + return(NULL); + do + { + *dst++ = src[1] ^ Stuff_Magic; + } + while(--count >= 0 && dst < dst_end); + if (count < 0) + src += 2; + else + *src = (Stuff_Same + count) ^ Stuff_Magic; + break; + case Stuff_Zero: + do + { + *dst++ = 0; + } + while(--count >= 0 && dst < dst_end); + if (count < 0) + src += 1; + else + *src = (Stuff_Zero + count) ^ Stuff_Magic; + break; + } + } + if (dst < dst_end) + return(NULL); + else + return(src); +} + + +/************************************************************************/ +/* General routines for STRIP */ + +/* + * get_baud returns the current baud rate, as one of the constants defined in + * termbits.h + * If the user has issued a baud rate override using the 'setserial' command + * and the logical current rate is set to 38.4, then the true baud rate + * currently in effect (57.6 or 115.2) is returned. + */ +static unsigned int get_baud(struct tty_struct *tty) + { + if (!tty || !tty->termios) return(0); + if ((tty->termios->c_cflag & CBAUD) == B38400 && tty->driver_data) + { + struct async_struct *info = (struct async_struct *)tty->driver_data; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI ) return(B57600); + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) return(B115200); + } + return(tty->termios->c_cflag & CBAUD); + } + +/* + * set_baud sets the baud rate to the rate defined by baudcode + * Note: The rate B38400 should be avoided, because the user may have + * issued a 'setserial' speed override to map that to a different speed. + * We could achieve a true rate of 38400 if we needed to by cancelling + * any user speed override that is in place, but that might annoy the + * user, so it is simplest to just avoid using 38400. + */ +static void set_baud(struct tty_struct *tty, unsigned int baudcode) + { + struct termios old_termios = *(tty->termios); + tty->termios->c_cflag &= ~CBAUD; /* Clear the old baud setting */ + tty->termios->c_cflag |= baudcode; /* Set the new baud setting */ + tty->driver.set_termios(tty, &old_termios); + } + +/* + * Convert a string to a Metricom Address. + */ + +#define IS_RADIO_ADDRESS(p) ( \ + isdigit((p)[0]) && isdigit((p)[1]) && isdigit((p)[2]) && isdigit((p)[3]) && \ + (p)[4] == '-' && \ + isdigit((p)[5]) && isdigit((p)[6]) && isdigit((p)[7]) && isdigit((p)[8]) ) + +static int string_to_radio_address(MetricomAddress *addr, __u8 *p) +{ + if (!IS_RADIO_ADDRESS(p)) return(1); + addr->c[0] = 0; + addr->c[1] = 0; + addr->c[2] = READHEX(p[0]) << 4 | READHEX(p[1]); + addr->c[3] = READHEX(p[2]) << 4 | READHEX(p[3]); + addr->c[4] = READHEX(p[5]) << 4 | READHEX(p[6]); + addr->c[5] = READHEX(p[7]) << 4 | READHEX(p[8]); + return(0); +} + +/* + * Convert a Metricom Address to a string. + */ + +static __u8 *radio_address_to_string(const MetricomAddress *addr, MetricomAddressString *p) +{ + sprintf(p->c, "%02X%02X-%02X%02X", addr->c[2], addr->c[3], addr->c[4], addr->c[5]); + return(p->c); +} + +/* + * Note: Must make sure sx_size is big enough to receive a stuffed + * MAX_RECV_MTU packet. Additionally, we also want to ensure that it's + * big enough to receive a large radio neighbour list (currently 4K). + */ + +static int allocate_buffers(struct strip *strip_info) +{ + struct net_device *dev = &strip_info->dev; + int sx_size = MAX(STRIP_ENCAP_SIZE(MAX_RECV_MTU), 4096); + int tx_size = STRIP_ENCAP_SIZE(dev->mtu) + MaxCommandStringLength; + __u8 *r = kmalloc(MAX_RECV_MTU, GFP_ATOMIC); + __u8 *s = kmalloc(sx_size, GFP_ATOMIC); + __u8 *t = kmalloc(tx_size, GFP_ATOMIC); + if (r && s && t) + { + strip_info->rx_buff = r; + strip_info->sx_buff = s; + strip_info->tx_buff = t; + strip_info->sx_size = sx_size; + strip_info->tx_size = tx_size; + strip_info->mtu = dev->mtu; + return(1); + } + if (r) kfree(r); + if (s) kfree(s); + if (t) kfree(t); + return(0); +} + +/* + * MTU has been changed by the IP layer. Unfortunately we are not told + * about this, but we spot it ourselves and fix things up. We could be in + * an upcall from the tty driver, or in an ip packet queue. + */ + +static void strip_changedmtu(struct strip *strip_info) +{ + int old_mtu = strip_info->mtu; + struct net_device *dev = &strip_info->dev; + unsigned char *orbuff = strip_info->rx_buff; + unsigned char *osbuff = strip_info->sx_buff; + unsigned char *otbuff = strip_info->tx_buff; + InterruptStatus intstat; + + if (dev->mtu > MAX_SEND_MTU) + { + printk(KERN_ERR "%s: MTU exceeds maximum allowable (%d), MTU change cancelled.\n", + strip_info->dev.name, MAX_SEND_MTU); + dev->mtu = old_mtu; + return; + } + + /* + * Have to disable interrupts here because we're reallocating and resizing + * the serial buffers, and we can't have data arriving in them while we're + * moving them around in memory. This may cause data to be lost on the serial + * port, but hopefully people won't change MTU that often. + * Also note, this may not work on a symmetric multi-processor system. + */ + intstat = DisableInterrupts(); + + if (!allocate_buffers(strip_info)) + { + RestoreInterrupts(intstat); + printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n", + strip_info->dev.name); + dev->mtu = old_mtu; + return; + } + + if (strip_info->sx_count) + { + if (strip_info->sx_count <= strip_info->sx_size) + memcpy(strip_info->sx_buff, osbuff, strip_info->sx_count); + else + { + strip_info->discard = strip_info->sx_count; + strip_info->rx_over_errors++; + } + } + + if (strip_info->tx_left) + { + if (strip_info->tx_left <= strip_info->tx_size) + memcpy(strip_info->tx_buff, strip_info->tx_head, strip_info->tx_left); + else + { + strip_info->tx_left = 0; + strip_info->tx_dropped++; + } + } + strip_info->tx_head = strip_info->tx_buff; + + RestoreInterrupts(intstat); + + printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n", + strip_info->dev.name, old_mtu, strip_info->mtu); + + if (orbuff) kfree(orbuff); + if (osbuff) kfree(osbuff); + if (otbuff) kfree(otbuff); +} + +static void strip_unlock(struct strip *strip_info) +{ + /* + * Set the timer to go off in one second. + */ + strip_info->idle_timer.expires = jiffies + 1*HZ; + add_timer(&strip_info->idle_timer); + netif_wake_queue(&strip_info->dev); +} + + +/************************************************************************/ +/* Callback routines for exporting information through /proc */ + +/* + * This function updates the total amount of data printed so far. It then + * determines if the amount of data printed into a buffer has reached the + * offset requested. If it hasn't, then the buffer is shifted over so that + * the next bit of data can be printed over the old bit. If the total + * amount printed so far exceeds the total amount requested, then this + * function returns 1, otherwise 0. + */ +static int +shift_buffer(char *buffer, int requested_offset, int requested_len, + int *total, int *slop, char **buf) +{ + int printed; + + /* printk(KERN_DEBUG "shift: buffer: %d o: %d l: %d t: %d buf: %d\n", + (int) buffer, requested_offset, requested_len, *total, + (int) *buf); */ + printed = *buf - buffer; + if (*total + printed <= requested_offset) { + *total += printed; + *buf = buffer; + } + else { + if (*total < requested_offset) { + *slop = requested_offset - *total; + } + *total = requested_offset + printed - *slop; + } + if (*total > requested_offset + requested_len) { + return 1; + } + else { + return 0; + } +} + +/* + * This function calculates the actual start of the requested data + * in the buffer. It also calculates actual length of data returned, + * which could be less that the amount of data requested. + */ +static int +calc_start_len(char *buffer, char **start, int requested_offset, + int requested_len, int total, char *buf) +{ + int return_len, buffer_len; + + buffer_len = buf - buffer; + if (buffer_len >= 4095) { + printk(KERN_ERR "STRIP: exceeded /proc buffer size\n"); + } + + /* + * There may be bytes before and after the + * chunk that was actually requested. + */ + return_len = total - requested_offset; + if (return_len < 0) { + return_len = 0; + } + *start = buf - return_len; + if (return_len > requested_len) { + return_len = requested_len; + } + /* printk(KERN_DEBUG "return_len: %d\n", return_len); */ + return return_len; +} + +/* + * If the time is in the near future, time_delta prints the number of + * seconds to go into the buffer and returns the address of the buffer. + * If the time is not in the near future, it returns the address of the + * string "Not scheduled" The buffer must be long enough to contain the + * ascii representation of the number plus 9 charactes for the " seconds" + * and the null character. + */ +static char *time_delta(char buffer[], long time) +{ + time -= jiffies; + if (time > LongTime / 2) return("Not scheduled"); + if(time < 0) time = 0; /* Don't print negative times */ + sprintf(buffer, "%ld seconds", time / HZ); + return(buffer); +} + +static int sprintf_neighbours(char *buffer, MetricomNodeTable *table, char *title) +{ + /* We wrap this in a do/while loop, so if the table changes */ + /* while we're reading it, we just go around and try again. */ + struct timeval t; + char *ptr; + do + { + int i; + t = table->timestamp; + ptr = buffer; + if (table->num_nodes) ptr += sprintf(ptr, "\n %s\n", title); + for (i=0; inum_nodes; i++) + { + InterruptStatus intstat = DisableInterrupts(); + MetricomNode node = table->node[i]; + RestoreInterrupts(intstat); + ptr += sprintf(ptr, " %s\n", node.c); + } + } while (table->timestamp.tv_sec != t.tv_sec || table->timestamp.tv_usec != t.tv_usec); + return ptr - buffer; +} + +/* + * This function prints radio status information into the specified buffer. + * I think the buffer size is 4K, so this routine should never print more + * than 4K of data into it. With the maximum of 32 portables and 32 poletops + * reported, the routine outputs 3107 bytes into the buffer. + */ +static int +sprintf_status_info(char *buffer, struct strip *strip_info) +{ + char temp[32]; + char *p = buffer; + MetricomAddressString addr_string; + + /* First, we must copy all of our data to a safe place, */ + /* in case a serial interrupt comes in and changes it. */ + InterruptStatus intstat = DisableInterrupts(); + int tx_left = strip_info->tx_left; + unsigned long rx_average_pps = strip_info->rx_average_pps; + unsigned long tx_average_pps = strip_info->tx_average_pps; + unsigned long sx_average_pps = strip_info->sx_average_pps; + int working = strip_info->working; + int firmware_level = strip_info->firmware_level; + long watchdog_doprobe = strip_info->watchdog_doprobe; + long watchdog_doreset = strip_info->watchdog_doreset; + long gratuitous_arp = strip_info->gratuitous_arp; + long arp_interval = strip_info->arp_interval; + FirmwareVersion firmware_version = strip_info->firmware_version; + SerialNumber serial_number = strip_info->serial_number; + BatteryVoltage battery_voltage = strip_info->battery_voltage; + char* if_name = strip_info->dev.name; + MetricomAddress true_dev_addr = strip_info->true_dev_addr; + MetricomAddress dev_dev_addr = *(MetricomAddress*)strip_info->dev.dev_addr; + int manual_dev_addr = strip_info->manual_dev_addr; +#ifdef EXT_COUNTERS + unsigned long rx_bytes = strip_info->rx_bytes; + unsigned long tx_bytes = strip_info->tx_bytes; + unsigned long rx_rbytes = strip_info->rx_rbytes; + unsigned long tx_rbytes = strip_info->tx_rbytes; + unsigned long rx_sbytes = strip_info->rx_sbytes; + unsigned long tx_sbytes = strip_info->tx_sbytes; + unsigned long rx_ebytes = strip_info->rx_ebytes; + unsigned long tx_ebytes = strip_info->tx_ebytes; +#endif + RestoreInterrupts(intstat); + + p += sprintf(p, "\nInterface name\t\t%s\n", if_name); + p += sprintf(p, " Radio working:\t\t%s\n", working ? "Yes" : "No"); + radio_address_to_string(&true_dev_addr, &addr_string); + p += sprintf(p, " Radio address:\t\t%s\n", addr_string.c); + if (manual_dev_addr) + { + radio_address_to_string(&dev_dev_addr, &addr_string); + p += sprintf(p, " Device address:\t%s\n", addr_string.c); + } + p += sprintf(p, " Firmware version:\t%s", !working ? "Unknown" : + !firmware_level ? "Should be upgraded" : + firmware_version.c); + if (firmware_level >= ChecksummedMessages) p += sprintf(p, " (Checksums Enabled)"); + p += sprintf(p, "\n"); + p += sprintf(p, " Serial number:\t\t%s\n", serial_number.c); + p += sprintf(p, " Battery voltage:\t%s\n", battery_voltage.c); + p += sprintf(p, " Transmit queue (bytes):%d\n", tx_left); + p += sprintf(p, " Receive packet rate: %ld packets per second\n", rx_average_pps / 8); + p += sprintf(p, " Transmit packet rate: %ld packets per second\n", tx_average_pps / 8); + p += sprintf(p, " Sent packet rate: %ld packets per second\n", sx_average_pps / 8); + p += sprintf(p, " Next watchdog probe:\t%s\n", time_delta(temp, watchdog_doprobe)); + p += sprintf(p, " Next watchdog reset:\t%s\n", time_delta(temp, watchdog_doreset)); + p += sprintf(p, " Next gratuitous ARP:\t"); + + if (!memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address))) + p += sprintf(p, "Disabled\n"); + else + { + p += sprintf(p, "%s\n", time_delta(temp, gratuitous_arp)); + p += sprintf(p, " Next ARP interval:\t%ld seconds\n", JIFFIE_TO_SEC(arp_interval)); + } + + if (working) + { +#ifdef EXT_COUNTERS + p += sprintf(p, "\n"); + p += sprintf(p, " Total bytes: \trx:\t%lu\ttx:\t%lu\n", rx_bytes, tx_bytes); + p += sprintf(p, " thru radio: \trx:\t%lu\ttx:\t%lu\n", rx_rbytes, tx_rbytes); + p += sprintf(p, " thru serial port: \trx:\t%lu\ttx:\t%lu\n", rx_sbytes, tx_sbytes); + p += sprintf(p, " Total stat/err bytes:\trx:\t%lu\ttx:\t%lu\n", rx_ebytes, tx_ebytes); +#endif + p += sprintf_neighbours(p, &strip_info->poletops, "Poletops:"); + p += sprintf_neighbours(p, &strip_info->portables, "Portables:"); + } + + return p - buffer; +} + +/* + * This function is exports status information from the STRIP driver through + * the /proc file system. + */ + +static int get_status_info(char *buffer, char **start, off_t req_offset, int req_len) +{ + int total = 0, slop = 0; + struct strip *strip_info = struct_strip_list; + char *buf = buffer; + + buf += sprintf(buf, "strip_version: %s\n", StripVersion); + if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) goto exit; + + while (strip_info != NULL) + { + buf += sprintf_status_info(buf, strip_info); + if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) break; + strip_info = strip_info->next; + } + exit: + return(calc_start_len(buffer, start, req_offset, req_len, total, buf)); +} + +/************************************************************************/ +/* Sending routines */ + +static void ResetRadio(struct strip *strip_info) +{ + struct tty_struct *tty = strip_info->tty; + static const char init[] = "ate0q1dt**starmode\r**"; + StringDescriptor s = { init, sizeof(init)-1 }; + + /* + * If the radio isn't working anymore, + * we should clear the old status information. + */ + if (strip_info->working) + { + printk(KERN_INFO "%s: No response: Resetting radio.\n", strip_info->dev.name); + strip_info->firmware_version.c[0] = '\0'; + strip_info->serial_number.c[0] = '\0'; + strip_info->battery_voltage.c[0] = '\0'; + strip_info->portables.num_nodes = 0; + do_gettimeofday(&strip_info->portables.timestamp); + strip_info->poletops.num_nodes = 0; + do_gettimeofday(&strip_info->poletops.timestamp); + } + + strip_info->pps_timer = jiffies; + strip_info->rx_pps_count = 0; + strip_info->tx_pps_count = 0; + strip_info->sx_pps_count = 0; + strip_info->rx_average_pps = 0; + strip_info->tx_average_pps = 0; + strip_info->sx_average_pps = 0; + + /* Mark radio address as unknown */ + *(MetricomAddress*)&strip_info->true_dev_addr = zero_address; + if (!strip_info->manual_dev_addr) + *(MetricomAddress*)strip_info->dev.dev_addr = zero_address; + strip_info->working = FALSE; + strip_info->firmware_level = NoStructure; + strip_info->next_command = CompatibilityCommand; + strip_info->watchdog_doprobe = jiffies + 10 * HZ; + strip_info->watchdog_doreset = jiffies + 1 * HZ; + + /* If the user has selected a baud rate above 38.4 see what magic we have to do */ + if (strip_info->user_baud > B38400) + { + /* + * Subtle stuff: Pay attention :-) + * If the serial port is currently at the user's selected (>38.4) rate, + * then we temporarily switch to 19.2 and issue the ATS304 command + * to tell the radio to switch to the user's selected rate. + * If the serial port is not currently at that rate, that means we just + * issued the ATS304 command last time through, so this time we restore + * the user's selected rate and issue the normal starmode reset string. + */ + if (strip_info->user_baud == get_baud(tty)) + { + static const char b0[] = "ate0q1s304=57600\r"; + static const char b1[] = "ate0q1s304=115200\r"; + static const StringDescriptor baudstring[2] = + { { b0, sizeof(b0)-1 }, { b1, sizeof(b1)-1 } }; + set_baud(tty, B19200); + if (strip_info->user_baud == B57600 ) s = baudstring[0]; + else if (strip_info->user_baud == B115200) s = baudstring[1]; + else s = baudstring[1]; /* For now */ + } + else set_baud(tty, strip_info->user_baud); + } + + tty->driver.write(tty, 0, s.string, s.length); +#ifdef EXT_COUNTERS + strip_info->tx_ebytes += s.length; +#endif +} + +/* + * Called by the driver when there's room for more data. If we have + * more packets to send, we send them here. + */ + +static void strip_write_some_more(struct tty_struct *tty) +{ + struct strip *strip_info = (struct strip *) tty->disc_data; + + /* First make sure we're connected. */ + if (!strip_info || strip_info->magic != STRIP_MAGIC || + !netif_running(&strip_info->dev)) + return; + + if (strip_info->tx_left > 0) + { + /* + * If some data left, send it + * Note: There's a kernel design bug here. The write_wakeup routine has to + * know how many bytes were written in the previous call, but the number of + * bytes written is returned as the result of the tty->driver.write call, + * and there's no guarantee that the tty->driver.write routine will have + * returned before the write_wakeup routine is invoked. If the PC has fast + * Serial DMA hardware, then it's quite possible that the write could complete + * almost instantaneously, meaning that my write_wakeup routine could be + * called immediately, before tty->driver.write has had a chance to return + * the number of bytes that it wrote. In an attempt to guard against this, + * I disable interrupts around the call to tty->driver.write, although even + * this might not work on a symmetric multi-processor system. + */ + InterruptStatus intstat = DisableInterrupts(); + int num_written = tty->driver.write(tty, 0, strip_info->tx_head, strip_info->tx_left); + strip_info->tx_left -= num_written; + strip_info->tx_head += num_written; +#ifdef EXT_COUNTERS + strip_info->tx_sbytes += num_written; +#endif + RestoreInterrupts(intstat); + } + else /* Else start transmission of another packet */ + { + tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); + strip_unlock(strip_info); + } +} + +static __u8 *add_checksum(__u8 *buffer, __u8 *end) +{ + __u16 sum = 0; + __u8 *p = buffer; + while (p < end) sum += *p++; + end[3] = hextable[sum & 0xF]; sum >>= 4; + end[2] = hextable[sum & 0xF]; sum >>= 4; + end[1] = hextable[sum & 0xF]; sum >>= 4; + end[0] = hextable[sum & 0xF]; + return(end+4); +} + +static unsigned char *strip_make_packet(unsigned char *buffer, struct strip *strip_info, struct sk_buff *skb) +{ + __u8 *ptr = buffer; + __u8 *stuffstate = NULL; + STRIP_Header *header = (STRIP_Header *)skb->data; + MetricomAddress haddr = header->dst_addr; + int len = skb->len - sizeof(STRIP_Header); + MetricomKey key; + + /*HexDump("strip_make_packet", strip_info, skb->data, skb->data + skb->len);*/ + + if (header->protocol == htons(ETH_P_IP)) key = SIP0Key; + else if (header->protocol == htons(ETH_P_ARP)) key = ARP0Key; + else + { + printk(KERN_ERR "%s: strip_make_packet: Unknown packet type 0x%04X\n", + strip_info->dev.name, ntohs(header->protocol)); + return(NULL); + } + + if (len > strip_info->mtu) + { + printk(KERN_ERR "%s: Dropping oversized transmit packet: %d bytes\n", + strip_info->dev.name, len); + return(NULL); + } + + /* + * If we're sending to ourselves, discard the packet. + * (Metricom radios choke if they try to send a packet to their own address.) + */ + if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) + { + printk(KERN_ERR "%s: Dropping packet addressed to self\n", strip_info->dev.name); + return(NULL); + } + + /* + * If this is a broadcast packet, send it to our designated Metricom + * 'broadcast hub' radio (First byte of address being 0xFF means broadcast) + */ + if (haddr.c[0] == 0xFF) + { + u32 brd = 0; + struct in_device *in_dev = in_dev_get(&strip_info->dev); + if (in_dev == NULL) + return NULL; + read_lock(&in_dev->lock); + if (in_dev->ifa_list) + brd = in_dev->ifa_list->ifa_broadcast; + read_unlock(&in_dev->lock); + in_dev_put(in_dev); + + /* arp_query returns 1 if it succeeds in looking up the address, 0 if it fails */ + if (!arp_query(haddr.c, brd, &strip_info->dev)) + { + printk(KERN_ERR "%s: Unable to send packet (no broadcast hub configured)\n", + strip_info->dev.name); + return(NULL); + } + /* + * If we are the broadcast hub, don't bother sending to ourselves. + * (Metricom radios choke if they try to send a packet to their own address.) + */ + if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) return(NULL); + } + + *ptr++ = 0x0D; + *ptr++ = '*'; + *ptr++ = hextable[haddr.c[2] >> 4]; + *ptr++ = hextable[haddr.c[2] & 0xF]; + *ptr++ = hextable[haddr.c[3] >> 4]; + *ptr++ = hextable[haddr.c[3] & 0xF]; + *ptr++ = '-'; + *ptr++ = hextable[haddr.c[4] >> 4]; + *ptr++ = hextable[haddr.c[4] & 0xF]; + *ptr++ = hextable[haddr.c[5] >> 4]; + *ptr++ = hextable[haddr.c[5] & 0xF]; + *ptr++ = '*'; + *ptr++ = key.c[0]; + *ptr++ = key.c[1]; + *ptr++ = key.c[2]; + *ptr++ = key.c[3]; + + ptr = StuffData(skb->data + sizeof(STRIP_Header), len, ptr, &stuffstate); + + if (strip_info->firmware_level >= ChecksummedMessages) ptr = add_checksum(buffer+1, ptr); + + *ptr++ = 0x0D; + return(ptr); +} + +static void strip_send(struct strip *strip_info, struct sk_buff *skb) +{ + MetricomAddress haddr; + unsigned char *ptr = strip_info->tx_buff; + int doreset = (long)jiffies - strip_info->watchdog_doreset >= 0; + int doprobe = (long)jiffies - strip_info->watchdog_doprobe >= 0 && !doreset; + u32 addr, brd; + + /* + * 1. If we have a packet, encapsulate it and put it in the buffer + */ + if (skb) + { + char *newptr = strip_make_packet(ptr, strip_info, skb); + strip_info->tx_pps_count++; + if (!newptr) strip_info->tx_dropped++; + else + { + ptr = newptr; + strip_info->sx_pps_count++; + strip_info->tx_packets++; /* Count another successful packet */ +#ifdef EXT_COUNTERS + strip_info->tx_bytes += skb->len; + strip_info->tx_rbytes += ptr - strip_info->tx_buff; +#endif + /*DumpData("Sending:", strip_info, strip_info->tx_buff, ptr);*/ + /*HexDump("Sending", strip_info, strip_info->tx_buff, ptr);*/ + } + } + + /* + * 2. If it is time for another tickle, tack it on, after the packet + */ + if (doprobe) + { + StringDescriptor ts = CommandString[strip_info->next_command]; +#if TICKLE_TIMERS + { + struct timeval tv; + do_gettimeofday(&tv); + printk(KERN_INFO "**** Sending tickle string %d at %02d.%06d\n", + strip_info->next_command, tv.tv_sec % 100, tv.tv_usec); + } +#endif + if (ptr == strip_info->tx_buff) *ptr++ = 0x0D; + + *ptr++ = '*'; /* First send "**" to provoke an error message */ + *ptr++ = '*'; + + /* Then add the command */ + memcpy(ptr, ts.string, ts.length); + + /* Add a checksum ? */ + if (strip_info->firmware_level < ChecksummedMessages) ptr += ts.length; + else ptr = add_checksum(ptr, ptr + ts.length); + + *ptr++ = 0x0D; /* Terminate the command with a */ + + /* Cycle to next periodic command? */ + if (strip_info->firmware_level >= StructuredMessages) + if (++strip_info->next_command >= ELEMENTS_OF(CommandString)) + strip_info->next_command = 0; +#ifdef EXT_COUNTERS + strip_info->tx_ebytes += ts.length; +#endif + strip_info->watchdog_doprobe = jiffies + 10 * HZ; + strip_info->watchdog_doreset = jiffies + 1 * HZ; + /*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev.name);*/ + } + + /* + * 3. Set up the strip_info ready to send the data (if any). + */ + strip_info->tx_head = strip_info->tx_buff; + strip_info->tx_left = ptr - strip_info->tx_buff; + strip_info->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP); + + /* + * 4. Debugging check to make sure we're not overflowing the buffer. + */ + if (strip_info->tx_size - strip_info->tx_left < 20) + printk(KERN_ERR "%s: Sending%5d bytes;%5d bytes free.\n", strip_info->dev.name, + strip_info->tx_left, strip_info->tx_size - strip_info->tx_left); + + /* + * 5. If watchdog has expired, reset the radio. Note: if there's data waiting in + * the buffer, strip_write_some_more will send it after the reset has finished + */ + if (doreset) { ResetRadio(strip_info); return; } + + if (1) { + struct in_device *in_dev = in_dev_get(&strip_info->dev); + brd = addr = 0; + if (in_dev) { + read_lock(&in_dev->lock); + if (in_dev->ifa_list) { + brd = in_dev->ifa_list->ifa_broadcast; + addr = in_dev->ifa_list->ifa_local; + } + read_unlock(&in_dev->lock); + in_dev_put(in_dev); + } + } + + + /* + * 6. If it is time for a periodic ARP, queue one up to be sent. + * We only do this if: + * 1. The radio is working + * 2. It's time to send another periodic ARP + * 3. We really know what our address is (and it is not manually set to zero) + * 4. We have a designated broadcast address configured + * If we queue up an ARP packet when we don't have a designated broadcast + * address configured, then the packet will just have to be discarded in + * strip_make_packet. This is not fatal, but it causes misleading information + * to be displayed in tcpdump. tcpdump will report that periodic APRs are + * being sent, when in fact they are not, because they are all being dropped + * in the strip_make_packet routine. + */ + if (strip_info->working && (long)jiffies - strip_info->gratuitous_arp >= 0 && + memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) && + arp_query(haddr.c, brd, &strip_info->dev)) + { + /*printk(KERN_INFO "%s: Sending gratuitous ARP with interval %ld\n", + strip_info->dev.name, strip_info->arp_interval / HZ);*/ + strip_info->gratuitous_arp = jiffies + strip_info->arp_interval; + strip_info->arp_interval *= 2; + if (strip_info->arp_interval > MaxARPInterval) + strip_info->arp_interval = MaxARPInterval; + if (addr) + arp_send( + ARPOP_REPLY, ETH_P_ARP, + addr, /* Target address of ARP packet is our address */ + &strip_info->dev, /* Device to send packet on */ + addr, /* Source IP address this ARP packet comes from */ + NULL, /* Destination HW address is NULL (broadcast it) */ + strip_info->dev.dev_addr, /* Source HW address is our HW address */ + strip_info->dev.dev_addr); /* Target HW address is our HW address (redundant) */ + } + + /* + * 7. All ready. Start the transmission + */ + strip_write_some_more(strip_info->tty); +} + +/* Encapsulate a datagram and kick it into a TTY queue. */ +static int strip_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct strip *strip_info = (struct strip *)(dev->priv); + + if (!netif_running(dev)) + { + printk(KERN_ERR "%s: xmit call when iface is down\n", dev->name); + return(1); + } + + netif_stop_queue(dev); + + del_timer(&strip_info->idle_timer); + + /* See if someone has been ifconfigging */ + if (strip_info->mtu != strip_info->dev.mtu) + strip_changedmtu(strip_info); + + if (jiffies - strip_info->pps_timer > HZ) + { + unsigned long t = jiffies - strip_info->pps_timer; + unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t/2) / t; + unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t/2) / t; + unsigned long sx_pps_count = (strip_info->sx_pps_count * HZ * 8 + t/2) / t; + + strip_info->pps_timer = jiffies; + strip_info->rx_pps_count = 0; + strip_info->tx_pps_count = 0; + strip_info->sx_pps_count = 0; + + strip_info->rx_average_pps = (strip_info->rx_average_pps + rx_pps_count + 1) / 2; + strip_info->tx_average_pps = (strip_info->tx_average_pps + tx_pps_count + 1) / 2; + strip_info->sx_average_pps = (strip_info->sx_average_pps + sx_pps_count + 1) / 2; + + if (rx_pps_count / 8 >= 10) + printk(KERN_INFO "%s: WARNING: Receiving %ld packets per second.\n", + strip_info->dev.name, rx_pps_count / 8); + if (tx_pps_count / 8 >= 10) + printk(KERN_INFO "%s: WARNING: Tx %ld packets per second.\n", + strip_info->dev.name, tx_pps_count / 8); + if (sx_pps_count / 8 >= 10) + printk(KERN_INFO "%s: WARNING: Sending %ld packets per second.\n", + strip_info->dev.name, sx_pps_count / 8); + } + + strip_send(strip_info, skb); + + if (skb) + dev_kfree_skb(skb); + return(0); +} + +/* + * IdleTask periodically calls strip_xmit, so even when we have no IP packets + * to send for an extended period of time, the watchdog processing still gets + * done to ensure that the radio stays in Starmode + */ + +static void strip_IdleTask(unsigned long parameter) +{ + strip_xmit(NULL, (struct net_device *)parameter); +} + +/* + * Create the MAC header for an arbitrary protocol layer + * + * saddr!=NULL means use this specific address (n/a for Metricom) + * saddr==NULL means use default device source address + * daddr!=NULL means use this destination address + * daddr==NULL means leave destination address alone + * (e.g. unresolved arp -- kernel will call + * rebuild_header later to fill in the address) + */ + +static int strip_header(struct sk_buff *skb, struct net_device *dev, + unsigned short type, void *daddr, void *saddr, unsigned len) +{ + struct strip *strip_info = (struct strip *)(dev->priv); + STRIP_Header *header = (STRIP_Header *)skb_push(skb, sizeof(STRIP_Header)); + + /*printk(KERN_INFO "%s: strip_header 0x%04X %s\n", dev->name, type, + type == ETH_P_IP ? "IP" : type == ETH_P_ARP ? "ARP" : "");*/ + + header->src_addr = strip_info->true_dev_addr; + header->protocol = htons(type); + + /*HexDump("strip_header", (struct strip *)(dev->priv), skb->data, skb->data + skb->len);*/ + + if (!daddr) return(-dev->hard_header_len); + + header->dst_addr = *(MetricomAddress*)daddr; + return(dev->hard_header_len); +} + +/* + * Rebuild the MAC header. This is called after an ARP + * (or in future other address resolution) has completed on this + * sk_buff. We now let ARP fill in the other fields. + * I think this should return zero if packet is ready to send, + * or non-zero if it needs more time to do an address lookup + */ + +static int strip_rebuild_header(struct sk_buff *skb) +{ +#ifdef CONFIG_INET + STRIP_Header *header = (STRIP_Header *) skb->data; + + /* Arp find returns zero if if knows the address, */ + /* or if it doesn't know the address it sends an ARP packet and returns non-zero */ + return arp_find(header->dst_addr.c, skb)? 1 : 0; +#else + return 0; +#endif +} + + +/************************************************************************/ +/* Receiving routines */ + +static int strip_receive_room(struct tty_struct *tty) +{ + return 0x10000; /* We can handle an infinite amount of data. :-) */ +} + +/* + * This function parses the response to the ATS300? command, + * extracting the radio version and serial number. + */ +static void get_radio_version(struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + __u8 *p, *value_begin, *value_end; + int len; + + /* Determine the beginning of the second line of the payload */ + p = ptr; + while (p < end && *p != 10) p++; + if (p >= end) return; + p++; + value_begin = p; + + /* Determine the end of line */ + while (p < end && *p != 10) p++; + if (p >= end) return; + value_end = p; + p++; + + len = value_end - value_begin; + len = MIN(len, sizeof(FirmwareVersion) - 1); + if (strip_info->firmware_version.c[0] == 0) + printk(KERN_INFO "%s: Radio Firmware: %.*s\n", + strip_info->dev.name, len, value_begin); + sprintf(strip_info->firmware_version.c, "%.*s", len, value_begin); + + /* Look for the first colon */ + while (p < end && *p != ':') p++; + if (p >= end) return; + /* Skip over the space */ + p += 2; + len = sizeof(SerialNumber) - 1; + if (p + len <= end) { + sprintf(strip_info->serial_number.c, "%.*s", len, p); + } + else { + printk(KERN_DEBUG "STRIP: radio serial number shorter (%d) than expected (%d)\n", + end - p, len); + } +} + +/* + * This function parses the response to the ATS325? command, + * extracting the radio battery voltage. + */ +static void get_radio_voltage(struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + int len; + + len = sizeof(BatteryVoltage) - 1; + if (ptr + len <= end) { + sprintf(strip_info->battery_voltage.c, "%.*s", len, ptr); + } + else { + printk(KERN_DEBUG "STRIP: radio voltage string shorter (%d) than expected (%d)\n", + end - ptr, len); + } +} + +/* + * This function parses the responses to the AT~LA and ATS311 commands, + * which list the radio's neighbours. + */ +static void get_radio_neighbours(MetricomNodeTable *table, __u8 *ptr, __u8 *end) +{ + table->num_nodes = 0; + while (ptr < end && table->num_nodes < NODE_TABLE_SIZE) + { + MetricomNode *node = &table->node[table->num_nodes++]; + char *dst = node->c, *limit = dst + sizeof(*node) - 1; + while (ptr < end && *ptr <= 32) ptr++; + while (ptr < end && dst < limit && *ptr != 10) *dst++ = *ptr++; + *dst++ = 0; + while (ptr < end && ptr[-1] != 10) ptr++; + } + do_gettimeofday(&table->timestamp); +} + +static int get_radio_address(struct strip *strip_info, __u8 *p) +{ + MetricomAddress addr; + + if (string_to_radio_address(&addr, p)) return(1); + + /* See if our radio address has changed */ + if (memcmp(strip_info->true_dev_addr.c, addr.c, sizeof(addr))) + { + MetricomAddressString addr_string; + radio_address_to_string(&addr, &addr_string); + printk(KERN_INFO "%s: Radio address = %s\n", strip_info->dev.name, addr_string.c); + strip_info->true_dev_addr = addr; + if (!strip_info->manual_dev_addr) *(MetricomAddress*)strip_info->dev.dev_addr = addr; + /* Give the radio a few seconds to get its head straight, then send an arp */ + strip_info->gratuitous_arp = jiffies + 15 * HZ; + strip_info->arp_interval = 1 * HZ; + } + return(0); +} + +static int verify_checksum(struct strip *strip_info) +{ + __u8 *p = strip_info->sx_buff; + __u8 *end = strip_info->sx_buff + strip_info->sx_count - 4; + u_short sum = (READHEX16(end[0]) << 12) | (READHEX16(end[1]) << 8) | + (READHEX16(end[2]) << 4) | (READHEX16(end[3])); + while (p < end) sum -= *p++; + if (sum == 0 && strip_info->firmware_level == StructuredMessages) + { + strip_info->firmware_level = ChecksummedMessages; + printk(KERN_INFO "%s: Radio provides message checksums\n", strip_info->dev.name); + } + return(sum == 0); +} + +static void RecvErr(char *msg, struct strip *strip_info) +{ + __u8 *ptr = strip_info->sx_buff; + __u8 *end = strip_info->sx_buff + strip_info->sx_count; + DumpData(msg, strip_info, ptr, end); + strip_info->rx_errors++; +} + +static void RecvErr_Message(struct strip *strip_info, __u8 *sendername, const __u8 *msg, u_long len) +{ + if (has_prefix(msg, len, "001")) /* Not in StarMode! */ + { + RecvErr("Error Msg:", strip_info); + printk(KERN_INFO "%s: Radio %s is not in StarMode\n", + strip_info->dev.name, sendername); + } + + else if (has_prefix(msg, len, "002")) /* Remap handle */ + { + /* We ignore "Remap handle" messages for now */ + } + + else if (has_prefix(msg, len, "003")) /* Can't resolve name */ + { + RecvErr("Error Msg:", strip_info); + printk(KERN_INFO "%s: Destination radio name is unknown\n", + strip_info->dev.name); + } + + else if (has_prefix(msg, len, "004")) /* Name too small or missing */ + { + strip_info->watchdog_doreset = jiffies + LongTime; +#if TICKLE_TIMERS + { + struct timeval tv; + do_gettimeofday(&tv); + printk(KERN_INFO "**** Got ERR_004 response at %02d.%06d\n", + tv.tv_sec % 100, tv.tv_usec); + } +#endif + if (!strip_info->working) + { + strip_info->working = TRUE; + printk(KERN_INFO "%s: Radio now in starmode\n", strip_info->dev.name); + /* + * If the radio has just entered a working state, we should do our first + * probe ASAP, so that we find out our radio address etc. without delay. + */ + strip_info->watchdog_doprobe = jiffies; + } + if (strip_info->firmware_level == NoStructure && sendername) + { + strip_info->firmware_level = StructuredMessages; + strip_info->next_command = 0; /* Try to enable checksums ASAP */ + printk(KERN_INFO "%s: Radio provides structured messages\n", strip_info->dev.name); + } + if (strip_info->firmware_level >= StructuredMessages) + { + /* + * If this message has a valid checksum on the end, then the call to verify_checksum + * will elevate the firmware_level to ChecksummedMessages for us. (The actual return + * code from verify_checksum is ignored here.) + */ + verify_checksum(strip_info); + /* + * If the radio has structured messages but we don't yet have all our information about it, + * we should do probes without delay, until we have gathered all the information + */ + if (!GOT_ALL_RADIO_INFO(strip_info)) strip_info->watchdog_doprobe = jiffies; + } + } + + else if (has_prefix(msg, len, "005")) /* Bad count specification */ + RecvErr("Error Msg:", strip_info); + + else if (has_prefix(msg, len, "006")) /* Header too big */ + RecvErr("Error Msg:", strip_info); + + else if (has_prefix(msg, len, "007")) /* Body too big */ + { + RecvErr("Error Msg:", strip_info); + printk(KERN_ERR "%s: Error! Packet size too big for radio.\n", + strip_info->dev.name); + } + + else if (has_prefix(msg, len, "008")) /* Bad character in name */ + { + RecvErr("Error Msg:", strip_info); + printk(KERN_ERR "%s: Radio name contains illegal character\n", + strip_info->dev.name); + } + + else if (has_prefix(msg, len, "009")) /* No count or line terminator */ + RecvErr("Error Msg:", strip_info); + + else if (has_prefix(msg, len, "010")) /* Invalid checksum */ + RecvErr("Error Msg:", strip_info); + + else if (has_prefix(msg, len, "011")) /* Checksum didn't match */ + RecvErr("Error Msg:", strip_info); + + else if (has_prefix(msg, len, "012")) /* Failed to transmit packet */ + RecvErr("Error Msg:", strip_info); + + else + RecvErr("Error Msg:", strip_info); +} + +static void process_AT_response(struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + u_long len; + __u8 *p = ptr; + while (p < end && p[-1] != 10) p++; /* Skip past first newline character */ + /* Now ptr points to the AT command, and p points to the text of the response. */ + len = p-ptr; + +#if TICKLE_TIMERS + { + struct timeval tv; + do_gettimeofday(&tv); + printk(KERN_INFO "**** Got AT response %.7s at %02d.%06d\n", + ptr, tv.tv_sec % 100, tv.tv_usec); + } +#endif + + if (has_prefix(ptr, len, "ATS300?" )) get_radio_version(strip_info, p, end); + else if (has_prefix(ptr, len, "ATS305?" )) get_radio_address(strip_info, p); + else if (has_prefix(ptr, len, "ATS311?" )) get_radio_neighbours(&strip_info->poletops, p, end); + else if (has_prefix(ptr, len, "ATS319=7")) verify_checksum(strip_info); + else if (has_prefix(ptr, len, "ATS325?" )) get_radio_voltage(strip_info, p, end); + else if (has_prefix(ptr, len, "AT~LA" )) get_radio_neighbours(&strip_info->portables, p, end); + else RecvErr("Unknown AT Response:", strip_info); +} + +static void process_ACK(struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + /* Currently we don't do anything with ACKs from the radio */ +} + +static void process_Info(struct strip *strip_info, __u8 *ptr, __u8 *end) +{ + if (ptr+16 > end) RecvErr("Bad Info Msg:", strip_info); +} + +static struct net_device *get_strip_dev(struct strip *strip_info) +{ + /* If our hardware address is *manually set* to zero, and we know our */ + /* real radio hardware address, try to find another strip device that has been */ + /* manually set to that address that we can 'transfer ownership' of this packet to */ + if (strip_info->manual_dev_addr && + !memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) && + memcmp(&strip_info->true_dev_addr, zero_address.c, sizeof(zero_address))) + { + struct net_device *dev; + read_lock_bh(&dev_base_lock); + dev = dev_base; + while (dev) + { + if (dev->type == strip_info->dev.type && + !memcmp(dev->dev_addr, &strip_info->true_dev_addr, sizeof(MetricomAddress))) + { + printk(KERN_INFO "%s: Transferred packet ownership to %s.\n", + strip_info->dev.name, dev->name); + read_unlock_bh(&dev_base_lock); + return(dev); + } + dev = dev->next; + } + read_unlock_bh(&dev_base_lock); + } + return(&strip_info->dev); +} + +/* + * Send one completely decapsulated datagram to the next layer. + */ + +static void deliver_packet(struct strip *strip_info, STRIP_Header *header, __u16 packetlen) +{ + struct sk_buff *skb = dev_alloc_skb(sizeof(STRIP_Header) + packetlen); + if (!skb) + { + printk(KERN_ERR "%s: memory squeeze, dropping packet.\n", strip_info->dev.name); + strip_info->rx_dropped++; + } + else + { + memcpy(skb_put(skb, sizeof(STRIP_Header)), header, sizeof(STRIP_Header)); + memcpy(skb_put(skb, packetlen), strip_info->rx_buff, packetlen); + skb->dev = get_strip_dev(strip_info); + skb->protocol = header->protocol; + skb->mac.raw = skb->data; + + /* Having put a fake header on the front of the sk_buff for the */ + /* benefit of tools like tcpdump, skb_pull now 'consumes' that */ + /* fake header before we hand the packet up to the next layer. */ + skb_pull(skb, sizeof(STRIP_Header)); + + /* Finally, hand the packet up to the next layer (e.g. IP or ARP, etc.) */ + strip_info->rx_packets++; + strip_info->rx_pps_count++; +#ifdef EXT_COUNTERS + strip_info->rx_bytes += packetlen; +#endif + skb->dev->last_rx = jiffies; + netif_rx(skb); + } +} + +static void process_IP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end) +{ + __u16 packetlen; + + /* Decode start of the IP packet header */ + ptr = UnStuffData(ptr, end, strip_info->rx_buff, 4); + if (!ptr) + { + RecvErr("IP Packet too short", strip_info); + return; + } + + packetlen = ((__u16)strip_info->rx_buff[2] << 8) | strip_info->rx_buff[3]; + + if (packetlen > MAX_RECV_MTU) + { + printk(KERN_INFO "%s: Dropping oversized received IP packet: %d bytes\n", + strip_info->dev.name, packetlen); + strip_info->rx_dropped++; + return; + } + + /*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev.name, packetlen);*/ + + /* Decode remainder of the IP packet */ + ptr = UnStuffData(ptr, end, strip_info->rx_buff+4, packetlen-4); + if (!ptr) + { + RecvErr("IP Packet too short", strip_info); + return; + } + + if (ptr < end) + { + RecvErr("IP Packet too long", strip_info); + return; + } + + header->protocol = htons(ETH_P_IP); + + deliver_packet(strip_info, header, packetlen); +} + +static void process_ARP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end) +{ + __u16 packetlen; + struct arphdr *arphdr = (struct arphdr *)strip_info->rx_buff; + + /* Decode start of the ARP packet */ + ptr = UnStuffData(ptr, end, strip_info->rx_buff, 8); + if (!ptr) + { + RecvErr("ARP Packet too short", strip_info); + return; + } + + packetlen = 8 + (arphdr->ar_hln + arphdr->ar_pln) * 2; + + if (packetlen > MAX_RECV_MTU) + { + printk(KERN_INFO "%s: Dropping oversized received ARP packet: %d bytes\n", + strip_info->dev.name, packetlen); + strip_info->rx_dropped++; + return; + } + + /*printk(KERN_INFO "%s: Got %d byte ARP %s\n", + strip_info->dev.name, packetlen, + ntohs(arphdr->ar_op) == ARPOP_REQUEST ? "request" : "reply");*/ + + /* Decode remainder of the ARP packet */ + ptr = UnStuffData(ptr, end, strip_info->rx_buff+8, packetlen-8); + if (!ptr) + { + RecvErr("ARP Packet too short", strip_info); + return; + } + + if (ptr < end) + { + RecvErr("ARP Packet too long", strip_info); + return; + } + + header->protocol = htons(ETH_P_ARP); + + deliver_packet(strip_info, header, packetlen); +} + +/* + * process_text_message processes a -terminated block of data received + * from the radio that doesn't begin with a '*' character. All normal + * Starmode communication messages with the radio begin with a '*', + * so any text that does not indicates a serial port error, a radio that + * is in Hayes command mode instead of Starmode, or a radio with really + * old firmware that doesn't frame its Starmode responses properly. + */ +static void process_text_message(struct strip *strip_info) +{ + __u8 *msg = strip_info->sx_buff; + int len = strip_info->sx_count; + + /* Check for anything that looks like it might be our radio name */ + /* (This is here for backwards compatibility with old firmware) */ + if (len == 9 && get_radio_address(strip_info, msg) == 0) return; + + if (text_equal(msg, len, "OK" )) return; /* Ignore 'OK' responses from prior commands */ + if (text_equal(msg, len, "ERROR" )) return; /* Ignore 'ERROR' messages */ + if (has_prefix(msg, len, "ate0q1" )) return; /* Ignore character echo back from the radio */ + + /* Catch other error messages */ + /* (This is here for backwards compatibility with old firmware) */ + if (has_prefix(msg, len, "ERR_")) { RecvErr_Message(strip_info, NULL, &msg[4], len-4); return; } + + RecvErr("No initial *", strip_info); +} + +/* + * process_message processes a -terminated block of data received + * from the radio. If the radio is not in Starmode or has old firmware, + * it may be a line of text in response to an AT command. Ideally, with + * a current radio that's properly in Starmode, all data received should + * be properly framed and checksummed radio message blocks, containing + * either a starmode packet, or a other communication from the radio + * firmware, like "INF_" Info messages and &COMMAND responses. + */ +static void process_message(struct strip *strip_info) +{ + STRIP_Header header = { zero_address, zero_address, 0 }; + __u8 *ptr = strip_info->sx_buff; + __u8 *end = strip_info->sx_buff + strip_info->sx_count; + __u8 sendername[32], *sptr = sendername; + MetricomKey key; + + /*HexDump("Receiving", strip_info, ptr, end);*/ + + /* Check for start of address marker, and then skip over it */ + if (*ptr == '*') ptr++; + else { process_text_message(strip_info); return; } + + /* Copy out the return address */ + while (ptr < end && *ptr != '*' && sptr < ARRAY_END(sendername)-1) *sptr++ = *ptr++; + *sptr = 0; /* Null terminate the sender name */ + + /* Check for end of address marker, and skip over it */ + if (ptr >= end || *ptr != '*') + { + RecvErr("No second *", strip_info); + return; + } + ptr++; /* Skip the second '*' */ + + /* If the sender name is "&COMMAND", ignore this 'packet' */ + /* (This is here for backwards compatibility with old firmware) */ + if (!strcmp(sendername, "&COMMAND")) + { + strip_info->firmware_level = NoStructure; + strip_info->next_command = CompatibilityCommand; + return; + } + + if (ptr+4 > end) + { + RecvErr("No proto key", strip_info); + return; + } + + /* Get the protocol key out of the buffer */ + key.c[0] = *ptr++; + key.c[1] = *ptr++; + key.c[2] = *ptr++; + key.c[3] = *ptr++; + + /* If we're using checksums, verify the checksum at the end of the packet */ + if (strip_info->firmware_level >= ChecksummedMessages) + { + end -= 4; /* Chop the last four bytes off the packet (they're the checksum) */ + if (ptr > end) + { + RecvErr("Missing Checksum", strip_info); + return; + } + if (!verify_checksum(strip_info)) + { + RecvErr("Bad Checksum", strip_info); + return; + } + } + + /*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev.name, sendername);*/ + + /* + * Fill in (pseudo) source and destination addresses in the packet. + * We assume that the destination address was our address (the radio does not + * tell us this). If the radio supplies a source address, then we use it. + */ + header.dst_addr = strip_info->true_dev_addr; + string_to_radio_address(&header.src_addr, sendername); + +#ifdef EXT_COUNTERS + if (key.l == SIP0Key.l) { + strip_info->rx_rbytes += (end - ptr); + process_IP_packet(strip_info, &header, ptr, end); + } else if (key.l == ARP0Key.l) { + strip_info->rx_rbytes += (end - ptr); + process_ARP_packet(strip_info, &header, ptr, end); + } else if (key.l == ATR_Key.l) { + strip_info->rx_ebytes += (end - ptr); + process_AT_response(strip_info, ptr, end); + } else if (key.l == ACK_Key.l) { + strip_info->rx_ebytes += (end - ptr); + process_ACK(strip_info, ptr, end); + } else if (key.l == INF_Key.l) { + strip_info->rx_ebytes += (end - ptr); + process_Info(strip_info, ptr, end); + } else if (key.l == ERR_Key.l) { + strip_info->rx_ebytes += (end - ptr); + RecvErr_Message(strip_info, sendername, ptr, end-ptr); + } else RecvErr("Unrecognized protocol key", strip_info); +#else + if (key.l == SIP0Key.l) process_IP_packet (strip_info, &header, ptr, end); + else if (key.l == ARP0Key.l) process_ARP_packet (strip_info, &header, ptr, end); + else if (key.l == ATR_Key.l) process_AT_response(strip_info, ptr, end); + else if (key.l == ACK_Key.l) process_ACK (strip_info, ptr, end); + else if (key.l == INF_Key.l) process_Info (strip_info, ptr, end); + else if (key.l == ERR_Key.l) RecvErr_Message (strip_info, sendername, ptr, end-ptr); + else RecvErr("Unrecognized protocol key", strip_info); +#endif +} + +#define TTYERROR(X) ((X) == TTY_BREAK ? "Break" : \ + (X) == TTY_FRAME ? "Framing Error" : \ + (X) == TTY_PARITY ? "Parity Error" : \ + (X) == TTY_OVERRUN ? "Hardware Overrun" : "Unknown Error") + +/* + * Handle the 'receiver data ready' interrupt. + * This function is called by the 'tty_io' module in the kernel when + * a block of STRIP data has been received, which can now be decapsulated + * and sent on to some IP layer for further processing. + */ + +static void +strip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) +{ + struct strip *strip_info = (struct strip *) tty->disc_data; + const unsigned char *end = cp + count; + + if (!strip_info || strip_info->magic != STRIP_MAGIC + || !netif_running(&strip_info->dev)) + return; + + /* Argh! mtu change time! - costs us the packet part received at the change */ + if (strip_info->mtu != strip_info->dev.mtu) + strip_changedmtu(strip_info); + +#if 0 + { + struct timeval tv; + do_gettimeofday(&tv); + printk(KERN_INFO "**** strip_receive_buf: %3d bytes at %02d.%06d\n", + count, tv.tv_sec % 100, tv.tv_usec); + } +#endif + +#ifdef EXT_COUNTERS + strip_info->rx_sbytes += count; +#endif + + /* Read the characters out of the buffer */ + while (cp < end) + { + if (fp && *fp) printk(KERN_INFO "%s: %s on serial port\n", strip_info->dev.name, TTYERROR(*fp)); + if (fp && *fp++ && !strip_info->discard) /* If there's a serial error, record it */ + { + /* If we have some characters in the buffer, discard them */ + strip_info->discard = strip_info->sx_count; + strip_info->rx_errors++; + } + + /* Leading control characters (CR, NL, Tab, etc.) are ignored */ + if (strip_info->sx_count > 0 || *cp >= ' ') + { + if (*cp == 0x0D) /* If end of packet, decide what to do with it */ + { + if (strip_info->sx_count > 3000) + printk(KERN_INFO "%s: Cut a %d byte packet (%d bytes remaining)%s\n", + strip_info->dev.name, strip_info->sx_count, end-cp-1, + strip_info->discard ? " (discarded)" : ""); + if (strip_info->sx_count > strip_info->sx_size) + { + strip_info->rx_over_errors++; + printk(KERN_INFO "%s: sx_buff overflow (%d bytes total)\n", + strip_info->dev.name, strip_info->sx_count); + } + else if (strip_info->discard) + printk(KERN_INFO "%s: Discarding bad packet (%d/%d)\n", + strip_info->dev.name, strip_info->discard, strip_info->sx_count); + else process_message(strip_info); + strip_info->discard = 0; + strip_info->sx_count = 0; + } + else + { + /* Make sure we have space in the buffer */ + if (strip_info->sx_count < strip_info->sx_size) + strip_info->sx_buff[strip_info->sx_count] = *cp; + strip_info->sx_count++; + } + } + cp++; + } +} + + +/************************************************************************/ +/* General control routines */ + +static int set_mac_address(struct strip *strip_info, MetricomAddress *addr) +{ + /* + * We're using a manually specified address if the address is set + * to anything other than all ones. Setting the address to all ones + * disables manual mode and goes back to automatic address determination + * (tracking the true address that the radio has). + */ + strip_info->manual_dev_addr = memcmp(addr->c, broadcast_address.c, sizeof(broadcast_address)); + if (strip_info->manual_dev_addr) + *(MetricomAddress*)strip_info->dev.dev_addr = *addr; + else *(MetricomAddress*)strip_info->dev.dev_addr = strip_info->true_dev_addr; + return 0; +} + +static int dev_set_mac_address(struct net_device *dev, void *addr) +{ + struct strip *strip_info = (struct strip *)(dev->priv); + struct sockaddr *sa = addr; + printk(KERN_INFO "%s: strip_set_dev_mac_address called\n", dev->name); + set_mac_address(strip_info, (MetricomAddress *)sa->sa_data); + return 0; +} + +static struct net_device_stats *strip_get_stats(struct net_device *dev) +{ + static struct net_device_stats stats; + struct strip *strip_info = (struct strip *)(dev->priv); + + memset(&stats, 0, sizeof(struct net_device_stats)); + + stats.rx_packets = strip_info->rx_packets; + stats.tx_packets = strip_info->tx_packets; + stats.rx_dropped = strip_info->rx_dropped; + stats.tx_dropped = strip_info->tx_dropped; + stats.tx_errors = strip_info->tx_errors; + stats.rx_errors = strip_info->rx_errors; + stats.rx_over_errors = strip_info->rx_over_errors; + return(&stats); +} + + +/************************************************************************/ +/* Opening and closing */ + +/* + * Here's the order things happen: + * When the user runs "slattach -p strip ..." + * 1. The TTY module calls strip_open + * 2. strip_open calls strip_alloc + * 3. strip_alloc calls register_netdev + * 4. register_netdev calls strip_dev_init + * 5. then strip_open finishes setting up the strip_info + * + * When the user runs "ifconfig st up address netmask ..." + * 6. strip_open_low gets called + * + * When the user runs "ifconfig st down" + * 7. strip_close_low gets called + * + * When the user kills the slattach process + * 8. strip_close gets called + * 9. strip_close calls dev_close + * 10. if the device is still up, then dev_close calls strip_close_low + * 11. strip_close calls strip_free + */ + +/* Open the low-level part of the STRIP channel. Easy! */ + +static int strip_open_low(struct net_device *dev) +{ + struct strip *strip_info = (struct strip *)(dev->priv); +#if 0 + struct in_device *in_dev = dev->ip_ptr; +#endif + + if (strip_info->tty == NULL) + return(-ENODEV); + + if (!allocate_buffers(strip_info)) + return(-ENOMEM); + + strip_info->sx_count = 0; + strip_info->tx_left = 0; + + strip_info->discard = 0; + strip_info->working = FALSE; + strip_info->firmware_level = NoStructure; + strip_info->next_command = CompatibilityCommand; + strip_info->user_baud = get_baud(strip_info->tty); + +#if 0 + /* + * Needed because address '0' is special + * + * --ANK Needed it or not needed, it does not matter at all. + * Make it at user level, guys. + */ + + if (in_dev->ifa_list->ifa_address == 0) + in_dev->ifa_list->ifa_address = ntohl(0xC0A80001); +#endif + printk(KERN_INFO "%s: Initializing Radio.\n", strip_info->dev.name); + ResetRadio(strip_info); + strip_info->idle_timer.expires = jiffies + 1*HZ; + add_timer(&strip_info->idle_timer); + netif_wake_queue(dev); + return(0); +} + + +/* + * Close the low-level part of the STRIP channel. Easy! + */ + +static int strip_close_low(struct net_device *dev) +{ + struct strip *strip_info = (struct strip *)(dev->priv); + + if (strip_info->tty == NULL) + return -EBUSY; + strip_info->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP); + + netif_stop_queue(dev); + + /* + * Free all STRIP frame buffers. + */ + if (strip_info->rx_buff) + { + kfree(strip_info->rx_buff); + strip_info->rx_buff = NULL; + } + if (strip_info->sx_buff) + { + kfree(strip_info->sx_buff); + strip_info->sx_buff = NULL; + } + if (strip_info->tx_buff) + { + kfree(strip_info->tx_buff); + strip_info->tx_buff = NULL; + } + del_timer(&strip_info->idle_timer); + return 0; +} + +/* + * This routine is called by DDI when the + * (dynamically assigned) device is registered + */ + +static int strip_dev_init(struct net_device *dev) +{ + /* + * Finish setting up the DEVICE info. + */ + + dev->trans_start = 0; + dev->last_rx = 0; + dev->tx_queue_len = 30; /* Drop after 30 frames queued */ + + dev->flags = 0; + dev->mtu = DEFAULT_STRIP_MTU; + dev->type = ARPHRD_METRICOM; /* dtang */ + dev->hard_header_len = sizeof(STRIP_Header); + /* + * dev->priv Already holds a pointer to our struct strip + */ + + *(MetricomAddress*)&dev->broadcast = broadcast_address; + dev->dev_addr[0] = 0; + dev->addr_len = sizeof(MetricomAddress); + + /* + * Pointers to interface service routines. + */ + + dev->open = strip_open_low; + dev->stop = strip_close_low; + dev->hard_start_xmit = strip_xmit; + dev->hard_header = strip_header; + dev->rebuild_header = strip_rebuild_header; + dev->set_mac_address = dev_set_mac_address; + dev->get_stats = strip_get_stats; + return 0; +} + +/* + * Free a STRIP channel. + */ + +static void strip_free(struct strip *strip_info) +{ + *(strip_info->referrer) = strip_info->next; + if (strip_info->next) + strip_info->next->referrer = strip_info->referrer; + strip_info->magic = 0; + kfree(strip_info); +} + +/* + * Allocate a new free STRIP channel + */ + +static struct strip *strip_alloc(void) +{ + int channel_id = 0; + struct strip **s = &struct_strip_list; + struct strip *strip_info = (struct strip *) + kmalloc(sizeof(struct strip), GFP_KERNEL); + + if (!strip_info) + return(NULL); /* If no more memory, return */ + + /* + * Clear the allocated memory + */ + + memset(strip_info, 0, sizeof(struct strip)); + + /* + * Search the list to find where to put our new entry + * (and in the process decide what channel number it is + * going to be) + */ + + while (*s && (*s)->dev.base_addr == channel_id) + { + channel_id++; + s = &(*s)->next; + } + + /* + * Fill in the link pointers + */ + + strip_info->next = *s; + if (*s) + (*s)->referrer = &strip_info->next; + strip_info->referrer = s; + *s = strip_info; + + strip_info->magic = STRIP_MAGIC; + strip_info->tty = NULL; + + strip_info->gratuitous_arp = jiffies + LongTime; + strip_info->arp_interval = 0; + init_timer(&strip_info->idle_timer); + strip_info->idle_timer.data = (long)&strip_info->dev; + strip_info->idle_timer.function = strip_IdleTask; + + /* Note: strip_info->if_name is currently 8 characters long */ + sprintf(strip_info->dev.name, "st%d", channel_id); + strip_info->dev.base_addr = channel_id; + strip_info->dev.priv = (void*)strip_info; + strip_info->dev.next = NULL; + strip_info->dev.init = strip_dev_init; + + return(strip_info); +} + +/* + * Open the high-level part of the STRIP channel. + * This function is called by the TTY module when the + * STRIP line discipline is called for. Because we are + * sure the tty line exists, we only have to link it to + * a free STRIP channel... + */ + +static int strip_open(struct tty_struct *tty) +{ + struct strip *strip_info = (struct strip *) tty->disc_data; + + /* + * First make sure we're not already connected. + */ + + if (strip_info && strip_info->magic == STRIP_MAGIC) + return -EEXIST; + + /* + * OK. Find a free STRIP channel to use. + */ + if ((strip_info = strip_alloc()) == NULL) + return -ENFILE; + + /* + * Register our newly created device so it can be ifconfig'd + * strip_dev_init() will be called as a side-effect + */ + + if (register_netdev(&strip_info->dev) != 0) + { + printk(KERN_ERR "strip: register_netdev() failed.\n"); + strip_free(strip_info); + return -ENFILE; + } + + strip_info->tty = tty; + tty->disc_data = strip_info; + if (tty->driver.flush_buffer) + tty->driver.flush_buffer(tty); + if (tty->ldisc.flush_buffer) + tty->ldisc.flush_buffer(tty); + + /* + * Restore default settings + */ + + strip_info->dev.type = ARPHRD_METRICOM; /* dtang */ + + /* + * Set tty options + */ + + tty->termios->c_iflag |= IGNBRK |IGNPAR;/* Ignore breaks and parity errors. */ + tty->termios->c_cflag |= CLOCAL; /* Ignore modem control signals. */ + tty->termios->c_cflag &= ~HUPCL; /* Don't close on hup */ + + MOD_INC_USE_COUNT; + + printk(KERN_INFO "STRIP: device \"%s\" activated\n", strip_info->dev.name); + + /* + * Done. We have linked the TTY line to a channel. + */ + return(strip_info->dev.base_addr); +} + +/* + * Close down a STRIP channel. + * This means flushing out any pending queues, and then restoring the + * TTY line discipline to what it was before it got hooked to STRIP + * (which usually is TTY again). + */ + +static void strip_close(struct tty_struct *tty) +{ + struct strip *strip_info = (struct strip *) tty->disc_data; + + /* + * First make sure we're connected. + */ + + if (!strip_info || strip_info->magic != STRIP_MAGIC) + return; + + unregister_netdev(&strip_info->dev); + + tty->disc_data = 0; + strip_info->tty = NULL; + printk(KERN_INFO "STRIP: device \"%s\" closed down\n", strip_info->dev.name); + strip_free(strip_info); + tty->disc_data = NULL; + MOD_DEC_USE_COUNT; +} + + +/************************************************************************/ +/* Perform I/O control calls on an active STRIP channel. */ + +static int strip_ioctl(struct tty_struct *tty, struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct strip *strip_info = (struct strip *) tty->disc_data; + + /* + * First make sure we're connected. + */ + + if (!strip_info || strip_info->magic != STRIP_MAGIC) + return -EINVAL; + + switch(cmd) + { + case SIOCGIFNAME: + return copy_to_user((void*)arg, strip_info->dev.name, + strlen(strip_info->dev.name) + 1) ? + -EFAULT : 0; + break; + case SIOCSIFHWADDR: + { + MetricomAddress addr; + printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev.name); + return copy_from_user(&addr, (void*)arg, sizeof(MetricomAddress)) ? + -EFAULT : set_mac_address(strip_info, &addr); + break; + } + /* + * Allow stty to read, but not set, the serial port + */ + + case TCGETS: + case TCGETA: + return n_tty_ioctl(tty, (struct file *) file, cmd, + (unsigned long) arg); + break; + default: + return -ENOIOCTLCMD; + break; + } +} + + +/************************************************************************/ +/* Initialization */ + +static struct tty_ldisc strip_ldisc = { + .magic = TTY_LDISC_MAGIC, + .name = "strip", + .open = strip_open, + .close = strip_close, + .ioctl = strip_ioctl, + .receive_buf = strip_receive_buf, + .receive_room = strip_receive_room, + .write_wakeup = strip_write_some_more, +}; + +/* + * Initialize the STRIP driver. + * This routine is called at boot time, to bootstrap the multi-channel + * STRIP driver + */ + +static char signon[] __initdata = KERN_INFO "STRIP: Version %s (unlimited channels)\n"; + +static int __init strip_init_driver(void) +{ + int status; + + printk(signon, StripVersion); + + /* + * Fill in our line protocol discipline, and register it + */ + if ((status = tty_register_ldisc(N_STRIP, &strip_ldisc))) + printk(KERN_ERR "STRIP: can't register line discipline (err = %d)\n", status); + + /* + * Register the status file with /proc + */ + proc_net_create("strip", S_IFREG | S_IRUGO, get_status_info); + + return status; +} +module_init(strip_init_driver); + +static const char signoff[] __exitdata = KERN_INFO "STRIP: Module Unloaded\n"; + +static void __exit strip_exit_driver(void) +{ + int i; + while (struct_strip_list) + strip_free(struct_strip_list); + + /* Unregister with the /proc/net file here. */ + proc_net_remove("strip"); + + if ((i = tty_register_ldisc(N_STRIP, NULL))) + printk(KERN_ERR "STRIP: can't unregister line discipline (err = %d)\n", i); + + printk(signoff); +} +module_exit(strip_exit_driver); + +MODULE_AUTHOR("Stuart Cheshire "); +MODULE_DESCRIPTION("Starmode Radio IP (STRIP) Device Driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +MODULE_SUPPORTED_DEVICE("Starmode Radio IP (STRIP) modem"); + diff -Nru a/drivers/net/znet.c b/drivers/net/znet.c --- a/drivers/net/znet.c Thu Feb 20 23:19:19 2003 +++ b/drivers/net/znet.c Thu Feb 20 23:19:19 2003 @@ -357,7 +357,7 @@ znet->tx_cur += sizeof(struct i82593_conf_block)/2; outb(OP0_CONFIGURE | CR0_CHNL, ioaddr); - /* XXX FIXME maz : Add multicast adresses here, so having a + /* XXX FIXME maz : Add multicast addresses here, so having a * multicast address configured isn't equal to IFF_ALLMULTI */ } diff -Nru a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c --- a/drivers/oprofile/buffer_sync.c Thu Feb 20 23:19:20 2003 +++ b/drivers/oprofile/buffer_sync.c Thu Feb 20 23:19:20 2003 @@ -147,7 +147,7 @@ for (vma = mm->mmap; vma; vma = vma->vm_next) { if (!vma->vm_file) continue; - if (!vma->vm_flags & VM_EXECUTABLE) + if (!(vma->vm_flags & VM_EXECUTABLE)) continue; cookie = fast_get_dcookie(vma->vm_file->f_dentry, vma->vm_file->f_vfsmnt); diff -Nru a/drivers/oprofile/oprofile_stats.c b/drivers/oprofile/oprofile_stats.c --- a/drivers/oprofile/oprofile_stats.c Thu Feb 20 23:19:22 2003 +++ b/drivers/oprofile/oprofile_stats.c Thu Feb 20 23:19:22 2003 @@ -9,6 +9,7 @@ #include #include +#include #include "oprofile_stats.h" #include "cpu_buffer.h" diff -Nru a/drivers/parisc/dino.c b/drivers/parisc/dino.c --- a/drivers/parisc/dino.c Thu Feb 20 23:19:19 2003 +++ b/drivers/parisc/dino.c Thu Feb 20 23:19:19 2003 @@ -403,7 +403,7 @@ /* * Perform a binary search on set bits. - * `Less than Fatal' and PS2 interupts aren't supported. + * `Less than Fatal' and PS2 interrupts aren't supported. */ if (mask & 0xf) { if (mask & 0x3) { diff -Nru a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c --- a/drivers/parisc/lba_pci.c Thu Feb 20 23:19:22 2003 +++ b/drivers/parisc/lba_pci.c Thu Feb 20 23:19:22 2003 @@ -765,7 +765,7 @@ pci_read_bridge_bases(bus); } else { /* Not configured. - ** For now, propogate HBA limits to the bus; + ** For now, propagate HBA limits to the bus; ** PCI will adjust them later. */ bus->resource[0]->end = ldev->hba.io_space.end; diff -Nru a/drivers/parisc/power.c b/drivers/parisc/power.c --- a/drivers/parisc/power.c Thu Feb 20 23:19:19 2003 +++ b/drivers/parisc/power.c Thu Feb 20 23:19:19 2003 @@ -277,7 +277,3 @@ MODULE_AUTHOR("Helge Deller"); MODULE_DESCRIPTION("Soft power switch driver"); MODULE_LICENSE("Dual BSD/GPL"); - - -EXPORT_NO_SYMBOLS; - diff -Nru a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c --- a/drivers/parport/parport_pc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/parport/parport_pc.c Thu Feb 20 23:19:23 2003 @@ -1634,7 +1634,7 @@ /* * Checks for port existence, all ports support SPP MODE * Returns: - * 0 : No parallel port at this adress + * 0 : No parallel port at this address * PARPORT_MODE_PCSPP : SPP port detected * (if the user specified an ioport himself, * this shall always be the case!) diff -Nru a/drivers/pci/Makefile b/drivers/pci/Makefile --- a/drivers/pci/Makefile Thu Feb 20 23:19:23 2003 +++ b/drivers/pci/Makefile Thu Feb 20 23:19:23 2003 @@ -22,6 +22,7 @@ obj-$(CONFIG_PPC32) += setup-irq.o obj-$(CONFIG_DDB5476) += setup-bus.o obj-$(CONFIG_SGI_IP27) += setup-irq.o +obj-$(CONFIG_X86_VISWS) += setup-irq.o # CompactPCI hotplug requires the pbus_* functions ifdef CONFIG_HOTPLUG_PCI_CPCI diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c --- a/drivers/pci/probe.c Thu Feb 20 23:19:22 2003 +++ b/drivers/pci/probe.c Thu Feb 20 23:19:22 2003 @@ -36,11 +36,22 @@ /* * Find the extent of a PCI decode.. */ -static u32 pci_size(u32 base, unsigned long mask) +static u32 pci_size(u32 base, u32 maxbase, unsigned long mask) { - u32 size = mask & base; /* Find the significant bits */ - size = size & ~(size-1); /* Get the lowest of them to find the decode size */ - return size-1; /* extent = size - 1 */ + u32 size = mask & maxbase; /* Find the significant bits */ + if (!size) + return 0; + + /* Get the lowest of them to find the decode size, and + from that the extent. */ + size = (size & ~(size-1)) - 1; + + /* base == maxbase can be valid only if the BAR has + already been programmed with all 1s. */ + if (base == maxbase && ((base | size) & mask) != mask) + return 0; + + return size; } static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) @@ -63,13 +74,17 @@ if (l == 0xffffffff) l = 0; if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) { + sz = pci_size(l, sz, PCI_BASE_ADDRESS_MEM_MASK); + if (!sz) + continue; res->start = l & PCI_BASE_ADDRESS_MEM_MASK; res->flags |= l & ~PCI_BASE_ADDRESS_MEM_MASK; - sz = pci_size(sz, PCI_BASE_ADDRESS_MEM_MASK); } else { + sz = pci_size(l, sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff); + if (!sz) + continue; res->start = l & PCI_BASE_ADDRESS_IO_MASK; res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK; - sz = pci_size(sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff); } res->end = res->start + (unsigned long) sz; res->flags |= pci_calc_resource_flags(l); @@ -99,6 +114,7 @@ if (rom) { dev->rom_base_reg = rom; res = &dev->resource[PCI_ROM_RESOURCE]; + res->name = dev->dev.name; pci_read_config_dword(dev, rom, &l); pci_write_config_dword(dev, rom, ~PCI_ROM_ADDRESS_ENABLE); pci_read_config_dword(dev, rom, &sz); @@ -106,13 +122,15 @@ if (l == 0xffffffff) l = 0; if (sz && sz != 0xffffffff) { - res->flags = (l & PCI_ROM_ADDRESS_ENABLE) | - IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_READONLY | IORESOURCE_CACHEABLE; - res->start = l & PCI_ROM_ADDRESS_MASK; - sz = pci_size(sz, PCI_ROM_ADDRESS_MASK); - res->end = res->start + (unsigned long) sz; + sz = pci_size(l, sz, PCI_ROM_ADDRESS_MASK); + if (sz) { + res->flags = (l & PCI_ROM_ADDRESS_ENABLE) | + IORESOURCE_MEM | IORESOURCE_PREFETCH | + IORESOURCE_READONLY | IORESOURCE_CACHEABLE; + res->start = l & PCI_ROM_ADDRESS_MASK; + res->end = res->start + (unsigned long) sz; + } } - res->name = dev->dev.name; } } diff -Nru a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c --- a/drivers/s390/block/dasd.c Thu Feb 20 23:19:21 2003 +++ b/drivers/s390/block/dasd.c Thu Feb 20 23:19:21 2003 @@ -555,7 +555,7 @@ dasd_profile_end(dasd_device_t *device, dasd_ccw_req_t * cqr, struct request *req) { - long strtime, irqtime, endtime, tottime; /* in microsecnds */ + long strtime, irqtime, endtime, tottime; /* in microseconds */ long tottimeps, sectors; if (dasd_profile_level != DASD_PROFILE_ON) diff -Nru a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c --- a/drivers/s390/cio/chsc.c Thu Feb 20 23:19:22 2003 +++ b/drivers/s390/cio/chsc.c Thu Feb 20 23:19:22 2003 @@ -486,7 +486,7 @@ case 2: /* i/o resource accessibiliy */ CIO_CRW_EVENT(4, "chsc_process_crw: " "channel subsystem reports some I/O " - "devices may have become accessable\n"); + "devices may have become accessible\n"); pr_debug( KERN_DEBUG "Data received after sei: \n"); pr_debug( KERN_DEBUG "Validity flags: %x\n", sei_res->vf); diff -Nru a/drivers/sbus/char/aurora.c b/drivers/sbus/char/aurora.c --- a/drivers/sbus/char/aurora.c Thu Feb 20 23:19:20 2003 +++ b/drivers/sbus/char/aurora.c Thu Feb 20 23:19:20 2003 @@ -116,11 +116,11 @@ KERN_DEBUG "aurora: Warning: null aurora port for device %s in %s\n"; if (!port) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (port->magic != AURORA_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c --- a/drivers/scsi/3w-xxxx.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/3w-xxxx.c Thu Feb 20 23:19:23 2003 @@ -8,7 +8,7 @@ Copyright (C) 1999-2002 3ware Inc. - Kernel compatablity By: Andre Hedrick + Kernel compatiblity By: Andre Hedrick Non-Copyright (C) 2000 Andre Hedrick Further tiny build fixes and trivial hoovering Alan Cox @@ -960,7 +960,9 @@ host->max_sectors = TW_MAX_SECTORS; #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + scsi_set_device(host, &tw_pci_dev->dev); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) scsi_set_pci_device(host, tw_pci_dev); #endif diff -Nru a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h --- a/drivers/scsi/3w-xxxx.h Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/3w-xxxx.h Thu Feb 20 23:19:20 2003 @@ -8,7 +8,7 @@ Copyright (C) 1999-2002 3ware Inc. - Kernel compatablity By: Andre Hedrick + Kernel compatiblity By: Andre Hedrick Non-Copyright (C) 2000 Andre Hedrick This program is free software; you can redistribute it and/or modify diff -Nru a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c --- a/drivers/scsi/53c700.c Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/53c700.c Thu Feb 20 23:19:20 2003 @@ -1769,7 +1769,7 @@ NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) + 1); /* begin the command here */ - /* no need to check for NULL, test for command_slot_cound above + /* no need to check for NULL, test for command_slot_count above * ensures a slot is free */ slot = find_empty_slot(hostdata); diff -Nru a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c --- a/drivers/scsi/53c7xx.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/53c7xx.c Thu Feb 20 23:19:24 2003 @@ -5794,7 +5794,7 @@ * so we don't perturb hostdata. We don't use a field of the * NCR53c7x0_cmd structure since we may not have allocated one * for the command causing the reset.) of Scsi_Cmnd structures that - * had propogated below the Linux issue queue level. If free is set, + * had propagated below the Linux issue queue level. If free is set, * free the NCR53c7x0_cmd structures which are associated with * the Scsi_Cmnd structures, and clean up any internal * NCR lists that the commands were on. If issue is set, diff -Nru a/drivers/scsi/AM53C974.c b/drivers/scsi/AM53C974.c --- a/drivers/scsi/AM53C974.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/AM53C974.c Thu Feb 20 23:19:21 2003 @@ -680,7 +680,7 @@ printk(KERN_WARNING "AM53C974: Unable to register host, aborting.\n"); return 0; } - scsi_set_pci_device(instance, pdev); + scsi_set_device(instance, &pdev->dev); hostdata = (struct AM53C974_hostdata *) instance->hostdata; instance->base = 0; instance->io_port = pci_resource_start(pdev, 0); diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig --- a/drivers/scsi/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/Kconfig Thu Feb 20 23:19:23 2003 @@ -471,10 +471,6 @@ SCSI-HOWTO, available from . - Note that there is also another driver for the same hardware - available: "EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, - Alphatronix) support". You should say Y to only one of them. - If you want to compile this as a module ( = code which can be inserted in and removed from the running kernel whenever you want), say M here and read . The module @@ -512,24 +508,6 @@ by the driver for each probed SCSI device is reported at boot time. This is equivalent to the "eata=mq:8" boot option. -config SCSI_EATA_DMA - tristate "EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support" - depends on SCSI - ---help--- - This is support for the EATA-DMA protocol compliant SCSI Host - Adapters like the SmartCache III/IV, SmartRAID controller families - and the DPT PM2011B and PM2012B controllers. - - Note that this driver is obsolete; if you have one of the above - SCSI Host Adapters, you should normally say N here and Y to "EATA - ISA/EISA/PCI support", below. Please read the SCSI-HOWTO, available - from . - - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called eata_dma. If you want to compile it as - a module, say M here and read . - config SCSI_EATA_PIO tristate "EATA-PIO (old DPT PM2001, PM2012A) support" depends on SCSI @@ -1728,6 +1706,13 @@ Y to this question. If you're in doubt about whether you have one, see the picture at . + +config SCSI_PC980155 + tristate "NEC PC-9801-55 SCSI support" + depends on X86_PC9800 && SCSI + help + If you have the NEC PC-9801-55 SCSI interface card or compatibles + for NEC PC-9801/PC-9821, say Y. # bool 'Cyberstorm Mk III SCSI support (EXPERIMENTAL)' CONFIG_CYBERSTORMIII_SCSI # bool 'GVP Turbo 040/060 SCSI support (EXPERIMENTAL)' CONFIG_GVP_TURBO_SCSI diff -Nru a/drivers/scsi/Makefile b/drivers/scsi/Makefile --- a/drivers/scsi/Makefile Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/Makefile Thu Feb 20 23:19:23 2003 @@ -82,7 +82,6 @@ obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o obj-$(CONFIG_SCSI_NCR53C8XX) += ncr53c8xx.o obj-$(CONFIG_SCSI_ZALON) += zalon7xx.o -obj-$(CONFIG_SCSI_EATA_DMA) += eata_dma.o obj-$(CONFIG_SCSI_EATA_PIO) += eata_pio.o obj-$(CONFIG_SCSI_7000FASST) += wd7000.o obj-$(CONFIG_SCSI_MCA_53C9X) += NCR53C9x.o mca_53c9x.o diff -Nru a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c --- a/drivers/scsi/aacraid/linit.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/aacraid/linit.c Thu Feb 20 23:19:21 2003 @@ -217,7 +217,7 @@ host_ptr->irq = dev->irq; /* Adapter IRQ number */ /* host_ptr->base = ( char * )(dev->resource[0].start & ~0xff); */ host_ptr->base = dev->resource[0].start; - scsi_set_pci_device(host_ptr, dev); + scsi_set_device(host_ptr, &dev->dev); dprintk((KERN_DEBUG "Device base address = 0x%lx [0x%lx].\n", host_ptr->base, dev->resource[0].start)); dprintk((KERN_DEBUG "Device irq = 0x%x.\n", dev->irq)); /* @@ -734,5 +734,3 @@ *start_ptr = proc_buffer; return sprintf(proc_buffer, "%s %d\n", "Raid Controller, scsi hba number", host_no); } - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c --- a/drivers/scsi/advansys.c Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/advansys.c Thu Feb 20 23:19:20 2003 @@ -4791,9 +4791,8 @@ if (shp == NULL) { continue; } -#ifdef CONFIG_PCI - scsi_set_pci_device(shp, pci_devp); -#endif + + scsi_set_device(shp, &pci_devp->dev); /* Save a pointer to the Scsi_host of each board found. */ asc_host[asc_board_count++] = shp; diff -Nru a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c --- a/drivers/scsi/aha152x.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/aha152x.c Thu Feb 20 23:19:19 2003 @@ -306,9 +306,9 @@ #define ERR_LEAD KERN_ERR LEAD #define DEBUG_LEAD KERN_DEBUG LEAD #define CMDINFO(cmd) \ - (cmd) ? ((cmd)->host->host_no) : -1, \ - (cmd) ? ((cmd)->target & 0x0f) : -1, \ - (cmd) ? ((cmd)->lun & 0x07) : -1 + (cmd) ? ((cmd)->device->host->host_no) : -1, \ + (cmd) ? ((cmd)->device->id & 0x0f) : -1, \ + (cmd) ? ((cmd)->device->lun & 0x07) : -1 #define DELAY_DEFAULT 1000 @@ -583,8 +583,8 @@ #define DATA_LEN (HOSTDATA(shpnt)->data_len) -#define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->target]) -#define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->target]) +#define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id]) +#define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id]) #define DELAY (HOSTDATA(shpnt)->delay) #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans) @@ -771,7 +771,7 @@ Scsi_Cmnd *ptr, *prev; for (ptr = *SC, prev = NULL; - ptr && ((ptr->target != target) || (ptr->lun != lun)); + ptr && ((ptr->device->id != target) || (ptr->device->lun != lun)); prev = ptr, ptr = SCNEXT(ptr)) ; @@ -1476,7 +1476,7 @@ */ int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int phase, Scsi_Cmnd *done_SC, void (*done)(Scsi_Cmnd *)) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->device->host; unsigned long flags; #if defined(AHA152X_DEBUG) @@ -1589,7 +1589,7 @@ */ int aha152x_abort(Scsi_Cmnd *SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->device->host; Scsi_Cmnd *ptr; unsigned long flags; @@ -1641,7 +1641,7 @@ { Scsi_Cmnd *SCp = (Scsi_Cmnd *)p; struct semaphore *sem = SCSEM(SCp); - struct Scsi_Host *shpnt = SCp->host; + struct Scsi_Host *shpnt = SCp->device->host; /* remove command from issue queue */ if(remove_SC(&ISSUE_SC, SCp)) { @@ -1663,10 +1663,11 @@ */ int aha152x_device_reset(Scsi_Cmnd * SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->device->host; DECLARE_MUTEX_LOCKED(sem); struct timer_list timer; - Scsi_Cmnd cmnd; + Scsi_Cmnd *cmd; + int ret; #if defined(AHA152X_DEBUG) if(HOSTDATA(shpnt)->debug & debug_eh) { @@ -1680,31 +1681,42 @@ return FAILED; } - cmnd.cmd_len = 0; - cmnd.host = SCpnt->host; - cmnd.target = SCpnt->target; - cmnd.lun = SCpnt->lun; - cmnd.use_sg = 0; - cmnd.request_buffer = 0; - cmnd.request_bufflen = 0; + spin_unlock_irq(shpnt->host_lock); + cmd = scsi_get_command(SCpnt->device, GFP_ATOMIC); + if (!cmd) { + spin_lock_irq(shpnt->host_lock); + return FAILED; + } + + cmd->cmd_len = 0; + cmd->device->host = SCpnt->device->host; + cmd->device->id = SCpnt->device->id; + cmd->device->lun = SCpnt->device->lun; + cmd->use_sg = 0; + cmd->request_buffer = 0; + cmd->request_bufflen = 0; init_timer(&timer); - timer.data = (unsigned long) &cmnd; + timer.data = (unsigned long) cmd; timer.expires = jiffies + 100*HZ; /* 10s */ timer.function = (void (*)(unsigned long)) timer_expired; - aha152x_internal_queue(&cmnd, &sem, resetting, 0, internal_done); + aha152x_internal_queue(cmd, &sem, resetting, 0, internal_done); add_timer(&timer); down(&sem); del_timer(&timer); - if(cmnd.SCp.phase & resetted) { - return SUCCESS; + if(cmd->SCp.phase & resetted) { + ret = SUCCESS; } else { - return FAILED; + ret = FAILED; } + + scsi_put_command(cmd); + spin_lock_irq(shpnt->host_lock); + return ret; } void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs) @@ -1738,7 +1750,7 @@ */ int aha152x_bus_reset(Scsi_Cmnd *SCpnt) { - struct Scsi_Host *shpnt = SCpnt->host; + struct Scsi_Host *shpnt = SCpnt->device->host; unsigned long flags; #if defined(AHA152X_DEBUG) @@ -1822,7 +1834,7 @@ aha152x_bus_reset(SCpnt); DPRINTK(debug_eh, DEBUG_LEAD "resetting ports\n", CMDINFO(SCpnt)); - reset_ports(SCpnt->host); + reset_ports(SCpnt->device->host); return SUCCESS; } @@ -2052,9 +2064,9 @@ cmnd->cmnd[4] = sizeof(ptr->sense_buffer); cmnd->cmnd[5] = 0; cmnd->cmd_len = 6; - cmnd->host = ptr->host; - cmnd->target = ptr->target; - cmnd->lun = ptr->lun; + cmnd->device->host = ptr->device->host; + cmnd->device->id = ptr->device->id; + cmnd->device->lun = ptr->device->lun; cmnd->use_sg = 0; cmnd->request_buffer = ptr->sense_buffer; cmnd->request_bufflen = sizeof(ptr->sense_buffer); @@ -2113,7 +2125,7 @@ /* clear selection timeout */ SETPORT(SSTAT1, SELTO); - SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->target); + SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id); SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER); SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0)); } else { @@ -2152,7 +2164,7 @@ SETPORT(SSTAT0, CLRSELDO); - ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->lun)); + ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); if (CURRENT_SC->SCp.phase & aborting) { ADDMSGO(ABORT); @@ -2472,7 +2484,7 @@ { if(MSGOLEN==0) { if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) { - ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->lun)); + ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); } else { printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC)); ADDMSGO(MESSAGE_REJECT); @@ -3376,7 +3388,7 @@ static void show_command(Scsi_Cmnd *ptr) { printk(KERN_DEBUG "0x%08x: target=%d; lun=%d; cmnd=(", - (unsigned int) ptr, ptr->target, ptr->lun); + (unsigned int) ptr, ptr->device->id, ptr->device->lun); print_command(ptr->cmnd); @@ -3441,7 +3453,7 @@ int i; SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ", - (unsigned int) ptr, ptr->target, ptr->lun); + (unsigned int) ptr, ptr->device->id, ptr->device->lun); for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++) SPRINTF("0x%02x ", ptr->cmnd[i]); diff -Nru a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h --- a/drivers/scsi/aic7xxx/aic79xx.h Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/aic7xxx/aic79xx.h Thu Feb 20 23:19:22 2003 @@ -404,7 +404,7 @@ * Initiator mode SCB shared data area. * If the embedded CDB is 12 bytes or less, we embed * the sense buffer address in the SCB. This allows - * us to retrieve sense information without interupting + * us to retrieve sense information without interrupting * the host in packetized mode. */ typedef uint32_t sense_addr_t; diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c --- a/drivers/scsi/aic7xxx/aic79xx_osm.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c Thu Feb 20 23:19:22 2003 @@ -1826,7 +1826,7 @@ * At least in 2.2.14, malloc is a slab allocator so all * allocations are aligned. We assume for these kernel versions * that all allocations will be bellow 4Gig, physically contiguous, - * and accessable via DMA by the controller. + * and accessible via DMA by the controller. */ map = NULL; /* No additional information to store */ *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT); @@ -2381,7 +2381,9 @@ ahd_set_name(ahd, new_name); } host->unique_id = ahd->unit; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + scsi_set_device(host, &ahd->dev_softc->dev); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) scsi_set_pci_device(host, ahd->dev_softc); #endif ahd_linux_initialize_scsi_bus(ahd); @@ -4268,6 +4270,7 @@ */ hscb->control = 0; hscb->scsiid = BUILD_SCSIID(ahd, cmd); + hscb->lun = cmd->device->lun; scb->hscb->task_management = 0; mask = SCB_GET_TARGET_MASK(ahd, scb); diff -Nru a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c --- a/drivers/scsi/aic7xxx/aic79xx_pci.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c Thu Feb 20 23:19:21 2003 @@ -740,7 +740,7 @@ if (i == 5) continue; pci_status[i] = ahd_inb(ahd, reg); - /* Clear latched errors. So our interupt deasserts. */ + /* Clear latched errors. So our interrupt deasserts. */ ahd_outb(ahd, reg, pci_status[i]); } @@ -796,14 +796,14 @@ split_status[i] = ahd_inb(ahd, DCHSPLTSTAT0); split_status1[i] = ahd_inb(ahd, DCHSPLTSTAT1); - /* Clear latched errors. So our interupt deasserts. */ + /* Clear latched errors. So our interrupt deasserts. */ ahd_outb(ahd, DCHSPLTSTAT0, split_status[i]); ahd_outb(ahd, DCHSPLTSTAT1, split_status1[i]); if (i != 0) continue; sg_split_status[i] = ahd_inb(ahd, SGSPLTSTAT0); sg_split_status1[i] = ahd_inb(ahd, SGSPLTSTAT1); - /* Clear latched errors. So our interupt deasserts. */ + /* Clear latched errors. So our interrupt deasserts. */ ahd_outb(ahd, SGSPLTSTAT0, sg_split_status[i]); ahd_outb(ahd, SGSPLTSTAT1, sg_split_status1[i]); } diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c Thu Feb 20 23:19:19 2003 @@ -1435,7 +1435,7 @@ * At least in 2.2.14, malloc is a slab allocator so all * allocations are aligned. We assume for these kernel versions * that all allocations will be bellow 4Gig, physically contiguous, - * and accessable via DMA by the controller. + * and accessible via DMA by the controller. */ map = NULL; /* No additional information to store */ *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT); @@ -1861,7 +1861,9 @@ ahc_set_name(ahc, new_name); } host->unique_id = ahc->unit; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + scsi_set_device(host, &ahc->dev_softc->dev); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) scsi_set_pci_device(host, ahc->dev_softc); #endif ahc_linux_initialize_scsi_bus(ahc); diff -Nru a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c --- a/drivers/scsi/aic7xxx_old.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/aic7xxx_old.c Thu Feb 20 23:19:21 2003 @@ -8450,7 +8450,7 @@ } p->host_no = host->host_no; } - scsi_set_pci_device(host, p->pdev); + scsi_set_device(host, &p->pdev->dev); return (p); } diff -Nru a/drivers/scsi/cpqfcTSinit.c b/drivers/scsi/cpqfcTSinit.c --- a/drivers/scsi/cpqfcTSinit.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/cpqfcTSinit.c Thu Feb 20 23:19:19 2003 @@ -337,7 +337,7 @@ DEBUG_PCI(printk(" PciDev->baseaddress[3]= %lx\n", PciDev->resource[3].start)); - scsi_set_pci_device(HostAdapter, PciDev); + scsi_set_device(HostAdapter, &PciDev->dev); HostAdapter->irq = PciDev->irq; // copy for Scsi layers // HP Tachlite uses two (255-byte) ranges of Port I/O (lower & upper), diff -Nru a/drivers/scsi/cpqioctl.c b/drivers/scsi/cpqioctl.c --- a/drivers/scsi/cpqioctl.c Thu Feb 20 23:19:20 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,76 +0,0 @@ -// Test program for CPQFCTS ioctl calls -// build with: -// gcc -o cpqioctl cpqioctl.c -// ld -o cpqioctl /lib/crt0.o cpqioctl.o -lc - -#include -#include -#include -#include -#include -#include -#include "../../include/scsi/scsi.h" -#include "cpqfcTSioctl.h" - -typedef struct scsi_fctargaddress { - unsigned long host_port_id; - unsigned char host_wwn[8]; -} Scsi_FCTargAddress; - -int main(int argc, char **argv) { - - int fd, i; - Scsi_FCTargAddress targ; - int uselect=0; - - - - if ( argc < 2 ) { - printf("usage: cpqioctl \n"); - exit(1); - } - - if ( (fd = open(argv[1], O_RDONLY)) == -1) { - perror("open"); - exit(1); - } - - if ( ioctl(fd, SCSI_IOCTL_FC_TARGET_ADDRESS, &targ) ) { - perror("ioctl"); - exit(1); - } - - - printf("portid: %08x. wwn: ", targ.host_port_id); - - for (i=0;i<8;i++) printf(" %02x", targ.host_wwn[i]); - printf("\n"); - - while( uselect != 27 ) // not ESC key - { - printf("\n IOCTL \n"); - printf( "1. Get PCI info\n"); - printf( "2. Send Passthru\n"); - printf( " ==> "); - scanf("%c", &uselect); - - switch( uselect ) - { - case '1': - { - cciss_pci_info_struct pciinfo; - - if( ioctl( fd, CCPQFCTS_GETPCIINFO ,&pciinfo )) - perror("ioctl"); - else - printf( "\nPCI bus %d, dev_fn %d, board_id %Xh\n", - pciinfo.bus, pciinfo.dev_fn, pciinfo.board_id); - } - - } - } - - - close(fd); - return 0; -} diff -Nru a/drivers/scsi/dmx3191d.c b/drivers/scsi/dmx3191d.c --- a/drivers/scsi/dmx3191d.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/dmx3191d.c Thu Feb 20 23:19:22 2003 @@ -86,7 +86,7 @@ release_region(port, DMX3191D_REGION); continue; } - scsi_set_pci_device(instance, pdev); + scsi_set_device(instance, &pdev->dev); instance->io_port = port; instance->irq = pdev->irq; NCR5380_init(instance, FLAG_NO_PSEUDO_DMA | FLAG_DTC3181E); diff -Nru a/drivers/scsi/eata_dma.c b/drivers/scsi/eata_dma.c --- a/drivers/scsi/eata_dma.c Thu Feb 20 23:19:19 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,1572 +0,0 @@ -/************************************************************ - * * - * Linux EATA SCSI driver * - * * - * based on the CAM document CAM/89-004 rev. 2.0c, * - * DPT's driver kit, some internal documents and source, * - * and several other Linux scsi drivers and kernel docs. * - * * - * The driver currently: * - * -supports all ISA based EATA-DMA boards * - * like PM2011, PM2021, PM2041, PM3021 * - * -supports all EISA based EATA-DMA boards * - * like PM2012B, PM2022, PM2122, PM2322, PM2042, * - * PM3122, PM3222, PM3332 * - * -supports all PCI based EATA-DMA boards * - * like PM2024, PM2124, PM2044, PM2144, PM3224, * - * PM3334 * - * -supports the Wide, Ultra Wide and Differential * - * versions of the boards * - * -supports multiple HBAs with & without IRQ sharing * - * -supports all SCSI channels on multi channel boards * - * -supports ix86 and MIPS, untested on ALPHA * - * -needs identical IDs on all channels of a HBA * - * -can be loaded as module * - * -displays statistical and hardware information * - * in /proc/scsi/eata_dma * - * -provides rudimentary latency measurement * - * possibilities via /proc/scsi/eata_dma/ * - * * - * (c)1993-96 Michael Neuffer * - * mike@i-Connect.Net * - * neuffer@mail.uni-mainz.de * - * * - * This program is free software; you can redistribute it * - * and/or modify it under the terms of the GNU General * - * Public License as published by the Free Software * - * Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * 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 kernel; if not, write to * - * the Free Software Foundation, Inc., 675 Mass Ave, * - * Cambridge, MA 02139, USA. * - * * - * I have to thank DPT for their excellent support. I took * - * me almost a year and a stopover at their HQ, on my first * - * trip to the USA, to get it, but since then they've been * - * very helpful and tried to give me all the infos and * - * support I need. * - * * - * Thanks also to Simon Shapiro, Greg Hosler and Mike * - * Jagdis who did a lot of testing and found quite a number * - * of bugs during the development. * - ************************************************************ - * last change: 96/10/21 OS: Linux 2.0.23 * - ************************************************************/ - -/* Look in eata_dma.h for configuration and revision information */ - -#error Please convert me to Documentation/DMA-mapping.txt - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __mips__ -#include -#include -#endif -#include -#include "scsi.h" -#include "hosts.h" -#include "eata_dma.h" -#include "eata_dma_proc.h" - -#include -#include /* for CONFIG_PCI */ - -static u32 ISAbases[] = -{0x1F0, 0x170, 0x330, 0x230}; -static unchar EISAbases[] = -{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; -static uint registered_HBAs = 0; -static struct Scsi_Host *last_HBA = NULL; -static struct Scsi_Host *first_HBA = NULL; -static unchar reg_IRQ[] = -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static unchar reg_IRQL[] = -{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static struct eata_sp *status = 0; /* Statuspacket array */ -static void *dma_scratch = 0; - -static struct eata_register *fake_int_base; -static int fake_int_result; -static int fake_int_happened; - -static ulong int_counter = 0; -static ulong queue_counter = 0; - -void eata_fake_int_handler(s32 irq, void *dev_id, struct pt_regs * regs) -{ - fake_int_result = inb((ulong)fake_int_base + HA_RSTATUS); - fake_int_happened = TRUE; - DBG(DBG_INTR3, printk("eata_fake_int_handler called irq%d base %p" - " res %#x\n", irq, fake_int_base, fake_int_result)); - return; -} - -#include "eata_dma_proc.c" - -#ifdef MODULE -int eata_release(struct Scsi_Host *sh) -{ - uint i; - if (sh->irq && reg_IRQ[sh->irq] == 1) free_irq(sh->irq, NULL); - else reg_IRQ[sh->irq]--; - - kfree((void *)status); - kfree((void *)dma_scratch - 4); - for (i = 0; i < sh->can_queue; i++){ /* Free all SG arrays */ - if(SD(sh)->ccb[i].sg_list != NULL) - kfree((void *) SD(sh)->ccb[i].sg_list); - } - - if (SD(sh)->channel == 0) { - if (sh->dma_channel != BUSMASTER) free_dma(sh->dma_channel); - if (sh->io_port && sh->n_io_port) - release_region(sh->io_port, sh->n_io_port); - } - return(TRUE); -} -#endif - - -inline void eata_latency_in(struct eata_ccb *cp, hostdata *hd) -{ - uint time; - time = jiffies - cp->timestamp; - if(hd->all_lat[1] > time) - hd->all_lat[1] = time; - if(hd->all_lat[2] < time) - hd->all_lat[2] = time; - hd->all_lat[3] += time; - hd->all_lat[0]++; - if((cp->rw_latency) == WRITE) { /* was WRITE */ - if(hd->writes_lat[cp->sizeindex][1] > time) - hd->writes_lat[cp->sizeindex][1] = time; - if(hd->writes_lat[cp->sizeindex][2] < time) - hd->writes_lat[cp->sizeindex][2] = time; - hd->writes_lat[cp->sizeindex][3] += time; - hd->writes_lat[cp->sizeindex][0]++; - } else if((cp->rw_latency) == READ) { - if(hd->reads_lat[cp->sizeindex][1] > time) - hd->reads_lat[cp->sizeindex][1] = time; - if(hd->reads_lat[cp->sizeindex][2] < time) - hd->reads_lat[cp->sizeindex][2] = time; - hd->reads_lat[cp->sizeindex][3] += time; - hd->reads_lat[cp->sizeindex][0]++; - } -} - -inline void eata_latency_out(struct eata_ccb *cp, Scsi_Cmnd *cmd) -{ - int x, z; - short *sho; - long *lon; - x = 0; /* just to keep GCC quiet */ - cp->timestamp = jiffies; /* For latency measurements */ - switch(cmd->cmnd[0]) { - case WRITE_6: - x = cmd->cmnd[4]/2; - cp->rw_latency = WRITE; - break; - case READ_6: - x = cmd->cmnd[4]/2; - cp->rw_latency = READ; - break; - case WRITE_10: - sho = (short *) &cmd->cmnd[7]; - x = ntohs(*sho)/2; - cp->rw_latency = WRITE; - break; - case READ_10: - sho = (short *) &cmd->cmnd[7]; - x = ntohs(*sho)/2; - cp->rw_latency = READ; - break; - case WRITE_12: - lon = (long *) &cmd->cmnd[6]; - x = ntohl(*lon)/2; - cp->rw_latency = WRITE; - break; - case READ_12: - lon = (long *) &cmd->cmnd[6]; - x = ntohl(*lon)/2; - cp->rw_latency = READ; - break; - default: - cp->rw_latency = OTHER; - break; - } - if (cmd->cmnd[0] == WRITE_6 || cmd->cmnd[0] == WRITE_10 || - cmd->cmnd[0] == WRITE_12 || cmd->cmnd[0] == READ_6 || - cmd->cmnd[0] == READ_10 || cmd->cmnd[0] == READ_12) { - for(z = 0; (x > (1 << z)) && (z <= 11); z++) - /* nothing */; - cp->sizeindex = z; - } -} - -void eata_int_handler(int, void *, struct pt_regs *); - -void do_eata_int_handler(int irq, void *dev_id, struct pt_regs * regs) -{ - unsigned long flags; - struct Scsi_Host *dev = dev_id; - - spin_lock_irqsave(dev->host_lock, flags); - eata_int_handler(irq, dev_id, regs); - spin_unlock_irqrestore(dev->host_lock, flags); -} - -void eata_int_handler(int irq, void *dev_id, struct pt_regs * regs) -{ - uint i, result = 0; - uint hba_stat, scsi_stat, eata_stat; - Scsi_Cmnd *cmd; - struct eata_ccb *ccb; - struct eata_sp *sp; - uint base; - uint x; - struct Scsi_Host *sh; - - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) { - if (sh->irq != irq) - continue; - - while(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) { - - int_counter++; - - sp = &SD(sh)->sp; -#ifdef __mips__ - sys_cacheflush(sp, sizeof(struct eata_sp), 2); -#endif - ccb = sp->ccb; - - if(ccb == NULL) { - eata_stat = inb((uint)sh->base + HA_RSTATUS); - printk("eata_dma: int_handler, Spurious IRQ %d " - "received. CCB pointer not set.\n", irq); - break; - } - - cmd = ccb->cmd; - base = (uint) cmd->device->host->base; - hba_stat = sp->hba_stat; - - scsi_stat = (sp->scsi_stat >> 1) & 0x1f; - - if (sp->EOC == FALSE) { - eata_stat = inb(base + HA_RSTATUS); - printk(KERN_WARNING "eata_dma: int_handler, board: %x cmd %lx " - "returned unfinished.\n" - "EATA: %x HBA: %x SCSI: %x spadr %lx spadrirq %lx, " - "irq%d\n", base, (long)ccb, eata_stat, hba_stat, - scsi_stat,(long)&status, (long)&status[irq], irq); - cmd->result = DID_ERROR << 16; - ccb->status = FREE; - cmd->scsi_done(cmd); - break; - } - - sp->EOC = FALSE; /* Clean out this flag */ - - if (ccb->status == LOCKED || ccb->status == RESET) { - printk("eata_dma: int_handler, reseted command pid %ld returned" - "\n", cmd->pid); - DBG(DBG_INTR && DBG_DELAY, DELAY(1)); - } - - eata_stat = inb(base + HA_RSTATUS); - DBG(DBG_INTR, printk("IRQ %d received, base %#.4x, pid %ld, " - "target: %x, lun: %x, ea_s: %#.2x, hba_s: " - "%#.2x \n", irq, base, cmd->pid, cmd->device->id, - cmd->device->lun, eata_stat, hba_stat)); - - switch (hba_stat) { - case HA_NO_ERROR: /* NO Error */ - if(HD(cmd)->do_latency == TRUE && ccb->timestamp) - eata_latency_in(ccb, HD(cmd)); - result = DID_OK << 16; - break; - case HA_ERR_SEL_TO: /* Selection Timeout */ - case HA_ERR_CMD_TO: /* Command Timeout */ - result = DID_TIME_OUT << 16; - break; - case HA_BUS_RESET: /* SCSI Bus Reset Received */ - result = DID_RESET << 16; - DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: BUS RESET " - "received on cmd %ld\n", - HD(cmd)->HBA_number, cmd->pid)); - break; - case HA_INIT_POWERUP: /* Initial Controller Power-up */ - if (cmd->device->type != TYPE_TAPE) - result = DID_BUS_BUSY << 16; - else - result = DID_ERROR << 16; - - for (i = 0; i < MAXTARGET; i++) - DBG(DBG_STATUS, printk(KERN_DEBUG "scsi%d: cmd pid %ld " - "returned with INIT_POWERUP\n", - HD(cmd)->HBA_number, cmd->pid)); - break; - case HA_CP_ABORT_NA: - case HA_CP_ABORTED: - result = DID_ABORT << 16; - DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: aborted cmd " - "returned\n", HD(cmd)->HBA_number)); - break; - case HA_CP_RESET_NA: - case HA_CP_RESET: - HD(cmd)->resetlevel[cmd->device->channel] = 0; - result = DID_RESET << 16; - DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: reseted cmd " - "pid %ldreturned\n", - HD(cmd)->HBA_number, cmd->pid)); - case HA_SCSI_HUNG: /* SCSI Hung */ - printk(KERN_ERR "scsi%d: SCSI hung\n", HD(cmd)->HBA_number); - result = DID_ERROR << 16; - break; - case HA_RSENSE_FAIL: /* Auto Request-Sense Failed */ - DBG(DBG_STATUS, printk(KERN_ERR "scsi%d: Auto Request Sense " - "Failed\n", HD(cmd)->HBA_number)); - result = DID_ERROR << 16; - break; - case HA_UNX_BUSPHASE: /* Unexpected Bus Phase */ - case HA_UNX_BUS_FREE: /* Unexpected Bus Free */ - case HA_BUS_PARITY: /* Bus Parity Error */ - case HA_UNX_MSGRJCT: /* Unexpected Message Reject */ - case HA_RESET_STUCK: /* SCSI Bus Reset Stuck */ - case HA_PARITY_ERR: /* Controller Ram Parity */ - default: - result = DID_ERROR << 16; - break; - } - cmd->result = result | (scsi_stat << 1); - -#if DBG_INTR2 - if (scsi_stat || result || hba_stat || eata_stat != 0x50 - || cmd->scsi_done == NULL || cmd->device->id == 7) - printk("HBA: %d, channel %d, id: %d, lun %d, pid %ld:\n" - "eata_stat %#x, hba_stat %#.2x, scsi_stat %#.2x, " - "sense_key: %#x, result: %#.8x\n", x, - cmd->device->channel, cmd->device->id, cmd->device->lun, - cmd->pid, eata_stat, hba_stat, scsi_stat, - cmd->sense_buffer[2] & 0xf, cmd->result); - DBG(DBG_INTR&&DBG_DELAY,DELAY(1)); -#endif - - ccb->status = FREE; /* now we can release the slot */ - cmd->scsi_done(cmd); - } - } - - return; -} - -inline int eata_send_command(u32 addr, u32 base, u8 command) -{ - long loop = R_LIMIT; - - while (inb(base + HA_RAUXSTAT) & HA_ABUSY) - if (--loop == 0) - return(FALSE); - - if(addr != (u32) NULL) - addr = virt_to_bus((void *)addr); - - /* - * This is overkill.....but the MIPSen seem to need this - * and it will be optimized away for i86 and ALPHA machines. - */ - flush_cache_all(); - - /* And now the address in nice little byte chunks */ -#ifdef __LITTLE_ENDIAN - outb(addr, base + HA_WDMAADDR); - outb(addr >> 8, base + HA_WDMAADDR + 1); - outb(addr >> 16, base + HA_WDMAADDR + 2); - outb(addr >> 24, base + HA_WDMAADDR + 3); -#else - outb(addr >> 24, base + HA_WDMAADDR); - outb(addr >> 16, base + HA_WDMAADDR + 1); - outb(addr >> 8, base + HA_WDMAADDR + 2); - outb(addr, base + HA_WDMAADDR + 3); -#endif - outb(command, base + HA_WCOMMAND); - return(TRUE); -} - -inline int eata_send_immediate(u32 base, u32 addr, u8 ifc, u8 code, u8 code2) -{ - if(addr != (u32) NULL) - addr = virt_to_bus((void *)addr); - - /* - * This is overkill.....but the MIPSen seem to need this - * and it will be optimized away for i86 and ALPHA machines. - */ - flush_cache_all(); - - outb(0x0, base + HA_WDMAADDR - 1); - if(addr){ -#ifdef __LITTLE_ENDIAN - outb(addr, base + HA_WDMAADDR); - outb(addr >> 8, base + HA_WDMAADDR + 1); - outb(addr >> 16, base + HA_WDMAADDR + 2); - outb(addr >> 24, base + HA_WDMAADDR + 3); -#else - outb(addr >> 24, base + HA_WDMAADDR); - outb(addr >> 16, base + HA_WDMAADDR + 1); - outb(addr >> 8, base + HA_WDMAADDR + 2); - outb(addr, base + HA_WDMAADDR + 3); -#endif - } else { - outb(0x0, base + HA_WDMAADDR); - outb(0x0, base + HA_WDMAADDR + 1); - outb(code2, base + HA_WCODE2); - outb(code, base + HA_WCODE); - } - - outb(ifc, base + HA_WIFC); - outb(EATA_CMD_IMMEDIATE, base + HA_WCOMMAND); - return(TRUE); -} - -int eata_queue(Scsi_Cmnd * cmd, void (* done) (Scsi_Cmnd *)) -{ - unsigned int i, x, y; - ulong flags; - hostdata *hd; - struct Scsi_Host *sh; - struct eata_ccb *ccb; - struct scatterlist *sl; - - - save_flags(flags); - cli(); - -#if 0 - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) { - if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) { - printk("eata_dma: scsi%d interrupt pending in eata_queue.\n" - " Calling interrupt handler.\n", sh->host_no); - eata_int_handler(sh->irq, 0, 0); - } - } -#endif - - queue_counter++; - - hd = HD(cmd); - sh = cmd->device->host; - - if (cmd->cmnd[0] == REQUEST_SENSE && cmd->sense_buffer[0] != 0) { - DBG(DBG_REQSENSE, printk(KERN_DEBUG "Tried to REQUEST SENSE\n")); - cmd->result = DID_OK << 16; - done(cmd); - restore_flags(flags); - - return(0); - } - - /* check for free slot */ - for (y = hd->last_ccb + 1, x = 0; x < sh->can_queue; x++, y++) { - if (y >= sh->can_queue) - y = 0; - if (hd->ccb[y].status == FREE) - break; - } - - hd->last_ccb = y; - - if (x >= sh->can_queue) { - cmd->result = DID_BUS_BUSY << 16; - DBG(DBG_QUEUE && DBG_ABNORM, - printk(KERN_CRIT "eata_queue pid %ld, HBA QUEUE FULL..., " - "returning DID_BUS_BUSY\n", cmd->pid)); - done(cmd); - restore_flags(flags); - return(0); - } - ccb = &hd->ccb[y]; - - memset(ccb, 0, sizeof(struct eata_ccb) - sizeof(struct eata_sg_list *)); - - ccb->status = USED; /* claim free slot */ - - restore_flags(flags); - - DBG(DBG_QUEUE, printk("eata_queue pid %ld, target: %x, lun: %x, y %d\n", - cmd->pid, cmd->device->id, cmd->device->lun, y)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); - - if(hd->do_latency == TRUE) - eata_latency_out(ccb, cmd); - - cmd->scsi_done = (void *)done; - - switch (cmd->cmnd[0]) { - case CHANGE_DEFINITION: case COMPARE: case COPY: - case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT: - case MODE_SELECT_10: case SEND_DIAGNOSTIC: case WRITE_BUFFER: - case FORMAT_UNIT: case REASSIGN_BLOCKS: case RESERVE: - case SEARCH_EQUAL: case SEARCH_HIGH: case SEARCH_LOW: - case WRITE_6: case WRITE_10: case WRITE_VERIFY: - case UPDATE_BLOCK: case WRITE_LONG: case WRITE_SAME: - case SEARCH_HIGH_12: case SEARCH_EQUAL_12: case SEARCH_LOW_12: - case WRITE_12: case WRITE_VERIFY_12: case SET_WINDOW: - case MEDIUM_SCAN: case SEND_VOLUME_TAG: - case 0xea: /* alternate number for WRITE LONG */ - ccb->DataOut = TRUE; /* Output mode */ - break; - case TEST_UNIT_READY: - default: - ccb->DataIn = TRUE; /* Input mode */ - } - - /* FIXME: This will will have to be changed once the midlevel driver - * allows different HBA IDs on every channel. - */ - if (cmd->device->id == sh->this_id) - ccb->Interpret = TRUE; /* Interpret command */ - - if (cmd->use_sg) { - ccb->scatter = TRUE; /* SG mode */ - if (ccb->sg_list == NULL) { - ccb->sg_list = kmalloc(sh->sg_tablesize * sizeof(struct eata_sg_list), - GFP_ATOMIC | GFP_DMA); - } - if (ccb->sg_list == NULL) - { - /* - * Claim the bus was busy. Actually we are the problem but this - * will do a deferred retry for us ;) - */ - printk(KERN_ERR "eata_dma: Run out of DMA memory for SG lists !\n"); - cmd->result = DID_BUS_BUSY << 16; - ccb->status = FREE; - done(cmd); - return(0); - } - ccb->cp_dataDMA = htonl(virt_to_bus(ccb->sg_list)); - - ccb->cp_datalen = htonl(cmd->use_sg * sizeof(struct eata_sg_list)); - sl=(struct scatterlist *)cmd->request_buffer; - for(i = 0; i < cmd->use_sg; i++, sl++){ - ccb->sg_list[i].data = htonl(virt_to_bus(sl->address)); - ccb->sg_list[i].len = htonl((u32) sl->length); - } - } else { - ccb->scatter = FALSE; - ccb->cp_datalen = htonl(cmd->request_bufflen); - ccb->cp_dataDMA = htonl(virt_to_bus(cmd->request_buffer)); - } - - ccb->Auto_Req_Sen = TRUE; - ccb->cp_reqDMA = htonl(virt_to_bus(cmd->sense_buffer)); - ccb->reqlen = sizeof(cmd->sense_buffer); - - ccb->cp_id = cmd->device->id; - ccb->cp_channel = cmd->device->channel; - ccb->cp_lun = cmd->device->lun; - ccb->cp_dispri = TRUE; - ccb->cp_identify = TRUE; - memcpy(ccb->cp_cdb, cmd->cmnd, cmd->cmd_len); - - ccb->cp_statDMA = htonl(virt_to_bus(&(hd->sp))); - - ccb->cp_viraddr = ccb; /* This will be passed thru, so we don't need to - * convert it */ - ccb->cmd = cmd; - cmd->host_scribble = (char *)&hd->ccb[y]; - - if(eata_send_command((u32) ccb, (u32) sh->base, EATA_CMD_DMA_SEND_CP) == FALSE) { - cmd->result = DID_BUS_BUSY << 16; - DBG(DBG_QUEUE && DBG_ABNORM, - printk("eata_queue target %d, pid %ld, HBA busy, " - "returning DID_BUS_BUSY\n",cmd->device->id, cmd->pid)); - ccb->status = FREE; - done(cmd); - return(0); - } - DBG(DBG_QUEUE, printk("Queued base %#.4x pid: %ld target: %x lun: %x " - "slot %d irq %d\n", (s32)sh->base, cmd->pid, - cmd->device->id, cmd->device->lun, y, sh->irq)); - DBG(DBG_QUEUE && DBG_DELAY, DELAY(1)); - - return(0); -} - - -int eata_abort(Scsi_Cmnd * cmd) -{ - ulong loop = HZ / 2; - ulong flags; - int x; - struct Scsi_Host *sh; - - save_flags(flags); - cli(); - - DBG(DBG_ABNORM, printk("eata_abort called pid: %ld target: %x lun: %x" - " reason %x\n", cmd->pid, cmd->device->id, cmd->device->lun, - cmd->abort_reason)); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - - /* Some interrupt controllers seem to loose interrupts */ - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) { - if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) { - printk("eata_dma: scsi%d interrupt pending in eata_abort.\n" - " Calling interrupt handler.\n", sh->host_no); - eata_int_handler(sh->irq, 0, 0); - } - } - - while (inb((u32)(cmd->device->host->base) + HA_RAUXSTAT) & HA_ABUSY) { - if (--loop == 0) { - printk("eata_dma: abort, timeout error.\n"); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - restore_flags(flags); - return (SCSI_ABORT_ERROR); - } - } - if (CD(cmd)->status == RESET) { - printk("eata_dma: abort, command reset error.\n"); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - restore_flags(flags); - return (SCSI_ABORT_ERROR); - } - if (CD(cmd)->status == LOCKED) { - DBG(DBG_ABNORM, printk("eata_dma: abort, queue slot locked.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - restore_flags(flags); - return (SCSI_ABORT_NOT_RUNNING); - } - if (CD(cmd)->status == USED) { - DBG(DBG_ABNORM, printk("Returning: SCSI_ABORT_BUSY\n")); - restore_flags(flags); - return (SCSI_ABORT_BUSY); /* SNOOZE */ - } - if (CD(cmd)->status == FREE) { - DBG(DBG_ABNORM, printk("Returning: SCSI_ABORT_NOT_RUNNING\n")); - restore_flags(flags); - return (SCSI_ABORT_NOT_RUNNING); - } - restore_flags(flags); - panic("eata_dma: abort: invalid slot status\n"); -} - -int eata_reset(Scsi_Cmnd * cmd, unsigned int resetflags) -{ - uint x; - /* 10 million PCI reads take at least one third of a second */ - ulong loop = 10 * 1000 * 1000; - ulong flags; - unchar success = FALSE; - Scsi_Cmnd *sp; - struct Scsi_Host *sh; - - save_flags(flags); - cli(); - - DBG(DBG_ABNORM, printk("eata_reset called pid:%ld target: %x lun: %x" - " reason %x\n", cmd->pid, cmd->device->id, cmd->device->lun, - cmd->abort_reason)); - - for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) { - if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) { - printk("eata_dma: scsi%d interrupt pending in eata_reset.\n" - " Calling interrupt handler.\n", sh->host_no); - eata_int_handler(sh->irq, 0, 0); - } - } - - if (HD(cmd)->state == RESET) { - printk("eata_reset: exit, already in reset.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - return (SCSI_RESET_ERROR); - } - - while (inb((u32)(cmd->device->host->base) + HA_RAUXSTAT) & HA_ABUSY) - if (--loop == 0) { - printk("eata_reset: exit, timeout error.\n"); - restore_flags(flags); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - return (SCSI_RESET_ERROR); - } - - for (x = 0; x < cmd->device->host->can_queue; x++) { - if (HD(cmd)->ccb[x].status == FREE) - continue; - - if (HD(cmd)->ccb[x].status == LOCKED) { - HD(cmd)->ccb[x].status = FREE; - printk("eata_reset: locked slot %d forced free.\n", x); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - continue; - } - - - sp = HD(cmd)->ccb[x].cmd; - HD(cmd)->ccb[x].status = RESET; - - if (sp == NULL) - panic("eata_reset: slot %d, sp==NULL.\n", x); - - printk("eata_reset: slot %d in reset, pid %ld.\n", x, sp->pid); - - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - - if (sp == cmd) - success = TRUE; - } - - /* hard reset the HBA */ - inb((u32) (cmd->device->host->base) + HA_RSTATUS); /* This might cause trouble */ - eata_send_command(0, (u32) cmd->device->host->base, EATA_CMD_RESET); - - HD(cmd)->state = RESET; - - DBG(DBG_ABNORM, printk("eata_reset: board reset done, enabling " - "interrupts.\n")); - - DELAY(2); /* In theorie we should get interrupts and set free all - * used queueslots */ - - DBG(DBG_ABNORM, printk("eata_reset: interrupts disabled again.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - - for (x = 0; x < cmd->device->host->can_queue; x++) { - - /* Skip slots already set free by interrupt and those that - * are still LOCKED from the last reset */ - if (HD(cmd)->ccb[x].status != RESET) - continue; - - sp = HD(cmd)->ccb[x].cmd; - sp->result = DID_RESET << 16; - - /* This mailbox is still waiting for its interrupt */ - HD(cmd)->ccb[x].status = LOCKED; - - printk("eata_reset: slot %d locked, DID_RESET, pid %ld done.\n", - x, sp->pid); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - - sp->scsi_done(sp); - } - - HD(cmd)->state = FALSE; - restore_flags(flags); - - if (success) { - DBG(DBG_ABNORM, printk("eata_reset: exit, pending.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - return (SCSI_RESET_PENDING); - } else { - DBG(DBG_ABNORM, printk("eata_reset: exit, wakeup.\n")); - DBG(DBG_ABNORM && DBG_DELAY, DELAY(1)); - return (SCSI_RESET_PUNT); - } -} - -/* Here we try to determine the optimum queue depth for - * each attached device. - * - * At the moment the algorithm is rather simple - */ -static void eata_select_queue_depths(struct Scsi_Host *host, - Scsi_Device *devicelist) -{ - Scsi_Device *device; - int devcount = 0; - int factor = 0; - -#if CRIPPLE_QUEUE - for(device = devicelist; device != NULL; device = device->next) { - if(device->host == host) - device->queue_depth = 2; - } -#else - /* First we do a sample run go find out what we have */ - for(device = devicelist; device != NULL; device = device->next) { - if (device->host == host) { - devcount++; - switch(device->type) { - case TYPE_DISK: - case TYPE_MOD: - factor += TYPE_DISK_QUEUE; - break; - case TYPE_TAPE: - factor += TYPE_TAPE_QUEUE; - break; - case TYPE_WORM: - case TYPE_ROM: - factor += TYPE_ROM_QUEUE; - break; - case TYPE_PROCESSOR: - case TYPE_SCANNER: - default: - factor += TYPE_OTHER_QUEUE; - break; - } - } - } - - DBG(DBG_REGISTER, printk(KERN_DEBUG "scsi%d: needed queueslots %d\n", - host->host_no, factor)); - - if(factor == 0) /* We don't want to get a DIV BY ZERO error */ - factor = 1; - - factor = (SD(host)->queuesize * 10) / factor; - - DBG(DBG_REGISTER, printk(KERN_DEBUG "scsi%d: using factor %dE-1\n", - host->host_no, factor)); - - /* Now that have the factor we can set the individual queuesizes */ - for(device = devicelist; device != NULL; device = device->next) { - if(device->host == host) { - if(SD(device->host)->bustype != IS_ISA){ - switch(device->type) { - case TYPE_DISK: - case TYPE_MOD: - device->queue_depth = (TYPE_DISK_QUEUE * factor) / 10; - break; - case TYPE_TAPE: - device->queue_depth = (TYPE_TAPE_QUEUE * factor) / 10; - break; - case TYPE_WORM: - case TYPE_ROM: - device->queue_depth = (TYPE_ROM_QUEUE * factor) / 10; - break; - case TYPE_PROCESSOR: - case TYPE_SCANNER: - default: - device->queue_depth = (TYPE_OTHER_QUEUE * factor) / 10; - break; - } - } else /* ISA forces us to limit the queue depth because of the - * bounce buffer memory overhead. I know this is cruel */ - device->queue_depth = 2; - - /* - * It showed that we need to set an upper limit of commands - * we can allow to queue for a single device on the bus. - * If we get above that limit, the broken midlevel SCSI code - * will produce bogus timeouts and aborts en masse. :-( - */ - if(device->queue_depth > UPPER_DEVICE_QUEUE_LIMIT) - device->queue_depth = UPPER_DEVICE_QUEUE_LIMIT; - if(device->queue_depth == 0) - device->queue_depth = 1; - - printk(KERN_INFO "scsi%d: queue depth for target %d on channel %d " - "set to %d\n", host->host_no, device->id, device->channel, - device->queue_depth); - } - } -#endif -} - -#if CHECK_BLINK -int check_blink_state(long base) -{ - ushort loops = 10; - u32 blinkindicator; - u32 state = 0x12345678; - u32 oldstate = 0; - - blinkindicator = htonl(0x54504442); - while ((loops--) && (state != oldstate)) { - oldstate = state; - state = inl((uint) base + 1); - } - - DBG(DBG_BLINK, printk("Did Blink check. Status: %d\n", - (state == oldstate) && (state == blinkindicator))); - - if ((state == oldstate) && (state == blinkindicator)) - return(TRUE); - else - return (FALSE); -} -#endif - -char * get_board_data(u32 base, u32 irq, u32 id) -{ - struct eata_ccb *cp; - struct eata_sp *sp; - static char *buff; - ulong i; - - cp = (struct eata_ccb *) kmalloc(sizeof(struct eata_ccb), - GFP_ATOMIC | GFP_DMA); - - if(cp==NULL) - return NULL; - - sp = (struct eata_sp *) kmalloc(sizeof(struct eata_sp), - GFP_ATOMIC | GFP_DMA); - if(sp==NULL) - { - kfree(cp); - return NULL; - } - - buff = dma_scratch; - - memset(cp, 0, sizeof(struct eata_ccb)); - memset(sp, 0, sizeof(struct eata_sp)); - memset(buff, 0, 256); - - cp->DataIn = TRUE; - cp->Interpret = TRUE; /* Interpret command */ - cp->cp_dispri = TRUE; - cp->cp_identify = TRUE; - - cp->cp_datalen = htonl(56); - cp->cp_dataDMA = htonl(virt_to_bus(buff)); - cp->cp_statDMA = htonl(virt_to_bus(sp)); - cp->cp_viraddr = cp; - - cp->cp_id = id; - cp->cp_lun = 0; - - cp->cp_cdb[0] = INQUIRY; - cp->cp_cdb[1] = 0; - cp->cp_cdb[2] = 0; - cp->cp_cdb[3] = 0; - cp->cp_cdb[4] = 56; - cp->cp_cdb[5] = 0; - - fake_int_base = (struct eata_register *) base; - fake_int_result = FALSE; - fake_int_happened = FALSE; - - eata_send_command((u32) cp, (u32) base, EATA_CMD_DMA_SEND_CP); - - i = jiffies + (3 * HZ); - while (fake_int_happened == FALSE && time_before_eq(jiffies, i)) - barrier(); - - DBG(DBG_INTR3, printk(KERN_DEBUG "fake_int_result: %#x hbastat %#x " - "scsistat %#x, buff %p sp %p\n", - fake_int_result, (u32) (sp->hba_stat /*& 0x7f*/), - (u32) sp->scsi_stat, buff, sp)); - - kfree((void *)cp); - kfree((void *)sp); - - if ((fake_int_result & HA_SERROR) || time_after(jiffies, i)){ - printk(KERN_WARNING "eata_dma: trying to reset HBA at %x to clear " - "possible blink state\n", base); - /* hard reset the HBA */ - inb((u32) (base) + HA_RSTATUS); - eata_send_command(0, base, EATA_CMD_RESET); - DELAY(1); - return (NULL); - } else - return (buff); -} - - -int get_conf_PIO(u32 base, struct get_conf *buf) -{ - ulong loop = R_LIMIT; - u16 *p; - - if(check_region(base, 9)) - return (FALSE); - - memset(buf, 0, sizeof(struct get_conf)); - - while (inb(base + HA_RSTATUS) & HA_SBUSY) - if (--loop == 0) - return (FALSE); - - fake_int_base = (struct eata_register *) base; - fake_int_result = FALSE; - fake_int_happened = FALSE; - - DBG(DBG_PIO && DBG_PROBE, - printk("Issuing PIO READ CONFIG to HBA at %#x\n", base)); - eata_send_command(0, base, EATA_CMD_PIO_READ_CONFIG); - - loop = R_LIMIT; - for (p = (u16 *) buf; - (long)p <= ((long)buf + (sizeof(struct get_conf) / 2)); p++) { - while (!(inb(base + HA_RSTATUS) & HA_SDRQ)) - if (--loop == 0) - return (FALSE); - - loop = R_LIMIT; - *p = inw(base + HA_RDATA); - } - - if (!(inb(base + HA_RSTATUS) & HA_SERROR)) { /* Error ? */ - if (htonl(EATA_SIGNATURE) == buf->signature) { - DBG(DBG_PIO&&DBG_PROBE, printk("EATA Controller found at %x " - "EATA Level: %x\n", (uint) base, - (uint) (buf->version))); - - while (inb(base + HA_RSTATUS) & HA_SDRQ) - inw(base + HA_RDATA); - return (TRUE); - } - } else { - DBG(DBG_PROBE, printk("eata_dma: get_conf_PIO, error during transfer " - "for HBA at %lx\n", (long)base)); - } - return (FALSE); -} - - -void print_config(struct get_conf *gc) -{ - printk("LEN: %d ver:%d OCS:%d TAR:%d TRNXFR:%d MORES:%d DMAS:%d\n", - (u32) ntohl(gc->len), gc->version, - gc->OCS_enabled, gc->TAR_support, gc->TRNXFR, gc->MORE_support, - gc->DMA_support); - printk("DMAV:%d HAAV:%d SCSIID0:%d ID1:%d ID2:%d QUEUE:%d SG:%d SEC:%d\n", - gc->DMA_valid, gc->HAA_valid, gc->scsi_id[3], gc->scsi_id[2], - gc->scsi_id[1], ntohs(gc->queuesiz), ntohs(gc->SGsiz), gc->SECOND); - printk("IRQ:%d IRQT:%d DMAC:%d FORCADR:%d SG_64K:%d SG_UAE:%d MID:%d " - "MCH:%d MLUN:%d\n", - gc->IRQ, gc->IRQ_TR, (8 - gc->DMA_channel) & 7, gc->FORCADR, - gc->SG_64K, gc->SG_UAE, gc->MAX_ID, gc->MAX_CHAN, gc->MAX_LUN); - printk("RIDQ:%d PCI:%d EISA:%d\n", - gc->ID_qest, gc->is_PCI, gc->is_EISA); - DBG(DPT_DEBUG, DELAY(14)); -} - -short register_HBA(u32 base, struct get_conf *gc, Scsi_Host_Template * tpnt, - u8 bustype) -{ - ulong size = 0; - unchar dma_channel = 0; - char *buff = 0; - unchar bugs = 0; - struct Scsi_Host *sh; - hostdata *hd; - int x; - - - DBG(DBG_REGISTER, print_config(gc)); - - if (gc->DMA_support == FALSE) { - printk("The EATA HBA at %#.4x does not support DMA.\n" - "Please use the EATA-PIO driver.\n", base); - return (FALSE); - } - if(gc->HAA_valid == FALSE || ntohl(gc->len) < 0x22) - gc->MAX_CHAN = 0; - - if (reg_IRQ[gc->IRQ] == FALSE) { /* Interrupt already registered ? */ - if (!request_irq(gc->IRQ, (void *) eata_fake_int_handler, SA_INTERRUPT, - "eata_dma", NULL)){ - reg_IRQ[gc->IRQ]++; - if (!gc->IRQ_TR) - reg_IRQL[gc->IRQ] = TRUE; /* IRQ is edge triggered */ - } else { - printk("Couldn't allocate IRQ %d, Sorry.", gc->IRQ); - return (FALSE); - } - } else { /* More than one HBA on this IRQ */ - if (reg_IRQL[gc->IRQ] == TRUE) { - printk("Can't support more than one HBA on this IRQ,\n" - " if the IRQ is edge triggered. Sorry.\n"); - return (FALSE); - } else - reg_IRQ[gc->IRQ]++; - } - - - /* If DMA is supported but DMA_valid isn't set to indicate that - * the channel number is given we must have pre 2.0 firmware (1.7?) - * which leaves us to guess since the "newer ones" also don't set the - * DMA_valid bit. - */ - if (gc->DMA_support && !gc->DMA_valid && gc->DMA_channel) { - printk(KERN_WARNING "eata_dma: If you are using a pre 2.0 firmware " - "please update it !\n" - " You can get new firmware releases from ftp.dpt.com\n"); - gc->DMA_channel = (base == 0x1f0 ? 3 /* DMA=5 */ : 2 /* DMA=6 */); - gc->DMA_valid = TRUE; - } - - /* if gc->DMA_valid it must be an ISA HBA and we have to register it */ - dma_channel = BUSMASTER; - if (gc->DMA_valid) { - if (request_dma(dma_channel = (8 - gc->DMA_channel) & 7, "eata_dma")) { - printk(KERN_WARNING "Unable to allocate DMA channel %d for ISA HBA" - " at %#.4x.\n", dma_channel, base); - reg_IRQ[gc->IRQ]--; - if (reg_IRQ[gc->IRQ] == 0) - free_irq(gc->IRQ, NULL); - if (gc->IRQ_TR == FALSE) - reg_IRQL[gc->IRQ] = FALSE; - return (FALSE); - } - } - - if (dma_channel != BUSMASTER) { - disable_dma(dma_channel); - clear_dma_ff(dma_channel); - set_dma_mode(dma_channel, DMA_MODE_CASCADE); - enable_dma(dma_channel); - } - - if (bustype != IS_EISA && bustype != IS_ISA) - buff = get_board_data(base, gc->IRQ, gc->scsi_id[3]); - - if (buff == NULL) { - if (bustype == IS_EISA || bustype == IS_ISA) { - bugs = bugs || BROKEN_INQUIRY; - } else { - if (gc->DMA_support == FALSE) - printk(KERN_WARNING "HBA at %#.4x doesn't support DMA. " - "Sorry\n", base); - else - printk(KERN_WARNING "HBA at %#.4x does not react on INQUIRY. " - "Sorry.\n", base); - if (gc->DMA_valid) - free_dma(dma_channel); - reg_IRQ[gc->IRQ]--; - if (reg_IRQ[gc->IRQ] == 0) - free_irq(gc->IRQ, NULL); - if (gc->IRQ_TR == FALSE) - reg_IRQL[gc->IRQ] = FALSE; - return (FALSE); - } - } - - if (gc->DMA_support == FALSE && buff != NULL) - printk(KERN_WARNING "HBA %.12sat %#.4x doesn't set the DMA_support " - "flag correctly.\n", &buff[16], base); - - request_region(base, 9, "eata_dma"); /* We already checked the - * availability, so this - * should not fail. - */ - - if(ntohs(gc->queuesiz) == 0) { - gc->queuesiz = ntohs(64); - printk(KERN_WARNING "Warning: Queue size has to be corrected. Assuming" - " 64 queueslots\n" - " This might be a PM2012B with a defective Firmware\n" - " Contact DPT support@dpt.com for an upgrade\n"); - } - - size = sizeof(hostdata) + ((sizeof(struct eata_ccb) + sizeof(long)) - * ntohs(gc->queuesiz)); - - DBG(DBG_REGISTER, printk("scsi_register size: %ld\n", size)); - - sh = scsi_register(tpnt, size); - - if(sh != NULL) { - - hd = SD(sh); - - memset(hd->reads, 0, sizeof(u32) * 26); - - sh->select_queue_depths = eata_select_queue_depths; - - hd->bustype = bustype; - - /* - * If we are using a ISA board, we can't use extended SG, - * because we would need excessive amounts of memory for - * bounce buffers. - */ - if (gc->SG_64K==TRUE && ntohs(gc->SGsiz)==64 && hd->bustype!=IS_ISA){ - sh->sg_tablesize = SG_SIZE_BIG; - } else { - sh->sg_tablesize = ntohs(gc->SGsiz); - if (sh->sg_tablesize > SG_SIZE || sh->sg_tablesize == 0) { - if (sh->sg_tablesize == 0) - printk(KERN_WARNING "Warning: SG size had to be fixed.\n" - "This might be a PM2012 with a defective Firmware" - "\nContact DPT support@dpt.com for an upgrade\n"); - sh->sg_tablesize = SG_SIZE; - } - } - hd->sgsize = sh->sg_tablesize; - } - - if(sh != NULL) { - sh->can_queue = hd->queuesize = ntohs(gc->queuesiz); - sh->cmd_per_lun = 0; - } - - if(sh == NULL) { - DBG(DBG_REGISTER, printk(KERN_NOTICE "eata_dma: couldn't register HBA" - " at%x \n", base)); - scsi_unregister(sh); - if (gc->DMA_valid) - free_dma(dma_channel); - - reg_IRQ[gc->IRQ]--; - if (reg_IRQ[gc->IRQ] == 0) - free_irq(gc->IRQ, NULL); - if (gc->IRQ_TR == FALSE) - reg_IRQL[gc->IRQ] = FALSE; - return (FALSE); - } - - - hd->broken_INQUIRY = (bugs & BROKEN_INQUIRY); - - if(hd->broken_INQUIRY == TRUE) { - strcpy(hd->vendor, "DPT"); - strcpy(hd->name, "??????????"); - strcpy(hd->revision, "???.?"); - hd->firmware_revision = 0; - } else { - strncpy(hd->vendor, &buff[8], 8); - hd->vendor[8] = 0; - strncpy(hd->name, &buff[16], 17); - hd->name[17] = 0; - hd->revision[0] = buff[32]; - hd->revision[1] = buff[33]; - hd->revision[2] = buff[34]; - hd->revision[3] = '.'; - hd->revision[4] = buff[35]; - hd->revision[5] = 0; - hd->firmware_revision = (buff[32] << 24) + (buff[33] << 16) - + (buff[34] << 8) + buff[35]; - } - - if (hd->firmware_revision >= (('0'<<24) + ('7'<<16) + ('G'<< 8) + '0')) - hd->immediate_support = 1; - else - hd->immediate_support = 0; - - switch (ntohl(gc->len)) { - case 0x1c: - hd->EATA_revision = 'a'; - break; - case 0x1e: - hd->EATA_revision = 'b'; - break; - case 0x22: - hd->EATA_revision = 'c'; - break; - case 0x24: - hd->EATA_revision = 'z'; - default: - hd->EATA_revision = '?'; - } - - - if(ntohl(gc->len) >= 0x22) { - sh->max_id = gc->MAX_ID + 1; - sh->max_lun = gc->MAX_LUN + 1; - } else { - sh->max_id = 8; - sh->max_lun = 8; - } - - hd->HBA_number = sh->host_no; - hd->channel = gc->MAX_CHAN; - sh->max_channel = gc->MAX_CHAN; - sh->unique_id = base; - sh->base = base; - sh->io_port = base; - sh->n_io_port = 9; - sh->irq = gc->IRQ; - sh->dma_channel = dma_channel; - - /* FIXME: - * SCSI midlevel code should support different HBA ids on every channel - */ - sh->this_id = gc->scsi_id[3]; - - if (gc->SECOND) - hd->primary = FALSE; - else - hd->primary = TRUE; - - if (hd->bustype != IS_ISA) { - sh->unchecked_isa_dma = FALSE; - } else { - sh->unchecked_isa_dma = TRUE; /* We're doing ISA DMA */ - } - - for(x = 0; x <= 11; x++){ /* Initialize min. latency */ - hd->writes_lat[x][1] = 0xffffffff; - hd->reads_lat[x][1] = 0xffffffff; - } - hd->all_lat[1] = 0xffffffff; - - hd->next = NULL; /* build a linked list of all HBAs */ - hd->prev = last_HBA; - if(hd->prev != NULL) - SD(hd->prev)->next = sh; - last_HBA = sh; - if (first_HBA == NULL) - first_HBA = sh; - registered_HBAs++; - - return (TRUE); -} - - - -void find_EISA(struct get_conf *buf, Scsi_Host_Template * tpnt) -{ - u32 base; - int i; - -#if CHECKPAL - u8 pal1, pal2, pal3; -#endif - - for (i = 0; i < MAXEISA; i++) { - if (EISAbases[i] == TRUE) { /* Still a possibility ? */ - - base = 0x1c88 + (i * 0x1000); -#if CHECKPAL - pal1 = inb((u16)base - 8); - pal2 = inb((u16)base - 7); - pal3 = inb((u16)base - 6); - - if (((pal1 == DPT_ID1) && (pal2 == DPT_ID2)) || - ((pal1 == NEC_ID1) && (pal2 == NEC_ID2) && (pal3 == NEC_ID3))|| - ((pal1 == ATT_ID1) && (pal2 == ATT_ID2) && (pal3 == ATT_ID3))){ - DBG(DBG_PROBE, printk("EISA EATA id tags found: %x %x %x \n", - (int)pal1, (int)pal2, (int)pal3)); -#endif - if (get_conf_PIO(base, buf) == TRUE) { - if (buf->IRQ) { - DBG(DBG_EISA, printk("Registering EISA HBA\n")); - register_HBA(base, buf, tpnt, IS_EISA); - } else - printk("eata_dma: No valid IRQ. HBA removed from list\n"); - } -#if CHECK_BLINK - else { - if (check_blink_state(base)) - printk("HBA is in BLINK state. Consult your HBAs " - "Manual to correct this.\n"); - } -#endif - /* Nothing found here so we take it from the list */ - EISAbases[i] = 0; -#if CHECKPAL - } -#endif - } - } - return; -} - -void find_ISA(struct get_conf *buf, Scsi_Host_Template * tpnt) -{ - int i; - - for (i = 0; i < MAXISA; i++) { - if (ISAbases[i]) { - if (get_conf_PIO(ISAbases[i],buf) == TRUE){ - DBG(DBG_ISA, printk("Registering ISA HBA\n")); - register_HBA(ISAbases[i], buf, tpnt, IS_ISA); - } -#if CHECK_BLINK - else { - if (check_blink_state(ISAbases[i])) - printk("HBA is in BLINK state. Consult your HBAs " - "Manual to correct this.\n"); - } -#endif - ISAbases[i] = 0; - } - } - return; -} - -void find_PCI(struct get_conf *buf, Scsi_Host_Template * tpnt) -{ -#ifndef CONFIG_PCI - printk("eata_dma: kernel PCI support not enabled. Skipping scan for PCI HBAs.\n"); -#else - struct pci_dev *dev = NULL; - u32 base, x; - u8 pal1, pal2, pal3; - - while ((dev = pci_find_device(PCI_VENDOR_ID_DPT, PCI_DEVICE_ID_DPT, dev)) != NULL) { - DBG(DBG_PROBE && DBG_PCI, - printk("eata_dma: find_PCI, HBA at %s\n", dev->name)); - if (pci_enable_device(dev)) - continue; - pci_set_master(dev); - base = pci_resource_flags(dev, 0); - if (base & IORESOURCE_MEM) { - printk("eata_dma: invalid base address of device %s\n", dev->name); - continue; - } - base = pci_resource_start(dev, 0); - /* EISA tag there ? */ - pal1 = inb(base); - pal2 = inb(base + 1); - pal3 = inb(base + 2); - if (((pal1 == DPT_ID1) && (pal2 == DPT_ID2)) || - ((pal1 == NEC_ID1) && (pal2 == NEC_ID2) && - (pal3 == NEC_ID3)) || - ((pal1 == ATT_ID1) && (pal2 == ATT_ID2) && - (pal3 == ATT_ID3))) - base += 0x08; - else - base += 0x10; /* Now, THIS is the real address */ - if (base != 0x1f8) { - /* We didn't find it in the primary search */ - if (get_conf_PIO(base, buf) == TRUE) { - /* OK. We made it till here, so we can go now - * and register it. We only have to check and - * eventually remove it from the EISA and ISA list - */ - DBG(DBG_PCI, printk("Registering PCI HBA\n")); - register_HBA(base, buf, tpnt, IS_PCI); - - if (base < 0x1000) { - for (x = 0; x < MAXISA; ++x) { - if (ISAbases[x] == base) { - ISAbases[x] = 0; - break; - } - } - } else if ((base & 0x0fff) == 0x0c88) - EISAbases[(base >> 12) & 0x0f] = 0; - } -#if CHECK_BLINK - else if (check_blink_state(base) == TRUE) { - printk("eata_dma: HBA is in BLINK state.\n" - "Consult your HBAs manual to correct this.\n"); - } -#endif - } - } -#endif /* #ifndef CONFIG_PCI */ -} - -int eata_detect(Scsi_Host_Template * tpnt) -{ - struct Scsi_Host *HBA_ptr; - struct get_conf gc; - int i; - - DBG((DBG_PROBE && DBG_DELAY) || DPT_DEBUG, - printk("Using lots of delays to let you read the debugging output\n")); - - tpnt->proc_name = "eata_dma"; - - status = kmalloc(512, GFP_ATOMIC | GFP_DMA); - dma_scratch = kmalloc(1024, GFP_ATOMIC | GFP_DMA); - - if(status == NULL || dma_scratch == NULL) { - printk("eata_dma: can't allocate enough memory to probe for hosts !\n"); - if(status) - kfree(status); - if(dma_scratch) - kfree(dma_scratch); - return(0); - } - - dma_scratch += 4; - - find_PCI(&gc, tpnt); - - find_EISA(&gc, tpnt); - - find_ISA(&gc, tpnt); - - for (i = 0; i <= MAXIRQ; i++) { /* Now that we know what we have, we */ - if (reg_IRQ[i] >= 1){ /* exchange the interrupt handler which */ - free_irq(i, NULL); /* we used for probing with the real one */ - request_irq(i, (void *)(do_eata_int_handler), SA_INTERRUPT|SA_SHIRQ, - "eata_dma", first_HBA); /* Check it */ - } - } - - HBA_ptr = first_HBA; - - if (registered_HBAs != 0) { - printk("EATA (Extended Attachment) driver version: %d.%d%s" - "\ndeveloped in co-operation with DPT\n" - "(c) 1993-96 Michael Neuffer, mike@i-Connect.Net\n", - VER_MAJOR, VER_MINOR, VER_SUB); - printk("Registered HBAs:"); - printk("\nHBA no. Boardtype Revis EATA Bus BaseIO IRQ" - " DMA Ch ID Pr QS S/G IS\n"); - for (i = 1; i <= registered_HBAs; i++) { - printk("scsi%-2d: %.12s v%s 2.0%c %s %#.4x %2d", - HBA_ptr->host_no, SD(HBA_ptr)->name, SD(HBA_ptr)->revision, - SD(HBA_ptr)->EATA_revision, (SD(HBA_ptr)->bustype == 'P')? - "PCI ":(SD(HBA_ptr)->bustype == 'E')?"EISA":"ISA ", - (u32) HBA_ptr->base, HBA_ptr->irq); - if(HBA_ptr->dma_channel != BUSMASTER) - printk(" %2x ", HBA_ptr->dma_channel); - else - printk(" %s", "BMST"); - printk(" %d %d %c %3d %3d %c\n", - SD(HBA_ptr)->channel+1, HBA_ptr->this_id, - (SD(HBA_ptr)->primary == TRUE)?'Y':'N', - HBA_ptr->can_queue, HBA_ptr->sg_tablesize, - (SD(HBA_ptr)->immediate_support == TRUE)?'Y':'N'); - HBA_ptr = SD(HBA_ptr)->next; - } - } else { - kfree((void *)status); - } - - kfree((void *)dma_scratch - 4); - - DBG(DPT_DEBUG, DELAY(12)); - - return(registered_HBAs); -} - -MODULE_LICENSE("GPL"); - -/* Eventually this will go into an include file, but this will be later */ -static Scsi_Host_Template driver_template = EATA_DMA; -#include "scsi_module.c" - -/* - * Overrides for Emacs so that we almost follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * tab-width: 8 - * End: - */ diff -Nru a/drivers/scsi/eata_dma.h b/drivers/scsi/eata_dma.h --- a/drivers/scsi/eata_dma.h Thu Feb 20 23:19:24 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,114 +0,0 @@ -/******************************************************** -* Header file for eata_dma.c Linux EATA-DMA SCSI driver * -* (c) 1993-96 Michael Neuffer * -* mike@i-Connect.Net * -* neuffer@mail.uni-mainz.de * -********************************************************* -* last change: 96/10/14 * -********************************************************/ - -#ifndef _EATA_DMA_H -#define _EATA_DMA_H - -#include "eata_generic.h" - - -#define VER_MAJOR 2 -#define VER_MINOR 5 -#define VER_SUB "9b" - - -/************************************************************************ - * Here you can switch parts of the code on and of * - ************************************************************************/ - -#define CHECKPAL 0 /* EISA pal checking on/off */ -#define CHECK_BLINK 1 /* Switch Blink state check off, might * - * be nessessary for some MIPS machines*/ -#define CRIPPLE_QUEUE 0 /* Only enable this if the interrupt - * controller on your motherboard is - * broken and you are experiencing - * massive interrupt losses */ - -/************************************************************************ - * Debug options. * - * Enable DEBUG and whichever options you require. * - ************************************************************************/ -#define DEBUG_EATA 1 /* Enable debug code. */ -#define DPT_DEBUG 0 /* Bobs special */ -#define DBG_DELAY 0 /* Build in delays so debug messages can be - * be read before they vanish of the top of - * the screen! */ -#define DBG_PROBE 0 /* Debug probe routines. */ -#define DBG_PCI 0 /* Trace PCI routines */ -#define DBG_EISA 0 /* Trace EISA routines */ -#define DBG_ISA 0 /* Trace ISA routines */ -#define DBG_BLINK 0 /* Trace Blink check */ -#define DBG_PIO 0 /* Trace get_config_PIO */ -#define DBG_COM 0 /* Trace command call */ -#define DBG_QUEUE 0 /* Trace command queueing. */ -#define DBG_QUEUE2 0 /* Trace command queueing SG. */ -#define DBG_INTR 0 /* Trace interrupt service routine. */ -#define DBG_INTR2 0 /* Trace interrupt service routine. */ -#define DBG_INTR3 0 /* Trace get_board_data interrupts. */ -#define DBG_REQSENSE 0 /* Trace request sense commands */ -#define DBG_RESET 0 /* Trace reset calls */ -#define DBG_STATUS 0 /* Trace status generation */ -#define DBG_PROC 0 /* Debug proc-fs related statistics */ -#define DBG_PROC_WRITE 0 -#define DBG_REGISTER 0 /* */ -#define DBG_ABNORM 1 /* Debug abnormal actions (reset, abort)*/ - -#if DEBUG_EATA -#define DBG(x, y) if ((x)) {y;} -#else -#define DBG(x, y) -#endif - -int eata_detect(Scsi_Host_Template *); -const char *eata_info(struct Scsi_Host *); -int eata_command(Scsi_Cmnd *); -int eata_queue(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); -int eata_abort(Scsi_Cmnd *); -int eata_reset(Scsi_Cmnd *, unsigned int); -int eata_proc_info(char *, char **, off_t, int, int, int); -#ifdef MODULE -int eata_release(struct Scsi_Host *); -#else -#define eata_release NULL -#endif - -#include - -#define EATA_DMA { \ - .proc_info = eata_proc_info, /* procinfo */ \ - .name = "EATA (Extended Attachment) HBA driver", \ - .detect = eata_detect, \ - .release = eata_release, \ - .queuecommand = eata_queue, \ - .abort = eata_abort, \ - .reset = eata_reset, \ - .unchecked_isa_dma = 1, /* True if ISA */ \ - .use_clustering = ENABLE_CLUSTERING } - - -#endif /* _EATA_DMA_H */ - -/* - * Overrides for Emacs so that we almost follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */ diff -Nru a/drivers/scsi/eata_dma_proc.c b/drivers/scsi/eata_dma_proc.c --- a/drivers/scsi/eata_dma_proc.c Thu Feb 20 23:19:22 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,478 +0,0 @@ -void swap_statistics(u8 *p) -{ - u32 y; - u32 *lp, h_lp; - u16 *sp, h_sp; - u8 *bp; - - lp = (u32 *)p; - sp = ((short *)lp) + 1; /* Convert Header */ - h_sp = *sp = ntohs(*sp); - lp++; - - do { - sp = (u16 *)lp; /* Convert SubHeader */ - *sp = ntohs(*sp); - bp = (u8 *) lp; - y = *(bp + 3); - lp++; - for (h_lp = (u32)lp; (u32)lp < h_lp + ((u32)*(bp + 3)); lp++) - *lp = ntohl(*lp); - }while ((u32)lp < ((u32)p) + 4 + h_sp); - -} - -/* - * eata_set_info - * buffer : pointer to the data that has been written to the hostfile - * length : number of bytes written to the hostfile - * HBA_ptr: pointer to the Scsi_Host struct - */ -int eata_set_info(char *buffer, int length, struct Scsi_Host *HBA_ptr) -{ - int orig_length = length; - - if (length >= 8 && strncmp(buffer, "eata_dma", 8) == 0) { - buffer += 9; - length -= 9; - if(length >= 8 && strncmp(buffer, "latency", 7) == 0) { - SD(HBA_ptr)->do_latency = TRUE; - return(orig_length); - } - - if(length >=10 && strncmp(buffer, "nolatency", 9) == 0) { - SD(HBA_ptr)->do_latency = FALSE; - return(orig_length); - } - - printk("Unknown command:%s length: %d\n", buffer, length); - } else - printk("Wrong Signature:%10s\n", buffer); - - return(-EINVAL); -} - -/* - * eata_proc_info - * inout : decides on the direction of the dataflow and the meaning of the - * variables - * buffer: If inout==FALSE data is being written to it else read from it - * *start: If inout==FALSE start of the valid data in the buffer - * offset: If inout==FALSE offset from the beginning of the imaginary file - * from which we start writing into the buffer - * length: If inout==FALSE max number of bytes to be written into the buffer - * else number of bytes in the buffer - */ -int eata_proc_info(char *buffer, char **start, off_t offset, int length, - int hostno, int inout) -{ - - Scsi_Device *scd, *SDev; - struct Scsi_Host *HBA_ptr; - Scsi_Request * scmd; - char cmnd[MAX_COMMAND_SIZE]; - static u8 buff[512]; - static u8 buff2[512]; - hst_cmd_stat *rhcs, *whcs; - coco *cc; - scsitrans *st; - scsimod *sm; - hobu *hb; - scbu *sb; - boty *bt; - memco *mc; - firm *fm; - subinf *si; - pcinf *pi; - arrlim *al; - int i, x; - int size, len = 0; - off_t begin = 0; - off_t pos = 0; - scd = NULL; - - HBA_ptr = first_HBA; - for (i = 1; i <= registered_HBAs; i++) { - if (HBA_ptr->host_no == hostno) - break; - HBA_ptr = SD(HBA_ptr)->next; - } - - if(inout == TRUE) /* Has data been written to the file ? */ - return(eata_set_info(buffer, length, HBA_ptr)); - - if (offset == 0) - memset(buff, 0, sizeof(buff)); - - cc = (coco *) (buff + 0x148); - st = (scsitrans *)(buff + 0x164); - sm = (scsimod *) (buff + 0x16c); - hb = (hobu *) (buff + 0x172); - sb = (scbu *) (buff + 0x178); - bt = (boty *) (buff + 0x17e); - mc = (memco *) (buff + 0x186); - fm = (firm *) (buff + 0x18e); - si = (subinf *) (buff + 0x196); - pi = (pcinf *) (buff + 0x19c); - al = (arrlim *) (buff + 0x1a2); - - size = sprintf(buffer+len, "EATA (Extended Attachment) driver version: " - "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB); - len += size; pos = begin + len; - size = sprintf(buffer + len, "queued commands: %10ld\n" - "processed interrupts:%10ld\n", queue_counter, int_counter); - len += size; pos = begin + len; - - size = sprintf(buffer + len, "\nscsi%-2d: HBA %.10s\n", - HBA_ptr->host_no, SD(HBA_ptr)->name); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Firmware revision: v%s\n", - SD(HBA_ptr)->revision); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Hardware Configuration:\n"); - len += size; - pos = begin + len; - - if(SD(HBA_ptr)->broken_INQUIRY == TRUE) { - if (HBA_ptr->dma_channel == BUSMASTER) - size = sprintf(buffer + len, "DMA: BUSMASTER\n"); - else - size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel); - len += size; - pos = begin + len; - - size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base); - len += size; - pos = begin + len; - - size = sprintf(buffer + len, "Host Bus: EISA\n"); - len += size; - pos = begin + len; - - } else { - SDev = scsi_get_host_dev(HBA_ptr); - - if(SDev == NULL) - return -ENOMEM; - - scmd = scsi_allocate_request(SDev); - - if(scmd == NULL) - { - scsi_free_host_dev(SDev); - return -ENOMEM; - } - - - cmnd[0] = LOG_SENSE; - cmnd[1] = 0; - cmnd[2] = 0x33 + (3<<6); - cmnd[3] = 0; - cmnd[4] = 0; - cmnd[5] = 0; - cmnd[6] = 0; - cmnd[7] = 0x00; - cmnd[8] = 0x66; - cmnd[9] = 0; - - scmd->sr_cmd_len = 10; - scmd->sr_data_direction = SCSI_DATA_READ; - - /* - * Do the command and wait for it to finish. - */ - scsi_wait_req (scmd, cmnd, buff + 0x144, 0x66, - 1 * HZ, 1); - - size = sprintf(buffer + len, "IRQ: %2d, %s triggered\n", cc->interrupt, - (cc->intt == TRUE)?"level":"edge"); - len += size; - pos = begin + len; - if (HBA_ptr->dma_channel == 0xff) - size = sprintf(buffer + len, "DMA: BUSMASTER\n"); - else - size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "CPU: MC680%02d %dMHz\n", bt->cpu_type, - bt->cpu_speed); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Host Bus: %s\n", - (SD(HBA_ptr)->bustype == IS_PCI)?"PCI ": - (SD(HBA_ptr)->bustype == IS_EISA)?"EISA":"ISA "); - - len += size; - pos = begin + len; - size = sprintf(buffer + len, "SCSI Bus:%s%s Speed: %sMB/sec. %s\n", - (sb->wide == TRUE)?" WIDE":"", - (sb->dif == TRUE)?" DIFFERENTIAL":"", - (sb->speed == 0)?"5":(sb->speed == 1)?"10":"20", - (sb->ext == TRUE)?"With external cable detection":""); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "SCSI channel expansion Module: %s present\n", - (bt->sx1 == TRUE)?"SX1 (one channel)": - ((bt->sx2 == TRUE)?"SX2 (two channels)":"not")); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "SmartRAID hardware: %spresent.\n", - (cc->srs == TRUE)?"":"not "); - len += size; - pos = begin + len; - size = sprintf(buffer + len, " Type: %s\n", - ((cc->key == TRUE)?((bt->dmi == TRUE)?"integrated" - :((bt->dm4 == TRUE)?"DM401X" - :(bt->dm4k == TRUE)?"DM4000" - :"-")) - :"-")); - len += size; - pos = begin + len; - - size = sprintf(buffer + len, " Max array groups: %d\n", - (al->code == 0x0e)?al->max_groups:7); - len += size; - pos = begin + len; - size = sprintf(buffer + len, " Max drives per RAID 0 array: %d\n", - (al->code == 0x0e)?al->raid0_drv:7); - len += size; - pos = begin + len; - size = sprintf(buffer + len, " Max drives per RAID 3/5 array: %d\n", - (al->code == 0x0e)?al->raid35_drv:7); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Cache Module: %spresent.\n", - (cc->csh)?"":"not "); - len += size; - pos = begin + len; - size = sprintf(buffer + len, " Type: %s\n", - ((cc->csh == TRUE)?((bt->cmi == TRUE)?"integrated" - :((bt->cm4 == TRUE)?"CM401X" - :((bt->cm4k == TRUE)?"CM4000" - :"-"))) - :"-")); - len += size; - pos = begin + len; - for (x = 0; x <= 3; x++) { - size = sprintf(buffer + len, " Bank%d: %dMB with%s ECC\n",x, - mc->banksize[x] & 0x7f, - (mc->banksize[x] & 0x80)?"":"out"); - len += size; - pos = begin + len; - } - size = sprintf(buffer + len, "Timer Mod.: %spresent\n", - (cc->tmr == TRUE)?"":"not "); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "NVRAM : %spresent\n", - (cc->nvr == TRUE)?"":"not "); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "SmartROM : %sabled\n", - (bt->srom == TRUE)?"dis":"en"); - len += size; - pos = begin + len; - size = sprintf(buffer + len, "Alarm : %s\n", - (bt->alrm == TRUE)?"on":"off"); - len += size; - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - - if(SD(HBA_ptr)->do_latency == FALSE) { - - cmnd[0] = LOG_SENSE; - cmnd[1] = 0; - cmnd[2] = 0x32 + (3<<6); - cmnd[3] = 0; - cmnd[4] = 0; - cmnd[5] = 0; - cmnd[6] = 0; - cmnd[7] = 0x01; - cmnd[8] = 0x44; - cmnd[9] = 0; - - scmd->sr_cmd_len = 10; - scmd->sr_data_direction = SCSI_DATA_READ; - - /* - * Do the command and wait for it to finish. - */ - scsi_wait_req (scmd, cmnd, buff2, 0x144, - 1 * HZ, 1); - - swap_statistics(buff2); - rhcs = (hst_cmd_stat *)(buff2 + 0x2c); - whcs = (hst_cmd_stat *)(buff2 + 0x8c); - - for (x = 0; x <= 11; x++) { - SD(HBA_ptr)->reads[x] += rhcs->sizes[x]; - SD(HBA_ptr)->writes[x] += whcs->sizes[x]; - SD(HBA_ptr)->reads[12] += rhcs->sizes[x]; - SD(HBA_ptr)->writes[12] += whcs->sizes[x]; - } - size = sprintf(buffer + len, "Host<->Disk command statistics:\n" - " Reads: Writes:\n"); - len += size; - pos = begin + len; - for (x = 0; x <= 10; x++) { - size = sprintf(buffer+len,"%5dk:%12u %12u\n", 1 << x, - SD(HBA_ptr)->reads[x], - SD(HBA_ptr)->writes[x]); - len += size; - pos = begin + len; - } - size = sprintf(buffer+len,">1024k:%12u %12u\n", - SD(HBA_ptr)->reads[11], - SD(HBA_ptr)->writes[11]); - len += size; - pos = begin + len; - size = sprintf(buffer+len,"Sum :%12u %12u\n", - SD(HBA_ptr)->reads[12], - SD(HBA_ptr)->writes[12]); - len += size; - pos = begin + len; - } - - scsi_release_request(scmd); - scsi_free_host_dev(SDev); - } - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - - if(SD(HBA_ptr)->do_latency == TRUE) { - int factor = 1024/HZ; - size = sprintf(buffer + len, "Host Latency Command Statistics:\n" - "Current timer resolution: %2dms\n" - " Reads: Min:(ms) Max:(ms) Ave:(ms)\n", - factor); - len += size; - pos = begin + len; - for (x = 0; x <= 10; x++) { - size = sprintf(buffer+len,"%5dk:%12u %12u %12u %12u\n", - 1 << x, - SD(HBA_ptr)->reads_lat[x][0], - (SD(HBA_ptr)->reads_lat[x][1] == 0xffffffff) - ? 0:(SD(HBA_ptr)->reads_lat[x][1] * factor), - SD(HBA_ptr)->reads_lat[x][2] * factor, - SD(HBA_ptr)->reads_lat[x][3] * factor / - ((SD(HBA_ptr)->reads_lat[x][0]) - ? SD(HBA_ptr)->reads_lat[x][0]:1)); - len += size; - pos = begin + len; - } - size = sprintf(buffer+len,">1024k:%12u %12u %12u %12u\n", - SD(HBA_ptr)->reads_lat[11][0], - (SD(HBA_ptr)->reads_lat[11][1] == 0xffffffff) - ? 0:(SD(HBA_ptr)->reads_lat[11][1] * factor), - SD(HBA_ptr)->reads_lat[11][2] * factor, - SD(HBA_ptr)->reads_lat[11][3] * factor / - ((SD(HBA_ptr)->reads_lat[x][0]) - ? SD(HBA_ptr)->reads_lat[x][0]:1)); - len += size; - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - - size = sprintf(buffer + len, - " Writes: Min:(ms) Max:(ms) Ave:(ms)\n"); - len += size; - pos = begin + len; - for (x = 0; x <= 10; x++) { - size = sprintf(buffer+len,"%5dk:%12u %12u %12u %12u\n", - 1 << x, - SD(HBA_ptr)->writes_lat[x][0], - (SD(HBA_ptr)->writes_lat[x][1] == 0xffffffff) - ? 0:(SD(HBA_ptr)->writes_lat[x][1] * factor), - SD(HBA_ptr)->writes_lat[x][2] * factor, - SD(HBA_ptr)->writes_lat[x][3] * factor / - ((SD(HBA_ptr)->writes_lat[x][0]) - ? SD(HBA_ptr)->writes_lat[x][0]:1)); - len += size; - pos = begin + len; - } - size = sprintf(buffer+len,">1024k:%12u %12u %12u %12u\n", - SD(HBA_ptr)->writes_lat[11][0], - (SD(HBA_ptr)->writes_lat[11][1] == 0xffffffff) - ? 0:(SD(HBA_ptr)->writes_lat[x][1] * factor), - SD(HBA_ptr)->writes_lat[11][2] * factor, - SD(HBA_ptr)->writes_lat[11][3] * factor / - ((SD(HBA_ptr)->writes_lat[x][0]) - ? SD(HBA_ptr)->writes_lat[x][0]:1)); - len += size; - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - } - - size = sprintf(buffer+len,"Attached devices: %s\n", - (!list_empty(&HBA_ptr->my_devices))?"":"none"); - len += size; - pos = begin + len; - - list_for_each_entry(scd, &HBA_ptr->my_devices, siblings) { - proc_print_scsidevice(scd, buffer, &size, len); - len += size; - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - } - - stop_output: - DBG(DBG_PROC, printk("2pos: %ld offset: %ld len: %d\n", pos, offset, len)); - *start=buffer+(offset-begin); /* Start of wanted data */ - len-=(offset-begin); /* Start slop */ - if(len>length) - len = length; /* Ending slop */ - DBG(DBG_PROC, printk("3pos: %ld offset: %ld len: %d\n", pos, offset, len)); - - return (len); -} - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * tab-width: 8 - * End: - */ diff -Nru a/drivers/scsi/eata_dma_proc.h b/drivers/scsi/eata_dma_proc.h --- a/drivers/scsi/eata_dma_proc.h Thu Feb 20 23:19:20 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,260 +0,0 @@ - -struct lun_map { - __u8 id:5, - chan:3; - __u8 lun; -}; - -typedef struct emul_pp { - __u8 p_code:6, - null:1, - p_save:1; - __u8 p_length; - __u16 cylinder; - __u8 heads; - __u8 sectors; - __u8 null2; - __u8 s_lunmap:4, - ems:1; - __u16 drive_type; /* In Little Endian ! */ - struct lun_map lunmap[4]; -}emulpp; - - -/* Log Sense pages */ - -typedef struct log_sheader { - __u8 page_code, - reserved; - __u16 length; -}logsh; - - -/* Log Sense Statistics */ - -typedef struct read_command_statistics { - __u16 code; /* 0x01 */ - __u8 flags; - __u8 length; /* 0x24 */ - __u32 h_commands, - uncached, - la_cmds, - la_blks, - la_hits, - missed, - hits, - seq_la_blks, - seq_la_hits; -}r_cmd_stat; - -typedef struct write_command_statistics { - __u16 code; /* 0x03 */ - __u8 flags; - __u8 length; /* 0x28 */ - __u32 h_commands, - uncached, - thru, - bypass, - soft_err, - hits, - b_idle, - b_activ, - b_blks, - b_blks_clean; -}w_cmd_stat; - -typedef struct host_command_statistics { - __u16 code; /* 0x02, 0x04 */ - __u8 flags; - __u8 length; /* 0x30 */ - __u32 sizes[12]; -}hst_cmd_stat; - -typedef struct physical_command_statistics { - __u16 code; /* 0x06, 0x07 */ - __u8 flags; - __u8 length; /* 0x34 */ - __u32 sizes[13]; -}phy_cmd_stat; - -typedef struct misc_device_statistics { - __u16 code; /* 0x05 */ - __u8 flags; - __u8 length; /* 0x10 */ - __u32 disconnect, - pass_thru, - sg_commands, - stripe_boundary_crosses; -}msc_stats; - -/* Configuration Pages */ - -typedef struct controller_configuration { - __u16 code; /* 0x01 */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 intt:1, - sec:1, - csh:1, - key:1, - tmr:1, - srs:1, - nvr:1; - __u8 interrupt; -}coco; - -typedef struct controller_hardware_errors { - __u16 code; /* 0x02 */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 unused:1, - per:1; - __u8 interrupt; -}coher; - -typedef struct memory_map { - __u16 code; /* 0x03, 0x04 */ - __u8 flags; - __u8 length; /* 0x04 */ - __u32 memory_map; -}mema; - -typedef struct scsi_transfer { - __u16 code; /* 0x05 */ - __u8 flags; - __u8 length; /* 0x04 */ - __u8 offset, - period; - __u16 speed; -}scsitrans; - -typedef struct scsi_modes { - __u16 code; /* 0x06 */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 que:1, - cdis:1, - wtru:1, - dasd:1, - ncr:1, - awre:1; - __u8 reserved; -}scsimod; - -typedef struct host_bus { - __u16 code; /* 0x07 */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 speed:6, - pci:1, - eisa:1; - __u8 reserved; -}hobu; - -typedef struct scsi_bus { - __u16 code; /* 0x08 */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 speed:4, - res:1, - ext:1, - wide:1, - dif:1; - __u8 busnum; -}scbu; - -typedef struct board_type { - __u16 code; /* 0x09 */ - __u8 flags; - __u8 length; /* 0x04 */ - __u8 unused:1, - cmi:1, - dmi:1, - cm4k:1, - cm4:1, - dm4k:1, - dm4:1, - hba:1; - __u8 cpu_type, - cpu_speed; - __u8 sx1:1, - sx2:1, - unused2:4, - alrm:1, - srom:1; -}boty; - -typedef struct memory_config { - __u16 code; /* 0x0a */ - __u8 flags; - __u8 length; /* 0x04 */ - __u8 banksize[4]; -}memco; - -typedef struct firmware_info { - __u16 code; /* 0x0b */ - __u8 flags; - __u8 length; /* 0x04 */ - __u8 dnld:1, - bs528:1, - fmt:1, - fw528:1; - __u8 unused1, - fw_type, - unused; -}firm; - -typedef struct subsystem_info { - __u16 code; /* 0x0c */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 shlf:1, - swap:1, - noss:1; - __u8 reserved; -}subinf; - -typedef struct per_channel_info { - __u16 code; /* 0x0d */ - __u8 flags; - __u8 length; /* 0x02 */ - __u8 channel; - __u8 shlf:1, - swap:1, - noss:1, - srs:1, - que:1, - ext:1, - wide:1, - diff:1; -}pcinf; - -typedef struct array_limits { - __u16 code; /* 0x0e */ - __u8 flags; - __u8 length; /* 0x04 */ - __u8 max_groups, - raid0_drv, - raid35_drv, - unused; -}arrlim; - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */ - diff -Nru a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c --- a/drivers/scsi/fdomain.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/fdomain.c Thu Feb 20 23:19:22 2003 @@ -960,7 +960,7 @@ return 0; shpnt->irq = interrupt_level; shpnt->io_port = port_base; - scsi_set_pci_device(shpnt, pdev); + scsi_set_device(shpnt, &pdev->dev); shpnt->n_io_port = 0x10; print_banner( shpnt ); diff -Nru a/drivers/scsi/hosts.h b/drivers/scsi/hosts.h --- a/drivers/scsi/hosts.h Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/hosts.h Thu Feb 20 23:19:20 2003 @@ -27,7 +27,6 @@ #include #include #include -#include struct scsi_host_cmd_pool; @@ -533,13 +532,6 @@ { return shost->host_gendev; } - -static inline void scsi_set_pci_device(struct Scsi_Host *shost, - struct pci_dev *pdev) -{ - scsi_set_device(shost, &pdev->dev); -} - /* * Prototypes for functions/data in scsi_scan.c diff -Nru a/drivers/scsi/ips.c b/drivers/scsi/ips.c --- a/drivers/scsi/ips.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/ips.c Thu Feb 20 23:19:19 2003 @@ -6744,7 +6744,7 @@ kfree(oldha); ips_sh[index] = sh; ips_ha[index] = ha; - scsi_set_pci_device(sh, ha->pcidev); + scsi_set_device(sh, &ha->pcidev->dev); /* Store away needed values for later use */ sh->io_port = ha->io_addr; diff -Nru a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c --- a/drivers/scsi/megaraid.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/megaraid.c Thu Feb 20 23:19:19 2003 @@ -2963,7 +2963,7 @@ */ host->max_sectors = 1024; - scsi_set_pci_device(host, pdev); + scsi_set_device(host, &pdev->dev); megaCfg = (mega_host_config *) host->hostdata; memset (megaCfg, 0, sizeof (mega_host_config)); diff -Nru a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c --- a/drivers/scsi/nsp32.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/nsp32.c Thu Feb 20 23:19:21 2003 @@ -1661,7 +1661,7 @@ host->unique_id = data->BaseAddress; host->n_io_port = data->NumAddress; host->base = data->MmioAddress; - scsi_set_pci_device(host, data->Pci); + scsi_set_device(host, &data->Pci->dev); data->Host = host; spin_lock_init(&(data->Lock)); diff -Nru a/drivers/scsi/pci2000.c b/drivers/scsi/pci2000.c --- a/drivers/scsi/pci2000.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/pci2000.c Thu Feb 20 23:19:22 2003 @@ -707,7 +707,7 @@ goto unregister; } - scsi_set_pci_device(pshost, pdev); + scsi_set_device(pshost, &pdev->dev); pshost->irq = pdev->irq; setirq = 1; padapter->irqOwned = 0; diff -Nru a/drivers/scsi/pci2220i.c b/drivers/scsi/pci2220i.c --- a/drivers/scsi/pci2220i.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/pci2220i.c Thu Feb 20 23:19:19 2003 @@ -1439,14 +1439,14 @@ break; } - // test LBA and multiper sector transfer compatability + // test LBA and multiper sector transfer compatibility if (!pid->SupportLBA || (pid->NumSectorsPerInt < SECTORSXFER) || !pid->Valid_64_70 ) { DEB (printk ("\npci2220i: sub 3")); break; } - // test PIO/bus matering mode compatability + // test PIO/bus matering mode compatibility if ( (pid->MinPIOCycleWithoutFlow > 240) && !pid->SupportIORDYDisable && !padapter->timingPIO ) { DEB (printk ("\npci2220i: sub 4")); @@ -2389,7 +2389,7 @@ padapter->regRemap = zr + RTR_LOCAL_REMAP; // 32 bit local space remap padapter->regDesc = zr + RTR_REGIONS; // 32 bit local region descriptor padapter->regRange = zr + RTR_LOCAL_RANGE; // 32 bit local range - padapter->regIrqControl = zr + RTR_INT_CONTROL_STATUS; // 16 bit interupt control and status + padapter->regIrqControl = zr + RTR_INT_CONTROL_STATUS; // 16 bit interrupt control and status padapter->regScratchPad = zr + RTR_MAILBOX; // 16 byte scratchpad I/O base address padapter->regBase = zl; @@ -2549,7 +2549,7 @@ if ( GetRegs (pshost, FALSE, pcidev) ) goto unregister; - scsi_set_pci_device(pshost, pcidev); + scsi_set_device(pshost, &pcidev->dev); pshost->max_id = padapter->numberOfDrives; for ( z = 0; z < padapter->numberOfDrives; z++ ) { diff -Nru a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c --- a/drivers/scsi/pcmcia/aha152x_stub.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/pcmcia/aha152x_stub.c Thu Feb 20 23:19:23 2003 @@ -408,7 +408,7 @@ if (link->state & DEV_CONFIG) { Scsi_Cmnd tmp; CardServices(RequestConfiguration, link->handle, &link->conf); - tmp.host = info->host; + tmp.device->host = info->host; aha152x_host_reset(&tmp); } break; diff -Nru a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c --- a/drivers/scsi/pcmcia/nsp_cs.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/pcmcia/nsp_cs.c Thu Feb 20 23:19:24 2003 @@ -325,9 +325,9 @@ static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int host_id = SCpnt->host->this_id; - unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; + unsigned int host_id = SCpnt->device->host->this_id; + unsigned int base = SCpnt->device->host->io_port; + unsigned char target = SCpnt->device->id; int time_out; unsigned char phase, arbit; @@ -405,7 +405,7 @@ */ static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned char target = SCpnt->target; + unsigned char target = SCpnt->device->id; // unsigned char lun = SCpnt->lun; sync_data *sync = &(data->Sync[target]); struct nsp_sync_table *sync_table; @@ -462,7 +462,7 @@ */ static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; //DEBUG(0, "%s: in SCpnt=0x%p, time=%d\n", __FUNCTION__, SCpnt, time); data->TimerCount = time; @@ -474,7 +474,7 @@ */ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned char reg; int time_out; @@ -503,7 +503,7 @@ unsigned char current_phase, unsigned char mask) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; int time_out; unsigned char phase, i_src; @@ -536,7 +536,7 @@ */ static int nsp_xfer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int phase) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; char *buf = data->MsgBuffer; int len = MIN(MSGBUF_SIZE, data->MsgLen); int ptr; @@ -606,7 +606,7 @@ */ static int nsp_reselected(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned char reg; //DEBUG(0, "%s:\n", __FUNCTION__); @@ -626,7 +626,7 @@ */ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned int count; unsigned int l, m, h, dummy; @@ -653,8 +653,8 @@ */ static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; - unsigned long mmio_base = SCpnt->host->base; + unsigned int base = SCpnt->device->host->io_port; + unsigned long mmio_base = SCpnt->device->host->base; long time_out; int ocount, res; unsigned char stat, fifo_stat; @@ -746,8 +746,8 @@ */ static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; - unsigned long mmio_base = SCpnt->host->base; + unsigned int base = SCpnt->device->host->io_port; + unsigned long mmio_base = SCpnt->device->host->base; int time_out; int ocount, res; unsigned char stat; @@ -838,8 +838,8 @@ */ static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; + unsigned int base = SCpnt->device->host->io_port; + unsigned char target = SCpnt->device->id; // unsigned char lun = SCpnt->lun; sync_data *sync = &(data->Sync[target]); @@ -944,8 +944,8 @@ return; } else { tmpSC = data->CurrentSC; - target = tmpSC->target; - lun = tmpSC->lun; + target = tmpSC->device->id; + lun = tmpSC->device->lun; sync_neg = &(data->Sync[target].SyncNegotiation); } @@ -1425,7 +1425,7 @@ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) { nsp_hw_data *data = &nsp_data; - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; int i; DEBUG(0, "%s: SCpnt=0x%p base=0x%x\n", __FUNCTION__, SCpnt, base); @@ -1960,7 +1960,7 @@ } info->stop = 0; - tmp.host = info->host; + tmp.device->host = info->host; nsp_eh_host_reset(&tmp); nsp_eh_bus_reset(&tmp); diff -Nru a/drivers/scsi/pcmcia/nsp_message.c b/drivers/scsi/pcmcia/nsp_message.c --- a/drivers/scsi/pcmcia/nsp_message.c Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/pcmcia/nsp_message.c Thu Feb 20 23:19:20 2003 @@ -10,7 +10,7 @@ static void nsp_message_in(Scsi_Cmnd *SCpnt, nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned char data_reg, control_reg; int ret, len; diff -Nru a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c --- a/drivers/scsi/ppa.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/ppa.c Thu Feb 20 23:19:22 2003 @@ -106,7 +106,7 @@ int ppa_detect(Scsi_Host_Template * host) { - struct Scsi_Host *hreg; + struct Scsi_Host *hreg = NULL; int ports; int i, nhosts, try_again; struct parport *pb; diff -Nru a/drivers/scsi/psi_chip.h b/drivers/scsi/psi_chip.h --- a/drivers/scsi/psi_chip.h Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/psi_chip.h Thu Feb 20 23:19:19 2003 @@ -108,7 +108,7 @@ typedef struct { UCHAR irq; // interrupt request channel number - UCHAR numDrives; // Number of accessable drives + UCHAR numDrives; // Number of accessible drives UCHAR fastFormat; // Boolean for fast format enable } CHIP_CONFIG_N; diff -Nru a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c --- a/drivers/scsi/qla1280.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/qla1280.c Thu Feb 20 23:19:24 2003 @@ -814,7 +814,7 @@ goto error; } - scsi_set_pci_device(host, pdev); + scsi_set_device(host, &pdev->dev); ha = (struct scsi_qla_host *)host->hostdata; /* Clear our data area */ memset(ha, 0, sizeof(struct scsi_qla_host)); diff -Nru a/drivers/scsi/qlogicfc.c b/drivers/scsi/qlogicfc.c --- a/drivers/scsi/qlogicfc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/qlogicfc.c Thu Feb 20 23:19:23 2003 @@ -731,7 +731,7 @@ printk("qlogicfc%d : could not register host.\n", hosts); continue; } - scsi_set_pci_device(host, pdev); + scsi_set_device(host, &pdev->dev); host->max_id = QLOGICFC_MAX_ID + 1; host->max_lun = QLOGICFC_MAX_LUN; hostdata = (struct isp2x00_hostdata *) host->hostdata; diff -Nru a/drivers/scsi/qlogicisp.c b/drivers/scsi/qlogicisp.c --- a/drivers/scsi/qlogicisp.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/qlogicisp.c Thu Feb 20 23:19:24 2003 @@ -685,7 +685,7 @@ memset(hostdata, 0, sizeof(struct isp1020_hostdata)); hostdata->pci_dev = pdev; - scsi_set_pci_device(host, pdev); + scsi_set_device(host, &pdev->dev); if (isp1020_init(host)) goto fail_and_unregister; diff -Nru a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c --- a/drivers/scsi/scsi.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/scsi.c Thu Feb 20 23:19:21 2003 @@ -171,30 +171,6 @@ #endif /* - * Issue a command and wait for it to complete - */ - -static void scsi_wait_done(Scsi_Cmnd * SCpnt) -{ - struct request *req = SCpnt->request; - struct request_queue *q = SCpnt->device->request_queue; - unsigned long flags; - - ASSERT_LOCK(q->queue_lock, 0); - req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ - - spin_lock_irqsave(q->queue_lock, flags); - - if(blk_rq_tagged(req)) - blk_queue_end_tag(q, req); - - spin_unlock_irqrestore(q->queue_lock, flags); - - if (req->waiting) - complete(req->waiting); -} - -/* * Function: scsi_allocate_request * * Purpose: Allocate a request descriptor. @@ -263,87 +239,6 @@ kfree(req); } -/* - * Function: scsi_mlqueue_insert() - * - * Purpose: Insert a command in the midlevel queue. - * - * Arguments: cmd - command that we are adding to queue. - * reason - why we are inserting command to queue. - * - * Lock status: Assumed that lock is not held upon entry. - * - * Returns: Nothing. - * - * Notes: We do this for one of two cases. Either the host is busy - * and it cannot accept any more commands for the time being, - * or the device returned QUEUE_FULL and can accept no more - * commands. - * Notes: This could be called either from an interrupt context or a - * normal process context. - */ -static int scsi_mlqueue_insert(Scsi_Cmnd * cmd, int reason) -{ - struct Scsi_Host *host = cmd->device->host; - struct scsi_device *device = cmd->device; - - SCSI_LOG_MLQUEUE(1, - printk("Inserting command %p into mlqueue\n", cmd)); - - /* - * We are inserting the command into the ml queue. First, we - * cancel the timer, so it doesn't time out. - */ - scsi_delete_timer(cmd); - - /* - * Next, set the appropriate busy bit for the device/host. - * - * If the host/device isn't busy, assume that something actually - * completed, and that we should be able to queue a command now. - * - * Note that the prior mid-layer assumption that any host could - * always queue at least one command is now broken. The mid-layer - * will implement a user specifiable stall (see - * scsi_host.max_host_blocked and scsi_device.max_device_blocked) - * if a command is requeued with no other commands outstanding - * either for the device or for the host. - */ - if (reason == SCSI_MLQUEUE_HOST_BUSY) { - host->host_blocked = host->max_host_blocked; - } else { - device->device_blocked = device->max_device_blocked; - } - - /* - * Register the fact that we own the thing for now. - */ - cmd->state = SCSI_STATE_MLQUEUE; - cmd->owner = SCSI_OWNER_MIDLEVEL; - cmd->bh_next = NULL; - - /* - * Decrement the counters, since these commands are no longer - * active on the host/device. - */ - scsi_host_busy_dec_and_test(host, device); - - /* - * Insert this command at the head of the queue for it's device. - * It will go before all other commands that are already in the queue. - * - * NOTE: there is magic here about the way the queue is - * plugged if we have no outstanding commands. - * scsi_insert_special_cmd eventually calls - * blk_queue_insert(). Although this *doesn't* plug the - * queue, it does call the request function. The SCSI request - * function detects the blocked condition and plugs the queue - * appropriately. - */ - scsi_insert_special_cmd(cmd, 1); - return 0; -} - struct scsi_host_cmd_pool { kmem_cache_t *slab; unsigned int users; @@ -621,7 +516,7 @@ rtn = host->hostt->queuecommand(SCpnt, scsi_done); spin_unlock_irqrestore(host->host_lock, flags); if (rtn != 0) { - scsi_mlqueue_insert(SCpnt, rtn == SCSI_MLQUEUE_DEVICE_BUSY ? rtn : SCSI_MLQUEUE_HOST_BUSY); + scsi_queue_insert(SCpnt, rtn == SCSI_MLQUEUE_DEVICE_BUSY ? rtn : SCSI_MLQUEUE_HOST_BUSY); SCSI_LOG_MLQUEUE(3, printk("queuecommand : request rejected\n")); } @@ -659,128 +554,6 @@ return rtn; } -void scsi_wait_req (Scsi_Request * SRpnt, const void *cmnd , - void *buffer, unsigned bufflen, - int timeout, int retries) -{ - DECLARE_COMPLETION(wait); - - SRpnt->sr_request->waiting = &wait; - SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; - scsi_do_req (SRpnt, (void *) cmnd, - buffer, bufflen, scsi_wait_done, timeout, retries); - generic_unplug_device(SRpnt->sr_device->request_queue); - wait_for_completion(&wait); - SRpnt->sr_request->waiting = NULL; - if( SRpnt->sr_command != NULL ) - { - scsi_put_command(SRpnt->sr_command); - SRpnt->sr_command = NULL; - } - -} - -/* - * Function: scsi_do_req - * - * Purpose: Queue a SCSI request - * - * Arguments: SRpnt - command descriptor. - * cmnd - actual SCSI command to be performed. - * buffer - data buffer. - * bufflen - size of data buffer. - * done - completion function to be run. - * timeout - how long to let it run before timeout. - * retries - number of retries we allow. - * - * Lock status: With the new queueing code, this is SMP-safe, and no locks - * need be held upon entry. The old queueing code the lock was - * assumed to be held upon entry. - * - * Returns: Nothing. - * - * Notes: Prior to the new queue code, this function was not SMP-safe. - * Also, this function is now only used for queueing requests - * for things like ioctls and character device requests - this - * is because we essentially just inject a request into the - * queue for the device. Normal block device handling manipulates - * the queue directly. - */ -void scsi_do_req(Scsi_Request * SRpnt, const void *cmnd, - void *buffer, unsigned bufflen, void (*done) (Scsi_Cmnd *), - int timeout, int retries) -{ - Scsi_Device * SDpnt = SRpnt->sr_device; - struct Scsi_Host *host = SDpnt->host; - - ASSERT_LOCK(host->host_lock, 0); - - SCSI_LOG_MLQUEUE(4, - { - int i; - int size = COMMAND_SIZE(((const unsigned char *)cmnd)[0]); - printk("scsi_do_req (host = %d, channel = %d target = %d, " - "buffer =%p, bufflen = %d, done = %p, timeout = %d, " - "retries = %d)\n" - "command : ", host->host_no, SDpnt->channel, SDpnt->id, buffer, - bufflen, done, timeout, retries); - for (i = 0; i < size; ++i) - printk("%02x ", ((unsigned char *) cmnd)[i]); - printk("\n"); - }); - - if (!host) { - panic("Invalid or not present host.\n"); - } - - /* - * If the upper level driver is reusing these things, then - * we should release the low-level block now. Another one will - * be allocated later when this request is getting queued. - */ - if( SRpnt->sr_command != NULL ) - { - scsi_put_command(SRpnt->sr_command); - SRpnt->sr_command = NULL; - } - - /* - * We must prevent reentrancy to the lowlevel host driver. This prevents - * it - we enter a loop until the host we want to talk to is not busy. - * Race conditions are prevented, as interrupts are disabled in between the - * time we check for the host being not busy, and the time we mark it busy - * ourselves. - */ - - - /* - * Our own function scsi_done (which marks the host as not busy, disables - * the timeout counter, etc) will be called by us or by the - * scsi_hosts[host].queuecommand() function needs to also call - * the completion function for the high level driver. - */ - - memcpy((void *) SRpnt->sr_cmnd, (const void *) cmnd, - sizeof(SRpnt->sr_cmnd)); - SRpnt->sr_bufflen = bufflen; - SRpnt->sr_buffer = buffer; - SRpnt->sr_allowed = retries; - SRpnt->sr_done = done; - SRpnt->sr_timeout_per_command = timeout; - - if (SRpnt->sr_cmd_len == 0) - SRpnt->sr_cmd_len = COMMAND_SIZE(SRpnt->sr_cmnd[0]); - - /* - * At this point, we merely set up the command, stick it in the normal - * request queue, and return. Eventually that request will come to the - * top of the list, and will be dispatched. - */ - scsi_insert_special_req(SRpnt, 0); - - SCSI_LOG_MLQUEUE(3, printk("Leaving scsi_do_req()\n")); -} - /* * Function: scsi_init_cmd_from_req * @@ -998,7 +771,7 @@ */ SCSI_LOG_MLCOMPLETE(3, printk("Command rejected as device queue full, put on ml queue %p\n", SCpnt)); - scsi_mlqueue_insert(SCpnt, SCSI_MLQUEUE_DEVICE_BUSY); + scsi_queue_insert(SCpnt, SCSI_MLQUEUE_DEVICE_BUSY); break; default: /* diff -Nru a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h --- a/drivers/scsi/scsi.h Thu Feb 20 23:19:20 2003 +++ b/drivers/scsi/scsi.h Thu Feb 20 23:19:20 2003 @@ -433,12 +433,11 @@ */ extern int scsi_maybe_unblock_host(Scsi_Device * SDpnt); extern void scsi_setup_cmd_retry(Scsi_Cmnd *SCpnt); -extern int scsi_insert_special_cmd(Scsi_Cmnd * SCpnt, int); extern void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors, int block_sectors); -extern void scsi_queue_next_request(request_queue_t * q, Scsi_Cmnd * SCpnt); -extern int scsi_prep_fn(struct request_queue *q, struct request *req); -extern void scsi_request_fn(request_queue_t * q); +extern int scsi_queue_insert(struct scsi_cmnd *cmd, int reason); +extern request_queue_t *scsi_alloc_queue(struct Scsi_Host *shost); +extern void scsi_free_queue(request_queue_t *q); extern int scsi_init_queue(void); extern void scsi_exit_queue(void); diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c --- a/drivers/scsi/scsi_lib.c Thu Feb 20 23:19:21 2003 +++ b/drivers/scsi/scsi_lib.c Thu Feb 20 23:19:21 2003 @@ -14,6 +14,7 @@ #include #include #include +#include #include "scsi.h" #include "hosts.h" @@ -37,11 +38,11 @@ /* - * Function: scsi_insert_special_cmd() + * Function: scsi_insert_special_req() * - * Purpose: Insert pre-formed command into request queue. + * Purpose: Insert pre-formed request into request queue. * - * Arguments: cmd - command that is ready to be queued. + * Arguments: sreq - request that is ready to be queued. * at_head - boolean. True if we should insert at head * of queue, false if we should insert at tail. * @@ -56,46 +57,195 @@ * for now), and then call the queue request function to actually * process it. */ -int scsi_insert_special_cmd(struct scsi_cmnd *cmd, int at_head) +int scsi_insert_special_req(struct scsi_request *sreq, int at_head) { - blk_insert_request(cmd->device->request_queue, cmd->request, - at_head, cmd); + /* + * Because users of this function are apt to reuse requests with no + * modification, we have to sanitise the request flags here + */ + sreq->sr_request->flags &= ~REQ_DONTPREP; + blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request, + at_head, sreq); return 0; } /* - * Function: scsi_insert_special_req() + * Function: scsi_queue_insert() * - * Purpose: Insert pre-formed request into request queue. + * Purpose: Insert a command in the midlevel queue. * - * Arguments: sreq - request that is ready to be queued. - * at_head - boolean. True if we should insert at head - * of queue, false if we should insert at tail. + * Arguments: cmd - command that we are adding to queue. + * reason - why we are inserting command to queue. * * Lock status: Assumed that lock is not held upon entry. * - * Returns: Nothing + * Returns: Nothing. * - * Notes: This function is called from character device and from - * ioctl types of functions where the caller knows exactly - * what SCSI command needs to be issued. The idea is that - * we merely inject the command into the queue (at the head - * for now), and then call the queue request function to actually - * process it. + * Notes: We do this for one of two cases. Either the host is busy + * and it cannot accept any more commands for the time being, + * or the device returned QUEUE_FULL and can accept no more + * commands. + * Notes: This could be called either from an interrupt context or a + * normal process context. */ -int scsi_insert_special_req(struct scsi_request *sreq, int at_head) +int scsi_queue_insert(struct scsi_cmnd *cmd, int reason) { + struct Scsi_Host *host = cmd->device->host; + struct scsi_device *device = cmd->device; + + SCSI_LOG_MLQUEUE(1, + printk("Inserting command %p into mlqueue\n", cmd)); + /* - * Because users of this function are apt to reuse requests with no - * modification, we have to sanitise the request flags here + * We are inserting the command into the ml queue. First, we + * cancel the timer, so it doesn't time out. */ - sreq->sr_request->flags &= ~REQ_DONTPREP; - blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request, - at_head, sreq); + scsi_delete_timer(cmd); + + /* + * Next, set the appropriate busy bit for the device/host. + * + * If the host/device isn't busy, assume that something actually + * completed, and that we should be able to queue a command now. + * + * Note that the prior mid-layer assumption that any host could + * always queue at least one command is now broken. The mid-layer + * will implement a user specifiable stall (see + * scsi_host.max_host_blocked and scsi_device.max_device_blocked) + * if a command is requeued with no other commands outstanding + * either for the device or for the host. + */ + if (reason == SCSI_MLQUEUE_HOST_BUSY) + host->host_blocked = host->max_host_blocked; + else + device->device_blocked = device->max_device_blocked; + + /* + * Register the fact that we own the thing for now. + */ + cmd->state = SCSI_STATE_MLQUEUE; + cmd->owner = SCSI_OWNER_MIDLEVEL; + cmd->bh_next = NULL; + + /* + * Decrement the counters, since these commands are no longer + * active on the host/device. + */ + scsi_host_busy_dec_and_test(host, device); + + /* + * Insert this command at the head of the queue for it's device. + * It will go before all other commands that are already in the queue. + * + * NOTE: there is magic here about the way the queue is plugged if + * we have no outstanding commands. + * + * Although this *doesn't* plug the queue, it does call the request + * function. The SCSI request function detects the blocked condition + * and plugs the queue appropriately. + */ + blk_insert_request(device->request_queue, cmd->request, 1, cmd); return 0; } /* + * Function: scsi_do_req + * + * Purpose: Queue a SCSI request + * + * Arguments: sreq - command descriptor. + * cmnd - actual SCSI command to be performed. + * buffer - data buffer. + * bufflen - size of data buffer. + * done - completion function to be run. + * timeout - how long to let it run before timeout. + * retries - number of retries we allow. + * + * Lock status: No locks held upon entry. + * + * Returns: Nothing. + * + * Notes: This function is only used for queueing requests for things + * like ioctls and character device requests - this is because + * we essentially just inject a request into the queue for the + * device. + */ +void scsi_do_req(struct scsi_request *sreq, const void *cmnd, + void *buffer, unsigned bufflen, + void (*done)(struct scsi_cmnd *), + int timeout, int retries) +{ + /* + * If the upper level driver is reusing these things, then + * we should release the low-level block now. Another one will + * be allocated later when this request is getting queued. + */ + if (sreq->sr_command) { + scsi_put_command(sreq->sr_command); + sreq->sr_command = NULL; + } + + /* + * Our own function scsi_done (which marks the host as not busy, + * disables the timeout counter, etc) will be called by us or by the + * scsi_hosts[host].queuecommand() function needs to also call + * the completion function for the high level driver. + */ + memcpy(sreq->sr_cmnd, cmnd, sizeof(sreq->sr_cmnd)); + sreq->sr_bufflen = bufflen; + sreq->sr_buffer = buffer; + sreq->sr_allowed = retries; + sreq->sr_done = done; + sreq->sr_timeout_per_command = timeout; + + if (sreq->sr_cmd_len == 0) + sreq->sr_cmd_len = COMMAND_SIZE(sreq->sr_cmnd[0]); + + /* + * At this point, we merely set up the command, stick it in the normal + * request queue, and return. Eventually that request will come to the + * top of the list, and will be dispatched. + */ + scsi_insert_special_req(sreq, 0); +} + +static void scsi_wait_done(struct scsi_cmnd *cmd) +{ + struct request *req = cmd->request; + struct request_queue *q = cmd->device->request_queue; + unsigned long flags; + + req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ + + spin_lock_irqsave(q->queue_lock, flags); + if (blk_rq_tagged(req)) + blk_queue_end_tag(q, req); + spin_unlock_irqrestore(q->queue_lock, flags); + + if (req->waiting) + complete(req->waiting); +} + +void scsi_wait_req(struct scsi_request *sreq, const void *cmnd, void *buffer, + unsigned bufflen, int timeout, int retries) +{ + DECLARE_COMPLETION(wait); + + sreq->sr_request->waiting = &wait; + sreq->sr_request->rq_status = RQ_SCSI_BUSY; + scsi_do_req(sreq, cmnd, buffer, bufflen, scsi_wait_done, + timeout, retries); + generic_unplug_device(sreq->sr_device->request_queue); + wait_for_completion(&wait); + sreq->sr_request->waiting = NULL; + + if (sreq->sr_command) { + scsi_put_command(sreq->sr_command); + sreq->sr_command = NULL; + } +} + +/* * Function: scsi_init_cmd_errh() * * Purpose: Initialize cmd fields related to error handling. @@ -203,7 +353,7 @@ * permutations grows as 2**N, and if too many more special cases * get added, we start to get screwed. */ -void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd) +static void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd) { struct scsi_device *sdev, *sdev2; struct Scsi_Host *shost; @@ -791,7 +941,7 @@ return 0; } -int scsi_prep_fn(struct request_queue *q, struct request *req) +static int scsi_prep_fn(struct request_queue *q, struct request *req) { struct Scsi_Device_Template *sdt; struct scsi_device *sdev = q->queuedata; @@ -902,7 +1052,7 @@ * * Lock status: IO request lock assumed to be held when called. */ -void scsi_request_fn(request_queue_t *q) +static void scsi_request_fn(request_queue_t *q) { struct scsi_device *sdev = q->queuedata; struct Scsi_Host *shost = sdev->host; @@ -1045,6 +1195,62 @@ */ spin_lock_irq(q->queue_lock); } +} + +u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) +{ + if (shost->highmem_io) { + struct device *host_dev = scsi_get_device(shost); + + if (PCI_DMA_BUS_IS_PHYS && host_dev && host_dev->dma_mask) + return *host_dev->dma_mask; + + /* + * Platforms with virtual-DMA translation + * hardware have no practical limit. + */ + return BLK_BOUNCE_ANY; + } else if (shost->unchecked_isa_dma) + return BLK_BOUNCE_ISA; + + return BLK_BOUNCE_HIGH; +} + +request_queue_t *scsi_alloc_queue(struct Scsi_Host *shost) +{ + request_queue_t *q; + + q = kmalloc(sizeof(*q), GFP_ATOMIC); + if (!q) + return NULL; + memset(q, 0, sizeof(*q)); + + if (!shost->max_sectors) { + /* + * Driver imposes no hard sector transfer limit. + * start at machine infinity initially. + */ + shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS; + } + + blk_init_queue(q, scsi_request_fn, shost->host_lock); + blk_queue_prep_rq(q, scsi_prep_fn); + + blk_queue_max_hw_segments(q, shost->sg_tablesize); + blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS); + blk_queue_max_sectors(q, shost->max_sectors); + blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); + + if (!shost->use_clustering) + clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); + + return q; +} + +void scsi_free_queue(request_queue_t *q) +{ + blk_cleanup_queue(q); + kfree(q); } /* diff -Nru a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c --- a/drivers/scsi/scsi_scan.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/scsi_scan.c Thu Feb 20 23:19:23 2003 @@ -364,62 +364,6 @@ printk("\n"); } -u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) -{ - if (shost->highmem_io) { - struct device *host_dev = scsi_get_device(shost); - - if (PCI_DMA_BUS_IS_PHYS && host_dev && host_dev->dma_mask) - return *host_dev->dma_mask; - - /* - * Platforms with virtual-DMA translation - * hardware have no practical limit. - */ - return BLK_BOUNCE_ANY; - } else if (shost->unchecked_isa_dma) - return BLK_BOUNCE_ISA; - - return BLK_BOUNCE_HIGH; -} - -static request_queue_t *scsi_alloc_queue(struct Scsi_Host *shost) -{ - request_queue_t *q; - - q = kmalloc(sizeof(*q), GFP_ATOMIC); - if (!q) - return NULL; - memset(q, 0, sizeof(*q)); - - if (!shost->max_sectors) { - /* - * Driver imposes no hard sector transfer limit. - * start at machine infinity initially. - */ - shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS; - } - - blk_init_queue(q, scsi_request_fn, shost->host_lock); - blk_queue_prep_rq(q, scsi_prep_fn); - - blk_queue_max_hw_segments(q, shost->sg_tablesize); - blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS); - blk_queue_max_sectors(q, shost->max_sectors); - blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); - - if (!shost->use_clustering) - clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); - - return q; -} - -static void scsi_free_queue(request_queue_t *q) -{ - blk_cleanup_queue(q); - kfree(q); -} - /** * scsi_alloc_sdev - allocate and setup a Scsi_Device * diff -Nru a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c --- a/drivers/scsi/sim710.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/sim710.c Thu Feb 20 23:19:23 2003 @@ -32,51 +32,19 @@ #include #include #include -#ifdef CONFIG_MCA #include -#endif -#ifdef CONFIG_EISA #include -#endif +#include #include "scsi.h" #include "hosts.h" #include "53c700.h" + /* Must be enough for both EISA and MCA */ #define MAX_SLOTS 8 static __u8 __initdata id_array[MAX_SLOTS] = { [0 ... MAX_SLOTS-1] = 7 }; -/* info is used to communicate global data across the driver register - * because the struct device_driver doesn't have any info fields. Sigh */ -struct sim710_info { - Scsi_Host_Template *tpnt; - int found; -}; - -static __initdata struct sim710_info sim710_global_info; - -#if defined(CONFIG_MCA) - -/* CARD ID 01BB and 01BA use the same pos values */ - -#define MCA_01BB_IO_PORTS { 0x0000, 0x0000, 0x0800, 0x0C00, 0x1000, 0x1400, \ - 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, \ - 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, \ - 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000 } - -#define MCA_01BB_IRQS { 3, 5, 11, 14 } - -/* CARD ID 004f */ - -#define MCA_004F_IO_PORTS { 0x0000, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600 } - -#define MCA_004F_IRQS { 5, 9, 14 } - -#endif - -#ifdef MODULE - char *sim710; /* command line passed by insmod */ MODULE_AUTHOR("Richard Hirst"); @@ -85,8 +53,6 @@ MODULE_PARM(sim710, "s"); -#endif - #ifdef MODULE #define ARG_SEP ' ' #else @@ -118,12 +84,15 @@ } return 1; } - -#ifndef MODULE __setup("sim710=", param_setup); -#endif -__init int +static Scsi_Host_Template sim710_driver_template = { + .name = "LSI (Symbios) 710 MCA/EISA", + .proc_name = "sim710", + .this_id = 7, +}; + +static __devinit int sim710_probe_common(struct device *dev, unsigned long base_addr, int irq, int clock, int differential, int scsi_id) { @@ -154,7 +123,7 @@ hostdata->chip710 = 1; /* and register the chip */ - if((host = NCR_700_detect(sim710_global_info.tpnt, hostdata)) == NULL) { + if((host = NCR_700_detect(&sim710_driver_template, hostdata)) == NULL) { printk(KERN_ERR "sim710: No host detected; card configuration problem?\n"); goto out_release; } @@ -168,11 +137,9 @@ goto out_unregister; } - scsi_set_device(host, dev); + scsi_add_host(host, dev); hostdata->dev = dev; - sim710_global_info.found++; - return 0; out_unregister: @@ -185,10 +152,37 @@ return -ENODEV; } +static __devexit int +sim710_device_remove(struct device *dev) +{ + struct Scsi_Host *host = to_scsi_host(dev); + struct NCR_700_Host_Parameters *hostdata = + (struct NCR_700_Host_Parameters *)host->hostdata[0]; + + scsi_remove_host(host); + NCR_700_release(host); + kfree(hostdata); + free_irq(host->irq, host); + return 0; +} + #ifdef CONFIG_MCA + +/* CARD ID 01BB and 01BA use the same pos values */ +#define MCA_01BB_IO_PORTS { 0x0000, 0x0000, 0x0800, 0x0C00, 0x1000, 0x1400, \ + 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, \ + 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, \ + 0x4000, 0x4400, 0x4800, 0x4C00, 0x5000 } + +#define MCA_01BB_IRQS { 3, 5, 11, 14 } + +/* CARD ID 004f */ +#define MCA_004F_IO_PORTS { 0x0000, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600 } +#define MCA_004F_IRQS { 5, 9, 14 } + static short sim710_mca_id_table[] = { 0x01bb, 0x01ba, 0x004f, 0}; -__init int +static __init int sim710_mca_probe(struct device *dev) { struct mca_device *mca_dev = to_mca_device(dev); @@ -268,26 +262,27 @@ 0, id_array[slot]); } -struct mca_driver sim710_mca_driver = { - .id_table = sim710_mca_id_table, +static struct mca_driver sim710_mca_driver = { + .id_table = sim710_mca_id_table, .driver = { - .name = "sim710", - .bus = &mca_bus_type, - .probe = sim710_mca_probe, + .name = "sim710", + .bus = &mca_bus_type, + .probe = sim710_mca_probe, + .remove = __devexit_p(sim710_device_remove), }, }; #endif /* CONFIG_MCA */ #ifdef CONFIG_EISA -struct eisa_device_id sim710_eisa_ids[] = { +static struct eisa_device_id sim710_eisa_ids[] = { { "CPQ4410" }, { "CPQ4411" }, { "HWP0C80" }, { "" } }; -__init int +static __init int sim710_eisa_probe(struct device *dev) { struct eisa_device *edev = to_eisa_device(dev); @@ -307,7 +302,7 @@ #endif } else { eisa_irqs = eisa_cpq_irqs; - irq_index = inb(io_addr + 0xc88); + irq_index = inb(io_addr + 0xc88) & 0x07; } if(irq_index >= strlen(eisa_irqs)) { @@ -322,36 +317,18 @@ } struct eisa_driver sim710_eisa_driver = { - .id_table = sim710_eisa_ids, + .id_table = sim710_eisa_ids, .driver = { - .name = "sim710", - .probe = sim710_eisa_probe, - .remove = __devexit_p(sim710_device_remove), + .name = "sim710", + .probe = sim710_eisa_probe, + .remove = __devexit_p(sim710_device_remove), }, }; - #endif /* CONFIG_EISA */ - -int -sim710_release(struct Scsi_Host *host) +static int __init sim710_init(void) { - struct D700_Host_Parameters *hostdata = - (struct D700_Host_Parameters *)host->hostdata[0]; - - NCR_700_release(host); - kfree(hostdata); - free_irq(host->irq, host); - /* should do a refcount here and unregister the drivers when - * it reaches zero */ - return 1; -} - -int __init -sim710_detect(Scsi_Host_Template *tpnt) -{ - sim710_global_info.tpnt = tpnt; - sim710_global_info.found = 0; + int err = -ENODEV, err2; #ifdef MODULE if (sim710) @@ -359,22 +336,37 @@ #endif #ifdef CONFIG_MCA - if(MCA_bus) - mca_register_driver(&sim710_mca_driver); + if (MCA_bus) + err = mca_register_driver(&sim710_mca_driver); #endif #ifdef CONFIG_EISA - eisa_driver_register(&sim710_eisa_driver); + err2 = eisa_driver_register(&sim710_eisa_driver); + + /* + * The eise_driver_register return values are strange. I have + * no idea why we don't just use river_register directly anyway.. + */ + if (err2 == 1) + err2 = 0; #endif - return sim710_global_info.found; + + if (err < 0 || err2 < 0) + return (err < 0) ? err : err2; + return 0; } -static Scsi_Host_Template driver_template = { - .name = "LSI (Symbios) 710 MCA/EISA", - .proc_name = "sim710", - .detect = sim710_detect, - .release = sim710_release, - .this_id = 7, -}; +static void __exit sim710_exit(void) +{ +#ifdef CONFIG_MCA + if (MCA_bus) + mca_unregister_driver(&sim710_mca_driver); +#endif + +#ifdef CONFIG_EISA + eisa_driver_unregister(&sim710_eisa_driver); +#endif +} -#include "scsi_module.c" +module_init(sim710_init); +module_exit(sim710_exit); diff -Nru a/drivers/scsi/sym53c8xx.c b/drivers/scsi/sym53c8xx.c --- a/drivers/scsi/sym53c8xx.c Thu Feb 20 23:19:22 2003 +++ b/drivers/scsi/sym53c8xx.c Thu Feb 20 23:19:22 2003 @@ -5890,7 +5890,7 @@ instance->dma_channel = 0; instance->cmd_per_lun = MAX_TAGS; instance->can_queue = (MAX_START-4); - scsi_set_pci_device(instance, device->pdev); + scsi_set_device(instance, &device->pdev->dev); np->check_integrity = 0; diff -Nru a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c --- a/drivers/scsi/sym53c8xx_2/sym_glue.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c Thu Feb 20 23:19:24 2003 @@ -1876,7 +1876,7 @@ sym_name(np)); } else { - if (!pci_set_dma_mask(np->s.device, 0xffffffffUL)) + if (pci_set_dma_mask(np->s.device, 0xffffffffUL)) goto out_err32; } } @@ -2130,7 +2130,7 @@ SYM_UNLOCK_HCB(np, flags); - scsi_set_pci_device(instance, dev->pdev); + scsi_set_device(instance, &dev->pdev->dev); /* * Now let the generic SCSI driver diff -Nru a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h --- a/drivers/scsi/sym53c8xx_2/sym_glue.h Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h Thu Feb 20 23:19:24 2003 @@ -263,7 +263,7 @@ #endif /* - * If the CPU and the chip use same endian-ness adressing, + * If the CPU and the chip use same endian-ness addressing, * no byte reordering is needed for script patching. * Macro cpu_to_scr() is to be used for script patching. * Macro scr_to_cpu() is to be used for getting a DWORD @@ -297,7 +297,7 @@ * would have been correctly designed for PCI, this * option would be useless. * - * If the CPU and the chip use same endian-ness adressing, + * If the CPU and the chip use same endian-ness addressing, * no byte reordering is needed for accessing chip io * registers. Functions suffixed by '_raw' are assumed * to access the chip over the PCI without doing byte diff -Nru a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c Thu Feb 20 23:19:19 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c Thu Feb 20 23:19:19 2003 @@ -1235,7 +1235,7 @@ * s4: scntl4 (see the manual) * * current script command: - * dsp: script adress (relative to start of script). + * dsp: script address (relative to start of script). * dbc: first word of script command. * * First 24 register of the chip: diff -Nru a/drivers/scsi/sym53c8xx_2/sym_malloc.c b/drivers/scsi/sym53c8xx_2/sym_malloc.c --- a/drivers/scsi/sym53c8xx_2/sym_malloc.c Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_malloc.c Thu Feb 20 23:19:23 2003 @@ -143,12 +143,15 @@ a = (m_addr_t) ptr; while (1) { -#ifdef SYM_MEM_FREE_UNUSED if (s == SYM_MEM_CLUSTER_SIZE) { +#ifdef SYM_MEM_FREE_UNUSED M_FREE_MEM_CLUSTER(a); +#else + ((m_link_p) a)->next = h[i].next; + h[i].next = (m_link_p) a; +#endif break; } -#endif b = a ^ s; q = &h[i]; while (q->next && q->next != (m_link_p) b) { diff -Nru a/drivers/scsi/sym53c8xx_defs.h b/drivers/scsi/sym53c8xx_defs.h --- a/drivers/scsi/sym53c8xx_defs.h Thu Feb 20 23:19:23 2003 +++ b/drivers/scsi/sym53c8xx_defs.h Thu Feb 20 23:19:23 2003 @@ -487,7 +487,7 @@ #endif /* - * If the CPU and the NCR use same endian-ness adressing, + * If the CPU and the NCR use same endian-ness addressing, * no byte reordering is needed for script patching. * Macro cpu_to_scr() is to be used for script patching. * Macro scr_to_cpu() is to be used for getting a DWORD @@ -521,7 +521,7 @@ * would have been correctly designed for PCI, this * option would be useless. * - * If the CPU and the NCR use same endian-ness adressing, + * If the CPU and the NCR use same endian-ness addressing, * no byte reordering is needed for accessing chip io * registers. Functions suffixed by '_raw' are assumed * to access the chip over the PCI without doing byte diff -Nru a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c --- a/drivers/scsi/tmscsim.c Thu Feb 20 23:19:24 2003 +++ b/drivers/scsi/tmscsim.c Thu Feb 20 23:19:24 2003 @@ -2206,7 +2206,7 @@ psh = scsi_register( psht, sizeof(DC390_ACB) ); if( !psh ) return( -1 ); - scsi_set_pci_device(psh, pdev); + scsi_set_device(psh, &pdev->dev); pACB = (PACB) psh->hostdata; DC390_LOCKA_INIT; DC390_LOCK_ACB; diff -Nru a/drivers/serial/21285.c b/drivers/serial/21285.c --- a/drivers/serial/21285.c Thu Feb 20 23:19:23 2003 +++ b/drivers/serial/21285.c Thu Feb 20 23:19:23 2003 @@ -545,7 +545,5 @@ module_init(serial21285_init); module_exit(serial21285_exit); -EXPORT_NO_SYMBOLS; - MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Intel Footbridge (21285) serial driver $Revision: 1.37 $"); diff -Nru a/drivers/serial/68360serial.c b/drivers/serial/68360serial.c --- a/drivers/serial/68360serial.c Thu Feb 20 23:19:23 2003 +++ b/drivers/serial/68360serial.c Thu Feb 20 23:19:23 2003 @@ -296,11 +296,11 @@ "Warning: null async_struct for (%s) in %s\n"; if (!info) { - printk(badinfo, kdevname(device), routine); + printk(badinfo, cdevname(device), routine); return 1; } if (info->magic != SERIAL_MAGIC) { - printk(badmagic, kdevname(device), routine); + printk(badmagic, cdevname(device), routine); return 1; } #endif diff -Nru a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c --- a/drivers/serial/8250_pci.c Thu Feb 20 23:19:23 2003 +++ b/drivers/serial/8250_pci.c Thu Feb 20 23:19:23 2003 @@ -1248,8 +1248,6 @@ module_init(serial8250_pci_init); module_exit(serial8250_pci_exit); -EXPORT_NO_SYMBOLS; - MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Generic 8250/16x50 PCI serial probe module"); MODULE_DEVICE_TABLE(pci, serial_pci_tbl); diff -Nru a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c --- a/drivers/serial/8250_pnp.c Thu Feb 20 23:19:19 2003 +++ b/drivers/serial/8250_pnp.c Thu Feb 20 23:19:19 2003 @@ -348,7 +348,7 @@ * Given a complete unknown PnP device, try to use some heuristics to * detect modems. Currently use such heuristic set: * - dev->name or dev->bus->name must contain "modem" substring; - * - device must have only one IO region (8 byte long) with base adress + * - device must have only one IO region (8 byte long) with base address * 0x2e8, 0x3e8, 0x2f8 or 0x3f8. * * Such detection looks very ugly, but can detect at least some of numerous @@ -436,8 +436,6 @@ module_init(serial8250_pnp_init); module_exit(serial8250_pnp_exit); - -EXPORT_NO_SYMBOLS; MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Generic 8250/16x50 PnP serial driver"); diff -Nru a/drivers/serial/amba.c b/drivers/serial/amba.c --- a/drivers/serial/amba.c Thu Feb 20 23:19:20 2003 +++ b/drivers/serial/amba.c Thu Feb 20 23:19:20 2003 @@ -25,7 +25,7 @@ * $Id: amba.c,v 1.41 2002/07/28 10:03:27 rmk Exp $ * * This is a generic driver for ARM AMBA-type serial ports. They - * have a lot of 16550-like features, but are not register compatable. + * have a lot of 16550-like features, but are not register compatible. * Note that although they do have CTS, DCD and DSR inputs, they do * not have an RI input, nor do they have DTR or RTS outputs. If * required, these have to be supplied via some other means (eg, GPIO) @@ -752,8 +752,6 @@ module_init(ambauart_init); module_exit(ambauart_exit); - -EXPORT_NO_SYMBOLS; MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd"); MODULE_DESCRIPTION("ARM AMBA serial port driver $Revision: 1.41 $"); diff -Nru a/drivers/serial/anakin.c b/drivers/serial/anakin.c --- a/drivers/serial/anakin.c Thu Feb 20 23:19:20 2003 +++ b/drivers/serial/anakin.c Thu Feb 20 23:19:20 2003 @@ -544,5 +544,3 @@ MODULE_AUTHOR("Tak-Shing Chan "); MODULE_SUPPORTED_DEVICE("ttyAN"); MODULE_LICENSE("GPL"); - -EXPORT_NO_SYMBOLS; diff -Nru a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c --- a/drivers/serial/clps711x.c Thu Feb 20 23:19:20 2003 +++ b/drivers/serial/clps711x.c Thu Feb 20 23:19:20 2003 @@ -615,8 +615,6 @@ module_init(clps711xuart_init); module_exit(clps711xuart_exit); -EXPORT_NO_SYMBOLS; - MODULE_AUTHOR("Deep Blue Solutions Ltd"); MODULE_DESCRIPTION("CLPS-711x generic serial driver $Revision: 1.42 $"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c --- a/drivers/serial/mcfserial.c Thu Feb 20 23:19:21 2003 +++ b/drivers/serial/mcfserial.c Thu Feb 20 23:19:21 2003 @@ -1,7 +1,7 @@ /* * mcfserial.c -- serial driver for ColdFire internal UARTS. * - * Copyright (C) 1999-2002 Greg Ungerer + * Copyright (C) 1999-2003 Greg Ungerer * Copyright (c) 2000-2001 Lineo, Inc. * Copyright (C) 2001-2002 SnapGear Inc. * @@ -50,12 +50,6 @@ #include #include "mcfserial.h" -/* - * the only event we use - */ -#undef RS_EVENT_WRITE_WAKEUP -#define RS_EVENT_WRITE_WAKEUP 0 - struct timer_list mcfrs_timer_struct; /* @@ -443,12 +437,10 @@ if (!tty) return; - if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) { - if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && - tty->ldisc.write_wakeup) - (tty->ldisc.write_wakeup)(tty); - wake_up_interruptible(&tty->write_wait); - } + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && + tty->ldisc.write_wakeup) + (tty->ldisc.write_wakeup)(tty); + wake_up_interruptible(&tty->write_wait); } diff -Nru a/drivers/serial/nb85e_uart.c b/drivers/serial/nb85e_uart.c --- a/drivers/serial/nb85e_uart.c Thu Feb 20 23:19:23 2003 +++ b/drivers/serial/nb85e_uart.c Thu Feb 20 23:19:23 2003 @@ -472,7 +472,8 @@ /* Restrict flags to legal values. */ if ((cflags & CSIZE) != CS7 && (cflags & CSIZE) != CS8) /* The new value of CSIZE is invalid, use the old value. */ - cflags = (cflags & ~CSIZE) | (old->c_cflag & CSIZE); + cflags = (cflags & ~CSIZE) + | (old ? (old->c_cflag & CSIZE) : CS8); termios->c_cflag = cflags; @@ -609,8 +610,6 @@ module_init (nb85e_uart_init); module_exit (nb85e_uart_exit); - -EXPORT_NO_SYMBOLS; MODULE_AUTHOR ("Miles Bader"); MODULE_DESCRIPTION ("NEC " NB85E_UART_CHIP_NAME " on-chip UART"); diff -Nru a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c --- a/drivers/serial/sa1100.c Thu Feb 20 23:19:20 2003 +++ b/drivers/serial/sa1100.c Thu Feb 20 23:19:20 2003 @@ -885,8 +885,6 @@ module_init(sa1100_serial_init); module_exit(sa1100_serial_exit); -EXPORT_NO_SYMBOLS; - MODULE_AUTHOR("Deep Blue Solutions Ltd"); MODULE_DESCRIPTION("SA1100 generic serial port driver $Revision: 1.50 $"); MODULE_LICENSE("GPL"); diff -Nru a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c --- a/drivers/serial/sunsu.c Thu Feb 20 23:19:20 2003 +++ b/drivers/serial/sunsu.c Thu Feb 20 23:19:20 2003 @@ -525,7 +525,6 @@ up->kbd_id = 0; return; } - kbd_pt_regs = regs; #ifdef CONFIG_SERIO serio_interrupt(&up->serio, ch, 0, regs); #endif diff -Nru a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c --- a/drivers/serial/sunzilog.c Thu Feb 20 23:19:24 2003 +++ b/drivers/serial/sunzilog.c Thu Feb 20 23:19:24 2003 @@ -301,7 +301,6 @@ up->kbd_id = 0; return; } - kbd_pt_regs = regs; #ifdef CONFIG_SERIO serio_interrupt(&up->serio, ch, 0, regs); #endif @@ -1722,8 +1721,6 @@ module_init(sunzilog_init); module_exit(sunzilog_exit); - -EXPORT_NO_SYMBOLS; MODULE_AUTHOR("David S. Miller"); MODULE_DESCRIPTION("Sun Zilog serial port driver"); diff -Nru a/drivers/usb/Makefile.lib b/drivers/usb/Makefile.lib --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/usb/Makefile.lib Thu Feb 20 23:19:19 2003 @@ -0,0 +1,3 @@ +obj-$(CONFIG_USB_CATC) += crc32.o +obj-$(CONFIG_USB_SPEEDTOUCH) += crc32.o +obj-$(CONFIG_USB_USBNET) += crc32.o diff -Nru a/drivers/usb/class/Makefile.lib b/drivers/usb/class/Makefile.lib --- a/drivers/usb/class/Makefile.lib Thu Feb 20 23:19:19 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1 +0,0 @@ -obj-$(CONFIG_USB_CATC) += crc32.o diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c Thu Feb 20 23:19:22 2003 +++ b/drivers/usb/class/cdc-acm.c Thu Feb 20 23:19:22 2003 @@ -606,6 +606,7 @@ if (!acm->ctrlurb) { err("out of memory"); kfree(acm); + kfree(buf); return -ENOMEM; } acm->readurb = usb_alloc_urb(0, GFP_KERNEL); @@ -613,6 +614,7 @@ err("out of memory"); usb_free_urb(acm->ctrlurb); kfree(acm); + kfree(buf); return -ENOMEM; } acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); @@ -621,6 +623,7 @@ usb_free_urb(acm->readurb); usb_free_urb(acm->ctrlurb); kfree(acm); + kfree(buf); return -ENOMEM; } diff -Nru a/drivers/usb/core/message.c b/drivers/usb/core/message.c --- a/drivers/usb/core/message.c Thu Feb 20 23:19:20 2003 +++ b/drivers/usb/core/message.c Thu Feb 20 23:19:20 2003 @@ -219,16 +219,25 @@ spin_lock_irqsave (&io->lock, flags); /* In 2.5 we require hcds' endpoint queues not to progress after fault - * reports, until the competion callback (this!) returns. That lets + * reports, until the completion callback (this!) returns. That lets * device driver code (like this routine) unlink queued urbs first, * if it needs to, since the HC won't work on them at all. So it's * not possible for page N+1 to overwrite page N, and so on. + * + * That's only for "hard" faults; "soft" faults (unlinks) sometimes + * complete before the HCD can get requests away from hardware, + * though never during cleanup after a hard fault. */ - if (io->status && urb->actual_length) { - err ("driver for bus %s dev %s ep %d-%s corrupted data!", - io->dev->bus->bus_name, io->dev->devpath, + if (io->status + && (io->status != -ECONNRESET + || urb->status != -ECONNRESET) + && urb->actual_length) { + dev_err (io->dev->bus->controller, + "dev %s ep%d%s scatterlist error %d/%d\n", + io->dev->devpath, usb_pipeendpoint (urb->pipe), - usb_pipein (urb->pipe) ? "in" : "out"); + usb_pipein (urb->pipe) ? "in" : "out", + urb->status, io->status); // BUG (); } diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c --- a/drivers/usb/core/urb.c Thu Feb 20 23:19:22 2003 +++ b/drivers/usb/core/urb.c Thu Feb 20 23:19:22 2003 @@ -195,7 +195,7 @@ if (!urb || urb->hcpriv || !urb->complete) return -EINVAL; - if (!(dev = urb->dev) || !dev->bus || dev->devnum <= 0) + if (!(dev = urb->dev) || !dev->present || !dev->bus || dev->devnum <= 0) return -ENODEV; if (!(op = dev->bus->op) || !op->submit_urb) return -ENODEV; @@ -376,7 +376,7 @@ */ int usb_unlink_urb(struct urb *urb) { - if (urb && urb->dev && urb->dev->bus && urb->dev->bus->op) + if (urb && urb->dev && urb->dev->present && urb->dev->bus && urb->dev->bus->op) return urb->dev->bus->op->unlink_urb(urb); else return -ENODEV; diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c --- a/drivers/usb/core/usb.c Thu Feb 20 23:19:22 2003 +++ b/drivers/usb/core/usb.c Thu Feb 20 23:19:22 2003 @@ -679,6 +679,7 @@ memset(dev, 0, sizeof(*dev)); device_initialize(&dev->dev); + dev->present = 1; usb_bus_get(bus); @@ -853,6 +854,10 @@ usbfs_remove_device(dev); } device_unregister(&dev->dev); + + /* mark the device as not present so any further urb submissions for + * this device will fail. */ + dev->present = 0; /* Decrement the reference count, it'll auto free everything when */ /* it hits 0 which could very well be now */ diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c --- a/drivers/usb/host/ehci-hcd.c Thu Feb 20 23:19:22 2003 +++ b/drivers/usb/host/ehci-hcd.c Thu Feb 20 23:19:22 2003 @@ -37,7 +37,7 @@ #include #include #include - +#include #include #include @@ -306,6 +306,19 @@ return 0; } +static int +ehci_reboot (struct notifier_block *self, unsigned long code, void *null) +{ + struct ehci_hcd *ehci; + + ehci = container_of (self, struct ehci_hcd, reboot_notifier); + + /* make BIOS/etc use companion controller during reboot */ + writel (0, &ehci->regs->configured_flag); + return 0; +} + + /* called by khubd or root hub init threads */ static int ehci_start (struct usb_hcd *hcd) @@ -464,6 +477,9 @@ * are explicitly handed to companion controller(s), so no TT is * involved with the root hub. */ + ehci->reboot_notifier.notifier_call = ehci_reboot; + register_reboot_notifier (&ehci->reboot_notifier); + ehci->hcd.state = USB_STATE_READY; writel (FLAG_CF, &ehci->regs->configured_flag); readl (&ehci->regs->command); /* unblock posted write */ @@ -520,6 +536,7 @@ /* let companion controllers work when we aren't */ writel (0, &ehci->regs->configured_flag); + unregister_reboot_notifier (&ehci->reboot_notifier); remove_debug_files (ehci); diff -Nru a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h --- a/drivers/usb/host/ehci.h Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/host/ehci.h Thu Feb 20 23:19:23 2003 @@ -81,8 +81,10 @@ struct pci_pool *sitd_pool; /* sitd per split iso urb */ struct timer_list watchdog; + struct notifier_block reboot_notifier; unsigned stamp; + /* irq statistics */ #ifdef EHCI_STATS struct ehci_stats stats; # define COUNT(x) do { (x)++; } while (0) diff -Nru a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig --- a/drivers/usb/input/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/input/Kconfig Thu Feb 20 23:19:23 2003 @@ -163,11 +163,10 @@ tristate "Griffin PowerMate and Contour Jog support" depends on USB && INPUT ---help--- - Say Y here if you want to use Griffin PowerMate or Contour Jog devices. - These are stainless steel dials which can measure clockwise and - anticlockwise rotation. The dial also acts as a pushbutton. The base - contains an LED which can be instructed to pulse or to switch to a - particular intensity. + Say Y here if you want to use Griffin PowerMate or Contour Jog devices. + These are aluminum dials which can measure clockwise and anticlockwise + rotation. The dial also acts as a pushbutton. The base contains an LED + which can be instructed to pulse or to switch to a particular intensity. You can download userspace tools from http://sowerbutts.com/powermate/ diff -Nru a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c --- a/drivers/usb/input/usbkbd.c Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/input/usbkbd.c Thu Feb 20 23:19:23 2003 @@ -355,7 +355,7 @@ MODULE_DEVICE_TABLE (usb, usb_kbd_id_table); static struct usb_driver usb_kbd_driver = { - .name = "keyboard", + .name = "usbkbd", .probe = usb_kbd_probe, .disconnect = usb_kbd_disconnect, .id_table = usb_kbd_id_table, diff -Nru a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c --- a/drivers/usb/input/usbmouse.c Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/input/usbmouse.c Thu Feb 20 23:19:23 2003 @@ -238,7 +238,7 @@ MODULE_DEVICE_TABLE (usb, usb_mouse_id_table); static struct usb_driver usb_mouse_driver = { - .name = "usb_mouse", + .name = "usbmouse", .probe = usb_mouse_probe, .disconnect = usb_mouse_disconnect, .id_table = usb_mouse_id_table, diff -Nru a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c --- a/drivers/usb/media/ov511.c Thu Feb 20 23:19:20 2003 +++ b/drivers/usb/media/ov511.c Thu Feb 20 23:19:20 2003 @@ -1,7 +1,7 @@ /* * OmniVision OV511 Camera-to-USB Bridge Driver * - * Copyright (c) 1999-2002 Mark W. McClelland + * Copyright (c) 1999-2003 Mark W. McClelland * Original decompression code Copyright 1998-2000 OmniVision Technologies * Many improvements by Bret Wallach * Color fixes by by Orion Sky Lawlor (2/26/2000) @@ -60,7 +60,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v1.63 for Linux 2.5" +#define DRIVER_VERSION "v1.64 for Linux 2.5" #define EMAIL "mark@alpha.dyndns.org" #define DRIVER_AUTHOR "Mark McClelland & Bret Wallach \ & Orion Sky Lawlor & Kevin Moore & Charl P. Botha \ @@ -137,7 +137,7 @@ MODULE_PARM(cams, "i"); MODULE_PARM_DESC(cams, "Number of simultaneous cameras"); MODULE_PARM(compress, "i"); -MODULE_PARM_DESC(compress, "Turn on compression (not reliable yet)"); +MODULE_PARM_DESC(compress, "Turn on compression"); MODULE_PARM(testpat, "i"); MODULE_PARM_DESC(testpat, "Replace image with vertical bar testpattern (only partially working)"); @@ -1349,6 +1349,13 @@ return 0; } +/* Sleeps until no frames are active. Returns !0 if got signal */ +static int +ov51x_wait_frames_inactive(struct usb_ov511 *ov) +{ + return wait_event_interruptible(ov->wq, ov->curframe < 0); +} + /* Resets the hardware snapshot button */ static void ov51x_clear_snapshot(struct usb_ov511 *ov) @@ -2121,7 +2128,7 @@ return 0; } -#endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */ +#endif /* CONFIG_VIDEO_PROC_FS */ /* Turns on or off the LED. Only has an effect with OV511+/OV518(+) */ static void @@ -2486,8 +2493,6 @@ /******** Clock programming ********/ - // FIXME: Test this with OV6630 - /* The OV6620 needs special handling. This prevents the * severe banding that normally occurs */ if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630) @@ -2995,6 +3000,7 @@ ov->frame[i].format = force_palette; else ov->frame[i].format = VIDEO_PALETTE_YUV420; + ov->frame[i].depth = get_depth(ov->frame[i].format); } @@ -3577,12 +3583,8 @@ if (frame->scanstate == STATE_LINES) { int nextf; - frame->grabstate = FRAME_DONE; // FIXME: Is this right? - - if (waitqueue_active(&frame->wq)) { - frame->grabstate = FRAME_DONE; - wake_up_interruptible(&frame->wq); - } + frame->grabstate = FRAME_DONE; + wake_up_interruptible(&frame->wq); /* If next frame is ready or grabbing, * point to it */ @@ -3747,12 +3749,8 @@ if (frame->scanstate == STATE_LINES) { int nextf; - frame->grabstate = FRAME_DONE; // FIXME: Is this right? - - if (waitqueue_active(&frame->wq)) { - frame->grabstate = FRAME_DONE; - wake_up_interruptible(&frame->wq); - } + frame->grabstate = FRAME_DONE; + wake_up_interruptible(&frame->wq); /* If next frame is ready or grabbing, * point to it */ @@ -4228,7 +4226,7 @@ } static void -ov51x_dealloc(struct usb_ov511 *ov, int now) +ov51x_dealloc(struct usb_ov511 *ov) { PDEBUG(4, "entered"); down(&ov->buf_lock); @@ -4258,10 +4256,6 @@ if (ov->user) goto out; - err = ov51x_alloc(ov); - if (err < 0) - goto out; - ov->sub_flag = 0; /* In case app doesn't set them... */ @@ -4283,9 +4277,13 @@ goto out; } + err = ov51x_alloc(ov); + if (err < 0) + goto out; + err = ov51x_init_isoc(ov); if (err) { - ov51x_dealloc(ov, 0); + ov51x_dealloc(ov); goto out; } @@ -4319,7 +4317,7 @@ ov51x_led_control(ov, 0); if (ov->dev) - ov51x_dealloc(ov, 0); + ov51x_dealloc(ov); up(&ov->lock); @@ -4331,7 +4329,7 @@ ov->cbuf = NULL; up(&ov->cbuf_lock); - ov51x_dealloc(ov, 1); + ov51x_dealloc(ov); kfree(ov); ov = NULL; } @@ -4449,7 +4447,7 @@ case VIDIOCSPICT: { struct video_picture *p = arg; - int i; + int i, rc; PDEBUG(4, "VIDIOCSPICT"); @@ -4469,10 +4467,9 @@ if (p->palette != ov->frame[0].format) { PDEBUG(4, "Detected format change"); - /* If we're collecting previous frame wait - before changing modes */ - interruptible_sleep_on(&ov->wq); - if (signal_pending(current)) return -EINTR; + rc = ov51x_wait_frames_inactive(ov); + if (rc) + return rc; mode_init_regs(ov, ov->frame[0].width, ov->frame[0].height, p->palette, ov->sub_flag); @@ -4530,7 +4527,7 @@ case VIDIOCSWIN: { struct video_window *vw = arg; - int i, result; + int i, rc; PDEBUG(4, "VIDIOCSWIN: %dx%d", vw->width, vw->height); @@ -4545,15 +4542,14 @@ return -EINVAL; #endif - /* If we're collecting previous frame wait - before changing modes */ - interruptible_sleep_on(&ov->wq); - if (signal_pending(current)) return -EINTR; + rc = ov51x_wait_frames_inactive(ov); + if (rc) + return rc; - result = mode_init_regs(ov, vw->width, vw->height, + rc = mode_init_regs(ov, vw->width, vw->height, ov->frame[0].format, ov->sub_flag); - if (result < 0) - return result; + if (rc < 0) + return rc; for (i = 0; i < OV511_NUMFRAMES; i++) { ov->frame[i].width = vw->width; @@ -4600,7 +4596,7 @@ case VIDIOCMCAPTURE: { struct video_mmap *vm = arg; - int ret, depth; + int rc, depth; unsigned int f = vm->frame; PDEBUG(4, "VIDIOCMCAPTURE: frame: %d, %dx%d, %s", f, vm->width, @@ -4642,14 +4638,14 @@ (ov->frame[f].depth != depth)) { PDEBUG(4, "VIDIOCMCAPTURE: change in image parameters"); - /* If we're collecting previous frame wait - before changing modes */ - interruptible_sleep_on(&ov->wq); - if (signal_pending(current)) return -EINTR; - ret = mode_init_regs(ov, vm->width, vm->height, + rc = ov51x_wait_frames_inactive(ov); + if (rc) + return rc; + + rc = mode_init_regs(ov, vm->width, vm->height, vm->format, ov->sub_flag); #if 0 - if (ret < 0) { + if (rc < 0) { PDEBUG(1, "Got error while initializing regs "); return ret; } @@ -4702,18 +4698,15 @@ return rc; if (frame->grabstate == FRAME_ERROR) { - int ret; - - if ((ret = ov51x_new_frame(ov, fnum)) < 0) - return ret; + if ((rc = ov51x_new_frame(ov, fnum)) < 0) + return rc; goto redo; } /* Fall through */ case FRAME_DONE: if (ov->snap_enabled && !frame->snapshot) { - int ret; - if ((ret = ov51x_new_frame(ov, fnum)) < 0) - return ret; + if ((rc = ov51x_new_frame(ov, fnum)) < 0) + return rc; goto redo; } @@ -6089,7 +6082,6 @@ return -EBUSY; } - /**************************************************************************** * * USB routines @@ -6097,11 +6089,10 @@ ***************************************************************************/ static int -ov51x_probe(struct usb_interface *intf, - const struct usb_device_id *id) +ov51x_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); - struct usb_interface_descriptor *interface; + struct usb_interface_descriptor *idesc; struct usb_ov511 *ov; int i; int registered = 0; @@ -6112,12 +6103,11 @@ if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; - interface = &intf->altsetting[0].desc; + idesc = &intf->altsetting[0].desc; - /* Checking vendor/product should be enough, but what the hell */ - if (interface->bInterfaceClass != 0xFF) + if (idesc->bInterfaceClass != 0xFF) return -ENODEV; - if (interface->bInterfaceSubClass != 0x00) + if (idesc->bInterfaceSubClass != 0x00) return -ENODEV; if ((ov = kmalloc(sizeof(*ov), GFP_KERNEL)) == NULL) { @@ -6128,7 +6118,7 @@ memset(ov, 0, sizeof(*ov)); ov->dev = dev; - ov->iface = interface->bInterfaceNumber; + ov->iface = idesc->bInterfaceNumber; ov->led_policy = led; ov->compress = compress; ov->lightfreq = lightfreq; @@ -6272,7 +6262,7 @@ error_out: err("Camera initialization failed"); - return -ENOMEM; + return -EIO; } static void @@ -6284,6 +6274,7 @@ PDEBUG(3, ""); usb_set_intfdata (intf, NULL); + if (!ov) return; @@ -6298,10 +6289,9 @@ /* This will cause the process to request another frame */ for (n = 0; n < OV511_NUMFRAMES; n++) - if (waitqueue_active(&ov->frame[n].wq)) - wake_up_interruptible(&ov->frame[n].wq); - if (waitqueue_active(&ov->wq)) - wake_up_interruptible(&ov->wq); + wake_up_interruptible(&ov->frame[n].wq); + + wake_up_interruptible(&ov->wq); ov->streaming = 0; ov51x_unlink_isoc(ov); @@ -6317,7 +6307,7 @@ ov->cbuf = NULL; up(&ov->cbuf_lock); - ov51x_dealloc(ov, 1); + ov51x_dealloc(ov); kfree(ov); ov = NULL; } @@ -6332,7 +6322,6 @@ .probe = ov51x_probe, .disconnect = ov51x_disconnect }; - /**************************************************************************** * diff -Nru a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig --- a/drivers/usb/misc/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/misc/Kconfig Thu Feb 20 23:19:23 2003 @@ -96,6 +96,15 @@ config USB_SPEEDTOUCH tristate "Alcatel Speedtouch ADSL USB Modem" depends on USB && ATM + help + Say Y here if you have an Alcatel SpeedTouch USB or SpeedTouch 330 + modem. In order to use your modem you will need to install some user + space tools, see for details. + + This code is also available as a module ( = code which can be + inserted in and removed from the running kernel whenever you want). + The module will be called speedtch. If you want to compile it as + a module, say M here and read . config USB_TEST tristate "USB testing driver (DEVELOPMENT)" diff -Nru a/drivers/usb/misc/atmsar.c b/drivers/usb/misc/atmsar.c --- a/drivers/usb/misc/atmsar.c Thu Feb 20 23:19:20 2003 +++ b/drivers/usb/misc/atmsar.c Thu Feb 20 23:19:20 2003 @@ -71,6 +71,7 @@ * */ +#include #include "atmsar.h" /*********************** @@ -113,200 +114,22 @@ *dest++ = (unsigned char) (header >> 8); \ *dest++ = (unsigned char) (header & 0xff); -/* - * CRC Routines from net/wan/sbni.c) - * table generated by Rocksoft^tm Model CRC Algorithm Table Generation Program V1.0 - */ -#define CRC32_REMAINDER CBF43926 -#define CRC32_INITIAL 0xffffffff -#define CRC32(c,crc) (crc32tab[((size_t)(crc>>24) ^ (c)) & 0xff] ^ (((crc) << 8))) -unsigned long crc32tab[256] = { - 0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L, - 0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L, - 0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L, - 0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL, - 0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L, - 0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L, - 0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L, - 0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL, - 0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L, - 0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L, - 0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L, - 0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL, - 0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L, - 0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L, - 0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L, - 0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL, - 0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL, - 0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L, - 0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L, - 0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL, - 0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL, - 0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L, - 0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L, - 0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL, - 0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL, - 0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L, - 0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L, - 0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL, - 0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL, - 0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L, - 0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L, - 0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL, - 0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L, - 0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL, - 0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL, - 0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L, - 0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L, - 0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL, - 0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL, - 0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L, - 0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L, - 0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL, - 0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL, - 0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L, - 0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L, - 0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL, - 0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL, - 0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L, - 0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L, - 0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL, - 0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L, - 0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L, - 0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L, - 0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL, - 0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L, - 0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L, - 0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L, - 0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL, - 0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L, - 0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L, - 0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L, - 0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL, - 0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L, - 0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L -}; - -#ifdef CRCASM - -unsigned long calc_crc (char *mem, int len, unsigned initial) -{ - unsigned crc, dummy_len; - __asm__ ("xorl %%eax,%%eax\n\t" "1:\n\t" "movl %%edx,%%eax\n\t" "shrl $16,%%eax\n\t" "lodsb\n\t" "xorb %%ah,%%al\n\t" "andl $255,%%eax\n\t" "shll $8,%%edx\n\t" "xorl (%%edi,%%eax,4),%%edx\n\t" "loop 1b":"=d" (crc), - "=c" - (dummy_len) - : "S" (mem), "D" (&crc32tab[0]), "1" (len), "0" (initial) - : "eax"); - return crc; -} - -#else - -unsigned long calc_crc (char *mem, int len, unsigned initial) -{ - unsigned crc; - crc = initial; - - for (; len; mem++, len--) { - crc = CRC32 (*mem, crc); - } - return (crc); -} -#endif - -#define crc32( crc, mem, len) calc_crc(mem, len, crc); - -/* initialization routines. not used at the moment - * I will avoid these as long as possible !! - */ - -int open_atmsar (void) -{ - return 0; -} - -int remove_atmsar (void) -{ - return 0; -} - -/* ATOMIC version of alloc_tx */ -struct sk_buff *atmsar_alloc_skb_wrapper (struct atm_vcc *vcc, unsigned int size) -{ - struct sk_buff *skb; - - if (atomic_read (&vcc->tx_inuse) && !atm_may_send (vcc, size)) { - PDEBUG ("Sorry: tx_inuse = %d, size = %d, sndbuf = %d\n", - atomic_read (&vcc->tx_inuse), size, vcc->sk->sndbuf); - return NULL; - } - skb = alloc_skb (size, GFP_ATOMIC); - if (!skb) - return NULL; - atomic_add (skb->truesize + ATM_PDU_OVHD, &vcc->tx_inuse); - return skb; -} - -struct sk_buff *atmsar_alloc_tx (struct atmsar_vcc_data *vcc, unsigned int size) -{ - struct sk_buff *tmp = NULL; - int bufsize = 0; - - switch (vcc->type) { - case ATMSAR_TYPE_AAL0: - /* reserving adequate headroom */ - bufsize = - size + (((size / 48) + 1) * ((vcc->flags & ATMSAR_USE_53BYTE_CELL) ? 5 : 4)); - break; - case ATMSAR_TYPE_AAL1: - /* reserving adequate headroom */ - bufsize = - size + (((size / 47) + 1) * ((vcc->flags & ATMSAR_USE_53BYTE_CELL) ? 5 : 4)); - break; - case ATMSAR_TYPE_AAL2: - case ATMSAR_TYPE_AAL34: - /* not supported */ - break; - case ATMSAR_TYPE_AAL5: - /* reserving adequate tailroom */ - bufsize = size + (((size + 8 + 47) / 48) * 48); - break; - } - - PDEBUG ("Requested size %d, Allocating size %d\n", size, bufsize); - tmp = vcc->alloc_tx (vcc->vcc, bufsize); - skb_put (tmp, bufsize); - - return tmp; -} struct atmsar_vcc_data *atmsar_open (struct atmsar_vcc_data **list, struct atm_vcc *vcc, uint type, ushort vpi, ushort vci, unchar pti, unchar gfc, uint flags) { struct atmsar_vcc_data *new; + if (!vcc) + return NULL; + new = kmalloc (sizeof (struct atmsar_vcc_data), GFP_KERNEL); if (!new) return NULL; - if (!vcc) - return NULL; - memset (new, 0, sizeof (struct atmsar_vcc_data)); new->vcc = vcc; -/* - * This gives problems with the ATM layer alloc_tx(). - * It is not usable from interrupt context and for - * some reason this is used in interrupt context - * with br2684.c - * - if (vcc->alloc_tx) - new->alloc_tx = vcc->alloc_tx; - else -*/ - new->alloc_tx = atmsar_alloc_skb_wrapper; - new->stats = vcc->stats; new->type = type; new->next = NULL; @@ -375,216 +198,6 @@ kfree (vcc); } -/*********************** - ** - ** ENCODE FUNCTIONS - ** - ***********************/ - -/* encapsulate in an AAL5 frame, which is then split into ATM cells */ -unsigned int atmsar_encode (struct atmsar_vcc_data *ctx, char *source, char *target, unsigned int pdu_length) -{ - unsigned int num_cells = (pdu_length + ATM_AAL5_TRAILER + ATM_CELL_PAYLOAD - 1) / ATM_CELL_PAYLOAD; - unsigned int num_pdu_cells = pdu_length / ATM_CELL_PAYLOAD + 1; - unsigned int aal5_length = num_cells * ATM_CELL_PAYLOAD; - unsigned int zero_padding = aal5_length - pdu_length - ATM_AAL5_TRAILER; - unsigned int final_length = num_cells * ATM_CELL_SIZE; - unsigned char aal5_trailer [ATM_AAL5_TRAILER]; - unsigned char cell_header [ATM_CELL_HEADER]; - u32 crc; - int i; - - PDEBUG ("atmsar_encode entered\n"); - - PDEBUG ("pdu_length %d, num_cells %d, num_pdu_cells %d, aal5_length %d, zero_padding %d, final_length %d\n", pdu_length, num_cells, num_pdu_cells, aal5_length, zero_padding, final_length); - - PDEBUG ("source 0x=%p, target 0x%p\n", source, target); - - aal5_trailer [0] = 0; /* UU = 0 */ - aal5_trailer [1] = 0; /* CPI = 0 */ - aal5_trailer [2] = pdu_length >> 8; - aal5_trailer [3] = pdu_length; - - crc = crc32 (~0, source, pdu_length); - for (i = 0; i < zero_padding; i++) - crc = CRC32 (0, crc); - crc = crc32 (crc, aal5_trailer, 4); - crc = ~crc; - - aal5_trailer [4] = crc >> 24; - aal5_trailer [5] = crc >> 16; - aal5_trailer [6] = crc >> 8; - aal5_trailer [7] = crc; - - cell_header [0] = ctx->atmHeader >> 24; - cell_header [1] = ctx->atmHeader >> 16; - cell_header [2] = ctx->atmHeader >> 8; - cell_header [3] = ctx->atmHeader; - cell_header [4] = 0xec; - - for (i = 1; i < num_pdu_cells; i++) { - memcpy (target, cell_header, ATM_CELL_HEADER); - target += ATM_CELL_HEADER; - memcpy (target, source, ATM_CELL_PAYLOAD); - target += ATM_CELL_PAYLOAD; - source += ATM_CELL_PAYLOAD; - PDEBUG ("source 0x=%p, target 0x%p\n", source, target); - } - memcpy (target, cell_header, ATM_CELL_HEADER); - target += ATM_CELL_HEADER; - memcpy (target, source, pdu_length % ATM_CELL_PAYLOAD); - target += pdu_length % ATM_CELL_PAYLOAD; - if (num_pdu_cells < num_cells) { - memset (target, 0, zero_padding + ATM_AAL5_TRAILER - ATM_CELL_PAYLOAD); - target += zero_padding + ATM_AAL5_TRAILER - ATM_CELL_PAYLOAD; - memcpy (target, cell_header, ATM_CELL_HEADER); - target += ATM_CELL_HEADER; - zero_padding = ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER; - } - memset (target, 0, zero_padding); - target += zero_padding; - memcpy (target, aal5_trailer, ATM_AAL5_TRAILER); - - /* set pti bit in last cell */ - *(target + ATM_AAL5_TRAILER + 3 - ATM_CELL_SIZE) |= 0x2; - - /* update stats */ - if (ctx->stats) - atomic_inc (&ctx->stats->tx); - - if (ctx->stats && (ctx->type <= ATMSAR_TYPE_AAL1)) - atomic_add (num_cells, &(ctx->stats->tx)); - - return final_length; -} - -struct sk_buff *atmsar_encode_rawcell (struct atmsar_vcc_data *ctx, struct sk_buff *skb) -{ - int number_of_cells = (skb->len) / 48; - int total_length = number_of_cells * (ctx->flags & ATMSAR_USE_53BYTE_CELL ? 53 : 52); - unsigned char *source; - unsigned char *target; - struct sk_buff *out = NULL; - int i; - - PDEBUG ("atmsar_encode_rawcell (0x%p, 0x%p) called\n", ctx, skb); - - if (skb_cloned (skb) - || (skb_headroom (skb) < - (number_of_cells * (ctx->flags & ATMSAR_USE_53BYTE_CELL ? 5 : 4)))) { - PDEBUG - ("atmsar_encode_rawcell allocating new skb. ctx->alloc_tx = 0x%p, ctx->vcc = 0x%p\n", - ctx->alloc_tx, ctx->vcc); - /* get new skb */ - out = ctx->alloc_tx (ctx->vcc, total_length); - if (!out) - return NULL; - - skb_put (out, total_length); - source = skb->data; - target = out->data; - } else { - PDEBUG ("atmsar_encode_rawcell: sufficient headroom\n"); - source = skb->data; - skb_push (skb, number_of_cells * ((ctx->flags & ATMSAR_USE_53BYTE_CELL) ? 5 : 4)); - target = skb->data; - out = skb; - } - - PDEBUG ("source 0x=%p, target 0x%p\n", source, target); - - if (ctx->flags & ATMSAR_USE_53BYTE_CELL) { - for (i = 0; i < number_of_cells; i++) { - ADD_HEADER (target, ctx->atmHeader); - *target++ = (char) 0xEC; - memcpy (target, source, 48); - target += 48; - source += 48; - PDEBUG ("source 0x=%p, target 0x%p\n", source, target); - } - } else { - for (i = 0; i < number_of_cells; i++) { - ADD_HEADER (target, ctx->atmHeader); - memcpy (target, source, 48); - target += 48; - source += 48; - PDEBUG ("source 0x=%p, target 0x%p\n", source, target); - }; - } - - if (ctx->flags & ATMSAR_SET_PTI) { - /* setting pti bit in last cell */ - *(target - (ctx->flags & ATMSAR_USE_53BYTE_CELL ? 50 : 49)) |= 0x2; - } - - /* update stats */ - if (ctx->stats && (ctx->type <= ATMSAR_TYPE_AAL1)) - atomic_add (number_of_cells, &(ctx->stats->tx)); - - PDEBUG ("atmsar_encode_rawcell return 0x%p (length %d)\n", out, out->len); - return out; -} - -struct sk_buff *atmsar_encode_aal5 (struct atmsar_vcc_data *ctx, struct sk_buff *skb) -{ - int length, pdu_length; - unsigned char *trailer; - unsigned char *pad; - uint crc = 0xffffffff; - - PDEBUG ("atmsar_encode_aal5 (0x%p, 0x%p) called\n", ctx, skb); - - /* determine aal5 length */ - pdu_length = skb->len; - length = ((pdu_length + 8 + 47) / 48) * 48; - - if (skb_tailroom (skb) < (length - pdu_length)) { - struct sk_buff *out; - PDEBUG - ("atmsar_encode_aal5 allocating new skb. ctx->alloc_tx = 0x%p, ctx->vcc = 0x%p\n", - ctx->alloc_tx, ctx->vcc); - /* get new skb */ - out = ctx->alloc_tx (ctx->vcc, length); - if (!out) - return NULL; - - PDEBUG ("out->data = 0x%p\n", out->data); - PDEBUG ("atmsar_encode_aal5 pdu length %d, allocated length %d\n", skb->len, - length); - memcpy (out->data, skb->data, skb->len); - skb_put (out, skb->len); - - skb = out; - } - - PDEBUG ("skb->data = 0x%p\n", skb->data); - /* note end of pdu and add length */ - pad = skb_put (skb, length - pdu_length); - trailer = skb->tail - 8; - - PDEBUG ("trailer = 0x%p\n", trailer); - - /* zero padding space */ - memset (pad, 0, length - pdu_length - 8); - - /* add trailer */ - *trailer++ = (unsigned char) 0; /* UU = 0 */ - *trailer++ = (unsigned char) 0; /* CPI = 0 */ - *trailer++ = (unsigned char) (pdu_length >> 8); - *trailer++ = (unsigned char) (pdu_length & 0xff); - crc = ~crc32 (crc, skb->data, length - 4); - *trailer++ = (unsigned char) (crc >> 24); - *trailer++ = (unsigned char) (crc >> 16); - *trailer++ = (unsigned char) (crc >> 8); - *trailer++ = (unsigned char) (crc & 0xff); - - /* update stats */ - if (ctx->stats) - atomic_inc (&ctx->stats->tx); - - PDEBUG ("atmsar_encode_aal5 return 0x%p (length %d)\n", skb, skb->len); - return skb; -} /*********************** ** @@ -745,7 +358,7 @@ skb_pull (skb, skb->len - pdu_length); } - crc = ~crc32 (crc, skb->data, pdu_length - 4); + crc = ~crc32_be (crc, skb->data, pdu_length - 4); /* check crc */ if (pdu_crc != crc) { diff -Nru a/drivers/usb/misc/atmsar.h b/drivers/usb/misc/atmsar.h --- a/drivers/usb/misc/atmsar.h Thu Feb 20 23:19:21 2003 +++ b/drivers/usb/misc/atmsar.h Thu Feb 20 23:19:21 2003 @@ -58,7 +58,6 @@ int type; /* connection specific non-atmsar data */ - struct sk_buff *(*alloc_tx) (struct atm_vcc * vcc, unsigned int size); struct atm_vcc *vcc; struct k_atm_aal_stats *stats; unsigned short mtu; /* max is actually 65k for AAL5... */ @@ -81,15 +80,8 @@ unchar gfc, uint flags); extern void atmsar_close (struct atmsar_vcc_data **list, struct atmsar_vcc_data *vcc); -extern struct sk_buff *atmsar_encode_rawcell (struct atmsar_vcc_data *ctx, struct sk_buff *skb); -extern struct sk_buff *atmsar_encode_aal5 (struct atmsar_vcc_data *ctx, struct sk_buff *skb); - struct sk_buff *atmsar_decode_rawcell (struct atmsar_vcc_data *list, struct sk_buff *skb, struct atmsar_vcc_data **ctx); struct sk_buff *atmsar_decode_aal5 (struct atmsar_vcc_data *ctx, struct sk_buff *skb); - -struct sk_buff *atmsar_alloc_tx (struct atmsar_vcc_data *vcc, unsigned int size); - -unsigned int atmsar_encode (struct atmsar_vcc_data *ctx, char *source, char *target, unsigned int pdu_length); #endif /* _ATMSAR_H_ */ diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c --- a/drivers/usb/misc/speedtouch.c Thu Feb 20 23:19:24 2003 +++ b/drivers/usb/misc/speedtouch.c Thu Feb 20 23:19:24 2003 @@ -61,6 +61,7 @@ #include #include #include +#include #include "atmsar.h" /* @@ -69,14 +70,15 @@ */ #ifdef DEBUG -#define PDEBUG(arg...) printk(KERN_DEBUG "SpeedTouch USB: " arg) +#define PDEBUG(arg...) printk(KERN_DEBUG __FILE__ ": " arg) #else #define PDEBUG(arg...) #endif #ifdef DEBUG_PACKET -#define PACKETDEBUG(arg...) udsl_print_packet ( arg ) +static int udsl_print_packet (const unsigned char *data, int len); +#define PACKETDEBUG(arg...) udsl_print_packet (arg) #else #define PACKETDEBUG(arg...) #endif @@ -88,15 +90,14 @@ #define SPEEDTOUCH_VENDORID 0x06b9 #define SPEEDTOUCH_PRODUCTID 0x4061 -#define UDSL_OBUF_SIZE 32768 -#define UDSL_MINOR 48 #define UDSL_NUMBER_RCV_URBS 1 #define UDSL_NUMBER_SND_URBS 1 -#define UDSL_RECEIVE_BUFFER_SIZE 64*53 +#define UDSL_NUMBER_SND_BUFS (2*UDSL_NUMBER_SND_URBS) +#define UDSL_RCV_BUFFER_SIZE (1*64) /* ATM cells */ +#define UDSL_SND_BUFFER_SIZE (1*64) /* ATM cells */ /* max should be (1500 IP mtu + 2 ppp bytes + 32 * 5 cellheader overhead) for * PPPoA and (1500 + 14 + 32*5 cellheader overhead) for PPPoE */ #define UDSL_MAX_AAL5_MRU 2048 -#define UDSL_SEND_CONTEXTS 8 #define UDSL_IOCTL_START 1 #define UDSL_IOCTL_STOP 2 @@ -126,13 +127,31 @@ struct udsl_instance_data *instance; }; -struct udsl_usb_send_data_context { +struct udsl_send_buffer { + struct list_head list; + unsigned char *base; + unsigned char *free_start; + unsigned int free_cells; +}; + +struct udsl_sender { + struct list_head list; + struct udsl_send_buffer *buffer; struct urb *urb; - struct sk_buff *skb; - struct atm_vcc *vcc; struct udsl_instance_data *instance; }; +struct udsl_control { + struct atm_skb_data atm_data; + unsigned int num_cells; + unsigned int num_entire; + unsigned char cell_header [ATM_CELL_HEADER]; + unsigned int pdu_padding; + unsigned char aal5_trailer [ATM_AAL5_TRAILER]; +}; + +#define UDSL_SKB(x) ((struct udsl_control *)(x)->cb) + /* * UDSL main driver data */ @@ -142,13 +161,10 @@ /* usb device part */ struct usb_device *usb_dev; - struct sk_buff_head sndqueue; - struct udsl_usb_send_data_context send_ctx [UDSL_NUMBER_SND_URBS]; int firmware_loaded; /* atm device part */ struct atm_dev *atm_dev; - struct atmsar_vcc_data *atmsar_vcc_list; /* receiving */ @@ -161,18 +177,30 @@ struct list_head completed_receivers; struct tasklet_struct receive_tasklet; -}; -static const char udsl_driver_name [] = "Alcatel SpeedTouch USB"; + /* sending */ + struct udsl_sender all_senders [UDSL_NUMBER_SND_URBS]; + struct udsl_send_buffer all_buffers [UDSL_NUMBER_SND_BUFS]; -#ifdef DEBUG_PACKET -static int udsl_print_packet (const unsigned char *data, int len); -#endif + struct sk_buff_head sndqueue; + + spinlock_t send_lock; + struct list_head spare_senders; + struct list_head spare_buffers; + + struct tasklet_struct send_tasklet; + struct sk_buff *current_skb; /* being emptied */ + struct udsl_send_buffer *current_buffer; /* being filled */ + struct list_head filled_buffers; +}; + +static const char udsl_driver_name [] = "speedtch"; /* * atm driver prototypes and stuctures */ +static void udsl_atm_dev_close (struct atm_dev *dev); static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci); static void udsl_atm_close (struct atm_vcc *vcc); static int udsl_atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg); @@ -180,6 +208,7 @@ static int udsl_atm_proc_read (struct atm_dev *atm_dev, loff_t *pos, char *page); static struct atmdev_ops udsl_atm_devops = { + .dev_close = udsl_atm_dev_close, .open = udsl_atm_open, .close = udsl_atm_close, .ioctl = udsl_atm_ioctl, @@ -187,20 +216,13 @@ .proc_read = udsl_atm_proc_read, }; -struct udsl_atm_dev_data { - struct atmsar_vcc_data *atmsar_vcc; -}; - /* * usb driver prototypes and structures */ static int udsl_usb_probe (struct usb_interface *intf, const struct usb_device_id *id); static void udsl_usb_disconnect (struct usb_interface *intf); -static int udsl_usb_send_data (struct udsl_instance_data *instance, struct atm_vcc *vcc, - struct sk_buff *skb); static int udsl_usb_ioctl (struct usb_interface *intf, unsigned int code, void *user_data); -static int udsl_usb_cancelsends (struct udsl_instance_data *instance, struct atm_vcc *vcc); static struct usb_driver udsl_usb_driver = { .name = udsl_driver_name, @@ -211,6 +233,86 @@ }; +/************* +** encode ** +*************/ + +static void udsl_groom_skb (struct atm_vcc *vcc, struct sk_buff *skb) { + struct udsl_control *ctrl = UDSL_SKB (skb); + unsigned int i, zero_padding; + unsigned char zero = 0; + u32 crc; + + ctrl->atm_data.vcc = vcc; + ctrl->cell_header [0] = vcc->vpi >> 4; + ctrl->cell_header [1] = (vcc->vpi << 4) | (vcc->vci >> 12); + ctrl->cell_header [2] = vcc->vci >> 4; + ctrl->cell_header [3] = vcc->vci << 4; + ctrl->cell_header [4] = 0xec; + + ctrl->num_cells = (skb->len + ATM_AAL5_TRAILER + ATM_CELL_PAYLOAD - 1) / ATM_CELL_PAYLOAD; + ctrl->num_entire = skb->len / ATM_CELL_PAYLOAD; + + zero_padding = ctrl->num_cells * ATM_CELL_PAYLOAD - skb->len - ATM_AAL5_TRAILER; + + if (ctrl->num_entire + 1 < ctrl->num_cells) + ctrl->pdu_padding = zero_padding - (ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER); + else + ctrl->pdu_padding = zero_padding; + + ctrl->aal5_trailer [0] = 0; /* UU = 0 */ + ctrl->aal5_trailer [1] = 0; /* CPI = 0 */ + ctrl->aal5_trailer [2] = skb->len >> 8; + ctrl->aal5_trailer [3] = skb->len; + + crc = crc32_be (~0, skb->data, skb->len); + for (i = 0; i < zero_padding; i++) + crc = crc32_be (crc, &zero, 1); + crc = crc32_be (crc, ctrl->aal5_trailer, 4); + crc = ~crc; + + ctrl->aal5_trailer [4] = crc >> 24; + ctrl->aal5_trailer [5] = crc >> 16; + ctrl->aal5_trailer [6] = crc >> 8; + ctrl->aal5_trailer [7] = crc; +} + +static char *udsl_write_cell (struct sk_buff *skb, char *target) { + struct udsl_control *ctrl = UDSL_SKB (skb); + + ctrl->num_cells--; + + memcpy (target, ctrl->cell_header, ATM_CELL_HEADER); + target += ATM_CELL_HEADER; + + if (ctrl->num_entire) { + ctrl->num_entire--; + memcpy (target, skb->data, ATM_CELL_PAYLOAD); + target += ATM_CELL_PAYLOAD; + __skb_pull (skb, ATM_CELL_PAYLOAD); + return target; + } + + memcpy (target, skb->data, skb->len); + target += skb->len; + __skb_pull (skb, skb->len); + + memset (target, 0, ctrl->pdu_padding); + target += ctrl->pdu_padding; + + if (ctrl->num_cells) { + ctrl->pdu_padding = ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER; + } else { + memcpy (target, ctrl->aal5_trailer, ATM_AAL5_TRAILER); + target += ATM_AAL5_TRAILER; + /* set pti bit in last cell */ + *(target + 3 - ATM_CELL_SIZE) |= 0x2; + } + + return target; +} + + /************** ** receive ** **************/ @@ -221,19 +323,18 @@ struct udsl_receiver *rcv; unsigned long flags; - PDEBUG ("udsl_complete_receive entered\n"); - if (!urb || !(rcv = urb->context) || !(instance = rcv->instance)) { PDEBUG ("udsl_complete_receive: bad urb!\n"); return; } + PDEBUG ("udsl_complete_receive entered (urb 0x%p, status %d)\n", urb, urb->status); + + tasklet_schedule (&instance->receive_tasklet); /* may not be in_interrupt() */ spin_lock_irqsave (&instance->completed_receivers_lock, flags); list_add_tail (&rcv->list, &instance->completed_receivers); spin_unlock_irqrestore (&instance->completed_receivers_lock, flags); - PDEBUG ("udsl_complete_receive: scheduling tasklet\n"); - tasklet_schedule (&instance->receive_tasklet); } static void udsl_process_receive (unsigned long data) @@ -246,6 +347,7 @@ struct urb *urb; struct atmsar_vcc_data *atmsar_vcc = NULL; struct sk_buff *new = NULL, *tmp = NULL; + int err; PDEBUG ("udsl_process_receive entered\n"); @@ -315,12 +417,12 @@ instance->usb_dev, usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN), (unsigned char *) rcv->skb->data, - UDSL_RECEIVE_BUFFER_SIZE, + UDSL_RCV_BUFFER_SIZE * ATM_CELL_SIZE, udsl_complete_receive, rcv); - if (!usb_submit_urb (urb, GFP_ATOMIC)) + if (!(err = usb_submit_urb (urb, GFP_ATOMIC))) break; - PDEBUG ("udsl_process_receive: submission failed\n"); + PDEBUG ("udsl_process_receive: submission failed (%d)\n", err); /* fall through */ default: /* error or urb unlinked */ PDEBUG ("udsl_process_receive: adding to spare_receivers\n"); @@ -358,7 +460,7 @@ instance->usb_dev, usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN), (unsigned char *) rcv->skb->data, - UDSL_RECEIVE_BUFFER_SIZE, + UDSL_RCV_BUFFER_SIZE * ATM_CELL_SIZE, udsl_complete_receive, rcv); @@ -374,6 +476,210 @@ } +/*********** +** send ** +***********/ + +static void udsl_complete_send (struct urb *urb, struct pt_regs *regs) +{ + struct udsl_instance_data *instance; + struct udsl_sender *snd; + unsigned long flags; + + if (!urb || !(snd = urb->context) || !(instance = snd->instance)) { + PDEBUG ("udsl_complete_send: bad urb!\n"); + return; + } + + PDEBUG ("udsl_complete_send entered (urb 0x%p, status %d)\n", urb, urb->status); + + tasklet_schedule (&instance->send_tasklet); + /* may not be in_interrupt() */ + spin_lock_irqsave (&instance->send_lock, flags); + list_add (&snd->list, &instance->spare_senders); + list_add (&snd->buffer->list, &instance->spare_buffers); + spin_unlock_irqrestore (&instance->send_lock, flags); +} + +static void udsl_process_send (unsigned long data) +{ + struct udsl_send_buffer *buf; + unsigned int cells_to_write; + int err; + unsigned long flags; + unsigned int i; + struct udsl_instance_data *instance = (struct udsl_instance_data *) data; + struct sk_buff *skb; + struct udsl_sender *snd; + unsigned char *target; + + PDEBUG ("udsl_process_send entered\n"); + +made_progress: + spin_lock_irqsave (&instance->send_lock, flags); + while (!list_empty (&instance->spare_senders)) { + if (!list_empty (&instance->filled_buffers)) { + buf = list_entry (instance->filled_buffers.next, struct udsl_send_buffer, list); + list_del (&buf->list); + PDEBUG ("sending filled buffer (0x%p)\n", buf); + } else if ((buf = instance->current_buffer)) { + instance->current_buffer = NULL; + PDEBUG ("sending current buffer (0x%p)\n", buf); + } else /* all buffers empty */ + break; + + snd = list_entry (instance->spare_senders.next, struct udsl_sender, list); + list_del (&snd->list); + spin_unlock_irqrestore (&instance->send_lock, flags); + + snd->buffer = buf; + usb_fill_bulk_urb (snd->urb, + instance->usb_dev, + usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), + buf->base, + (UDSL_SND_BUFFER_SIZE - buf->free_cells) * ATM_CELL_SIZE, + udsl_complete_send, + snd); + + PDEBUG ("submitting urb 0x%p, contains %d cells\n", snd->urb, UDSL_SND_BUFFER_SIZE - buf->free_cells); + + if ((err = usb_submit_urb(snd->urb, GFP_ATOMIC)) < 0) { + PDEBUG ("submission failed (%d)!\n", err); + spin_lock_irqsave (&instance->send_lock, flags); + list_add (&snd->list, &instance->spare_senders); + spin_unlock_irqrestore (&instance->send_lock, flags); + list_add (&buf->list, &instance->filled_buffers); + return; + } + + spin_lock_irqsave (&instance->send_lock, flags); + } /* while */ + spin_unlock_irqrestore (&instance->send_lock, flags); + + if (!instance->current_skb && !(instance->current_skb = skb_dequeue (&instance->sndqueue))) { + PDEBUG ("done - no more skbs\n"); + return; + } + + skb = instance->current_skb; + + if (!(buf = instance->current_buffer)) { + spin_lock_irqsave (&instance->send_lock, flags); + if (list_empty (&instance->spare_buffers)) { + instance->current_buffer = NULL; + spin_unlock_irqrestore (&instance->send_lock, flags); + PDEBUG ("done - no more buffers\n"); + return; + } + buf = list_entry (instance->spare_buffers.next, struct udsl_send_buffer, list); + list_del (&buf->list); + spin_unlock_irqrestore (&instance->send_lock, flags); + + buf->free_start = buf->base; + buf->free_cells = UDSL_SND_BUFFER_SIZE; + + instance->current_buffer = buf; + } + + cells_to_write = min (buf->free_cells, UDSL_SKB (skb)->num_cells); + target = buf->free_start; + + PDEBUG ("writing %u cells from skb 0x%p to buffer 0x%p\n", cells_to_write, skb, buf); + + for (i = 0; i < cells_to_write; i++) + target = udsl_write_cell (skb, target); + + buf->free_start = target; + if (!(buf->free_cells -= cells_to_write)) { + list_add_tail (&buf->list, &instance->filled_buffers); + instance->current_buffer = NULL; + PDEBUG ("queued filled buffer\n"); + } + + PDEBUG ("buffer contains %d cells, %d left\n", UDSL_SND_BUFFER_SIZE - buf->free_cells, buf->free_cells); + + if (!UDSL_SKB (skb)->num_cells) { + struct atm_vcc *vcc = UDSL_SKB (skb)->atm_data.vcc; + + PDEBUG ("discarding empty skb\n"); + if (vcc->pop) + vcc->pop (vcc, skb); + else + kfree_skb (skb); + instance->current_skb = NULL; + + if (vcc->stats) + atomic_inc (&vcc->stats->tx); + } + + goto made_progress; +} + +static void udsl_cancel_send (struct udsl_instance_data *instance, struct atm_vcc *vcc) +{ + unsigned long flags; + struct sk_buff *skb, *n; + + PDEBUG ("udsl_cancel_send entered\n"); + spin_lock_irqsave (&instance->sndqueue.lock, flags); + for (skb = instance->sndqueue.next, n = skb->next; skb != (struct sk_buff *)&instance->sndqueue; skb = n, n = skb->next) + if (UDSL_SKB (skb)->atm_data.vcc == vcc) { + PDEBUG ("popping skb 0x%p\n", skb); + __skb_unlink (skb, &instance->sndqueue); + if (vcc->pop) + vcc->pop (vcc, skb); + else + kfree_skb (skb); + } + spin_unlock_irqrestore (&instance->sndqueue.lock, flags); + + tasklet_disable (&instance->send_tasklet); + if ((skb = instance->current_skb) && (UDSL_SKB (skb)->atm_data.vcc == vcc)) { + PDEBUG ("popping current skb (0x%p)\n", skb); + instance->current_skb = NULL; + if (vcc->pop) + vcc->pop (vcc, skb); + else + kfree_skb (skb); + } + tasklet_enable (&instance->send_tasklet); + PDEBUG ("udsl_cancel_send done\n"); +} + +static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb) +{ + struct udsl_instance_data *instance = vcc->dev->dev_data; + + PDEBUG ("udsl_atm_send called (skb 0x%p, len %u)\n", skb, skb->len); + + if (!instance) { + PDEBUG ("NULL instance!\n"); + return -EINVAL; + } + + if (!instance->firmware_loaded) + return -EAGAIN; + + if (vcc->qos.aal != ATM_AAL5) { + PDEBUG ("unsupported ATM type %d!\n", vcc->qos.aal); + return -EINVAL; + } + + if (skb->len > ATM_MAX_AAL5_PDU) { + PDEBUG ("packet too long (%d vs %d)!\n", skb->len, ATM_MAX_AAL5_PDU); + return -EINVAL; + } + + PACKETDEBUG (skb->data, skb->len); + + udsl_groom_skb (vcc, skb); + skb_queue_tail (&instance->sndqueue, skb); + tasklet_schedule (&instance->send_tasklet); + + return 0; +} + + /************ ** ATM ** ************/ @@ -384,24 +690,21 @@ * ****************************************************************************/ -static void udsl_atm_stopdevice (struct udsl_instance_data *instance) +static void udsl_atm_dev_close (struct atm_dev *dev) { - struct atm_vcc *walk; - struct atm_dev *atm_dev; + struct udsl_instance_data *instance = dev->dev_data; - if (!instance->atm_dev) + if (!instance) { + PDEBUG ("udsl_atm_dev_close: NULL instance!\n"); return; + } - atm_dev = instance->atm_dev; - - atm_dev->signal = ATM_PHY_SIG_LOST; - walk = atm_dev->vccs; - shutdown_atm_dev (atm_dev); - - for (; walk; walk = walk->next) - wake_up (&walk->sleep); + PDEBUG ("udsl_atm_dev_close: queue has %u elements\n", instance->sndqueue.qlen); - instance->atm_dev = NULL; + PDEBUG ("udsl_atm_dev_close: killing tasklet\n"); + tasklet_kill (&instance->send_tasklet); + PDEBUG ("udsl_atm_dev_close: freeing instance\n"); + kfree (instance); } @@ -410,17 +713,6 @@ * ATM helper functions * ****************************************************************************/ -static struct sk_buff *udsl_atm_alloc_tx (struct atm_vcc *vcc, unsigned int size) -{ - struct atmsar_vcc_data *atmsar_vcc = - ((struct udsl_atm_dev_data *) vcc->dev_data)->atmsar_vcc; - if (atmsar_vcc) - return atmsar_alloc_tx (atmsar_vcc, size); - - printk (KERN_INFO - "SpeedTouch USB: udsl_atm_alloc_tx could not find correct alloc_tx function !\n"); - return NULL; -} static int udsl_atm_proc_read (struct atm_dev *atm_dev, loff_t *pos, char *page) { @@ -439,14 +731,6 @@ atm_dev->esi[3], atm_dev->esi[4], atm_dev->esi[5]); if (!left--) - return sprintf (page, "AAL0: tx %d ( %d err ), rx %d ( %d err, %d drop )\n", - atomic_read (&atm_dev->stats.aal0.tx), - atomic_read (&atm_dev->stats.aal0.tx_err), - atomic_read (&atm_dev->stats.aal0.rx), - atomic_read (&atm_dev->stats.aal0.rx_err), - atomic_read (&atm_dev->stats.aal0.rx_drop)); - - if (!left--) return sprintf (page, "AAL5: tx %d ( %d err ), rx %d ( %d err, %d drop )\n", atomic_read (&atm_dev->stats.aal5.tx), atomic_read (&atm_dev->stats.aal5.tx_err), @@ -460,67 +744,12 @@ /*************************************************************************** * -* ATM DATA functions -* -****************************************************************************/ -static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb) -{ - struct udsl_atm_dev_data *dev_data = vcc->dev_data; - struct udsl_instance_data *instance = vcc->dev->dev_data; - struct sk_buff *new = NULL; - int err; - - PDEBUG ("udsl_atm_send called\n"); - - if (!dev_data || !instance) { - PDEBUG ("NULL data!\n"); - return -EINVAL; - } - - if (!instance->firmware_loaded) - return -EAGAIN; - - switch (vcc->qos.aal) { - case ATM_AAL5: - new = atmsar_encode_aal5 (dev_data->atmsar_vcc, skb); - if (!new) - goto nomem; - if (new != skb) { - vcc->pop (vcc, skb); - skb = new; - } - new = atmsar_encode_rawcell (dev_data->atmsar_vcc, skb); - if (!new) - goto nomem; - if (new != skb) { - vcc->pop (vcc, skb); - skb = new; - } - err = udsl_usb_send_data (instance, vcc, skb); - PDEBUG ("udsl_atm_send successfull (%d)\n", err); - return err; - break; - default: - return -EINVAL; - } - - PDEBUG ("udsl_atm_send unsuccessfull\n"); - return 0; - nomem: - vcc->pop (vcc, skb); - return -ENOMEM; -} - - -/*************************************************************************** -* * SAR driver entries * ****************************************************************************/ static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci) { - struct udsl_atm_dev_data *dev_data; struct udsl_instance_data *instance = vcc->dev->dev_data; PDEBUG ("udsl_atm_open called\n"); @@ -535,15 +764,12 @@ return -EINVAL; MOD_INC_USE_COUNT; - dev_data = kmalloc (sizeof (struct udsl_atm_dev_data), GFP_KERNEL); - if (!dev_data) - return -ENOMEM; - dev_data->atmsar_vcc = + vcc->dev_data = atmsar_open (&(instance->atmsar_vcc_list), vcc, ATMSAR_TYPE_AAL5, vpi, vci, 0, 0, ATMSAR_USE_53BYTE_CELL | ATMSAR_SET_PTI); - if (!dev_data->atmsar_vcc) { - kfree (dev_data); + if (!vcc->dev_data) { + MOD_DEC_USE_COUNT; return -ENOMEM; /* this is the only reason atmsar_open can fail... */ } @@ -552,10 +778,8 @@ set_bit (ATM_VF_ADDR, &vcc->flags); set_bit (ATM_VF_PARTIAL, &vcc->flags); set_bit (ATM_VF_READY, &vcc->flags); - vcc->dev_data = dev_data; - vcc->alloc_tx = udsl_atm_alloc_tx; - dev_data->atmsar_vcc->mtu = UDSL_MAX_AAL5_MRU; + ((struct atmsar_vcc_data *)vcc->dev_data)->mtu = UDSL_MAX_AAL5_MRU; if (instance->firmware_loaded) udsl_fire_receivers (instance); @@ -566,22 +790,20 @@ static void udsl_atm_close (struct atm_vcc *vcc) { - struct udsl_atm_dev_data *dev_data = vcc->dev_data; struct udsl_instance_data *instance = vcc->dev->dev_data; PDEBUG ("udsl_atm_close called\n"); - if (!dev_data || !instance) { - PDEBUG ("NULL data!\n"); + if (!instance) { + PDEBUG ("NULL instance!\n"); return; } /* freeing resources */ /* cancel all sends on this vcc */ - udsl_usb_cancelsends (instance, vcc); + udsl_cancel_send (instance, vcc); - atmsar_close (&(instance->atmsar_vcc_list), dev_data->atmsar_vcc); - kfree (dev_data); + atmsar_close (&(instance->atmsar_vcc_list), vcc->dev_data); vcc->dev_data = NULL; clear_bit (ATM_VF_PARTIAL, &vcc->flags); @@ -611,131 +833,6 @@ ** USB ** ************/ -/*************************************************************************** -* -* usb data functions -* -****************************************************************************/ - -struct udsl_cb { - struct atm_vcc *vcc; -}; - -static void udsl_usb_send_data_complete (struct urb *urb, struct pt_regs *regs) -{ - struct udsl_usb_send_data_context *ctx = urb->context; - struct udsl_instance_data *instance = ctx->instance; - int err; - - PDEBUG ("udsl_usb_send_data_completion (vcc = %p, skb = %p, status %d)\n", ctx->vcc, - ctx->skb, urb->status); - - ctx->vcc->pop (ctx->vcc, ctx->skb); - - if (!(ctx->skb = skb_dequeue (&(instance->sndqueue)))) - return; - - /* submit next skb */ - ctx->vcc = ((struct udsl_cb *) (ctx->skb->cb))->vcc; - usb_fill_bulk_urb (urb, - instance->usb_dev, - usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), - (unsigned char *) ctx->skb->data, - ctx->skb->len, udsl_usb_send_data_complete, ctx); - - err = usb_submit_urb (urb, GFP_ATOMIC); - - PDEBUG ("udsl_usb_send_data_completion (send packet %p with length %d), retval = %d\n", - ctx->skb, ctx->skb->len, err); -} - -static int udsl_usb_cancelsends (struct udsl_instance_data *instance, struct atm_vcc *vcc) -{ - int i; - - for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) { - if (!instance->send_ctx[i].skb) - continue; - if (instance->send_ctx[i].vcc == vcc) { - usb_unlink_urb (instance->send_ctx[i].urb); - usb_free_urb (instance->send_ctx[i].urb); - instance->send_ctx[i].vcc->pop (instance->send_ctx[i].vcc, - instance->send_ctx[i].skb); - instance->send_ctx[i].skb = NULL; - } - } - - return 0; -} - -/**** send ******/ -static int udsl_usb_send_data (struct udsl_instance_data *instance, struct atm_vcc *vcc, - struct sk_buff *skb) -{ - int err, i; - struct urb *urb; - unsigned long flags; - - PDEBUG ("udsl_usb_send_data entered, sending packet %p with length %d\n", skb, skb->len); - - PACKETDEBUG (skb->data, skb->len); - - spin_lock_irqsave (&instance->sndqueue.lock, flags); - ((struct udsl_cb *) skb->cb)->vcc = vcc; - - /* we are already queueing */ - if (!skb_queue_empty (&instance->sndqueue)) { - __skb_queue_tail (&instance->sndqueue, skb); - spin_unlock_irqrestore (&instance->sndqueue.lock, flags); - PDEBUG ("udsl_usb_send_data: already queing, skb (0x%p) queued\n", skb); - return 0; - } - - for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) - if (instance->send_ctx[i].skb == NULL) - break; - - /* we must start queueing */ - if (i == UDSL_NUMBER_SND_URBS) { - __skb_queue_tail (&instance->sndqueue, skb); - spin_unlock_irqrestore (&instance->sndqueue.lock, flags); - PDEBUG ("udsl_usb_send_data: skb (0x%p) queued\n", skb); - return 0; - } - - /* init context */ - urb = instance->send_ctx[i].urb; - instance->send_ctx[i].skb = skb; - instance->send_ctx[i].vcc = vcc; - instance->send_ctx[i].instance = instance; - - spin_unlock_irqrestore (&instance->sndqueue.lock, flags); - - /* submit packet */ - usb_fill_bulk_urb (urb, - instance->usb_dev, - usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), - (unsigned char *) skb->data, - skb->len, - udsl_usb_send_data_complete, &(instance->send_ctx[i]) - ); - - err = usb_submit_urb (urb, GFP_KERNEL); - - if (err != 0) - skb_unlink (skb); - - PDEBUG ("udsl_usb_send_data done (retval = %d)\n", err); - return err; -} - - -/*************************************************************************** -* -* usb driver entries -* -****************************************************************************/ - static int udsl_usb_ioctl (struct usb_interface *intf, unsigned int code, void *user_data) { struct udsl_instance_data *instance = usb_get_intfdata (intf); @@ -752,7 +849,7 @@ instance->atm_dev->signal = ATM_PHY_SIG_FOUND; down (&instance->serialize); /* vs self */ if (!instance->firmware_loaded) { - usb_set_interface (instance->usb_dev, 1, 2); + usb_set_interface (instance->usb_dev, 1, 1); instance->firmware_loaded = 1; } up (&instance->serialize); @@ -773,7 +870,7 @@ struct udsl_instance_data *instance; unsigned char mac_str [13]; unsigned char mac [6]; - int i, err; + int i; PDEBUG ("Trying device with Vendor=0x%x, Product=0x%x, ifnum %d\n", dev->descriptor.idVendor, dev->descriptor.idProduct, ifnum); @@ -788,8 +885,7 @@ /* instance init */ if (!(instance = kmalloc (sizeof (struct udsl_instance_data), GFP_KERNEL))) { PDEBUG ("No memory for Instance data!\n"); - err = -ENOMEM; - goto fail_instance; + return -ENOMEM; } memset (instance, 0, sizeof (struct udsl_instance_data)); @@ -808,46 +904,63 @@ skb_queue_head_init (&instance->sndqueue); - /* receive urb init */ + spin_lock_init (&instance->send_lock); + INIT_LIST_HEAD (&instance->spare_senders); + INIT_LIST_HEAD (&instance->spare_buffers); + + tasklet_init (&instance->send_tasklet, udsl_process_send, (unsigned long) instance); + INIT_LIST_HEAD (&instance->filled_buffers); + + /* receive init */ for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { struct udsl_receiver *rcv = &(instance->all_receivers[i]); - if (!(rcv->skb = dev_alloc_skb (UDSL_RECEIVE_BUFFER_SIZE))) { + if (!(rcv->skb = dev_alloc_skb (UDSL_RCV_BUFFER_SIZE * ATM_CELL_SIZE))) { PDEBUG ("No memory for skb %d!\n", i); - err = -ENOMEM; - goto fail_urbs; + goto fail; } if (!(rcv->urb = usb_alloc_urb (0, GFP_KERNEL))) { PDEBUG ("No memory for receive urb %d!\n", i); - err = -ENOMEM; - goto fail_urbs; + goto fail; } rcv->instance = instance; list_add (&rcv->list, &instance->spare_receivers); - PDEBUG ("skb->truesize = %d (asked for %d)\n", rcv->skb->truesize, UDSL_RECEIVE_BUFFER_SIZE); + PDEBUG ("skb->truesize = %d (asked for %d)\n", rcv->skb->truesize, UDSL_RCV_BUFFER_SIZE * ATM_CELL_SIZE); } + /* send init */ for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) { - struct udsl_usb_send_data_context *snd = &(instance->send_ctx[i]); + struct udsl_sender *snd = &(instance->all_senders[i]); if (!(snd->urb = usb_alloc_urb (0, GFP_KERNEL))) { PDEBUG ("No memory for send urb %d!\n", i); - err = -ENOMEM; - goto fail_urbs; + goto fail; } snd->instance = instance; + + list_add (&snd->list, &instance->spare_senders); + } + + for (i = 0; i < UDSL_NUMBER_SND_BUFS; i++) { + struct udsl_send_buffer *buf = &(instance->all_buffers[i]); + + if (!(buf->base = kmalloc (UDSL_SND_BUFFER_SIZE * ATM_CELL_SIZE, GFP_KERNEL))) { + PDEBUG ("No memory for send buffer %d!\n", i); + goto fail; + } + + list_add (&buf->list, &instance->spare_buffers); } /* atm init */ if (!(instance->atm_dev = atm_dev_register (udsl_driver_name, &udsl_atm_devops, -1, 0))) { PDEBUG ("failed to register ATM device!\n"); - err = -ENOMEM; - goto fail_atm; + goto fail; } instance->atm_dev->ci_range.vpi_bits = ATM_CI_MAX; @@ -874,27 +987,25 @@ return 0; -fail_atm: -fail_urbs: - for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) { - struct udsl_usb_send_data_context *snd = &(instance->send_ctx[i]); +fail: + for (i = 0; i < UDSL_NUMBER_SND_BUFS; i++) + kfree (instance->all_buffers[i].base); - if (snd->urb) - usb_free_urb (snd->urb); - } + for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) + usb_free_urb (instance->all_senders[i].urb); for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { struct udsl_receiver *rcv = &(instance->all_receivers[i]); + usb_free_urb (rcv->urb); + if (rcv->skb) kfree_skb (rcv->skb); - - if (rcv->urb) - usb_free_urb (rcv->urb); } + kfree (instance); -fail_instance: - return err; + + return -ENOMEM; } static void udsl_usb_disconnect (struct usb_interface *intf) @@ -903,7 +1014,7 @@ struct list_head *pos; unsigned long flags; unsigned int count = 0; - int i; + int result, i; PDEBUG ("disconnecting\n"); @@ -916,8 +1027,9 @@ tasklet_disable (&instance->receive_tasklet); + /* receive finalize */ down (&instance->serialize); /* vs udsl_fire_receivers */ - /* no need to take the spinlock - receive_tasklet is not running */ + /* no need to take the spinlock */ list_for_each (pos, &instance->spare_receivers) if (++count > UDSL_NUMBER_RCV_URBS) panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__); @@ -929,7 +1041,8 @@ count = UDSL_NUMBER_RCV_URBS - count; for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) - usb_unlink_urb (instance->all_receivers[i].urb); + if ((result = usb_unlink_urb (instance->all_receivers[i].urb)) < 0) + PDEBUG ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d\n", i, result); /* wait for completion handlers to finish */ do { @@ -946,12 +1059,11 @@ if (completed == count) break; - /* not all urbs completed */ yield (); } while (1); - PDEBUG ("udsl_usb_disconnect: flushing %u completed receivers\n", count); - /* no need to take the spinlock - no completion handlers running */ + PDEBUG ("udsl_usb_disconnect: flushing\n"); + /* no need to take the spinlock */ INIT_LIST_HEAD (&instance->completed_receivers); tasklet_enable (&instance->receive_tasklet); @@ -965,25 +1077,48 @@ kfree_skb (rcv->skb); } - for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) { - struct udsl_usb_send_data_context *ctx = &(instance->send_ctx[i]); + /* send finalize */ + tasklet_disable (&instance->send_tasklet); - usb_unlink_urb (ctx->urb); + for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) + if ((result = usb_unlink_urb (instance->all_senders[i].urb)) < 0) + PDEBUG ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d\n", i, result); + + /* wait for completion handlers to finish */ + do { + count = 0; + spin_lock_irqsave (&instance->send_lock, flags); + list_for_each (pos, &instance->spare_senders) + if (++count > UDSL_NUMBER_SND_URBS) + panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__); + spin_unlock_irqrestore (&instance->send_lock, flags); - if (ctx->skb) - ctx->vcc->pop (ctx->vcc, ctx->skb); - ctx->skb = NULL; + PDEBUG ("udsl_usb_disconnect: found %u spare senders\n", count); - usb_free_urb (ctx->urb); + if (count == UDSL_NUMBER_SND_URBS) + break; - } + yield (); + } while (1); + PDEBUG ("udsl_usb_disconnect: flushing\n"); + /* no need to take the spinlock */ + INIT_LIST_HEAD (&instance->spare_senders); + INIT_LIST_HEAD (&instance->spare_buffers); + instance->current_buffer = NULL; - /* removing atm device */ - if (instance->atm_dev) - udsl_atm_stopdevice (instance); + tasklet_enable (&instance->send_tasklet); - kfree (instance); + PDEBUG ("udsl_usb_disconnect: freeing senders\n"); + for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) + usb_free_urb (instance->all_senders[i].urb); + + PDEBUG ("udsl_usb_disconnect: freeing buffers\n"); + for (i = 0; i < UDSL_NUMBER_SND_BUFS; i++) + kfree (instance->all_buffers[i].base); + + /* atm finalize */ + shutdown_atm_dev (instance->atm_dev); } @@ -995,7 +1130,14 @@ static int __init udsl_usb_init (void) { + struct sk_buff *skb; /* dummy for sizeof */ + PDEBUG ("udsl_usb_init: driver version " DRIVER_VERSION "\n"); + + if (sizeof (struct udsl_control) > sizeof (skb->cb)) { + printk (KERN_ERR __FILE__ ": unusable with this kernel!\n"); + return -EIO; + } return usb_register (&udsl_usb_driver); } diff -Nru a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c --- a/drivers/usb/net/kaweth.c Thu Feb 20 23:19:22 2003 +++ b/drivers/usb/net/kaweth.c Thu Feb 20 23:19:22 2003 @@ -130,6 +130,7 @@ { USB_DEVICE(0x03e8, 0x0008) }, /* AOX Endpoints USB Ethernet */ { USB_DEVICE(0x04bb, 0x0901) }, /* I-O DATA USB-ET/T */ { USB_DEVICE(0x0506, 0x03e8) }, /* 3Com 3C19250 */ + { USB_DEVICE(0x0506, 0x11f8) }, /* 3Com 3C460 */ { USB_DEVICE(0x0557, 0x2002) }, /* ATEN USB Ethernet */ { USB_DEVICE(0x0557, 0x4000) }, /* D-Link DSB-650C */ { USB_DEVICE(0x0565, 0x0002) }, /* Peracom Enet */ @@ -712,7 +713,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) { struct kaweth_device *kaweth = net->priv; - char *private_header; + u16 *private_header; int res; @@ -744,7 +745,7 @@ } private_header = __skb_push(skb, 2); - *private_header = cpu_to_le16(skb->len); + *private_header = cpu_to_le16(skb->len-2); kaweth->tx_skb = skb; usb_fill_bulk_urb(kaweth->tx_urb, diff -Nru a/drivers/usb/net/pegasus.h b/drivers/usb/net/pegasus.h --- a/drivers/usb/net/pegasus.h Thu Feb 20 23:19:24 2003 +++ b/drivers/usb/net/pegasus.h Thu Feb 20 23:19:24 2003 @@ -133,6 +133,7 @@ #define VENDOR_LANEED 0x056e #define VENDOR_LINKSYS 0x066b #define VENDOR_MELCO 0x0411 +#define VENDOR_MOBILITY 0x1342 #define VENDOR_NETGEAR 0x0846 #define VENDOR_SMARTBRIDGES 0x08d1 #define VENDOR_SMC 0x0707 @@ -167,7 +168,7 @@ PEGASUS_DEV( "Accton USB 10/100 Ethernet Adapter", VENDOR_ACCTON, 0x1046, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "SpeedStream USB 10/100 Ethernet", VENDOR_ACCTON, 0x5046, - DEFAULT_GPIO_RESET ) + DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "ADMtek ADM8511 \"Pegasus II\" USB Ethernet", VENDOR_ADMTEK, 0x8511, DEFAULT_GPIO_RESET | PEGASUS_II ) @@ -215,6 +216,8 @@ DEFAULT_GPIO_RESET ) PEGASUS_DEV( "GOLDPFEIL USB Adapter", VENDOR_ELCON, 0x0002, DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA ) +PEGASUS_DEV( "EasiDock Ethernet", VENDOR_MOBILITY, 0x0304, + DEFAULT_GPIO_RESET ) PEGASUS_DEV( "Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c, diff -Nru a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig --- a/drivers/usb/serial/Kconfig Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/serial/Kconfig Thu Feb 20 23:19:23 2003 @@ -297,10 +297,14 @@ config USB_SERIAL_KEYSPAN_USA19QW bool "USB Keyspan USA-19QW Firmware" depends on USB_SERIAL_KEYSPAN + help + Say Y here to include firmware for the USA-19QW converter. config USB_SERIAL_KEYSPAN_USA19QI bool "USB Keyspan USA-19QI Firmware" depends on USB_SERIAL_KEYSPAN + help + Say Y here to include firmware for the USA-19QI converter. config USB_SERIAL_KEYSPAN_USA49W bool "USB Keyspan USA-49W Firmware" diff -Nru a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c --- a/drivers/usb/serial/console.c Thu Feb 20 23:19:23 2003 +++ b/drivers/usb/serial/console.c Thu Feb 20 23:19:23 2003 @@ -141,7 +141,6 @@ } port = &serial->port[0]; - down (&port->sem); port->tty = NULL; info->port = port; @@ -158,8 +157,6 @@ port->open_count = 0; } - up (&port->sem); - if (retval) { err ("could not open USB console port"); return retval; @@ -208,8 +205,6 @@ if (count == 0) return; - down (&port->sem); - dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); if (!port->open_count) { @@ -224,7 +219,6 @@ retval = usb_serial_generic_write(port, 0, buf, count); exit: - up (&port->sem); dbg("%s - return value (if we had one): %d", __FUNCTION__, retval); } diff -Nru a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c --- a/drivers/usb/serial/usb-serial.c Thu Feb 20 23:19:21 2003 +++ b/drivers/usb/serial/usb-serial.c Thu Feb 20 23:19:21 2003 @@ -391,7 +391,11 @@ struct usb_serial *usb_serial_get_by_minor (unsigned int minor) { - return serial_table[minor]; + struct usb_serial *serial = serial_table[minor]; + + if (serial) + kobject_get (&serial->kobj); + return serial; } static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_ports, unsigned int *minor) @@ -468,7 +472,6 @@ port = &serial->port[portNumber]; tty->driver_data = port; - down (&port->sem); port->tty = tty; /* lock this module before we call it, @@ -492,8 +495,6 @@ } } bailout: - - up (&port->sem); return retval; } @@ -516,6 +517,7 @@ } module_put(port->serial->type->owner); + kobject_put(&port->serial->kobj); } static void serial_close(struct tty_struct *tty, struct file * filp) @@ -526,16 +528,12 @@ if (!serial) return; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); /* if disconnect beat us to the punch here, there's nothing to do */ if (tty->driver_data) { __serial_close(port, filp); } - - up (&port->sem); } static int serial_write (struct tty_struct * tty, int from_user, const unsigned char *buf, int count) @@ -547,8 +545,6 @@ if (!serial) return -ENODEV; - down (&port->sem); - dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); if (!port->open_count) { @@ -563,7 +559,6 @@ retval = usb_serial_generic_write(port, from_user, buf, count); exit: - up (&port->sem); return retval; } @@ -576,8 +571,6 @@ if (!serial) return -ENODEV; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -592,7 +585,6 @@ retval = usb_serial_generic_write_room(port); exit: - up (&port->sem); return retval; } @@ -605,8 +597,6 @@ if (!serial) return -ENODEV; - down (&port->sem); - dbg("%s = port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -621,7 +611,6 @@ retval = usb_serial_generic_chars_in_buffer(port); exit: - up (&port->sem); return retval; } @@ -633,8 +622,6 @@ if (!serial) return; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -647,7 +634,6 @@ serial->type->throttle(port); exit: - up (&port->sem); } static void serial_unthrottle (struct tty_struct * tty) @@ -658,8 +644,6 @@ if (!serial) return; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -672,7 +656,6 @@ serial->type->unthrottle(port); exit: - up (&port->sem); } static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) @@ -684,8 +667,6 @@ if (!serial) return -ENODEV; - down (&port->sem); - dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd); if (!port->open_count) { @@ -700,7 +681,6 @@ retval = -ENOIOCTLCMD; exit: - up (&port->sem); return retval; } @@ -712,8 +692,6 @@ if (!serial) return; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -726,7 +704,6 @@ serial->type->set_termios(port, old); exit: - up (&port->sem); } static void serial_break (struct tty_struct *tty, int break_state) @@ -737,8 +714,6 @@ if (!serial) return; - down (&port->sem); - dbg("%s - port %d", __FUNCTION__, port->number); if (!port->open_count) { @@ -751,7 +726,6 @@ serial->type->break_ctl(port, break_state); exit: - up (&port->sem); } static void serial_shutdown (struct usb_serial *serial) @@ -797,6 +771,7 @@ begin += length; length = 0; } + kobject_put(&serial->kobj); } *eof = 1; done: @@ -833,6 +808,75 @@ wake_up_interruptible(&tty->write_wait); } +static void destroy_serial (struct kobject *kobj) +{ + struct usb_serial *serial; + struct usb_serial_port *port; + int i; + + dbg ("%s", __FUNCTION__); + + serial = to_usb_serial(kobj); + + /* fail all future close/read/write/ioctl/etc calls */ + for (i = 0; i < serial->num_ports; ++i) { + port = &serial->port[i]; + if (port->tty != NULL) { + port->tty->driver_data = NULL; + while (port->open_count > 0) { + __serial_close(port, NULL); + } + } + } + + serial_shutdown (serial); + + for (i = 0; i < serial->num_ports; ++i) + device_unregister(&serial->port[i].dev); + + for (i = 0; i < serial->num_ports; ++i) + serial->port[i].open_count = 0; + + for (i = 0; i < serial->num_bulk_in; ++i) { + port = &serial->port[i]; + if (port->read_urb) { + usb_unlink_urb (port->read_urb); + usb_free_urb (port->read_urb); + } + if (port->bulk_in_buffer) + kfree (port->bulk_in_buffer); + } + for (i = 0; i < serial->num_bulk_out; ++i) { + port = &serial->port[i]; + if (port->write_urb) { + usb_unlink_urb (port->write_urb); + usb_free_urb (port->write_urb); + } + if (port->bulk_out_buffer) + kfree (port->bulk_out_buffer); + } + for (i = 0; i < serial->num_interrupt_in; ++i) { + port = &serial->port[i]; + if (port->interrupt_in_urb) { + usb_unlink_urb (port->interrupt_in_urb); + usb_free_urb (port->interrupt_in_urb); + } + if (port->interrupt_in_buffer) + kfree (port->interrupt_in_buffer); + } + /* return the minor range that this device had */ + return_serial (serial); + + usb_put_dev(serial->dev); + + /* free up any memory that we allocated */ + kfree (serial); +} + +static struct kobj_type usb_serial_kobj_type = { + .release = destroy_serial, +}; + static struct usb_serial * create_serial (struct usb_device *dev, struct usb_interface *interface, struct usb_serial_device_type *type) @@ -845,12 +889,16 @@ return NULL; } memset (serial, 0, sizeof(*serial)); - serial->dev = dev; + serial->dev = usb_get_dev(dev); serial->type = type; serial->interface = interface; serial->vendor = dev->descriptor.idVendor; serial->product = dev->descriptor.idProduct; + /* initialize the kobject portion of the usb_device */ + kobject_init(&serial->kobj); + serial->kobj.ktype = &usb_serial_kobj_type; + return serial; } @@ -1113,7 +1161,6 @@ port->serial = serial; port->magic = USB_SERIAL_PORT_MAGIC; INIT_WORK(&port->work, usb_serial_port_softint, port); - init_MUTEX (&port->sem); } /* if this device type has an attach function, call it */ @@ -1189,67 +1236,14 @@ { struct usb_serial *serial = usb_get_intfdata (interface); struct device *dev = &interface->dev; - struct usb_serial_port *port; - int i; dbg ("%s", __FUNCTION__); usb_set_intfdata (interface, NULL); if (serial) { - /* fail all future close/read/write/ioctl/etc calls */ - for (i = 0; i < serial->num_ports; ++i) { - port = &serial->port[i]; - down (&port->sem); - if (port->tty != NULL) { - port->tty->driver_data = NULL; - while (port->open_count > 0) { - __serial_close(port, NULL); - } - } - up (&port->sem); - } - - serial->dev = NULL; - serial_shutdown (serial); - - for (i = 0; i < serial->num_ports; ++i) - device_unregister(&serial->port[i].dev); - - for (i = 0; i < serial->num_ports; ++i) - serial->port[i].open_count = 0; - - for (i = 0; i < serial->num_bulk_in; ++i) { - port = &serial->port[i]; - if (port->read_urb) { - usb_unlink_urb (port->read_urb); - usb_free_urb (port->read_urb); - } - if (port->bulk_in_buffer) - kfree (port->bulk_in_buffer); - } - for (i = 0; i < serial->num_bulk_out; ++i) { - port = &serial->port[i]; - if (port->write_urb) { - usb_unlink_urb (port->write_urb); - usb_free_urb (port->write_urb); - } - if (port->bulk_out_buffer) - kfree (port->bulk_out_buffer); - } - for (i = 0; i < serial->num_interrupt_in; ++i) { - port = &serial->port[i]; - if (port->interrupt_in_urb) { - usb_unlink_urb (port->interrupt_in_urb); - usb_free_urb (port->interrupt_in_urb); - } - if (port->interrupt_in_buffer) - kfree (port->interrupt_in_buffer); - } - /* return the minor range that this device had */ - return_serial (serial); - - /* free up any memory that we allocated */ - kfree (serial); + /* let the last holder of this object + * cause it to be cleaned up */ + kobject_put (&serial->kobj); } dev_info(dev, "device disconnected\n"); } diff -Nru a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h --- a/drivers/usb/serial/usb-serial.h Thu Feb 20 23:19:24 2003 +++ b/drivers/usb/serial/usb-serial.h Thu Feb 20 23:19:24 2003 @@ -89,7 +89,6 @@ * @write_wait: a wait_queue_head_t used by the port. * @work: work queue entry for the line discipline waking up. * @open_count: number of times this port has been opened. - * @sem: struct semaphore used to lock this structure. * * This structure is used by the usb-serial core and drivers for the specific * ports of a device. @@ -116,7 +115,6 @@ wait_queue_head_t write_wait; struct work_struct work; int open_count; - struct semaphore sem; struct device dev; }; #define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev) @@ -164,8 +162,10 @@ __u16 vendor; __u16 product; struct usb_serial_port port[MAX_NUM_PORTS]; + struct kobject kobj; void * private; }; +#define to_usb_serial(d) container_of(d, struct usb_serial, kobj) #define NUM_DONT_CARE (-1) diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c --- a/drivers/usb/storage/transport.c Thu Feb 20 23:19:21 2003 +++ b/drivers/usb/storage/transport.c Thu Feb 20 23:19:21 2003 @@ -314,7 +314,7 @@ return USB_STOR_XFER_ERROR; /* the transfer was cancelled, presumably by an abort */ - case -ENODEV: + case -ECONNRESET: US_DEBUGP("-- transfer cancelled\n"); return USB_STOR_XFER_ERROR; diff -Nru a/drivers/video/Kconfig b/drivers/video/Kconfig --- a/drivers/video/Kconfig Thu Feb 20 23:19:19 2003 +++ b/drivers/video/Kconfig Thu Feb 20 23:19:19 2003 @@ -363,7 +363,7 @@ config FB_SGIVW tristate "SGI Visual Workstation framebuffer support" - depends on FB && VISWS + depends on FB && X86_VISWS help SGI Visual Workstation support for framebuffer graphics. diff -Nru a/drivers/video/fm2fb.c b/drivers/video/fm2fb.c --- a/drivers/video/fm2fb.c Thu Feb 20 23:19:21 2003 +++ b/drivers/video/fm2fb.c Thu Feb 20 23:19:21 2003 @@ -267,7 +267,7 @@ fb_info.fix = fb_fix; fb_info.flags = FBINFO_FLAG_DEFAULT; - /* The below feilds will go away !!!! */ + /* The below fields will go away !!!! */ fb_alloc_cmap(&fb_info.cmap, 16, 0); if (register_framebuffer(&fb_info) < 0) diff -Nru a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c --- a/drivers/video/pm3fb.c Thu Feb 20 23:19:20 2003 +++ b/drivers/video/pm3fb.c Thu Feb 20 23:19:20 2003 @@ -2325,7 +2325,7 @@ PM3_WRITE_REG(PM3ForegroundColor, fgx); PM3_WRITE_REG(PM3FillBackgroundColor, bgx); - /* WARNING : adress select X need to specify 8 bits for fontwidth <= 8 */ + /* WARNING : address select X need to specify 8 bits for fontwidth <= 8 */ /* and 16 bits for fontwidth <= 16 */ /* same in _putcs, same for Y and fontheight */ if (fontwidth(p) <= 8) @@ -2438,7 +2438,7 @@ PM3_WRITE_REG(PM3ForegroundColor, fgx); PM3_WRITE_REG(PM3FillBackgroundColor, bgx); - /* WARNING : adress select X need to specify 8 bits for fontwidth <= 8 */ + /* WARNING : address select X need to specify 8 bits for fontwidth <= 8 */ /* and 16 bits for fontwidth <= 16 */ /* same in _putc, same for Y and fontheight */ if (fontwidth(p) <= 8) diff -Nru a/drivers/video/q40fb.c b/drivers/video/q40fb.c --- a/drivers/video/q40fb.c Thu Feb 20 23:19:20 2003 +++ b/drivers/video/q40fb.c Thu Feb 20 23:19:20 2003 @@ -111,7 +111,7 @@ fb_info.pseudo_palette = pseudo_palette; fb_info.screen_base = (char *) q40fb_fix.smem_start; - /* The below feilds will go away !!!! */ + /* The below fields will go away !!!! */ fb_alloc_cmap(&fb_info.cmap, 16, 0); master_outb(3, DISPLAY_CONTROL_REG); diff -Nru a/drivers/video/sgivwfb.c b/drivers/video/sgivwfb.c --- a/drivers/video/sgivwfb.c Thu Feb 20 23:19:21 2003 +++ b/drivers/video/sgivwfb.c Thu Feb 20 23:19:21 2003 @@ -13,14 +13,7 @@ #include #include #include -#include -#include -#include -#include -#include #include -#include -#include #include #include #include @@ -29,7 +22,7 @@ #define INCLUDE_TIMING_TABLE_DATA #define DBE_REG_BASE default_par.regs -#include +#include