aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/feature-removal-schedule.txt9
-rw-r--r--Documentation/filesystems/ntfs.txt12
-rw-r--r--Documentation/input/yealink.txt203
-rw-r--r--MAINTAINERS13
-rw-r--r--arch/alpha/kernel/sys_marvel.c5
-rw-r--r--arch/arm/common/locomo.c101
-rw-r--r--arch/arm/configs/s3c2410_defconfig218
-rw-r--r--arch/arm/mach-clps7500/core.c2
-rw-r--r--arch/arm/mach-ebsa110/core.c2
-rw-r--r--arch/arm/mach-epxa10db/arch.c2
-rw-r--r--arch/arm/mach-footbridge/isa.c2
-rw-r--r--arch/arm/mach-h720x/cpu-h7202.c2
-rw-r--r--arch/arm/mach-ixp2000/core.c2
-rw-r--r--arch/arm/mach-ixp4xx/coyote-setup.c2
-rw-r--r--arch/arm/mach-ixp4xx/gtwx5715-setup.c2
-rw-r--r--arch/arm/mach-ixp4xx/ixdp425-setup.c2
-rw-r--r--arch/arm/mach-omap1/Kconfig8
-rw-r--r--arch/arm/mach-omap1/Makefile3
-rw-r--r--arch/arm/mach-omap1/board-generic.c38
-rw-r--r--arch/arm/mach-omap1/board-h2.c27
-rw-r--r--arch/arm/mach-omap1/board-h3.c17
-rw-r--r--arch/arm/mach-omap1/board-innovator.c13
-rw-r--r--arch/arm/mach-omap1/board-netstar.c9
-rw-r--r--arch/arm/mach-omap1/board-osk.c124
-rw-r--r--arch/arm/mach-omap1/board-perseus2.c5
-rw-r--r--arch/arm/mach-omap1/board-voiceblue.c64
-rw-r--r--arch/arm/mach-omap1/devices.c351
-rw-r--r--arch/arm/mach-omap1/fpga.c4
-rw-r--r--arch/arm/mach-omap1/io.c30
-rw-r--r--arch/arm/mach-omap1/irq.c2
-rw-r--r--arch/arm/mach-omap1/leds-h2p2-debug.c3
-rw-r--r--arch/arm/mach-omap1/leds-innovator.c2
-rw-r--r--arch/arm/mach-omap1/leds-osk.c8
-rw-r--r--arch/arm/mach-omap1/leds.c12
-rw-r--r--arch/arm/mach-omap1/serial.c86
-rw-r--r--arch/arm/mach-omap1/time.c40
-rw-r--r--arch/arm/mach-rpc/riscpc.c2
-rw-r--r--arch/arm/mach-s3c2410/mach-bast.c2
-rw-r--r--arch/arm/mach-s3c2410/mach-vr1000.c2
-rw-r--r--arch/arm/mach-shark/core.c2
-rw-r--r--arch/arm/mm/flush.c52
-rw-r--r--arch/i386/kernel/cpu/cpufreq/longhaul.c4
-rw-r--r--arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c20
-rw-r--r--arch/i386/kernel/cpu/cpufreq/speedstep-smi.c2
-rw-r--r--arch/i386/kernel/io_apic.c4
-rw-r--r--arch/i386/kernel/sigframe.h8
-rw-r--r--arch/i386/pci/i386.c6
-rw-r--r--arch/ia64/Kconfig6
-rw-r--r--arch/ia64/configs/sn2_defconfig1
-rw-r--r--arch/ia64/configs/tiger_defconfig1
-rw-r--r--arch/ia64/configs/zx1_defconfig1
-rw-r--r--arch/ia64/defconfig3
-rw-r--r--arch/ia64/kernel/acpi.c2
-rw-r--r--arch/ia64/kernel/entry.S6
-rw-r--r--arch/ia64/kernel/iosapic.c2
-rw-r--r--arch/ia64/lib/memcpy_mck.S3
-rw-r--r--arch/ia64/mm/fault.c6
-rw-r--r--arch/ia64/pci/pci.c2
-rw-r--r--arch/ia64/sn/kernel/setup.c2
-rw-r--r--arch/ia64/sn/kernel/xpc_main.c4
-rw-r--r--arch/ia64/sn/kernel/xpnet.c4
-rw-r--r--arch/m68knommu/platform/523x/Makefile19
-rw-r--r--arch/m68knommu/platform/5272/config.c6
-rw-r--r--arch/m68knommu/platform/5307/Makefile1
-rw-r--r--arch/m68knommu/platform/68328/config.c94
-rw-r--r--arch/m68knommu/platform/68328/timers.c106
-rw-r--r--arch/m68knommu/platform/68EZ328/config.c80
-rw-r--r--arch/m68knommu/platform/68VZ328/config.c (renamed from arch/m68knommu/platform/68VZ328/de2/config.c)141
-rw-r--r--arch/m68knommu/platform/68VZ328/ucdimm/config.c117
-rw-r--r--arch/ppc/kernel/pci.c1
-rw-r--r--arch/ppc/kernel/syscalls.c4
-rw-r--r--arch/ppc/syslib/mpc10x_common.c4
-rw-r--r--arch/ppc/syslib/mpc83xx_devices.c2
-rw-r--r--arch/ppc/syslib/mpc85xx_devices.c2
-rw-r--r--arch/ppc64/Makefile21
-rw-r--r--arch/ppc64/boot/Makefile53
-rw-r--r--arch/ppc64/boot/main.c31
-rw-r--r--arch/ppc64/kernel/bpa_iic.c28
-rw-r--r--arch/ppc64/kernel/eeh.c86
-rw-r--r--arch/ppc64/kernel/iSeries_VpdInfo.c5
-rw-r--r--arch/ppc64/kernel/iomap.c32
-rw-r--r--arch/ppc64/kernel/iommu.c3
-rw-r--r--arch/ppc64/kernel/maple_pci.c4
-rw-r--r--arch/ppc64/kernel/misc.S6
-rw-r--r--arch/ppc64/kernel/pSeries_iommu.c72
-rw-r--r--arch/ppc64/kernel/pci.c67
-rw-r--r--arch/ppc64/kernel/pci.h1
-rw-r--r--arch/ppc64/kernel/pci_dn.c47
-rw-r--r--arch/ppc64/kernel/pci_iommu.c2
-rw-r--r--arch/ppc64/kernel/pmac_feature.c8
-rw-r--r--arch/ppc64/kernel/pmac_pci.c6
-rw-r--r--arch/ppc64/kernel/prom.c1
-rw-r--r--arch/ppc64/kernel/rtas_pci.c39
-rw-r--r--arch/ppc64/kernel/setup.c2
-rw-r--r--arch/ppc64/kernel/sys_ppc32.c55
-rw-r--r--arch/ppc64/kernel/syscalls.c4
-rw-r--r--arch/ppc64/kernel/u3_iommu.c4
-rw-r--r--arch/ppc64/kernel/udbg.c6
-rw-r--r--arch/ppc64/mm/init.c4
-rw-r--r--arch/s390/Makefile2
-rw-r--r--arch/sparc64/kernel/pci.c127
-rw-r--r--arch/sparc64/kernel/pci_psycho.c34
-rw-r--r--arch/sparc64/kernel/pci_sabre.c36
-rw-r--r--arch/sparc64/kernel/pci_schizo.c48
-rw-r--r--arch/sparc64/kernel/sparc64_ksyms.c9
-rw-r--r--arch/sparc64/lib/Makefile2
-rw-r--r--arch/sparc64/lib/mb.S73
-rw-r--r--arch/um/Makefile-x86_641
-rw-r--r--arch/um/kernel/skas/include/uaccess-skas.h14
-rw-r--r--arch/um/kernel/tt/include/uaccess-tt.h14
-rw-r--r--arch/um/scripts/Makefile.rules5
-rw-r--r--arch/x86_64/kernel/io_apic.c4
-rw-r--r--drivers/acpi/Kconfig3
-rw-r--r--drivers/block/ub.c273
-rw-r--r--drivers/char/Kconfig4
-rw-r--r--drivers/char/agp/amd64-agp.c2
-rw-r--r--drivers/char/agp/generic.c33
-rw-r--r--drivers/char/drm/drmP.h4
-rw-r--r--drivers/char/ip2main.c1
-rw-r--r--drivers/char/synclinkmp.c1
-rw-r--r--drivers/cpufreq/cpufreq.c6
-rw-r--r--drivers/i2c/busses/Kconfig16
-rw-r--r--drivers/i2c/busses/Makefile1
-rw-r--r--drivers/i2c/busses/i2c-pxa.c1022
-rw-r--r--drivers/infiniband/hw/mthca/mthca_main.c8
-rw-r--r--drivers/infiniband/hw/mthca/mthca_reset.c8
-rw-r--r--drivers/mmc/mmc.c12
-rw-r--r--drivers/mmc/mmci.c2
-rw-r--r--drivers/mmc/pxamci.c4
-rw-r--r--drivers/mmc/wbsd.c4
-rw-r--r--drivers/net/bnx2.c7
-rw-r--r--drivers/net/bnx2.h1
-rw-r--r--drivers/net/irda/irda-usb.c13
-rw-r--r--drivers/net/irda/vlsi_ir.h6
-rw-r--r--drivers/parport/parport_pc.c2
-rw-r--r--drivers/pci/Kconfig17
-rw-r--r--drivers/pci/Makefile22
-rw-r--r--drivers/pci/bus.c51
-rw-r--r--drivers/pci/gen-devlist.c132
-rw-r--r--drivers/pci/hotplug/Makefile3
-rw-r--r--drivers/pci/hotplug/pciehp.h2
-rw-r--r--drivers/pci/hotplug/rpadlpar_core.c299
-rw-r--r--drivers/pci/hotplug/rpaphp.h35
-rw-r--r--drivers/pci/hotplug/rpaphp_core.c146
-rw-r--r--drivers/pci/hotplug/rpaphp_pci.c299
-rw-r--r--drivers/pci/hotplug/rpaphp_slot.c66
-rw-r--r--drivers/pci/hotplug/rpaphp_vio.c129
-rw-r--r--drivers/pci/hotplug/sgi_hotplug.c195
-rw-r--r--drivers/pci/hotplug/shpchp.h2
-rw-r--r--drivers/pci/msi.c10
-rw-r--r--drivers/pci/names.c137
-rw-r--r--drivers/pci/pci-driver.c37
-rw-r--r--drivers/pci/pci.c104
-rw-r--r--drivers/pci/pci.ids10180
-rw-r--r--drivers/pci/pcie/portdrv_pci.c8
-rw-r--r--drivers/pci/probe.c4
-rw-r--r--drivers/pci/proc.c12
-rw-r--r--drivers/pci/quirks.c7
-rw-r--r--drivers/pci/setup-res.c7
-rw-r--r--drivers/scsi/ahci.c16
-rw-r--r--drivers/scsi/ata_piix.c14
-rw-r--r--drivers/scsi/sata_mv.c16
-rw-r--r--drivers/scsi/sata_sis.c34
-rw-r--r--drivers/scsi/sata_uli.c14
-rw-r--r--drivers/serial/8250.c2
-rw-r--r--drivers/serial/8250_accent.c2
-rw-r--r--drivers/serial/8250_boca.c2
-rw-r--r--drivers/serial/8250_fourport.c2
-rw-r--r--drivers/serial/8250_hub6.c2
-rw-r--r--drivers/serial/8250_mca.c2
-rw-r--r--drivers/usb/atm/cxacru.c2
-rw-r--r--drivers/usb/class/Kconfig21
-rw-r--r--drivers/usb/class/usblp.c9
-rw-r--r--drivers/usb/core/Makefile4
-rw-r--r--drivers/usb/core/devio.c102
-rw-r--r--drivers/usb/core/hcd-pci.c28
-rw-r--r--drivers/usb/core/hcd.h8
-rw-r--r--drivers/usb/core/hub.c115
-rw-r--r--drivers/usb/core/hub.h7
-rw-r--r--drivers/usb/core/inode.c9
-rw-r--r--drivers/usb/core/message.c8
-rw-r--r--drivers/usb/core/urb.c26
-rw-r--r--drivers/usb/core/usb.c35
-rw-r--r--drivers/usb/core/usb.h5
-rw-r--r--drivers/usb/gadget/ether.c33
-rw-r--r--drivers/usb/gadget/file_storage.c33
-rw-r--r--drivers/usb/gadget/gadget_chips.h55
-rw-r--r--drivers/usb/gadget/serial.c51
-rw-r--r--drivers/usb/gadget/zero.c48
-rw-r--r--drivers/usb/host/ehci-hcd.c4
-rw-r--r--drivers/usb/host/ehci-q.c7
-rw-r--r--drivers/usb/host/ehci-sched.c4
-rw-r--r--drivers/usb/host/ehci.h2
-rw-r--r--drivers/usb/host/isp116x-hcd.c88
-rw-r--r--drivers/usb/host/ohci-ppc-soc.c24
-rw-r--r--drivers/usb/host/ohci-s3c2410.c4
-rw-r--r--drivers/usb/input/Kconfig14
-rw-r--r--drivers/usb/input/Makefile1
-rw-r--r--drivers/usb/input/hid-core.c9
-rw-r--r--drivers/usb/input/keyspan_remote.c5
-rw-r--r--drivers/usb/input/map_to_7segment.h189
-rw-r--r--drivers/usb/input/yealink.c1013
-rw-r--r--drivers/usb/input/yealink.h220
-rw-r--r--drivers/usb/misc/auerswald.c3
-rw-r--r--drivers/usb/misc/ldusb.c6
-rw-r--r--drivers/usb/misc/sisusbvga/sisusb.c4
-rw-r--r--drivers/usb/misc/usbtest.c2
-rw-r--r--drivers/usb/mon/Makefile2
-rw-r--r--drivers/usb/mon/mon_dma.c55
-rw-r--r--drivers/usb/mon/mon_text.c35
-rw-r--r--drivers/usb/mon/usb_mon.h4
-rw-r--r--drivers/usb/net/Kconfig208
-rw-r--r--drivers/usb/net/Makefile8
-rw-r--r--drivers/usb/net/asix.c948
-rw-r--r--drivers/usb/net/catc.c2
-rw-r--r--drivers/usb/net/cdc_ether.c509
-rw-r--r--drivers/usb/net/cdc_subset.c335
-rw-r--r--drivers/usb/net/gl620a.c407
-rw-r--r--drivers/usb/net/kaweth.c1
-rw-r--r--drivers/usb/net/net1080.c622
-rw-r--r--drivers/usb/net/pegasus.c1
-rw-r--r--drivers/usb/net/plusb.c156
-rw-r--r--drivers/usb/net/rndis_host.c615
-rw-r--r--drivers/usb/net/rtl8150.c1
-rw-r--r--drivers/usb/net/usbnet.c3226
-rw-r--r--drivers/usb/net/usbnet.h193
-rw-r--r--drivers/usb/net/zaurus.c386
-rw-r--r--drivers/usb/net/zd1201.c1
-rw-r--r--drivers/usb/serial/cypress_m8.c251
-rw-r--r--drivers/usb/serial/ftdi_sio.c56
-rw-r--r--drivers/usb/serial/ftdi_sio.h54
-rw-r--r--drivers/usb/serial/keyspan.c8
-rw-r--r--drivers/usb/serial/option.c203
-rw-r--r--drivers/usb/serial/pl2303.c6
-rw-r--r--drivers/usb/serial/usb-serial.c24
-rw-r--r--drivers/usb/storage/Kconfig12
-rw-r--r--drivers/usb/storage/Makefile1
-rw-r--r--drivers/usb/storage/onetouch.c210
-rw-r--r--drivers/usb/storage/onetouch.h9
-rw-r--r--drivers/usb/storage/scsiglue.c8
-rw-r--r--drivers/usb/storage/shuttle_usbat.c97
-rw-r--r--drivers/usb/storage/transport.c17
-rw-r--r--drivers/usb/storage/unusual_devs.h19
-rw-r--r--drivers/usb/storage/usb.c79
-rw-r--r--drivers/usb/storage/usb.h1
-rw-r--r--drivers/video/nvidia/nvidia.c4
-rw-r--r--drivers/video/offb.c2
-rw-r--r--drivers/video/riva/fbdev.c4
-rw-r--r--fs/bio.c2
-rw-r--r--fs/ntfs/ChangeLog70
-rw-r--r--fs/ntfs/Makefile2
-rw-r--r--fs/ntfs/aops.c293
-rw-r--r--fs/ntfs/attrib.c125
-rw-r--r--fs/ntfs/attrib.h2
-rw-r--r--fs/ntfs/compress.c8
-rw-r--r--fs/ntfs/dir.c3
-rw-r--r--fs/ntfs/file.c9
-rw-r--r--fs/ntfs/index.c1
-rw-r--r--fs/ntfs/inode.c227
-rw-r--r--fs/ntfs/lcnalloc.c39
-rw-r--r--fs/ntfs/lcnalloc.h21
-rw-r--r--fs/ntfs/logfile.c251
-rw-r--r--fs/ntfs/logfile.h8
-rw-r--r--fs/ntfs/malloc.h48
-rw-r--r--fs/ntfs/mft.c4
-rw-r--r--fs/ntfs/runlist.c374
-rw-r--r--fs/ntfs/runlist.h3
-rw-r--r--fs/ntfs/super.c16
-rw-r--r--fs/ntfs/unistr.c3
-rw-r--r--fs/xfs/Makefile-linux-2.615
-rw-r--r--include/asm-alpha/pci.h13
-rw-r--r--include/asm-arm/arch-pxa/hardware.h18
-rw-r--r--include/asm-arm/arch-pxa/i2c.h70
-rw-r--r--include/asm-arm/arch-pxa/mmc.h1
-rw-r--r--include/asm-arm/arch-sa1100/hardware.h18
-rw-r--r--include/asm-arm/cacheflush.h7
-rw-r--r--include/asm-arm/pci.h13
-rw-r--r--include/asm-generic/pci.h13
-rw-r--r--include/asm-ia64/iosapic.h4
-rw-r--r--include/asm-ia64/irq.h4
-rw-r--r--include/asm-ia64/pci.h13
-rw-r--r--include/asm-m68knommu/coldfire.h6
-rw-r--r--include/asm-m68knommu/m523xsim.h46
-rw-r--r--include/asm-m68knommu/mcfsim.h6
-rw-r--r--include/asm-m68knommu/mcfuart.h2
-rw-r--r--include/asm-parisc/pci.h13
-rw-r--r--include/asm-powerpc/8253pit.h8
-rw-r--r--include/asm-powerpc/agp.h8
-rw-r--r--include/asm-powerpc/bugs.h8
-rw-r--r--include/asm-powerpc/errno.h6
-rw-r--r--include/asm-powerpc/ioctl.h6
-rw-r--r--include/asm-powerpc/ioctls.h6
-rw-r--r--include/asm-powerpc/linkage.h6
-rw-r--r--include/asm-powerpc/mc146818rtc.h6
-rw-r--r--include/asm-powerpc/mman.h6
-rw-r--r--include/asm-powerpc/module.h6
-rw-r--r--include/asm-powerpc/msgbuf.h (renamed from include/asm-ppc/msgbuf.h)16
-rw-r--r--include/asm-powerpc/namei.h14
-rw-r--r--include/asm-powerpc/param.h (renamed from include/asm-ppc/param.h)8
-rw-r--r--include/asm-powerpc/poll.h6
-rw-r--r--include/asm-powerpc/sembuf.h6
-rw-r--r--include/asm-powerpc/setup.h9
-rw-r--r--include/asm-powerpc/shmbuf.h14
-rw-r--r--include/asm-powerpc/shmparam.h6
-rw-r--r--include/asm-powerpc/siginfo.h6
-rw-r--r--include/asm-powerpc/socket.h6
-rw-r--r--include/asm-powerpc/sockios.h6
-rw-r--r--include/asm-powerpc/string.h6
-rw-r--r--include/asm-powerpc/termbits.h6
-rw-r--r--include/asm-powerpc/termios.h6
-rw-r--r--include/asm-powerpc/timex.h (renamed from include/asm-ppc/timex.h)37
-rw-r--r--include/asm-powerpc/topology.h (renamed from include/asm-ppc64/topology.h)9
-rw-r--r--include/asm-powerpc/unaligned.h9
-rw-r--r--include/asm-powerpc/user.h (renamed from include/asm-ppc/user.h)15
-rw-r--r--include/asm-ppc/pci.h13
-rw-r--r--include/asm-ppc/setup.h14
-rw-r--r--include/asm-ppc/topology.h6
-rw-r--r--include/asm-ppc64/eeh.h39
-rw-r--r--include/asm-ppc64/io.h42
-rw-r--r--include/asm-ppc64/msgbuf.h27
-rw-r--r--include/asm-ppc64/param.h31
-rw-r--r--include/asm-ppc64/pci-bridge.h45
-rw-r--r--include/asm-ppc64/pci.h13
-rw-r--r--include/asm-ppc64/prom.h19
-rw-r--r--include/asm-ppc64/segment.h6
-rw-r--r--include/asm-ppc64/setup.h6
-rw-r--r--include/asm-ppc64/timex.h26
-rw-r--r--include/asm-ppc64/user.h58
-rw-r--r--include/asm-sparc64/pci.h2
-rw-r--r--include/asm-sparc64/system.h49
-rw-r--r--include/linux/i2c-pxa.h48
-rw-r--r--include/linux/in6.h36
-rw-r--r--include/linux/ipv6.h15
-rw-r--r--include/linux/mempolicy.h1
-rw-r--r--include/linux/mmc/host.h10
-rw-r--r--include/linux/pci.h511
-rw-r--r--include/linux/pci_regs.h448
-rw-r--r--include/linux/serial_8250.h15
-rw-r--r--include/linux/serial_core.h3
-rw-r--r--include/linux/skbuff.h2
-rw-r--r--include/linux/usb.h11
-rw-r--r--include/linux/usb_isp116x.h30
-rw-r--r--include/net/ax25.h2
-rw-r--r--include/net/compat.h5
-rw-r--r--include/net/ipv6.h5
-rw-r--r--include/net/transp_v6.h2
-rw-r--r--mm/mempolicy.c2
-rw-r--r--net/ax25/ax25_addr.c27
-rw-r--r--net/ieee80211/Kconfig1
-rw-r--r--net/ipv4/netfilter/ip_conntrack_netbios_ns.c24
-rw-r--r--net/ipv4/netfilter/ipt_REJECT.c5
-rw-r--r--net/ipv4/route.c29
-rw-r--r--net/ipv4/tcp_output.c2
-rw-r--r--net/ipv4/udp.c2
-rw-r--r--net/ipv6/datagram.c139
-rw-r--r--net/ipv6/exthdrs.c116
-rw-r--r--net/ipv6/icmp.c20
-rw-r--r--net/ipv6/ip6_flowlabel.c14
-rw-r--r--net/ipv6/ip6_output.c24
-rw-r--r--net/ipv6/ip6_tunnel.c7
-rw-r--r--net/ipv6/ipv6_sockglue.c186
-rw-r--r--net/ipv6/ndisc.c16
-rw-r--r--net/ipv6/netfilter/ip6t_REJECT.c5
-rw-r--r--net/ipv6/raw.c21
-rw-r--r--net/ipv6/reassembly.c9
-rw-r--r--net/ipv6/tcp_ipv6.c36
-rw-r--r--net/ipv6/udp.c25
-rw-r--r--net/rose/rose_subr.c4
-rw-r--r--net/xfrm/xfrm_policy.c8
-rw-r--r--sound/usb/usbaudio.c10
370 files changed, 13686 insertions, 18134 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index 2e0a01b21fe0..5f95d4b3cab1 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -25,15 +25,6 @@ Who: Pavel Machek <pavel@suse.cz>
25 25
26--------------------------- 26---------------------------
27 27
28What: PCI Name Database (CONFIG_PCI_NAMES)
29When: July 2005
30Why: It bloats the kernel unnecessarily, and is handled by userspace better
31 (pciutils supports it.) Will eliminate the need to try to keep the
32 pci.ids file in sync with the sf.net database all of the time.
33Who: Greg Kroah-Hartman <gregkh@suse.de>
34
35---------------------------
36
37What: io_remap_page_range() (macro or function) 28What: io_remap_page_range() (macro or function)
38When: September 2005 29When: September 2005
39Why: Replaced by io_remap_pfn_range() which allows more memory space 30Why: Replaced by io_remap_pfn_range() which allows more memory space
diff --git a/Documentation/filesystems/ntfs.txt b/Documentation/filesystems/ntfs.txt
index eef4aca0c753..a5fbc8e897fa 100644
--- a/Documentation/filesystems/ntfs.txt
+++ b/Documentation/filesystems/ntfs.txt
@@ -439,6 +439,18 @@ ChangeLog
439 439
440Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. 440Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
441 441
4422.1.24:
443 - Support journals ($LogFile) which have been modified by chkdsk. This
444 means users can boot into Windows after we marked the volume dirty.
445 The Windows boot will run chkdsk and then reboot. The user can then
446 immediately boot into Linux rather than having to do a full Windows
447 boot first before rebooting into Linux and we will recognize such a
448 journal and empty it as it is clean by definition.
449 - Support journals ($LogFile) with only one restart page as well as
450 journals with two different restart pages. We sanity check both and
451 either use the only sane one or the more recent one of the two in the
452 case that both are valid.
453 - Lots of bug fixes and enhancements across the board.
4422.1.23: 4542.1.23:
443 - Stamp the user space journal, aka transaction log, aka $UsnJrnl, if 455 - Stamp the user space journal, aka transaction log, aka $UsnJrnl, if
444 it is present and active thus telling Windows and applications using 456 it is present and active thus telling Windows and applications using
diff --git a/Documentation/input/yealink.txt b/Documentation/input/yealink.txt
new file mode 100644
index 000000000000..85f095a7ad04
--- /dev/null
+++ b/Documentation/input/yealink.txt
@@ -0,0 +1,203 @@
1Driver documentation for yealink usb-p1k phones
2
30. Status
4~~~~~~~~~
5
6The p1k is a relatively cheap usb 1.1 phone with:
7 - keyboard full support, yealink.ko / input event API
8 - LCD full support, yealink.ko / sysfs API
9 - LED full support, yealink.ko / sysfs API
10 - dialtone full support, yealink.ko / sysfs API
11 - ringtone full support, yealink.ko / sysfs API
12 - audio playback full support, snd_usb_audio.ko / alsa API
13 - audio record full support, snd_usb_audio.ko / alsa API
14
15For vendor documentation see http://www.yealink.com
16
17
181. Compilation (stand alone version)
19~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20
21Currently only kernel 2.6.x.y versions are supported.
22In order to build the yealink.ko module do:
23
24 make
25
26If you encounter problems please check if in the MAKE_OPTS variable in
27the Makefile is pointing to the location where your kernel sources
28are located, default /usr/src/linux.
29
30
31
322. keyboard features
33~~~~~~~~~~~~~~~~~~~~
34The current mapping in the kernel is provided by the map_p1k_to_key
35function:
36
37 Physical USB-P1K button layout input events
38
39
40 up up
41 IN OUT left, right
42 down down
43
44 pickup C hangup enter, backspace, escape
45 1 2 3 1, 2, 3
46 4 5 6 4, 5, 6,
47 7 8 9 7, 8, 9,
48 * 0 # *, 0, #,
49
50 The "up" and "down" keys, are symbolised by arrows on the button.
51 The "pickup" and "hangup" keys are symbolised by a green and red phone
52 on the button.
53
54
553. LCD features
56~~~~~~~~~~~~~~~
57The LCD is divided and organised as a 3 line display:
58
59 |[] [][] [][] [][] in |[][]
60 |[] M [][] D [][] : [][] out |[][]
61 store
62
63 NEW REP SU MO TU WE TH FR SA
64
65 [] [] [] [] [] [] [] [] [] [] [] []
66 [] [] [] [] [] [] [] [] [] [] [] []
67
68
69Line 1 Format (see below) : 18.e8.M8.88...188
70 Icon names : M D : IN OUT STORE
71Line 2 Format : .........
72 Icon name : NEW REP SU MO TU WE TH FR SA
73Line 3 Format : 888888888888
74
75
76Format description:
77 From a user space perspective the world is seperated in "digits" and "icons".
78 A digit can have a character set, an icon can only be ON or OFF.
79
80 Format specifier
81 '8' : Generic 7 segment digit with individual addressable segments
82
83 Reduced capabillity 7 segm digit, when segments are hard wired together.
84 '1' : 2 segments digit only able to produce a 1.
85 'e' : Most significant day of the month digit,
86 able to produce at least 1 2 3.
87 'M' : Most significant minute digit,
88 able to produce at least 0 1 2 3 4 5.
89
90 Icons or pictograms:
91 '.' : For example like AM, PM, SU, a 'dot' .. or other single segment
92 elements.
93
94
954. Driver usage
96~~~~~~~~~~~~~~~
97For userland the following interfaces are available using the sysfs interface:
98 /sys/.../
99 line1 Read/Write, lcd line1
100 line2 Read/Write, lcd line2
101 line3 Read/Write, lcd line3
102
103 get_icons Read, returns a set of available icons.
104 hide_icon Write, hide the element by writing the icon name.
105 show_icon Write, display the element by writing the icon name.
106
107 map_seg7 Read/Write, the 7 segments char set, common for all
108 yealink phones. (see map_to_7segment.h)
109
110 ringtone Write, upload binary representation of a ringtone,
111 see yealink.c. status EXPERIMENTAL due to potential
112 races between async. and sync usb calls.
113
114
1154.1 lineX
116~~~~~~~~~
117Reading /sys/../lineX will return the format string with its current value:
118
119 Example:
120 cat ./line3
121 888888888888
122 Linux Rocks!
123
124Writing to /sys/../lineX will set the coresponding LCD line.
125 - Excess characters are ignored.
126 - If less characters are written than allowed, the remaining digits are
127 unchanged.
128 - The tab '\t'and '\n' char does not overwrite the original content.
129 - Writing a space to an icon will always hide its content.
130
131 Example:
132 date +"%m.%e.%k:%M" | sed 's/^0/ /' > ./line1
133
134 Will update the LCD with the current date & time.
135
136
1374.2 get_icons
138~~~~~~~~~~~~~
139Reading will return all available icon names and its current settings:
140
141 cat ./get_icons
142 on M
143 on D
144 on :
145 IN
146 OUT
147 STORE
148 NEW
149 REP
150 SU
151 MO
152 TU
153 WE
154 TH
155 FR
156 SA
157 LED
158 DIALTONE
159 RINGTONE
160
161
1624.3 show/hide icons
163~~~~~~~~~~~~~~~~~~~
164Writing to these files will update the state of the icon.
165Only one icon at a time can be updated.
166
167If an icon is also on a ./lineX the corresponding value is
168updated with the first letter of the icon.
169
170 Example - light up the store icon:
171 echo -n "STORE" > ./show_icon
172
173 cat ./line1
174 18.e8.M8.88...188
175 S
176
177 Example - sound the ringtone for 10 seconds:
178 echo -n RINGTONE > /sys/..../show_icon
179 sleep 10
180 echo -n RINGTONE > /sys/..../hide_icon
181
182
1835. Sound features
184~~~~~~~~~~~~~~~~~
185Sound is supported by the ALSA driver: snd_usb_audio
186
187One 16-bit channel with sample and playback rates of 8000 Hz is the practical
188limit of the device.
189
190 Example - recording test:
191 arecord -v -d 10 -r 8000 -f S16_LE -t wav foobar.wav
192
193 Example - playback test:
194 aplay foobar.wav
195
196
1976. Credits & Acknowledgments
198~~~~~~~~~~~~~~~~~~~~~~~~~~~~
199 - Olivier Vandorpe, for starting the usbb2k-api project doing much of
200 the reverse engineering.
201 - Martin Diehl, for pointing out how to handle USB memory allocation.
202 - Dmitry Torokhov, for the numerous code reviews and suggestions.
203
diff --git a/MAINTAINERS b/MAINTAINERS
index 8e4e82921070..eaa46594f021 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -116,6 +116,12 @@ M: ajk@iehk.rwth-aachen.de
116L: linux-hams@vger.kernel.org 116L: linux-hams@vger.kernel.org
117S: Maintained 117S: Maintained
118 118
119YEALINK PHONE DRIVER
120P: Henk Vergonet
121M: Henk.Vergonet@gmail.com
122L: usbb2k-api-dev@nongnu.org
123S: Maintained
124
1198139CP 10/100 FAST ETHERNET DRIVER 1258139CP 10/100 FAST ETHERNET DRIVER
120P: Jeff Garzik 126P: Jeff Garzik
121M: jgarzik@pobox.com 127M: jgarzik@pobox.com
@@ -1813,13 +1819,6 @@ M: hch@infradead.org
1813L: linux-abi-devel@lists.sourceforge.net 1819L: linux-abi-devel@lists.sourceforge.net
1814S: Maintained 1820S: Maintained
1815 1821
1816PCI ID DATABASE
1817P: Martin Mares
1818M: mj@ucw.cz
1819L: pciids-devel@lists.sourceforge.net
1820W: http://pciids.sourceforge.net/
1821S: Maintained
1822
1823PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES) 1822PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES)
1824P: Thomas Sailer 1823P: Thomas Sailer
1825M: sailer@ife.ee.ethz.ch 1824M: sailer@ife.ee.ethz.ch
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c
index 804727853d25..e32fee505220 100644
--- a/arch/alpha/kernel/sys_marvel.c
+++ b/arch/alpha/kernel/sys_marvel.c
@@ -373,12 +373,11 @@ marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
373 irq += 0x80; /* offset for lsi */ 373 irq += 0x80; /* offset for lsi */
374 374
375#if 1 375#if 1
376 printk("PCI:%d:%d:%d (hose %d) [%s] is using MSI\n", 376 printk("PCI:%d:%d:%d (hose %d) is using MSI\n",
377 dev->bus->number, 377 dev->bus->number,
378 PCI_SLOT(dev->devfn), 378 PCI_SLOT(dev->devfn),
379 PCI_FUNC(dev->devfn), 379 PCI_FUNC(dev->devfn),
380 hose->index, 380 hose->index);
381 pci_pretty_name (dev));
382 printk(" %d message(s) from 0x%04x\n", 381 printk(" %d message(s) from 0x%04x\n",
383 1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4), 382 1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4),
384 msg_dat); 383 msg_dat);
diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c
index 51f430cc2fbf..2786f7c34b3f 100644
--- a/arch/arm/common/locomo.c
+++ b/arch/arm/common/locomo.c
@@ -541,6 +541,103 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
541 return ret; 541 return ret;
542} 542}
543 543
544#ifdef CONFIG_PM
545
546struct locomo_save_data {
547 u16 LCM_GPO;
548 u16 LCM_SPICT;
549 u16 LCM_GPE;
550 u16 LCM_ASD;
551 u16 LCM_SPIMD;
552};
553
554static int locomo_suspend(struct device *dev, u32 pm_message_t, u32 level)
555{
556 struct locomo *lchip = dev_get_drvdata(dev);
557 struct locomo_save_data *save;
558 unsigned long flags;
559
560 if (level != SUSPEND_DISABLE)
561 return 0;
562
563 save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL);
564 if (!save)
565 return -ENOMEM;
566
567 dev->power.saved_state = (void *) save;
568
569 spin_lock_irqsave(&lchip->lock, flags);
570
571 save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */
572 locomo_writel(0x00, lchip->base + LOCOMO_GPO);
573 save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */
574 locomo_writel(0x40, lchip->base + LOCOMO_SPICT);
575 save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */
576 locomo_writel(0x00, lchip->base + LOCOMO_GPE);
577 save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */
578 locomo_writel(0x00, lchip->base + LOCOMO_ASD);
579 save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */
580 locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD);
581
582 locomo_writel(0x00, lchip->base + LOCOMO_PAIF);
583 locomo_writel(0x00, lchip->base + LOCOMO_DAC);
584 locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC);
585
586 if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) )
587 locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */
588 else
589 /* 18MHz already enabled, so no wait */
590 locomo_writel(0xc1, lchip->base + LOCOMO_C32K); /* CLK32 on */
591
592 locomo_writel(0x00, lchip->base + LOCOMO_TADC); /* 18MHz clock off*/
593 locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC); /* 22MHz/24MHz clock off */
594 locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); /* FL */
595
596 spin_unlock_irqrestore(&lchip->lock, flags);
597
598 return 0;
599}
600
601static int locomo_resume(struct device *dev, u32 level)
602{
603 struct locomo *lchip = dev_get_drvdata(dev);
604 struct locomo_save_data *save;
605 unsigned long r;
606 unsigned long flags;
607
608 if (level != RESUME_ENABLE)
609 return 0;
610
611 save = (struct locomo_save_data *) dev->power.saved_state;
612 if (!save)
613 return 0;
614
615 spin_lock_irqsave(&lchip->lock, flags);
616
617 locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO);
618 locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT);
619 locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE);
620 locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD);
621 locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD);
622
623 locomo_writel(0x00, lchip->base + LOCOMO_C32K);
624 locomo_writel(0x90, lchip->base + LOCOMO_TADC);
625
626 locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC);
627 r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
628 r &= 0xFEFF;
629 locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC);
630 locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD);
631
632 spin_unlock_irqrestore(&lchip->lock, flags);
633
634 dev->power.saved_state = NULL;
635 kfree(save);
636
637 return 0;
638}
639#endif
640
544/** 641/**
545 * locomo_probe - probe for a single LoCoMo chip. 642 * locomo_probe - probe for a single LoCoMo chip.
546 * @phys_addr: physical address of device. 643 * @phys_addr: physical address of device.
@@ -707,6 +804,10 @@ static struct device_driver locomo_device_driver = {
707 .bus = &platform_bus_type, 804 .bus = &platform_bus_type,
708 .probe = locomo_probe, 805 .probe = locomo_probe,
709 .remove = locomo_remove, 806 .remove = locomo_remove,
807#ifdef CONFIG_PM
808 .suspend = locomo_suspend,
809 .resume = locomo_resume,
810#endif
710}; 811};
711 812
712/* 813/*
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig
index 96a794d8de84..756348bf5170 100644
--- a/arch/arm/configs/s3c2410_defconfig
+++ b/arch/arm/configs/s3c2410_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.12-git4 3# Linux kernel version: 2.6.13-git8
4# Wed Jun 22 15:56:42 2005 4# Thu Sep 8 19:24:02 2005
5# 5#
6CONFIG_ARM=y 6CONFIG_ARM=y
7CONFIG_MMU=y 7CONFIG_MMU=y
@@ -22,6 +22,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
22# General setup 22# General setup
23# 23#
24CONFIG_LOCALVERSION="" 24CONFIG_LOCALVERSION=""
25CONFIG_LOCALVERSION_AUTO=y
25CONFIG_SWAP=y 26CONFIG_SWAP=y
26CONFIG_SYSVIPC=y 27CONFIG_SYSVIPC=y
27# CONFIG_POSIX_MQUEUE is not set 28# CONFIG_POSIX_MQUEUE is not set
@@ -31,6 +32,7 @@ CONFIG_SYSCTL=y
31# CONFIG_HOTPLUG is not set 32# CONFIG_HOTPLUG is not set
32CONFIG_KOBJECT_UEVENT=y 33CONFIG_KOBJECT_UEVENT=y
33# CONFIG_IKCONFIG is not set 34# CONFIG_IKCONFIG is not set
35CONFIG_INITRAMFS_SOURCE=""
34# CONFIG_EMBEDDED is not set 36# CONFIG_EMBEDDED is not set
35CONFIG_KALLSYMS=y 37CONFIG_KALLSYMS=y
36# CONFIG_KALLSYMS_ALL is not set 38# CONFIG_KALLSYMS_ALL is not set
@@ -88,7 +90,9 @@ CONFIG_ARCH_S3C2410=y
88# 90#
89# S3C24XX Implementations 91# S3C24XX Implementations
90# 92#
93CONFIG_MACH_ANUBIS=y
91CONFIG_ARCH_BAST=y 94CONFIG_ARCH_BAST=y
95CONFIG_BAST_PC104_IRQ=y
92CONFIG_ARCH_H1940=y 96CONFIG_ARCH_H1940=y
93CONFIG_MACH_N30=y 97CONFIG_MACH_N30=y
94CONFIG_ARCH_SMDK2410=y 98CONFIG_ARCH_SMDK2410=y
@@ -112,6 +116,7 @@ CONFIG_S3C2410_DMA=y
112# CONFIG_S3C2410_DMA_DEBUG is not set 116# CONFIG_S3C2410_DMA_DEBUG is not set
113# CONFIG_S3C2410_PM_DEBUG is not set 117# CONFIG_S3C2410_PM_DEBUG is not set
114# CONFIG_S3C2410_PM_CHECK is not set 118# CONFIG_S3C2410_PM_CHECK is not set
119CONFIG_PM_SIMTEC=y
115CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 120CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
116 121
117# 122#
@@ -149,7 +154,15 @@ CONFIG_ISA_DMA_API=y
149# 154#
150# CONFIG_SMP is not set 155# CONFIG_SMP is not set
151# CONFIG_PREEMPT is not set 156# CONFIG_PREEMPT is not set
152# CONFIG_DISCONTIGMEM is not set 157# CONFIG_NO_IDLE_HZ is not set
158# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
159CONFIG_SELECT_MEMORY_MODEL=y
160CONFIG_FLATMEM_MANUAL=y
161# CONFIG_DISCONTIGMEM_MANUAL is not set
162# CONFIG_SPARSEMEM_MANUAL is not set
163CONFIG_FLATMEM=y
164CONFIG_FLAT_NODE_MEM_MAP=y
165# CONFIG_SPARSEMEM_STATIC is not set
153CONFIG_ALIGNMENT_TRAP=y 166CONFIG_ALIGNMENT_TRAP=y
154 167
155# 168#
@@ -186,6 +199,74 @@ CONFIG_PM=y
186CONFIG_APM=y 199CONFIG_APM=y
187 200
188# 201#
202# Networking
203#
204CONFIG_NET=y
205
206#
207# Networking options
208#
209# CONFIG_PACKET is not set
210CONFIG_UNIX=y
211# CONFIG_NET_KEY is not set
212CONFIG_INET=y
213# CONFIG_IP_MULTICAST is not set
214# CONFIG_IP_ADVANCED_ROUTER is not set
215CONFIG_IP_FIB_HASH=y
216CONFIG_IP_PNP=y
217# CONFIG_IP_PNP_DHCP is not set
218CONFIG_IP_PNP_BOOTP=y
219# CONFIG_IP_PNP_RARP is not set
220# CONFIG_NET_IPIP is not set
221# CONFIG_NET_IPGRE is not set
222# CONFIG_ARPD is not set
223# CONFIG_SYN_COOKIES is not set
224# CONFIG_INET_AH is not set
225# CONFIG_INET_ESP is not set
226# CONFIG_INET_IPCOMP is not set
227# CONFIG_INET_TUNNEL is not set
228CONFIG_INET_DIAG=y
229CONFIG_INET_TCP_DIAG=y
230# CONFIG_TCP_CONG_ADVANCED is not set
231CONFIG_TCP_CONG_BIC=y
232# CONFIG_IPV6 is not set
233# CONFIG_NETFILTER is not set
234
235#
236# DCCP Configuration (EXPERIMENTAL)
237#
238# CONFIG_IP_DCCP is not set
239
240#
241# SCTP Configuration (EXPERIMENTAL)
242#
243# CONFIG_IP_SCTP is not set
244# CONFIG_ATM is not set
245# CONFIG_BRIDGE is not set
246# CONFIG_VLAN_8021Q is not set
247# CONFIG_DECNET is not set
248# CONFIG_LLC2 is not set
249# CONFIG_IPX is not set
250# CONFIG_ATALK is not set
251# CONFIG_X25 is not set
252# CONFIG_LAPB is not set
253# CONFIG_NET_DIVERT is not set
254# CONFIG_ECONET is not set
255# CONFIG_WAN_ROUTER is not set
256# CONFIG_NET_SCHED is not set
257# CONFIG_NET_CLS_ROUTE is not set
258
259#
260# Network testing
261#
262# CONFIG_NET_PKTGEN is not set
263# CONFIG_NETFILTER_NETLINK is not set
264# CONFIG_HAMRADIO is not set
265# CONFIG_IRDA is not set
266# CONFIG_BT is not set
267# CONFIG_IEEE80211 is not set
268
269#
189# Device Drivers 270# Device Drivers
190# 271#
191 272
@@ -258,6 +339,7 @@ CONFIG_MTD_ROM=y
258# CONFIG_MTD_IMPA7 is not set 339# CONFIG_MTD_IMPA7 is not set
259CONFIG_MTD_BAST=y 340CONFIG_MTD_BAST=y
260CONFIG_MTD_BAST_MAXSIZE=4 341CONFIG_MTD_BAST_MAXSIZE=4
342# CONFIG_MTD_PLATRAM is not set
261 343
262# 344#
263# Self-contained MTD device drivers 345# Self-contained MTD device drivers
@@ -312,7 +394,6 @@ CONFIG_BLK_DEV_RAM=y
312CONFIG_BLK_DEV_RAM_COUNT=16 394CONFIG_BLK_DEV_RAM_COUNT=16
313CONFIG_BLK_DEV_RAM_SIZE=4096 395CONFIG_BLK_DEV_RAM_SIZE=4096
314CONFIG_BLK_DEV_INITRD=y 396CONFIG_BLK_DEV_INITRD=y
315CONFIG_INITRAMFS_SOURCE=""
316# CONFIG_CDROM_PKTCDVD is not set 397# CONFIG_CDROM_PKTCDVD is not set
317 398
318# 399#
@@ -354,6 +435,7 @@ CONFIG_BLK_DEV_IDE_BAST=y
354# 435#
355# SCSI device support 436# SCSI device support
356# 437#
438# CONFIG_RAID_ATTRS is not set
357# CONFIG_SCSI is not set 439# CONFIG_SCSI is not set
358 440
359# 441#
@@ -376,70 +458,8 @@ CONFIG_BLK_DEV_IDE_BAST=y
376# 458#
377 459
378# 460#
379# Networking support 461# Network device support
380#
381CONFIG_NET=y
382
383#
384# Networking options
385# 462#
386# CONFIG_PACKET is not set
387CONFIG_UNIX=y
388# CONFIG_NET_KEY is not set
389CONFIG_INET=y
390CONFIG_IP_FIB_HASH=y
391# CONFIG_IP_FIB_TRIE is not set
392# CONFIG_IP_MULTICAST is not set
393# CONFIG_IP_ADVANCED_ROUTER is not set
394CONFIG_IP_PNP=y
395# CONFIG_IP_PNP_DHCP is not set
396CONFIG_IP_PNP_BOOTP=y
397# CONFIG_IP_PNP_RARP is not set
398# CONFIG_NET_IPIP is not set
399# CONFIG_NET_IPGRE is not set
400# CONFIG_ARPD is not set
401# CONFIG_SYN_COOKIES is not set
402# CONFIG_INET_AH is not set
403# CONFIG_INET_ESP is not set
404# CONFIG_INET_IPCOMP is not set
405# CONFIG_INET_TUNNEL is not set
406CONFIG_IP_TCPDIAG=y
407# CONFIG_IP_TCPDIAG_IPV6 is not set
408# CONFIG_IPV6 is not set
409# CONFIG_NETFILTER is not set
410
411#
412# SCTP Configuration (EXPERIMENTAL)
413#
414# CONFIG_IP_SCTP is not set
415# CONFIG_ATM is not set
416# CONFIG_BRIDGE is not set
417# CONFIG_VLAN_8021Q is not set
418# CONFIG_DECNET is not set
419# CONFIG_LLC2 is not set
420# CONFIG_IPX is not set
421# CONFIG_ATALK is not set
422# CONFIG_X25 is not set
423# CONFIG_LAPB is not set
424# CONFIG_NET_DIVERT is not set
425# CONFIG_ECONET is not set
426# CONFIG_WAN_ROUTER is not set
427
428#
429# QoS and/or fair queueing
430#
431# CONFIG_NET_SCHED is not set
432# CONFIG_NET_CLS_ROUTE is not set
433
434#
435# Network testing
436#
437# CONFIG_NET_PKTGEN is not set
438# CONFIG_NETPOLL is not set
439# CONFIG_NET_POLL_CONTROLLER is not set
440# CONFIG_HAMRADIO is not set
441# CONFIG_IRDA is not set
442# CONFIG_BT is not set
443CONFIG_NETDEVICES=y 463CONFIG_NETDEVICES=y
444# CONFIG_DUMMY is not set 464# CONFIG_DUMMY is not set
445# CONFIG_BONDING is not set 465# CONFIG_BONDING is not set
@@ -447,6 +467,11 @@ CONFIG_NETDEVICES=y
447# CONFIG_TUN is not set 467# CONFIG_TUN is not set
448 468
449# 469#
470# PHY device support
471#
472# CONFIG_PHYLIB is not set
473
474#
450# Ethernet (10 or 100Mbit) 475# Ethernet (10 or 100Mbit)
451# 476#
452CONFIG_NET_ETHERNET=y 477CONFIG_NET_ETHERNET=y
@@ -480,6 +505,8 @@ CONFIG_DM9000=m
480# CONFIG_SLIP is not set 505# CONFIG_SLIP is not set
481# CONFIG_SHAPER is not set 506# CONFIG_SHAPER is not set
482# CONFIG_NETCONSOLE is not set 507# CONFIG_NETCONSOLE is not set
508# CONFIG_NETPOLL is not set
509# CONFIG_NET_POLL_CONTROLLER is not set
483 510
484# 511#
485# ISDN subsystem 512# ISDN subsystem
@@ -562,7 +589,6 @@ CONFIG_SERIAL_8250_EXTENDED=y
562CONFIG_SERIAL_8250_MANY_PORTS=y 589CONFIG_SERIAL_8250_MANY_PORTS=y
563CONFIG_SERIAL_8250_SHARE_IRQ=y 590CONFIG_SERIAL_8250_SHARE_IRQ=y
564# CONFIG_SERIAL_8250_DETECT_IRQ is not set 591# CONFIG_SERIAL_8250_DETECT_IRQ is not set
565# CONFIG_SERIAL_8250_MULTIPORT is not set
566# CONFIG_SERIAL_8250_RSA is not set 592# CONFIG_SERIAL_8250_RSA is not set
567 593
568# 594#
@@ -605,7 +631,6 @@ CONFIG_S3C2410_RTC=y
605# 631#
606# Ftape, the floppy tape device driver 632# Ftape, the floppy tape device driver
607# 633#
608# CONFIG_DRM is not set
609# CONFIG_RAW_DRIVER is not set 634# CONFIG_RAW_DRIVER is not set
610 635
611# 636#
@@ -628,7 +653,7 @@ CONFIG_I2C_ALGOBIT=m
628# 653#
629# I2C Hardware Bus support 654# I2C Hardware Bus support
630# 655#
631# CONFIG_I2C_ISA is not set 656CONFIG_I2C_ISA=m
632# CONFIG_I2C_PARPORT is not set 657# CONFIG_I2C_PARPORT is not set
633# CONFIG_I2C_PARPORT_LIGHT is not set 658# CONFIG_I2C_PARPORT_LIGHT is not set
634CONFIG_I2C_S3C2410=y 659CONFIG_I2C_S3C2410=y
@@ -636,14 +661,33 @@ CONFIG_I2C_S3C2410=y
636# CONFIG_I2C_PCA_ISA is not set 661# CONFIG_I2C_PCA_ISA is not set
637 662
638# 663#
639# Hardware Sensors Chip support 664# Miscellaneous I2C Chip support
640# 665#
641CONFIG_I2C_SENSOR=m 666# CONFIG_SENSORS_DS1337 is not set
667# CONFIG_SENSORS_DS1374 is not set
668CONFIG_SENSORS_EEPROM=m
669# CONFIG_SENSORS_PCF8574 is not set
670# CONFIG_SENSORS_PCA9539 is not set
671# CONFIG_SENSORS_PCF8591 is not set
672# CONFIG_SENSORS_RTC8564 is not set
673# CONFIG_SENSORS_MAX6875 is not set
674# CONFIG_I2C_DEBUG_CORE is not set
675# CONFIG_I2C_DEBUG_ALGO is not set
676# CONFIG_I2C_DEBUG_BUS is not set
677# CONFIG_I2C_DEBUG_CHIP is not set
678
679#
680# Hardware Monitoring support
681#
682CONFIG_HWMON=y
683CONFIG_HWMON_VID=m
642# CONFIG_SENSORS_ADM1021 is not set 684# CONFIG_SENSORS_ADM1021 is not set
643# CONFIG_SENSORS_ADM1025 is not set 685# CONFIG_SENSORS_ADM1025 is not set
644# CONFIG_SENSORS_ADM1026 is not set 686# CONFIG_SENSORS_ADM1026 is not set
645# CONFIG_SENSORS_ADM1031 is not set 687# CONFIG_SENSORS_ADM1031 is not set
688# CONFIG_SENSORS_ADM9240 is not set
646# CONFIG_SENSORS_ASB100 is not set 689# CONFIG_SENSORS_ASB100 is not set
690# CONFIG_SENSORS_ATXP1 is not set
647# CONFIG_SENSORS_DS1621 is not set 691# CONFIG_SENSORS_DS1621 is not set
648# CONFIG_SENSORS_FSCHER is not set 692# CONFIG_SENSORS_FSCHER is not set
649# CONFIG_SENSORS_FSCPOS is not set 693# CONFIG_SENSORS_FSCPOS is not set
@@ -662,27 +706,21 @@ CONFIG_SENSORS_LM85=m
662# CONFIG_SENSORS_LM92 is not set 706# CONFIG_SENSORS_LM92 is not set
663# CONFIG_SENSORS_MAX1619 is not set 707# CONFIG_SENSORS_MAX1619 is not set
664# CONFIG_SENSORS_PC87360 is not set 708# CONFIG_SENSORS_PC87360 is not set
665# CONFIG_SENSORS_SMSC47B397 is not set
666# CONFIG_SENSORS_SMSC47M1 is not set 709# CONFIG_SENSORS_SMSC47M1 is not set
710# CONFIG_SENSORS_SMSC47B397 is not set
667# CONFIG_SENSORS_W83781D is not set 711# CONFIG_SENSORS_W83781D is not set
712# CONFIG_SENSORS_W83792D is not set
668# CONFIG_SENSORS_W83L785TS is not set 713# CONFIG_SENSORS_W83L785TS is not set
669# CONFIG_SENSORS_W83627HF is not set 714# CONFIG_SENSORS_W83627HF is not set
715# CONFIG_SENSORS_W83627EHF is not set
716# CONFIG_HWMON_DEBUG_CHIP is not set
670 717
671# 718#
672# Other I2C Chip support 719# Misc devices
673# 720#
674# CONFIG_SENSORS_DS1337 is not set
675CONFIG_SENSORS_EEPROM=m
676# CONFIG_SENSORS_PCF8574 is not set
677# CONFIG_SENSORS_PCF8591 is not set
678# CONFIG_SENSORS_RTC8564 is not set
679# CONFIG_I2C_DEBUG_CORE is not set
680# CONFIG_I2C_DEBUG_ALGO is not set
681# CONFIG_I2C_DEBUG_BUS is not set
682# CONFIG_I2C_DEBUG_CHIP is not set
683 721
684# 722#
685# Misc devices 723# Multimedia Capabilities Port drivers
686# 724#
687 725
688# 726#
@@ -731,7 +769,7 @@ CONFIG_DUMMY_CONSOLE=y
731# USB support 769# USB support
732# 770#
733CONFIG_USB_ARCH_HAS_HCD=y 771CONFIG_USB_ARCH_HAS_HCD=y
734# CONFIG_USB_ARCH_HAS_OHCI is not set 772CONFIG_USB_ARCH_HAS_OHCI=y
735# CONFIG_USB is not set 773# CONFIG_USB is not set
736 774
737# 775#
@@ -749,6 +787,7 @@ CONFIG_USB_ARCH_HAS_HCD=y
749# 787#
750CONFIG_EXT2_FS=y 788CONFIG_EXT2_FS=y
751# CONFIG_EXT2_FS_XATTR is not set 789# CONFIG_EXT2_FS_XATTR is not set
790# CONFIG_EXT2_FS_XIP is not set
752CONFIG_EXT3_FS=y 791CONFIG_EXT3_FS=y
753CONFIG_EXT3_FS_XATTR=y 792CONFIG_EXT3_FS_XATTR=y
754# CONFIG_EXT3_FS_POSIX_ACL is not set 793# CONFIG_EXT3_FS_POSIX_ACL is not set
@@ -758,6 +797,7 @@ CONFIG_JBD=y
758CONFIG_FS_MBCACHE=y 797CONFIG_FS_MBCACHE=y
759# CONFIG_REISERFS_FS is not set 798# CONFIG_REISERFS_FS is not set
760# CONFIG_JFS_FS is not set 799# CONFIG_JFS_FS is not set
800# CONFIG_FS_POSIX_ACL is not set
761 801
762# 802#
763# XFS support 803# XFS support
@@ -765,6 +805,7 @@ CONFIG_FS_MBCACHE=y
765# CONFIG_XFS_FS is not set 805# CONFIG_XFS_FS is not set
766# CONFIG_MINIX_FS is not set 806# CONFIG_MINIX_FS is not set
767CONFIG_ROMFS_FS=y 807CONFIG_ROMFS_FS=y
808CONFIG_INOTIFY=y
768# CONFIG_QUOTA is not set 809# CONFIG_QUOTA is not set
769CONFIG_DNOTIFY=y 810CONFIG_DNOTIFY=y
770# CONFIG_AUTOFS_FS is not set 811# CONFIG_AUTOFS_FS is not set
@@ -791,11 +832,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
791# 832#
792CONFIG_PROC_FS=y 833CONFIG_PROC_FS=y
793CONFIG_SYSFS=y 834CONFIG_SYSFS=y
794# CONFIG_DEVPTS_FS_XATTR is not set
795# CONFIG_TMPFS is not set 835# CONFIG_TMPFS is not set
796# CONFIG_HUGETLBFS is not set 836# CONFIG_HUGETLBFS is not set
797# CONFIG_HUGETLB_PAGE is not set 837# CONFIG_HUGETLB_PAGE is not set
798CONFIG_RAMFS=y 838CONFIG_RAMFS=y
839# CONFIG_RELAYFS_FS is not set
799 840
800# 841#
801# Miscellaneous filesystems 842# Miscellaneous filesystems
@@ -812,8 +853,7 @@ CONFIG_JFFS_FS_VERBOSE=0
812# CONFIG_JFFS_PROC_FS is not set 853# CONFIG_JFFS_PROC_FS is not set
813CONFIG_JFFS2_FS=y 854CONFIG_JFFS2_FS=y
814CONFIG_JFFS2_FS_DEBUG=0 855CONFIG_JFFS2_FS_DEBUG=0
815# CONFIG_JFFS2_FS_NAND is not set 856CONFIG_JFFS2_FS_WRITEBUFFER=y
816# CONFIG_JFFS2_FS_NOR_ECC is not set
817# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set 857# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
818CONFIG_JFFS2_ZLIB=y 858CONFIG_JFFS2_ZLIB=y
819CONFIG_JFFS2_RTIME=y 859CONFIG_JFFS2_RTIME=y
@@ -835,6 +875,7 @@ CONFIG_NFS_FS=y
835# CONFIG_NFSD is not set 875# CONFIG_NFSD is not set
836CONFIG_ROOT_NFS=y 876CONFIG_ROOT_NFS=y
837CONFIG_LOCKD=y 877CONFIG_LOCKD=y
878CONFIG_NFS_COMMON=y
838CONFIG_SUNRPC=y 879CONFIG_SUNRPC=y
839# CONFIG_RPCSEC_GSS_KRB5 is not set 880# CONFIG_RPCSEC_GSS_KRB5 is not set
840# CONFIG_RPCSEC_GSS_SPKM3 is not set 881# CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -920,6 +961,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
920CONFIG_DEBUG_KERNEL=y 961CONFIG_DEBUG_KERNEL=y
921# CONFIG_MAGIC_SYSRQ is not set 962# CONFIG_MAGIC_SYSRQ is not set
922CONFIG_LOG_BUF_SHIFT=16 963CONFIG_LOG_BUF_SHIFT=16
964CONFIG_DETECT_SOFTLOCKUP=y
923# CONFIG_SCHEDSTATS is not set 965# CONFIG_SCHEDSTATS is not set
924# CONFIG_DEBUG_SLAB is not set 966# CONFIG_DEBUG_SLAB is not set
925# CONFIG_DEBUG_SPINLOCK is not set 967# CONFIG_DEBUG_SPINLOCK is not set
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c
index 112f1d68fb2b..e216ab8b9e8f 100644
--- a/arch/arm/mach-clps7500/core.c
+++ b/arch/arm/mach-clps7500/core.c
@@ -354,7 +354,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
354 354
355static struct platform_device serial_device = { 355static struct platform_device serial_device = {
356 .name = "serial8250", 356 .name = "serial8250",
357 .id = 0, 357 .id = PLAT8250_DEV_PLATFORM,
358 .dev = { 358 .dev = {
359 .platform_data = serial_platform_data, 359 .platform_data = serial_platform_data,
360 }, 360 },
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c
index 23c4da10101b..5aeadfd72143 100644
--- a/arch/arm/mach-ebsa110/core.c
+++ b/arch/arm/mach-ebsa110/core.c
@@ -219,7 +219,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
219 219
220static struct platform_device serial_device = { 220static struct platform_device serial_device = {
221 .name = "serial8250", 221 .name = "serial8250",
222 .id = 0, 222 .id = PLAT8250_DEV_PLATFORM,
223 .dev = { 223 .dev = {
224 .platform_data = serial_platform_data, 224 .platform_data = serial_platform_data,
225 }, 225 },
diff --git a/arch/arm/mach-epxa10db/arch.c b/arch/arm/mach-epxa10db/arch.c
index 7daa021676d0..44c56571d183 100644
--- a/arch/arm/mach-epxa10db/arch.c
+++ b/arch/arm/mach-epxa10db/arch.c
@@ -52,7 +52,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
52 52
53static struct platform_device serial_device = { 53static struct platform_device serial_device = {
54 .name = "serial8250", 54 .name = "serial8250",
55 .id = 0, 55 .id = PLAT8250_DEV_PLATFORM,
56 .dev = { 56 .dev = {
57 .platform_data = serial_platform_data, 57 .platform_data = serial_platform_data,
58 }, 58 },
diff --git a/arch/arm/mach-footbridge/isa.c b/arch/arm/mach-footbridge/isa.c
index aa3a1fef563e..28846c7edaaf 100644
--- a/arch/arm/mach-footbridge/isa.c
+++ b/arch/arm/mach-footbridge/isa.c
@@ -34,7 +34,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
34 34
35static struct platform_device serial_device = { 35static struct platform_device serial_device = {
36 .name = "serial8250", 36 .name = "serial8250",
37 .id = 0, 37 .id = PLAT8250_DEV_PLATFORM,
38 .dev = { 38 .dev = {
39 .platform_data = serial_platform_data, 39 .platform_data = serial_platform_data,
40 }, 40 },
diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c
index 4b3199319e68..a4a7c0125d03 100644
--- a/arch/arm/mach-h720x/cpu-h7202.c
+++ b/arch/arm/mach-h720x/cpu-h7202.c
@@ -90,7 +90,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
90 90
91static struct platform_device serial_device = { 91static struct platform_device serial_device = {
92 .name = "serial8250", 92 .name = "serial8250",
93 .id = 0, 93 .id = PLAT8250_DEV_PLATFORM,
94 .dev = { 94 .dev = {
95 .platform_data = serial_platform_data, 95 .platform_data = serial_platform_data,
96 }, 96 },
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c
index 098c817a7fb8..74bd2fd602d4 100644
--- a/arch/arm/mach-ixp2000/core.c
+++ b/arch/arm/mach-ixp2000/core.c
@@ -174,7 +174,7 @@ static struct resource ixp2000_uart_resource = {
174 174
175static struct platform_device ixp2000_serial_device = { 175static struct platform_device ixp2000_serial_device = {
176 .name = "serial8250", 176 .name = "serial8250",
177 .id = 0, 177 .id = PLAT8250_DEV_PLATFORM,
178 .dev = { 178 .dev = {
179 .platform_data = ixp2000_serial_port, 179 .platform_data = ixp2000_serial_port,
180 }, 180 },
diff --git a/arch/arm/mach-ixp4xx/coyote-setup.c b/arch/arm/mach-ixp4xx/coyote-setup.c
index 8b2f25322452..050c92768913 100644
--- a/arch/arm/mach-ixp4xx/coyote-setup.c
+++ b/arch/arm/mach-ixp4xx/coyote-setup.c
@@ -66,7 +66,7 @@ static struct plat_serial8250_port coyote_uart_data[] = {
66 66
67static struct platform_device coyote_uart = { 67static struct platform_device coyote_uart = {
68 .name = "serial8250", 68 .name = "serial8250",
69 .id = 0, 69 .id = PLAT8250_DEV_PLATFORM,
70 .dev = { 70 .dev = {
71 .platform_data = coyote_uart_data, 71 .platform_data = coyote_uart_data,
72 }, 72 },
diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c
index 3fd92c5cbaa8..29a6d02fa851 100644
--- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c
+++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c
@@ -93,7 +93,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = {
93 93
94static struct platform_device gtwx5715_uart_device = { 94static struct platform_device gtwx5715_uart_device = {
95 .name = "serial8250", 95 .name = "serial8250",
96 .id = 0, 96 .id = PLAT8250_DEV_PLATFORM,
97 .dev = { 97 .dev = {
98 .platform_data = gtwx5715_uart_platform_data, 98 .platform_data = gtwx5715_uart_platform_data,
99 }, 99 },
diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c
index 6c14ff3c23a0..ae1fa099d5fa 100644
--- a/arch/arm/mach-ixp4xx/ixdp425-setup.c
+++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c
@@ -96,7 +96,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
96 96
97static struct platform_device ixdp425_uart = { 97static struct platform_device ixdp425_uart = {
98 .name = "serial8250", 98 .name = "serial8250",
99 .id = 0, 99 .id = PLAT8250_DEV_PLATFORM,
100 .dev.platform_data = ixdp425_uart_data, 100 .dev.platform_data = ixdp425_uart_data,
101 .num_resources = 2, 101 .num_resources = 2,
102 .resource = ixdp425_uart_resources 102 .resource = ixdp425_uart_resources
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig
index 7408ac94f771..27fc2e8e5fca 100644
--- a/arch/arm/mach-omap1/Kconfig
+++ b/arch/arm/mach-omap1/Kconfig
@@ -47,6 +47,14 @@ config MACH_OMAP_OSK
47 TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here 47 TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
48 if you have such a board. 48 if you have such a board.
49 49
50config OMAP_OSK_MISTRAL
51 bool "Mistral QVGA board Support"
52 depends on MACH_OMAP_OSK
53 help
54 The OSK supports an optional add-on board with a Quarter-VGA
55 touchscreen, PDA-ish buttons, a resume button, bicolor LED,
56 and camera connector. Say Y here if you have this board.
57
50config MACH_OMAP_PERSEUS2 58config MACH_OMAP_PERSEUS2
51 bool "TI Perseus2" 59 bool "TI Perseus2"
52 depends on ARCH_OMAP1 && ARCH_OMAP730 60 depends on ARCH_OMAP1 && ARCH_OMAP730
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
index d386fd913f0c..181a93deaaee 100644
--- a/arch/arm/mach-omap1/Makefile
+++ b/arch/arm/mach-omap1/Makefile
@@ -3,7 +3,7 @@
3# 3#
4 4
5# Common support 5# Common support
6obj-y := io.o id.o irq.o time.o serial.o 6obj-y := io.o id.o irq.o time.o serial.o devices.o
7led-y := leds.o 7led-y := leds.o
8 8
9# Specific board support 9# Specific board support
@@ -23,6 +23,7 @@ endif
23 23
24# LEDs support 24# LEDs support
25led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o 25led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o
26led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o
26led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o 27led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o
27led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o 28led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o
28led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o 29led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c
index 122796ebe8f5..c209c7172a9a 100644
--- a/arch/arm/mach-omap1/board-generic.c
+++ b/arch/arm/mach-omap1/board-generic.c
@@ -48,19 +48,43 @@ static struct omap_usb_config generic1510_usb_config __initdata = {
48 48
49#if defined(CONFIG_ARCH_OMAP16XX) 49#if defined(CONFIG_ARCH_OMAP16XX)
50static struct omap_usb_config generic1610_usb_config __initdata = { 50static struct omap_usb_config generic1610_usb_config __initdata = {
51#ifdef CONFIG_USB_OTG
52 .otg = 1,
53#endif
51 .register_host = 1, 54 .register_host = 1,
52 .register_dev = 1, 55 .register_dev = 1,
53 .hmc_mode = 16, 56 .hmc_mode = 16,
54 .pins[0] = 6, 57 .pins[0] = 6,
55}; 58};
59
60static struct omap_mmc_config generic_mmc_config __initdata = {
61 .mmc [0] = {
62 .enabled = 0,
63 .wire4 = 0,
64 .wp_pin = -1,
65 .power_pin = -1,
66 .switch_pin = -1,
67 },
68 .mmc [1] = {
69 .enabled = 0,
70 .wire4 = 0,
71 .wp_pin = -1,
72 .power_pin = -1,
73 .switch_pin = -1,
74 },
75};
76
56#endif 77#endif
57 78
58static struct omap_board_config_kernel generic_config[] = { 79static struct omap_board_config_kernel generic_config[] = {
59 { OMAP_TAG_USB, NULL }, 80 { OMAP_TAG_USB, NULL },
81 { OMAP_TAG_MMC, &generic_mmc_config },
60}; 82};
61 83
62static void __init omap_generic_init(void) 84static void __init omap_generic_init(void)
63{ 85{
86 const struct omap_uart_config *uart_conf;
87
64 /* 88 /*
65 * Make sure the serial ports are muxed on at this point. 89 * Make sure the serial ports are muxed on at this point.
66 * You have to mux them off in device drivers later on 90 * You have to mux them off in device drivers later on
@@ -76,6 +100,18 @@ static void __init omap_generic_init(void)
76 generic_config[0].data = &generic1610_usb_config; 100 generic_config[0].data = &generic1610_usb_config;
77 } 101 }
78#endif 102#endif
103
104 uart_conf = omap_get_config(OMAP_TAG_UART, struct omap_uart_config);
105 if (uart_conf != NULL) {
106 unsigned int enabled_ports, i;
107
108 enabled_ports = uart_conf->enabled_uarts;
109 for (i = 0; i < 3; i++) {
110 if (!(enabled_ports & (1 << i)))
111 generic_serial_ports[i] = 0;
112 }
113 }
114
79 omap_board_config = generic_config; 115 omap_board_config = generic_config;
80 omap_board_config_size = ARRAY_SIZE(generic_config); 116 omap_board_config_size = ARRAY_SIZE(generic_config);
81 omap_serial_init(generic_serial_ports); 117 omap_serial_init(generic_serial_ports);
@@ -83,7 +119,7 @@ static void __init omap_generic_init(void)
83 119
84static void __init omap_generic_map_io(void) 120static void __init omap_generic_map_io(void)
85{ 121{
86 omap_map_common_io() 122 omap_map_common_io();
87} 123}
88 124
89MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") 125MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c
index f4983ee95ab4..d46a70063b0c 100644
--- a/arch/arm/mach-omap1/board-h2.c
+++ b/arch/arm/mach-omap1/board-h2.c
@@ -33,6 +33,7 @@
33#include <asm/mach/map.h> 33#include <asm/mach/map.h>
34 34
35#include <asm/arch/gpio.h> 35#include <asm/arch/gpio.h>
36#include <asm/arch/mux.h>
36#include <asm/arch/tc.h> 37#include <asm/arch/tc.h>
37#include <asm/arch/usb.h> 38#include <asm/arch/usb.h>
38#include <asm/arch/common.h> 39#include <asm/arch/common.h>
@@ -80,8 +81,7 @@ static struct flash_platform_data h2_flash_data = {
80}; 81};
81 82
82static struct resource h2_flash_resource = { 83static struct resource h2_flash_resource = {
83 .start = OMAP_CS2B_PHYS, 84 /* This is on CS3, wherever it's mapped */
84 .end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
85 .flags = IORESOURCE_MEM, 85 .flags = IORESOURCE_MEM,
86}; 86};
87 87
@@ -126,10 +126,9 @@ static void __init h2_init_smc91x(void)
126 printk("Error requesting gpio 0 for smc91x irq\n"); 126 printk("Error requesting gpio 0 for smc91x irq\n");
127 return; 127 return;
128 } 128 }
129 omap_set_gpio_edge_ctrl(0, OMAP_GPIO_FALLING_EDGE);
130} 129}
131 130
132void h2_init_irq(void) 131static void __init h2_init_irq(void)
133{ 132{
134 omap_init_irq(); 133 omap_init_irq();
135 omap_gpio_init(); 134 omap_gpio_init();
@@ -152,9 +151,13 @@ static struct omap_usb_config h2_usb_config __initdata = {
152}; 151};
153 152
154static struct omap_mmc_config h2_mmc_config __initdata = { 153static struct omap_mmc_config h2_mmc_config __initdata = {
155 .mmc_blocks = 1, 154 .mmc [0] = {
156 .mmc1_power_pin = -1, /* tps65010 gpio3 */ 155 .enabled = 1,
157 .mmc1_switch_pin = OMAP_MPUIO(1), 156 .wire4 = 1,
157 .wp_pin = OMAP_MPUIO(3),
158 .power_pin = -1, /* tps65010 gpio3 */
159 .switch_pin = OMAP_MPUIO(1),
160 },
158}; 161};
159 162
160static struct omap_board_config_kernel h2_config[] = { 163static struct omap_board_config_kernel h2_config[] = {
@@ -164,6 +167,16 @@ static struct omap_board_config_kernel h2_config[] = {
164 167
165static void __init h2_init(void) 168static void __init h2_init(void)
166{ 169{
170 /* NOTE: revC boards support NAND-boot, which can put NOR on CS2B
171 * and NAND (either 16bit or 8bit) on CS3.
172 */
173 h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys();
174 h2_flash_resource.end += SZ_32M - 1;
175
176 /* MMC: card detect and WP */
177 // omap_cfg_reg(U19_ARMIO1); /* CD */
178 omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */
179
167 platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); 180 platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
168 omap_board_config = h2_config; 181 omap_board_config = h2_config;
169 omap_board_config_size = ARRAY_SIZE(h2_config); 182 omap_board_config_size = ARRAY_SIZE(h2_config);
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index 7cd419d61b40..2798613696fa 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -82,8 +82,7 @@ static struct flash_platform_data h3_flash_data = {
82}; 82};
83 83
84static struct resource h3_flash_resource = { 84static struct resource h3_flash_resource = {
85 .start = OMAP_CS2B_PHYS, 85 /* This is on CS3, wherever it's mapped */
86 .end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1,
87 .flags = IORESOURCE_MEM, 86 .flags = IORESOURCE_MEM,
88}; 87};
89 88
@@ -161,13 +160,26 @@ static struct omap_usb_config h3_usb_config __initdata = {
161 .pins[1] = 3, 160 .pins[1] = 3,
162}; 161};
163 162
163static struct omap_mmc_config h3_mmc_config __initdata = {
164 .mmc[0] = {
165 .enabled = 1,
166 .power_pin = -1, /* tps65010 GPIO4 */
167 .switch_pin = OMAP_MPUIO(1),
168 },
169};
170
164static struct omap_board_config_kernel h3_config[] = { 171static struct omap_board_config_kernel h3_config[] = {
165 { OMAP_TAG_USB, &h3_usb_config }, 172 { OMAP_TAG_USB, &h3_usb_config },
173 { OMAP_TAG_MMC, &h3_mmc_config },
166}; 174};
167 175
168static void __init h3_init(void) 176static void __init h3_init(void)
169{ 177{
178 h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys();
179 h3_flash_resource.end += OMAP_CS3_SIZE - 1;
170 (void) platform_add_devices(devices, ARRAY_SIZE(devices)); 180 (void) platform_add_devices(devices, ARRAY_SIZE(devices));
181 omap_board_config = h3_config;
182 omap_board_config_size = ARRAY_SIZE(h3_config);
171} 183}
172 184
173static void __init h3_init_smc91x(void) 185static void __init h3_init_smc91x(void)
@@ -177,7 +189,6 @@ static void __init h3_init_smc91x(void)
177 printk("Error requesting gpio 40 for smc91x irq\n"); 189 printk("Error requesting gpio 40 for smc91x irq\n");
178 return; 190 return;
179 } 191 }
180 omap_set_gpio_edge_ctrl(40, OMAP_GPIO_FALLING_EDGE);
181} 192}
182 193
183void h3_init_irq(void) 194void h3_init_irq(void)
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c
index 91de60a91ef8..df0312b596e4 100644
--- a/arch/arm/mach-omap1/board-innovator.c
+++ b/arch/arm/mach-omap1/board-innovator.c
@@ -29,6 +29,7 @@
29#include <asm/mach/flash.h> 29#include <asm/mach/flash.h>
30#include <asm/mach/map.h> 30#include <asm/mach/map.h>
31 31
32#include <asm/arch/mux.h>
32#include <asm/arch/fpga.h> 33#include <asm/arch/fpga.h>
33#include <asm/arch/gpio.h> 34#include <asm/arch/gpio.h>
34#include <asm/arch/tc.h> 35#include <asm/arch/tc.h>
@@ -173,7 +174,6 @@ static void __init innovator_init_smc91x(void)
173 printk("Error requesting gpio 0 for smc91x irq\n"); 174 printk("Error requesting gpio 0 for smc91x irq\n");
174 return; 175 return;
175 } 176 }
176 omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
177 } 177 }
178} 178}
179 179
@@ -220,8 +220,19 @@ static struct omap_usb_config h2_usb_config __initdata = {
220}; 220};
221#endif 221#endif
222 222
223static struct omap_mmc_config innovator_mmc_config __initdata = {
224 .mmc [0] = {
225 .enabled = 1,
226 .wire4 = 1,
227 .wp_pin = OMAP_MPUIO(3),
228 .power_pin = -1, /* FPGA F3 UIO42 */
229 .switch_pin = -1, /* FPGA F4 UIO43 */
230 },
231};
232
223static struct omap_board_config_kernel innovator_config[] = { 233static struct omap_board_config_kernel innovator_config[] = {
224 { OMAP_TAG_USB, NULL }, 234 { OMAP_TAG_USB, NULL },
235 { OMAP_TAG_MMC, &innovator_mmc_config },
225}; 236};
226 237
227static void __init innovator_init(void) 238static void __init innovator_init(void)
diff --git a/arch/arm/mach-omap1/board-netstar.c b/arch/arm/mach-omap1/board-netstar.c
index 6750b2014092..d904e643f5ec 100644
--- a/arch/arm/mach-omap1/board-netstar.c
+++ b/arch/arm/mach-omap1/board-netstar.c
@@ -75,16 +75,15 @@ static void __init netstar_init(void)
75 mdelay(50); /* 50ms until PHY ready */ 75 mdelay(50); /* 50ms until PHY ready */
76 /* smc91x interrupt pin */ 76 /* smc91x interrupt pin */
77 omap_request_gpio(8); 77 omap_request_gpio(8);
78 omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
79 78
80 omap_request_gpio(12); 79 omap_request_gpio(12);
81 omap_request_gpio(13); 80 omap_request_gpio(13);
82 omap_request_gpio(14); 81 omap_request_gpio(14);
83 omap_request_gpio(15); 82 omap_request_gpio(15);
84 omap_set_gpio_edge_ctrl(12, OMAP_GPIO_FALLING_EDGE); 83 set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING);
85 omap_set_gpio_edge_ctrl(13, OMAP_GPIO_FALLING_EDGE); 84 set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING);
86 omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE); 85 set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING);
87 omap_set_gpio_edge_ctrl(15, OMAP_GPIO_FALLING_EDGE); 86 set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING);
88 87
89 platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices)); 88 platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices));
90 89
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c
index 6844e536c698..21103df50415 100644
--- a/arch/arm/mach-omap1/board-osk.c
+++ b/arch/arm/mach-omap1/board-osk.c
@@ -29,11 +29,16 @@
29#include <linux/kernel.h> 29#include <linux/kernel.h>
30#include <linux/init.h> 30#include <linux/init.h>
31#include <linux/device.h> 31#include <linux/device.h>
32#include <linux/interrupt.h>
33
34#include <linux/mtd/mtd.h>
35#include <linux/mtd/partitions.h>
32 36
33#include <asm/hardware.h> 37#include <asm/hardware.h>
34#include <asm/mach-types.h> 38#include <asm/mach-types.h>
35#include <asm/mach/arch.h> 39#include <asm/mach/arch.h>
36#include <asm/mach/map.h> 40#include <asm/mach/map.h>
41#include <asm/mach/flash.h>
37 42
38#include <asm/arch/gpio.h> 43#include <asm/arch/gpio.h>
39#include <asm/arch/usb.h> 44#include <asm/arch/usb.h>
@@ -41,12 +46,56 @@
41#include <asm/arch/tc.h> 46#include <asm/arch/tc.h>
42#include <asm/arch/common.h> 47#include <asm/arch/common.h>
43 48
44static struct map_desc osk5912_io_desc[] __initdata = { 49static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0};
45{ OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE, 50
46 MT_DEVICE }, 51static struct mtd_partition osk_partitions[] = {
52 /* bootloader (U-Boot, etc) in first sector */
53 {
54 .name = "bootloader",
55 .offset = 0,
56 .size = SZ_128K,
57 .mask_flags = MTD_WRITEABLE, /* force read-only */
58 },
59 /* bootloader params in the next sector */
60 {
61 .name = "params",
62 .offset = MTDPART_OFS_APPEND,
63 .size = SZ_128K,
64 .mask_flags = 0,
65 }, {
66 .name = "kernel",
67 .offset = MTDPART_OFS_APPEND,
68 .size = SZ_2M,
69 .mask_flags = 0
70 }, {
71 .name = "filesystem",
72 .offset = MTDPART_OFS_APPEND,
73 .size = MTDPART_SIZ_FULL,
74 .mask_flags = 0
75 }
47}; 76};
48 77
49static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0}; 78static struct flash_platform_data osk_flash_data = {
79 .map_name = "cfi_probe",
80 .width = 2,
81 .parts = osk_partitions,
82 .nr_parts = ARRAY_SIZE(osk_partitions),
83};
84
85static struct resource osk_flash_resource = {
86 /* this is on CS3, wherever it's mapped */
87 .flags = IORESOURCE_MEM,
88};
89
90static struct platform_device osk5912_flash_device = {
91 .name = "omapflash",
92 .id = 0,
93 .dev = {
94 .platform_data = &osk_flash_data,
95 },
96 .num_resources = 1,
97 .resource = &osk_flash_resource,
98};
50 99
51static struct resource osk5912_smc91x_resources[] = { 100static struct resource osk5912_smc91x_resources[] = {
52 [0] = { 101 [0] = {
@@ -86,9 +135,16 @@ static struct platform_device osk5912_cf_device = {
86 .resource = osk5912_cf_resources, 135 .resource = osk5912_cf_resources,
87}; 136};
88 137
138static struct platform_device osk5912_mcbsp1_device = {
139 .name = "omap_mcbsp",
140 .id = 1,
141};
142
89static struct platform_device *osk5912_devices[] __initdata = { 143static struct platform_device *osk5912_devices[] __initdata = {
144 &osk5912_flash_device,
90 &osk5912_smc91x_device, 145 &osk5912_smc91x_device,
91 &osk5912_cf_device, 146 &osk5912_cf_device,
147 &osk5912_mcbsp1_device,
92}; 148};
93 149
94static void __init osk_init_smc91x(void) 150static void __init osk_init_smc91x(void)
@@ -97,7 +153,6 @@ static void __init osk_init_smc91x(void)
97 printk("Error requesting gpio 0 for smc91x irq\n"); 153 printk("Error requesting gpio 0 for smc91x irq\n");
98 return; 154 return;
99 } 155 }
100 omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
101 156
102 /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */ 157 /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
103 EMIFS_CCS(1) |= 0x2; 158 EMIFS_CCS(1) |= 0x2;
@@ -110,11 +165,11 @@ static void __init osk_init_cf(void)
110 printk("Error requesting gpio 62 for CF irq\n"); 165 printk("Error requesting gpio 62 for CF irq\n");
111 return; 166 return;
112 } 167 }
113 /* it's really active-low */ 168 /* the CF I/O IRQ is really active-low */
114 omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE); 169 set_irq_type(OMAP_GPIO_IRQ(62), IRQT_FALLING);
115} 170}
116 171
117void osk_init_irq(void) 172static void __init osk_init_irq(void)
118{ 173{
119 omap_init_irq(); 174 omap_init_irq();
120 omap_gpio_init(); 175 omap_gpio_init();
@@ -142,18 +197,69 @@ static struct omap_board_config_kernel osk_config[] = {
142 { OMAP_TAG_USB, &osk_usb_config }, 197 { OMAP_TAG_USB, &osk_usb_config },
143}; 198};
144 199
200#ifdef CONFIG_OMAP_OSK_MISTRAL
201
202#ifdef CONFIG_PM
203static irqreturn_t
204osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs)
205{
206 return IRQ_HANDLED;
207}
208#endif
209
210static void __init osk_mistral_init(void)
211{
212 /* FIXME here's where to feed in framebuffer, touchpad, and
213 * keyboard setup ... not in the drivers for those devices!
214 *
215 * NOTE: we could actually tell if there's a Mistral board
216 * attached, e.g. by trying to read something from the ads7846.
217 * But this is too early for that...
218 */
219
220 /* the sideways button (SW1) is for use as a "wakeup" button */
221 omap_cfg_reg(N15_1610_MPUIO2);
222 if (omap_request_gpio(OMAP_MPUIO(2)) == 0) {
223 int ret = 0;
224 omap_set_gpio_direction(OMAP_MPUIO(2), 1);
225 set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING);
226#ifdef CONFIG_PM
227 /* share the IRQ in case someone wants to use the
228 * button for more than wakeup from system sleep.
229 */
230 ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)),
231 &osk_mistral_wake_interrupt,
232 SA_SHIRQ, "mistral_wakeup",
233 &osk_mistral_wake_interrupt);
234 if (ret != 0) {
235 omap_free_gpio(OMAP_MPUIO(2));
236 printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n",
237 ret);
238 } else
239 enable_irq_wake(OMAP_GPIO_IRQ(OMAP_MPUIO(2)));
240#endif
241 } else
242 printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n");
243}
244#else
245static void __init osk_mistral_init(void) { }
246#endif
247
145static void __init osk_init(void) 248static void __init osk_init(void)
146{ 249{
250 osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys();
251 osk_flash_resource.end += SZ_32M - 1;
147 platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); 252 platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices));
148 omap_board_config = osk_config; 253 omap_board_config = osk_config;
149 omap_board_config_size = ARRAY_SIZE(osk_config); 254 omap_board_config_size = ARRAY_SIZE(osk_config);
150 USB_TRANSCEIVER_CTRL_REG |= (3 << 1); 255 USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
256
257 osk_mistral_init();
151} 258}
152 259
153static void __init osk_map_io(void) 260static void __init osk_map_io(void)
154{ 261{
155 omap_map_common_io(); 262 omap_map_common_io();
156 iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc));
157 omap_serial_init(osk_serial_ports); 263 omap_serial_init(osk_serial_ports);
158} 264}
159 265
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c
index 213317392d9b..107c68c8ab54 100644
--- a/arch/arm/mach-omap1/board-perseus2.c
+++ b/arch/arm/mach-omap1/board-perseus2.c
@@ -24,6 +24,7 @@
24#include <asm/mach/flash.h> 24#include <asm/mach/flash.h>
25#include <asm/mach/map.h> 25#include <asm/mach/map.h>
26 26
27#include <asm/arch/tc.h>
27#include <asm/arch/gpio.h> 28#include <asm/arch/gpio.h>
28#include <asm/arch/mux.h> 29#include <asm/arch/mux.h>
29#include <asm/arch/fpga.h> 30#include <asm/arch/fpga.h>
@@ -83,8 +84,8 @@ static struct flash_platform_data p2_flash_data = {
83}; 84};
84 85
85static struct resource p2_flash_resource = { 86static struct resource p2_flash_resource = {
86 .start = OMAP_FLASH_0_START, 87 .start = OMAP_CS0_PHYS,
87 .end = OMAP_FLASH_0_START + OMAP_FLASH_0_SIZE - 1, 88 .end = OMAP_CS0_PHYS + SZ_32M - 1,
88 .flags = IORESOURCE_MEM, 89 .flags = IORESOURCE_MEM,
89}; 90};
90 91
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c
index e42281988990..bf30b1acda0b 100644
--- a/arch/arm/mach-omap1/board-voiceblue.c
+++ b/arch/arm/mach-omap1/board-voiceblue.c
@@ -25,13 +25,14 @@
25#include <asm/hardware.h> 25#include <asm/hardware.h>
26#include <asm/mach-types.h> 26#include <asm/mach-types.h>
27#include <asm/mach/arch.h> 27#include <asm/mach/arch.h>
28#include <asm/mach/flash.h>
28#include <asm/mach/map.h> 29#include <asm/mach/map.h>
29 30
31#include <asm/arch/common.h>
30#include <asm/arch/gpio.h> 32#include <asm/arch/gpio.h>
31#include <asm/arch/tc.h>
32#include <asm/arch/mux.h> 33#include <asm/arch/mux.h>
34#include <asm/arch/tc.h>
33#include <asm/arch/usb.h> 35#include <asm/arch/usb.h>
34#include <asm/arch/common.h>
35 36
36extern void omap_init_time(void); 37extern void omap_init_time(void);
37extern int omap_gpio_init(void); 38extern int omap_gpio_init(void);
@@ -74,7 +75,7 @@ static struct plat_serial8250_port voiceblue_ports[] = {
74 75
75static struct platform_device serial_device = { 76static struct platform_device serial_device = {
76 .name = "serial8250", 77 .name = "serial8250",
77 .id = 1, 78 .id = PLAT8250_DEV_PLATFORM1,
78 .dev = { 79 .dev = {
79 .platform_data = voiceblue_ports, 80 .platform_data = voiceblue_ports,
80 }, 81 },
@@ -86,6 +87,27 @@ static int __init ext_uart_init(void)
86} 87}
87arch_initcall(ext_uart_init); 88arch_initcall(ext_uart_init);
88 89
90static struct flash_platform_data voiceblue_flash_data = {
91 .map_name = "cfi_probe",
92 .width = 2,
93};
94
95static struct resource voiceblue_flash_resource = {
96 .start = OMAP_CS0_PHYS,
97 .end = OMAP_CS0_PHYS + SZ_32M - 1,
98 .flags = IORESOURCE_MEM,
99};
100
101static struct platform_device voiceblue_flash_device = {
102 .name = "omapflash",
103 .id = 0,
104 .dev = {
105 .platform_data = &voiceblue_flash_data,
106 },
107 .num_resources = 1,
108 .resource = &voiceblue_flash_resource,
109};
110
89static struct resource voiceblue_smc91x_resources[] = { 111static struct resource voiceblue_smc91x_resources[] = {
90 [0] = { 112 [0] = {
91 .start = OMAP_CS2_PHYS + 0x300, 113 .start = OMAP_CS2_PHYS + 0x300,
@@ -107,6 +129,7 @@ static struct platform_device voiceblue_smc91x_device = {
107}; 129};
108 130
109static struct platform_device *voiceblue_devices[] __initdata = { 131static struct platform_device *voiceblue_devices[] __initdata = {
132 &voiceblue_flash_device,
110 &voiceblue_smc91x_device, 133 &voiceblue_smc91x_device,
111}; 134};
112 135
@@ -119,8 +142,17 @@ static struct omap_usb_config voiceblue_usb_config __initdata = {
119 .pins[2] = 6, 142 .pins[2] = 6,
120}; 143};
121 144
145static struct omap_mmc_config voiceblue_mmc_config __initdata = {
146 .mmc[0] = {
147 .enabled = 1,
148 .power_pin = 2,
149 .switch_pin = -1,
150 },
151};
152
122static struct omap_board_config_kernel voiceblue_config[] = { 153static struct omap_board_config_kernel voiceblue_config[] = {
123 { OMAP_TAG_USB, &voiceblue_usb_config }, 154 { OMAP_TAG_USB, &voiceblue_usb_config },
155 { OMAP_TAG_MMC, &voiceblue_mmc_config },
124}; 156};
125 157
126static void __init voiceblue_init_irq(void) 158static void __init voiceblue_init_irq(void)
@@ -131,9 +163,6 @@ static void __init voiceblue_init_irq(void)
131 163
132static void __init voiceblue_init(void) 164static void __init voiceblue_init(void)
133{ 165{
134 /* There is a good chance board is going up, so enable Power LED
135 * (it is connected through invertor) */
136 omap_writeb(0x00, OMAP_LPG1_LCR);
137 /* Watchdog */ 166 /* Watchdog */
138 omap_request_gpio(0); 167 omap_request_gpio(0);
139 /* smc91x reset */ 168 /* smc91x reset */
@@ -145,7 +174,6 @@ static void __init voiceblue_init(void)
145 mdelay(50); /* 50ms until PHY ready */ 174 mdelay(50); /* 50ms until PHY ready */
146 /* smc91x interrupt pin */ 175 /* smc91x interrupt pin */
147 omap_request_gpio(8); 176 omap_request_gpio(8);
148 omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE);
149 /* 16C554 reset*/ 177 /* 16C554 reset*/
150 omap_request_gpio(6); 178 omap_request_gpio(6);
151 omap_set_gpio_direction(6, 0); 179 omap_set_gpio_direction(6, 0);
@@ -155,14 +183,19 @@ static void __init voiceblue_init(void)
155 omap_request_gpio(13); 183 omap_request_gpio(13);
156 omap_request_gpio(14); 184 omap_request_gpio(14);
157 omap_request_gpio(15); 185 omap_request_gpio(15);
158 omap_set_gpio_edge_ctrl(12, OMAP_GPIO_RISING_EDGE); 186 set_irq_type(OMAP_GPIO_IRQ(12), IRQT_RISING);
159 omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); 187 set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING);
160 omap_set_gpio_edge_ctrl(14, OMAP_GPIO_RISING_EDGE); 188 set_irq_type(OMAP_GPIO_IRQ(14), IRQT_RISING);
161 omap_set_gpio_edge_ctrl(15, OMAP_GPIO_RISING_EDGE); 189 set_irq_type(OMAP_GPIO_IRQ(15), IRQT_RISING);
162 190
163 platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices)); 191 platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
164 omap_board_config = voiceblue_config; 192 omap_board_config = voiceblue_config;
165 omap_board_config_size = ARRAY_SIZE(voiceblue_config); 193 omap_board_config_size = ARRAY_SIZE(voiceblue_config);
194
195 /* There is a good chance board is going up, so enable power LED
196 * (it is connected through invertor) */
197 omap_writeb(0x00, OMAP_LPG1_LCR);
198 omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */
166} 199}
167 200
168static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1}; 201static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1};
@@ -184,9 +217,9 @@ static int panic_event(struct notifier_block *this, unsigned long event,
184 if (test_and_set_bit(MACHINE_PANICED, &machine_state)) 217 if (test_and_set_bit(MACHINE_PANICED, &machine_state))
185 return NOTIFY_DONE; 218 return NOTIFY_DONE;
186 219
187 /* Flash Power LED 220 /* Flash power LED */
188 * (TODO: Enable clock right way (enabled in bootloader already)) */
189 omap_writeb(0x78, OMAP_LPG1_LCR); 221 omap_writeb(0x78, OMAP_LPG1_LCR);
222 omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */
190 223
191 return NOTIFY_DONE; 224 return NOTIFY_DONE;
192} 225}
@@ -195,15 +228,14 @@ static struct notifier_block panic_block = {
195 .notifier_call = panic_event, 228 .notifier_call = panic_event,
196}; 229};
197 230
198static int __init setup_notifier(void) 231static int __init voiceblue_setup(void)
199{ 232{
200 /* Setup panic notifier */ 233 /* Setup panic notifier */
201 notifier_chain_register(&panic_notifier_list, &panic_block); 234 notifier_chain_register(&panic_notifier_list, &panic_block);
202 235
203 return 0; 236 return 0;
204} 237}
205 238postcore_initcall(voiceblue_setup);
206postcore_initcall(setup_notifier);
207 239
208static int wdt_gpio_state; 240static int wdt_gpio_state;
209 241
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c
new file mode 100644
index 000000000000..e8b3981444cd
--- /dev/null
+++ b/arch/arm/mach-omap1/devices.c
@@ -0,0 +1,351 @@
1/*
2 * linux/arch/arm/mach-omap1/devices.c
3 *
4 * OMAP1 platform device setup/initialization
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12#include <linux/config.h>
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/device.h>
17
18#include <asm/hardware.h>
19#include <asm/io.h>
20#include <asm/mach-types.h>
21#include <asm/mach/map.h>
22
23#include <asm/arch/tc.h>
24#include <asm/arch/board.h>
25#include <asm/arch/mux.h>
26#include <asm/arch/gpio.h>
27
28
29static void omap_nop_release(struct device *dev)
30{
31 /* Nothing */
32}
33
34/*-------------------------------------------------------------------------*/
35
36#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
37
38#define OMAP_I2C_BASE 0xfffb3800
39
40static struct resource i2c_resources[] = {
41 {
42 .start = OMAP_I2C_BASE,
43 .end = OMAP_I2C_BASE + 0x3f,
44 .flags = IORESOURCE_MEM,
45 },
46 {
47 .start = INT_I2C,
48 .flags = IORESOURCE_IRQ,
49 },
50};
51
52/* DMA not used; works around erratum writing to non-empty i2c fifo */
53
54static struct platform_device omap_i2c_device = {
55 .name = "i2c_omap",
56 .id = -1,
57 .dev = {
58 .release = omap_nop_release,
59 },
60 .num_resources = ARRAY_SIZE(i2c_resources),
61 .resource = i2c_resources,
62};
63
64static void omap_init_i2c(void)
65{
66 /* FIXME define and use a boot tag, in case of boards that
67 * either don't wire up I2C, or chips that mux it differently...
68 * it can include clocking and address info, maybe more.
69 */
70 omap_cfg_reg(I2C_SCL);
71 omap_cfg_reg(I2C_SDA);
72
73 (void) platform_device_register(&omap_i2c_device);
74}
75#else
76static inline void omap_init_i2c(void) {}
77#endif
78
79/*-------------------------------------------------------------------------*/
80
81#if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE)
82
83static u64 irda_dmamask = 0xffffffff;
84
85static struct platform_device omap1610ir_device = {
86 .name = "omap1610-ir",
87 .id = -1,
88 .dev = {
89 .release = omap_nop_release,
90 .dma_mask = &irda_dmamask,
91 },
92};
93
94static void omap_init_irda(void)
95{
96 /* FIXME define and use a boot tag, members something like:
97 * u8 uart; // uart1, or uart3
98 * ... but driver only handles uart3 for now
99 * s16 fir_sel; // gpio for SIR vs FIR
100 * ... may prefer a callback for SIR/MIR/FIR mode select;
101 * while h2 uses a GPIO, H3 uses a gpio expander
102 */
103 if (machine_is_omap_h2()
104 || machine_is_omap_h3())
105 (void) platform_device_register(&omap1610ir_device);
106}
107#else
108static inline void omap_init_irda(void) {}
109#endif
110
111/*-------------------------------------------------------------------------*/
112
113#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
114
115#define OMAP_MMC1_BASE 0xfffb7800
116#define OMAP_MMC2_BASE 0xfffb7c00 /* omap16xx only */
117
118static struct omap_mmc_conf mmc1_conf;
119
120static u64 mmc1_dmamask = 0xffffffff;
121
122static struct resource mmc1_resources[] = {
123 {
124 .start = IO_ADDRESS(OMAP_MMC1_BASE),
125 .end = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
126 .flags = IORESOURCE_MEM,
127 },
128 {
129 .start = INT_MMC,
130 .flags = IORESOURCE_IRQ,
131 },
132};
133
134static struct platform_device mmc_omap_device1 = {
135 .name = "mmci-omap",
136 .id = 1,
137 .dev = {
138 .release = omap_nop_release,
139 .dma_mask = &mmc1_dmamask,
140 .platform_data = &mmc1_conf,
141 },
142 .num_resources = ARRAY_SIZE(mmc1_resources),
143 .resource = mmc1_resources,
144};
145
146#ifdef CONFIG_ARCH_OMAP16XX
147
148static struct omap_mmc_conf mmc2_conf;
149
150static u64 mmc2_dmamask = 0xffffffff;
151
152static struct resource mmc2_resources[] = {
153 {
154 .start = IO_ADDRESS(OMAP_MMC2_BASE),
155 .end = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
156 .flags = IORESOURCE_MEM,
157 },
158 {
159 .start = INT_1610_MMC2,
160 .flags = IORESOURCE_IRQ,
161 },
162};
163
164static struct platform_device mmc_omap_device2 = {
165 .name = "mmci-omap",
166 .id = 2,
167 .dev = {
168 .release = omap_nop_release,
169 .dma_mask = &mmc2_dmamask,
170 .platform_data = &mmc2_conf,
171 },
172 .num_resources = ARRAY_SIZE(mmc2_resources),
173 .resource = mmc2_resources,
174};
175#endif
176
177static void __init omap_init_mmc(void)
178{
179 const struct omap_mmc_config *mmc_conf;
180 const struct omap_mmc_conf *mmc;
181
182 /* NOTE: assumes MMC was never (wrongly) enabled */
183 mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config);
184 if (!mmc_conf)
185 return;
186
187 /* block 1 is always available and has just one pinout option */
188 mmc = &mmc_conf->mmc[0];
189 if (mmc->enabled) {
190 omap_cfg_reg(MMC_CMD);
191 omap_cfg_reg(MMC_CLK);
192 omap_cfg_reg(MMC_DAT0);
193 if (cpu_is_omap1710()) {
194 omap_cfg_reg(M15_1710_MMC_CLKI);
195 omap_cfg_reg(P19_1710_MMC_CMDDIR);
196 omap_cfg_reg(P20_1710_MMC_DATDIR0);
197 }
198 if (mmc->wire4) {
199 omap_cfg_reg(MMC_DAT1);
200 /* NOTE: DAT2 can be on W10 (here) or M15 */
201 if (!mmc->nomux)
202 omap_cfg_reg(MMC_DAT2);
203 omap_cfg_reg(MMC_DAT3);
204 }
205 mmc1_conf = *mmc;
206 (void) platform_device_register(&mmc_omap_device1);
207 }
208
209#ifdef CONFIG_ARCH_OMAP16XX
210 /* block 2 is on newer chips, and has many pinout options */
211 mmc = &mmc_conf->mmc[1];
212 if (mmc->enabled) {
213 if (!mmc->nomux) {
214 omap_cfg_reg(Y8_1610_MMC2_CMD);
215 omap_cfg_reg(Y10_1610_MMC2_CLK);
216 omap_cfg_reg(R18_1610_MMC2_CLKIN);
217 omap_cfg_reg(W8_1610_MMC2_DAT0);
218 if (mmc->wire4) {
219 omap_cfg_reg(V8_1610_MMC2_DAT1);
220 omap_cfg_reg(W15_1610_MMC2_DAT2);
221 omap_cfg_reg(R10_1610_MMC2_DAT3);
222 }
223
224 /* These are needed for the level shifter */
225 omap_cfg_reg(V9_1610_MMC2_CMDDIR);
226 omap_cfg_reg(V5_1610_MMC2_DATDIR0);
227 omap_cfg_reg(W19_1610_MMC2_DATDIR1);
228 }
229
230 /* Feedback clock must be set on OMAP-1710 MMC2 */
231 if (cpu_is_omap1710())
232 omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
233 MOD_CONF_CTRL_1);
234 mmc2_conf = *mmc;
235 (void) platform_device_register(&mmc_omap_device2);
236 }
237#endif
238 return;
239}
240#else
241static inline void omap_init_mmc(void) {}
242#endif
243
244#if defined(CONFIG_OMAP_RTC) || defined(CONFIG_OMAP_RTC)
245
246#define OMAP_RTC_BASE 0xfffb4800
247
248static struct resource rtc_resources[] = {
249 {
250 .start = OMAP_RTC_BASE,
251 .end = OMAP_RTC_BASE + 0x5f,
252 .flags = IORESOURCE_MEM,
253 },
254 {
255 .start = INT_RTC_TIMER,
256 .flags = IORESOURCE_IRQ,
257 },
258 {
259 .start = INT_RTC_ALARM,
260 .flags = IORESOURCE_IRQ,
261 },
262};
263
264static struct platform_device omap_rtc_device = {
265 .name = "omap_rtc",
266 .id = -1,
267 .dev = {
268 .release = omap_nop_release,
269 },
270 .num_resources = ARRAY_SIZE(rtc_resources),
271 .resource = rtc_resources,
272};
273
274static void omap_init_rtc(void)
275{
276 (void) platform_device_register(&omap_rtc_device);
277}
278#else
279static inline void omap_init_rtc(void) {}
280#endif
281
282/*-------------------------------------------------------------------------*/
283
284#if defined(CONFIG_OMAP16XX_WATCHDOG) || defined(CONFIG_OMAP16XX_WATCHDOG_MODULE)
285
286#define OMAP_WDT_BASE 0xfffeb000
287
288static struct resource wdt_resources[] = {
289 {
290 .start = OMAP_WDT_BASE,
291 .end = OMAP_WDT_BASE + 0x4f,
292 .flags = IORESOURCE_MEM,
293 },
294};
295
296static struct platform_device omap_wdt_device = {
297 .name = "omap1610_wdt",
298 .id = -1,
299 .dev = {
300 .release = omap_nop_release,
301 },
302 .num_resources = ARRAY_SIZE(wdt_resources),
303 .resource = wdt_resources,
304};
305
306static void omap_init_wdt(void)
307{
308 (void) platform_device_register(&omap_wdt_device);
309}
310#else
311static inline void omap_init_wdt(void) {}
312#endif
313
314
315/*-------------------------------------------------------------------------*/
316
317/*
318 * This gets called after board-specific INIT_MACHINE, and initializes most
319 * on-chip peripherals accessible on this board (except for few like USB):
320 *
321 * (a) Does any "standard config" pin muxing needed. Board-specific
322 * code will have muxed GPIO pins and done "nonstandard" setup;
323 * that code could live in the boot loader.
324 * (b) Populating board-specific platform_data with the data drivers
325 * rely on to handle wiring variations.
326 * (c) Creating platform devices as meaningful on this board and
327 * with this kernel configuration.
328 *
329 * Claiming GPIOs, and setting their direction and initial values, is the
330 * responsibility of the device drivers. So is responding to probe().
331 *
332 * Board-specific knowlege like creating devices or pin setup is to be
333 * kept out of drivers as much as possible. In particular, pin setup
334 * may be handled by the boot loader, and drivers should expect it will
335 * normally have been done by the time they're probed.
336 */
337static int __init omap_init_devices(void)
338{
339 /* please keep these calls, and their implementations above,
340 * in alphabetical order so they're easier to sort through.
341 */
342 omap_init_i2c();
343 omap_init_irda();
344 omap_init_mmc();
345 omap_init_rtc();
346 omap_init_wdt();
347
348 return 0;
349}
350arch_initcall(omap_init_devices);
351
diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c
index c12a78335625..aca2a120813a 100644
--- a/arch/arm/mach-omap1/fpga.c
+++ b/arch/arm/mach-omap1/fpga.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/fpga.c 2 * linux/arch/arm/mach-omap1/fpga.c
3 * 3 *
4 * Interrupt handler for OMAP-1510 Innovator FPGA 4 * Interrupt handler for OMAP-1510 Innovator FPGA
5 * 5 *
@@ -181,7 +181,7 @@ void omap1510_fpga_init_irq(void)
181 */ 181 */
182 omap_request_gpio(13); 182 omap_request_gpio(13);
183 omap_set_gpio_direction(13, 1); 183 omap_set_gpio_direction(13, 1);
184 omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); 184 set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING);
185 set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux); 185 set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux);
186} 186}
187 187
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c
index 207df0fe934d..eb8261d7dead 100644
--- a/arch/arm/mach-omap1/io.c
+++ b/arch/arm/mach-omap1/io.c
@@ -19,6 +19,7 @@
19 19
20extern int clk_init(void); 20extern int clk_init(void);
21extern void omap_check_revision(void); 21extern void omap_check_revision(void);
22extern void omap_sram_init(void);
22 23
23/* 24/*
24 * The machine specific code may provide the extra mapping besides the 25 * The machine specific code may provide the extra mapping besides the
@@ -32,7 +33,6 @@ static struct map_desc omap_io_desc[] __initdata = {
32static struct map_desc omap730_io_desc[] __initdata = { 33static struct map_desc omap730_io_desc[] __initdata = {
33 { OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE }, 34 { OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE },
34 { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE }, 35 { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE },
35 { OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE }
36}; 36};
37#endif 37#endif
38 38
@@ -40,27 +40,13 @@ static struct map_desc omap730_io_desc[] __initdata = {
40static struct map_desc omap1510_io_desc[] __initdata = { 40static struct map_desc omap1510_io_desc[] __initdata = {
41 { OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE }, 41 { OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE },
42 { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE }, 42 { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE },
43 { OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE }
44}; 43};
45#endif 44#endif
46 45
47#if defined(CONFIG_ARCH_OMAP16XX) 46#if defined(CONFIG_ARCH_OMAP16XX)
48static struct map_desc omap1610_io_desc[] __initdata = { 47static struct map_desc omap16xx_io_desc[] __initdata = {
49 { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, 48 { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
50 { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, 49 { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
51 { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE }
52};
53
54static struct map_desc omap5912_io_desc[] __initdata = {
55 { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE },
56 { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE },
57/*
58 * The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page
59 * size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped.
60 * Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte
61 * can be used.
62 */
63 { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE }
64}; 50};
65#endif 51#endif
66 52
@@ -86,14 +72,13 @@ static void __init _omap_map_io(void)
86 } 72 }
87#endif 73#endif
88#if defined(CONFIG_ARCH_OMAP16XX) 74#if defined(CONFIG_ARCH_OMAP16XX)
89 if (cpu_is_omap1610() || cpu_is_omap1710()) { 75 if (cpu_is_omap16xx()) {
90 iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc)); 76 iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc));
91 }
92 if (cpu_is_omap5912()) {
93 iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc));
94 } 77 }
95#endif 78#endif
96 79
80 omap_sram_init();
81
97 /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort 82 /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
98 * on a Posted Write in the TIPB Bridge". 83 * on a Posted Write in the TIPB Bridge".
99 */ 84 */
@@ -108,8 +93,9 @@ static void __init _omap_map_io(void)
108/* 93/*
109 * This should only get called from board specific init 94 * This should only get called from board specific init
110 */ 95 */
111void omap_map_common_io(void) 96void __init omap_map_common_io(void)
112{ 97{
113 if (!initialized) 98 if (!initialized)
114 _omap_map_io(); 99 _omap_map_io();
115} 100}
101
diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c
index afd5d67e4ae7..192ce6055faa 100644
--- a/arch/arm/mach-omap1/irq.c
+++ b/arch/arm/mach-omap1/irq.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/irq.c 2 * linux/arch/arm/mach-omap1/irq.c
3 * 3 *
4 * Interrupt handler for all OMAP boards 4 * Interrupt handler for all OMAP boards
5 * 5 *
diff --git a/arch/arm/mach-omap1/leds-h2p2-debug.c b/arch/arm/mach-omap1/leds-h2p2-debug.c
index ec0d8285f243..be283cda63dd 100644
--- a/arch/arm/mach-omap1/leds-h2p2-debug.c
+++ b/arch/arm/mach-omap1/leds-h2p2-debug.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/leds-h2p2-debug.c 2 * linux/arch/arm/mach-omap1/leds-h2p2-debug.c
3 * 3 *
4 * Copyright 2003 by Texas Instruments Incorporated 4 * Copyright 2003 by Texas Instruments Incorporated
5 * 5 *
@@ -13,6 +13,7 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/kernel_stat.h> 14#include <linux/kernel_stat.h>
15#include <linux/sched.h> 15#include <linux/sched.h>
16#include <linux/version.h>
16 17
17#include <asm/io.h> 18#include <asm/io.h>
18#include <asm/hardware.h> 19#include <asm/hardware.h>
diff --git a/arch/arm/mach-omap1/leds-innovator.c b/arch/arm/mach-omap1/leds-innovator.c
index 8043b7d0f66e..c8ffd1ddcded 100644
--- a/arch/arm/mach-omap1/leds-innovator.c
+++ b/arch/arm/mach-omap1/leds-innovator.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/leds-innovator.c 2 * linux/arch/arm/mach-omap1/leds-innovator.c
3 */ 3 */
4#include <linux/config.h> 4#include <linux/config.h>
5#include <linux/init.h> 5#include <linux/init.h>
diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c
index 4a0e8b9d4fc3..2c8bda847c18 100644
--- a/arch/arm/mach-omap1/leds-osk.c
+++ b/arch/arm/mach-omap1/leds-osk.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/leds-osk.c 2 * linux/arch/arm/mach-omap1/leds-osk.c
3 * 3 *
4 * LED driver for OSK, and optionally Mistral QVGA, boards 4 * LED driver for OSK, and optionally Mistral QVGA, boards
5 */ 5 */
@@ -64,7 +64,7 @@ static void tps_work(void *unused)
64 64
65static DECLARE_WORK(work, tps_work, NULL); 65static DECLARE_WORK(work, tps_work, NULL);
66 66
67#ifdef CONFIG_FB_OMAP 67#ifdef CONFIG_OMAP_OSK_MISTRAL
68 68
69/* For now, all system indicators require the Mistral board, since that 69/* For now, all system indicators require the Mistral board, since that
70 * LED can be manipulated without a task context. This LED is either red, 70 * LED can be manipulated without a task context. This LED is either red,
@@ -127,7 +127,7 @@ void osk_leds_event(led_event_t evt)
127 hw_led_state = 0; 127 hw_led_state = 0;
128 break; 128 break;
129 129
130#ifdef CONFIG_FB_OMAP 130#ifdef CONFIG_OMAP_OSK_MISTRAL
131 131
132 case led_timer: 132 case led_timer:
133 hw_led_state ^= TIMER_LED; 133 hw_led_state ^= TIMER_LED;
@@ -144,7 +144,7 @@ void osk_leds_event(led_event_t evt)
144 mistral_setled(); 144 mistral_setled();
145 break; 145 break;
146 146
147#endif /* CONFIG_FB_OMAP */ 147#endif /* CONFIG_OMAP_OSK_MISTRAL */
148 148
149 /* "green" == tps LED1 (leftmost, normally power-good) 149 /* "green" == tps LED1 (leftmost, normally power-good)
150 * works only with DC adapter, not on battery power! 150 * works only with DC adapter, not on battery power!
diff --git a/arch/arm/mach-omap1/leds.c b/arch/arm/mach-omap1/leds.c
index 8ab21fe98e1b..5c6b1bb6e722 100644
--- a/arch/arm/mach-omap1/leds.c
+++ b/arch/arm/mach-omap1/leds.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * linux/arch/arm/mach-omap/leds.c 2 * linux/arch/arm/mach-omap1/leds.c
3 * 3 *
4 * OMAP LEDs dispatcher 4 * OMAP LEDs dispatcher
5 */ 5 */
@@ -20,7 +20,9 @@ omap_leds_init(void)
20 if (machine_is_omap_innovator()) 20 if (machine_is_omap_innovator())
21 leds_event = innovator_leds_event; 21 leds_event = innovator_leds_event;
22 22
23 else if (machine_is_omap_h2() || machine_is_omap_perseus2()) 23 else if (machine_is_omap_h2()
24 || machine_is_omap_h3()
25 || machine_is_omap_perseus2())
24 leds_event = h2p2_dbg_leds_event; 26 leds_event = h2p2_dbg_leds_event;
25 27
26 else if (machine_is_omap_osk()) 28 else if (machine_is_omap_osk())
@@ -30,8 +32,12 @@ omap_leds_init(void)
30 return -1; 32 return -1;
31 33
32 if (machine_is_omap_h2() 34 if (machine_is_omap_h2()
35 || machine_is_omap_h3()
33 || machine_is_omap_perseus2() 36 || machine_is_omap_perseus2()
34 || machine_is_omap_osk()) { 37#ifdef CONFIG_OMAP_OSK_MISTRAL
38 || machine_is_omap_osk()
39#endif
40 ) {
35 41
36 /* LED1/LED2 pins can be used as GPIO (as done here), or by 42 /* LED1/LED2 pins can be used as GPIO (as done here), or by
37 * the LPG (works even in deep sleep!), to drive a bicolor 43 * the LPG (works even in deep sleep!), to drive a bicolor
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c
index 214e5d17c8b5..40c4f7c40e73 100644
--- a/arch/arm/mach-omap1/serial.c
+++ b/arch/arm/mach-omap1/serial.c
@@ -24,7 +24,11 @@
24 24
25#include <asm/arch/board.h> 25#include <asm/arch/board.h>
26#include <asm/arch/mux.h> 26#include <asm/arch/mux.h>
27#include <asm/arch/gpio.h>
27#include <asm/arch/fpga.h> 28#include <asm/arch/fpga.h>
29#ifdef CONFIG_PM
30#include <asm/arch/pm.h>
31#endif
28 32
29static struct clk * uart1_ck = NULL; 33static struct clk * uart1_ck = NULL;
30static struct clk * uart2_ck = NULL; 34static struct clk * uart2_ck = NULL;
@@ -94,7 +98,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
94 98
95static struct platform_device serial_device = { 99static struct platform_device serial_device = {
96 .name = "serial8250", 100 .name = "serial8250",
97 .id = 0, 101 .id = PLAT8250_DEV_PLATFORM,
98 .dev = { 102 .dev = {
99 .platform_data = serial_platform_data, 103 .platform_data = serial_platform_data,
100 }, 104 },
@@ -193,6 +197,86 @@ void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS])
193 } 197 }
194} 198}
195 199
200#ifdef CONFIG_OMAP_SERIAL_WAKE
201
202static irqreturn_t omap_serial_wake_interrupt(int irq, void *dev_id,
203 struct pt_regs *regs)
204{
205 /* Need to do something with serial port right after wake-up? */
206 return IRQ_HANDLED;
207}
208
209/*
210 * Reroutes serial RX lines to GPIO lines for the duration of
211 * sleep to allow waking up the device from serial port even
212 * in deep sleep.
213 */
214void omap_serial_wake_trigger(int enable)
215{
216 if (!cpu_is_omap16xx())
217 return;
218
219 if (uart1_ck != NULL) {
220 if (enable)
221 omap_cfg_reg(V14_16XX_GPIO37);
222 else
223 omap_cfg_reg(V14_16XX_UART1_RX);
224 }
225 if (uart2_ck != NULL) {
226 if (enable)
227 omap_cfg_reg(R9_16XX_GPIO18);
228 else
229 omap_cfg_reg(R9_16XX_UART2_RX);
230 }
231 if (uart3_ck != NULL) {
232 if (enable)
233 omap_cfg_reg(L14_16XX_GPIO49);
234 else
235 omap_cfg_reg(L14_16XX_UART3_RX);
236 }
237}
238
239static void __init omap_serial_set_port_wakeup(int gpio_nr)
240{
241 int ret;
242
243 ret = omap_request_gpio(gpio_nr);
244 if (ret < 0) {
245 printk(KERN_ERR "Could not request UART wake GPIO: %i\n",
246 gpio_nr);
247 return;
248 }
249 omap_set_gpio_direction(gpio_nr, 1);
250 set_irq_type(OMAP_GPIO_IRQ(gpio_nr), IRQT_RISING);
251 ret = request_irq(OMAP_GPIO_IRQ(gpio_nr), &omap_serial_wake_interrupt,
252 0, "serial wakeup", NULL);
253 if (ret) {
254 omap_free_gpio(gpio_nr);
255 printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n",
256 gpio_nr);
257 return;
258 }
259 enable_irq_wake(OMAP_GPIO_IRQ(gpio_nr));
260}
261
262static int __init omap_serial_wakeup_init(void)
263{
264 if (!cpu_is_omap16xx())
265 return 0;
266
267 if (uart1_ck != NULL)
268 omap_serial_set_port_wakeup(37);
269 if (uart2_ck != NULL)
270 omap_serial_set_port_wakeup(18);
271 if (uart3_ck != NULL)
272 omap_serial_set_port_wakeup(49);
273
274 return 0;
275}
276late_initcall(omap_serial_wakeup_init);
277
278#endif /* CONFIG_OMAP_SERIAL_WAKE */
279
196static int __init omap_init(void) 280static int __init omap_init(void)
197{ 281{
198 return platform_device_register(&serial_device); 282 return platform_device_register(&serial_device);
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c
index d540539c9bbb..191a9b1ee9b7 100644
--- a/arch/arm/mach-omap1/time.c
+++ b/arch/arm/mach-omap1/time.c
@@ -247,13 +247,6 @@ unsigned long long sched_clock(void)
247#define OMAP_32K_TIMER_TCR 0x04 247#define OMAP_32K_TIMER_TCR 0x04
248 248
249#define OMAP_32K_TICKS_PER_HZ (32768 / HZ) 249#define OMAP_32K_TICKS_PER_HZ (32768 / HZ)
250#if (32768 % HZ) != 0
251/* We cannot ignore modulo.
252 * Potential error can be as high as several percent.
253 */
254#define OMAP_32K_TICK_MODULO (32768 % HZ)
255static unsigned modulo_count = 0; /* Counts 1/HZ units */
256#endif
257 250
258/* 251/*
259 * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1 252 * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1
@@ -296,13 +289,22 @@ static inline void omap_32k_timer_stop(void)
296} 289}
297 290
298/* 291/*
299 * Rounds down to nearest usec 292 * Rounds down to nearest usec. Note that this will overflow for larger values.
300 */ 293 */
301static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k) 294static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k)
302{ 295{
303 return (ticks_32k * 5*5*5*5*5*5) >> 9; 296 return (ticks_32k * 5*5*5*5*5*5) >> 9;
304} 297}
305 298
299/*
300 * Rounds down to nearest nsec.
301 */
302static inline unsigned long long
303omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
304{
305 return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9;
306}
307
306static unsigned long omap_32k_last_tick = 0; 308static unsigned long omap_32k_last_tick = 0;
307 309
308/* 310/*
@@ -315,6 +317,15 @@ static unsigned long omap_32k_timer_gettimeoffset(void)
315} 317}
316 318
317/* 319/*
320 * Returns current time from boot in nsecs. It's OK for this to wrap
321 * around for now, as it's just a relative time stamp.
322 */
323unsigned long long sched_clock(void)
324{
325 return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read());
326}
327
328/*
318 * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this 329 * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this
319 * function is also called from other interrupts to remove latency 330 * function is also called from other interrupts to remove latency
320 * issues with dynamic tick. In the dynamic tick case, we need to lock 331 * issues with dynamic tick. In the dynamic tick case, we need to lock
@@ -330,19 +341,6 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
330 now = omap_32k_sync_timer_read(); 341 now = omap_32k_sync_timer_read();
331 342
332 while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) { 343 while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) {
333#ifdef OMAP_32K_TICK_MODULO
334 /* Modulo addition may put omap_32k_last_tick ahead of now
335 * and cause unwanted repetition of the while loop.
336 */
337 if (unlikely(now - omap_32k_last_tick == ~0))
338 break;
339
340 modulo_count += OMAP_32K_TICK_MODULO;
341 if (modulo_count > HZ) {
342 ++omap_32k_last_tick;
343 modulo_count -= HZ;
344 }
345#endif
346 omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ; 344 omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ;
347 timer_tick(regs); 345 timer_tick(regs);
348 } 346 }
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c
index a10268618f74..e3587efec4bf 100644
--- a/arch/arm/mach-rpc/riscpc.c
+++ b/arch/arm/mach-rpc/riscpc.c
@@ -140,7 +140,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
140 140
141static struct platform_device serial_device = { 141static struct platform_device serial_device = {
142 .name = "serial8250", 142 .name = "serial8250",
143 .id = 0, 143 .id = PLAT8250_DEV_PLATFORM,
144 .dev = { 144 .dev = {
145 .platform_data = serial_platform_data, 145 .platform_data = serial_platform_data,
146 }, 146 },
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c
index e9182242da95..1a3367da6408 100644
--- a/arch/arm/mach-s3c2410/mach-bast.c
+++ b/arch/arm/mach-s3c2410/mach-bast.c
@@ -381,7 +381,7 @@ static struct plat_serial8250_port bast_sio_data[] = {
381 381
382static struct platform_device bast_sio = { 382static struct platform_device bast_sio = {
383 .name = "serial8250", 383 .name = "serial8250",
384 .id = 0, 384 .id = PLAT8250_DEV_PLATFORM,
385 .dev = { 385 .dev = {
386 .platform_data = &bast_sio_data, 386 .platform_data = &bast_sio_data,
387 }, 387 },
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c
index 924e8464c212..8f9ab2893df4 100644
--- a/arch/arm/mach-s3c2410/mach-vr1000.c
+++ b/arch/arm/mach-s3c2410/mach-vr1000.c
@@ -221,7 +221,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
221 221
222static struct platform_device serial_device = { 222static struct platform_device serial_device = {
223 .name = "serial8250", 223 .name = "serial8250",
224 .id = 0, 224 .id = PLAT8250_DEV_PLATFORM,
225 .dev = { 225 .dev = {
226 .platform_data = serial_platform_data, 226 .platform_data = serial_platform_data,
227 }, 227 },
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c
index e737eae4521f..946c0d11c73b 100644
--- a/arch/arm/mach-shark/core.c
+++ b/arch/arm/mach-shark/core.c
@@ -41,7 +41,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
41 41
42static struct platform_device serial_device = { 42static struct platform_device serial_device = {
43 .name = "serial8250", 43 .name = "serial8250",
44 .id = 0, 44 .id = PLAT8250_DEV_PLATFORM,
45 .dev = { 45 .dev = {
46 .platform_data = serial_platform_data, 46 .platform_data = serial_platform_data,
47 }, 47 },
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
index 191788fb18d1..b0208c992576 100644
--- a/arch/arm/mm/flush.c
+++ b/arch/arm/mm/flush.c
@@ -16,6 +16,58 @@
16#include <asm/tlbflush.h> 16#include <asm/tlbflush.h>
17 17
18#ifdef CONFIG_CPU_CACHE_VIPT 18#ifdef CONFIG_CPU_CACHE_VIPT
19
20void flush_cache_mm(struct mm_struct *mm)
21{
22 if (cache_is_vivt()) {
23 if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
24 __cpuc_flush_user_all();
25 return;
26 }
27
28 if (cache_is_vipt_aliasing()) {
29 asm( "mcr p15, 0, %0, c7, c14, 0\n"
30 " mcr p15, 0, %0, c7, c5, 0\n"
31 " mcr p15, 0, %0, c7, c10, 4"
32 :
33 : "r" (0)
34 : "cc");
35 }
36}
37
38void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
39{
40 if (cache_is_vivt()) {
41 if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask))
42 __cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end),
43 vma->vm_flags);
44 return;
45 }
46
47 if (cache_is_vipt_aliasing()) {
48 asm( "mcr p15, 0, %0, c7, c14, 0\n"
49 " mcr p15, 0, %0, c7, c5, 0\n"
50 " mcr p15, 0, %0, c7, c10, 4"
51 :
52 : "r" (0)
53 : "cc");
54 }
55}
56
57void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn)
58{
59 if (cache_is_vivt()) {
60 if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
61 unsigned long addr = user_addr & PAGE_MASK;
62 __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
63 }
64 return;
65 }
66
67 if (cache_is_vipt_aliasing())
68 flush_pfn_alias(pfn, user_addr);
69}
70
19#define ALIAS_FLUSH_START 0xffff4000 71#define ALIAS_FLUSH_START 0xffff4000
20 72
21#define TOP_PTE(x) pte_offset_kernel(top_pmd, x) 73#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c
index bf02b5026e62..8ef38544453c 100644
--- a/arch/i386/kernel/cpu/cpufreq/longhaul.c
+++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c
@@ -467,11 +467,11 @@ static void __init longhaul_setup_voltagescaling(void)
467 } 467 }
468 468
469 if (vrmrev==0) { 469 if (vrmrev==0) {
470 dprintk ("VRM 8.5 \n"); 470 dprintk ("VRM 8.5\n");
471 memcpy (voltage_table, vrm85scales, sizeof(voltage_table)); 471 memcpy (voltage_table, vrm85scales, sizeof(voltage_table));
472 numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25; 472 numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25;
473 } else { 473 } else {
474 dprintk ("Mobile VRM \n"); 474 dprintk ("Mobile VRM\n");
475 memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table)); 475 memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table));
476 numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5; 476 numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5;
477 } 477 }
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
index 327a55d4d1c6..c397b6220430 100644
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
@@ -259,7 +259,7 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy)
259 259
260 if (model->op_points == NULL) { 260 if (model->op_points == NULL) {
261 /* Matched a non-match */ 261 /* Matched a non-match */
262 dprintk(KERN_INFO PFX "no table support for CPU model \"%s\": \n", 262 dprintk(KERN_INFO PFX "no table support for CPU model \"%s\"\n",
263 cpu->x86_model_id); 263 cpu->x86_model_id);
264#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI 264#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
265 dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); 265 dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
@@ -402,7 +402,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
402 402
403 for (i=0; i<p.state_count; i++) { 403 for (i=0; i<p.state_count; i++) {
404 if (p.states[i].control != p.states[i].status) { 404 if (p.states[i].control != p.states[i].status) {
405 dprintk("Different control (%x) and status values (%x)\n", 405 dprintk("Different control (%llu) and status values (%llu)\n",
406 p.states[i].control, p.states[i].status); 406 p.states[i].control, p.states[i].status);
407 result = -EINVAL; 407 result = -EINVAL;
408 goto err_unreg; 408 goto err_unreg;
@@ -415,7 +415,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
415 } 415 }
416 416
417 if (p.states[i].core_frequency > p.states[0].core_frequency) { 417 if (p.states[i].core_frequency > p.states[0].core_frequency) {
418 dprintk("P%u has larger frequency (%u) than P0 (%u), skipping\n", i, 418 dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i,
419 p.states[i].core_frequency, p.states[0].core_frequency); 419 p.states[i].core_frequency, p.states[0].core_frequency);
420 p.states[i].core_frequency = 0; 420 p.states[i].core_frequency = 0;
421 continue; 421 continue;
@@ -498,13 +498,6 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
498 if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) 498 if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
499 return -ENODEV; 499 return -ENODEV;
500 500
501 for (i = 0; i < N_IDS; i++)
502 if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
503 break;
504
505 if (i != N_IDS)
506 centrino_cpu[policy->cpu] = &cpu_ids[i];
507
508 if (is_const_loops_cpu(policy->cpu)) { 501 if (is_const_loops_cpu(policy->cpu)) {
509 centrino_driver.flags |= CPUFREQ_CONST_LOOPS; 502 centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
510 } 503 }
@@ -513,6 +506,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy)
513 if (policy->cpu != 0) 506 if (policy->cpu != 0)
514 return -ENODEV; 507 return -ENODEV;
515 508
509 for (i = 0; i < N_IDS; i++)
510 if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
511 break;
512
513 if (i != N_IDS)
514 centrino_cpu[policy->cpu] = &cpu_ids[i];
515
516 if (!centrino_cpu[policy->cpu]) { 516 if (!centrino_cpu[policy->cpu]) {
517 dprintk(KERN_INFO PFX "found unsupported CPU with " 517 dprintk(KERN_INFO PFX "found unsupported CPU with "
518 "Enhanced SpeedStep: send /proc/cpuinfo to " 518 "Enhanced SpeedStep: send /proc/cpuinfo to "
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
index b25fb6b635ae..2718fb6f6aba 100644
--- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
@@ -99,7 +99,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
99 u32 function = GET_SPEEDSTEP_FREQS; 99 u32 function = GET_SPEEDSTEP_FREQS;
100 100
101 if (!(ist_info.event & 0xFFFF)) { 101 if (!(ist_info.event & 0xFFFF)) {
102 dprintk("bug #1422 -- can't read freqs from BIOS\n", result); 102 dprintk("bug #1422 -- can't read freqs from BIOS\n");
103 return -ENODEV; 103 return -ENODEV;
104 } 104 }
105 105
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index 889eda2d7b17..1efdc76ae96d 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -1634,9 +1634,9 @@ void disable_IO_APIC(void)
1634 clear_IO_APIC(); 1634 clear_IO_APIC();
1635 1635
1636 /* 1636 /*
1637 * If the i82559 is routed through an IOAPIC 1637 * If the i8259 is routed through an IOAPIC
1638 * Put that IOAPIC in virtual wire mode 1638 * Put that IOAPIC in virtual wire mode
1639 * so legacy interrups can be delivered. 1639 * so legacy interrupts can be delivered.
1640 */ 1640 */
1641 pin = find_isa_irq_pin(0, mp_ExtINT); 1641 pin = find_isa_irq_pin(0, mp_ExtINT);
1642 if (pin != -1) { 1642 if (pin != -1) {
diff --git a/arch/i386/kernel/sigframe.h b/arch/i386/kernel/sigframe.h
index d21b14f5c25c..0b2221711dad 100644
--- a/arch/i386/kernel/sigframe.h
+++ b/arch/i386/kernel/sigframe.h
@@ -1,6 +1,6 @@
1struct sigframe 1struct sigframe
2{ 2{
3 char *pretcode; 3 char __user *pretcode;
4 int sig; 4 int sig;
5 struct sigcontext sc; 5 struct sigcontext sc;
6 struct _fpstate fpstate; 6 struct _fpstate fpstate;
@@ -10,10 +10,10 @@ struct sigframe
10 10
11struct rt_sigframe 11struct rt_sigframe
12{ 12{
13 char *pretcode; 13 char __user *pretcode;
14 int sig; 14 int sig;
15 struct siginfo *pinfo; 15 struct siginfo __user *pinfo;
16 void *puc; 16 void __user *puc;
17 struct siginfo info; 17 struct siginfo info;
18 struct ucontext uc; 18 struct ucontext uc;
19 struct _fpstate fpstate; 19 struct _fpstate fpstate;
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c
index 3cc480998a47..6d6338500c3c 100644
--- a/arch/i386/pci/i386.c
+++ b/arch/i386/pci/i386.c
@@ -283,9 +283,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
283 /* Write-combine setting is ignored, it is changed via the mtrr 283 /* Write-combine setting is ignored, it is changed via the mtrr
284 * interfaces on this platform. 284 * interfaces on this platform.
285 */ 285 */
286 if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 286 if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
287 vma->vm_end - vma->vm_start, 287 vma->vm_end - vma->vm_start,
288 vma->vm_page_prot)) 288 vma->vm_page_prot))
289 return -EAGAIN; 289 return -EAGAIN;
290 290
291 return 0; 291 return 0;
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 00151a8320d8..ed25d66c8d50 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -339,12 +339,6 @@ config IA64_PALINFO
339 To use this option, you have to ensure that the "/proc file system 339 To use this option, you have to ensure that the "/proc file system
340 support" (CONFIG_PROC_FS) is enabled, too. 340 support" (CONFIG_PROC_FS) is enabled, too.
341 341
342config ACPI_DEALLOCATE_IRQ
343 bool
344 depends on ACPI
345 depends on IOSAPIC && EXPERIMENTAL
346 default y
347
348source "drivers/firmware/Kconfig" 342source "drivers/firmware/Kconfig"
349 343
350source "fs/Kconfig.binfmt" 344source "fs/Kconfig.binfmt"
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig
index 1ca6e6e11b42..08112ab38468 100644
--- a/arch/ia64/configs/sn2_defconfig
+++ b/arch/ia64/configs/sn2_defconfig
@@ -111,7 +111,6 @@ CONFIG_COMPAT=y
111CONFIG_IA64_MCA_RECOVERY=y 111CONFIG_IA64_MCA_RECOVERY=y
112CONFIG_PERFMON=y 112CONFIG_PERFMON=y
113CONFIG_IA64_PALINFO=y 113CONFIG_IA64_PALINFO=y
114CONFIG_ACPI_DEALLOCATE_IRQ=y
115 114
116# 115#
117# Firmware Drivers 116# Firmware Drivers
diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig
index 3ec94a12eac0..d452e18ac494 100644
--- a/arch/ia64/configs/tiger_defconfig
+++ b/arch/ia64/configs/tiger_defconfig
@@ -109,7 +109,6 @@ CONFIG_COMPAT=y
109CONFIG_IA64_MCA_RECOVERY=y 109CONFIG_IA64_MCA_RECOVERY=y
110CONFIG_PERFMON=y 110CONFIG_PERFMON=y
111CONFIG_IA64_PALINFO=y 111CONFIG_IA64_PALINFO=y
112CONFIG_ACPI_DEALLOCATE_IRQ=y
113 112
114# 113#
115# Firmware Drivers 114# Firmware Drivers
diff --git a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig
index d4cf73d124bc..80b0e9eb7fb3 100644
--- a/arch/ia64/configs/zx1_defconfig
+++ b/arch/ia64/configs/zx1_defconfig
@@ -109,7 +109,6 @@ CONFIG_COMPAT=y
109CONFIG_IA64_MCA_RECOVERY=y 109CONFIG_IA64_MCA_RECOVERY=y
110CONFIG_PERFMON=y 110CONFIG_PERFMON=y
111CONFIG_IA64_PALINFO=y 111CONFIG_IA64_PALINFO=y
112CONFIG_ACPI_DEALLOCATE_IRQ=y
113 112
114# 113#
115# Firmware Drivers 114# Firmware Drivers
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig
index b6ec8d32c346..5da208115ea1 100644
--- a/arch/ia64/defconfig
+++ b/arch/ia64/defconfig
@@ -99,7 +99,6 @@ CONFIG_COMPAT=y
99CONFIG_IA64_MCA_RECOVERY=y 99CONFIG_IA64_MCA_RECOVERY=y
100CONFIG_PERFMON=y 100CONFIG_PERFMON=y
101CONFIG_IA64_PALINFO=y 101CONFIG_IA64_PALINFO=y
102CONFIG_ACPI_DEALLOCATE_IRQ=y
103 102
104# 103#
105# Firmware Drivers 104# Firmware Drivers
@@ -335,7 +334,7 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
335CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 334CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
336# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set 335# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
337# CONFIG_SCSI_IPR is not set 336# CONFIG_SCSI_IPR is not set
338CONFIG_SCSI_QLOGIC_FC=y 337# CONFIG_SCSI_QLOGIC_FC is not set
339# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set 338# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
340CONFIG_SCSI_QLOGIC_1280=y 339CONFIG_SCSI_QLOGIC_1280=y
341# CONFIG_SCSI_QLOGIC_1280_1040 is not set 340# CONFIG_SCSI_QLOGIC_1280_1040 is not set
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 318787c84ac0..28a4529fdd60 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -583,14 +583,12 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
583 583
584EXPORT_SYMBOL(acpi_register_gsi); 584EXPORT_SYMBOL(acpi_register_gsi);
585 585
586#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
587void acpi_unregister_gsi(u32 gsi) 586void acpi_unregister_gsi(u32 gsi)
588{ 587{
589 iosapic_unregister_intr(gsi); 588 iosapic_unregister_intr(gsi);
590} 589}
591 590
592EXPORT_SYMBOL(acpi_unregister_gsi); 591EXPORT_SYMBOL(acpi_unregister_gsi);
593#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
594 592
595static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size) 593static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size)
596{ 594{
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index 9be53e1ea404..3c8821024509 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -204,9 +204,6 @@ GLOBAL_ENTRY(ia64_switch_to)
204(p6) br.cond.dpnt .map 204(p6) br.cond.dpnt .map
205 ;; 205 ;;
206.done: 206.done:
207(p6) ssm psr.ic // if we had to map, reenable the psr.ic bit FIRST!!!
208 ;;
209(p6) srlz.d
210 ld8 sp=[r21] // load kernel stack pointer of new task 207 ld8 sp=[r21] // load kernel stack pointer of new task
211 mov IA64_KR(CURRENT)=in0 // update "current" application register 208 mov IA64_KR(CURRENT)=in0 // update "current" application register
212 mov r8=r13 // return pointer to previously running task 209 mov r8=r13 // return pointer to previously running task
@@ -234,6 +231,9 @@ GLOBAL_ENTRY(ia64_switch_to)
234 mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped... 231 mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped...
235 ;; 232 ;;
236 itr.d dtr[r25]=r23 // wire in new mapping... 233 itr.d dtr[r25]=r23 // wire in new mapping...
234 ssm psr.ic // reenable the psr.ic bit
235 ;;
236 srlz.d
237 br.cond.sptk .done 237 br.cond.sptk .done
238END(ia64_switch_to) 238END(ia64_switch_to)
239 239
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
index a13df592ebf7..574084f343fa 100644
--- a/arch/ia64/kernel/iosapic.c
+++ b/arch/ia64/kernel/iosapic.c
@@ -782,7 +782,6 @@ again:
782 return vector; 782 return vector;
783} 783}
784 784
785#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
786void 785void
787iosapic_unregister_intr (unsigned int gsi) 786iosapic_unregister_intr (unsigned int gsi)
788{ 787{
@@ -865,7 +864,6 @@ iosapic_unregister_intr (unsigned int gsi)
865 spin_unlock(&iosapic_lock); 864 spin_unlock(&iosapic_lock);
866 spin_unlock_irqrestore(&idesc->lock, flags); 865 spin_unlock_irqrestore(&idesc->lock, flags);
867} 866}
868#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
869 867
870/* 868/*
871 * ACPI calls this when it finds an entry for a platform interrupt. 869 * ACPI calls this when it finds an entry for a platform interrupt.
diff --git a/arch/ia64/lib/memcpy_mck.S b/arch/ia64/lib/memcpy_mck.S
index 6f308e62c137..46c9331e7ab5 100644
--- a/arch/ia64/lib/memcpy_mck.S
+++ b/arch/ia64/lib/memcpy_mck.S
@@ -625,8 +625,11 @@ EK(.ex_handler, (p17) st8 [dst1]=r39,8); \
625 clrrrb 625 clrrrb
626 ;; 626 ;;
627 alloc saved_pfs_stack=ar.pfs,3,3,3,0 627 alloc saved_pfs_stack=ar.pfs,3,3,3,0
628 cmp.lt p8,p0=A,r0
628 sub B = dst0, saved_in0 // how many byte copied so far 629 sub B = dst0, saved_in0 // how many byte copied so far
629 ;; 630 ;;
631(p8) mov A = 0; // A shouldn't be negative, cap it
632 ;;
630 sub C = A, B 633 sub C = A, B
631 sub D = saved_in2, A 634 sub D = saved_in2, A
632 ;; 635 ;;
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index 24614869e866..3c32af910d60 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -230,9 +230,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
230 return; 230 return;
231 } 231 }
232 232
233 if (ia64_done_with_exception(regs))
234 return;
235
236 /* 233 /*
237 * Since we have no vma's for region 5, we might get here even if the address is 234 * Since we have no vma's for region 5, we might get here even if the address is
238 * valid, due to the VHPT walker inserting a non present translation that becomes 235 * valid, due to the VHPT walker inserting a non present translation that becomes
@@ -243,6 +240,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
243 if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address)) 240 if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address))
244 return; 241 return;
245 242
243 if (ia64_done_with_exception(regs))
244 return;
245
246 /* 246 /*
247 * Oops. The kernel tried to access some bad page. We'll have to terminate things 247 * Oops. The kernel tried to access some bad page. We'll have to terminate things
248 * with extreme prejudice. 248 * with extreme prejudice.
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 9977c122e9fa..9b5de589b82f 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -498,13 +498,11 @@ pcibios_enable_device (struct pci_dev *dev, int mask)
498 return acpi_pci_irq_enable(dev); 498 return acpi_pci_irq_enable(dev);
499} 499}
500 500
501#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
502void 501void
503pcibios_disable_device (struct pci_dev *dev) 502pcibios_disable_device (struct pci_dev *dev)
504{ 503{
505 acpi_pci_irq_disable(dev); 504 acpi_pci_irq_disable(dev);
506} 505}
507#endif /* CONFIG_ACPI_DEALLOCATE_IRQ */
508 506
509void 507void
510pcibios_align_resource (void *data, struct resource *res, 508pcibios_align_resource (void *data, struct resource *res,
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index a594aca959e6..14908ad7db8c 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -56,7 +56,7 @@
56 56
57DEFINE_PER_CPU(struct pda_s, pda_percpu); 57DEFINE_PER_CPU(struct pda_s, pda_percpu);
58 58
59#define MAX_PHYS_MEMORY (1UL << 49) /* 1 TB */ 59#define MAX_PHYS_MEMORY (1UL << IA64_MAX_PHYS_BITS) /* Max physical address supported */
60 60
61lboard_t *root_lboard[MAX_COMPACT_NODES]; 61lboard_t *root_lboard[MAX_COMPACT_NODES];
62 62
diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c
index bb1d5cf30440..ed7c21586e98 100644
--- a/arch/ia64/sn/kernel/xpc_main.c
+++ b/arch/ia64/sn/kernel/xpc_main.c
@@ -885,6 +885,10 @@ xpc_init(void)
885 pid_t pid; 885 pid_t pid;
886 886
887 887
888 if (!ia64_platform_is("sn2")) {
889 return -ENODEV;
890 }
891
888 /* 892 /*
889 * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng 893 * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng
890 * both a partition's reserved page and its XPC variables. Its size was 894 * both a partition's reserved page and its XPC variables. Its size was
diff --git a/arch/ia64/sn/kernel/xpnet.c b/arch/ia64/sn/kernel/xpnet.c
index 78c13d676fa6..d0c2c114a459 100644
--- a/arch/ia64/sn/kernel/xpnet.c
+++ b/arch/ia64/sn/kernel/xpnet.c
@@ -636,6 +636,10 @@ xpnet_init(void)
636 int result = -ENOMEM; 636 int result = -ENOMEM;
637 637
638 638
639 if (!ia64_platform_is("sn2")) {
640 return -ENODEV;
641 }
642
639 dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME); 643 dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME);
640 644
641 /* 645 /*
diff --git a/arch/m68knommu/platform/523x/Makefile b/arch/m68knommu/platform/523x/Makefile
new file mode 100644
index 000000000000..c1578b016160
--- /dev/null
+++ b/arch/m68knommu/platform/523x/Makefile
@@ -0,0 +1,19 @@
1#
2# Makefile for the m68knommu linux kernel.
3#
4
5#
6# If you want to play with the HW breakpoints then you will
7# need to add define this, which will give you a stack backtrace
8# on the console port whenever a DBG interrupt occurs. You have to
9# set up you HW breakpoints to trigger a DBG interrupt:
10#
11# EXTRA_CFLAGS += -DTRAP_DBG_INTERRUPT
12# EXTRA_AFLAGS += -DTRAP_DBG_INTERRUPT
13#
14
15ifdef CONFIG_FULLDEBUG
16AFLAGS += -DDEBUGGER_COMPATIBLE_CACHE=1
17endif
18
19obj-y := config.o
diff --git a/arch/m68knommu/platform/5272/config.c b/arch/m68knommu/platform/5272/config.c
index 5cb28690f89a..cf36e7d007b9 100644
--- a/arch/m68knommu/platform/5272/config.c
+++ b/arch/m68knommu/platform/5272/config.c
@@ -104,11 +104,11 @@ int mcf_timerirqpending(int timer)
104 104
105void config_BSP(char *commandp, int size) 105void config_BSP(char *commandp, int size)
106{ 106{
107#if 0 107#if defined (CONFIG_MOD5272)
108 volatile unsigned long *pivrp; 108 volatile unsigned char *pivrp;
109 109
110 /* Set base of device vectors to be 64 */ 110 /* Set base of device vectors to be 64 */
111 pivrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PIVR); 111 pivrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_PIVR);
112 *pivrp = 0x40; 112 *pivrp = 0x40;
113#endif 113#endif
114 114
diff --git a/arch/m68knommu/platform/5307/Makefile b/arch/m68knommu/platform/5307/Makefile
index 84b6b70641e1..6fe5a2b8fb08 100644
--- a/arch/m68knommu/platform/5307/Makefile
+++ b/arch/m68knommu/platform/5307/Makefile
@@ -19,6 +19,7 @@ endif
19obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o 19obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o
20obj-$(CONFIG_M5206) += timers.o 20obj-$(CONFIG_M5206) += timers.o
21obj-$(CONFIG_M5206e) += timers.o 21obj-$(CONFIG_M5206e) += timers.o
22obj-$(CONFIG_M523x) += pit.o
22obj-$(CONFIG_M5249) += timers.o 23obj-$(CONFIG_M5249) += timers.o
23obj-$(CONFIG_M527x) += pit.o 24obj-$(CONFIG_M527x) += pit.o
24obj-$(CONFIG_M5272) += timers.o 25obj-$(CONFIG_M5272) += timers.o
diff --git a/arch/m68knommu/platform/68328/config.c b/arch/m68knommu/platform/68328/config.c
index fd7c93f86481..bcfa5d7fe1e2 100644
--- a/arch/m68knommu/platform/68328/config.c
+++ b/arch/m68knommu/platform/68328/config.c
@@ -1,5 +1,7 @@
1/***************************************************************************/
2
1/* 3/*
2 * linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c 4 * linux/arch/m68knommu/platform/68328/config.c
3 * 5 *
4 * Copyright (C) 1993 Hamish Macdonald 6 * Copyright (C) 1993 Hamish Macdonald
5 * Copyright (C) 1999 D. Jeff Dionne 7 * Copyright (C) 1999 D. Jeff Dionne
@@ -11,6 +13,8 @@
11 * VZ Support/Fixes Evan Stawnyczy <e@lineo.ca> 13 * VZ Support/Fixes Evan Stawnyczy <e@lineo.ca>
12 */ 14 */
13 15
16/***************************************************************************/
17
14#include <asm/dbg.h> 18#include <asm/dbg.h>
15#include <stdarg.h> 19#include <stdarg.h>
16#include <linux/config.h> 20#include <linux/config.h>
@@ -29,76 +33,16 @@
29#include <asm/machdep.h> 33#include <asm/machdep.h>
30#include <asm/MC68328.h> 34#include <asm/MC68328.h>
31 35
36/***************************************************************************/
32 37
33void BSP_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) 38void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
34{ 39void m68328_timer_tick(void);
35 40unsigned long m68328_timer_gettimeoffset(void);
36#ifdef CONFIG_XCOPILOT_BUGS 41void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
37 /*
38 * The only thing I know is that CLK32 is not available on Xcopilot
39 * I have little idea about what frequency SYSCLK has on Xcopilot.
40 * The values for prescaler and compare registers were simply
41 * taken from the original source
42 */
43
44 /* Restart mode, Enable int, SYSCLK, Enable timer */
45 TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_SYSCLK | TCTL_TEN;
46 /* Set prescaler */
47 TPRER2 = 2;
48 /* Set compare register */
49 TCMP2 = 0xd7e4;
50#else
51 /* Restart mode, Enable int, 32KHz, Enable timer */
52 TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
53 /* Set prescaler (Divide 32KHz by 32)*/
54 TPRER2 = 31;
55 /* Set compare register 32Khz / 32 / 10 = 100 */
56 TCMP2 = 10;
57#endif
58
59 request_irq(TMR2_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
60}
61
62void BSP_tick(void)
63{
64 /* Reset Timer2 */
65 TSTAT2 &= 0;
66}
67 42
68unsigned long BSP_gettimeoffset (void) 43/***************************************************************************/
69{
70 return 0;
71}
72 44
73void BSP_gettod (int *yearp, int *monp, int *dayp, 45void m68328_reset (void)
74 int *hourp, int *minp, int *secp)
75{
76}
77
78int BSP_hwclk(int op, struct hwclk_time *t)
79{
80 if (!op) {
81 /* read */
82 } else {
83 /* write */
84 }
85 return 0;
86}
87
88int BSP_set_clock_mmss (unsigned long nowtime)
89{
90#if 0
91 short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
92
93 tod->second1 = real_seconds / 10;
94 tod->second2 = real_seconds % 10;
95 tod->minute1 = real_minutes / 10;
96 tod->minute2 = real_minutes % 10;
97#endif
98 return 0;
99}
100
101void BSP_reset (void)
102{ 46{
103 local_irq_disable(); 47 local_irq_disable();
104 asm volatile ("moveal #0x10c00000, %a0;\n\t" 48 asm volatile ("moveal #0x10c00000, %a0;\n\t"
@@ -108,18 +52,22 @@ void BSP_reset (void)
108 "jmp (%a0);"); 52 "jmp (%a0);");
109} 53}
110 54
55/***************************************************************************/
56
111void config_BSP(char *command, int len) 57void config_BSP(char *command, int len)
112{ 58{
113 printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n"); 59 printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
114 printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n"); 60 printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
115 printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n"); 61 printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
116 62
117 mach_sched_init = BSP_sched_init; 63 mach_sched_init = m68328_timer_init;
118 mach_tick = BSP_tick; 64 mach_tick = m68328_timer_tick;
119 mach_gettimeoffset = BSP_gettimeoffset; 65 mach_gettimeoffset = m68328_timer_gettimeoffset;
120 mach_gettod = BSP_gettod; 66 mach_gettod = m68328_timer_gettod;
121 mach_hwclk = NULL; 67 mach_hwclk = NULL;
122 mach_set_clock_mmss = NULL; 68 mach_set_clock_mmss = NULL;
123 mach_reset = BSP_reset; 69 mach_reset = m68328_reset;
124 *command = '\0'; 70 *command = '\0';
125} 71}
72
73/***************************************************************************/
diff --git a/arch/m68knommu/platform/68328/timers.c b/arch/m68knommu/platform/68328/timers.c
new file mode 100644
index 000000000000..68c2cd6b0030
--- /dev/null
+++ b/arch/m68knommu/platform/68328/timers.c
@@ -0,0 +1,106 @@
1/***************************************************************************/
2
3/*
4 * linux/arch/m68knommu/platform/68328/timers.c
5 *
6 * Copyright (C) 1993 Hamish Macdonald
7 * Copyright (C) 1999 D. Jeff Dionne
8 * Copyright (C) 2001 Georges Menie, Ken Desmet
9 *
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file COPYING in the main directory of this archive
12 * for more details.
13 */
14
15/***************************************************************************/
16
17#include <linux/config.h>
18#include <linux/types.h>
19#include <linux/kernel.h>
20#include <linux/mm.h>
21#include <asm/setup.h>
22#include <asm/system.h>
23#include <asm/pgtable.h>
24#include <asm/irq.h>
25#include <asm/machdep.h>
26#include <asm/MC68VZ328.h>
27
28/***************************************************************************/
29
30#if defined(CONFIG_DRAGEN2)
31/* with a 33.16 MHz clock, this will give usec resolution to the time functions */
32#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
33#define CLOCK_PRE 7
34#define TICKS_PER_JIFFY 41450
35
36#elif defined(CONFIG_XCOPILOT_BUGS)
37/*
38 * The only thing I know is that CLK32 is not available on Xcopilot
39 * I have little idea about what frequency SYSCLK has on Xcopilot.
40 * The values for prescaler and compare registers were simply
41 * taken from the original source
42 */
43#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
44#define CLOCK_PRE 2
45#define TICKS_PER_JIFFY 0xd7e4
46
47#else
48/* default to using the 32Khz clock */
49#define CLOCK_SOURCE TCTL_CLKSOURCE_32KHZ
50#define CLOCK_PRE 31
51#define TICKS_PER_JIFFY 10
52#endif
53
54/***************************************************************************/
55
56void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *))
57{
58 /* disable timer 1 */
59 TCTL = 0;
60
61 /* set ISR */
62 if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))
63 panic("Unable to attach timer interrupt\n");
64
65 /* Restart mode, Enable int, Set clock source */
66 TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
67 TPRER = CLOCK_PRE;
68 TCMP = TICKS_PER_JIFFY;
69
70 /* Enable timer 1 */
71 TCTL |= TCTL_TEN;
72}
73
74/***************************************************************************/
75
76void m68328_timer_tick(void)
77{
78 /* Reset Timer1 */
79 TSTAT &= 0;
80}
81/***************************************************************************/
82
83unsigned long m68328_timer_gettimeoffset(void)
84{
85 unsigned long ticks = TCN, offset = 0;
86
87 /* check for pending interrupt */
88 if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM)))
89 offset = 1000000 / HZ;
90 ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY;
91 return ticks + offset;
92}
93
94/***************************************************************************/
95
96void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec)
97{
98 long now = RTCTIME;
99
100 *year = *mon = *day = 1;
101 *hour = (now >> 24) % 24;
102 *min = (now >> 16) % 60;
103 *sec = now % 60;
104}
105
106/***************************************************************************/
diff --git a/arch/m68knommu/platform/68EZ328/config.c b/arch/m68knommu/platform/68EZ328/config.c
index c21971971ff5..d8d56e5de310 100644
--- a/arch/m68knommu/platform/68EZ328/config.c
+++ b/arch/m68knommu/platform/68EZ328/config.c
@@ -1,5 +1,7 @@
1/***************************************************************************/
2
1/* 3/*
2 * linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c 4 * linux/arch/m68knommu/platform/68EZ328/config.c
3 * 5 *
4 * Copyright (C) 1993 Hamish Macdonald 6 * Copyright (C) 1993 Hamish Macdonald
5 * Copyright (C) 1999 D. Jeff Dionne 7 * Copyright (C) 1999 D. Jeff Dionne
@@ -9,6 +11,8 @@
9 * for more details. 11 * for more details.
10 */ 12 */
11 13
14/***************************************************************************/
15
12#include <stdarg.h> 16#include <stdarg.h>
13#include <linux/config.h> 17#include <linux/config.h>
14#include <linux/types.h> 18#include <linux/types.h>
@@ -20,68 +24,22 @@
20#include <asm/setup.h> 24#include <asm/setup.h>
21#include <asm/system.h> 25#include <asm/system.h>
22#include <asm/pgtable.h> 26#include <asm/pgtable.h>
23#include <asm/irq.h>
24#include <asm/machdep.h> 27#include <asm/machdep.h>
25#include <asm/MC68EZ328.h> 28#include <asm/MC68EZ328.h>
26#ifdef CONFIG_UCSIMM 29#ifdef CONFIG_UCSIMM
27#include <asm/bootstd.h> 30#include <asm/bootstd.h>
28#endif 31#endif
29#ifdef CONFIG_PILOT
30#include "PalmV/romfs.h"
31#endif
32
33void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
34{
35 /* Restart mode, Enable int, 32KHz, Enable timer */
36 TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
37 /* Set prescaler (Divide 32KHz by 32)*/
38 TPRER = 31;
39 /* Set compare register 32Khz / 32 / 10 = 100 */
40 TCMP = 10;
41
42 request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
43}
44
45void BSP_tick(void)
46{
47 /* Reset Timer1 */
48 TSTAT &= 0;
49}
50
51unsigned long BSP_gettimeoffset (void)
52{
53 return 0;
54}
55 32
56void BSP_gettod (int *yearp, int *monp, int *dayp, 33/***************************************************************************/
57 int *hourp, int *minp, int *secp)
58{
59}
60 34
61int BSP_hwclk(int op, struct hwclk_time *t) 35void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
62{ 36void m68328_timer_tick(void);
63 if (!op) { 37unsigned long m68328_timer_gettimeoffset(void);
64 /* read */ 38void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
65 } else {
66 /* write */
67 }
68 return 0;
69}
70 39
71int BSP_set_clock_mmss (unsigned long nowtime) 40/***************************************************************************/
72{
73#if 0
74 short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
75 41
76 tod->second1 = real_seconds / 10; 42void m68ez328_reset(void)
77 tod->second2 = real_seconds % 10;
78 tod->minute1 = real_minutes / 10;
79 tod->minute2 = real_minutes % 10;
80#endif
81 return 0;
82}
83
84void BSP_reset (void)
85{ 43{
86 local_irq_disable(); 44 local_irq_disable();
87 asm volatile (" 45 asm volatile ("
@@ -93,6 +51,8 @@ void BSP_reset (void)
93 "); 51 ");
94} 52}
95 53
54/***************************************************************************/
55
96unsigned char *cs8900a_hwaddr; 56unsigned char *cs8900a_hwaddr;
97static int errno; 57static int errno;
98 58
@@ -119,11 +79,13 @@ void config_BSP(char *command, int len)
119 else command[0] = 0; 79 else command[0] = 0;
120#endif 80#endif
121 81
122 mach_sched_init = BSP_sched_init; 82 mach_sched_init = m68328_timer_init;
123 mach_tick = BSP_tick; 83 mach_tick = m68328_timer_tick;
124 mach_gettimeoffset = BSP_gettimeoffset; 84 mach_gettimeoffset = m68328_timer_gettimeoffset;
125 mach_gettod = BSP_gettod; 85 mach_gettod = m68328_timer_gettod;
126 mach_hwclk = NULL; 86 mach_hwclk = NULL;
127 mach_set_clock_mmss = NULL; 87 mach_set_clock_mmss = NULL;
128 mach_reset = BSP_reset; 88 mach_reset = m68ez328_reset;
129} 89}
90
91/***************************************************************************/
diff --git a/arch/m68knommu/platform/68VZ328/de2/config.c b/arch/m68knommu/platform/68VZ328/config.c
index d0586197f113..d926524cdf82 100644
--- a/arch/m68knommu/platform/68VZ328/de2/config.c
+++ b/arch/m68knommu/platform/68VZ328/config.c
@@ -1,5 +1,7 @@
1/***************************************************************************/
2
1/* 3/*
2 * linux/arch/m68knommu/platform/MC68VZ328/de2/config.c 4 * linux/arch/m68knommu/platform/68VZ328/config.c
3 * 5 *
4 * Copyright (C) 1993 Hamish Macdonald 6 * Copyright (C) 1993 Hamish Macdonald
5 * Copyright (C) 1999 D. Jeff Dionne 7 * Copyright (C) 1999 D. Jeff Dionne
@@ -10,6 +12,8 @@
10 * for more details. 12 * for more details.
11 */ 13 */
12 14
15/***************************************************************************/
16
13#include <linux/config.h> 17#include <linux/config.h>
14#include <linux/types.h> 18#include <linux/types.h>
15#include <linux/kernel.h> 19#include <linux/kernel.h>
@@ -25,66 +29,25 @@
25#include <asm/irq.h> 29#include <asm/irq.h>
26#include <asm/machdep.h> 30#include <asm/machdep.h>
27#include <asm/MC68VZ328.h> 31#include <asm/MC68VZ328.h>
32#include <asm/bootstd.h>
28 33
29#ifdef CONFIG_INIT_LCD 34#ifdef CONFIG_INIT_LCD
30#include "screen.h" 35#include "bootlogo.h"
31#endif 36#endif
32 37
33/* with a 33.16 MHz clock, this will give usec resolution to the time functions */ 38/***************************************************************************/
34#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
35#define CLOCK_PRE 7
36#define TICKS_PER_JIFFY 41450
37
38static void
39dragen2_sched_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *))
40{
41 /* disable timer 1 */
42 TCTL = 0;
43
44 /* set ISR */
45 if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL))
46 panic("Unable to attach timer interrupt\n");
47
48 /* Restart mode, Enable int, Set clock source */
49 TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
50 TPRER = CLOCK_PRE;
51 TCMP = TICKS_PER_JIFFY;
52
53 /* Enable timer 1 */
54 TCTL |= TCTL_TEN;
55}
56
57static void dragen2_tick(void)
58{
59 /* Reset Timer1 */
60 TSTAT &= 0;
61}
62
63static unsigned long dragen2_gettimeoffset(void)
64{
65 unsigned long ticks = TCN, offset = 0;
66
67 /* check for pending interrupt */
68 if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM)))
69 offset = 1000000 / HZ;
70
71 ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY;
72 39
73 return ticks + offset; 40void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *));
74} 41void m68328_timer_tick(void);
42unsigned long m68328_timer_gettimeoffset(void);
43void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec);
75 44
76static void dragen2_gettod(int *year, int *mon, int *day, int *hour, 45/***************************************************************************/
77 int *min, int *sec) 46/* Init Drangon Engine hardware */
78{ 47/***************************************************************************/
79 long now = RTCTIME; 48#if defined(CONFIG_DRAGEN2)
80 49
81 *year = *mon = *day = 1; 50static void m68vz328_reset(void)
82 *hour = (now >> 24) % 24;
83 *min = (now >> 16) % 60;
84 *sec = now % 60;
85}
86
87static void dragen2_reset(void)
88{ 51{
89 local_irq_disable(); 52 local_irq_disable();
90 53
@@ -103,7 +66,7 @@ static void dragen2_reset(void)
103 ); 66 );
104} 67}
105 68
106static void init_hardware(void) 69static void init_hardware(char *command, int size)
107{ 70{
108#ifdef CONFIG_DIRECT_IO_ACCESS 71#ifdef CONFIG_DIRECT_IO_ACCESS
109 SCR = 0x10; /* allow user access to internal registers */ 72 SCR = 0x10; /* allow user access to internal registers */
@@ -170,6 +133,60 @@ static void init_hardware(void)
170#endif 133#endif
171} 134}
172 135
136/***************************************************************************/
137/* Init RT-Control uCdimm hardware */
138/***************************************************************************/
139#elif defined(CONFIG_UCDIMM)
140
141static void m68vz328_reset(void)
142{
143 local_irq_disable();
144 asm volatile ("
145 moveal #0x10c00000, %a0;
146 moveb #0, 0xFFFFF300;
147 moveal 0(%a0), %sp;
148 moveal 4(%a0), %a0;
149 jmp (%a0);
150 ");
151}
152
153unsigned char *cs8900a_hwaddr;
154static int errno;
155
156_bsc0(char *, getserialnum)
157_bsc1(unsigned char *, gethwaddr, int, a)
158_bsc1(char *, getbenv, char *, a)
159
160static void init_hardware(char *command, int size)
161{
162 char *p;
163
164 printk(KERN_INFO "uCdimm serial string [%s]\n", getserialnum());
165 p = cs8900a_hwaddr = gethwaddr(0);
166 printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
167 p[0], p[1], p[2], p[3], p[4], p[5]);
168 p = getbenv("APPEND");
169 if (p)
170 strcpy(p, command);
171 else
172 command[0] = 0;
173}
174
175/***************************************************************************/
176#else
177
178static void m68vz328_reset(void)
179{
180}
181
182static void init_hardware(char *command, int size)
183{
184}
185
186/***************************************************************************/
187#endif
188/***************************************************************************/
189
173void config_BSP(char *command, int size) 190void config_BSP(char *command, int size)
174{ 191{
175 printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); 192 printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
@@ -181,11 +198,13 @@ void config_BSP(char *command, int size)
181 memset(command, 0, size); 198 memset(command, 0, size);
182#endif 199#endif
183 200
184 init_hardware(); 201 init_hardware(command, size);
185 202
186 mach_sched_init = (void *)dragen2_sched_init; 203 mach_sched_init = (void *) m68328_timer_init;
187 mach_tick = dragen2_tick; 204 mach_tick = m68328_timer_tick;
188 mach_gettimeoffset = dragen2_gettimeoffset; 205 mach_gettimeoffset = m68328_timer_gettimeoffset;
189 mach_reset = dragen2_reset; 206 mach_gettod = m68328_timer_gettod;
190 mach_gettod = dragen2_gettod; 207 mach_reset = m68vz328_reset;
191} 208}
209
210/***************************************************************************/
diff --git a/arch/m68knommu/platform/68VZ328/ucdimm/config.c b/arch/m68knommu/platform/68VZ328/ucdimm/config.c
deleted file mode 100644
index 2deadaffd81e..000000000000
--- a/arch/m68knommu/platform/68VZ328/ucdimm/config.c
+++ /dev/null
@@ -1,117 +0,0 @@
1/*
2 * linux/arch/m68knommu/platform/68VZ328/ucdimm/config.c
3 *
4 * Copyright (C) 1993 Hamish Macdonald
5 * Copyright (C) 1999 D. Jeff Dionne
6 *
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file COPYING in the main directory of this archive
9 * for more details.
10 */
11
12#include <stdarg.h>
13#include <linux/config.h>
14#include <linux/types.h>
15#include <linux/kernel.h>
16#include <linux/mm.h>
17#include <linux/tty.h>
18#include <linux/console.h>
19
20#include <asm/setup.h>
21#include <asm/system.h>
22#include <asm/pgtable.h>
23#include <asm/irq.h>
24#include <asm/machdep.h>
25#include <asm/MC68VZ328.h>
26#include <asm/bootstd.h>
27
28void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
29{
30 /* Restart mode, Enable int, 32KHz, Enable timer */
31 TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN;
32 /* Set prescaler (Divide 32KHz by 32)*/
33 TPRER = 31;
34 /* Set compare register 32Khz / 32 / 10 = 100 */
35 TCMP = 10;
36
37 request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
38}
39
40void BSP_tick(void)
41{
42 /* Reset Timer1 */
43 TSTAT &= 0;
44}
45
46unsigned long BSP_gettimeoffset (void)
47{
48 return 0;
49}
50
51void BSP_gettod (int *yearp, int *monp, int *dayp,
52 int *hourp, int *minp, int *secp)
53{
54}
55
56int BSP_hwclk(int op, struct hwclk_time *t)
57{
58 if (!op) {
59 /* read */
60 } else {
61 /* write */
62 }
63 return 0;
64}
65
66int BSP_set_clock_mmss (unsigned long nowtime)
67{
68#if 0
69 short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
70
71 tod->second1 = real_seconds / 10;
72 tod->second2 = real_seconds % 10;
73 tod->minute1 = real_minutes / 10;
74 tod->minute2 = real_minutes % 10;
75#endif
76 return 0;
77}
78
79void BSP_reset (void)
80{
81 local_irq_disable();
82 asm volatile ("
83 moveal #0x10c00000, %a0;
84 moveb #0, 0xFFFFF300;
85 moveal 0(%a0), %sp;
86 moveal 4(%a0), %a0;
87 jmp (%a0);
88 ");
89}
90
91unsigned char *cs8900a_hwaddr;
92static int errno;
93
94_bsc0(char *, getserialnum)
95_bsc1(unsigned char *, gethwaddr, int, a)
96_bsc1(char *, getbenv, char *, a)
97
98void config_BSP(char *command, int len)
99{
100 unsigned char *p;
101
102 printk(KERN_INFO "\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
103
104 printk(KERN_INFO "uCdimm serial string [%s]\n",getserialnum());
105 p = cs8900a_hwaddr = gethwaddr(0);
106 printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
107 p[0], p[1], p[2], p[3], p[4], p[5]);
108 p = getbenv("APPEND");
109 if (p) strcpy(p,command);
110 else command[0] = 0;
111
112 mach_sched_init = BSP_sched_init;
113 mach_tick = BSP_tick;
114 mach_gettimeoffset = BSP_gettimeoffset;
115 mach_gettod = BSP_gettod;
116 mach_reset = BSP_reset;
117}
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c
index 7b3586a3bf30..854e45beb387 100644
--- a/arch/ppc/kernel/pci.c
+++ b/arch/ppc/kernel/pci.c
@@ -80,7 +80,6 @@ fixup_broken_pcnet32(struct pci_dev* dev)
80 if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { 80 if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
81 dev->vendor = PCI_VENDOR_ID_AMD; 81 dev->vendor = PCI_VENDOR_ID_AMD;
82 pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); 82 pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
83 pci_name_device(dev);
84 } 83 }
85} 84}
86DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); 85DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
diff --git a/arch/ppc/kernel/syscalls.c b/arch/ppc/kernel/syscalls.c
index 124313ce3c09..127f040de9de 100644
--- a/arch/ppc/kernel/syscalls.c
+++ b/arch/ppc/kernel/syscalls.c
@@ -41,10 +41,6 @@
41#include <asm/ipc.h> 41#include <asm/ipc.h>
42#include <asm/semaphore.h> 42#include <asm/semaphore.h>
43 43
44void
45check_bugs(void)
46{
47}
48 44
49/* 45/*
50 * sys_ipc() is the de-multiplexer for the SysV IPC calls.. 46 * sys_ipc() is the de-multiplexer for the SysV IPC calls..
diff --git a/arch/ppc/syslib/mpc10x_common.c b/arch/ppc/syslib/mpc10x_common.c
index 87065e2e4c5f..3e039706bdbc 100644
--- a/arch/ppc/syslib/mpc10x_common.c
+++ b/arch/ppc/syslib/mpc10x_common.c
@@ -140,12 +140,12 @@ struct platform_device ppc_sys_platform_devices[] = {
140 }, 140 },
141 [MPC10X_UART0] = { 141 [MPC10X_UART0] = {
142 .name = "serial8250", 142 .name = "serial8250",
143 .id = 0, 143 .id = PLAT8250_DEV_PLATFORM,
144 .dev.platform_data = serial_plat_uart0, 144 .dev.platform_data = serial_plat_uart0,
145 }, 145 },
146 [MPC10X_UART1] = { 146 [MPC10X_UART1] = {
147 .name = "serial8250", 147 .name = "serial8250",
148 .id = 1, 148 .id = PLAT8250_DEV_PLATFORM1,
149 .dev.platform_data = serial_plat_uart1, 149 .dev.platform_data = serial_plat_uart1,
150 }, 150 },
151 151
diff --git a/arch/ppc/syslib/mpc83xx_devices.c b/arch/ppc/syslib/mpc83xx_devices.c
index 5aaf0e58e1f9..95b3b8a7f0ba 100644
--- a/arch/ppc/syslib/mpc83xx_devices.c
+++ b/arch/ppc/syslib/mpc83xx_devices.c
@@ -165,7 +165,7 @@ struct platform_device ppc_sys_platform_devices[] = {
165 }, 165 },
166 [MPC83xx_DUART] = { 166 [MPC83xx_DUART] = {
167 .name = "serial8250", 167 .name = "serial8250",
168 .id = 0, 168 .id = PLAT8250_DEV_PLATFORM,
169 .dev.platform_data = serial_platform_data, 169 .dev.platform_data = serial_platform_data,
170 }, 170 },
171 [MPC83xx_SEC2] = { 171 [MPC83xx_SEC2] = {
diff --git a/arch/ppc/syslib/mpc85xx_devices.c b/arch/ppc/syslib/mpc85xx_devices.c
index 8af322dd476a..bbc5ac0de878 100644
--- a/arch/ppc/syslib/mpc85xx_devices.c
+++ b/arch/ppc/syslib/mpc85xx_devices.c
@@ -282,7 +282,7 @@ struct platform_device ppc_sys_platform_devices[] = {
282 }, 282 },
283 [MPC85xx_DUART] = { 283 [MPC85xx_DUART] = {
284 .name = "serial8250", 284 .name = "serial8250",
285 .id = 0, 285 .id = PLAT8250_DEV_PLATFORM,
286 .dev.platform_data = serial_platform_data, 286 .dev.platform_data = serial_platform_data,
287 }, 287 },
288 [MPC85xx_PERFMON] = { 288 [MPC85xx_PERFMON] = {
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile
index 8189953a372c..a91daa324e88 100644
--- a/arch/ppc64/Makefile
+++ b/arch/ppc64/Makefile
@@ -89,11 +89,12 @@ drivers-$(CONFIG_OPROFILE) += arch/ppc64/oprofile/
89 89
90boot := arch/ppc64/boot 90boot := arch/ppc64/boot
91 91
92boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd 92boottargets-$(CONFIG_PPC_PSERIES) += zImage zImage.initrd
93boottarget-$(CONFIG_PPC_MAPLE) := zImage zImage.initrd 93boottargets-$(CONFIG_PPC_PMAC) += zImage.vmode zImage.initrd.vmode
94boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm 94boottargets-$(CONFIG_PPC_MAPLE) += zImage zImage.initrd
95boottarget-$(CONFIG_PPC_BPA) := zImage zImage.initrd 95boottargets-$(CONFIG_PPC_ISERIES) += vmlinux.sminitrd vmlinux.initrd vmlinux.sm
96$(boottarget-y): vmlinux 96boottargets-$(CONFIG_PPC_BPA) += zImage zImage.initrd
97$(boottargets-y): vmlinux
97 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ 98 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
98 99
99bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage 100bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage
@@ -131,10 +132,12 @@ include3/asm:
131 $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm 132 $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm
132 133
133define archhelp 134define archhelp
134 echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' 135 echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)'
135 echo ' zImage.initrd- Compressed kernel image with initrd attached,' 136 echo ' zImage.initrd.vmode - Compressed kernel image with initrd attached,'
136 echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz' 137 echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz'
137 echo ' (arch/$(ARCH)/boot/zImage.initrd)' 138 echo ' (arch/$(ARCH)/boot/zImage.initrd.vmode)'
139 echo ' zImage - zImage for pSeries machines'
140 echo ' zImage.initrd - zImage with initrd for pSeries machines'
138endef 141endef
139 142
140CLEAN_FILES += include/asm-ppc64/offsets.h 143CLEAN_FILES += include/asm-ppc64/offsets.h
diff --git a/arch/ppc64/boot/Makefile b/arch/ppc64/boot/Makefile
index 2c5f5e73d00c..33fdc8710891 100644
--- a/arch/ppc64/boot/Makefile
+++ b/arch/ppc64/boot/Makefile
@@ -37,6 +37,9 @@ quiet_cmd_bootcc = BOOTCC $@
37quiet_cmd_bootas = BOOTAS $@ 37quiet_cmd_bootas = BOOTAS $@
38 cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $< 38 cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<
39 39
40quiet_cmd_bootld = BOOTLD $@
41 cmd_bootld = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(2)
42
40$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c 43$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c
41 $(call if_changed_dep,bootcc) 44 $(call if_changed_dep,bootcc)
42$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S 45$(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S
@@ -53,7 +56,7 @@ src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
53gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section))) 56gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))
54 57
55hostprogs-y := addnote addRamDisk 58hostprogs-y := addnote addRamDisk
56targets += zImage zImage.initrd imagesize.c \ 59targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd imagesize.c \
57 $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \ 60 $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
58 $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \ 61 $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
59 $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \ 62 $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
@@ -63,7 +66,7 @@ extra-y := initrd.o
63quiet_cmd_ramdisk = RAMDISK $@ 66quiet_cmd_ramdisk = RAMDISK $@
64 cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@ 67 cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@
65 68
66quiet_cmd_stripvm = STRIP $@ 69quiet_cmd_stripvm = STRIP $@
67 cmd_stripvm = $(STRIP) -s $< -o $@ 70 cmd_stripvm = $(STRIP) -s $< -o $@
68 71
69vmlinux.strip: vmlinux FORCE 72vmlinux.strip: vmlinux FORCE
@@ -71,12 +74,20 @@ vmlinux.strip: vmlinux FORCE
71$(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE 74$(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE
72 $(call if_changed,ramdisk) 75 $(call if_changed,ramdisk)
73 76
74addsection = $(CROSS32OBJCOPY) $(1) \ 77quiet_cmd_addsection = ADDSEC $@
75 --add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(patsubst %.o,%.gz, $(1)) \ 78 cmd_addsection = $(CROSS32OBJCOPY) $@ \
76 --set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(OBJCOPYFLAGS) 79 --add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(patsubst %.o,%.gz, $@) \
80 --set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(OBJCOPYFLAGS)
81
82quiet_cmd_imagesize = GENSIZE $@
83 cmd_imagesize = ls -l vmlinux.strip | \
84 awk '{printf "/* generated -- do not edit! */\n" "unsigned long vmlinux_filesize = %d;\n", $$5}' \
85 > $(obj)/imagesize.c && \
86 $(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
87 awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' >> $(obj)/imagesize.c
77 88
78quiet_cmd_addnote = ADDNOTE $@ 89quiet_cmd_addnote = ADDNOTE $@
79 cmd_addnote = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(obj-boot) && $(obj)/addnote $@ 90 cmd_addnote = $(obj)/addnote $@
80 91
81$(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE 92$(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE
82 $(call if_changed,gzip) 93 $(call if_changed,gzip)
@@ -85,28 +96,30 @@ $(obj)/kernel-initrd.gz: $(obj)/ramdisk.image.gz
85 cp -f $(obj)/ramdisk.image.gz $@ 96 cp -f $(obj)/ramdisk.image.gz $@
86 97
87$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE 98$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE
88 touch $@ 99 @touch $@
89 100
90$(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE 101$(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE
91 $(call if_changed_dep,bootcc) 102 $(call if_changed_dep,bootcc)
92 $(call addsection, $@) 103 $(call cmd,addsection)
104
105$(obj)/zImage.vmode: obj-boot += $(call obj-sec, $(required))
106$(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) FORCE
107 $(call cmd,bootld,$(obj-boot))
108
109$(obj)/zImage.initrd.vmode: obj-boot += $(call obj-sec, $(required) $(initrd))
110$(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) FORCE
111 $(call cmd,bootld,$(obj-boot))
93 112
94$(obj)/zImage: obj-boot += $(call obj-sec, $(required)) 113$(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote FORCE
95$(obj)/zImage: $(call obj-sec, $(required)) $(obj-boot) $(obj)/addnote FORCE 114 @cp -f $< $@
96 $(call if_changed,addnote) 115 $(call if_changed,addnote)
97 116
98$(obj)/zImage.initrd: obj-boot += $(call obj-sec, $(required) $(initrd)) 117$(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote FORCE
99$(obj)/zImage.initrd: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(obj)/addnote FORCE 118 @cp -f $< $@
100 $(call if_changed,addnote) 119 $(call if_changed,addnote)
101 120
102$(obj)/imagesize.c: vmlinux.strip 121$(obj)/imagesize.c: vmlinux.strip
103 @echo Generating $@ 122 $(call cmd,imagesize)
104 ls -l vmlinux.strip | \
105 awk '{printf "/* generated -- do not edit! */\n" \
106 "unsigned long vmlinux_filesize = %d;\n", $$5}' > $(obj)/imagesize.c
107 $(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \
108 awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' \
109 >> $(obj)/imagesize.c
110 123
111install: $(CONFIGURE) $(BOOTIMAGE) 124install: $(CONFIGURE) $(BOOTIMAGE)
112 sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)" 125 sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)"
diff --git a/arch/ppc64/boot/main.c b/arch/ppc64/boot/main.c
index 99e68cfbe688..f7ec19a2d0b0 100644
--- a/arch/ppc64/boot/main.c
+++ b/arch/ppc64/boot/main.c
@@ -23,7 +23,8 @@ extern void flush_cache(void *, unsigned long);
23 23
24/* Value picked to match that used by yaboot */ 24/* Value picked to match that used by yaboot */
25#define PROG_START 0x01400000 25#define PROG_START 0x01400000
26#define RAM_END (256<<20) // Fixme: use OF */ 26#define RAM_END (512<<20) // Fixme: use OF */
27#define ONE_MB 0x100000
27 28
28static char *avail_ram; 29static char *avail_ram;
29static char *begin_avail, *end_avail; 30static char *begin_avail, *end_avail;
@@ -32,6 +33,7 @@ static unsigned int heap_use;
32static unsigned int heap_max; 33static unsigned int heap_max;
33 34
34extern char _start[]; 35extern char _start[];
36extern char _end[];
35extern char _vmlinux_start[]; 37extern char _vmlinux_start[];
36extern char _vmlinux_end[]; 38extern char _vmlinux_end[];
37extern char _initrd_start[]; 39extern char _initrd_start[];
@@ -58,13 +60,13 @@ typedef void (*kernel_entry_t)( unsigned long,
58 60
59#undef DEBUG 61#undef DEBUG
60 62
61static unsigned long claim_base = PROG_START; 63static unsigned long claim_base;
62 64
63static unsigned long try_claim(unsigned long size) 65static unsigned long try_claim(unsigned long size)
64{ 66{
65 unsigned long addr = 0; 67 unsigned long addr = 0;
66 68
67 for(; claim_base < RAM_END; claim_base += 0x100000) { 69 for(; claim_base < RAM_END; claim_base += ONE_MB) {
68#ifdef DEBUG 70#ifdef DEBUG
69 printf(" trying: 0x%08lx\n\r", claim_base); 71 printf(" trying: 0x%08lx\n\r", claim_base);
70#endif 72#endif
@@ -95,7 +97,26 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
95 if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4) 97 if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
96 exit(); 98 exit();
97 99
98 printf("\n\rzImage starting: loaded at 0x%x\n\r", (unsigned)_start); 100 printf("\n\rzImage starting: loaded at 0x%lx\n\r", (unsigned long) _start);
101
102 /*
103 * The first available claim_base must be above the end of the
104 * the loaded kernel wrapper file (_start to _end includes the
105 * initrd image if it is present) and rounded up to a nice
106 * 1 MB boundary for good measure.
107 */
108
109 claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
110
111#if defined(PROG_START)
112 /*
113 * Maintain a "magic" minimum address. This keeps some older
114 * firmware platforms running.
115 */
116
117 if (claim_base < PROG_START)
118 claim_base = PROG_START;
119#endif
99 120
100 /* 121 /*
101 * Now we try to claim some memory for the kernel itself 122 * Now we try to claim some memory for the kernel itself
@@ -105,7 +126,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr)
105 * size... In practice we add 1Mb, that is enough, but we should really 126 * size... In practice we add 1Mb, that is enough, but we should really
106 * consider fixing the Makefile to put a _raw_ kernel in there ! 127 * consider fixing the Makefile to put a _raw_ kernel in there !
107 */ 128 */
108 vmlinux_memsize += 0x100000; 129 vmlinux_memsize += ONE_MB;
109 printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize); 130 printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize);
110 vmlinux.addr = try_claim(vmlinux_memsize); 131 vmlinux.addr = try_claim(vmlinux_memsize);
111 if (vmlinux.addr == 0) { 132 if (vmlinux.addr == 0) {
diff --git a/arch/ppc64/kernel/bpa_iic.c b/arch/ppc64/kernel/bpa_iic.c
index c8f3dc3fad70..0aaa878e19d3 100644
--- a/arch/ppc64/kernel/bpa_iic.c
+++ b/arch/ppc64/kernel/bpa_iic.c
@@ -205,6 +205,18 @@ static struct iic_regs __iomem *find_iic(int cpu)
205} 205}
206 206
207#ifdef CONFIG_SMP 207#ifdef CONFIG_SMP
208
209/* Use the highest interrupt priorities for IPI */
210static inline int iic_ipi_to_irq(int ipi)
211{
212 return IIC_IPI_OFFSET + IIC_NUM_IPIS - 1 - ipi;
213}
214
215static inline int iic_irq_to_ipi(int irq)
216{
217 return IIC_NUM_IPIS - 1 - (irq - IIC_IPI_OFFSET);
218}
219
208void iic_setup_cpu(void) 220void iic_setup_cpu(void)
209{ 221{
210 out_be64(&__get_cpu_var(iic).regs->prio, 0xff); 222 out_be64(&__get_cpu_var(iic).regs->prio, 0xff);
@@ -212,18 +224,20 @@ void iic_setup_cpu(void)
212 224
213void iic_cause_IPI(int cpu, int mesg) 225void iic_cause_IPI(int cpu, int mesg)
214{ 226{
215 out_be64(&per_cpu(iic, cpu).regs->generate, mesg); 227 out_be64(&per_cpu(iic, cpu).regs->generate, (IIC_NUM_IPIS - 1 - mesg) << 4);
216} 228}
217 229
218static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs) 230static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs)
219{ 231{
220 232 smp_message_recv(iic_irq_to_ipi(irq), regs);
221 smp_message_recv(irq - IIC_IPI_OFFSET, regs);
222 return IRQ_HANDLED; 233 return IRQ_HANDLED;
223} 234}
224 235
225static void iic_request_ipi(int irq, const char *name) 236static void iic_request_ipi(int ipi, const char *name)
226{ 237{
238 int irq;
239
240 irq = iic_ipi_to_irq(ipi);
227 /* IPIs are marked SA_INTERRUPT as they must run with irqs 241 /* IPIs are marked SA_INTERRUPT as they must run with irqs
228 * disabled */ 242 * disabled */
229 get_irq_desc(irq)->handler = &iic_pic; 243 get_irq_desc(irq)->handler = &iic_pic;
@@ -233,10 +247,10 @@ static void iic_request_ipi(int irq, const char *name)
233 247
234void iic_request_IPIs(void) 248void iic_request_IPIs(void)
235{ 249{
236 iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_CALL_FUNCTION, "IPI-call"); 250 iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call");
237 iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_RESCHEDULE, "IPI-resched"); 251 iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched");
238#ifdef CONFIG_DEBUGGER 252#ifdef CONFIG_DEBUGGER
239 iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); 253 iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug");
240#endif /* CONFIG_DEBUGGER */ 254#endif /* CONFIG_DEBUGGER */
241} 255}
242#endif /* CONFIG_SMP */ 256#endif /* CONFIG_SMP */
diff --git a/arch/ppc64/kernel/eeh.c b/arch/ppc64/kernel/eeh.c
index af5272fedadf..ba93fd731222 100644
--- a/arch/ppc64/kernel/eeh.c
+++ b/arch/ppc64/kernel/eeh.c
@@ -202,10 +202,9 @@ static void pci_addr_cache_print(struct pci_io_addr_cache *cache)
202 while (n) { 202 while (n) {
203 struct pci_io_addr_range *piar; 203 struct pci_io_addr_range *piar;
204 piar = rb_entry(n, struct pci_io_addr_range, rb_node); 204 piar = rb_entry(n, struct pci_io_addr_range, rb_node);
205 printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s %s\n", 205 printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s\n",
206 (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt, 206 (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt,
207 piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev), 207 piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev));
208 pci_pretty_name(piar->pcidev));
209 cnt++; 208 cnt++;
210 n = rb_next(n); 209 n = rb_next(n);
211 } 210 }
@@ -255,22 +254,24 @@ pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo,
255static void __pci_addr_cache_insert_device(struct pci_dev *dev) 254static void __pci_addr_cache_insert_device(struct pci_dev *dev)
256{ 255{
257 struct device_node *dn; 256 struct device_node *dn;
257 struct pci_dn *pdn;
258 int i; 258 int i;
259 int inserted = 0; 259 int inserted = 0;
260 260
261 dn = pci_device_to_OF_node(dev); 261 dn = pci_device_to_OF_node(dev);
262 if (!dn) { 262 if (!dn) {
263 printk(KERN_WARNING "PCI: no pci dn found for dev=%s %s\n", 263 printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n",
264 pci_name(dev), pci_pretty_name(dev)); 264 pci_name(dev));
265 return; 265 return;
266 } 266 }
267 267
268 /* Skip any devices for which EEH is not enabled. */ 268 /* Skip any devices for which EEH is not enabled. */
269 if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) || 269 pdn = dn->data;
270 dn->eeh_mode & EEH_MODE_NOCHECK) { 270 if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
271 pdn->eeh_mode & EEH_MODE_NOCHECK) {
271#ifdef DEBUG 272#ifdef DEBUG
272 printk(KERN_INFO "PCI: skip building address cache for=%s %s\n", 273 printk(KERN_INFO "PCI: skip building address cache for=%s\n",
273 pci_name(dev), pci_pretty_name(dev)); 274 pci_name(dev));
274#endif 275#endif
275 return; 276 return;
276 } 277 }
@@ -416,6 +417,7 @@ int eeh_unregister_notifier(struct notifier_block *nb)
416static int read_slot_reset_state(struct device_node *dn, int rets[]) 417static int read_slot_reset_state(struct device_node *dn, int rets[])
417{ 418{
418 int token, outputs; 419 int token, outputs;
420 struct pci_dn *pdn = dn->data;
419 421
420 if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) { 422 if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
421 token = ibm_read_slot_reset_state2; 423 token = ibm_read_slot_reset_state2;
@@ -425,8 +427,8 @@ static int read_slot_reset_state(struct device_node *dn, int rets[])
425 outputs = 3; 427 outputs = 3;
426 } 428 }
427 429
428 return rtas_call(token, 3, outputs, rets, dn->eeh_config_addr, 430 return rtas_call(token, 3, outputs, rets, pdn->eeh_config_addr,
429 BUID_HI(dn->phb->buid), BUID_LO(dn->phb->buid)); 431 BUID_HI(pdn->phb->buid), BUID_LO(pdn->phb->buid));
430} 432}
431 433
432/** 434/**
@@ -447,12 +449,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state)
447 * in light of potential corruption, we can use it here. 449 * in light of potential corruption, we can use it here.
448 */ 450 */
449 if (panic_on_oops) 451 if (panic_on_oops)
450 panic("EEH: MMIO failure (%d) on device:%s %s\n", reset_state, 452 panic("EEH: MMIO failure (%d) on device:%s\n", reset_state,
451 pci_name(dev), pci_pretty_name(dev)); 453 pci_name(dev));
452 else { 454 else {
453 __get_cpu_var(ignored_failures)++; 455 __get_cpu_var(ignored_failures)++;
454 printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s %s\n", 456 printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n",
455 reset_state, pci_name(dev), pci_pretty_name(dev)); 457 reset_state, pci_name(dev));
456 } 458 }
457} 459}
458 460
@@ -482,8 +484,8 @@ static void eeh_event_handler(void *dummy)
482 break; 484 break;
483 485
484 printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device " 486 printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device "
485 "%s %s\n", event->reset_state, 487 "%s\n", event->reset_state,
486 pci_name(event->dev), pci_pretty_name(event->dev)); 488 pci_name(event->dev));
487 489
488 atomic_set(&eeh_fail_count, 0); 490 atomic_set(&eeh_fail_count, 0);
489 notifier_call_chain (&eeh_notifier_chain, 491 notifier_call_chain (&eeh_notifier_chain,
@@ -535,6 +537,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
535 unsigned long flags; 537 unsigned long flags;
536 int rc, reset_state; 538 int rc, reset_state;
537 struct eeh_event *event; 539 struct eeh_event *event;
540 struct pci_dn *pdn;
538 541
539 __get_cpu_var(total_mmio_ffs)++; 542 __get_cpu_var(total_mmio_ffs)++;
540 543
@@ -543,14 +546,15 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
543 546
544 if (!dn) 547 if (!dn)
545 return 0; 548 return 0;
549 pdn = dn->data;
546 550
547 /* Access to IO BARs might get this far and still not want checking. */ 551 /* Access to IO BARs might get this far and still not want checking. */
548 if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) || 552 if (!pdn->eeh_capable || !(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
549 dn->eeh_mode & EEH_MODE_NOCHECK) { 553 pdn->eeh_mode & EEH_MODE_NOCHECK) {
550 return 0; 554 return 0;
551 } 555 }
552 556
553 if (!dn->eeh_config_addr) { 557 if (!pdn->eeh_config_addr) {
554 return 0; 558 return 0;
555 } 559 }
556 560
@@ -558,7 +562,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
558 * If we already have a pending isolation event for this 562 * If we already have a pending isolation event for this
559 * slot, we know it's bad already, we don't need to check... 563 * slot, we know it's bad already, we don't need to check...
560 */ 564 */
561 if (dn->eeh_mode & EEH_MODE_ISOLATED) { 565 if (pdn->eeh_mode & EEH_MODE_ISOLATED) {
562 atomic_inc(&eeh_fail_count); 566 atomic_inc(&eeh_fail_count);
563 if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) { 567 if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) {
564 /* re-read the slot reset state */ 568 /* re-read the slot reset state */
@@ -583,7 +587,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
583 } 587 }
584 588
585 /* prevent repeated reports of this failure */ 589 /* prevent repeated reports of this failure */
586 dn->eeh_mode |= EEH_MODE_ISOLATED; 590 pdn->eeh_mode |= EEH_MODE_ISOLATED;
587 591
588 reset_state = rets[0]; 592 reset_state = rets[0];
589 593
@@ -591,9 +595,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
591 memset(slot_errbuf, 0, eeh_error_buf_size); 595 memset(slot_errbuf, 0, eeh_error_buf_size);
592 596
593 rc = rtas_call(ibm_slot_error_detail, 597 rc = rtas_call(ibm_slot_error_detail,
594 8, 1, NULL, dn->eeh_config_addr, 598 8, 1, NULL, pdn->eeh_config_addr,
595 BUID_HI(dn->phb->buid), 599 BUID_HI(pdn->phb->buid),
596 BUID_LO(dn->phb->buid), NULL, 0, 600 BUID_LO(pdn->phb->buid), NULL, 0,
597 virt_to_phys(slot_errbuf), 601 virt_to_phys(slot_errbuf),
598 eeh_error_buf_size, 602 eeh_error_buf_size,
599 1 /* Temporary Error */); 603 1 /* Temporary Error */);
@@ -680,8 +684,9 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
680 u32 *device_id = (u32 *)get_property(dn, "device-id", NULL); 684 u32 *device_id = (u32 *)get_property(dn, "device-id", NULL);
681 u32 *regs; 685 u32 *regs;
682 int enable; 686 int enable;
687 struct pci_dn *pdn = dn->data;
683 688
684 dn->eeh_mode = 0; 689 pdn->eeh_mode = 0;
685 690
686 if (status && strcmp(status, "ok") != 0) 691 if (status && strcmp(status, "ok") != 0)
687 return NULL; /* ignore devices with bad status */ 692 return NULL; /* ignore devices with bad status */
@@ -692,7 +697,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
692 697
693 /* There is nothing to check on PCI to ISA bridges */ 698 /* There is nothing to check on PCI to ISA bridges */
694 if (dn->type && !strcmp(dn->type, "isa")) { 699 if (dn->type && !strcmp(dn->type, "isa")) {
695 dn->eeh_mode |= EEH_MODE_NOCHECK; 700 pdn->eeh_mode |= EEH_MODE_NOCHECK;
696 return NULL; 701 return NULL;
697 } 702 }
698 703
@@ -709,7 +714,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
709 enable = 0; 714 enable = 0;
710 715
711 if (!enable) 716 if (!enable)
712 dn->eeh_mode |= EEH_MODE_NOCHECK; 717 pdn->eeh_mode |= EEH_MODE_NOCHECK;
713 718
714 /* Ok... see if this device supports EEH. Some do, some don't, 719 /* Ok... see if this device supports EEH. Some do, some don't,
715 * and the only way to find out is to check each and every one. */ 720 * and the only way to find out is to check each and every one. */
@@ -722,8 +727,8 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
722 EEH_ENABLE); 727 EEH_ENABLE);
723 if (ret == 0) { 728 if (ret == 0) {
724 eeh_subsystem_enabled = 1; 729 eeh_subsystem_enabled = 1;
725 dn->eeh_mode |= EEH_MODE_SUPPORTED; 730 pdn->eeh_mode |= EEH_MODE_SUPPORTED;
726 dn->eeh_config_addr = regs[0]; 731 pdn->eeh_config_addr = regs[0];
727#ifdef DEBUG 732#ifdef DEBUG
728 printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name); 733 printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name);
729#endif 734#endif
@@ -731,10 +736,11 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
731 736
732 /* This device doesn't support EEH, but it may have an 737 /* This device doesn't support EEH, but it may have an
733 * EEH parent, in which case we mark it as supported. */ 738 * EEH parent, in which case we mark it as supported. */
734 if (dn->parent && (dn->parent->eeh_mode & EEH_MODE_SUPPORTED)) { 739 if (dn->parent && dn->parent->data
740 && (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
735 /* Parent supports EEH. */ 741 /* Parent supports EEH. */
736 dn->eeh_mode |= EEH_MODE_SUPPORTED; 742 pdn->eeh_mode |= EEH_MODE_SUPPORTED;
737 dn->eeh_config_addr = dn->parent->eeh_config_addr; 743 pdn->eeh_config_addr = PCI_DN(dn->parent)->eeh_config_addr;
738 return NULL; 744 return NULL;
739 } 745 }
740 } 746 }
@@ -791,11 +797,13 @@ void __init eeh_init(void)
791 for (phb = of_find_node_by_name(NULL, "pci"); phb; 797 for (phb = of_find_node_by_name(NULL, "pci"); phb;
792 phb = of_find_node_by_name(phb, "pci")) { 798 phb = of_find_node_by_name(phb, "pci")) {
793 unsigned long buid; 799 unsigned long buid;
800 struct pci_dn *pci;
794 801
795 buid = get_phb_buid(phb); 802 buid = get_phb_buid(phb);
796 if (buid == 0) 803 if (buid == 0 || phb->data == NULL)
797 continue; 804 continue;
798 805
806 pci = phb->data;
799 info.buid_lo = BUID_LO(buid); 807 info.buid_lo = BUID_LO(buid);
800 info.buid_hi = BUID_HI(buid); 808 info.buid_hi = BUID_HI(buid);
801 traverse_pci_devices(phb, early_enable_eeh, &info); 809 traverse_pci_devices(phb, early_enable_eeh, &info);
@@ -824,9 +832,9 @@ void eeh_add_device_early(struct device_node *dn)
824 struct pci_controller *phb; 832 struct pci_controller *phb;
825 struct eeh_early_enable_info info; 833 struct eeh_early_enable_info info;
826 834
827 if (!dn) 835 if (!dn || !dn->data)
828 return; 836 return;
829 phb = dn->phb; 837 phb = PCI_DN(dn)->phb;
830 if (NULL == phb || 0 == phb->buid) { 838 if (NULL == phb || 0 == phb->buid) {
831 printk(KERN_WARNING "EEH: Expected buid but found none\n"); 839 printk(KERN_WARNING "EEH: Expected buid but found none\n");
832 return; 840 return;
@@ -851,8 +859,7 @@ void eeh_add_device_late(struct pci_dev *dev)
851 return; 859 return;
852 860
853#ifdef DEBUG 861#ifdef DEBUG
854 printk(KERN_DEBUG "EEH: adding device %s %s\n", pci_name(dev), 862 printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev));
855 pci_pretty_name(dev));
856#endif 863#endif
857 864
858 pci_addr_cache_insert_device (dev); 865 pci_addr_cache_insert_device (dev);
@@ -873,8 +880,7 @@ void eeh_remove_device(struct pci_dev *dev)
873 880
874 /* Unregister the device with the EEH/PCI address search system */ 881 /* Unregister the device with the EEH/PCI address search system */
875#ifdef DEBUG 882#ifdef DEBUG
876 printk(KERN_DEBUG "EEH: remove device %s %s\n", pci_name(dev), 883 printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev));
877 pci_pretty_name(dev));
878#endif 884#endif
879 pci_addr_cache_remove_device(dev); 885 pci_addr_cache_remove_device(dev);
880} 886}
diff --git a/arch/ppc64/kernel/iSeries_VpdInfo.c b/arch/ppc64/kernel/iSeries_VpdInfo.c
index d11c732daf81..5d921792571f 100644
--- a/arch/ppc64/kernel/iSeries_VpdInfo.c
+++ b/arch/ppc64/kernel/iSeries_VpdInfo.c
@@ -264,8 +264,5 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
264 printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ", 264 printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ",
265 count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor, 265 count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
266 frame, card); 266 frame, card);
267 if (pci_class_name(PciDev->class >> 8) == 0) 267 printk("0x%04X\n", (int)(PciDev->class >> 8));
268 printk("0x%04X\n", (int)(PciDev->class >> 8));
269 else
270 printk("%s\n", pci_class_name(PciDev->class >> 8));
271} 268}
diff --git a/arch/ppc64/kernel/iomap.c b/arch/ppc64/kernel/iomap.c
index 153cc8b0f136..6160c8dbb7c5 100644
--- a/arch/ppc64/kernel/iomap.c
+++ b/arch/ppc64/kernel/iomap.c
@@ -22,13 +22,23 @@ unsigned int fastcall ioread16(void __iomem *addr)
22{ 22{
23 return readw(addr); 23 return readw(addr);
24} 24}
25unsigned int fastcall ioread16be(void __iomem *addr)
26{
27 return in_be16(addr);
28}
25unsigned int fastcall ioread32(void __iomem *addr) 29unsigned int fastcall ioread32(void __iomem *addr)
26{ 30{
27 return readl(addr); 31 return readl(addr);
28} 32}
33unsigned int fastcall ioread32be(void __iomem *addr)
34{
35 return in_be32(addr);
36}
29EXPORT_SYMBOL(ioread8); 37EXPORT_SYMBOL(ioread8);
30EXPORT_SYMBOL(ioread16); 38EXPORT_SYMBOL(ioread16);
39EXPORT_SYMBOL(ioread16be);
31EXPORT_SYMBOL(ioread32); 40EXPORT_SYMBOL(ioread32);
41EXPORT_SYMBOL(ioread32be);
32 42
33void fastcall iowrite8(u8 val, void __iomem *addr) 43void fastcall iowrite8(u8 val, void __iomem *addr)
34{ 44{
@@ -38,13 +48,23 @@ void fastcall iowrite16(u16 val, void __iomem *addr)
38{ 48{
39 writew(val, addr); 49 writew(val, addr);
40} 50}
51void fastcall iowrite16be(u16 val, void __iomem *addr)
52{
53 out_be16(addr, val);
54}
41void fastcall iowrite32(u32 val, void __iomem *addr) 55void fastcall iowrite32(u32 val, void __iomem *addr)
42{ 56{
43 writel(val, addr); 57 writel(val, addr);
44} 58}
59void fastcall iowrite32be(u32 val, void __iomem *addr)
60{
61 out_be32(addr, val);
62}
45EXPORT_SYMBOL(iowrite8); 63EXPORT_SYMBOL(iowrite8);
46EXPORT_SYMBOL(iowrite16); 64EXPORT_SYMBOL(iowrite16);
65EXPORT_SYMBOL(iowrite16be);
47EXPORT_SYMBOL(iowrite32); 66EXPORT_SYMBOL(iowrite32);
67EXPORT_SYMBOL(iowrite32be);
48 68
49/* 69/*
50 * These are the "repeat read/write" functions. Note the 70 * These are the "repeat read/write" functions. Note the
@@ -56,15 +76,15 @@ EXPORT_SYMBOL(iowrite32);
56 */ 76 */
57void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) 77void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
58{ 78{
59 _insb((u8 __force *) addr, dst, count); 79 _insb((u8 __iomem *) addr, dst, count);
60} 80}
61void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) 81void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
62{ 82{
63 _insw_ns((u16 __force *) addr, dst, count); 83 _insw_ns((u16 __iomem *) addr, dst, count);
64} 84}
65void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) 85void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
66{ 86{
67 _insl_ns((u32 __force *) addr, dst, count); 87 _insl_ns((u32 __iomem *) addr, dst, count);
68} 88}
69EXPORT_SYMBOL(ioread8_rep); 89EXPORT_SYMBOL(ioread8_rep);
70EXPORT_SYMBOL(ioread16_rep); 90EXPORT_SYMBOL(ioread16_rep);
@@ -72,15 +92,15 @@ EXPORT_SYMBOL(ioread32_rep);
72 92
73void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) 93void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
74{ 94{
75 _outsb((u8 __force *) addr, src, count); 95 _outsb((u8 __iomem *) addr, src, count);
76} 96}
77void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) 97void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
78{ 98{
79 _outsw_ns((u16 __force *) addr, src, count); 99 _outsw_ns((u16 __iomem *) addr, src, count);
80} 100}
81void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) 101void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
82{ 102{
83 _outsl_ns((u32 __force *) addr, src, count); 103 _outsl_ns((u32 __iomem *) addr, src, count);
84} 104}
85EXPORT_SYMBOL(iowrite8_rep); 105EXPORT_SYMBOL(iowrite8_rep);
86EXPORT_SYMBOL(iowrite16_rep); 106EXPORT_SYMBOL(iowrite16_rep);
diff --git a/arch/ppc64/kernel/iommu.c b/arch/ppc64/kernel/iommu.c
index 845eebd1e28d..9032b6bfe036 100644
--- a/arch/ppc64/kernel/iommu.c
+++ b/arch/ppc64/kernel/iommu.c
@@ -438,7 +438,8 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl)
438 438
439void iommu_free_table(struct device_node *dn) 439void iommu_free_table(struct device_node *dn)
440{ 440{
441 struct iommu_table *tbl = dn->iommu_table; 441 struct pci_dn *pdn = dn->data;
442 struct iommu_table *tbl = pdn->iommu_table;
442 unsigned long bitmap_sz, i; 443 unsigned long bitmap_sz, i;
443 unsigned int order; 444 unsigned int order;
444 445
diff --git a/arch/ppc64/kernel/maple_pci.c b/arch/ppc64/kernel/maple_pci.c
index 53993999b265..5a8b4d8c2dd6 100644
--- a/arch/ppc64/kernel/maple_pci.c
+++ b/arch/ppc64/kernel/maple_pci.c
@@ -447,9 +447,9 @@ void __init maple_pci_init(void)
447 */ 447 */
448 if (u3_agp) { 448 if (u3_agp) {
449 struct device_node *np = u3_agp->arch_data; 449 struct device_node *np = u3_agp->arch_data;
450 np->busno = 0xf0; 450 PCI_DN(np)->busno = 0xf0;
451 for (np = np->child; np; np = np->sibling) 451 for (np = np->child; np; np = np->sibling)
452 np->busno = 0xf0; 452 PCI_DN(np)->busno = 0xf0;
453 } 453 }
454 454
455 /* Tell pci.c to use the common resource allocation mecanism */ 455 /* Tell pci.c to use the common resource allocation mecanism */
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S
index 6d860c1d9fa0..c047663eb48d 100644
--- a/arch/ppc64/kernel/misc.S
+++ b/arch/ppc64/kernel/misc.S
@@ -1431,9 +1431,9 @@ _GLOBAL(sys_call_table)
1431 .llong .sys_ni_syscall /* 195 - 32bit only stat64 */ 1431 .llong .sys_ni_syscall /* 195 - 32bit only stat64 */
1432 .llong .sys_ni_syscall /* 32bit only lstat64 */ 1432 .llong .sys_ni_syscall /* 32bit only lstat64 */
1433 .llong .sys_ni_syscall /* 32bit only fstat64 */ 1433 .llong .sys_ni_syscall /* 32bit only fstat64 */
1434 .llong .sys_ni_syscall /* 32bit only pciconfig_read */ 1434 .llong .sys_pciconfig_read
1435 .llong .sys_ni_syscall /* 32bit only pciconfig_write */ 1435 .llong .sys_pciconfig_write
1436 .llong .sys_ni_syscall /* 32bit only pciconfig_iobase */ 1436 .llong .sys_pciconfig_iobase /* 200 - pciconfig_iobase */
1437 .llong .sys_ni_syscall /* reserved for MacOnLinux */ 1437 .llong .sys_ni_syscall /* reserved for MacOnLinux */
1438 .llong .sys_getdents64 1438 .llong .sys_getdents64
1439 .llong .sys_pivot_root 1439 .llong .sys_pivot_root
diff --git a/arch/ppc64/kernel/pSeries_iommu.c b/arch/ppc64/kernel/pSeries_iommu.c
index 9d5e1e7fc389..f0fd7fbd6531 100644
--- a/arch/ppc64/kernel/pSeries_iommu.c
+++ b/arch/ppc64/kernel/pSeries_iommu.c
@@ -295,7 +295,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb,
295 struct iommu_table *tbl, 295 struct iommu_table *tbl,
296 unsigned int *dma_window) 296 unsigned int *dma_window)
297{ 297{
298 tbl->it_busno = dn->bussubno; 298 tbl->it_busno = PCI_DN(dn)->bussubno;
299 299
300 /* TODO: Parse field size properties properly. */ 300 /* TODO: Parse field size properties properly. */
301 tbl->it_size = (((unsigned long)dma_window[4] << 32) | 301 tbl->it_size = (((unsigned long)dma_window[4] << 32) |
@@ -311,6 +311,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb,
311static void iommu_bus_setup_pSeries(struct pci_bus *bus) 311static void iommu_bus_setup_pSeries(struct pci_bus *bus)
312{ 312{
313 struct device_node *dn, *pdn; 313 struct device_node *dn, *pdn;
314 struct pci_dn *pci;
314 struct iommu_table *tbl; 315 struct iommu_table *tbl;
315 316
316 DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self); 317 DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self);
@@ -325,6 +326,7 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
325 */ 326 */
326 327
327 dn = pci_bus_to_OF_node(bus); 328 dn = pci_bus_to_OF_node(bus);
329 pci = dn->data;
328 330
329 if (!bus->self) { 331 if (!bus->self) {
330 /* Root bus */ 332 /* Root bus */
@@ -341,18 +343,18 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
341 * alltogether. This leaves 768MB for the window. 343 * alltogether. This leaves 768MB for the window.
342 */ 344 */
343 DBG("PHB has io-hole, reserving 256MB\n"); 345 DBG("PHB has io-hole, reserving 256MB\n");
344 dn->phb->dma_window_size = 3 << 28; 346 pci->phb->dma_window_size = 3 << 28;
345 dn->phb->dma_window_base_cur = 1 << 28; 347 pci->phb->dma_window_base_cur = 1 << 28;
346 } else { 348 } else {
347 /* 1GB window by default */ 349 /* 1GB window by default */
348 dn->phb->dma_window_size = 1 << 30; 350 pci->phb->dma_window_size = 1 << 30;
349 dn->phb->dma_window_base_cur = 0; 351 pci->phb->dma_window_base_cur = 0;
350 } 352 }
351 353
352 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); 354 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
353 355
354 iommu_table_setparms(dn->phb, dn, tbl); 356 iommu_table_setparms(pci->phb, dn, tbl);
355 dn->iommu_table = iommu_init_table(tbl); 357 pci->iommu_table = iommu_init_table(tbl);
356 } else { 358 } else {
357 /* Do a 128MB table at root. This is used for the IDE 359 /* Do a 128MB table at root. This is used for the IDE
358 * controller on some SMP-mode POWER4 machines. It 360 * controller on some SMP-mode POWER4 machines. It
@@ -363,16 +365,16 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
363 * Allocate at offset 128MB to avoid having to deal 365 * Allocate at offset 128MB to avoid having to deal
364 * with ISA holes; 128MB table for IDE is plenty. 366 * with ISA holes; 128MB table for IDE is plenty.
365 */ 367 */
366 dn->phb->dma_window_size = 1 << 27; 368 pci->phb->dma_window_size = 1 << 27;
367 dn->phb->dma_window_base_cur = 1 << 27; 369 pci->phb->dma_window_base_cur = 1 << 27;
368 370
369 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); 371 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
370 372
371 iommu_table_setparms(dn->phb, dn, tbl); 373 iommu_table_setparms(pci->phb, dn, tbl);
372 dn->iommu_table = iommu_init_table(tbl); 374 pci->iommu_table = iommu_init_table(tbl);
373 375
374 /* All child buses have 256MB tables */ 376 /* All child buses have 256MB tables */
375 dn->phb->dma_window_size = 1 << 28; 377 pci->phb->dma_window_size = 1 << 28;
376 } 378 }
377 } else { 379 } else {
378 pdn = pci_bus_to_OF_node(bus->parent); 380 pdn = pci_bus_to_OF_node(bus->parent);
@@ -386,12 +388,12 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus)
386 388
387 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); 389 tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL);
388 390
389 iommu_table_setparms(dn->phb, dn, tbl); 391 iommu_table_setparms(pci->phb, dn, tbl);
390 392
391 dn->iommu_table = iommu_init_table(tbl); 393 pci->iommu_table = iommu_init_table(tbl);
392 } else { 394 } else {
393 /* Lower than first child or under python, use parent table */ 395 /* Lower than first child or under python, use parent table */
394 dn->iommu_table = pdn->iommu_table; 396 pci->iommu_table = PCI_DN(pdn)->iommu_table;
395 } 397 }
396 } 398 }
397} 399}
@@ -401,6 +403,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus)
401{ 403{
402 struct iommu_table *tbl; 404 struct iommu_table *tbl;
403 struct device_node *dn, *pdn; 405 struct device_node *dn, *pdn;
406 struct pci_dn *ppci;
404 unsigned int *dma_window = NULL; 407 unsigned int *dma_window = NULL;
405 408
406 DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); 409 DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self);
@@ -419,22 +422,24 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus)
419 return; 422 return;
420 } 423 }
421 424
422 if (!pdn->iommu_table) { 425 ppci = pdn->data;
426 if (!ppci->iommu_table) {
423 /* Bussubno hasn't been copied yet. 427 /* Bussubno hasn't been copied yet.
424 * Do it now because iommu_table_setparms_lpar needs it. 428 * Do it now because iommu_table_setparms_lpar needs it.
425 */ 429 */
426 pdn->bussubno = bus->number; 430
431 ppci->bussubno = bus->number;
427 432
428 tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), 433 tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
429 GFP_KERNEL); 434 GFP_KERNEL);
430 435
431 iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window); 436 iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window);
432 437
433 pdn->iommu_table = iommu_init_table(tbl); 438 ppci->iommu_table = iommu_init_table(tbl);
434 } 439 }
435 440
436 if (pdn != dn) 441 if (pdn != dn)
437 dn->iommu_table = pdn->iommu_table; 442 PCI_DN(dn)->iommu_table = ppci->iommu_table;
438} 443}
439 444
440 445
@@ -449,11 +454,11 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev)
449 */ 454 */
450 mydn = dn = pci_device_to_OF_node(dev); 455 mydn = dn = pci_device_to_OF_node(dev);
451 456
452 while (dn && dn->iommu_table == NULL) 457 while (dn && dn->data && PCI_DN(dn)->iommu_table == NULL)
453 dn = dn->parent; 458 dn = dn->parent;
454 459
455 if (dn) { 460 if (dn && dn->data) {
456 mydn->iommu_table = dn->iommu_table; 461 PCI_DN(mydn)->iommu_table = PCI_DN(dn)->iommu_table;
457 } else { 462 } else {
458 DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name); 463 DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name);
459 } 464 }
@@ -463,10 +468,11 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
463{ 468{
464 int err = NOTIFY_OK; 469 int err = NOTIFY_OK;
465 struct device_node *np = node; 470 struct device_node *np = node;
471 struct pci_dn *pci = np->data;
466 472
467 switch (action) { 473 switch (action) {
468 case PSERIES_RECONFIG_REMOVE: 474 case PSERIES_RECONFIG_REMOVE:
469 if (np->iommu_table && 475 if (pci->iommu_table &&
470 get_property(np, "ibm,dma-window", NULL)) 476 get_property(np, "ibm,dma-window", NULL))
471 iommu_free_table(np); 477 iommu_free_table(np);
472 break; 478 break;
@@ -486,6 +492,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
486 struct device_node *pdn, *dn; 492 struct device_node *pdn, *dn;
487 struct iommu_table *tbl; 493 struct iommu_table *tbl;
488 int *dma_window = NULL; 494 int *dma_window = NULL;
495 struct pci_dn *pci;
489 496
490 DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name); 497 DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name);
491 498
@@ -497,8 +504,10 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
497 */ 504 */
498 dn = pci_device_to_OF_node(dev); 505 dn = pci_device_to_OF_node(dev);
499 506
500 for (pdn = dn; pdn && !pdn->iommu_table; pdn = pdn->parent) { 507 for (pdn = dn; pdn && pdn->data && !PCI_DN(pdn)->iommu_table;
501 dma_window = (unsigned int *)get_property(pdn, "ibm,dma-window", NULL); 508 pdn = pdn->parent) {
509 dma_window = (unsigned int *)
510 get_property(pdn, "ibm,dma-window", NULL);
502 if (dma_window) 511 if (dma_window)
503 break; 512 break;
504 } 513 }
@@ -515,20 +524,21 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
515 DBG("Found DMA window, allocating table\n"); 524 DBG("Found DMA window, allocating table\n");
516 } 525 }
517 526
518 if (!pdn->iommu_table) { 527 pci = pdn->data;
528 if (!pci->iommu_table) {
519 /* iommu_table_setparms_lpar needs bussubno. */ 529 /* iommu_table_setparms_lpar needs bussubno. */
520 pdn->bussubno = pdn->phb->bus->number; 530 pci->bussubno = pci->phb->bus->number;
521 531
522 tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), 532 tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table),
523 GFP_KERNEL); 533 GFP_KERNEL);
524 534
525 iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window); 535 iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window);
526 536
527 pdn->iommu_table = iommu_init_table(tbl); 537 pci->iommu_table = iommu_init_table(tbl);
528 } 538 }
529 539
530 if (pdn != dn) 540 if (pdn != dn)
531 dn->iommu_table = pdn->iommu_table; 541 PCI_DN(dn)->iommu_table = pci->iommu_table;
532} 542}
533 543
534static void iommu_bus_setup_null(struct pci_bus *b) { } 544static void iommu_bus_setup_null(struct pci_bus *b) { }
diff --git a/arch/ppc64/kernel/pci.c b/arch/ppc64/kernel/pci.c
index d0d55c7908ef..8447dcc2c2b3 100644
--- a/arch/ppc64/kernel/pci.c
+++ b/arch/ppc64/kernel/pci.c
@@ -21,6 +21,7 @@
21#include <linux/bootmem.h> 21#include <linux/bootmem.h>
22#include <linux/mm.h> 22#include <linux/mm.h>
23#include <linux/list.h> 23#include <linux/list.h>
24#include <linux/syscalls.h>
24 25
25#include <asm/processor.h> 26#include <asm/processor.h>
26#include <asm/io.h> 27#include <asm/io.h>
@@ -84,7 +85,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev)
84 if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { 85 if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
85 dev->vendor = PCI_VENDOR_ID_AMD; 86 dev->vendor = PCI_VENDOR_ID_AMD;
86 pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); 87 pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
87 pci_name_device(dev);
88 } 88 }
89} 89}
90DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); 90DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
@@ -838,9 +838,11 @@ int pcibios_scan_all_fns(struct pci_bus *bus, int devfn)
838 * device tree. If they are then we need to scan all the 838 * device tree. If they are then we need to scan all the
839 * functions of this slot. 839 * functions of this slot.
840 */ 840 */
841 for (dn = busdn->child; dn; dn = dn->sibling) 841 for (dn = busdn->child; dn; dn = dn->sibling) {
842 if ((dn->devfn >> 3) == (devfn >> 3)) 842 struct pci_dn *pdn = dn->data;
843 if (pdn && (pdn->devfn >> 3) == (devfn >> 3))
843 return 1; 844 return 1;
845 }
844 846
845 return 0; 847 return 0;
846} 848}
@@ -983,3 +985,62 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
983} 985}
984 986
985#endif /* CONFIG_PPC_MULTIPLATFORM */ 987#endif /* CONFIG_PPC_MULTIPLATFORM */
988
989
990#define IOBASE_BRIDGE_NUMBER 0
991#define IOBASE_MEMORY 1
992#define IOBASE_IO 2
993#define IOBASE_ISA_IO 3
994#define IOBASE_ISA_MEM 4
995
996long sys_pciconfig_iobase(long which, unsigned long in_bus,
997 unsigned long in_devfn)
998{
999 struct pci_controller* hose;
1000 struct list_head *ln;
1001 struct pci_bus *bus = NULL;
1002 struct device_node *hose_node;
1003
1004 /* Argh ! Please forgive me for that hack, but that's the
1005 * simplest way to get existing XFree to not lockup on some
1006 * G5 machines... So when something asks for bus 0 io base
1007 * (bus 0 is HT root), we return the AGP one instead.
1008 */
1009#ifdef CONFIG_PPC_PMAC
1010 if (systemcfg->platform == PLATFORM_POWERMAC &&
1011 machine_is_compatible("MacRISC4"))
1012 if (in_bus == 0)
1013 in_bus = 0xf0;
1014#endif /* CONFIG_PPC_PMAC */
1015
1016 /* That syscall isn't quite compatible with PCI domains, but it's
1017 * used on pre-domains setup. We return the first match
1018 */
1019
1020 for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
1021 bus = pci_bus_b(ln);
1022 if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate))
1023 break;
1024 bus = NULL;
1025 }
1026 if (bus == NULL || bus->sysdata == NULL)
1027 return -ENODEV;
1028
1029 hose_node = (struct device_node *)bus->sysdata;
1030 hose = PCI_DN(hose_node)->phb;
1031
1032 switch (which) {
1033 case IOBASE_BRIDGE_NUMBER:
1034 return (long)hose->first_busno;
1035 case IOBASE_MEMORY:
1036 return (long)hose->pci_mem_offset;
1037 case IOBASE_IO:
1038 return (long)hose->io_base_phys;
1039 case IOBASE_ISA_IO:
1040 return (long)isa_io_base;
1041 case IOBASE_ISA_MEM:
1042 return -EINVAL;
1043 }
1044
1045 return -EOPNOTSUPP;
1046}
diff --git a/arch/ppc64/kernel/pci.h b/arch/ppc64/kernel/pci.h
index 26be78b13af1..5eb2cc320566 100644
--- a/arch/ppc64/kernel/pci.h
+++ b/arch/ppc64/kernel/pci.h
@@ -34,7 +34,6 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
34 34
35void pci_devs_phb_init(void); 35void pci_devs_phb_init(void);
36void pci_devs_phb_init_dynamic(struct pci_controller *phb); 36void pci_devs_phb_init_dynamic(struct pci_controller *phb);
37struct device_node *fetch_dev_dn(struct pci_dev *dev);
38 37
39/* PCI address cache management routines */ 38/* PCI address cache management routines */
40void pci_addr_cache_insert_device(struct pci_dev *dev); 39void pci_addr_cache_insert_device(struct pci_dev *dev);
diff --git a/arch/ppc64/kernel/pci_dn.c b/arch/ppc64/kernel/pci_dn.c
index ec345462afc3..a86389d07d57 100644
--- a/arch/ppc64/kernel/pci_dn.c
+++ b/arch/ppc64/kernel/pci_dn.c
@@ -23,6 +23,8 @@
23#include <linux/pci.h> 23#include <linux/pci.h>
24#include <linux/string.h> 24#include <linux/string.h>
25#include <linux/init.h> 25#include <linux/init.h>
26#include <linux/slab.h>
27#include <linux/bootmem.h>
26 28
27#include <asm/io.h> 29#include <asm/io.h>
28#include <asm/prom.h> 30#include <asm/prom.h>
@@ -40,16 +42,26 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
40 struct pci_controller *phb = data; 42 struct pci_controller *phb = data;
41 int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL); 43 int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL);
42 u32 *regs; 44 u32 *regs;
43 45 struct pci_dn *pdn;
44 dn->phb = phb; 46
47 if (phb->is_dynamic)
48 pdn = kmalloc(sizeof(*pdn), GFP_KERNEL);
49 else
50 pdn = alloc_bootmem(sizeof(*pdn));
51 if (pdn == NULL)
52 return NULL;
53 memset(pdn, 0, sizeof(*pdn));
54 dn->data = pdn;
55 pdn->node = dn;
56 pdn->phb = phb;
45 regs = (u32 *)get_property(dn, "reg", NULL); 57 regs = (u32 *)get_property(dn, "reg", NULL);
46 if (regs) { 58 if (regs) {
47 /* First register entry is addr (00BBSS00) */ 59 /* First register entry is addr (00BBSS00) */
48 dn->busno = (regs[0] >> 16) & 0xff; 60 pdn->busno = (regs[0] >> 16) & 0xff;
49 dn->devfn = (regs[0] >> 8) & 0xff; 61 pdn->devfn = (regs[0] >> 8) & 0xff;
50 } 62 }
51 63
52 dn->pci_ext_config_space = (type && *type == 1); 64 pdn->pci_ext_config_space = (type && *type == 1);
53 return NULL; 65 return NULL;
54} 66}
55 67
@@ -112,10 +124,15 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
112void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb) 124void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
113{ 125{
114 struct device_node * dn = (struct device_node *) phb->arch_data; 126 struct device_node * dn = (struct device_node *) phb->arch_data;
127 struct pci_dn *pdn;
115 128
116 /* PHB nodes themselves must not match */ 129 /* PHB nodes themselves must not match */
117 dn->devfn = dn->busno = -1; 130 update_dn_pci_info(dn, phb);
118 dn->phb = phb; 131 pdn = dn->data;
132 if (pdn) {
133 pdn->devfn = pdn->busno = -1;
134 pdn->phb = phb;
135 }
119 136
120 /* Update dn->phb ptrs for new phb and children devices */ 137 /* Update dn->phb ptrs for new phb and children devices */
121 traverse_pci_devices(dn, update_dn_pci_info, phb); 138 traverse_pci_devices(dn, update_dn_pci_info, phb);
@@ -123,14 +140,17 @@ void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
123 140
124/* 141/*
125 * Traversal func that looks for a <busno,devfcn> value. 142 * Traversal func that looks for a <busno,devfcn> value.
126 * If found, the device_node is returned (thus terminating the traversal). 143 * If found, the pci_dn is returned (thus terminating the traversal).
127 */ 144 */
128static void *is_devfn_node(struct device_node *dn, void *data) 145static void *is_devfn_node(struct device_node *dn, void *data)
129{ 146{
130 int busno = ((unsigned long)data >> 8) & 0xff; 147 int busno = ((unsigned long)data >> 8) & 0xff;
131 int devfn = ((unsigned long)data) & 0xff; 148 int devfn = ((unsigned long)data) & 0xff;
149 struct pci_dn *pci = dn->data;
132 150
133 return ((devfn == dn->devfn) && (busno == dn->busno)) ? dn : NULL; 151 if (pci && (devfn == pci->devfn) && (busno == pci->busno))
152 return dn;
153 return NULL;
134} 154}
135 155
136/* 156/*
@@ -149,13 +169,10 @@ static void *is_devfn_node(struct device_node *dn, void *data)
149struct device_node *fetch_dev_dn(struct pci_dev *dev) 169struct device_node *fetch_dev_dn(struct pci_dev *dev)
150{ 170{
151 struct device_node *orig_dn = dev->sysdata; 171 struct device_node *orig_dn = dev->sysdata;
152 struct pci_controller *phb = orig_dn->phb; /* assume same phb as orig_dn */
153 struct device_node *phb_dn;
154 struct device_node *dn; 172 struct device_node *dn;
155 unsigned long searchval = (dev->bus->number << 8) | dev->devfn; 173 unsigned long searchval = (dev->bus->number << 8) | dev->devfn;
156 174
157 phb_dn = phb->arch_data; 175 dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval);
158 dn = traverse_pci_devices(phb_dn, is_devfn_node, (void *)searchval);
159 if (dn) 176 if (dn)
160 dev->sysdata = dn; 177 dev->sysdata = dn;
161 return dn; 178 return dn;
@@ -165,11 +182,13 @@ EXPORT_SYMBOL(fetch_dev_dn);
165static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) 182static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
166{ 183{
167 struct device_node *np = node; 184 struct device_node *np = node;
185 struct pci_dn *pci;
168 int err = NOTIFY_OK; 186 int err = NOTIFY_OK;
169 187
170 switch (action) { 188 switch (action) {
171 case PSERIES_RECONFIG_ADD: 189 case PSERIES_RECONFIG_ADD:
172 update_dn_pci_info(np, np->parent->phb); 190 pci = np->parent->data;
191 update_dn_pci_info(np, pci->phb);
173 break; 192 break;
174 default: 193 default:
175 err = NOTIFY_DONE; 194 err = NOTIFY_DONE;
diff --git a/arch/ppc64/kernel/pci_iommu.c b/arch/ppc64/kernel/pci_iommu.c
index ef0a62b916be..14647e09c9cd 100644
--- a/arch/ppc64/kernel/pci_iommu.c
+++ b/arch/ppc64/kernel/pci_iommu.c
@@ -66,7 +66,7 @@ static inline struct iommu_table *devnode_table(struct device *dev)
66#endif /* CONFIG_PPC_ISERIES */ 66#endif /* CONFIG_PPC_ISERIES */
67 67
68#ifdef CONFIG_PPC_MULTIPLATFORM 68#ifdef CONFIG_PPC_MULTIPLATFORM
69 return PCI_GET_DN(pdev)->iommu_table; 69 return PCI_DN(PCI_GET_DN(pdev))->iommu_table;
70#endif /* CONFIG_PPC_MULTIPLATFORM */ 70#endif /* CONFIG_PPC_MULTIPLATFORM */
71} 71}
72 72
diff --git a/arch/ppc64/kernel/pmac_feature.c b/arch/ppc64/kernel/pmac_feature.c
index 98ed2bccab1a..eb4e6c3f694d 100644
--- a/arch/ppc64/kernel/pmac_feature.c
+++ b/arch/ppc64/kernel/pmac_feature.c
@@ -674,6 +674,7 @@ void __init pmac_check_ht_link(void)
674#if 0 /* Disabled for now */ 674#if 0 /* Disabled for now */
675 u32 ufreq, freq, ucfg, cfg; 675 u32 ufreq, freq, ucfg, cfg;
676 struct device_node *pcix_node; 676 struct device_node *pcix_node;
677 struct pci_dn *pdn;
677 u8 px_bus, px_devfn; 678 u8 px_bus, px_devfn;
678 struct pci_controller *px_hose; 679 struct pci_controller *px_hose;
679 680
@@ -687,9 +688,10 @@ void __init pmac_check_ht_link(void)
687 printk("No PCI-X bridge found\n"); 688 printk("No PCI-X bridge found\n");
688 return; 689 return;
689 } 690 }
690 px_hose = pcix_node->phb; 691 pdn = pcix_node->data;
691 px_bus = pcix_node->busno; 692 px_hose = pdn->phb;
692 px_devfn = pcix_node->devfn; 693 px_bus = pdn->busno;
694 px_devfn = pdn->devfn;
693 695
694 early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg); 696 early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg);
695 early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq); 697 early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq);
diff --git a/arch/ppc64/kernel/pmac_pci.c b/arch/ppc64/kernel/pmac_pci.c
index 71fe911ad183..d37bff2d7d40 100644
--- a/arch/ppc64/kernel/pmac_pci.c
+++ b/arch/ppc64/kernel/pmac_pci.c
@@ -242,7 +242,7 @@ static int u3_ht_skip_device(struct pci_controller *hose,
242 else 242 else
243 busdn = hose->arch_data; 243 busdn = hose->arch_data;
244 for (dn = busdn->child; dn; dn = dn->sibling) 244 for (dn = busdn->child; dn; dn = dn->sibling)
245 if (dn->devfn == devfn) 245 if (dn->data && PCI_DN(dn)->devfn == devfn)
246 break; 246 break;
247 if (dn == NULL) 247 if (dn == NULL)
248 return -1; 248 return -1;
@@ -746,9 +746,9 @@ void __init pmac_pci_init(void)
746 */ 746 */
747 if (u3_agp) { 747 if (u3_agp) {
748 struct device_node *np = u3_agp->arch_data; 748 struct device_node *np = u3_agp->arch_data;
749 np->busno = 0xf0; 749 PCI_DN(np)->busno = 0xf0;
750 for (np = np->child; np; np = np->sibling) 750 for (np = np->child; np; np = np->sibling)
751 np->busno = 0xf0; 751 PCI_DN(np)->busno = 0xf0;
752 } 752 }
753 753
754 pmac_check_ht_link(); 754 pmac_check_ht_link();
diff --git a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c
index 6ad5a8467f87..7035deb6de92 100644
--- a/arch/ppc64/kernel/prom.c
+++ b/arch/ppc64/kernel/prom.c
@@ -1733,6 +1733,7 @@ static void of_node_release(struct kref *kref)
1733 kfree(node->intrs); 1733 kfree(node->intrs);
1734 kfree(node->addrs); 1734 kfree(node->addrs);
1735 kfree(node->full_name); 1735 kfree(node->full_name);
1736 kfree(node->data);
1736 kfree(node); 1737 kfree(node);
1737} 1738}
1738 1739
diff --git a/arch/ppc64/kernel/rtas_pci.c b/arch/ppc64/kernel/rtas_pci.c
index 1dccadaddd1d..4a9719b48abe 100644
--- a/arch/ppc64/kernel/rtas_pci.c
+++ b/arch/ppc64/kernel/rtas_pci.c
@@ -48,7 +48,7 @@ static int write_pci_config;
48static int ibm_read_pci_config; 48static int ibm_read_pci_config;
49static int ibm_write_pci_config; 49static int ibm_write_pci_config;
50 50
51static int config_access_valid(struct device_node *dn, int where) 51static int config_access_valid(struct pci_dn *dn, int where)
52{ 52{
53 if (where < 256) 53 if (where < 256)
54 return 1; 54 return 1;
@@ -78,15 +78,17 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va
78 int returnval = -1; 78 int returnval = -1;
79 unsigned long buid, addr; 79 unsigned long buid, addr;
80 int ret; 80 int ret;
81 struct pci_dn *pdn;
81 82
82 if (!dn) 83 if (!dn || !dn->data)
83 return PCIBIOS_DEVICE_NOT_FOUND; 84 return PCIBIOS_DEVICE_NOT_FOUND;
84 if (!config_access_valid(dn, where)) 85 pdn = dn->data;
86 if (!config_access_valid(pdn, where))
85 return PCIBIOS_BAD_REGISTER_NUMBER; 87 return PCIBIOS_BAD_REGISTER_NUMBER;
86 88
87 addr = ((where & 0xf00) << 20) | (dn->busno << 16) | 89 addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
88 (dn->devfn << 8) | (where & 0xff); 90 (pdn->devfn << 8) | (where & 0xff);
89 buid = dn->phb->buid; 91 buid = pdn->phb->buid;
90 if (buid) { 92 if (buid) {
91 ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval, 93 ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval,
92 addr, buid >> 32, buid & 0xffffffff, size); 94 addr, buid >> 32, buid & 0xffffffff, size);
@@ -98,8 +100,8 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va
98 if (ret) 100 if (ret)
99 return PCIBIOS_DEVICE_NOT_FOUND; 101 return PCIBIOS_DEVICE_NOT_FOUND;
100 102
101 if (returnval == EEH_IO_ERROR_VALUE(size) 103 if (returnval == EEH_IO_ERROR_VALUE(size) &&
102 && eeh_dn_check_failure (dn, NULL)) 104 eeh_dn_check_failure (dn, NULL))
103 return PCIBIOS_DEVICE_NOT_FOUND; 105 return PCIBIOS_DEVICE_NOT_FOUND;
104 106
105 return PCIBIOS_SUCCESSFUL; 107 return PCIBIOS_SUCCESSFUL;
@@ -118,24 +120,28 @@ static int rtas_pci_read_config(struct pci_bus *bus,
118 120
119 /* Search only direct children of the bus */ 121 /* Search only direct children of the bus */
120 for (dn = busdn->child; dn; dn = dn->sibling) 122 for (dn = busdn->child; dn; dn = dn->sibling)
121 if (dn->devfn == devfn && of_device_available(dn)) 123 if (dn->data && PCI_DN(dn)->devfn == devfn
124 && of_device_available(dn))
122 return rtas_read_config(dn, where, size, val); 125 return rtas_read_config(dn, where, size, val);
126
123 return PCIBIOS_DEVICE_NOT_FOUND; 127 return PCIBIOS_DEVICE_NOT_FOUND;
124} 128}
125 129
126static int rtas_write_config(struct device_node *dn, int where, int size, u32 val) 130int rtas_write_config(struct device_node *dn, int where, int size, u32 val)
127{ 131{
128 unsigned long buid, addr; 132 unsigned long buid, addr;
129 int ret; 133 int ret;
134 struct pci_dn *pdn;
130 135
131 if (!dn) 136 if (!dn || !dn->data)
132 return PCIBIOS_DEVICE_NOT_FOUND; 137 return PCIBIOS_DEVICE_NOT_FOUND;
133 if (!config_access_valid(dn, where)) 138 pdn = dn->data;
139 if (!config_access_valid(pdn, where))
134 return PCIBIOS_BAD_REGISTER_NUMBER; 140 return PCIBIOS_BAD_REGISTER_NUMBER;
135 141
136 addr = ((where & 0xf00) << 20) | (dn->busno << 16) | 142 addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
137 (dn->devfn << 8) | (where & 0xff); 143 (pdn->devfn << 8) | (where & 0xff);
138 buid = dn->phb->buid; 144 buid = pdn->phb->buid;
139 if (buid) { 145 if (buid) {
140 ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val); 146 ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val);
141 } else { 147 } else {
@@ -161,7 +167,8 @@ static int rtas_pci_write_config(struct pci_bus *bus,
161 167
162 /* Search only direct children of the bus */ 168 /* Search only direct children of the bus */
163 for (dn = busdn->child; dn; dn = dn->sibling) 169 for (dn = busdn->child; dn; dn = dn->sibling)
164 if (dn->devfn == devfn && of_device_available(dn)) 170 if (dn->data && PCI_DN(dn)->devfn == devfn
171 && of_device_available(dn))
165 return rtas_write_config(dn, where, size, val); 172 return rtas_write_config(dn, where, size, val);
166 return PCIBIOS_DEVICE_NOT_FOUND; 173 return PCIBIOS_DEVICE_NOT_FOUND;
167} 174}
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c
index d0bb68af0ea4..bfa8791c9807 100644
--- a/arch/ppc64/kernel/setup.c
+++ b/arch/ppc64/kernel/setup.c
@@ -1283,7 +1283,7 @@ void __init generic_find_legacy_serial_ports(u64 *physport,
1283 1283
1284static struct platform_device serial_device = { 1284static struct platform_device serial_device = {
1285 .name = "serial8250", 1285 .name = "serial8250",
1286 .id = 0, 1286 .id = PLAT8250_DEV_PLATFORM,
1287 .dev = { 1287 .dev = {
1288 .platform_data = serial_ports, 1288 .platform_data = serial_ports,
1289 }, 1289 },
diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c
index 214914a95a50..e93c13458910 100644
--- a/arch/ppc64/kernel/sys_ppc32.c
+++ b/arch/ppc64/kernel/sys_ppc32.c
@@ -708,62 +708,9 @@ asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubu
708 compat_ptr(ubuf)); 708 compat_ptr(ubuf));
709} 709}
710 710
711#define IOBASE_BRIDGE_NUMBER 0
712#define IOBASE_MEMORY 1
713#define IOBASE_IO 2
714#define IOBASE_ISA_IO 3
715#define IOBASE_ISA_MEM 4
716
717asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) 711asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn)
718{ 712{
719#ifdef CONFIG_PCI 713 return sys_pciconfig_iobase(which, in_bus, in_devfn);
720 struct pci_controller* hose;
721 struct list_head *ln;
722 struct pci_bus *bus = NULL;
723 struct device_node *hose_node;
724
725 /* Argh ! Please forgive me for that hack, but that's the
726 * simplest way to get existing XFree to not lockup on some
727 * G5 machines... So when something asks for bus 0 io base
728 * (bus 0 is HT root), we return the AGP one instead.
729 */
730#ifdef CONFIG_PPC_PMAC
731 if (systemcfg->platform == PLATFORM_POWERMAC &&
732 machine_is_compatible("MacRISC4"))
733 if (in_bus == 0)
734 in_bus = 0xf0;
735#endif /* CONFIG_PPC_PMAC */
736
737 /* That syscall isn't quite compatible with PCI domains, but it's
738 * used on pre-domains setup. We return the first match
739 */
740
741 for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) {
742 bus = pci_bus_b(ln);
743 if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate))
744 break;
745 bus = NULL;
746 }
747 if (bus == NULL || bus->sysdata == NULL)
748 return -ENODEV;
749
750 hose_node = (struct device_node *)bus->sysdata;
751 hose = hose_node->phb;
752
753 switch (which) {
754 case IOBASE_BRIDGE_NUMBER:
755 return (long)hose->first_busno;
756 case IOBASE_MEMORY:
757 return (long)hose->pci_mem_offset;
758 case IOBASE_IO:
759 return (long)hose->io_base_phys;
760 case IOBASE_ISA_IO:
761 return (long)isa_io_base;
762 case IOBASE_ISA_MEM:
763 return -EINVAL;
764 }
765#endif /* CONFIG_PCI */
766 return -EOPNOTSUPP;
767} 714}
768 715
769 716
diff --git a/arch/ppc64/kernel/syscalls.c b/arch/ppc64/kernel/syscalls.c
index a8cbb202b8cd..05f16633bd2c 100644
--- a/arch/ppc64/kernel/syscalls.c
+++ b/arch/ppc64/kernel/syscalls.c
@@ -46,10 +46,6 @@
46 46
47extern unsigned long wall_jiffies; 47extern unsigned long wall_jiffies;
48 48
49void
50check_bugs(void)
51{
52}
53 49
54/* 50/*
55 * sys_ipc() is the de-multiplexer for the SysV IPC calls.. 51 * sys_ipc() is the de-multiplexer for the SysV IPC calls..
diff --git a/arch/ppc64/kernel/u3_iommu.c b/arch/ppc64/kernel/u3_iommu.c
index b6e3bca4102d..41ea09cb9ac7 100644
--- a/arch/ppc64/kernel/u3_iommu.c
+++ b/arch/ppc64/kernel/u3_iommu.c
@@ -276,7 +276,7 @@ static void iommu_dev_setup_u3(struct pci_dev *dev)
276 dn = pci_device_to_OF_node(dev); 276 dn = pci_device_to_OF_node(dev);
277 277
278 if (dn) 278 if (dn)
279 dn->iommu_table = &iommu_table_u3; 279 PCI_DN(dn)->iommu_table = &iommu_table_u3;
280} 280}
281 281
282static void iommu_bus_setup_u3(struct pci_bus *bus) 282static void iommu_bus_setup_u3(struct pci_bus *bus)
@@ -291,7 +291,7 @@ static void iommu_bus_setup_u3(struct pci_bus *bus)
291 dn = pci_bus_to_OF_node(bus); 291 dn = pci_bus_to_OF_node(bus);
292 292
293 if (dn) 293 if (dn)
294 dn->iommu_table = &iommu_table_u3; 294 PCI_DN(dn)->iommu_table = &iommu_table_u3;
295} 295}
296 296
297static void iommu_dev_setup_null(struct pci_dev *dev) { } 297static void iommu_dev_setup_null(struct pci_dev *dev) { }
diff --git a/arch/ppc64/kernel/udbg.c b/arch/ppc64/kernel/udbg.c
index ed6766e21f5a..d49c3613c8ec 100644
--- a/arch/ppc64/kernel/udbg.c
+++ b/arch/ppc64/kernel/udbg.c
@@ -158,14 +158,20 @@ static struct console udbg_console = {
158 .index = -1, 158 .index = -1,
159}; 159};
160 160
161static int early_console_initialized;
162
161void __init disable_early_printk(void) 163void __init disable_early_printk(void)
162{ 164{
165 if (!early_console_initialized)
166 return;
163 unregister_console(&udbg_console); 167 unregister_console(&udbg_console);
168 early_console_initialized = 0;
164} 169}
165 170
166/* called by setup_system */ 171/* called by setup_system */
167void register_early_udbg_console(void) 172void register_early_udbg_console(void)
168{ 173{
174 early_console_initialized = 1;
169 register_console(&udbg_console); 175 register_console(&udbg_console);
170} 176}
171 177
diff --git a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c
index a14ab87df491..c2157c9c3acb 100644
--- a/arch/ppc64/mm/init.c
+++ b/arch/ppc64/mm/init.c
@@ -554,12 +554,12 @@ void __init do_init_bootmem(void)
554 * present. 554 * present.
555 */ 555 */
556 for (i=0; i < lmb.memory.cnt; i++) 556 for (i=0; i < lmb.memory.cnt; i++)
557 free_bootmem(lmb_start_pfn(&lmb.memory, i), 557 free_bootmem(lmb.memory.region[i].base,
558 lmb_size_bytes(&lmb.memory, i)); 558 lmb_size_bytes(&lmb.memory, i));
559 559
560 /* reserve the sections we're already using */ 560 /* reserve the sections we're already using */
561 for (i=0; i < lmb.reserved.cnt; i++) 561 for (i=0; i < lmb.reserved.cnt; i++)
562 reserve_bootmem(lmb_start_pfn(&lmb.reserved, i), 562 reserve_bootmem(lmb.reserved.region[i].base,
563 lmb_size_bytes(&lmb.reserved, i)); 563 lmb_size_bytes(&lmb.reserved, i));
564 564
565 for (i=0; i < lmb.memory.cnt; i++) 565 for (i=0; i < lmb.memory.cnt; i++)
diff --git a/arch/s390/Makefile b/arch/s390/Makefile
index 3cd8dd25c9d7..c1ea6bcb77ce 100644
--- a/arch/s390/Makefile
+++ b/arch/s390/Makefile
@@ -19,6 +19,7 @@ CFLAGS += -m31
19AFLAGS += -m31 19AFLAGS += -m31
20UTS_MACHINE := s390 20UTS_MACHINE := s390
21STACK_SIZE := 8192 21STACK_SIZE := 8192
22CHECKFLAGS += -D__s390__
22endif 23endif
23 24
24ifdef CONFIG_ARCH_S390X 25ifdef CONFIG_ARCH_S390X
@@ -28,6 +29,7 @@ CFLAGS += -m64
28AFLAGS += -m64 29AFLAGS += -m64
29UTS_MACHINE := s390x 30UTS_MACHINE := s390x
30STACK_SIZE := 16384 31STACK_SIZE := 16384
32CHECKFLAGS += -D__s390__ -D__s390x__
31endif 33endif
32 34
33cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5) 35cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5)
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
index ec8bf4012c0c..2ff7c32ab0ce 100644
--- a/arch/sparc64/kernel/pci.c
+++ b/arch/sparc64/kernel/pci.c
@@ -359,134 +359,17 @@ void pcibios_fixup_bus(struct pci_bus *pbus)
359 pbus->resource[1] = &pbm->mem_space; 359 pbus->resource[1] = &pbm->mem_space;
360} 360}
361 361
362int pci_claim_resource(struct pci_dev *pdev, int resource) 362struct resource *pcibios_select_root(struct pci_dev *pdev, struct resource *r)
363{ 363{
364 struct pci_pbm_info *pbm = pdev->bus->sysdata; 364 struct pci_pbm_info *pbm = pdev->bus->sysdata;
365 struct resource *res = &pdev->resource[resource]; 365 struct resource *root = NULL;
366 struct resource *root;
367
368 if (!pbm)
369 return -EINVAL;
370 366
371 if (res->flags & IORESOURCE_IO) 367 if (r->flags & IORESOURCE_IO)
372 root = &pbm->io_space; 368 root = &pbm->io_space;
373 else 369 if (r->flags & IORESOURCE_MEM)
374 root = &pbm->mem_space; 370 root = &pbm->mem_space;
375 371
376 pbm->parent->resource_adjust(pdev, res, root); 372 return root;
377
378 return request_resource(root, res);
379}
380
381/*
382 * Given the PCI bus a device resides on, try to
383 * find an acceptable resource allocation for a
384 * specific device resource..
385 */
386static int pci_assign_bus_resource(const struct pci_bus *bus,
387 struct pci_dev *dev,
388 struct resource *res,
389 unsigned long size,
390 unsigned long min,
391 int resno)
392{
393 unsigned int type_mask;
394 int i;
395
396 type_mask = IORESOURCE_IO | IORESOURCE_MEM;
397 for (i = 0 ; i < 4; i++) {
398 struct resource *r = bus->resource[i];
399 if (!r)
400 continue;
401
402 /* type_mask must match */
403 if ((res->flags ^ r->flags) & type_mask)
404 continue;
405
406 /* Ok, try it out.. */
407 if (allocate_resource(r, res, size, min, -1, size, NULL, NULL) < 0)
408 continue;
409
410 /* PCI config space updated by caller. */
411 return 0;
412 }
413 return -EBUSY;
414}
415
416int pci_assign_resource(struct pci_dev *pdev, int resource)
417{
418 struct pcidev_cookie *pcp = pdev->sysdata;
419 struct pci_pbm_info *pbm = pcp->pbm;
420 struct resource *res = &pdev->resource[resource];
421 unsigned long min, size;
422 int err;
423
424 if (res->flags & IORESOURCE_IO)
425 min = pbm->io_space.start + 0x400UL;
426 else
427 min = pbm->mem_space.start;
428
429 size = res->end - res->start + 1;
430
431 err = pci_assign_bus_resource(pdev->bus, pdev, res, size, min, resource);
432
433 if (err < 0) {
434 printk("PCI: Failed to allocate resource %d for %s\n",
435 resource, pci_name(pdev));
436 } else {
437 /* Update PCI config space. */
438 pbm->parent->base_address_update(pdev, resource);
439 }
440
441 return err;
442}
443
444/* Sort resources by alignment */
445void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
446{
447 int i;
448
449 for (i = 0; i < PCI_NUM_RESOURCES; i++) {
450 struct resource *r;
451 struct resource_list *list, *tmp;
452 unsigned long r_align;
453
454 r = &dev->resource[i];
455 r_align = r->end - r->start;
456
457 if (!(r->flags) || r->parent)
458 continue;
459 if (!r_align) {
460 printk(KERN_WARNING "PCI: Ignore bogus resource %d "
461 "[%lx:%lx] of %s\n",
462 i, r->start, r->end, pci_name(dev));
463 continue;
464 }
465 r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start;
466 for (list = head; ; list = list->next) {
467 unsigned long align = 0;
468 struct resource_list *ln = list->next;
469 int idx;
470
471 if (ln) {
472 idx = ln->res - &ln->dev->resource[0];
473 align = (idx < PCI_BRIDGE_RESOURCES) ?
474 ln->res->end - ln->res->start + 1 :
475 ln->res->start;
476 }
477 if (r_align > align) {
478 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
479 if (!tmp)
480 panic("pdev_sort_resources(): "
481 "kmalloc() failed!\n");
482 tmp->next = ln;
483 tmp->res = r;
484 tmp->dev = dev;
485 list->next = tmp;
486 break;
487 }
488 }
489 }
490} 373}
491 374
492void pcibios_update_irq(struct pci_dev *pdev, int irq) 375void pcibios_update_irq(struct pci_dev *pdev, int irq)
diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c
index 91ab466d6c66..6ed1ef25e0ac 100644
--- a/arch/sparc64/kernel/pci_psycho.c
+++ b/arch/sparc64/kernel/pci_psycho.c
@@ -307,7 +307,7 @@ static unsigned char psycho_pil_table[] = {
307/*0x32*/15, /* Power Management */ 307/*0x32*/15, /* Power Management */
308}; 308};
309 309
310static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) 310static int psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
311{ 311{
312 int ret; 312 int ret;
313 313
@@ -344,9 +344,9 @@ static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
344 return ret; 344 return ret;
345} 345}
346 346
347static unsigned int __init psycho_irq_build(struct pci_pbm_info *pbm, 347static unsigned int psycho_irq_build(struct pci_pbm_info *pbm,
348 struct pci_dev *pdev, 348 struct pci_dev *pdev,
349 unsigned int ino) 349 unsigned int ino)
350{ 350{
351 struct ino_bucket *bucket; 351 struct ino_bucket *bucket;
352 unsigned long imap, iclr; 352 unsigned long imap, iclr;
@@ -1024,7 +1024,7 @@ static irqreturn_t psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *reg
1024#define PSYCHO_CE_INO 0x2f 1024#define PSYCHO_CE_INO 0x2f
1025#define PSYCHO_PCIERR_A_INO 0x30 1025#define PSYCHO_PCIERR_A_INO 0x30
1026#define PSYCHO_PCIERR_B_INO 0x31 1026#define PSYCHO_PCIERR_B_INO 0x31
1027static void __init psycho_register_error_handlers(struct pci_controller_info *p) 1027static void psycho_register_error_handlers(struct pci_controller_info *p)
1028{ 1028{
1029 struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ 1029 struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */
1030 unsigned long base = p->pbm_A.controller_regs; 1030 unsigned long base = p->pbm_A.controller_regs;
@@ -1091,15 +1091,15 @@ static void __init psycho_register_error_handlers(struct pci_controller_info *p)
1091} 1091}
1092 1092
1093/* PSYCHO boot time probing and initialization. */ 1093/* PSYCHO boot time probing and initialization. */
1094static void __init psycho_resource_adjust(struct pci_dev *pdev, 1094static void psycho_resource_adjust(struct pci_dev *pdev,
1095 struct resource *res, 1095 struct resource *res,
1096 struct resource *root) 1096 struct resource *root)
1097{ 1097{
1098 res->start += root->start; 1098 res->start += root->start;
1099 res->end += root->start; 1099 res->end += root->start;
1100} 1100}
1101 1101
1102static void __init psycho_base_address_update(struct pci_dev *pdev, int resource) 1102static void psycho_base_address_update(struct pci_dev *pdev, int resource)
1103{ 1103{
1104 struct pcidev_cookie *pcp = pdev->sysdata; 1104 struct pcidev_cookie *pcp = pdev->sysdata;
1105 struct pci_pbm_info *pbm = pcp->pbm; 1105 struct pci_pbm_info *pbm = pcp->pbm;
@@ -1144,7 +1144,7 @@ static void __init psycho_base_address_update(struct pci_dev *pdev, int resource
1144 pci_write_config_dword(pdev, where + 4, 0); 1144 pci_write_config_dword(pdev, where + 4, 0);
1145} 1145}
1146 1146
1147static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) 1147static void pbm_config_busmastering(struct pci_pbm_info *pbm)
1148{ 1148{
1149 u8 *addr; 1149 u8 *addr;
1150 1150
@@ -1161,8 +1161,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
1161 pci_config_write8(addr, 64); 1161 pci_config_write8(addr, 64);
1162} 1162}
1163 1163
1164static void __init pbm_scan_bus(struct pci_controller_info *p, 1164static void pbm_scan_bus(struct pci_controller_info *p,
1165 struct pci_pbm_info *pbm) 1165 struct pci_pbm_info *pbm)
1166{ 1166{
1167 struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); 1167 struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL);
1168 1168
@@ -1189,7 +1189,7 @@ static void __init pbm_scan_bus(struct pci_controller_info *p,
1189 pci_setup_busmastering(pbm, pbm->pci_bus); 1189 pci_setup_busmastering(pbm, pbm->pci_bus);
1190} 1190}
1191 1191
1192static void __init psycho_scan_bus(struct pci_controller_info *p) 1192static void psycho_scan_bus(struct pci_controller_info *p)
1193{ 1193{
1194 pbm_config_busmastering(&p->pbm_B); 1194 pbm_config_busmastering(&p->pbm_B);
1195 p->pbm_B.is_66mhz_capable = 0; 1195 p->pbm_B.is_66mhz_capable = 0;
@@ -1204,7 +1204,7 @@ static void __init psycho_scan_bus(struct pci_controller_info *p)
1204 psycho_register_error_handlers(p); 1204 psycho_register_error_handlers(p);
1205} 1205}
1206 1206
1207static void __init psycho_iommu_init(struct pci_controller_info *p) 1207static void psycho_iommu_init(struct pci_controller_info *p)
1208{ 1208{
1209 struct pci_iommu *iommu = p->pbm_A.iommu; 1209 struct pci_iommu *iommu = p->pbm_A.iommu;
1210 unsigned long tsbbase, i; 1210 unsigned long tsbbase, i;
@@ -1327,8 +1327,8 @@ static void psycho_controller_hwinit(struct pci_controller_info *p)
1327 psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp); 1327 psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp);
1328} 1328}
1329 1329
1330static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, 1330static void pbm_register_toplevel_resources(struct pci_controller_info *p,
1331 struct pci_pbm_info *pbm) 1331 struct pci_pbm_info *pbm)
1332{ 1332{
1333 char *name = pbm->name; 1333 char *name = pbm->name;
1334 1334
@@ -1481,7 +1481,7 @@ static void psycho_pbm_init(struct pci_controller_info *p,
1481 1481
1482#define PSYCHO_CONFIGSPACE 0x001000000UL 1482#define PSYCHO_CONFIGSPACE 0x001000000UL
1483 1483
1484void __init psycho_init(int node, char *model_name) 1484void psycho_init(int node, char *model_name)
1485{ 1485{
1486 struct linux_prom64_registers pr_regs[3]; 1486 struct linux_prom64_registers pr_regs[3];
1487 struct pci_controller_info *p; 1487 struct pci_controller_info *p;
diff --git a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c
index 52bf3431a422..0ee6bd5b9ac6 100644
--- a/arch/sparc64/kernel/pci_sabre.c
+++ b/arch/sparc64/kernel/pci_sabre.c
@@ -554,7 +554,7 @@ static unsigned char sabre_pil_table[] = {
554/*0x32*/15, /* Power Management */ 554/*0x32*/15, /* Power Management */
555}; 555};
556 556
557static int __init sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino) 557static int sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
558{ 558{
559 int ret; 559 int ret;
560 560
@@ -612,9 +612,9 @@ static void sabre_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_a
612 sabre_read(sync_reg); 612 sabre_read(sync_reg);
613} 613}
614 614
615static unsigned int __init sabre_irq_build(struct pci_pbm_info *pbm, 615static unsigned int sabre_irq_build(struct pci_pbm_info *pbm,
616 struct pci_dev *pdev, 616 struct pci_dev *pdev,
617 unsigned int ino) 617 unsigned int ino)
618{ 618{
619 struct ino_bucket *bucket; 619 struct ino_bucket *bucket;
620 unsigned long imap, iclr; 620 unsigned long imap, iclr;
@@ -1009,7 +1009,7 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs
1009#define SABRE_UE_INO 0x2e 1009#define SABRE_UE_INO 0x2e
1010#define SABRE_CE_INO 0x2f 1010#define SABRE_CE_INO 0x2f
1011#define SABRE_PCIERR_INO 0x30 1011#define SABRE_PCIERR_INO 0x30
1012static void __init sabre_register_error_handlers(struct pci_controller_info *p) 1012static void sabre_register_error_handlers(struct pci_controller_info *p)
1013{ 1013{
1014 struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ 1014 struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */
1015 unsigned long base = pbm->controller_regs; 1015 unsigned long base = pbm->controller_regs;
@@ -1056,9 +1056,9 @@ static void __init sabre_register_error_handlers(struct pci_controller_info *p)
1056 sabre_write(base + SABRE_PCICTRL, tmp); 1056 sabre_write(base + SABRE_PCICTRL, tmp);
1057} 1057}
1058 1058
1059static void __init sabre_resource_adjust(struct pci_dev *pdev, 1059static void sabre_resource_adjust(struct pci_dev *pdev,
1060 struct resource *res, 1060 struct resource *res,
1061 struct resource *root) 1061 struct resource *root)
1062{ 1062{
1063 struct pci_pbm_info *pbm = pdev->bus->sysdata; 1063 struct pci_pbm_info *pbm = pdev->bus->sysdata;
1064 unsigned long base; 1064 unsigned long base;
@@ -1072,7 +1072,7 @@ static void __init sabre_resource_adjust(struct pci_dev *pdev,
1072 res->end += base; 1072 res->end += base;
1073} 1073}
1074 1074
1075static void __init sabre_base_address_update(struct pci_dev *pdev, int resource) 1075static void sabre_base_address_update(struct pci_dev *pdev, int resource)
1076{ 1076{
1077 struct pcidev_cookie *pcp = pdev->sysdata; 1077 struct pcidev_cookie *pcp = pdev->sysdata;
1078 struct pci_pbm_info *pbm = pcp->pbm; 1078 struct pci_pbm_info *pbm = pcp->pbm;
@@ -1118,7 +1118,7 @@ static void __init sabre_base_address_update(struct pci_dev *pdev, int resource)
1118 pci_write_config_dword(pdev, where + 4, 0); 1118 pci_write_config_dword(pdev, where + 4, 0);
1119} 1119}
1120 1120
1121static void __init apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus) 1121static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus)
1122{ 1122{
1123 struct pci_dev *pdev; 1123 struct pci_dev *pdev;
1124 1124
@@ -1181,7 +1181,7 @@ static struct pcidev_cookie *alloc_bridge_cookie(struct pci_pbm_info *pbm)
1181 return cookie; 1181 return cookie;
1182} 1182}
1183 1183
1184static void __init sabre_scan_bus(struct pci_controller_info *p) 1184static void sabre_scan_bus(struct pci_controller_info *p)
1185{ 1185{
1186 static int once; 1186 static int once;
1187 struct pci_bus *sabre_bus, *pbus; 1187 struct pci_bus *sabre_bus, *pbus;
@@ -1262,9 +1262,9 @@ static void __init sabre_scan_bus(struct pci_controller_info *p)
1262 sabre_register_error_handlers(p); 1262 sabre_register_error_handlers(p);
1263} 1263}
1264 1264
1265static void __init sabre_iommu_init(struct pci_controller_info *p, 1265static void sabre_iommu_init(struct pci_controller_info *p,
1266 int tsbsize, unsigned long dvma_offset, 1266 int tsbsize, unsigned long dvma_offset,
1267 u32 dma_mask) 1267 u32 dma_mask)
1268{ 1268{
1269 struct pci_iommu *iommu = p->pbm_A.iommu; 1269 struct pci_iommu *iommu = p->pbm_A.iommu;
1270 unsigned long tsbbase, i, order; 1270 unsigned long tsbbase, i, order;
@@ -1345,8 +1345,8 @@ static void __init sabre_iommu_init(struct pci_controller_info *p,
1345 } 1345 }
1346} 1346}
1347 1347
1348static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, 1348static void pbm_register_toplevel_resources(struct pci_controller_info *p,
1349 struct pci_pbm_info *pbm) 1349 struct pci_pbm_info *pbm)
1350{ 1350{
1351 char *name = pbm->name; 1351 char *name = pbm->name;
1352 unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; 1352 unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE;
@@ -1415,7 +1415,7 @@ static void __init pbm_register_toplevel_resources(struct pci_controller_info *p
1415 &pbm->mem_space); 1415 &pbm->mem_space);
1416} 1416}
1417 1417
1418static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin) 1418static void sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin)
1419{ 1419{
1420 struct pci_pbm_info *pbm; 1420 struct pci_pbm_info *pbm;
1421 char namebuf[128]; 1421 char namebuf[128];
@@ -1552,7 +1552,7 @@ static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node,
1552 } 1552 }
1553} 1553}
1554 1554
1555void __init sabre_init(int pnode, char *model_name) 1555void sabre_init(int pnode, char *model_name)
1556{ 1556{
1557 struct linux_prom64_registers pr_regs[2]; 1557 struct linux_prom64_registers pr_regs[2];
1558 struct pci_controller_info *p; 1558 struct pci_controller_info *p;
diff --git a/arch/sparc64/kernel/pci_schizo.c b/arch/sparc64/kernel/pci_schizo.c
index 6a182bb66281..331382e1a75d 100644
--- a/arch/sparc64/kernel/pci_schizo.c
+++ b/arch/sparc64/kernel/pci_schizo.c
@@ -285,7 +285,7 @@ static unsigned char schizo_pil_table[] = {
285/*0x3f*/0, /* Reserved for NewLink */ 285/*0x3f*/0, /* Reserved for NewLink */
286}; 286};
287 287
288static int __init schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) 288static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino)
289{ 289{
290 int ret; 290 int ret;
291 291
@@ -1221,7 +1221,7 @@ static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs *
1221 * PCI bus units of the same Tomatillo. I still have not really 1221 * PCI bus units of the same Tomatillo. I still have not really
1222 * figured this out... 1222 * figured this out...
1223 */ 1223 */
1224static void __init tomatillo_register_error_handlers(struct pci_controller_info *p) 1224static void tomatillo_register_error_handlers(struct pci_controller_info *p)
1225{ 1225{
1226 struct pci_pbm_info *pbm; 1226 struct pci_pbm_info *pbm;
1227 unsigned int irq; 1227 unsigned int irq;
@@ -1359,7 +1359,7 @@ static void __init tomatillo_register_error_handlers(struct pci_controller_info
1359 (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); 1359 (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP)));
1360} 1360}
1361 1361
1362static void __init schizo_register_error_handlers(struct pci_controller_info *p) 1362static void schizo_register_error_handlers(struct pci_controller_info *p)
1363{ 1363{
1364 struct pci_pbm_info *pbm; 1364 struct pci_pbm_info *pbm;
1365 unsigned int irq; 1365 unsigned int irq;
@@ -1505,7 +1505,7 @@ static void __init schizo_register_error_handlers(struct pci_controller_info *p)
1505 (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); 1505 (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP)));
1506} 1506}
1507 1507
1508static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) 1508static void pbm_config_busmastering(struct pci_pbm_info *pbm)
1509{ 1509{
1510 u8 *addr; 1510 u8 *addr;
1511 1511
@@ -1522,8 +1522,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm)
1522 pci_config_write8(addr, 64); 1522 pci_config_write8(addr, 64);
1523} 1523}
1524 1524
1525static void __init pbm_scan_bus(struct pci_controller_info *p, 1525static void pbm_scan_bus(struct pci_controller_info *p,
1526 struct pci_pbm_info *pbm) 1526 struct pci_pbm_info *pbm)
1527{ 1527{
1528 struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); 1528 struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL);
1529 1529
@@ -1550,8 +1550,8 @@ static void __init pbm_scan_bus(struct pci_controller_info *p,
1550 pci_setup_busmastering(pbm, pbm->pci_bus); 1550 pci_setup_busmastering(pbm, pbm->pci_bus);
1551} 1551}
1552 1552
1553static void __init __schizo_scan_bus(struct pci_controller_info *p, 1553static void __schizo_scan_bus(struct pci_controller_info *p,
1554 int chip_type) 1554 int chip_type)
1555{ 1555{
1556 if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) { 1556 if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) {
1557 printk("PCI: Only one PCI bus module of controller found.\n"); 1557 printk("PCI: Only one PCI bus module of controller found.\n");
@@ -1577,17 +1577,17 @@ static void __init __schizo_scan_bus(struct pci_controller_info *p,
1577 schizo_register_error_handlers(p); 1577 schizo_register_error_handlers(p);
1578} 1578}
1579 1579
1580static void __init schizo_scan_bus(struct pci_controller_info *p) 1580static void schizo_scan_bus(struct pci_controller_info *p)
1581{ 1581{
1582 __schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO); 1582 __schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO);
1583} 1583}
1584 1584
1585static void __init tomatillo_scan_bus(struct pci_controller_info *p) 1585static void tomatillo_scan_bus(struct pci_controller_info *p)
1586{ 1586{
1587 __schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO); 1587 __schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO);
1588} 1588}
1589 1589
1590static void __init schizo_base_address_update(struct pci_dev *pdev, int resource) 1590static void schizo_base_address_update(struct pci_dev *pdev, int resource)
1591{ 1591{
1592 struct pcidev_cookie *pcp = pdev->sysdata; 1592 struct pcidev_cookie *pcp = pdev->sysdata;
1593 struct pci_pbm_info *pbm = pcp->pbm; 1593 struct pci_pbm_info *pbm = pcp->pbm;
@@ -1632,9 +1632,9 @@ static void __init schizo_base_address_update(struct pci_dev *pdev, int resource
1632 pci_write_config_dword(pdev, where + 4, 0); 1632 pci_write_config_dword(pdev, where + 4, 0);
1633} 1633}
1634 1634
1635static void __init schizo_resource_adjust(struct pci_dev *pdev, 1635static void schizo_resource_adjust(struct pci_dev *pdev,
1636 struct resource *res, 1636 struct resource *res,
1637 struct resource *root) 1637 struct resource *root)
1638{ 1638{
1639 res->start += root->start; 1639 res->start += root->start;
1640 res->end += root->start; 1640 res->end += root->start;
@@ -1702,8 +1702,8 @@ static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm)
1702 pbm->mem_space.start); 1702 pbm->mem_space.start);
1703} 1703}
1704 1704
1705static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, 1705static void pbm_register_toplevel_resources(struct pci_controller_info *p,
1706 struct pci_pbm_info *pbm) 1706 struct pci_pbm_info *pbm)
1707{ 1707{
1708 pbm->io_space.name = pbm->mem_space.name = pbm->name; 1708 pbm->io_space.name = pbm->mem_space.name = pbm->name;
1709 1709
@@ -1932,7 +1932,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
1932#define TOMATILLO_PCI_IOC_TDIAG (0x2250UL) 1932#define TOMATILLO_PCI_IOC_TDIAG (0x2250UL)
1933#define TOMATILLO_PCI_IOC_DDIAG (0x2290UL) 1933#define TOMATILLO_PCI_IOC_DDIAG (0x2290UL)
1934 1934
1935static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) 1935static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
1936{ 1936{
1937 u64 tmp; 1937 u64 tmp;
1938 1938
@@ -1986,9 +1986,9 @@ static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm)
1986 } 1986 }
1987} 1987}
1988 1988
1989static void __init schizo_pbm_init(struct pci_controller_info *p, 1989static void schizo_pbm_init(struct pci_controller_info *p,
1990 int prom_node, u32 portid, 1990 int prom_node, u32 portid,
1991 int chip_type) 1991 int chip_type)
1992{ 1992{
1993 struct linux_prom64_registers pr_regs[4]; 1993 struct linux_prom64_registers pr_regs[4];
1994 unsigned int busrange[2]; 1994 unsigned int busrange[2];
@@ -2145,7 +2145,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)
2145 return (x == y); 2145 return (x == y);
2146} 2146}
2147 2147
2148static void __init __schizo_init(int node, char *model_name, int chip_type) 2148static void __schizo_init(int node, char *model_name, int chip_type)
2149{ 2149{
2150 struct pci_controller_info *p; 2150 struct pci_controller_info *p;
2151 struct pci_iommu *iommu; 2151 struct pci_iommu *iommu;
@@ -2213,17 +2213,17 @@ static void __init __schizo_init(int node, char *model_name, int chip_type)
2213 schizo_pbm_init(p, node, portid, chip_type); 2213 schizo_pbm_init(p, node, portid, chip_type);
2214} 2214}
2215 2215
2216void __init schizo_init(int node, char *model_name) 2216void schizo_init(int node, char *model_name)
2217{ 2217{
2218 __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO); 2218 __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO);
2219} 2219}
2220 2220
2221void __init schizo_plus_init(int node, char *model_name) 2221void schizo_plus_init(int node, char *model_name)
2222{ 2222{
2223 __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS); 2223 __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS);
2224} 2224}
2225 2225
2226void __init tomatillo_init(int node, char *model_name) 2226void tomatillo_init(int node, char *model_name)
2227{ 2227{
2228 __schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO); 2228 __schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO);
2229} 2229}
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
index d89fc24808d3..7d9a0f6c437d 100644
--- a/arch/sparc64/kernel/sparc64_ksyms.c
+++ b/arch/sparc64/kernel/sparc64_ksyms.c
@@ -403,12 +403,3 @@ EXPORT_SYMBOL(xor_vis_4);
403EXPORT_SYMBOL(xor_vis_5); 403EXPORT_SYMBOL(xor_vis_5);
404 404
405EXPORT_SYMBOL(prom_palette); 405EXPORT_SYMBOL(prom_palette);
406
407/* memory barriers */
408EXPORT_SYMBOL(mb);
409EXPORT_SYMBOL(rmb);
410EXPORT_SYMBOL(wmb);
411EXPORT_SYMBOL(membar_storeload);
412EXPORT_SYMBOL(membar_storeload_storestore);
413EXPORT_SYMBOL(membar_storeload_loadload);
414EXPORT_SYMBOL(membar_storestore_loadstore);
diff --git a/arch/sparc64/lib/Makefile b/arch/sparc64/lib/Makefile
index 6201f1040982..40dbeec7e5d6 100644
--- a/arch/sparc64/lib/Makefile
+++ b/arch/sparc64/lib/Makefile
@@ -12,7 +12,7 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \
12 U1memcpy.o U1copy_from_user.o U1copy_to_user.o \ 12 U1memcpy.o U1copy_from_user.o U1copy_to_user.o \
13 U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \ 13 U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \
14 copy_in_user.o user_fixup.o memmove.o \ 14 copy_in_user.o user_fixup.o memmove.o \
15 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o mb.o 15 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o
16 16
17lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o 17lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o
18lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o 18lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
diff --git a/arch/sparc64/lib/mb.S b/arch/sparc64/lib/mb.S
deleted file mode 100644
index 4004f748619f..000000000000
--- a/arch/sparc64/lib/mb.S
+++ /dev/null
@@ -1,73 +0,0 @@
1/* mb.S: Out of line memory barriers.
2 *
3 * Copyright (C) 2005 David S. Miller (davem@davemloft.net)
4 */
5
6 /* These are here in an effort to more fully work around
7 * Spitfire Errata #51. Essentially, if a memory barrier
8 * occurs soon after a mispredicted branch, the chip can stop
9 * executing instructions until a trap occurs. Therefore, if
10 * interrupts are disabled, the chip can hang forever.
11 *
12 * It used to be believed that the memory barrier had to be
13 * right in the delay slot, but a case has been traced
14 * recently wherein the memory barrier was one instruction
15 * after the branch delay slot and the chip still hung. The
16 * offending sequence was the following in sym_wakeup_done()
17 * of the sym53c8xx_2 driver:
18 *
19 * call sym_ccb_from_dsa, 0
20 * movge %icc, 0, %l0
21 * brz,pn %o0, .LL1303
22 * mov %o0, %l2
23 * membar #LoadLoad
24 *
25 * The branch has to be mispredicted for the bug to occur.
26 * Therefore, we put the memory barrier explicitly into a
27 * "branch always, predicted taken" delay slot to avoid the
28 * problem case.
29 */
30
31 .text
32
3399: retl
34 nop
35
36 .globl mb
37mb: ba,pt %xcc, 99b
38 membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad
39 .size mb, .-mb
40
41 .globl rmb
42rmb: ba,pt %xcc, 99b
43 membar #LoadLoad
44 .size rmb, .-rmb
45
46 .globl wmb
47wmb: ba,pt %xcc, 99b
48 membar #StoreStore
49 .size wmb, .-wmb
50
51 .globl membar_storeload
52membar_storeload:
53 ba,pt %xcc, 99b
54 membar #StoreLoad
55 .size membar_storeload, .-membar_storeload
56
57 .globl membar_storeload_storestore
58membar_storeload_storestore:
59 ba,pt %xcc, 99b
60 membar #StoreLoad | #StoreStore
61 .size membar_storeload_storestore, .-membar_storeload_storestore
62
63 .globl membar_storeload_loadload
64membar_storeload_loadload:
65 ba,pt %xcc, 99b
66 membar #StoreLoad | #LoadLoad
67 .size membar_storeload_loadload, .-membar_storeload_loadload
68
69 .globl membar_storestore_loadstore
70membar_storestore_loadstore:
71 ba,pt %xcc, 99b
72 membar #StoreStore | #LoadStore
73 .size membar_storestore_loadstore, .-membar_storestore_loadstore
diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64
index baddb5d64ca5..436abbba409b 100644
--- a/arch/um/Makefile-x86_64
+++ b/arch/um/Makefile-x86_64
@@ -8,6 +8,7 @@ START := 0x60000000
8#it's needed for headers to work! 8#it's needed for headers to work!
9CFLAGS += -U__$(SUBARCH)__ -fno-builtin 9CFLAGS += -U__$(SUBARCH)__ -fno-builtin
10USER_CFLAGS += -fno-builtin 10USER_CFLAGS += -fno-builtin
11CHECKFLAGS += -m64
11 12
12ELF_ARCH := i386:x86-64 13ELF_ARCH := i386:x86-64
13ELF_FORMAT := elf64-x86-64 14ELF_FORMAT := elf64-x86-64
diff --git a/arch/um/kernel/skas/include/uaccess-skas.h b/arch/um/kernel/skas/include/uaccess-skas.h
index cd6c280482cb..6ee3f3902e68 100644
--- a/arch/um/kernel/skas/include/uaccess-skas.h
+++ b/arch/um/kernel/skas/include/uaccess-skas.h
@@ -18,18 +18,18 @@
18 ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \ 18 ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \
19 ((unsigned long) (addr) + (size) >= (unsigned long)(addr)))) 19 ((unsigned long) (addr) + (size) >= (unsigned long)(addr))))
20 20
21static inline int verify_area_skas(int type, const void * addr, 21static inline int verify_area_skas(int type, const void __user * addr,
22 unsigned long size) 22 unsigned long size)
23{ 23{
24 return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); 24 return(access_ok_skas(type, addr, size) ? 0 : -EFAULT);
25} 25}
26 26
27extern int copy_from_user_skas(void *to, const void *from, int n); 27extern int copy_from_user_skas(void *to, const void __user *from, int n);
28extern int copy_to_user_skas(void *to, const void *from, int n); 28extern int copy_to_user_skas(void __user *to, const void *from, int n);
29extern int strncpy_from_user_skas(char *dst, const char *src, int count); 29extern int strncpy_from_user_skas(char *dst, const char __user *src, int count);
30extern int __clear_user_skas(void *mem, int len); 30extern int __clear_user_skas(void __user *mem, int len);
31extern int clear_user_skas(void *mem, int len); 31extern int clear_user_skas(void __user *mem, int len);
32extern int strnlen_user_skas(const void *str, int len); 32extern int strnlen_user_skas(const void __user *str, int len);
33 33
34#endif 34#endif
35 35
diff --git a/arch/um/kernel/tt/include/uaccess-tt.h b/arch/um/kernel/tt/include/uaccess-tt.h
index 3fbb5fe26f49..aa6db384af80 100644
--- a/arch/um/kernel/tt/include/uaccess-tt.h
+++ b/arch/um/kernel/tt/include/uaccess-tt.h
@@ -33,7 +33,7 @@ extern unsigned long uml_physmem;
33 (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \ 33 (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \
34 (under_task_size(addr, size) || is_stack(addr, size)))) 34 (under_task_size(addr, size) || is_stack(addr, size))))
35 35
36static inline int verify_area_tt(int type, const void * addr, 36static inline int verify_area_tt(int type, const void __user * addr,
37 unsigned long size) 37 unsigned long size)
38{ 38{
39 return(access_ok_tt(type, addr, size) ? 0 : -EFAULT); 39 return(access_ok_tt(type, addr, size) ? 0 : -EFAULT);
@@ -50,12 +50,12 @@ extern int __do_clear_user(void *mem, size_t len, void **fault_addr,
50extern int __do_strnlen_user(const char *str, unsigned long n, 50extern int __do_strnlen_user(const char *str, unsigned long n,
51 void **fault_addr, void **fault_catcher); 51 void **fault_addr, void **fault_catcher);
52 52
53extern int copy_from_user_tt(void *to, const void *from, int n); 53extern int copy_from_user_tt(void *to, const void __user *from, int n);
54extern int copy_to_user_tt(void *to, const void *from, int n); 54extern int copy_to_user_tt(void __user *to, const void *from, int n);
55extern int strncpy_from_user_tt(char *dst, const char *src, int count); 55extern int strncpy_from_user_tt(char *dst, const char __user *src, int count);
56extern int __clear_user_tt(void *mem, int len); 56extern int __clear_user_tt(void __user *mem, int len);
57extern int clear_user_tt(void *mem, int len); 57extern int clear_user_tt(void __user *mem, int len);
58extern int strnlen_user_tt(const void *str, int len); 58extern int strnlen_user_tt(const void __user *str, int len);
59 59
60#endif 60#endif
61 61
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules
index 17f305b6bade..59a1291f477e 100644
--- a/arch/um/scripts/Makefile.rules
+++ b/arch/um/scripts/Makefile.rules
@@ -9,6 +9,11 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
9 9
10$(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \ 10$(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \
11 $(CFLAGS_$(notdir $@)) 11 $(CFLAGS_$(notdir $@))
12$(USER_OBJS): cmd_checksrc =
13$(USER_OBJS): quiet_cmd_checksrc =
14$(USER_OBJS): cmd_force_checksrc =
15$(USER_OBJS): quiet_cmd_force_checksrc =
16
12 17
13# The stubs and unmap.o can't try to call mcount or update basic block data 18# The stubs and unmap.o can't try to call mcount or update basic block data
14define unprofile 19define unprofile
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c
index 40e0aca088fb..5f1529be1237 100644
--- a/arch/x86_64/kernel/io_apic.c
+++ b/arch/x86_64/kernel/io_apic.c
@@ -1167,9 +1167,9 @@ void disable_IO_APIC(void)
1167 clear_IO_APIC(); 1167 clear_IO_APIC();
1168 1168
1169 /* 1169 /*
1170 * If the i82559 is routed through an IOAPIC 1170 * If the i8259 is routed through an IOAPIC
1171 * Put that IOAPIC in virtual wire mode 1171 * Put that IOAPIC in virtual wire mode
1172 * so legacy interrups can be delivered. 1172 * so legacy interrupts can be delivered.
1173 */ 1173 */
1174 pin = find_isa_irq_pin(0, mp_ExtINT); 1174 pin = find_isa_irq_pin(0, mp_ExtINT);
1175 if (pin != -1) { 1175 if (pin != -1) {
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 3998c9d35fe1..fe1e8126fbae 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -250,8 +250,7 @@ config ACPI_CUSTOM_DSDT_FILE
250 Enter the full path name to the file wich includes the AmlCode declaration. 250 Enter the full path name to the file wich includes the AmlCode declaration.
251 251
252config ACPI_BLACKLIST_YEAR 252config ACPI_BLACKLIST_YEAR
253 int "Disable ACPI for systems before Jan 1st this year" 253 int "Disable ACPI for systems before Jan 1st this year" if X86
254 depends on X86
255 default 0 254 default 0
256 help 255 help
257 enter a 4-digit year, eg. 2001 to disable ACPI by default 256 enter a 4-digit year, eg. 2001 to disable ACPI by default
diff --git a/drivers/block/ub.c b/drivers/block/ub.c
index a026567f5d18..aa0bf7ee008d 100644
--- a/drivers/block/ub.c
+++ b/drivers/block/ub.c
@@ -16,9 +16,10 @@
16 * -- verify the 13 conditions and do bulk resets 16 * -- verify the 13 conditions and do bulk resets
17 * -- kill last_pipe and simply do two-state clearing on both pipes 17 * -- kill last_pipe and simply do two-state clearing on both pipes
18 * -- verify protocol (bulk) from USB descriptors (maybe...) 18 * -- verify protocol (bulk) from USB descriptors (maybe...)
19 * -- highmem and sg 19 * -- highmem
20 * -- move top_sense and work_bcs into separate allocations (if they survive) 20 * -- move top_sense and work_bcs into separate allocations (if they survive)
21 * for cache purists and esoteric architectures. 21 * for cache purists and esoteric architectures.
22 * -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ?
22 * -- prune comments, they are too volumnous 23 * -- prune comments, they are too volumnous
23 * -- Exterminate P3 printks 24 * -- Exterminate P3 printks
24 * -- Resove XXX's 25 * -- Resove XXX's
@@ -171,7 +172,7 @@ struct bulk_cs_wrap {
171 */ 172 */
172struct ub_dev; 173struct ub_dev;
173 174
174#define UB_MAX_REQ_SG 1 175#define UB_MAX_REQ_SG 4
175#define UB_MAX_SECTORS 64 176#define UB_MAX_SECTORS 64
176 177
177/* 178/*
@@ -234,13 +235,10 @@ struct ub_scsi_cmd {
234 235
235 int stat_count; /* Retries getting status. */ 236 int stat_count; /* Retries getting status. */
236 237
237 /*
238 * We do not support transfers from highmem pages
239 * because the underlying USB framework does not do what we need.
240 */
241 char *data; /* Requested buffer */
242 unsigned int len; /* Requested length */ 238 unsigned int len; /* Requested length */
243 // struct scatterlist sgv[UB_MAX_REQ_SG]; 239 unsigned int current_sg;
240 unsigned int nsg; /* sgv[nsg] */
241 struct scatterlist sgv[UB_MAX_REQ_SG];
244 242
245 struct ub_lun *lun; 243 struct ub_lun *lun;
246 void (*done)(struct ub_dev *, struct ub_scsi_cmd *); 244 void (*done)(struct ub_dev *, struct ub_scsi_cmd *);
@@ -389,17 +387,18 @@ struct ub_dev {
389 struct bulk_cs_wrap work_bcs; 387 struct bulk_cs_wrap work_bcs;
390 struct usb_ctrlrequest work_cr; 388 struct usb_ctrlrequest work_cr;
391 389
390 int sg_stat[UB_MAX_REQ_SG+1];
392 struct ub_scsi_trace tr; 391 struct ub_scsi_trace tr;
393}; 392};
394 393
395/* 394/*
396 */ 395 */
397static void ub_cleanup(struct ub_dev *sc); 396static void ub_cleanup(struct ub_dev *sc);
398static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq); 397static int ub_request_fn_1(struct ub_lun *lun, struct request *rq);
399static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, 398static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
400 struct ub_scsi_cmd *cmd, struct request *rq); 399 struct ub_scsi_cmd *cmd, struct request *rq);
401static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, 400static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
402 struct request *rq); 401 struct ub_scsi_cmd *cmd, struct request *rq);
403static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); 402static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
404static void ub_end_rq(struct request *rq, int uptodate); 403static void ub_end_rq(struct request *rq, int uptodate);
405static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); 404static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
@@ -407,6 +406,7 @@ static void ub_urb_complete(struct urb *urb, struct pt_regs *pt);
407static void ub_scsi_action(unsigned long _dev); 406static void ub_scsi_action(unsigned long _dev);
408static void ub_scsi_dispatch(struct ub_dev *sc); 407static void ub_scsi_dispatch(struct ub_dev *sc);
409static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd); 408static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
409static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
410static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc); 410static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc);
411static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); 411static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
412static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); 412static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
@@ -500,7 +500,8 @@ static void ub_cmdtr_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
500 } 500 }
501} 501}
502 502
503static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, char *page) 503static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr,
504 char *page)
504{ 505{
505 struct usb_interface *intf; 506 struct usb_interface *intf;
506 struct ub_dev *sc; 507 struct ub_dev *sc;
@@ -523,6 +524,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, c
523 cnt += sprintf(page + cnt, 524 cnt += sprintf(page + cnt,
524 "qlen %d qmax %d\n", 525 "qlen %d qmax %d\n",
525 sc->cmd_queue.qlen, sc->cmd_queue.qmax); 526 sc->cmd_queue.qlen, sc->cmd_queue.qmax);
527 cnt += sprintf(page + cnt,
528 "sg %d %d %d %d %d\n",
529 sc->sg_stat[0],
530 sc->sg_stat[1],
531 sc->sg_stat[2],
532 sc->sg_stat[3],
533 sc->sg_stat[4]);
526 534
527 list_for_each (p, &sc->luns) { 535 list_for_each (p, &sc->luns) {
528 lun = list_entry(p, struct ub_lun, link); 536 lun = list_entry(p, struct ub_lun, link);
@@ -744,20 +752,20 @@ static struct ub_scsi_cmd *ub_cmdq_pop(struct ub_dev *sc)
744 * The request function is our main entry point 752 * The request function is our main entry point
745 */ 753 */
746 754
747static void ub_bd_rq_fn(request_queue_t *q) 755static void ub_request_fn(request_queue_t *q)
748{ 756{
749 struct ub_lun *lun = q->queuedata; 757 struct ub_lun *lun = q->queuedata;
750 struct request *rq; 758 struct request *rq;
751 759
752 while ((rq = elv_next_request(q)) != NULL) { 760 while ((rq = elv_next_request(q)) != NULL) {
753 if (ub_bd_rq_fn_1(lun, rq) != 0) { 761 if (ub_request_fn_1(lun, rq) != 0) {
754 blk_stop_queue(q); 762 blk_stop_queue(q);
755 break; 763 break;
756 } 764 }
757 } 765 }
758} 766}
759 767
760static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) 768static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
761{ 769{
762 struct ub_dev *sc = lun->udev; 770 struct ub_dev *sc = lun->udev;
763 struct ub_scsi_cmd *cmd; 771 struct ub_scsi_cmd *cmd;
@@ -774,9 +782,8 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
774 memset(cmd, 0, sizeof(struct ub_scsi_cmd)); 782 memset(cmd, 0, sizeof(struct ub_scsi_cmd));
775 783
776 blkdev_dequeue_request(rq); 784 blkdev_dequeue_request(rq);
777
778 if (blk_pc_request(rq)) { 785 if (blk_pc_request(rq)) {
779 rc = ub_cmd_build_packet(sc, cmd, rq); 786 rc = ub_cmd_build_packet(sc, lun, cmd, rq);
780 } else { 787 } else {
781 rc = ub_cmd_build_block(sc, lun, cmd, rq); 788 rc = ub_cmd_build_block(sc, lun, cmd, rq);
782 } 789 }
@@ -791,7 +798,7 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq)
791 cmd->back = rq; 798 cmd->back = rq;
792 799
793 cmd->tag = sc->tagcnt++; 800 cmd->tag = sc->tagcnt++;
794 if ((rc = ub_submit_scsi(sc, cmd)) != 0) { 801 if (ub_submit_scsi(sc, cmd) != 0) {
795 ub_put_cmd(lun, cmd); 802 ub_put_cmd(lun, cmd);
796 ub_end_rq(rq, 0); 803 ub_end_rq(rq, 0);
797 return 0; 804 return 0;
@@ -804,58 +811,31 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
804 struct ub_scsi_cmd *cmd, struct request *rq) 811 struct ub_scsi_cmd *cmd, struct request *rq)
805{ 812{
806 int ub_dir; 813 int ub_dir;
807#if 0 /* We use rq->buffer for now */
808 struct scatterlist *sg;
809 int n_elem; 814 int n_elem;
810#endif
811 unsigned int block, nblks; 815 unsigned int block, nblks;
812 816
813 if (rq_data_dir(rq) == WRITE) 817 if (rq_data_dir(rq) == WRITE)
814 ub_dir = UB_DIR_WRITE; 818 ub_dir = UB_DIR_WRITE;
815 else 819 else
816 ub_dir = UB_DIR_READ; 820 ub_dir = UB_DIR_READ;
821 cmd->dir = ub_dir;
817 822
818 /* 823 /*
819 * get scatterlist from block layer 824 * get scatterlist from block layer
820 */ 825 */
821#if 0 /* We use rq->buffer for now */ 826 n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
822 sg = &cmd->sgv[0];
823 n_elem = blk_rq_map_sg(q, rq, sg);
824 if (n_elem <= 0) { 827 if (n_elem <= 0) {
825 ub_put_cmd(lun, cmd); 828 printk(KERN_INFO "%s: failed request map (%d)\n",
826 ub_end_rq(rq, 0); 829 sc->name, n_elem); /* P3 */
827 blk_start_queue(q); 830 return -1; /* request with no s/g entries? */
828 return 0; /* request with no s/g entries? */
829 } 831 }
830 832 if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */
831 if (n_elem != 1) { /* Paranoia */
832 printk(KERN_WARNING "%s: request with %d segments\n", 833 printk(KERN_WARNING "%s: request with %d segments\n",
833 sc->name, n_elem); 834 sc->name, n_elem);
834 ub_put_cmd(lun, cmd);
835 ub_end_rq(rq, 0);
836 blk_start_queue(q);
837 return 0;
838 }
839#endif
840
841 /*
842 * XXX Unfortunately, this check does not work. It is quite possible
843 * to get bogus non-null rq->buffer if you allow sg by mistake.
844 */
845 if (rq->buffer == NULL) {
846 /*
847 * This must not happen if we set the queue right.
848 * The block level must create bounce buffers for us.
849 */
850 static int do_print = 1;
851 if (do_print) {
852 printk(KERN_WARNING "%s: unmapped block request"
853 " flags 0x%lx sectors %lu\n",
854 sc->name, rq->flags, rq->nr_sectors);
855 do_print = 0;
856 }
857 return -1; 835 return -1;
858 } 836 }
837 cmd->nsg = n_elem;
838 sc->sg_stat[n_elem]++;
859 839
860 /* 840 /*
861 * build the command 841 * build the command
@@ -876,30 +856,15 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
876 cmd->cdb[8] = nblks; 856 cmd->cdb[8] = nblks;
877 cmd->cdb_len = 10; 857 cmd->cdb_len = 10;
878 858
879 cmd->dir = ub_dir;
880 cmd->data = rq->buffer;
881 cmd->len = rq->nr_sectors * 512; 859 cmd->len = rq->nr_sectors * 512;
882 860
883 return 0; 861 return 0;
884} 862}
885 863
886static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, 864static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
887 struct request *rq) 865 struct ub_scsi_cmd *cmd, struct request *rq)
888{ 866{
889 867 int n_elem;
890 if (rq->data_len != 0 && rq->data == NULL) {
891 static int do_print = 1;
892 if (do_print) {
893 printk(KERN_WARNING "%s: unmapped packet request"
894 " flags 0x%lx length %d\n",
895 sc->name, rq->flags, rq->data_len);
896 do_print = 0;
897 }
898 return -1;
899 }
900
901 memcpy(&cmd->cdb, rq->cmd, rq->cmd_len);
902 cmd->cdb_len = rq->cmd_len;
903 868
904 if (rq->data_len == 0) { 869 if (rq->data_len == 0) {
905 cmd->dir = UB_DIR_NONE; 870 cmd->dir = UB_DIR_NONE;
@@ -908,8 +873,29 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
908 cmd->dir = UB_DIR_WRITE; 873 cmd->dir = UB_DIR_WRITE;
909 else 874 else
910 cmd->dir = UB_DIR_READ; 875 cmd->dir = UB_DIR_READ;
876
877 }
878
879 /*
880 * get scatterlist from block layer
881 */
882 n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]);
883 if (n_elem < 0) {
884 printk(KERN_INFO "%s: failed request map (%d)\n",
885 sc->name, n_elem); /* P3 */
886 return -1;
911 } 887 }
912 cmd->data = rq->data; 888 if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */
889 printk(KERN_WARNING "%s: request with %d segments\n",
890 sc->name, n_elem);
891 return -1;
892 }
893 cmd->nsg = n_elem;
894 sc->sg_stat[n_elem]++;
895
896 memcpy(&cmd->cdb, rq->cmd, rq->cmd_len);
897 cmd->cdb_len = rq->cmd_len;
898
913 cmd->len = rq->data_len; 899 cmd->len = rq->data_len;
914 900
915 return 0; 901 return 0;
@@ -919,24 +905,34 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
919{ 905{
920 struct request *rq = cmd->back; 906 struct request *rq = cmd->back;
921 struct ub_lun *lun = cmd->lun; 907 struct ub_lun *lun = cmd->lun;
922 struct gendisk *disk = lun->disk;
923 request_queue_t *q = disk->queue;
924 int uptodate; 908 int uptodate;
925 909
926 if (blk_pc_request(rq)) { 910 if (cmd->error == 0) {
927 /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */
928 memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE);
929 rq->sense_len = UB_SENSE_SIZE;
930 }
931
932 if (cmd->error == 0)
933 uptodate = 1; 911 uptodate = 1;
934 else 912
913 if (blk_pc_request(rq)) {
914 if (cmd->act_len >= rq->data_len)
915 rq->data_len = 0;
916 else
917 rq->data_len -= cmd->act_len;
918 }
919 } else {
935 uptodate = 0; 920 uptodate = 0;
936 921
922 if (blk_pc_request(rq)) {
923 /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */
924 memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE);
925 rq->sense_len = UB_SENSE_SIZE;
926 if (sc->top_sense[0] != 0)
927 rq->errors = SAM_STAT_CHECK_CONDITION;
928 else
929 rq->errors = DID_ERROR << 16;
930 }
931 }
932
937 ub_put_cmd(lun, cmd); 933 ub_put_cmd(lun, cmd);
938 ub_end_rq(rq, uptodate); 934 ub_end_rq(rq, uptodate);
939 blk_start_queue(q); 935 blk_start_queue(lun->disk->queue);
940} 936}
941 937
942static void ub_end_rq(struct request *rq, int uptodate) 938static void ub_end_rq(struct request *rq, int uptodate)
@@ -1014,7 +1010,7 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1014 sc->last_pipe = sc->send_bulk_pipe; 1010 sc->last_pipe = sc->send_bulk_pipe;
1015 usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, 1011 usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe,
1016 bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); 1012 bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc);
1017 sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; 1013 sc->work_urb.transfer_flags = 0;
1018 1014
1019 /* Fill what we shouldn't be filling, because usb-storage did so. */ 1015 /* Fill what we shouldn't be filling, because usb-storage did so. */
1020 sc->work_urb.actual_length = 0; 1016 sc->work_urb.actual_length = 0;
@@ -1103,7 +1099,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1103{ 1099{
1104 struct urb *urb = &sc->work_urb; 1100 struct urb *urb = &sc->work_urb;
1105 struct bulk_cs_wrap *bcs; 1101 struct bulk_cs_wrap *bcs;
1106 int pipe;
1107 int rc; 1102 int rc;
1108 1103
1109 if (atomic_read(&sc->poison)) { 1104 if (atomic_read(&sc->poison)) {
@@ -1204,38 +1199,13 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1204 goto Bad_End; 1199 goto Bad_End;
1205 } 1200 }
1206 1201
1207 if (cmd->dir == UB_DIR_NONE) { 1202 if (cmd->dir == UB_DIR_NONE || cmd->nsg < 1) {
1208 ub_state_stat(sc, cmd); 1203 ub_state_stat(sc, cmd);
1209 return; 1204 return;
1210 } 1205 }
1211 1206
1212 UB_INIT_COMPLETION(sc->work_done); 1207 // udelay(125); // usb-storage has this
1213 1208 ub_data_start(sc, cmd);
1214 if (cmd->dir == UB_DIR_READ)
1215 pipe = sc->recv_bulk_pipe;
1216 else
1217 pipe = sc->send_bulk_pipe;
1218 sc->last_pipe = pipe;
1219 usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe,
1220 cmd->data, cmd->len, ub_urb_complete, sc);
1221 sc->work_urb.transfer_flags = URB_ASYNC_UNLINK;
1222 sc->work_urb.actual_length = 0;
1223 sc->work_urb.error_count = 0;
1224 sc->work_urb.status = 0;
1225
1226 if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {
1227 /* XXX Clear stalls */
1228 printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */
1229 ub_complete(&sc->work_done);
1230 ub_state_done(sc, cmd, rc);
1231 return;
1232 }
1233
1234 sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT;
1235 add_timer(&sc->work_timer);
1236
1237 cmd->state = UB_CMDST_DATA;
1238 ub_cmdtr_state(sc, cmd);
1239 1209
1240 } else if (cmd->state == UB_CMDST_DATA) { 1210 } else if (cmd->state == UB_CMDST_DATA) {
1241 if (urb->status == -EPIPE) { 1211 if (urb->status == -EPIPE) {
@@ -1257,16 +1227,22 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1257 if (urb->status == -EOVERFLOW) { 1227 if (urb->status == -EOVERFLOW) {
1258 /* 1228 /*
1259 * A babble? Failure, but we must transfer CSW now. 1229 * A babble? Failure, but we must transfer CSW now.
1230 * XXX This is going to end in perpetual babble. Reset.
1260 */ 1231 */
1261 cmd->error = -EOVERFLOW; /* A cheap trick... */ 1232 cmd->error = -EOVERFLOW; /* A cheap trick... */
1262 } else { 1233 ub_state_stat(sc, cmd);
1263 if (urb->status != 0) 1234 return;
1264 goto Bad_End;
1265 } 1235 }
1236 if (urb->status != 0)
1237 goto Bad_End;
1266 1238
1267 cmd->act_len = urb->actual_length; 1239 cmd->act_len += urb->actual_length;
1268 ub_cmdtr_act_len(sc, cmd); 1240 ub_cmdtr_act_len(sc, cmd);
1269 1241
1242 if (++cmd->current_sg < cmd->nsg) {
1243 ub_data_start(sc, cmd);
1244 return;
1245 }
1270 ub_state_stat(sc, cmd); 1246 ub_state_stat(sc, cmd);
1271 1247
1272 } else if (cmd->state == UB_CMDST_STAT) { 1248 } else if (cmd->state == UB_CMDST_STAT) {
@@ -1401,6 +1377,46 @@ Bad_End: /* Little Excel is dead */
1401 1377
1402/* 1378/*
1403 * Factorization helper for the command state machine: 1379 * Factorization helper for the command state machine:
1380 * Initiate a data segment transfer.
1381 */
1382static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1383{
1384 struct scatterlist *sg = &cmd->sgv[cmd->current_sg];
1385 int pipe;
1386 int rc;
1387
1388 UB_INIT_COMPLETION(sc->work_done);
1389
1390 if (cmd->dir == UB_DIR_READ)
1391 pipe = sc->recv_bulk_pipe;
1392 else
1393 pipe = sc->send_bulk_pipe;
1394 sc->last_pipe = pipe;
1395 usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe,
1396 page_address(sg->page) + sg->offset, sg->length,
1397 ub_urb_complete, sc);
1398 sc->work_urb.transfer_flags = 0;
1399 sc->work_urb.actual_length = 0;
1400 sc->work_urb.error_count = 0;
1401 sc->work_urb.status = 0;
1402
1403 if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) {
1404 /* XXX Clear stalls */
1405 printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */
1406 ub_complete(&sc->work_done);
1407 ub_state_done(sc, cmd, rc);
1408 return;
1409 }
1410
1411 sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT;
1412 add_timer(&sc->work_timer);
1413
1414 cmd->state = UB_CMDST_DATA;
1415 ub_cmdtr_state(sc, cmd);
1416}
1417
1418/*
1419 * Factorization helper for the command state machine:
1404 * Finish the command. 1420 * Finish the command.
1405 */ 1421 */
1406static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc) 1422static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc)
@@ -1426,7 +1442,7 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1426 sc->last_pipe = sc->recv_bulk_pipe; 1442 sc->last_pipe = sc->recv_bulk_pipe;
1427 usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, 1443 usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe,
1428 &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); 1444 &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc);
1429 sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; 1445 sc->work_urb.transfer_flags = 0;
1430 sc->work_urb.actual_length = 0; 1446 sc->work_urb.actual_length = 0;
1431 sc->work_urb.error_count = 0; 1447 sc->work_urb.error_count = 0;
1432 sc->work_urb.status = 0; 1448 sc->work_urb.status = 0;
@@ -1484,6 +1500,7 @@ static void ub_state_stat_counted(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1484static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) 1500static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1485{ 1501{
1486 struct ub_scsi_cmd *scmd; 1502 struct ub_scsi_cmd *scmd;
1503 struct scatterlist *sg;
1487 int rc; 1504 int rc;
1488 1505
1489 if (cmd->cdb[0] == REQUEST_SENSE) { 1506 if (cmd->cdb[0] == REQUEST_SENSE) {
@@ -1492,12 +1509,17 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
1492 } 1509 }
1493 1510
1494 scmd = &sc->top_rqs_cmd; 1511 scmd = &sc->top_rqs_cmd;
1512 memset(scmd, 0, sizeof(struct ub_scsi_cmd));
1495 scmd->cdb[0] = REQUEST_SENSE; 1513 scmd->cdb[0] = REQUEST_SENSE;
1496 scmd->cdb[4] = UB_SENSE_SIZE; 1514 scmd->cdb[4] = UB_SENSE_SIZE;
1497 scmd->cdb_len = 6; 1515 scmd->cdb_len = 6;
1498 scmd->dir = UB_DIR_READ; 1516 scmd->dir = UB_DIR_READ;
1499 scmd->state = UB_CMDST_INIT; 1517 scmd->state = UB_CMDST_INIT;
1500 scmd->data = sc->top_sense; 1518 scmd->nsg = 1;
1519 sg = &scmd->sgv[0];
1520 sg->page = virt_to_page(sc->top_sense);
1521 sg->offset = (unsigned int)sc->top_sense & (PAGE_SIZE-1);
1522 sg->length = UB_SENSE_SIZE;
1501 scmd->len = UB_SENSE_SIZE; 1523 scmd->len = UB_SENSE_SIZE;
1502 scmd->lun = cmd->lun; 1524 scmd->lun = cmd->lun;
1503 scmd->done = ub_top_sense_done; 1525 scmd->done = ub_top_sense_done;
@@ -1541,7 +1563,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
1541 1563
1542 usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, 1564 usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe,
1543 (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); 1565 (unsigned char*) cr, NULL, 0, ub_urb_complete, sc);
1544 sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; 1566 sc->work_urb.transfer_flags = 0;
1545 sc->work_urb.actual_length = 0; 1567 sc->work_urb.actual_length = 0;
1546 sc->work_urb.error_count = 0; 1568 sc->work_urb.error_count = 0;
1547 sc->work_urb.status = 0; 1569 sc->work_urb.status = 0;
@@ -1560,7 +1582,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd,
1560 */ 1582 */
1561static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd) 1583static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
1562{ 1584{
1563 unsigned char *sense = scmd->data; 1585 unsigned char *sense = sc->top_sense;
1564 struct ub_scsi_cmd *cmd; 1586 struct ub_scsi_cmd *cmd;
1565 1587
1566 /* 1588 /*
@@ -1852,6 +1874,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
1852 struct ub_capacity *ret) 1874 struct ub_capacity *ret)
1853{ 1875{
1854 struct ub_scsi_cmd *cmd; 1876 struct ub_scsi_cmd *cmd;
1877 struct scatterlist *sg;
1855 char *p; 1878 char *p;
1856 enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 }; 1879 enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 };
1857 unsigned long flags; 1880 unsigned long flags;
@@ -1872,7 +1895,11 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
1872 cmd->cdb_len = 10; 1895 cmd->cdb_len = 10;
1873 cmd->dir = UB_DIR_READ; 1896 cmd->dir = UB_DIR_READ;
1874 cmd->state = UB_CMDST_INIT; 1897 cmd->state = UB_CMDST_INIT;
1875 cmd->data = p; 1898 cmd->nsg = 1;
1899 sg = &cmd->sgv[0];
1900 sg->page = virt_to_page(p);
1901 sg->offset = (unsigned int)p & (PAGE_SIZE-1);
1902 sg->length = 8;
1876 cmd->len = 8; 1903 cmd->len = 8;
1877 cmd->lun = lun; 1904 cmd->lun = lun;
1878 cmd->done = ub_probe_done; 1905 cmd->done = ub_probe_done;
@@ -2289,7 +2316,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum)
2289 disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */ 2316 disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */
2290 2317
2291 rc = -ENOMEM; 2318 rc = -ENOMEM;
2292 if ((q = blk_init_queue(ub_bd_rq_fn, &sc->lock)) == NULL) 2319 if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL)
2293 goto err_blkqinit; 2320 goto err_blkqinit;
2294 2321
2295 disk->queue = q; 2322 disk->queue = q;
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
index 2bc9d64db106..c29365d5b524 100644
--- a/drivers/char/Kconfig
+++ b/drivers/char/Kconfig
@@ -80,7 +80,7 @@ config SERIAL_NONSTANDARD
80 80
81config COMPUTONE 81config COMPUTONE
82 tristate "Computone IntelliPort Plus serial support" 82 tristate "Computone IntelliPort Plus serial support"
83 depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32) 83 depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
84 ---help--- 84 ---help---
85 This driver supports the entire family of Intelliport II/Plus 85 This driver supports the entire family of Intelliport II/Plus
86 controllers with the exception of the MicroChannel controllers and 86 controllers with the exception of the MicroChannel controllers and
@@ -208,7 +208,7 @@ config SYNCLINK
208 208
209config SYNCLINKMP 209config SYNCLINKMP
210 tristate "SyncLink Multiport support" 210 tristate "SyncLink Multiport support"
211 depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32) 211 depends on SERIAL_NONSTANDARD
212 help 212 help
213 Enable support for the SyncLink Multiport (2 or 4 ports) 213 Enable support for the SyncLink Multiport (2 or 4 ports)
214 serial adapter, running asynchronous and HDLC communications up 214 serial adapter, running asynchronous and HDLC communications up
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index 59f589d733f9..0a7624a9b1c1 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -429,7 +429,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev)
429 struct pci_dev *dev1; 429 struct pci_dev *dev1;
430 int i; 430 int i;
431 unsigned size = amd64_fetch_size(); 431 unsigned size = amd64_fetch_size();
432 printk(KERN_INFO "Setting up ULi AGP. \n"); 432 printk(KERN_INFO "Setting up ULi AGP.\n");
433 dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0)); 433 dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0));
434 if (dev1 == NULL) { 434 if (dev1 == NULL) {
435 printk(KERN_INFO PFX "Detected a ULi chipset, " 435 printk(KERN_INFO PFX "Detected a ULi chipset, "
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
index f0079e991bdc..ac9da0ca36b7 100644
--- a/drivers/char/agp/generic.c
+++ b/drivers/char/agp/generic.c
@@ -319,7 +319,6 @@ int agp_copy_info(struct agp_bridge_data *bridge, struct agp_kern_info *info)
319 info->mode = bridge->mode & ~AGP3_RESERVED_MASK; 319 info->mode = bridge->mode & ~AGP3_RESERVED_MASK;
320 else 320 else
321 info->mode = bridge->mode & ~AGP2_RESERVED_MASK; 321 info->mode = bridge->mode & ~AGP2_RESERVED_MASK;
322 info->mode = bridge->mode;
323 info->aper_base = bridge->gart_bus_addr; 322 info->aper_base = bridge->gart_bus_addr;
324 info->aper_size = agp_return_size(); 323 info->aper_size = agp_return_size();
325 info->max_memory = bridge->max_memory_agp; 324 info->max_memory = bridge->max_memory_agp;
@@ -356,7 +355,7 @@ int agp_bind_memory(struct agp_memory *curr, off_t pg_start)
356 return -EINVAL; 355 return -EINVAL;
357 356
358 if (curr->is_bound == TRUE) { 357 if (curr->is_bound == TRUE) {
359 printk (KERN_INFO PFX "memory %p is already bound!\n", curr); 358 printk(KERN_INFO PFX "memory %p is already bound!\n", curr);
360 return -EINVAL; 359 return -EINVAL;
361 } 360 }
362 if (curr->is_flushed == FALSE) { 361 if (curr->is_flushed == FALSE) {
@@ -391,7 +390,7 @@ int agp_unbind_memory(struct agp_memory *curr)
391 return -EINVAL; 390 return -EINVAL;
392 391
393 if (curr->is_bound != TRUE) { 392 if (curr->is_bound != TRUE) {
394 printk (KERN_INFO PFX "memory %p was not bound!\n", curr); 393 printk(KERN_INFO PFX "memory %p was not bound!\n", curr);
395 return -EINVAL; 394 return -EINVAL;
396 } 395 }
397 396
@@ -415,7 +414,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
415 u32 tmp; 414 u32 tmp;
416 415
417 if (*requested_mode & AGP2_RESERVED_MASK) { 416 if (*requested_mode & AGP2_RESERVED_MASK) {
418 printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); 417 printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
419 *requested_mode &= ~AGP2_RESERVED_MASK; 418 *requested_mode &= ~AGP2_RESERVED_MASK;
420 } 419 }
421 420
@@ -423,7 +422,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
423 tmp = *requested_mode & 7; 422 tmp = *requested_mode & 7;
424 switch (tmp) { 423 switch (tmp) {
425 case 0: 424 case 0:
426 printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm); 425 printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm);
427 *requested_mode |= AGPSTAT2_1X; 426 *requested_mode |= AGPSTAT2_1X;
428 break; 427 break;
429 case 1: 428 case 1:
@@ -493,18 +492,18 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
493 u32 tmp; 492 u32 tmp;
494 493
495 if (*requested_mode & AGP3_RESERVED_MASK) { 494 if (*requested_mode & AGP3_RESERVED_MASK) {
496 printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); 495 printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode);
497 *requested_mode &= ~AGP3_RESERVED_MASK; 496 *requested_mode &= ~AGP3_RESERVED_MASK;
498 } 497 }
499 498
500 /* Check the speed bits make sense. */ 499 /* Check the speed bits make sense. */
501 tmp = *requested_mode & 7; 500 tmp = *requested_mode & 7;
502 if (tmp == 0) { 501 if (tmp == 0) {
503 printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm); 502 printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm);
504 *requested_mode |= AGPSTAT3_4X; 503 *requested_mode |= AGPSTAT3_4X;
505 } 504 }
506 if (tmp >= 3) { 505 if (tmp >= 3) {
507 printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4); 506 printk(KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4);
508 *requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X; 507 *requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X;
509 } 508 }
510 509
@@ -533,7 +532,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
533 * AGP2.x 4x -> AGP3.0 4x. 532 * AGP2.x 4x -> AGP3.0 4x.
534 */ 533 */
535 if (*requested_mode & AGPSTAT2_4X) { 534 if (*requested_mode & AGPSTAT2_4X) {
536 printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", 535 printk(KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n",
537 current->comm, *requested_mode); 536 current->comm, *requested_mode);
538 *requested_mode &= ~AGPSTAT2_4X; 537 *requested_mode &= ~AGPSTAT2_4X;
539 *requested_mode |= AGPSTAT3_4X; 538 *requested_mode |= AGPSTAT3_4X;
@@ -544,7 +543,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
544 * but have been passed an AGP 2.x mode. 543 * but have been passed an AGP 2.x mode.
545 * Convert AGP 1x,2x,4x -> AGP 3.0 4x. 544 * Convert AGP 1x,2x,4x -> AGP 3.0 4x.
546 */ 545 */
547 printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", 546 printk(KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",
548 current->comm, *requested_mode); 547 current->comm, *requested_mode);
549 *requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X); 548 *requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X);
550 *requested_mode |= AGPSTAT3_4X; 549 *requested_mode |= AGPSTAT3_4X;
@@ -554,13 +553,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
554 if (!(*bridge_agpstat & AGPSTAT3_8X)) { 553 if (!(*bridge_agpstat & AGPSTAT3_8X)) {
555 *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); 554 *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
556 *bridge_agpstat |= AGPSTAT3_4X; 555 *bridge_agpstat |= AGPSTAT3_4X;
557 printk ("%s requested AGPx8 but bridge not capable.\n", current->comm); 556 printk(KERN_INFO PFX "%s requested AGPx8 but bridge not capable.\n", current->comm);
558 return; 557 return;
559 } 558 }
560 if (!(*vga_agpstat & AGPSTAT3_8X)) { 559 if (!(*vga_agpstat & AGPSTAT3_8X)) {
561 *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); 560 *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
562 *bridge_agpstat |= AGPSTAT3_4X; 561 *bridge_agpstat |= AGPSTAT3_4X;
563 printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm); 562 printk(KERN_INFO PFX "%s requested AGPx8 but graphic card not capable.\n", current->comm);
564 return; 563 return;
565 } 564 }
566 /* All set, bridge & device can do AGP x8*/ 565 /* All set, bridge & device can do AGP x8*/
@@ -578,13 +577,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_
578 if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X)) 577 if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X))
579 *bridge_agpstat |= AGPSTAT3_4X; 578 *bridge_agpstat |= AGPSTAT3_4X;
580 else { 579 else {
581 printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. " 580 printk(KERN_INFO PFX "Badness. Don't know which AGP mode to set. "
582 "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n", 581 "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n",
583 origbridge, origvga, *bridge_agpstat, *vga_agpstat); 582 origbridge, origvga, *bridge_agpstat, *vga_agpstat);
584 if (!(*bridge_agpstat & AGPSTAT3_4X)) 583 if (!(*bridge_agpstat & AGPSTAT3_4X))
585 printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); 584 printk(KERN_INFO PFX "Bridge couldn't do AGP x4.\n");
586 if (!(*vga_agpstat & AGPSTAT3_4X)) 585 if (!(*vga_agpstat & AGPSTAT3_4X))
587 printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); 586 printk(KERN_INFO PFX "Graphic card couldn't do AGP x4.\n");
588 return; 587 return;
589 } 588 }
590 } 589 }
@@ -622,7 +621,7 @@ u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode
622 for (;;) { 621 for (;;) {
623 device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device); 622 device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device);
624 if (!device) { 623 if (!device) {
625 printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n"); 624 printk(KERN_INFO PFX "Couldn't find an AGP VGA controller.\n");
626 return 0; 625 return 0;
627 } 626 }
628 cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP); 627 cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP);
@@ -734,7 +733,7 @@ void agp_generic_enable(struct agp_bridge_data *bridge, u32 requested_mode)
734 pci_write_config_dword(bridge->dev, 733 pci_write_config_dword(bridge->dev,
735 bridge->capndx+AGPCTRL, temp); 734 bridge->capndx+AGPCTRL, temp);
736 735
737 printk (KERN_INFO PFX "Device is in legacy mode," 736 printk(KERN_INFO PFX "Device is in legacy mode,"
738 " falling back to 2.x\n"); 737 " falling back to 2.x\n");
739 } 738 }
740 } 739 }
diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
index 6f98701dfe15..121cc85f347e 100644
--- a/drivers/char/drm/drmP.h
+++ b/drivers/char/drm/drmP.h
@@ -1071,5 +1071,9 @@ extern void *drm_calloc(size_t nmemb, size_t size, int area);
1071extern unsigned long drm_core_get_map_ofs(drm_map_t *map); 1071extern unsigned long drm_core_get_map_ofs(drm_map_t *map);
1072extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); 1072extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev);
1073 1073
1074#ifndef pci_pretty_name
1075#define pci_pretty_name(dev) ""
1076#endif
1077
1074#endif /* __KERNEL__ */ 1078#endif /* __KERNEL__ */
1075#endif 1079#endif
diff --git a/drivers/char/ip2main.c b/drivers/char/ip2main.c
index cf0cd58d6305..066d7b5cb76d 100644
--- a/drivers/char/ip2main.c
+++ b/drivers/char/ip2main.c
@@ -120,7 +120,6 @@
120 120
121#include <linux/vmalloc.h> 121#include <linux/vmalloc.h>
122#include <linux/init.h> 122#include <linux/init.h>
123#include <asm/serial.h>
124 123
125#include <asm/uaccess.h> 124#include <asm/uaccess.h>
126 125
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c
index ec949e4c070f..8982eafd0fb7 100644
--- a/drivers/char/synclinkmp.c
+++ b/drivers/char/synclinkmp.c
@@ -55,7 +55,6 @@
55#include <linux/netdevice.h> 55#include <linux/netdevice.h>
56#include <linux/vmalloc.h> 56#include <linux/vmalloc.h>
57#include <linux/init.h> 57#include <linux/init.h>
58#include <asm/serial.h>
59#include <linux/delay.h> 58#include <linux/delay.h>
60#include <linux/ioctl.h> 59#include <linux/ioctl.h>
61 60
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 10b014982381..109d62ccf651 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -627,7 +627,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
627 627
628 ret = kobject_register(&policy->kobj); 628 ret = kobject_register(&policy->kobj);
629 if (ret) 629 if (ret)
630 goto err_out; 630 goto err_out_driver_exit;
631 631
632 /* set up files for this cpu device */ 632 /* set up files for this cpu device */
633 drv_attr = cpufreq_driver->attr; 633 drv_attr = cpufreq_driver->attr;
@@ -673,6 +673,10 @@ err_out_unregister:
673 kobject_unregister(&policy->kobj); 673 kobject_unregister(&policy->kobj);
674 wait_for_completion(&policy->kobj_unregister); 674 wait_for_completion(&policy->kobj_unregister);
675 675
676err_out_driver_exit:
677 if (cpufreq_driver->exit)
678 cpufreq_driver->exit(policy);
679
676err_out: 680err_out:
677 kfree(policy); 681 kfree(policy);
678 682
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 6e9da1372225..8334496a7e0a 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -144,6 +144,22 @@ config I2C_I810
144 This driver can also be built as a module. If so, the module 144 This driver can also be built as a module. If so, the module
145 will be called i2c-i810. 145 will be called i2c-i810.
146 146
147config I2C_PXA
148 tristate "Intel PXA2XX I2C adapter (EXPERIMENTAL)"
149 depends on I2C && EXPERIMENTAL && ARCH_PXA
150 help
151 If you have devices in the PXA I2C bus, say yes to this option.
152 This driver can also be built as a module. If so, the module
153 will be called i2c-pxa.
154
155config I2C_PXA_SLAVE
156 bool "Intel PXA2XX I2C Slave comms support"
157 depends on I2C_PXA
158 help
159 Support I2C slave mode communications on the PXA I2C bus. This
160 is necessary for systems where the PXA may be a target on the
161 I2C bus.
162
147config I2C_PIIX4 163config I2C_PIIX4
148 tristate "Intel PIIX4" 164 tristate "Intel PIIX4"
149 depends on I2C && PCI 165 depends on I2C && PCI
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 42d6d814da72..980b3e983670 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o
28obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o 28obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o
29obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o 29obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o
30obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o 30obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o
31obj-$(CONFIG_I2C_PXA) += i2c-pxa.o
31obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o 32obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o
32obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o 33obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o
33obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o 34obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
new file mode 100644
index 000000000000..fdf53ce04248
--- /dev/null
+++ b/drivers/i2c/busses/i2c-pxa.c
@@ -0,0 +1,1022 @@
1/*
2 * i2c_adap_pxa.c
3 *
4 * I2C adapter for the PXA I2C bus access.
5 *
6 * Copyright (C) 2002 Intrinsyc Software Inc.
7 * Copyright (C) 2004-2005 Deep Blue Solutions Ltd.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 * History:
14 * Apr 2002: Initial version [CS]
15 * Jun 2002: Properly seperated algo/adap [FB]
16 * Jan 2003: Fixed several bugs concerning interrupt handling [Kai-Uwe Bloem]
17 * Jan 2003: added limited signal handling [Kai-Uwe Bloem]
18 * Sep 2004: Major rework to ensure efficient bus handling [RMK]
19 * Dec 2004: Added support for PXA27x and slave device probing [Liam Girdwood]
20 * Feb 2005: Rework slave mode handling [RMK]
21 */
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/i2c.h>
25#include <linux/i2c-id.h>
26#include <linux/init.h>
27#include <linux/time.h>
28#include <linux/sched.h>
29#include <linux/delay.h>
30#include <linux/errno.h>
31#include <linux/interrupt.h>
32#include <linux/i2c-pxa.h>
33
34#include <asm/hardware.h>
35#include <asm/irq.h>
36#include <asm/arch/i2c.h>
37#include <asm/arch/pxa-regs.h>
38
39struct pxa_i2c {
40 spinlock_t lock;
41 wait_queue_head_t wait;
42 struct i2c_msg *msg;
43 unsigned int msg_num;
44 unsigned int msg_idx;
45 unsigned int msg_ptr;
46 unsigned int slave_addr;
47
48 struct i2c_adapter adap;
49#ifdef CONFIG_I2C_PXA_SLAVE
50 struct i2c_slave_client *slave;
51#endif
52
53 unsigned int irqlogidx;
54 u32 isrlog[32];
55 u32 icrlog[32];
56};
57
58/*
59 * I2C Slave mode address
60 */
61#define I2C_PXA_SLAVE_ADDR 0x1
62
63#ifdef DEBUG
64
65struct bits {
66 u32 mask;
67 const char *set;
68 const char *unset;
69};
70#define BIT(m, s, u) { .mask = m, .set = s, .unset = u }
71
72static inline void
73decode_bits(const char *prefix, const struct bits *bits, int num, u32 val)
74{
75 printk("%s %08x: ", prefix, val);
76 while (num--) {
77 const char *str = val & bits->mask ? bits->set : bits->unset;
78 if (str)
79 printk("%s ", str);
80 bits++;
81 }
82}
83
84static const struct bits isr_bits[] = {
85 BIT(ISR_RWM, "RX", "TX"),
86 BIT(ISR_ACKNAK, "NAK", "ACK"),
87 BIT(ISR_UB, "Bsy", "Rdy"),
88 BIT(ISR_IBB, "BusBsy", "BusRdy"),
89 BIT(ISR_SSD, "SlaveStop", NULL),
90 BIT(ISR_ALD, "ALD", NULL),
91 BIT(ISR_ITE, "TxEmpty", NULL),
92 BIT(ISR_IRF, "RxFull", NULL),
93 BIT(ISR_GCAD, "GenCall", NULL),
94 BIT(ISR_SAD, "SlaveAddr", NULL),
95 BIT(ISR_BED, "BusErr", NULL),
96};
97
98static void decode_ISR(unsigned int val)
99{
100 decode_bits(KERN_DEBUG "ISR", isr_bits, ARRAY_SIZE(isr_bits), val);
101 printk("\n");
102}
103
104static const struct bits icr_bits[] = {
105 BIT(ICR_START, "START", NULL),
106 BIT(ICR_STOP, "STOP", NULL),
107 BIT(ICR_ACKNAK, "ACKNAK", NULL),
108 BIT(ICR_TB, "TB", NULL),
109 BIT(ICR_MA, "MA", NULL),
110 BIT(ICR_SCLE, "SCLE", "scle"),
111 BIT(ICR_IUE, "IUE", "iue"),
112 BIT(ICR_GCD, "GCD", NULL),
113 BIT(ICR_ITEIE, "ITEIE", NULL),
114 BIT(ICR_IRFIE, "IRFIE", NULL),
115 BIT(ICR_BEIE, "BEIE", NULL),
116 BIT(ICR_SSDIE, "SSDIE", NULL),
117 BIT(ICR_ALDIE, "ALDIE", NULL),
118 BIT(ICR_SADIE, "SADIE", NULL),
119 BIT(ICR_UR, "UR", "ur"),
120};
121
122static void decode_ICR(unsigned int val)
123{
124 decode_bits(KERN_DEBUG "ICR", icr_bits, ARRAY_SIZE(icr_bits), val);
125 printk("\n");
126}
127
128static unsigned int i2c_debug = DEBUG;
129
130static void i2c_pxa_show_state(struct pxa_i2c *i2c, int lno, const char *fname)
131{
132 dev_dbg(&i2c->adap.dev, "state:%s:%d: ISR=%08x, ICR=%08x, IBMR=%02x\n", fname, lno, ISR, ICR, IBMR);
133}
134
135#define show_state(i2c) i2c_pxa_show_state(i2c, __LINE__, __FUNCTION__)
136#else
137#define i2c_debug 0
138
139#define show_state(i2c) do { } while (0)
140#define decode_ISR(val) do { } while (0)
141#define decode_ICR(val) do { } while (0)
142#endif
143
144#define eedbg(lvl, x...) do { if ((lvl) < 1) { printk(KERN_DEBUG "" x); } } while(0)
145
146static void i2c_pxa_master_complete(struct pxa_i2c *i2c, int ret);
147
148static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
149{
150 unsigned int i;
151 printk("i2c: error: %s\n", why);
152 printk("i2c: msg_num: %d msg_idx: %d msg_ptr: %d\n",
153 i2c->msg_num, i2c->msg_idx, i2c->msg_ptr);
154 printk("i2c: ICR: %08x ISR: %08x\n"
155 "i2c: log: ", ICR, ISR);
156 for (i = 0; i < i2c->irqlogidx; i++)
157 printk("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]);
158 printk("\n");
159}
160
161static inline int i2c_pxa_is_slavemode(struct pxa_i2c *i2c)
162{
163 return !(ICR & ICR_SCLE);
164}
165
166static void i2c_pxa_abort(struct pxa_i2c *i2c)
167{
168 unsigned long timeout = jiffies + HZ/4;
169
170 if (i2c_pxa_is_slavemode(i2c)) {
171 dev_dbg(&i2c->adap.dev, "%s: called in slave mode\n", __func__);
172 return;
173 }
174
175 while (time_before(jiffies, timeout) && (IBMR & 0x1) == 0) {
176 unsigned long icr = ICR;
177
178 icr &= ~ICR_START;
179 icr |= ICR_ACKNAK | ICR_STOP | ICR_TB;
180
181 ICR = icr;
182
183 show_state(i2c);
184
185 msleep(1);
186 }
187
188 ICR &= ~(ICR_MA | ICR_START | ICR_STOP);
189}
190
191static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2c)
192{
193 int timeout = DEF_TIMEOUT;
194
195 while (timeout-- && ISR & (ISR_IBB | ISR_UB)) {
196 if ((ISR & ISR_SAD) != 0)
197 timeout += 4;
198
199 msleep(2);
200 show_state(i2c);
201 }
202
203 if (timeout <= 0)
204 show_state(i2c);
205
206 return timeout <= 0 ? I2C_RETRY : 0;
207}
208
209static int i2c_pxa_wait_master(struct pxa_i2c *i2c)
210{
211 unsigned long timeout = jiffies + HZ*4;
212
213 while (time_before(jiffies, timeout)) {
214 if (i2c_debug > 1)
215 dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
216 __func__, (long)jiffies, ISR, ICR, IBMR);
217
218 if (ISR & ISR_SAD) {
219 if (i2c_debug > 0)
220 dev_dbg(&i2c->adap.dev, "%s: Slave detected\n", __func__);
221 goto out;
222 }
223
224 /* wait for unit and bus being not busy, and we also do a
225 * quick check of the i2c lines themselves to ensure they've
226 * gone high...
227 */
228 if ((ISR & (ISR_UB | ISR_IBB)) == 0 && IBMR == 3) {
229 if (i2c_debug > 0)
230 dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
231 return 1;
232 }
233
234 msleep(1);
235 }
236
237 if (i2c_debug > 0)
238 dev_dbg(&i2c->adap.dev, "%s: did not free\n", __func__);
239 out:
240 return 0;
241}
242
243static int i2c_pxa_set_master(struct pxa_i2c *i2c)
244{
245 if (i2c_debug)
246 dev_dbg(&i2c->adap.dev, "setting to bus master\n");
247
248 if ((ISR & (ISR_UB | ISR_IBB)) != 0) {
249 dev_dbg(&i2c->adap.dev, "%s: unit is busy\n", __func__);
250 if (!i2c_pxa_wait_master(i2c)) {
251 dev_dbg(&i2c->adap.dev, "%s: error: unit busy\n", __func__);
252 return I2C_RETRY;
253 }
254 }
255
256 ICR |= ICR_SCLE;
257 return 0;
258}
259
260#ifdef CONFIG_I2C_PXA_SLAVE
261static int i2c_pxa_wait_slave(struct pxa_i2c *i2c)
262{
263 unsigned long timeout = jiffies + HZ*1;
264
265 /* wait for stop */
266
267 show_state(i2c);
268
269 while (time_before(jiffies, timeout)) {
270 if (i2c_debug > 1)
271 dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
272 __func__, (long)jiffies, ISR, ICR, IBMR);
273
274 if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD ||
275 (ICR & ICR_SCLE) == 0) {
276 if (i2c_debug > 1)
277 dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
278 return 1;
279 }
280
281 msleep(1);
282 }
283
284 if (i2c_debug > 0)
285 dev_dbg(&i2c->adap.dev, "%s: did not free\n", __func__);
286 return 0;
287}
288
289/*
290 * clear the hold on the bus, and take of anything else
291 * that has been configured
292 */
293static void i2c_pxa_set_slave(struct pxa_i2c *i2c, int errcode)
294{
295 show_state(i2c);
296
297 if (errcode < 0) {
298 udelay(100); /* simple delay */
299 } else {
300 /* we need to wait for the stop condition to end */
301
302 /* if we where in stop, then clear... */
303 if (ICR & ICR_STOP) {
304 udelay(100);
305 ICR &= ~ICR_STOP;
306 }
307
308 if (!i2c_pxa_wait_slave(i2c)) {
309 dev_err(&i2c->adap.dev, "%s: wait timedout\n",
310 __func__);
311 return;
312 }
313 }
314
315 ICR &= ~(ICR_STOP|ICR_ACKNAK|ICR_MA);
316 ICR &= ~ICR_SCLE;
317
318 if (i2c_debug) {
319 dev_dbg(&i2c->adap.dev, "ICR now %08x, ISR %08x\n", ICR, ISR);
320 decode_ICR(ICR);
321 }
322}
323#else
324#define i2c_pxa_set_slave(i2c, err) do { } while (0)
325#endif
326
327static void i2c_pxa_reset(struct pxa_i2c *i2c)
328{
329 pr_debug("Resetting I2C Controller Unit\n");
330
331 /* abort any transfer currently under way */
332 i2c_pxa_abort(i2c);
333
334 /* reset according to 9.8 */
335 ICR = ICR_UR;
336 ISR = I2C_ISR_INIT;
337 ICR &= ~ICR_UR;
338
339 ISAR = i2c->slave_addr;
340
341 /* set control register values */
342 ICR = I2C_ICR_INIT;
343
344#ifdef CONFIG_I2C_PXA_SLAVE
345 dev_info(&i2c->adap.dev, "Enabling slave mode\n");
346 ICR |= ICR_SADIE | ICR_ALDIE | ICR_SSDIE;
347#endif
348
349 i2c_pxa_set_slave(i2c, 0);
350
351 /* enable unit */
352 ICR |= ICR_IUE;
353 udelay(100);
354}
355
356
357#ifdef CONFIG_I2C_PXA_SLAVE
358/*
359 * I2C EEPROM emulation.
360 */
361static struct i2c_eeprom_emu eeprom = {
362 .size = I2C_EEPROM_EMU_SIZE,
363 .watch = LIST_HEAD_INIT(eeprom.watch),
364};
365
366struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void)
367{
368 return &eeprom;
369}
370
371int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *emu, void *data,
372 unsigned int addr, unsigned int size,
373 struct i2c_eeprom_emu_watcher *watcher)
374{
375 struct i2c_eeprom_emu_watch *watch;
376 unsigned long flags;
377
378 if (addr + size > emu->size)
379 return -EINVAL;
380
381 watch = kmalloc(sizeof(struct i2c_eeprom_emu_watch), GFP_KERNEL);
382 if (watch) {
383 watch->start = addr;
384 watch->end = addr + size - 1;
385 watch->ops = watcher;
386 watch->data = data;
387
388 local_irq_save(flags);
389 list_add(&watch->node, &emu->watch);
390 local_irq_restore(flags);
391 }
392
393 return watch ? 0 : -ENOMEM;
394}
395
396void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *emu, void *data,
397 struct i2c_eeprom_emu_watcher *watcher)
398{
399 struct i2c_eeprom_emu_watch *watch, *n;
400 unsigned long flags;
401
402 list_for_each_entry_safe(watch, n, &emu->watch, node) {
403 if (watch->ops == watcher && watch->data == data) {
404 local_irq_save(flags);
405 list_del(&watch->node);
406 local_irq_restore(flags);
407 kfree(watch);
408 }
409 }
410}
411
412static void i2c_eeprom_emu_event(void *ptr, i2c_slave_event_t event)
413{
414 struct i2c_eeprom_emu *emu = ptr;
415
416 eedbg(3, "i2c_eeprom_emu_event: %d\n", event);
417
418 switch (event) {
419 case I2C_SLAVE_EVENT_START_WRITE:
420 emu->seen_start = 1;
421 eedbg(2, "i2c_eeprom: write initiated\n");
422 break;
423
424 case I2C_SLAVE_EVENT_START_READ:
425 emu->seen_start = 0;
426 eedbg(2, "i2c_eeprom: read initiated\n");
427 break;
428
429 case I2C_SLAVE_EVENT_STOP:
430 emu->seen_start = 0;
431 eedbg(2, "i2c_eeprom: received stop\n");
432 break;
433
434 default:
435 eedbg(0, "i2c_eeprom: unhandled event\n");
436 break;
437 }
438}
439
440static int i2c_eeprom_emu_read(void *ptr)
441{
442 struct i2c_eeprom_emu *emu = ptr;
443 int ret;
444
445 ret = emu->bytes[emu->ptr];
446 emu->ptr = (emu->ptr + 1) % emu->size;
447
448 return ret;
449}
450
451static void i2c_eeprom_emu_write(void *ptr, unsigned int val)
452{
453 struct i2c_eeprom_emu *emu = ptr;
454 struct i2c_eeprom_emu_watch *watch;
455
456 if (emu->seen_start != 0) {
457 eedbg(2, "i2c_eeprom_emu_write: setting ptr %02x\n", val);
458 emu->ptr = val;
459 emu->seen_start = 0;
460 return;
461 }
462
463 emu->bytes[emu->ptr] = val;
464
465 eedbg(1, "i2c_eeprom_emu_write: ptr=0x%02x, val=0x%02x\n",
466 emu->ptr, val);
467
468 list_for_each_entry(watch, &emu->watch, node) {
469 if (!watch->ops || !watch->ops->write)
470 continue;
471 if (watch->start <= emu->ptr && watch->end >= emu->ptr)
472 watch->ops->write(watch->data, emu->ptr, val);
473 }
474
475 emu->ptr = (emu->ptr + 1) % emu->size;
476}
477
478struct i2c_slave_client eeprom_client = {
479 .data = &eeprom,
480 .event = i2c_eeprom_emu_event,
481 .read = i2c_eeprom_emu_read,
482 .write = i2c_eeprom_emu_write
483};
484
485/*
486 * PXA I2C Slave mode
487 */
488
489static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr)
490{
491 if (isr & ISR_BED) {
492 /* what should we do here? */
493 } else {
494 int ret = i2c->slave->read(i2c->slave->data);
495
496 IDBR = ret;
497 ICR |= ICR_TB; /* allow next byte */
498 }
499}
500
501static void i2c_pxa_slave_rxfull(struct pxa_i2c *i2c, u32 isr)
502{
503 unsigned int byte = IDBR;
504
505 if (i2c->slave != NULL)
506 i2c->slave->write(i2c->slave->data, byte);
507
508 ICR |= ICR_TB;
509}
510
511static void i2c_pxa_slave_start(struct pxa_i2c *i2c, u32 isr)
512{
513 int timeout;
514
515 if (i2c_debug > 0)
516 dev_dbg(&i2c->adap.dev, "SAD, mode is slave-%cx\n",
517 (isr & ISR_RWM) ? 'r' : 't');
518
519 if (i2c->slave != NULL)
520 i2c->slave->event(i2c->slave->data,
521 (isr & ISR_RWM) ? I2C_SLAVE_EVENT_START_READ : I2C_SLAVE_EVENT_START_WRITE);
522
523 /*
524 * slave could interrupt in the middle of us generating a
525 * start condition... if this happens, we'd better back off
526 * and stop holding the poor thing up
527 */
528 ICR &= ~(ICR_START|ICR_STOP);
529 ICR |= ICR_TB;
530
531 timeout = 0x10000;
532
533 while (1) {
534 if ((IBMR & 2) == 2)
535 break;
536
537 timeout--;
538
539 if (timeout <= 0) {
540 dev_err(&i2c->adap.dev, "timeout waiting for SCL high\n");
541 break;
542 }
543 }
544
545 ICR &= ~ICR_SCLE;
546}
547
548static void i2c_pxa_slave_stop(struct pxa_i2c *i2c)
549{
550 if (i2c_debug > 2)
551 dev_dbg(&i2c->adap.dev, "ISR: SSD (Slave Stop)\n");
552
553 if (i2c->slave != NULL)
554 i2c->slave->event(i2c->slave->data, I2C_SLAVE_EVENT_STOP);
555
556 if (i2c_debug > 2)
557 dev_dbg(&i2c->adap.dev, "ISR: SSD (Slave Stop) acked\n");
558
559 /*
560 * If we have a master-mode message waiting,
561 * kick it off now that the slave has completed.
562 */
563 if (i2c->msg)
564 i2c_pxa_master_complete(i2c, I2C_RETRY);
565}
566#else
567static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr)
568{
569 if (isr & ISR_BED) {
570 /* what should we do here? */
571 } else {
572 IDBR = 0;
573 ICR |= ICR_TB;
574 }
575}
576
577static void i2c_pxa_slave_rxfull(struct pxa_i2c *i2c, u32 isr)
578{
579 ICR |= ICR_TB | ICR_ACKNAK;
580}
581
582static void i2c_pxa_slave_start(struct pxa_i2c *i2c, u32 isr)
583{
584 int timeout;
585
586 /*
587 * slave could interrupt in the middle of us generating a
588 * start condition... if this happens, we'd better back off
589 * and stop holding the poor thing up
590 */
591 ICR &= ~(ICR_START|ICR_STOP);
592 ICR |= ICR_TB | ICR_ACKNAK;
593
594 timeout = 0x10000;
595
596 while (1) {
597 if ((IBMR & 2) == 2)
598 break;
599
600 timeout--;
601
602 if (timeout <= 0) {
603 dev_err(&i2c->adap.dev, "timeout waiting for SCL high\n");
604 break;
605 }
606 }
607
608 ICR &= ~ICR_SCLE;
609}
610
611static void i2c_pxa_slave_stop(struct pxa_i2c *i2c)
612{
613 if (i2c->msg)
614 i2c_pxa_master_complete(i2c, I2C_RETRY);
615}
616#endif
617
618/*
619 * PXA I2C Master mode
620 */
621
622static inline unsigned int i2c_pxa_addr_byte(struct i2c_msg *msg)
623{
624 unsigned int addr = (msg->addr & 0x7f) << 1;
625
626 if (msg->flags & I2C_M_RD)
627 addr |= 1;
628
629 return addr;
630}
631
632static inline void i2c_pxa_start_message(struct pxa_i2c *i2c)
633{
634 u32 icr;
635
636 /*
637 * Step 1: target slave address into IDBR
638 */
639 IDBR = i2c_pxa_addr_byte(i2c->msg);
640
641 /*
642 * Step 2: initiate the write.
643 */
644 icr = ICR & ~(ICR_STOP | ICR_ALDIE);
645 ICR = icr | ICR_START | ICR_TB;
646}
647
648/*
649 * We are protected by the adapter bus semaphore.
650 */
651static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num)
652{
653 long timeout;
654 int ret;
655
656 /*
657 * Wait for the bus to become free.
658 */
659 ret = i2c_pxa_wait_bus_not_busy(i2c);
660 if (ret) {
661 dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n");
662 goto out;
663 }
664
665 /*
666 * Set master mode.
667 */
668 ret = i2c_pxa_set_master(i2c);
669 if (ret) {
670 dev_err(&i2c->adap.dev, "i2c_pxa_set_master: error %d\n", ret);
671 goto out;
672 }
673
674 spin_lock_irq(&i2c->lock);
675
676 i2c->msg = msg;
677 i2c->msg_num = num;
678 i2c->msg_idx = 0;
679 i2c->msg_ptr = 0;
680 i2c->irqlogidx = 0;
681
682 i2c_pxa_start_message(i2c);
683
684 spin_unlock_irq(&i2c->lock);
685
686 /*
687 * The rest of the processing occurs in the interrupt handler.
688 */
689 timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);
690
691 /*
692 * We place the return code in i2c->msg_idx.
693 */
694 ret = i2c->msg_idx;
695
696 if (timeout == 0)
697 i2c_pxa_scream_blue_murder(i2c, "timeout");
698
699 out:
700 return ret;
701}
702
703/*
704 * i2c_pxa_master_complete - complete the message and wake up.
705 */
706static void i2c_pxa_master_complete(struct pxa_i2c *i2c, int ret)
707{
708 i2c->msg_ptr = 0;
709 i2c->msg = NULL;
710 i2c->msg_idx ++;
711 i2c->msg_num = 0;
712 if (ret)
713 i2c->msg_idx = ret;
714 wake_up(&i2c->wait);
715}
716
717static void i2c_pxa_irq_txempty(struct pxa_i2c *i2c, u32 isr)
718{
719 u32 icr = ICR & ~(ICR_START|ICR_STOP|ICR_ACKNAK|ICR_TB);
720
721 again:
722 /*
723 * If ISR_ALD is set, we lost arbitration.
724 */
725 if (isr & ISR_ALD) {
726 /*
727 * Do we need to do anything here? The PXA docs
728 * are vague about what happens.
729 */
730 i2c_pxa_scream_blue_murder(i2c, "ALD set");
731
732 /*
733 * We ignore this error. We seem to see spurious ALDs
734 * for seemingly no reason. If we handle them as I think
735 * they should, we end up causing an I2C error, which
736 * is painful for some systems.
737 */
738 return; /* ignore */
739 }
740
741 if (isr & ISR_BED) {
742 int ret = BUS_ERROR;
743
744 /*
745 * I2C bus error - either the device NAK'd us, or
746 * something more serious happened. If we were NAK'd
747 * on the initial address phase, we can retry.
748 */
749 if (isr & ISR_ACKNAK) {
750 if (i2c->msg_ptr == 0 && i2c->msg_idx == 0)
751 ret = I2C_RETRY;
752 else
753 ret = XFER_NAKED;
754 }
755 i2c_pxa_master_complete(i2c, ret);
756 } else if (isr & ISR_RWM) {
757 /*
758 * Read mode. We have just sent the address byte, and
759 * now we must initiate the transfer.
760 */
761 if (i2c->msg_ptr == i2c->msg->len - 1 &&
762 i2c->msg_idx == i2c->msg_num - 1)
763 icr |= ICR_STOP | ICR_ACKNAK;
764
765 icr |= ICR_ALDIE | ICR_TB;
766 } else if (i2c->msg_ptr < i2c->msg->len) {
767 /*
768 * Write mode. Write the next data byte.
769 */
770 IDBR = i2c->msg->buf[i2c->msg_ptr++];
771
772 icr |= ICR_ALDIE | ICR_TB;
773
774 /*
775 * If this is the last byte of the last message, send
776 * a STOP.
777 */
778 if (i2c->msg_ptr == i2c->msg->len &&
779 i2c->msg_idx == i2c->msg_num - 1)
780 icr |= ICR_STOP;
781 } else if (i2c->msg_idx < i2c->msg_num - 1) {
782 /*
783 * Next segment of the message.
784 */
785 i2c->msg_ptr = 0;
786 i2c->msg_idx ++;
787 i2c->msg++;
788
789 /*
790 * If we aren't doing a repeated start and address,
791 * go back and try to send the next byte. Note that
792 * we do not support switching the R/W direction here.
793 */
794 if (i2c->msg->flags & I2C_M_NOSTART)
795 goto again;
796
797 /*
798 * Write the next address.
799 */
800 IDBR = i2c_pxa_addr_byte(i2c->msg);
801
802 /*
803 * And trigger a repeated start, and send the byte.
804 */
805 icr &= ~ICR_ALDIE;
806 icr |= ICR_START | ICR_TB;
807 } else {
808 if (i2c->msg->len == 0) {
809 /*
810 * Device probes have a message length of zero
811 * and need the bus to be reset before it can
812 * be used again.
813 */
814 i2c_pxa_reset(i2c);
815 }
816 i2c_pxa_master_complete(i2c, 0);
817 }
818
819 i2c->icrlog[i2c->irqlogidx-1] = icr;
820
821 ICR = icr;
822 show_state(i2c);
823}
824
825static void i2c_pxa_irq_rxfull(struct pxa_i2c *i2c, u32 isr)
826{
827 u32 icr = ICR & ~(ICR_START|ICR_STOP|ICR_ACKNAK|ICR_TB);
828
829 /*
830 * Read the byte.
831 */
832 i2c->msg->buf[i2c->msg_ptr++] = IDBR;
833
834 if (i2c->msg_ptr < i2c->msg->len) {
835 /*
836 * If this is the last byte of the last
837 * message, send a STOP.
838 */
839 if (i2c->msg_ptr == i2c->msg->len - 1)
840 icr |= ICR_STOP | ICR_ACKNAK;
841
842 icr |= ICR_ALDIE | ICR_TB;
843 } else {
844 i2c_pxa_master_complete(i2c, 0);
845 }
846
847 i2c->icrlog[i2c->irqlogidx-1] = icr;
848
849 ICR = icr;
850}
851
852static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id, struct pt_regs *regs)
853{
854 struct pxa_i2c *i2c = dev_id;
855 u32 isr = ISR;
856
857 if (i2c_debug > 2 && 0) {
858 dev_dbg(&i2c->adap.dev, "%s: ISR=%08x, ICR=%08x, IBMR=%02x\n",
859 __func__, isr, ICR, IBMR);
860 decode_ISR(isr);
861 }
862
863 if (i2c->irqlogidx < sizeof(i2c->isrlog)/sizeof(u32))
864 i2c->isrlog[i2c->irqlogidx++] = isr;
865
866 show_state(i2c);
867
868 /*
869 * Always clear all pending IRQs.
870 */
871 ISR = isr & (ISR_SSD|ISR_ALD|ISR_ITE|ISR_IRF|ISR_SAD|ISR_BED);
872
873 if (isr & ISR_SAD)
874 i2c_pxa_slave_start(i2c, isr);
875 if (isr & ISR_SSD)
876 i2c_pxa_slave_stop(i2c);
877
878 if (i2c_pxa_is_slavemode(i2c)) {
879 if (isr & ISR_ITE)
880 i2c_pxa_slave_txempty(i2c, isr);
881 if (isr & ISR_IRF)
882 i2c_pxa_slave_rxfull(i2c, isr);
883 } else if (i2c->msg) {
884 if (isr & ISR_ITE)
885 i2c_pxa_irq_txempty(i2c, isr);
886 if (isr & ISR_IRF)
887 i2c_pxa_irq_rxfull(i2c, isr);
888 } else {
889 i2c_pxa_scream_blue_murder(i2c, "spurious irq");
890 }
891
892 return IRQ_HANDLED;
893}
894
895
896static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
897{
898 struct pxa_i2c *i2c = adap->algo_data;
899 int ret, i;
900
901 for (i = adap->retries; i >= 0; i--) {
902 ret = i2c_pxa_do_xfer(i2c, msgs, num);
903 if (ret != I2C_RETRY)
904 goto out;
905
906 if (i2c_debug)
907 dev_dbg(&adap->dev, "Retrying transmission\n");
908 udelay(100);
909 }
910 i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
911 ret = -EREMOTEIO;
912 out:
913 i2c_pxa_set_slave(i2c, ret);
914 return ret;
915}
916
917static struct i2c_algorithm i2c_pxa_algorithm = {
918 .name = "PXA-I2C-Algorithm",
919 .id = I2C_ALGO_PXA,
920 .master_xfer = i2c_pxa_xfer,
921};
922
923static struct pxa_i2c i2c_pxa = {
924 .lock = SPIN_LOCK_UNLOCKED,
925 .wait = __WAIT_QUEUE_HEAD_INITIALIZER(i2c_pxa.wait),
926 .adap = {
927 .name = "pxa2xx-i2c",
928 .id = I2C_ALGO_PXA,
929 .algo = &i2c_pxa_algorithm,
930 .retries = 5,
931 },
932};
933
934static int i2c_pxa_probe(struct device *dev)
935{
936 struct pxa_i2c *i2c = &i2c_pxa;
937 struct i2c_pxa_platform_data *plat = dev->platform_data;
938 int ret;
939
940#ifdef CONFIG_PXA27x
941 pxa_gpio_mode(GPIO117_I2CSCL_MD);
942 pxa_gpio_mode(GPIO118_I2CSDA_MD);
943 udelay(100);
944#endif
945
946 i2c->slave_addr = I2C_PXA_SLAVE_ADDR;
947
948#ifdef CONFIG_I2C_PXA_SLAVE
949 i2c->slave = &eeprom_client;
950 if (plat) {
951 i2c->slave_addr = plat->slave_addr;
952 if (plat->slave)
953 i2c->slave = plat->slave;
954 }
955#endif
956
957 pxa_set_cken(CKEN14_I2C, 1);
958 ret = request_irq(IRQ_I2C, i2c_pxa_handler, SA_INTERRUPT,
959 "pxa2xx-i2c", i2c);
960 if (ret)
961 goto out;
962
963 i2c_pxa_reset(i2c);
964
965 i2c->adap.algo_data = i2c;
966 i2c->adap.dev.parent = dev;
967
968 ret = i2c_add_adapter(&i2c->adap);
969 if (ret < 0) {
970 printk(KERN_INFO "I2C: Failed to add bus\n");
971 goto err_irq;
972 }
973
974 dev_set_drvdata(dev, i2c);
975
976#ifdef CONFIG_I2C_PXA_SLAVE
977 printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n",
978 i2c->adap.dev.bus_id, i2c->slave_addr);
979#else
980 printk(KERN_INFO "I2C: %s: PXA I2C adapter\n",
981 i2c->adap.dev.bus_id);
982#endif
983 return 0;
984
985 err_irq:
986 free_irq(IRQ_I2C, i2c);
987 out:
988 return ret;
989}
990
991static int i2c_pxa_remove(struct device *dev)
992{
993 struct pxa_i2c *i2c = dev_get_drvdata(dev);
994
995 dev_set_drvdata(dev, NULL);
996
997 i2c_del_adapter(&i2c->adap);
998 free_irq(IRQ_I2C, i2c);
999 pxa_set_cken(CKEN14_I2C, 0);
1000
1001 return 0;
1002}
1003
1004static struct device_driver i2c_pxa_driver = {
1005 .name = "pxa2xx-i2c",
1006 .bus = &platform_bus_type,
1007 .probe = i2c_pxa_probe,
1008 .remove = i2c_pxa_remove,
1009};
1010
1011static int __init i2c_adap_pxa_init(void)
1012{
1013 return driver_register(&i2c_pxa_driver);
1014}
1015
1016static void i2c_adap_pxa_exit(void)
1017{
1018 return driver_unregister(&i2c_pxa_driver);
1019}
1020
1021module_init(i2c_adap_pxa_init);
1022module_exit(i2c_adap_pxa_exit);
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c
index 3241d6c9dc11..ffbcd40418d5 100644
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -937,12 +937,12 @@ static int __devinit mthca_init_one(struct pci_dev *pdev,
937 ++mthca_version_printed; 937 ++mthca_version_printed;
938 } 938 }
939 939
940 printk(KERN_INFO PFX "Initializing %s (%s)\n", 940 printk(KERN_INFO PFX "Initializing %s\n",
941 pci_pretty_name(pdev), pci_name(pdev)); 941 pci_name(pdev));
942 942
943 if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) { 943 if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) {
944 printk(KERN_ERR PFX "%s (%s) has invalid driver data %lx\n", 944 printk(KERN_ERR PFX "%s has invalid driver data %lx\n",
945 pci_pretty_name(pdev), pci_name(pdev), id->driver_data); 945 pci_name(pdev), id->driver_data);
946 return -ENODEV; 946 return -ENODEV;
947 } 947 }
948 948
diff --git a/drivers/infiniband/hw/mthca/mthca_reset.c b/drivers/infiniband/hw/mthca/mthca_reset.c
index 8ea801271a41..4f995391dd1d 100644
--- a/drivers/infiniband/hw/mthca/mthca_reset.c
+++ b/drivers/infiniband/hw/mthca/mthca_reset.c
@@ -71,8 +71,8 @@ int mthca_reset(struct mthca_dev *mdev)
71 bridge)) != NULL) { 71 bridge)) != NULL) {
72 if (bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE && 72 if (bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
73 bridge->subordinate == mdev->pdev->bus) { 73 bridge->subordinate == mdev->pdev->bus) {
74 mthca_dbg(mdev, "Found bridge: %s (%s)\n", 74 mthca_dbg(mdev, "Found bridge: %s\n",
75 pci_pretty_name(bridge), pci_name(bridge)); 75 pci_name(bridge));
76 break; 76 break;
77 } 77 }
78 } 78 }
@@ -83,8 +83,8 @@ int mthca_reset(struct mthca_dev *mdev)
83 * assume we're in no-bridge mode and hope for 83 * assume we're in no-bridge mode and hope for
84 * the best. 84 * the best.
85 */ 85 */
86 mthca_warn(mdev, "No bridge found for %s (%s)\n", 86 mthca_warn(mdev, "No bridge found for %s\n",
87 pci_pretty_name(mdev->pdev), pci_name(mdev->pdev)); 87 pci_name(mdev->pdev));
88 } 88 }
89 89
90 } 90 }
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 0a117c61cd18..ceae379a4d4c 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1079,13 +1079,17 @@ static void mmc_setup(struct mmc_host *host)
1079/** 1079/**
1080 * mmc_detect_change - process change of state on a MMC socket 1080 * mmc_detect_change - process change of state on a MMC socket
1081 * @host: host which changed state. 1081 * @host: host which changed state.
1082 * @delay: optional delay to wait before detection (jiffies)
1082 * 1083 *
1083 * All we know is that card(s) have been inserted or removed 1084 * All we know is that card(s) have been inserted or removed
1084 * from the socket(s). We don't know which socket or cards. 1085 * from the socket(s). We don't know which socket or cards.
1085 */ 1086 */
1086void mmc_detect_change(struct mmc_host *host) 1087void mmc_detect_change(struct mmc_host *host, unsigned long delay)
1087{ 1088{
1088 schedule_work(&host->detect); 1089 if (delay)
1090 schedule_delayed_work(&host->detect, delay);
1091 else
1092 schedule_work(&host->detect);
1089} 1093}
1090 1094
1091EXPORT_SYMBOL(mmc_detect_change); 1095EXPORT_SYMBOL(mmc_detect_change);
@@ -1189,7 +1193,7 @@ int mmc_add_host(struct mmc_host *host)
1189 ret = mmc_add_host_sysfs(host); 1193 ret = mmc_add_host_sysfs(host);
1190 if (ret == 0) { 1194 if (ret == 0) {
1191 mmc_power_off(host); 1195 mmc_power_off(host);
1192 mmc_detect_change(host); 1196 mmc_detect_change(host, 0);
1193 } 1197 }
1194 1198
1195 return ret; 1199 return ret;
@@ -1259,7 +1263,7 @@ EXPORT_SYMBOL(mmc_suspend_host);
1259 */ 1263 */
1260int mmc_resume_host(struct mmc_host *host) 1264int mmc_resume_host(struct mmc_host *host)
1261{ 1265{
1262 mmc_detect_change(host); 1266 mmc_detect_change(host, 0);
1263 1267
1264 return 0; 1268 return 0;
1265} 1269}
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c
index 716c4ef4faf6..91c74843dc0d 100644
--- a/drivers/mmc/mmci.c
+++ b/drivers/mmc/mmci.c
@@ -442,7 +442,7 @@ static void mmci_check_status(unsigned long data)
442 442
443 status = host->plat->status(mmc_dev(host->mmc)); 443 status = host->plat->status(mmc_dev(host->mmc));
444 if (status ^ host->oldstat) 444 if (status ^ host->oldstat)
445 mmc_detect_change(host->mmc); 445 mmc_detect_change(host->mmc, 0);
446 446
447 host->oldstat = status; 447 host->oldstat = status;
448 mod_timer(&host->timer, jiffies + HZ); 448 mod_timer(&host->timer, jiffies + HZ);
diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c
index e99a53b09e32..b53af57074e3 100644
--- a/drivers/mmc/pxamci.c
+++ b/drivers/mmc/pxamci.c
@@ -423,7 +423,9 @@ static void pxamci_dma_irq(int dma, void *devid, struct pt_regs *regs)
423 423
424static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs) 424static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs)
425{ 425{
426 mmc_detect_change(devid); 426 struct pxamci_host *host = mmc_priv(devid);
427
428 mmc_detect_change(devid, host->pdata->detect_delay);
427 return IRQ_HANDLED; 429 return IRQ_HANDLED;
428} 430}
429 431
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c
index dec01d38c782..a62c86fef5cc 100644
--- a/drivers/mmc/wbsd.c
+++ b/drivers/mmc/wbsd.c
@@ -1122,7 +1122,7 @@ static void wbsd_detect_card(unsigned long data)
1122 1122
1123 DBG("Executing card detection\n"); 1123 DBG("Executing card detection\n");
1124 1124
1125 mmc_detect_change(host->mmc); 1125 mmc_detect_change(host->mmc, 0);
1126} 1126}
1127 1127
1128/* 1128/*
@@ -1198,7 +1198,7 @@ static void wbsd_tasklet_card(unsigned long param)
1198 */ 1198 */
1199 spin_unlock(&host->lock); 1199 spin_unlock(&host->lock);
1200 1200
1201 mmc_detect_change(host->mmc); 1201 mmc_detect_change(host->mmc, 0);
1202 } 1202 }
1203 else 1203 else
1204 spin_unlock(&host->lock); 1204 spin_unlock(&host->lock);
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 55a72c7ad001..83598e32179c 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -14,8 +14,8 @@
14 14
15#define DRV_MODULE_NAME "bnx2" 15#define DRV_MODULE_NAME "bnx2"
16#define PFX DRV_MODULE_NAME ": " 16#define PFX DRV_MODULE_NAME ": "
17#define DRV_MODULE_VERSION "1.2.20" 17#define DRV_MODULE_VERSION "1.2.21"
18#define DRV_MODULE_RELDATE "August 22, 2005" 18#define DRV_MODULE_RELDATE "September 7, 2005"
19 19
20#define RUN_AT(x) (jiffies + (x)) 20#define RUN_AT(x) (jiffies + (x))
21 21
@@ -1533,6 +1533,7 @@ bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs)
1533 struct net_device *dev = dev_instance; 1533 struct net_device *dev = dev_instance;
1534 struct bnx2 *bp = dev->priv; 1534 struct bnx2 *bp = dev->priv;
1535 1535
1536 prefetch(bp->status_blk);
1536 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, 1537 REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
1537 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | 1538 BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM |
1538 BNX2_PCICFG_INT_ACK_CMD_MASK_INT); 1539 BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
@@ -1558,7 +1559,7 @@ bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
1558 * When using MSI, the MSI message will always complete after 1559 * When using MSI, the MSI message will always complete after
1559 * the status block write. 1560 * the status block write.
1560 */ 1561 */
1561 if ((bp->status_blk->status_idx == bp->last_status_idx) || 1562 if ((bp->status_blk->status_idx == bp->last_status_idx) &&
1562 (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & 1563 (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
1563 BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) 1564 BNX2_PCICFG_MISC_STATUS_INTA_VALUE))
1564 return IRQ_NONE; 1565 return IRQ_NONE;
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h
index 9ad3f5740cd8..62857b6a6ee4 100644
--- a/drivers/net/bnx2.h
+++ b/drivers/net/bnx2.h
@@ -50,6 +50,7 @@
50#endif 50#endif
51#include <linux/workqueue.h> 51#include <linux/workqueue.h>
52#include <linux/crc32.h> 52#include <linux/crc32.h>
53#include <linux/prefetch.h>
53 54
54/* Hardware data structures and register definitions automatically 55/* Hardware data structures and register definitions automatically
55 * generated from RTL code. Do not modify. 56 * generated from RTL code. Do not modify.
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
index 46e0022d3258..6c766fdc51a6 100644
--- a/drivers/net/irda/irda-usb.c
+++ b/drivers/net/irda/irda-usb.c
@@ -267,7 +267,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self)
267 frame, IRDA_USB_SPEED_MTU, 267 frame, IRDA_USB_SPEED_MTU,
268 speed_bulk_callback, self); 268 speed_bulk_callback, self);
269 urb->transfer_buffer_length = USB_IRDA_HEADER; 269 urb->transfer_buffer_length = USB_IRDA_HEADER;
270 urb->transfer_flags = URB_ASYNC_UNLINK; 270 urb->transfer_flags = 0;
271 271
272 /* Irq disabled -> GFP_ATOMIC */ 272 /* Irq disabled -> GFP_ATOMIC */
273 if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { 273 if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) {
@@ -401,15 +401,12 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev)
401 skb->data, IRDA_SKB_MAX_MTU, 401 skb->data, IRDA_SKB_MAX_MTU,
402 write_bulk_callback, skb); 402 write_bulk_callback, skb);
403 urb->transfer_buffer_length = skb->len; 403 urb->transfer_buffer_length = skb->len;
404 /* Note : unlink *must* be Asynchronous because of the code in
405 * irda_usb_net_timeout() -> call in irq - Jean II */
406 urb->transfer_flags = URB_ASYNC_UNLINK;
407 /* This flag (URB_ZERO_PACKET) indicates that what we send is not 404 /* This flag (URB_ZERO_PACKET) indicates that what we send is not
408 * a continuous stream of data but separate packets. 405 * a continuous stream of data but separate packets.
409 * In this case, the USB layer will insert an empty USB frame (TD) 406 * In this case, the USB layer will insert an empty USB frame (TD)
410 * after each of our packets that is exact multiple of the frame size. 407 * after each of our packets that is exact multiple of the frame size.
411 * This is how the dongle will detect the end of packet - Jean II */ 408 * This is how the dongle will detect the end of packet - Jean II */
412 urb->transfer_flags |= URB_ZERO_PACKET; 409 urb->transfer_flags = URB_ZERO_PACKET;
413 410
414 /* Generate min turn time. FIXME: can we do better than this? */ 411 /* Generate min turn time. FIXME: can we do better than this? */
415 /* Trying to a turnaround time at this level is trying to measure 412 /* Trying to a turnaround time at this level is trying to measure
@@ -630,8 +627,6 @@ static void irda_usb_net_timeout(struct net_device *netdev)
630 * in completion handler, because urb->status will 627 * in completion handler, because urb->status will
631 * be -ENOENT. We will fix that at the next watchdog, 628 * be -ENOENT. We will fix that at the next watchdog,
632 * leaving more time to USB to recover... 629 * leaving more time to USB to recover...
633 * Also, we are in interrupt, so we need to have
634 * URB_ASYNC_UNLINK to work properly...
635 * Jean II */ 630 * Jean II */
636 done = 1; 631 done = 1;
637 break; 632 break;
@@ -1008,9 +1003,7 @@ static int irda_usb_net_close(struct net_device *netdev)
1008 } 1003 }
1009 } 1004 }
1010 /* Cancel Tx and speed URB - need to be synchronous to avoid races */ 1005 /* Cancel Tx and speed URB - need to be synchronous to avoid races */
1011 self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1012 usb_kill_urb(self->tx_urb); 1006 usb_kill_urb(self->tx_urb);
1013 self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1014 usb_kill_urb(self->speed_urb); 1007 usb_kill_urb(self->speed_urb);
1015 1008
1016 /* Stop and remove instance of IrLAP */ 1009 /* Stop and remove instance of IrLAP */
@@ -1521,9 +1514,7 @@ static void irda_usb_disconnect(struct usb_interface *intf)
1521 usb_kill_urb(self->rx_urb[i]); 1514 usb_kill_urb(self->rx_urb[i]);
1522 /* Cancel Tx and speed URB. 1515 /* Cancel Tx and speed URB.
1523 * Toggle flags to make sure it's synchronous. */ 1516 * Toggle flags to make sure it's synchronous. */
1524 self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1525 usb_kill_urb(self->tx_urb); 1517 usb_kill_urb(self->tx_urb);
1526 self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1527 usb_kill_urb(self->speed_urb); 1518 usb_kill_urb(self->speed_urb);
1528 } 1519 }
1529 1520
diff --git a/drivers/net/irda/vlsi_ir.h b/drivers/net/irda/vlsi_ir.h
index 414694abf588..741aecc655df 100644
--- a/drivers/net/irda/vlsi_ir.h
+++ b/drivers/net/irda/vlsi_ir.h
@@ -69,14 +69,8 @@ typedef void irqreturn_t;
69 69
70#else /* 2.5 or later */ 70#else /* 2.5 or later */
71 71
72/* recent 2.5/2.6 stores pci device names at varying places ;-) */
73#ifdef CONFIG_PCI_NAMES
74/* human readable name */
75#define PCIDEV_NAME(pdev) ((pdev)->pretty_name)
76#else
77/* whatever we get from the associated struct device - bus:slot:dev.fn id */ 72/* whatever we get from the associated struct device - bus:slot:dev.fn id */
78#define PCIDEV_NAME(pdev) (pci_name(pdev)) 73#define PCIDEV_NAME(pdev) (pci_name(pdev))
79#endif
80 74
81#endif 75#endif
82 76
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c
index 97f723179f62..1b938bb9be3c 100644
--- a/drivers/parport/parport_pc.c
+++ b/drivers/parport/parport_pc.c
@@ -3010,7 +3010,7 @@ static int __init parport_pc_init_superio (int autoirq, int autodma)
3010 struct pci_dev *pdev = NULL; 3010 struct pci_dev *pdev = NULL;
3011 int ret = 0; 3011 int ret = 0;
3012 3012
3013 while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) { 3013 for_each_pci_dev(pdev) {
3014 id = pci_match_id(parport_pc_pci_tbl, pdev); 3014 id = pci_match_id(parport_pc_pci_tbl, pdev);
3015 if (id == NULL || id->driver_data >= last_sio) 3015 if (id == NULL || id->driver_data >= last_sio)
3016 continue; 3016 continue;
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index 7f31991772ea..f187fd8aeed6 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -30,23 +30,6 @@ config PCI_LEGACY_PROC
30 30
31 When in doubt, say N. 31 When in doubt, say N.
32 32
33config PCI_NAMES
34 bool "PCI device name database"
35 depends on PCI
36 ---help---
37 By default, the kernel contains a database of all known PCI device
38 names to make the information in /proc/pci, /proc/ioports and
39 similar files comprehensible to the user.
40
41 This database increases size of the kernel image by about 80KB. This
42 memory is freed after the system boots up if CONFIG_HOTPLUG is not set.
43
44 Anyway, if you are building an installation floppy or kernel for an
45 embedded system where kernel image size really matters, you can disable
46 this feature and you'll get device ID numbers instead of names.
47
48 When in doubt, say Y.
49
50config PCI_DEBUG 33config PCI_DEBUG
51 bool "PCI Debugging" 34 bool "PCI Debugging"
52 depends on PCI && DEBUG_KERNEL 35 depends on PCI && DEBUG_KERNEL
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile
index 3657f6199c48..716df015f8d0 100644
--- a/drivers/pci/Makefile
+++ b/drivers/pci/Makefile
@@ -3,14 +3,9 @@
3# 3#
4 4
5obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \ 5obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \
6 names.o pci-driver.o search.o pci-sysfs.o \ 6 pci-driver.o search.o pci-sysfs.o rom.o setup-res.o
7 rom.o
8obj-$(CONFIG_PROC_FS) += proc.o 7obj-$(CONFIG_PROC_FS) += proc.o
9 8
10ifndef CONFIG_SPARC64
11obj-y += setup-res.o
12endif
13
14obj-$(CONFIG_HOTPLUG) += hotplug.o 9obj-$(CONFIG_HOTPLUG) += hotplug.o
15 10
16# Build the PCI Hotplug drivers if we were asked to 11# Build the PCI Hotplug drivers if we were asked to
@@ -46,21 +41,6 @@ ifeq ($(CONFIG_PCI_DEBUG),y)
46EXTRA_CFLAGS += -DDEBUG 41EXTRA_CFLAGS += -DDEBUG
47endif 42endif
48 43
49hostprogs-y := gen-devlist
50
51# Dependencies on generated files need to be listed explicitly
52$(obj)/names.o: $(obj)/devlist.h $(obj)/classlist.h
53$(obj)/classlist.h: $(obj)/devlist.h
54
55# And that's how to generate them
56quiet_cmd_devlist = DEVLIST $@
57 cmd_devlist = ( cd $(obj); ./gen-devlist ) < $<
58$(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
59 $(call cmd,devlist)
60
61# Files generated that shall be removed upon make clean
62clean-files := devlist.h classlist.h
63
64# Build PCI Express stuff if needed 44# Build PCI Express stuff if needed
65obj-$(CONFIG_PCIEPORTBUS) += pcie/ 45obj-$(CONFIG_PCIEPORTBUS) += pcie/
66 46
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index fb9a11243d2a..eed67d9e73bc 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -140,16 +140,65 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus)
140void pci_enable_bridges(struct pci_bus *bus) 140void pci_enable_bridges(struct pci_bus *bus)
141{ 141{
142 struct pci_dev *dev; 142 struct pci_dev *dev;
143 int retval;
143 144
144 list_for_each_entry(dev, &bus->devices, bus_list) { 145 list_for_each_entry(dev, &bus->devices, bus_list) {
145 if (dev->subordinate) { 146 if (dev->subordinate) {
146 pci_enable_device(dev); 147 retval = pci_enable_device(dev);
147 pci_set_master(dev); 148 pci_set_master(dev);
148 pci_enable_bridges(dev->subordinate); 149 pci_enable_bridges(dev->subordinate);
149 } 150 }
150 } 151 }
151} 152}
152 153
154/** pci_walk_bus - walk devices on/under bus, calling callback.
155 * @top bus whose devices should be walked
156 * @cb callback to be called for each device found
157 * @userdata arbitrary pointer to be passed to callback.
158 *
159 * Walk the given bus, including any bridged devices
160 * on buses under this bus. Call the provided callback
161 * on each device found.
162 */
163void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *),
164 void *userdata)
165{
166 struct pci_dev *dev;
167 struct pci_bus *bus;
168 struct list_head *next;
169
170 bus = top;
171 spin_lock(&pci_bus_lock);
172 next = top->devices.next;
173 for (;;) {
174 if (next == &bus->devices) {
175 /* end of this bus, go up or finish */
176 if (bus == top)
177 break;
178 next = bus->self->bus_list.next;
179 bus = bus->self->bus;
180 continue;
181 }
182 dev = list_entry(next, struct pci_dev, bus_list);
183 pci_dev_get(dev);
184 if (dev->subordinate) {
185 /* this is a pci-pci bridge, do its devices next */
186 next = dev->subordinate->devices.next;
187 bus = dev->subordinate;
188 } else
189 next = dev->bus_list.next;
190 spin_unlock(&pci_bus_lock);
191
192 /* Run device routines with the bus unlocked */
193 cb(dev, userdata);
194
195 spin_lock(&pci_bus_lock);
196 pci_dev_put(dev);
197 }
198 spin_unlock(&pci_bus_lock);
199}
200EXPORT_SYMBOL_GPL(pci_walk_bus);
201
153EXPORT_SYMBOL(pci_bus_alloc_resource); 202EXPORT_SYMBOL(pci_bus_alloc_resource);
154EXPORT_SYMBOL_GPL(pci_bus_add_device); 203EXPORT_SYMBOL_GPL(pci_bus_add_device);
155EXPORT_SYMBOL(pci_bus_add_devices); 204EXPORT_SYMBOL(pci_bus_add_devices);
diff --git a/drivers/pci/gen-devlist.c b/drivers/pci/gen-devlist.c
deleted file mode 100644
index 8abfc499fdef..000000000000
--- a/drivers/pci/gen-devlist.c
+++ /dev/null
@@ -1,132 +0,0 @@
1/*
2 * Generate devlist.h and classlist.h from the PCI ID file.
3 *
4 * (c) 1999--2002 Martin Mares <mj@ucw.cz>
5 */
6
7#include <stdio.h>
8#include <string.h>
9
10#define MAX_NAME_SIZE 200
11
12static void
13pq(FILE *f, const char *c, int len)
14{
15 int i = 1;
16 while (*c && i != len) {
17 if (*c == '"')
18 fprintf(f, "\\\"");
19 else {
20 fputc(*c, f);
21 if (*c == '?' && c[1] == '?') {
22 /* Avoid trigraphs */
23 fprintf(f, "\" \"");
24 }
25 }
26 c++;
27 i++;
28 }
29}
30
31int
32main(void)
33{
34 char line[1024], *c, *bra, vend[8];
35 int vendors = 0;
36 int mode = 0;
37 int lino = 0;
38 int vendor_len = 0;
39 FILE *devf, *clsf;
40
41 devf = fopen("devlist.h", "w");
42 clsf = fopen("classlist.h", "w");
43 if (!devf || !clsf) {
44 fprintf(stderr, "Cannot create output file!\n");
45 return 1;
46 }
47
48 while (fgets(line, sizeof(line)-1, stdin)) {
49 lino++;
50 if ((c = strchr(line, '\n')))
51 *c = 0;
52 if (!line[0] || line[0] == '#')
53 continue;
54 if (line[1] == ' ') {
55 if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') {
56 vend[0] = line[2];
57 vend[1] = line[3];
58 vend[2] = 0;
59 mode = 2;
60 } else goto err;
61 }
62 else if (line[0] == '\t') {
63 if (line[1] == '\t')
64 continue;
65 switch (mode) {
66 case 1:
67 if (strlen(line) > 5 && line[5] == ' ') {
68 c = line + 5;
69 while (*c == ' ')
70 *c++ = 0;
71 if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
72 /* Too long, try cutting off long description */
73 bra = strchr(c, '[');
74 if (bra && bra > c && bra[-1] == ' ')
75 bra[-1] = 0;
76 if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
77 fprintf(stderr, "Line %d: Device name too long. Name truncated.\n", lino);
78 fprintf(stderr, "%s\n", c);
79 /*return 1;*/
80 }
81 }
82 fprintf(devf, "\tDEVICE(%s,%s,\"", vend, line+1);
83 pq(devf, c, MAX_NAME_SIZE - vendor_len - 1);
84 fputs("\")\n", devf);
85 } else goto err;
86 break;
87 case 2:
88 if (strlen(line) > 3 && line[3] == ' ') {
89 c = line + 3;
90 while (*c == ' ')
91 *c++ = 0;
92 fprintf(clsf, "CLASS(%s%s, \"%s\")\n", vend, line+1, c);
93 } else goto err;
94 break;
95 default:
96 goto err;
97 }
98 } else if (strlen(line) > 4 && line[4] == ' ') {
99 c = line + 4;
100 while (*c == ' ')
101 *c++ = 0;
102 if (vendors)
103 fputs("ENDVENDOR()\n\n", devf);
104 vendors++;
105 strcpy(vend, line);
106 vendor_len = strlen(c);
107 if (vendor_len + 24 > MAX_NAME_SIZE) {
108 fprintf(stderr, "Line %d: Vendor name too long\n", lino);
109 return 1;
110 }
111 fprintf(devf, "VENDOR(%s,\"", vend);
112 pq(devf, c, 0);
113 fputs("\")\n", devf);
114 mode = 1;
115 } else {
116 err:
117 fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
118 return 1;
119 }
120 }
121 fputs("ENDVENDOR()\n\
122\n\
123#undef VENDOR\n\
124#undef DEVICE\n\
125#undef ENDVENDOR\n", devf);
126 fputs("\n#undef CLASS\n", clsf);
127
128 fclose(devf);
129 fclose(clsf);
130
131 return 0;
132}
diff --git a/drivers/pci/hotplug/Makefile b/drivers/pci/hotplug/Makefile
index 246586a3d91a..3c71e3077ff1 100644
--- a/drivers/pci/hotplug/Makefile
+++ b/drivers/pci/hotplug/Makefile
@@ -41,8 +41,7 @@ acpiphp-objs := acpiphp_core.o \
41 41
42rpaphp-objs := rpaphp_core.o \ 42rpaphp-objs := rpaphp_core.o \
43 rpaphp_pci.o \ 43 rpaphp_pci.o \
44 rpaphp_slot.o \ 44 rpaphp_slot.o
45 rpaphp_vio.o
46 45
47rpadlpar_io-objs := rpadlpar_core.o \ 46rpadlpar_io-objs := rpadlpar_core.o \
48 rpadlpar_sysfs.o 47 rpadlpar_sysfs.o
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
index 2b92b9e8c910..061ead21ef14 100644
--- a/drivers/pci/hotplug/pciehp.h
+++ b/drivers/pci/hotplug/pciehp.h
@@ -302,7 +302,7 @@ static inline void return_resource(struct pci_resource **head, struct pci_resour
302 302
303static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) 303static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot)
304{ 304{
305 snprintf(buffer, buffer_size, "%d", slot->number); 305 snprintf(buffer, buffer_size, "%04d_%04d", slot->bus, slot->number);
306} 306}
307 307
308enum php_ctlr_type { 308enum php_ctlr_type {
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c
index 86b384e42717..ad1017da8656 100644
--- a/drivers/pci/hotplug/rpadlpar_core.c
+++ b/drivers/pci/hotplug/rpadlpar_core.c
@@ -19,33 +19,36 @@
19#include <asm/pci-bridge.h> 19#include <asm/pci-bridge.h>
20#include <asm/semaphore.h> 20#include <asm/semaphore.h>
21#include <asm/rtas.h> 21#include <asm/rtas.h>
22#include <asm/vio.h>
22#include "../pci.h" 23#include "../pci.h"
23#include "rpaphp.h" 24#include "rpaphp.h"
24#include "rpadlpar.h" 25#include "rpadlpar.h"
25 26
26static DECLARE_MUTEX(rpadlpar_sem); 27static DECLARE_MUTEX(rpadlpar_sem);
27 28
29#define DLPAR_MODULE_NAME "rpadlpar_io"
30
28#define NODE_TYPE_VIO 1 31#define NODE_TYPE_VIO 1
29#define NODE_TYPE_SLOT 2 32#define NODE_TYPE_SLOT 2
30#define NODE_TYPE_PHB 3 33#define NODE_TYPE_PHB 3
31 34
32static struct device_node *find_php_slot_vio_node(char *drc_name) 35static struct device_node *find_vio_slot_node(char *drc_name)
33{ 36{
34 struct device_node *child;
35 struct device_node *parent = of_find_node_by_name(NULL, "vdevice"); 37 struct device_node *parent = of_find_node_by_name(NULL, "vdevice");
36 char *loc_code; 38 struct device_node *dn = NULL;
39 char *name;
40 int rc;
37 41
38 if (!parent) 42 if (!parent)
39 return NULL; 43 return NULL;
40 44
41 for (child = of_get_next_child(parent, NULL); 45 while ((dn = of_get_next_child(parent, dn))) {
42 child; child = of_get_next_child(parent, child)) { 46 rc = rpaphp_get_drc_props(dn, NULL, &name, NULL, NULL);
43 loc_code = get_property(child, "ibm,loc-code", NULL); 47 if ((rc == 0) && (!strcmp(drc_name, name)))
44 if (loc_code && !strncmp(loc_code, drc_name, strlen(drc_name))) 48 break;
45 return child;
46 } 49 }
47 50
48 return NULL; 51 return dn;
49} 52}
50 53
51/* Find dlpar-capable pci node that contains the specified name and type */ 54/* Find dlpar-capable pci node that contains the specified name and type */
@@ -67,7 +70,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name,
67 return np; 70 return np;
68} 71}
69 72
70static struct device_node *find_newly_added_node(char *drc_name, int *node_type) 73static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
71{ 74{
72 struct device_node *dn; 75 struct device_node *dn;
73 76
@@ -83,7 +86,7 @@ static struct device_node *find_newly_added_node(char *drc_name, int *node_type)
83 return dn; 86 return dn;
84 } 87 }
85 88
86 dn = find_php_slot_vio_node(drc_name); 89 dn = find_vio_slot_node(drc_name);
87 if (dn) { 90 if (dn) {
88 *node_type = NODE_TYPE_VIO; 91 *node_type = NODE_TYPE_VIO;
89 return dn; 92 return dn;
@@ -92,14 +95,14 @@ static struct device_node *find_newly_added_node(char *drc_name, int *node_type)
92 return NULL; 95 return NULL;
93} 96}
94 97
95static struct slot *find_slot(char *drc_name) 98static struct slot *find_slot(struct device_node *dn)
96{ 99{
97 struct list_head *tmp, *n; 100 struct list_head *tmp, *n;
98 struct slot *slot; 101 struct slot *slot;
99 102
100 list_for_each_safe(tmp, n, &rpaphp_slot_head) { 103 list_for_each_safe(tmp, n, &rpaphp_slot_head) {
101 slot = list_entry(tmp, struct slot, rpaphp_slot_list); 104 slot = list_entry(tmp, struct slot, rpaphp_slot_list);
102 if (strcmp(slot->location, drc_name) == 0) 105 if (slot->dn == dn)
103 return slot; 106 return slot;
104 } 107 }
105 108
@@ -131,7 +134,8 @@ static void rpadlpar_claim_one_bus(struct pci_bus *b)
131static int pci_add_secondary_bus(struct device_node *dn, 134static int pci_add_secondary_bus(struct device_node *dn,
132 struct pci_dev *bridge_dev) 135 struct pci_dev *bridge_dev)
133{ 136{
134 struct pci_controller *hose = dn->phb; 137 struct pci_dn *pdn = dn->data;
138 struct pci_controller *hose = pdn->phb;
135 struct pci_bus *child; 139 struct pci_bus *child;
136 u8 sec_busno; 140 u8 sec_busno;
137 141
@@ -156,7 +160,7 @@ static int pci_add_secondary_bus(struct device_node *dn,
156 if (hose->last_busno < child->number) 160 if (hose->last_busno < child->number)
157 hose->last_busno = child->number; 161 hose->last_busno = child->number;
158 162
159 dn->bussubno = child->number; 163 pdn->bussubno = child->number;
160 164
161 /* ioremap() for child bus, which may or may not succeed */ 165 /* ioremap() for child bus, which may or may not succeed */
162 remap_bus_range(child); 166 remap_bus_range(child);
@@ -164,13 +168,28 @@ static int pci_add_secondary_bus(struct device_node *dn,
164 return 0; 168 return 0;
165} 169}
166 170
171static struct pci_dev *dlpar_find_new_dev(struct pci_bus *parent,
172 struct device_node *dev_dn)
173{
174 struct pci_dev *tmp = NULL;
175 struct device_node *child_dn;
176
177 list_for_each_entry(tmp, &parent->devices, bus_list) {
178 child_dn = pci_device_to_OF_node(tmp);
179 if (child_dn == dev_dn)
180 return tmp;
181 }
182 return NULL;
183}
184
167static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn) 185static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
168{ 186{
169 struct pci_controller *hose = dn->phb; 187 struct pci_dn *pdn = dn->data;
188 struct pci_controller *hose = pdn->phb;
170 struct pci_dev *dev = NULL; 189 struct pci_dev *dev = NULL;
171 190
172 /* Scan phb bus for EADS device, adding new one to bus->devices */ 191 /* Scan phb bus for EADS device, adding new one to bus->devices */
173 if (!pci_scan_single_device(hose->bus, dn->devfn)) { 192 if (!pci_scan_single_device(hose->bus, pdn->devfn)) {
174 printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__); 193 printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__);
175 return NULL; 194 return NULL;
176 } 195 }
@@ -179,49 +198,28 @@ static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn)
179 pci_bus_add_devices(hose->bus); 198 pci_bus_add_devices(hose->bus);
180 199
181 /* Confirm new bridge dev was created */ 200 /* Confirm new bridge dev was created */
182 dev = rpaphp_find_pci_dev(dn); 201 dev = dlpar_find_new_dev(hose->bus, dn);
183 if (!dev) { 202 if (dev) {
184 printk(KERN_ERR "%s: failed to add pci device\n", __FUNCTION__); 203 if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
185 return NULL; 204 printk(KERN_ERR "%s: unexpected header type %d\n",
186 } 205 __FUNCTION__, dev->hdr_type);
206 return NULL;
207 }
187 208
188 if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) { 209 if (pci_add_secondary_bus(dn, dev))
189 printk(KERN_ERR "%s: unexpected header type %d\n", 210 return NULL;
190 __FUNCTION__, dev->hdr_type);
191 return NULL;
192 } 211 }
193 212
194 if (pci_add_secondary_bus(dn, dev))
195 return NULL;
196
197 return dev; 213 return dev;
198} 214}
199 215
200static int dlpar_pci_remove_bus(struct pci_dev *bridge_dev) 216static int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
201{ 217{
202 struct pci_bus *secondary_bus; 218 struct pci_dev *dev;
219 int rc;
203 220
204 if (!bridge_dev) { 221 if (rpaphp_find_pci_bus(dn))
205 printk(KERN_ERR "%s: unexpected null device\n",
206 __FUNCTION__);
207 return -EINVAL; 222 return -EINVAL;
208 }
209
210 secondary_bus = bridge_dev->subordinate;
211
212 if (unmap_bus_range(secondary_bus)) {
213 printk(KERN_ERR "%s: failed to unmap bus range\n",
214 __FUNCTION__);
215 return -ERANGE;
216 }
217
218 pci_remove_bus_device(bridge_dev);
219 return 0;
220}
221
222static inline int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
223{
224 struct pci_dev *dev;
225 223
226 /* Add pci bus */ 224 /* Add pci bus */
227 dev = dlpar_pci_add_bus(dn); 225 dev = dlpar_pci_add_bus(dn);
@@ -231,6 +229,21 @@ static inline int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
231 return -EIO; 229 return -EIO;
232 } 230 }
233 231
232 if (dn->child) {
233 rc = rpaphp_config_pci_adapter(dev->subordinate);
234 if (rc < 0) {
235 printk(KERN_ERR "%s: unable to enable slot %s\n",
236 __FUNCTION__, drc_name);
237 return -EIO;
238 }
239 }
240
241 /* Add hotplug slot */
242 if (rpaphp_add_slot(dn)) {
243 printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
244 __FUNCTION__, drc_name);
245 return -EIO;
246 }
234 return 0; 247 return 0;
235} 248}
236 249
@@ -255,47 +268,69 @@ static int dlpar_remove_root_bus(struct pci_controller *phb)
255 return 0; 268 return 0;
256} 269}
257 270
258static int dlpar_remove_phb(struct slot *slot) 271static int dlpar_remove_phb(char *drc_name, struct device_node *dn)
259{ 272{
260 struct pci_controller *phb; 273 struct slot *slot;
261 struct device_node *dn; 274 struct pci_dn *pdn;
262 int rc = 0; 275 int rc = 0;
263 276
264 dn = slot->dn; 277 if (!rpaphp_find_pci_bus(dn))
265 if (!dn) { 278 return -EINVAL;
266 printk(KERN_ERR "%s: unexpected NULL slot device node\n",
267 __FUNCTION__);
268 return -EIO;
269 }
270
271 phb = dn->phb;
272 if (!phb) {
273 printk(KERN_ERR "%s: unexpected NULL phb pointer\n",
274 __FUNCTION__);
275 return -EIO;
276 }
277 279
278 if (rpaphp_remove_slot(slot)) { 280 slot = find_slot(dn);
279 printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", 281 if (slot) {
280 __FUNCTION__, slot->location); 282 /* Remove hotplug slot */
281 return -EIO; 283 if (rpaphp_remove_slot(slot)) {
284 printk(KERN_ERR
285 "%s: unable to remove hotplug slot %s\n",
286 __FUNCTION__, drc_name);
287 return -EIO;
288 }
282 } 289 }
283 290
284 rc = dlpar_remove_root_bus(phb); 291 pdn = dn->data;
292 BUG_ON(!pdn || !pdn->phb);
293 rc = dlpar_remove_root_bus(pdn->phb);
285 if (rc < 0) 294 if (rc < 0)
286 return rc; 295 return rc;
287 296
297 pdn->phb = NULL;
298
288 return 0; 299 return 0;
289} 300}
290 301
291static int dlpar_add_phb(struct device_node *dn) 302static int dlpar_add_phb(char *drc_name, struct device_node *dn)
292{ 303{
293 struct pci_controller *phb; 304 struct pci_controller *phb;
294 305
306 if (PCI_DN(dn)->phb) {
307 /* PHB already exists */
308 return -EINVAL;
309 }
310
295 phb = init_phb_dynamic(dn); 311 phb = init_phb_dynamic(dn);
296 if (!phb) 312 if (!phb)
313 return -EIO;
314
315 if (rpaphp_add_slot(dn)) {
316 printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
317 __FUNCTION__, drc_name);
318 return -EIO;
319 }
320 return 0;
321}
322
323static int dlpar_add_vio_slot(char *drc_name, struct device_node *dn)
324{
325 if (vio_find_node(dn))
297 return -EINVAL; 326 return -EINVAL;
298 327
328 if (!vio_register_device_node(dn)) {
329 printk(KERN_ERR
330 "%s: failed to register vio node %s\n",
331 __FUNCTION__, drc_name);
332 return -EIO;
333 }
299 return 0; 334 return 0;
300} 335}
301 336
@@ -316,18 +351,13 @@ int dlpar_add_slot(char *drc_name)
316{ 351{
317 struct device_node *dn = NULL; 352 struct device_node *dn = NULL;
318 int node_type; 353 int node_type;
319 int rc = 0; 354 int rc = -EIO;
320 355
321 if (down_interruptible(&rpadlpar_sem)) 356 if (down_interruptible(&rpadlpar_sem))
322 return -ERESTARTSYS; 357 return -ERESTARTSYS;
323 358
324 /* Check for existing hotplug slot */ 359 /* Find newly added node */
325 if (find_slot(drc_name)) { 360 dn = find_dlpar_node(drc_name, &node_type);
326 rc = -EINVAL;
327 goto exit;
328 }
329
330 dn = find_newly_added_node(drc_name, &node_type);
331 if (!dn) { 361 if (!dn) {
332 rc = -ENODEV; 362 rc = -ENODEV;
333 goto exit; 363 goto exit;
@@ -335,24 +365,17 @@ int dlpar_add_slot(char *drc_name)
335 365
336 switch (node_type) { 366 switch (node_type) {
337 case NODE_TYPE_VIO: 367 case NODE_TYPE_VIO:
338 /* Just add hotplug slot */ 368 rc = dlpar_add_vio_slot(drc_name, dn);
339 break; 369 break;
340 case NODE_TYPE_SLOT: 370 case NODE_TYPE_SLOT:
341 rc = dlpar_add_pci_slot(drc_name, dn); 371 rc = dlpar_add_pci_slot(drc_name, dn);
342 break; 372 break;
343 case NODE_TYPE_PHB: 373 case NODE_TYPE_PHB:
344 rc = dlpar_add_phb(dn); 374 rc = dlpar_add_phb(drc_name, dn);
345 break; 375 break;
346 default:
347 printk("%s: unexpected node type\n", __FUNCTION__);
348 return -EIO;
349 } 376 }
350 377
351 if (!rc && rpaphp_add_slot(dn)) { 378 printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name);
352 printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
353 __FUNCTION__, drc_name);
354 rc = -EIO;
355 }
356exit: 379exit:
357 up(&rpadlpar_sem); 380 up(&rpadlpar_sem);
358 return rc; 381 return rc;
@@ -366,17 +389,17 @@ exit:
366 * of an I/O Slot. 389 * of an I/O Slot.
367 * Return Codes: 390 * Return Codes:
368 * 0 Success 391 * 0 Success
369 * -EIO Internal Error 392 * -EINVAL Vio dev doesn't exist
370 */ 393 */
371int dlpar_remove_vio_slot(struct slot *slot, char *drc_name) 394static int dlpar_remove_vio_slot(char *drc_name, struct device_node *dn)
372{ 395{
373 /* Remove hotplug slot */ 396 struct vio_dev *vio_dev;
374 397
375 if (rpaphp_remove_slot(slot)) { 398 vio_dev = vio_find_node(dn);
376 printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", 399 if (!vio_dev)
377 __FUNCTION__, drc_name); 400 return -EINVAL;
378 return -EIO; 401
379 } 402 vio_unregister_device(vio_dev);
380 return 0; 403 return 0;
381} 404}
382 405
@@ -391,31 +414,34 @@ int dlpar_remove_vio_slot(struct slot *slot, char *drc_name)
391 * -ENODEV Not a valid drc_name 414 * -ENODEV Not a valid drc_name
392 * -EIO Internal PCI Error 415 * -EIO Internal PCI Error
393 */ 416 */
394int dlpar_remove_pci_slot(struct slot *slot, char *drc_name) 417int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
395{ 418{
396 struct pci_dev *bridge_dev; 419 struct pci_bus *bus;
420 struct slot *slot;
397 421
398 bridge_dev = slot->bridge; 422 bus = rpaphp_find_pci_bus(dn);
399 if (!bridge_dev) { 423 if (!bus)
400 printk(KERN_ERR "%s: unexpected null bridge device\n", 424 return -EINVAL;
401 __FUNCTION__);
402 return -EIO;
403 }
404 425
405 /* Remove hotplug slot */ 426 slot = find_slot(dn);
406 if (rpaphp_remove_slot(slot)) { 427 if (slot) {
407 printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", 428 /* Remove hotplug slot */
408 __FUNCTION__, drc_name); 429 if (rpaphp_remove_slot(slot)) {
409 return -EIO; 430 printk(KERN_ERR
431 "%s: unable to remove hotplug slot %s\n",
432 __FUNCTION__, drc_name);
433 return -EIO;
434 }
410 } 435 }
411 436
412 /* Remove pci bus */ 437 if (unmap_bus_range(bus)) {
413 438 printk(KERN_ERR "%s: failed to unmap bus range\n",
414 if (dlpar_pci_remove_bus(bridge_dev)) { 439 __FUNCTION__);
415 printk(KERN_ERR "%s: unable to remove pci bus %s\n", 440 return -ERANGE;
416 __FUNCTION__, drc_name);
417 return -EIO;
418 } 441 }
442
443 BUG_ON(!bus->self);
444 pci_remove_bus_device(bus->self);
419 return 0; 445 return 0;
420} 446}
421 447
@@ -434,38 +460,31 @@ int dlpar_remove_pci_slot(struct slot *slot, char *drc_name)
434 */ 460 */
435int dlpar_remove_slot(char *drc_name) 461int dlpar_remove_slot(char *drc_name)
436{ 462{
437 struct slot *slot; 463 struct device_node *dn;
464 int node_type;
438 int rc = 0; 465 int rc = 0;
439 466
440 if (down_interruptible(&rpadlpar_sem)) 467 if (down_interruptible(&rpadlpar_sem))
441 return -ERESTARTSYS; 468 return -ERESTARTSYS;
442 469
443 if (!find_php_slot_vio_node(drc_name) && 470 dn = find_dlpar_node(drc_name, &node_type);
444 !find_php_slot_pci_node(drc_name, "SLOT") && 471 if (!dn) {
445 !find_php_slot_pci_node(drc_name, "PHB")) {
446 rc = -ENODEV; 472 rc = -ENODEV;
447 goto exit; 473 goto exit;
448 } 474 }
449 475
450 slot = find_slot(drc_name); 476 switch (node_type) {
451 if (!slot) { 477 case NODE_TYPE_VIO:
452 rc = -EINVAL; 478 rc = dlpar_remove_vio_slot(drc_name, dn);
453 goto exit; 479 break;
454 } 480 case NODE_TYPE_PHB:
455 481 rc = dlpar_remove_phb(drc_name, dn);
456 if (slot->type == PHB) { 482 break;
457 rc = dlpar_remove_phb(slot); 483 case NODE_TYPE_SLOT:
458 } else { 484 rc = dlpar_remove_pci_slot(drc_name, dn);
459 switch (slot->dev_type) { 485 break;
460 case PCI_DEV:
461 rc = dlpar_remove_pci_slot(slot, drc_name);
462 break;
463
464 case VIO_DEV:
465 rc = dlpar_remove_vio_slot(slot, drc_name);
466 break;
467 }
468 } 486 }
487 printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name);
469exit: 488exit:
470 up(&rpadlpar_sem); 489 up(&rpadlpar_sem);
471 return rc; 490 return rc;
diff --git a/drivers/pci/hotplug/rpaphp.h b/drivers/pci/hotplug/rpaphp.h
index 81746e6e0e0f..61d94d1e29cb 100644
--- a/drivers/pci/hotplug/rpaphp.h
+++ b/drivers/pci/hotplug/rpaphp.h
@@ -30,10 +30,6 @@
30#include <linux/pci.h> 30#include <linux/pci.h>
31#include "pci_hotplug.h" 31#include "pci_hotplug.h"
32 32
33#define PHB 2
34#define HOTPLUG 1
35#define EMBEDDED 0
36
37#define DR_INDICATOR 9002 33#define DR_INDICATOR 9002
38#define DR_ENTITY_SENSE 9003 34#define DR_ENTITY_SENSE 9003
39 35
@@ -61,10 +57,6 @@ extern int debug;
61#define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg) 57#define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg)
62#define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) 58#define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)
63 59
64/* slot types */
65#define VIO_DEV 1
66#define PCI_DEV 2
67
68/* slot states */ 60/* slot states */
69 61
70#define NOT_VALID 3 62#define NOT_VALID 3
@@ -72,11 +64,6 @@ extern int debug;
72#define CONFIGURED 1 64#define CONFIGURED 1
73#define EMPTY 0 65#define EMPTY 0
74 66
75struct rpaphp_pci_func {
76 struct pci_dev *pci_dev;
77 struct list_head sibling;
78};
79
80/* 67/*
81 * struct slot - slot information for each *physical* slot 68 * struct slot - slot information for each *physical* slot
82 */ 69 */
@@ -88,15 +75,9 @@ struct slot {
88 u32 power_domain; 75 u32 power_domain;
89 char *name; 76 char *name;
90 char *location; 77 char *location;
91 u8 removable; 78 struct device_node *dn;
92 u8 dev_type; /* VIO or PCI */ 79 struct pci_bus *bus;
93 struct device_node *dn; /* slot's device_node in OFDT */ 80 struct list_head *pci_devs;
94 /* dn has phb info */
95 struct pci_dev *bridge; /* slot's pci_dev in pci_devices */
96 union {
97 struct list_head *pci_devs; /* pci_devs in PCI slot */
98 struct vio_dev *vio_dev; /* vio_dev in VIO slot */
99 } dev;
100 struct hotplug_slot *hotplug_slot; 81 struct hotplug_slot *hotplug_slot;
101}; 82};
102 83
@@ -107,13 +88,13 @@ extern int num_slots;
107/* function prototypes */ 88/* function prototypes */
108 89
109/* rpaphp_pci.c */ 90/* rpaphp_pci.c */
110extern struct pci_dev *rpaphp_find_pci_dev(struct device_node *dn); 91extern struct pci_bus *rpaphp_find_pci_bus(struct device_node *dn);
111extern int rpaphp_claim_resource(struct pci_dev *dev, int resource); 92extern int rpaphp_claim_resource(struct pci_dev *dev, int resource);
112extern int rpaphp_enable_pci_slot(struct slot *slot); 93extern int rpaphp_enable_pci_slot(struct slot *slot);
113extern int register_pci_slot(struct slot *slot); 94extern int register_pci_slot(struct slot *slot);
114extern int rpaphp_unconfig_pci_adapter(struct slot *slot); 95extern int rpaphp_unconfig_pci_adapter(struct slot *slot);
115extern int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value); 96extern int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value);
116extern struct hotplug_slot *rpaphp_find_hotplug_slot(struct pci_dev *dev); 97extern int rpaphp_config_pci_adapter(struct pci_bus *bus);
117 98
118/* rpaphp_core.c */ 99/* rpaphp_core.c */
119extern int rpaphp_add_slot(struct device_node *dn); 100extern int rpaphp_add_slot(struct device_node *dn);
@@ -121,12 +102,6 @@ extern int rpaphp_remove_slot(struct slot *slot);
121extern int rpaphp_get_drc_props(struct device_node *dn, int *drc_index, 102extern int rpaphp_get_drc_props(struct device_node *dn, int *drc_index,
122 char **drc_name, char **drc_type, int *drc_power_domain); 103 char **drc_name, char **drc_type, int *drc_power_domain);
123 104
124/* rpaphp_vio.c */
125extern int rpaphp_get_vio_adapter_status(struct slot *slot, int is_init, u8 * value);
126extern int rpaphp_unconfig_vio_adapter(struct slot *slot);
127extern int register_vio_slot(struct device_node *dn);
128extern int rpaphp_enable_vio_slot(struct slot *slot);
129
130/* rpaphp_slot.c */ 105/* rpaphp_slot.c */
131extern void dealloc_slot_struct(struct slot *slot); 106extern void dealloc_slot_struct(struct slot *slot);
132extern struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_name, int power_domain); 107extern struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_name, int power_domain);
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c
index 29117a3a3287..c830ff0acdc3 100644
--- a/drivers/pci/hotplug/rpaphp_core.c
+++ b/drivers/pci/hotplug/rpaphp_core.c
@@ -152,17 +152,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 * value)
152 int retval = 0; 152 int retval = 0;
153 153
154 down(&rpaphp_sem); 154 down(&rpaphp_sem);
155 /* have to go through this */ 155 retval = rpaphp_get_pci_adapter_status(slot, 0, value);
156 switch (slot->dev_type) {
157 case PCI_DEV:
158 retval = rpaphp_get_pci_adapter_status(slot, 0, value);
159 break;
160 case VIO_DEV:
161 retval = rpaphp_get_vio_adapter_status(slot, 0, value);
162 break;
163 default:
164 retval = -EINVAL;
165 }
166 up(&rpaphp_sem); 156 up(&rpaphp_sem);
167 return retval; 157 return retval;
168} 158}
@@ -317,34 +307,6 @@ static int is_php_dn(struct device_node *dn, int **indexes, int **names,
317 return 0; 307 return 0;
318} 308}
319 309
320static int is_dr_dn(struct device_node *dn, int **indexes, int **names,
321 int **types, int **power_domains, int **my_drc_index)
322{
323 int rc;
324
325 *my_drc_index = (int *) get_property(dn, "ibm,my-drc-index", NULL);
326 if(!*my_drc_index)
327 return (0);
328
329 if (!dn->parent)
330 return (0);
331
332 rc = get_children_props(dn->parent, indexes, names, types,
333 power_domains);
334 return (rc >= 0);
335}
336
337static inline int is_vdevice_root(struct device_node *dn)
338{
339 return !strcmp(dn->name, "vdevice");
340}
341
342int is_dlpar_type(const char *type_str)
343{
344 /* Only register DLPAR-capable nodes of drc-type PHB or SLOT */
345 return (!strcmp(type_str, "PHB") || !strcmp(type_str, "SLOT"));
346}
347
348/**************************************************************** 310/****************************************************************
349 * rpaphp not only registers PCI hotplug slots(HOTPLUG), 311 * rpaphp not only registers PCI hotplug slots(HOTPLUG),
350 * but also logical DR slots(EMBEDDED). 312 * but also logical DR slots(EMBEDDED).
@@ -356,54 +318,33 @@ int rpaphp_add_slot(struct device_node *dn)
356{ 318{
357 struct slot *slot; 319 struct slot *slot;
358 int retval = 0; 320 int retval = 0;
359 int i, *my_drc_index, slot_type; 321 int i;
360 int *indexes, *names, *types, *power_domains; 322 int *indexes, *names, *types, *power_domains;
361 char *name, *type; 323 char *name, *type;
362 324
363 dbg("Entry %s: dn->full_name=%s\n", __FUNCTION__, dn->full_name); 325 dbg("Entry %s: dn->full_name=%s\n", __FUNCTION__, dn->full_name);
364 326
365 if (dn->parent && is_vdevice_root(dn->parent)) {
366 /* register a VIO device */
367 retval = register_vio_slot(dn);
368 goto exit;
369 }
370
371 /* register PCI devices */ 327 /* register PCI devices */
372 if (dn->name != 0 && strcmp(dn->name, "pci") == 0) { 328 if (dn->name != 0 && strcmp(dn->name, "pci") == 0) {
373 if (is_php_dn(dn, &indexes, &names, &types, &power_domains)) 329 if (!is_php_dn(dn, &indexes, &names, &types, &power_domains))
374 slot_type = HOTPLUG; 330 goto exit;
375 else if (is_dr_dn(dn, &indexes, &names, &types, &power_domains, &my_drc_index))
376 slot_type = EMBEDDED;
377 else goto exit;
378 331
379 name = (char *) &names[1]; 332 name = (char *) &names[1];
380 type = (char *) &types[1]; 333 type = (char *) &types[1];
381 for (i = 0; i < indexes[0]; i++, 334 for (i = 0; i < indexes[0]; i++,
382 name += (strlen(name) + 1), type += (strlen(type) + 1)) { 335 name += (strlen(name) + 1), type += (strlen(type) + 1)) {
383 336
384 if (slot_type == HOTPLUG || 337 if (!(slot = alloc_slot_struct(dn, indexes[i + 1], name,
385 (slot_type == EMBEDDED && 338 power_domains[i + 1]))) {
386 indexes[i + 1] == my_drc_index[0] && 339 retval = -ENOMEM;
387 is_dlpar_type(type))) { 340 goto exit;
388 if (!(slot = alloc_slot_struct(dn, indexes[i + 1], name, 341 }
389 power_domains[i + 1]))) { 342 slot->type = simple_strtoul(type, NULL, 10);
390 retval = -ENOMEM;
391 goto exit;
392 }
393 if (!strcmp(type, "PHB"))
394 slot->type = PHB;
395 else if (slot_type == EMBEDDED)
396 slot->type = EMBEDDED;
397 else
398 slot->type = simple_strtoul(type, NULL, 10);
399 343
400 dbg(" Found drc-index:0x%x drc-name:%s drc-type:%s\n", 344 dbg("Found drc-index:0x%x drc-name:%s drc-type:%s\n",
401 indexes[i + 1], name, type); 345 indexes[i + 1], name, type);
402 346
403 retval = register_pci_slot(slot); 347 retval = register_pci_slot(slot);
404 if (slot_type == EMBEDDED)
405 goto exit;
406 }
407 } 348 }
408 } 349 }
409exit: 350exit:
@@ -412,31 +353,6 @@ exit:
412 return retval; 353 return retval;
413} 354}
414 355
415/*
416 * init_slots - initialize 'struct slot' structures for each slot
417 *
418 */
419static void init_slots(void)
420{
421 struct device_node *dn;
422
423 for (dn = find_all_nodes(); dn; dn = dn->next)
424 rpaphp_add_slot(dn);
425}
426
427static int __init init_rpa(void)
428{
429
430 init_MUTEX(&rpaphp_sem);
431
432 /* initialize internal data structure etc. */
433 init_slots();
434 if (!num_slots)
435 return -ENODEV;
436
437 return 0;
438}
439
440static void __exit cleanup_slots(void) 356static void __exit cleanup_slots(void)
441{ 357{
442 struct list_head *tmp, *n; 358 struct list_head *tmp, *n;
@@ -458,10 +374,18 @@ static void __exit cleanup_slots(void)
458 374
459static int __init rpaphp_init(void) 375static int __init rpaphp_init(void)
460{ 376{
377 struct device_node *dn = NULL;
378
461 info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); 379 info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
380 init_MUTEX(&rpaphp_sem);
462 381
463 /* read all the PRA info from the system */ 382 while ((dn = of_find_node_by_type(dn, "pci")))
464 return init_rpa(); 383 rpaphp_add_slot(dn);
384
385 if (!num_slots)
386 return -ENODEV;
387
388 return 0;
465} 389}
466 390
467static void __exit rpaphp_exit(void) 391static void __exit rpaphp_exit(void)
@@ -481,16 +405,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
481 405
482 dbg("ENABLING SLOT %s\n", slot->name); 406 dbg("ENABLING SLOT %s\n", slot->name);
483 down(&rpaphp_sem); 407 down(&rpaphp_sem);
484 switch (slot->dev_type) { 408 retval = rpaphp_enable_pci_slot(slot);
485 case PCI_DEV:
486 retval = rpaphp_enable_pci_slot(slot);
487 break;
488 case VIO_DEV:
489 retval = rpaphp_enable_vio_slot(slot);
490 break;
491 default:
492 retval = -EINVAL;
493 }
494 up(&rpaphp_sem); 409 up(&rpaphp_sem);
495exit: 410exit:
496 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); 411 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
@@ -511,16 +426,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
511 426
512 dbg("DISABLING SLOT %s\n", slot->name); 427 dbg("DISABLING SLOT %s\n", slot->name);
513 down(&rpaphp_sem); 428 down(&rpaphp_sem);
514 switch (slot->dev_type) { 429 retval = rpaphp_unconfig_pci_adapter(slot);
515 case PCI_DEV:
516 retval = rpaphp_unconfig_pci_adapter(slot);
517 break;
518 case VIO_DEV:
519 retval = rpaphp_unconfig_vio_adapter(slot);
520 break;
521 default:
522 retval = -ENODEV;
523 }
524 up(&rpaphp_sem); 430 up(&rpaphp_sem);
525exit: 431exit:
526 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); 432 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
diff --git a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c
index d8305a935aab..49e4d10a6488 100644
--- a/drivers/pci/hotplug/rpaphp_pci.c
+++ b/drivers/pci/hotplug/rpaphp_pci.c
@@ -30,22 +30,35 @@
30 30
31#include "rpaphp.h" 31#include "rpaphp.h"
32 32
33struct pci_dev *rpaphp_find_pci_dev(struct device_node *dn) 33static struct pci_bus *find_bus_among_children(struct pci_bus *bus,
34 struct device_node *dn)
34{ 35{
35 struct pci_dev *dev = NULL; 36 struct pci_bus *child = NULL;
36 char bus_id[BUS_ID_SIZE]; 37 struct list_head *tmp;
38 struct device_node *busdn;
39
40 busdn = pci_bus_to_OF_node(bus);
41 if (busdn == dn)
42 return bus;
37 43
38 sprintf(bus_id, "%04x:%02x:%02x.%d", dn->phb->global_number, 44 list_for_each(tmp, &bus->children) {
39 dn->busno, PCI_SLOT(dn->devfn), PCI_FUNC(dn->devfn)); 45 child = find_bus_among_children(pci_bus_b(tmp), dn);
40 for_each_pci_dev(dev) { 46 if (child)
41 if (!strcmp(pci_name(dev), bus_id)) {
42 break; 47 break;
43 }
44 } 48 }
45 return dev; 49 return child;
46} 50}
47 51
48EXPORT_SYMBOL_GPL(rpaphp_find_pci_dev); 52struct pci_bus *rpaphp_find_pci_bus(struct device_node *dn)
53{
54 struct pci_dn *pdn = dn->data;
55
56 if (!pdn || !pdn->phb || !pdn->phb->bus)
57 return NULL;
58
59 return find_bus_among_children(pdn->phb->bus, dn);
60}
61EXPORT_SYMBOL_GPL(rpaphp_find_pci_bus);
49 62
50int rpaphp_claim_resource(struct pci_dev *dev, int resource) 63int rpaphp_claim_resource(struct pci_dev *dev, int resource)
51{ 64{
@@ -69,11 +82,6 @@ int rpaphp_claim_resource(struct pci_dev *dev, int resource)
69 82
70EXPORT_SYMBOL_GPL(rpaphp_claim_resource); 83EXPORT_SYMBOL_GPL(rpaphp_claim_resource);
71 84
72static struct pci_dev *rpaphp_find_bridge_pdev(struct slot *slot)
73{
74 return rpaphp_find_pci_dev(slot->dn);
75}
76
77static int rpaphp_get_sensor_state(struct slot *slot, int *state) 85static int rpaphp_get_sensor_state(struct slot *slot, int *state)
78{ 86{
79 int rc; 87 int rc;
@@ -116,39 +124,27 @@ static int rpaphp_get_sensor_state(struct slot *slot, int *state)
116 */ 124 */
117int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value) 125int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value)
118{ 126{
127 struct pci_bus *bus;
119 int state, rc; 128 int state, rc;
120 struct device_node *child_dn;
121 struct pci_dev *child_dev = NULL;
122 129
123 *value = NOT_VALID; 130 *value = NOT_VALID;
124 rc = rpaphp_get_sensor_state(slot, &state); 131 rc = rpaphp_get_sensor_state(slot, &state);
125 if (rc) 132 if (rc)
126 goto exit; 133 goto exit;
127 134
128 if ((state == EMPTY) || (slot->type == PHB)) { 135 if (state == EMPTY)
129 dbg("slot is empty\n");
130 *value = EMPTY; 136 *value = EMPTY;
131 }
132 else if (state == PRESENT) { 137 else if (state == PRESENT) {
133 if (!is_init) { 138 if (!is_init) {
134 /* at run-time slot->state can be changed by */ 139 /* at run-time slot->state can be changed by */
135 /* config/unconfig adapter */ 140 /* config/unconfig adapter */
136 *value = slot->state; 141 *value = slot->state;
137 } else { 142 } else {
138 child_dn = slot->dn->child; 143 bus = rpaphp_find_pci_bus(slot->dn);
139 if (child_dn) 144 if (bus && !list_empty(&bus->devices))
140 child_dev = rpaphp_find_pci_dev(child_dn); 145 *value = CONFIGURED;
141 146 else
142 if (child_dev)
143 *value = CONFIGURED;
144 else if (!child_dn)
145 dbg("%s: %s is not valid OFDT node\n",
146 __FUNCTION__, slot->dn->full_name);
147 else {
148 err("%s: can't find pdev of adapter in slot[%s]\n",
149 __FUNCTION__, slot->dn->full_name);
150 *value = NOT_CONFIGURED; 147 *value = NOT_CONFIGURED;
151 }
152 } 148 }
153 } 149 }
154exit: 150exit:
@@ -186,39 +182,6 @@ rpaphp_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
186 } 182 }
187} 183}
188 184
189static int rpaphp_pci_config_bridge(struct pci_dev *dev);
190
191/*****************************************************************************
192 rpaphp_pci_config_slot() will configure all devices under the
193 given slot->dn and return the the first pci_dev.
194 *****************************************************************************/
195static struct pci_dev *
196rpaphp_pci_config_slot(struct device_node *dn, struct pci_bus *bus)
197{
198 struct device_node *eads_first_child = dn->child;
199 struct pci_dev *dev = NULL;
200 int num;
201
202 dbg("Enter %s: dn=%s bus=%s\n", __FUNCTION__, dn->full_name, bus->name);
203
204 if (eads_first_child) {
205 /* pci_scan_slot should find all children of EADs */
206 num = pci_scan_slot(bus, PCI_DEVFN(PCI_SLOT(eads_first_child->devfn), 0));
207 if (num) {
208 rpaphp_fixup_new_pci_devices(bus, 1);
209 pci_bus_add_devices(bus);
210 }
211 dev = rpaphp_find_pci_dev(eads_first_child);
212 if (!dev) {
213 err("No new device found\n");
214 return NULL;
215 }
216 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
217 rpaphp_pci_config_bridge(dev);
218 }
219 return dev;
220}
221
222static int rpaphp_pci_config_bridge(struct pci_dev *dev) 185static int rpaphp_pci_config_bridge(struct pci_dev *dev)
223{ 186{
224 u8 sec_busno; 187 u8 sec_busno;
@@ -252,6 +215,42 @@ static int rpaphp_pci_config_bridge(struct pci_dev *dev)
252 return 0; 215 return 0;
253} 216}
254 217
218/*****************************************************************************
219 rpaphp_pci_config_slot() will configure all devices under the
220 given slot->dn and return the the first pci_dev.
221 *****************************************************************************/
222static struct pci_dev *
223rpaphp_pci_config_slot(struct pci_bus *bus)
224{
225 struct device_node *dn = pci_bus_to_OF_node(bus);
226 struct pci_dev *dev = NULL;
227 int slotno;
228 int num;
229
230 dbg("Enter %s: dn=%s bus=%s\n", __FUNCTION__, dn->full_name, bus->name);
231 if (!dn || !dn->child)
232 return NULL;
233
234 slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
235
236 /* pci_scan_slot should find all children */
237 num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
238 if (num) {
239 rpaphp_fixup_new_pci_devices(bus, 1);
240 pci_bus_add_devices(bus);
241 }
242 if (list_empty(&bus->devices)) {
243 err("%s: No new device found\n", __FUNCTION__);
244 return NULL;
245 }
246 list_for_each_entry(dev, &bus->devices, bus_list) {
247 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE)
248 rpaphp_pci_config_bridge(dev);
249 }
250
251 return dev;
252}
253
255static void enable_eeh(struct device_node *dn) 254static void enable_eeh(struct device_node *dn)
256{ 255{
257 struct device_node *sib; 256 struct device_node *sib;
@@ -263,49 +262,44 @@ static void enable_eeh(struct device_node *dn)
263 262
264} 263}
265 264
266static void print_slot_pci_funcs(struct slot *slot) 265static void print_slot_pci_funcs(struct pci_bus *bus)
267{ 266{
267 struct device_node *dn;
268 struct pci_dev *dev; 268 struct pci_dev *dev;
269 269
270 if (slot->dev_type == PCI_DEV) { 270 dn = pci_bus_to_OF_node(bus);
271 dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, slot->name); 271 if (!dn)
272 list_for_each_entry (dev, slot->dev.pci_devs, bus_list) 272 return;
273 dbg("\t%s\n", pci_name(dev)); 273
274 } 274 dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, dn->full_name);
275 list_for_each_entry (dev, &bus->devices, bus_list)
276 dbg("\t%s\n", pci_name(dev));
275 return; 277 return;
276} 278}
277 279
278static int rpaphp_config_pci_adapter(struct slot *slot) 280int rpaphp_config_pci_adapter(struct pci_bus *bus)
279{ 281{
280 struct pci_bus *pci_bus; 282 struct device_node *dn = pci_bus_to_OF_node(bus);
281 struct pci_dev *dev; 283 struct pci_dev *dev;
282 int rc = -ENODEV; 284 int rc = -ENODEV;
283 285
284 dbg("Entry %s: slot[%s]\n", __FUNCTION__, slot->name); 286 dbg("Entry %s: slot[%s]\n", __FUNCTION__, dn->full_name);
285 287 if (!dn)
286 if (slot->bridge) { 288 goto exit;
287 289
288 pci_bus = slot->bridge->subordinate; 290 enable_eeh(dn);
289 if (!pci_bus) { 291 dev = rpaphp_pci_config_slot(bus);
290 err("%s: can't find bus structure\n", __FUNCTION__); 292 if (!dev) {
291 goto exit; 293 err("%s: can't find any devices.\n", __FUNCTION__);
292 } 294 goto exit;
293 enable_eeh(slot->dn);
294 dev = rpaphp_pci_config_slot(slot->dn, pci_bus);
295 if (!dev) {
296 err("%s: can't find any devices.\n", __FUNCTION__);
297 goto exit;
298 }
299 print_slot_pci_funcs(slot);
300 rc = 0;
301 } else {
302 /* slot is not enabled */
303 err("slot doesn't have pci_dev structure\n");
304 } 295 }
296 print_slot_pci_funcs(bus);
297 rc = 0;
305exit: 298exit:
306 dbg("Exit %s: rc=%d\n", __FUNCTION__, rc); 299 dbg("Exit %s: rc=%d\n", __FUNCTION__, rc);
307 return rc; 300 return rc;
308} 301}
302EXPORT_SYMBOL_GPL(rpaphp_config_pci_adapter);
309 303
310static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev) 304static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev)
311{ 305{
@@ -327,13 +321,14 @@ static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev)
327 321
328int rpaphp_unconfig_pci_adapter(struct slot *slot) 322int rpaphp_unconfig_pci_adapter(struct slot *slot)
329{ 323{
330 struct pci_dev *dev; 324 struct pci_dev *dev, *tmp;
331 int retval = 0; 325 int retval = 0;
332 326
333 list_for_each_entry(dev, slot->dev.pci_devs, bus_list) 327 list_for_each_entry_safe(dev, tmp, slot->pci_devs, bus_list) {
334 rpaphp_eeh_remove_bus_device(dev); 328 rpaphp_eeh_remove_bus_device(dev);
329 pci_remove_bus_device(dev);
330 }
335 331
336 pci_remove_behind_bridge(slot->bridge);
337 slot->state = NOT_CONFIGURED; 332 slot->state = NOT_CONFIGURED;
338 info("%s: devices in slot[%s] unconfigured.\n", __FUNCTION__, 333 info("%s: devices in slot[%s] unconfigured.\n", __FUNCTION__,
339 slot->name); 334 slot->name);
@@ -356,66 +351,41 @@ static int setup_pci_hotplug_slot_info(struct slot *slot)
356 return 0; 351 return 0;
357} 352}
358 353
359static int set_phb_slot_name(struct slot *slot) 354static void set_slot_name(struct slot *slot)
360{ 355{
361 struct device_node *dn; 356 struct pci_bus *bus = slot->bus;
362 struct pci_controller *phb; 357 struct pci_dev *bridge;
363 struct pci_bus *bus;
364
365 dn = slot->dn;
366 if (!dn) {
367 return -EINVAL;
368 }
369 phb = dn->phb;
370 if (!phb) {
371 return -EINVAL;
372 }
373 bus = phb->bus;
374 if (!bus) {
375 return -EINVAL;
376 }
377 358
378 sprintf(slot->name, "%04x:%02x:%02x.%x", pci_domain_nr(bus), 359 bridge = bus->self;
379 bus->number, 0, 0); 360 if (bridge)
380 return 0; 361 strcpy(slot->name, pci_name(bridge));
362 else
363 sprintf(slot->name, "%04x:%02x:00.0", pci_domain_nr(bus),
364 bus->number);
381} 365}
382 366
383static int setup_pci_slot(struct slot *slot) 367static int setup_pci_slot(struct slot *slot)
384{ 368{
369 struct device_node *dn = slot->dn;
385 struct pci_bus *bus; 370 struct pci_bus *bus;
386 int rc;
387 371
388 if (slot->type == PHB) { 372 BUG_ON(!dn);
389 rc = set_phb_slot_name(slot); 373 bus = rpaphp_find_pci_bus(dn);
390 if (rc < 0) { 374 if (!bus) {
391 err("%s: failed to set phb slot name\n", __FUNCTION__); 375 err("%s: no pci_bus for dn %s\n", __FUNCTION__, dn->full_name);
392 goto exit_rc; 376 goto exit_rc;
393 }
394 } else {
395 slot->bridge = rpaphp_find_bridge_pdev(slot);
396 if (!slot->bridge) {
397 /* slot being added doesn't have pci_dev yet */
398 err("%s: no pci_dev for bridge dn %s\n",
399 __FUNCTION__, slot->name);
400 goto exit_rc;
401 }
402
403 bus = slot->bridge->subordinate;
404 if (!bus)
405 goto exit_rc;
406 slot->dev.pci_devs = &bus->devices;
407
408 dbg("%s set slot->name to %s\n", __FUNCTION__,
409 pci_name(slot->bridge));
410 strcpy(slot->name, pci_name(slot->bridge));
411 } 377 }
412 378
379 slot->bus = bus;
380 slot->pci_devs = &bus->devices;
381 set_slot_name(slot);
382
413 /* find slot's pci_dev if it's not empty */ 383 /* find slot's pci_dev if it's not empty */
414 if (slot->hotplug_slot->info->adapter_status == EMPTY) { 384 if (slot->hotplug_slot->info->adapter_status == EMPTY) {
415 slot->state = EMPTY; /* slot is empty */ 385 slot->state = EMPTY; /* slot is empty */
416 } else { 386 } else {
417 /* slot is occupied */ 387 /* slot is occupied */
418 if (!(slot->dn->child)) { 388 if (!dn->child) {
419 /* non-empty slot has to have child */ 389 /* non-empty slot has to have child */
420 err("%s: slot[%s]'s device_node doesn't have child for adapter\n", 390 err("%s: slot[%s]'s device_node doesn't have child for adapter\n",
421 __FUNCTION__, slot->name); 391 __FUNCTION__, slot->name);
@@ -425,7 +395,7 @@ static int setup_pci_slot(struct slot *slot)
425 if (slot->hotplug_slot->info->adapter_status == NOT_CONFIGURED) { 395 if (slot->hotplug_slot->info->adapter_status == NOT_CONFIGURED) {
426 dbg("%s CONFIGURING pci adapter in slot[%s]\n", 396 dbg("%s CONFIGURING pci adapter in slot[%s]\n",
427 __FUNCTION__, slot->name); 397 __FUNCTION__, slot->name);
428 if (rpaphp_config_pci_adapter(slot)) { 398 if (rpaphp_config_pci_adapter(slot->bus)) {
429 err("%s: CONFIG pci adapter failed\n", __FUNCTION__); 399 err("%s: CONFIG pci adapter failed\n", __FUNCTION__);
430 goto exit_rc; 400 goto exit_rc;
431 } 401 }
@@ -435,8 +405,8 @@ static int setup_pci_slot(struct slot *slot)
435 __FUNCTION__, slot->name); 405 __FUNCTION__, slot->name);
436 goto exit_rc; 406 goto exit_rc;
437 } 407 }
438 print_slot_pci_funcs(slot); 408 print_slot_pci_funcs(slot->bus);
439 if (!list_empty(slot->dev.pci_devs)) { 409 if (!list_empty(slot->pci_devs)) {
440 slot->state = CONFIGURED; 410 slot->state = CONFIGURED;
441 } else { 411 } else {
442 /* DLPAR add as opposed to 412 /* DLPAR add as opposed to
@@ -454,11 +424,6 @@ int register_pci_slot(struct slot *slot)
454{ 424{
455 int rc = -EINVAL; 425 int rc = -EINVAL;
456 426
457 slot->dev_type = PCI_DEV;
458 if ((slot->type == EMBEDDED) || (slot->type == PHB))
459 slot->removable = 0;
460 else
461 slot->removable = 1;
462 if (setup_pci_hotplug_slot_info(slot)) 427 if (setup_pci_hotplug_slot_info(slot))
463 goto exit_rc; 428 goto exit_rc;
464 if (setup_pci_slot(slot)) 429 if (setup_pci_slot(slot))
@@ -479,7 +444,7 @@ int rpaphp_enable_pci_slot(struct slot *slot)
479 /* if slot is not empty, enable the adapter */ 444 /* if slot is not empty, enable the adapter */
480 if (state == PRESENT) { 445 if (state == PRESENT) {
481 dbg("%s : slot[%s] is occupied.\n", __FUNCTION__, slot->name); 446 dbg("%s : slot[%s] is occupied.\n", __FUNCTION__, slot->name);
482 retval = rpaphp_config_pci_adapter(slot); 447 retval = rpaphp_config_pci_adapter(slot->bus);
483 if (!retval) { 448 if (!retval) {
484 slot->state = CONFIGURED; 449 slot->state = CONFIGURED;
485 dbg("%s: PCI devices in slot[%s] has been configured\n", 450 dbg("%s: PCI devices in slot[%s] has been configured\n",
@@ -502,37 +467,3 @@ exit:
502 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); 467 dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
503 return retval; 468 return retval;
504} 469}
505
506struct hotplug_slot *rpaphp_find_hotplug_slot(struct pci_dev *dev)
507{
508 struct list_head *tmp, *n;
509 struct slot *slot;
510
511 list_for_each_safe(tmp, n, &rpaphp_slot_head) {
512 struct pci_bus *bus;
513 struct list_head *ln;
514
515 slot = list_entry(tmp, struct slot, rpaphp_slot_list);
516 if (slot->bridge == NULL) {
517 if (slot->dev_type == PCI_DEV) {
518 printk(KERN_WARNING "PCI slot missing bridge %s %s \n",
519 slot->name, slot->location);
520 }
521 continue;
522 }
523
524 bus = slot->bridge->subordinate;
525 if (!bus) {
526 continue; /* should never happen? */
527 }
528 for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) {
529 struct pci_dev *pdev = pci_dev_b(ln);
530 if (pdev == dev)
531 return slot->hotplug_slot;
532 }
533 }
534
535 return NULL;
536}
537
538EXPORT_SYMBOL_GPL(rpaphp_find_hotplug_slot);
diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c
index ff2cbf0652d8..0e8815495083 100644
--- a/drivers/pci/hotplug/rpaphp_slot.c
+++ b/drivers/pci/hotplug/rpaphp_slot.c
@@ -30,35 +30,6 @@
30#include <asm/rtas.h> 30#include <asm/rtas.h>
31#include "rpaphp.h" 31#include "rpaphp.h"
32 32
33static ssize_t removable_read_file (struct hotplug_slot *php_slot, char *buf)
34{
35 u8 value;
36 int retval = -ENOENT;
37 struct slot *slot = (struct slot *)php_slot->private;
38
39 if (!slot)
40 return retval;
41
42 value = slot->removable;
43 retval = sprintf (buf, "%d\n", value);
44 return retval;
45}
46
47static struct hotplug_slot_attribute hotplug_slot_attr_removable = {
48 .attr = {.name = "phy_removable", .mode = S_IFREG | S_IRUGO},
49 .show = removable_read_file,
50};
51
52static void rpaphp_sysfs_add_attr_removable (struct hotplug_slot *slot)
53{
54 sysfs_create_file(&slot->kobj, &hotplug_slot_attr_removable.attr);
55}
56
57static void rpaphp_sysfs_remove_attr_removable (struct hotplug_slot *slot)
58{
59 sysfs_remove_file(&slot->kobj, &hotplug_slot_attr_removable.attr);
60}
61
62static ssize_t location_read_file (struct hotplug_slot *php_slot, char *buf) 33static ssize_t location_read_file (struct hotplug_slot *php_slot, char *buf)
63{ 34{
64 char *value; 35 char *value;
@@ -176,9 +147,6 @@ int deregister_slot(struct slot *slot)
176 /* remove "phy_location" file */ 147 /* remove "phy_location" file */
177 rpaphp_sysfs_remove_attr_location(php_slot); 148 rpaphp_sysfs_remove_attr_location(php_slot);
178 149
179 /* remove "phy_removable" file */
180 rpaphp_sysfs_remove_attr_removable(php_slot);
181
182 retval = pci_hp_deregister(php_slot); 150 retval = pci_hp_deregister(php_slot);
183 if (retval) 151 if (retval)
184 err("Problem unregistering a slot %s\n", slot->name); 152 err("Problem unregistering a slot %s\n", slot->name);
@@ -212,21 +180,13 @@ int register_slot(struct slot *slot)
212 /* create "phy_locatoin" file */ 180 /* create "phy_locatoin" file */
213 rpaphp_sysfs_add_attr_location(slot->hotplug_slot); 181 rpaphp_sysfs_add_attr_location(slot->hotplug_slot);
214 182
215 /* create "phy_removable" file */
216 rpaphp_sysfs_add_attr_removable(slot->hotplug_slot);
217
218 /* add slot to our internal list */ 183 /* add slot to our internal list */
219 dbg("%s adding slot[%s] to rpaphp_slot_list\n", 184 dbg("%s adding slot[%s] to rpaphp_slot_list\n",
220 __FUNCTION__, slot->name); 185 __FUNCTION__, slot->name);
221 186
222 list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); 187 list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head);
223 188 info("Slot [%s](PCI location=%s) registered\n", slot->name,
224 if (slot->dev_type == VIO_DEV) 189 slot->location);
225 info("Slot [%s](VIO location=%s) registered\n",
226 slot->name, slot->location);
227 else
228 info("Slot [%s](PCI location=%s) registered\n",
229 slot->name, slot->location);
230 num_slots++; 190 num_slots++;
231 return 0; 191 return 0;
232} 192}
@@ -235,21 +195,17 @@ int rpaphp_get_power_status(struct slot *slot, u8 * value)
235{ 195{
236 int rc = 0, level; 196 int rc = 0, level;
237 197
238 if (slot->type == HOTPLUG) { 198 rc = rtas_get_power_level(slot->power_domain, &level);
239 rc = rtas_get_power_level(slot->power_domain, &level); 199 if (rc < 0) {
240 if (!rc) { 200 err("failed to get power-level for slot(%s), rc=0x%x\n",
241 dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n", 201 slot->location, rc);
242 __FUNCTION__, slot->name, slot->power_domain, level); 202 return rc;
243 *value = level;
244 } else
245 err("failed to get power-level for slot(%s), rc=0x%x\n",
246 slot->location, rc);
247 } else {
248 dbg("%s report POWER_ON for EMBEDDED or PHB slot %s\n",
249 __FUNCTION__, slot->location);
250 *value = (u8) POWER_ON;
251 } 203 }
252 204
205 dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n",
206 __FUNCTION__, slot->name, slot->power_domain, level);
207 *value = level;
208
253 return rc; 209 return rc;
254} 210}
255 211
diff --git a/drivers/pci/hotplug/rpaphp_vio.c b/drivers/pci/hotplug/rpaphp_vio.c
deleted file mode 100644
index 74df6a305e64..000000000000
--- a/drivers/pci/hotplug/rpaphp_vio.c
+++ /dev/null
@@ -1,129 +0,0 @@
1/*
2 * RPA Hot Plug Virtual I/O device functions
3 * Copyright (C) 2004 Linda Xie <lxie@us.ibm.com>
4 *
5 * All rights reserved.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or (at
10 * your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
15 * NON INFRINGEMENT. See the GNU General Public License for more
16 * details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 * Send feedback to <lxie@us.ibm.com>
23 *
24 */
25#include <asm/vio.h>
26#include "rpaphp.h"
27
28/*
29 * get_vio_adapter_status - get the status of a slot
30 *
31 * status:
32 *
33 * 1-- adapter is configured
34 * 2-- adapter is not configured
35 * 3-- not valid
36 */
37inline int rpaphp_get_vio_adapter_status(struct slot *slot, int is_init, u8 *value)
38{
39 *value = slot->state;
40 return 0;
41}
42
43int rpaphp_unconfig_vio_adapter(struct slot *slot)
44{
45 int retval = 0;
46
47 dbg("Entry %s: slot[%s]\n", __FUNCTION__, slot->name);
48 if (!slot->dev.vio_dev) {
49 info("%s: no VIOA in slot[%s]\n", __FUNCTION__, slot->name);
50 retval = -EINVAL;
51 goto exit;
52 }
53 /* remove the device from the vio core */
54 vio_unregister_device(slot->dev.vio_dev);
55 slot->state = NOT_CONFIGURED;
56 info("%s: adapter in slot[%s] unconfigured.\n", __FUNCTION__, slot->name);
57exit:
58 dbg("Exit %s, rc=0x%x\n", __FUNCTION__, retval);
59 return retval;
60}
61
62static int setup_vio_hotplug_slot_info(struct slot *slot)
63{
64 slot->hotplug_slot->info->power_status = 1;
65 rpaphp_get_vio_adapter_status(slot, 1,
66 &slot->hotplug_slot->info->adapter_status);
67 return 0;
68}
69
70int register_vio_slot(struct device_node *dn)
71{
72 u32 *index;
73 char *name;
74 int rc = -EINVAL;
75 struct slot *slot = NULL;
76
77 rc = rpaphp_get_drc_props(dn, NULL, &name, NULL, NULL);
78 if (rc < 0)
79 goto exit_rc;
80 index = (u32 *) get_property(dn, "ibm,my-drc-index", NULL);
81 if (!index)
82 goto exit_rc;
83 if (!(slot = alloc_slot_struct(dn, *index, name, 0))) {
84 rc = -ENOMEM;
85 goto exit_rc;
86 }
87 slot->dev_type = VIO_DEV;
88 slot->dev.vio_dev = vio_find_node(dn);
89 if (slot->dev.vio_dev) {
90 /*
91 * rpaphp is the only owner of vio devices and
92 * does not need extra reference taken by
93 * vio_find_node
94 */
95 put_device(&slot->dev.vio_dev->dev);
96 } else
97 slot->dev.vio_dev = vio_register_device_node(dn);
98 if (slot->dev.vio_dev)
99 slot->state = CONFIGURED;
100 else
101 slot->state = NOT_CONFIGURED;
102 if (setup_vio_hotplug_slot_info(slot))
103 goto exit_rc;
104 strcpy(slot->name, slot->dev.vio_dev->dev.bus_id);
105 info("%s: registered VIO device[name=%s vio_dev=%p]\n",
106 __FUNCTION__, slot->name, slot->dev.vio_dev);
107 rc = register_slot(slot);
108exit_rc:
109 if (rc && slot)
110 dealloc_slot_struct(slot);
111 return (rc);
112}
113
114int rpaphp_enable_vio_slot(struct slot *slot)
115{
116 int retval = 0;
117
118 if ((slot->dev.vio_dev = vio_register_device_node(slot->dn))) {
119 info("%s: VIO adapter %s in slot[%s] has been configured\n",
120 __FUNCTION__, slot->dn->name, slot->name);
121 slot->state = CONFIGURED;
122 } else {
123 info("%s: no vio_dev struct for adapter in slot[%s]\n",
124 __FUNCTION__, slot->name);
125 slot->state = NOT_CONFIGURED;
126 }
127
128 return retval;
129}
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c
index 323041fd41dc..b1409441c1cd 100644
--- a/drivers/pci/hotplug/sgi_hotplug.c
+++ b/drivers/pci/hotplug/sgi_hotplug.c
@@ -32,14 +32,15 @@ MODULE_LICENSE("GPL");
32MODULE_AUTHOR("SGI (prarit@sgi.com, dickie@sgi.com, habeck@sgi.com)"); 32MODULE_AUTHOR("SGI (prarit@sgi.com, dickie@sgi.com, habeck@sgi.com)");
33MODULE_DESCRIPTION("SGI Altix Hot Plug PCI Controller Driver"); 33MODULE_DESCRIPTION("SGI Altix Hot Plug PCI Controller Driver");
34 34
35#define PCIIO_ASIC_TYPE_TIOCA 4 35#define PCIIO_ASIC_TYPE_TIOCA 4
36#define PCI_SLOT_ALREADY_UP 2 /* slot already up */ 36#define PCI_SLOT_ALREADY_UP 2 /* slot already up */
37#define PCI_SLOT_ALREADY_DOWN 3 /* slot already down */ 37#define PCI_SLOT_ALREADY_DOWN 3 /* slot already down */
38#define PCI_L1_ERR 7 /* L1 console command error */ 38#define PCI_L1_ERR 7 /* L1 console command error */
39#define PCI_EMPTY_33MHZ 15 /* empty 33 MHz bus */ 39#define PCI_EMPTY_33MHZ 15 /* empty 33 MHz bus */
40#define PCI_L1_QSIZE 128 /* our L1 message buffer size */ 40#define PCI_L1_QSIZE 128 /* our L1 message buffer size */
41#define SN_MAX_HP_SLOTS 32 /* max number of hotplug slots */ 41#define SN_MAX_HP_SLOTS 32 /* max hotplug slots */
42#define SGI_HOTPLUG_PROM_REV 0x0420 /* Min. required PROM version */ 42#define SGI_HOTPLUG_PROM_REV 0x0430 /* Min. required PROM version */
43#define SN_SLOT_NAME_SIZE 33 /* size of name string */
43 44
44/* internal list head */ 45/* internal list head */
45static struct list_head sn_hp_list; 46static struct list_head sn_hp_list;
@@ -51,6 +52,7 @@ struct slot {
51 /* this struct for glue internal only */ 52 /* this struct for glue internal only */
52 struct hotplug_slot *hotplug_slot; 53 struct hotplug_slot *hotplug_slot;
53 struct list_head hp_list; 54 struct list_head hp_list;
55 char physical_path[SN_SLOT_NAME_SIZE];
54}; 56};
55 57
56struct pcibr_slot_enable_resp { 58struct pcibr_slot_enable_resp {
@@ -70,7 +72,7 @@ enum sn_pci_req_e {
70 72
71static int enable_slot(struct hotplug_slot *slot); 73static int enable_slot(struct hotplug_slot *slot);
72static int disable_slot(struct hotplug_slot *slot); 74static int disable_slot(struct hotplug_slot *slot);
73static int get_power_status(struct hotplug_slot *slot, u8 *value); 75static inline int get_power_status(struct hotplug_slot *slot, u8 *value);
74 76
75static struct hotplug_slot_ops sn_hotplug_slot_ops = { 77static struct hotplug_slot_ops sn_hotplug_slot_ops = {
76 .owner = THIS_MODULE, 78 .owner = THIS_MODULE,
@@ -81,6 +83,21 @@ static struct hotplug_slot_ops sn_hotplug_slot_ops = {
81 83
82static DECLARE_MUTEX(sn_hotplug_sem); 84static DECLARE_MUTEX(sn_hotplug_sem);
83 85
86static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot,
87 char *buf)
88{
89 int retval = -ENOENT;
90 struct slot *slot = bss_hotplug_slot->private;
91
92 if (!slot)
93 return retval;
94
95 retval = sprintf (buf, "%s\n", slot->physical_path);
96 return retval;
97}
98
99static struct hotplug_slot_attribute sn_slot_path_attr = __ATTR_RO(path);
100
84static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) 101static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device)
85{ 102{
86 struct pcibus_info *pcibus_info; 103 struct pcibus_info *pcibus_info;
@@ -120,15 +137,15 @@ static int sn_pci_bus_valid(struct pci_bus *pci_bus)
120 /* Only register slots in I/O Bricks that support hotplug */ 137 /* Only register slots in I/O Bricks that support hotplug */
121 bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); 138 bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid);
122 switch (bricktype) { 139 switch (bricktype) {
123 case L1_BRICKTYPE_IX: 140 case L1_BRICKTYPE_IX:
124 case L1_BRICKTYPE_PX: 141 case L1_BRICKTYPE_PX:
125 case L1_BRICKTYPE_IA: 142 case L1_BRICKTYPE_IA:
126 case L1_BRICKTYPE_PA: 143 case L1_BRICKTYPE_PA:
127 return 1; 144 return 1;
128 break; 145 break;
129 default: 146 default:
130 return -EPERM; 147 return -EPERM;
131 break; 148 break;
132 } 149 }
133 150
134 return -EIO; 151 return -EIO;
@@ -142,13 +159,12 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
142 159
143 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); 160 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus);
144 161
145 bss_hotplug_slot->private = kcalloc(1, sizeof(struct slot), 162 slot = kcalloc(1, sizeof(*slot), GFP_KERNEL);
146 GFP_KERNEL); 163 if (!slot)
147 if (!bss_hotplug_slot->private)
148 return -ENOMEM; 164 return -ENOMEM;
149 slot = (struct slot *)bss_hotplug_slot->private; 165 bss_hotplug_slot->private = slot;
150 166
151 bss_hotplug_slot->name = kmalloc(33, GFP_KERNEL); 167 bss_hotplug_slot->name = kmalloc(SN_SLOT_NAME_SIZE, GFP_KERNEL);
152 if (!bss_hotplug_slot->name) { 168 if (!bss_hotplug_slot->name) {
153 kfree(bss_hotplug_slot->private); 169 kfree(bss_hotplug_slot->private);
154 return -ENOMEM; 170 return -ENOMEM;
@@ -156,16 +172,16 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
156 172
157 slot->device_num = device; 173 slot->device_num = device;
158 slot->pci_bus = pci_bus; 174 slot->pci_bus = pci_bus;
159 175 sprintf(bss_hotplug_slot->name, "%04x:%02x:%02x",
160 sprintf(bss_hotplug_slot->name, "module_%c%c%c%c%.2d_b_%d_s_%d", 176 pci_domain_nr(pci_bus),
177 ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf,
178 device + 1);
179 sprintf(slot->physical_path, "module_%c%c%c%c%.2d",
161 '0'+RACK_GET_CLASS(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), 180 '0'+RACK_GET_CLASS(MODULE_GET_RACK(pcibus_info->pbi_moduleid)),
162 '0'+RACK_GET_GROUP(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), 181 '0'+RACK_GET_GROUP(MODULE_GET_RACK(pcibus_info->pbi_moduleid)),
163 '0'+RACK_GET_NUM(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), 182 '0'+RACK_GET_NUM(MODULE_GET_RACK(pcibus_info->pbi_moduleid)),
164 MODULE_GET_BTCHAR(pcibus_info->pbi_moduleid), 183 MODULE_GET_BTCHAR(pcibus_info->pbi_moduleid),
165 MODULE_GET_BPOS(pcibus_info->pbi_moduleid), 184 MODULE_GET_BPOS(pcibus_info->pbi_moduleid));
166 ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf,
167 device + 1);
168
169 slot->hotplug_slot = bss_hotplug_slot; 185 slot->hotplug_slot = bss_hotplug_slot;
170 list_add(&slot->hp_list, &sn_hp_list); 186 list_add(&slot->hp_list, &sn_hp_list);
171 187
@@ -175,14 +191,14 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
175static struct hotplug_slot * sn_hp_destroy(void) 191static struct hotplug_slot * sn_hp_destroy(void)
176{ 192{
177 struct slot *slot; 193 struct slot *slot;
178 struct list_head *list;
179 struct hotplug_slot *bss_hotplug_slot = NULL; 194 struct hotplug_slot *bss_hotplug_slot = NULL;
180 195
181 list_for_each(list, &sn_hp_list) { 196 list_for_each_entry(slot, &sn_hp_list, hp_list) {
182 slot = list_entry(list, struct slot, hp_list);
183 bss_hotplug_slot = slot->hotplug_slot; 197 bss_hotplug_slot = slot->hotplug_slot;
184 list_del(&((struct slot *)bss_hotplug_slot->private)-> 198 list_del(&((struct slot *)bss_hotplug_slot->private)->
185 hp_list); 199 hp_list);
200 sysfs_remove_file(&bss_hotplug_slot->kobj,
201 &sn_slot_path_attr.attr);
186 break; 202 break;
187 } 203 }
188 return bss_hotplug_slot; 204 return bss_hotplug_slot;
@@ -190,7 +206,6 @@ static struct hotplug_slot * sn_hp_destroy(void)
190 206
191static void sn_bus_alloc_data(struct pci_dev *dev) 207static void sn_bus_alloc_data(struct pci_dev *dev)
192{ 208{
193 struct list_head *node;
194 struct pci_bus *subordinate_bus; 209 struct pci_bus *subordinate_bus;
195 struct pci_dev *child; 210 struct pci_dev *child;
196 211
@@ -199,66 +214,29 @@ static void sn_bus_alloc_data(struct pci_dev *dev)
199 /* Recursively sets up the sn_irq_info structs */ 214 /* Recursively sets up the sn_irq_info structs */
200 if (dev->subordinate) { 215 if (dev->subordinate) {
201 subordinate_bus = dev->subordinate; 216 subordinate_bus = dev->subordinate;
202 list_for_each(node, &subordinate_bus->devices) { 217 list_for_each_entry(child, &subordinate_bus->devices, bus_list)
203 child = list_entry(node, struct pci_dev, bus_list);
204 sn_bus_alloc_data(child); 218 sn_bus_alloc_data(child);
205 }
206 } 219 }
207} 220}
208 221
209static void sn_bus_free_data(struct pci_dev *dev) 222static void sn_bus_free_data(struct pci_dev *dev)
210{ 223{
211 struct list_head *node;
212 struct pci_bus *subordinate_bus; 224 struct pci_bus *subordinate_bus;
213 struct pci_dev *child; 225 struct pci_dev *child;
214 226
215 /* Recursively clean up sn_irq_info structs */ 227 /* Recursively clean up sn_irq_info structs */
216 if (dev->subordinate) { 228 if (dev->subordinate) {
217 subordinate_bus = dev->subordinate; 229 subordinate_bus = dev->subordinate;
218 list_for_each(node, &subordinate_bus->devices) { 230 list_for_each_entry(child, &subordinate_bus->devices, bus_list)
219 child = list_entry(node, struct pci_dev, bus_list);
220 sn_bus_free_data(child); 231 sn_bus_free_data(child);
221 }
222 } 232 }
223 sn_pci_unfixup_slot(dev); 233 sn_pci_unfixup_slot(dev);
224} 234}
225 235
226static u8 sn_power_status_get(struct hotplug_slot *bss_hotplug_slot)
227{
228 struct slot *slot = (struct slot *)bss_hotplug_slot->private;
229 struct pcibus_info *pcibus_info;
230 u8 retval;
231
232 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
233 retval = pcibus_info->pbi_enabled_devices & (1 << slot->device_num);
234
235 return retval ? 1 : 0;
236}
237
238static void sn_slot_mark_enable(struct hotplug_slot *bss_hotplug_slot,
239 int device_num)
240{
241 struct slot *slot = (struct slot *)bss_hotplug_slot->private;
242 struct pcibus_info *pcibus_info;
243
244 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
245 pcibus_info->pbi_enabled_devices |= (1 << device_num);
246}
247
248static void sn_slot_mark_disable(struct hotplug_slot *bss_hotplug_slot,
249 int device_num)
250{
251 struct slot *slot = (struct slot *)bss_hotplug_slot->private;
252 struct pcibus_info *pcibus_info;
253
254 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
255 pcibus_info->pbi_enabled_devices &= ~(1 << device_num);
256}
257
258static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, 236static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot,
259 int device_num) 237 int device_num)
260{ 238{
261 struct slot *slot = (struct slot *)bss_hotplug_slot->private; 239 struct slot *slot = bss_hotplug_slot->private;
262 struct pcibus_info *pcibus_info; 240 struct pcibus_info *pcibus_info;
263 struct pcibr_slot_enable_resp resp; 241 struct pcibr_slot_enable_resp resp;
264 int rc; 242 int rc;
@@ -273,7 +251,7 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot,
273 251
274 if (rc == PCI_SLOT_ALREADY_UP) { 252 if (rc == PCI_SLOT_ALREADY_UP) {
275 dev_dbg(slot->pci_bus->self, "is already active\n"); 253 dev_dbg(slot->pci_bus->self, "is already active\n");
276 return -EPERM; 254 return 1; /* return 1 to user */
277 } 255 }
278 256
279 if (rc == PCI_L1_ERR) { 257 if (rc == PCI_L1_ERR) {
@@ -290,7 +268,8 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot,
290 return -EIO; 268 return -EIO;
291 } 269 }
292 270
293 sn_slot_mark_enable(bss_hotplug_slot, device_num); 271 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
272 pcibus_info->pbi_enabled_devices |= (1 << device_num);
294 273
295 return 0; 274 return 0;
296} 275}
@@ -298,7 +277,7 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot,
298static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, 277static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot,
299 int device_num, int action) 278 int device_num, int action)
300{ 279{
301 struct slot *slot = (struct slot *)bss_hotplug_slot->private; 280 struct slot *slot = bss_hotplug_slot->private;
302 struct pcibus_info *pcibus_info; 281 struct pcibus_info *pcibus_info;
303 struct pcibr_slot_disable_resp resp; 282 struct pcibr_slot_disable_resp resp;
304 int rc; 283 int rc;
@@ -307,43 +286,44 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot,
307 286
308 rc = sal_pcibr_slot_disable(pcibus_info, device_num, action, &resp); 287 rc = sal_pcibr_slot_disable(pcibus_info, device_num, action, &resp);
309 288
310 if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_SLOT_ALREADY_DOWN) { 289 if ((action == PCI_REQ_SLOT_ELIGIBLE) &&
290 (rc == PCI_SLOT_ALREADY_DOWN)) {
311 dev_dbg(slot->pci_bus->self, "Slot %s already inactive\n"); 291 dev_dbg(slot->pci_bus->self, "Slot %s already inactive\n");
312 return -ENODEV; 292 return 1; /* return 1 to user */
313 } 293 }
314 294
315 if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_EMPTY_33MHZ) { 295 if ((action == PCI_REQ_SLOT_ELIGIBLE) && (rc == PCI_EMPTY_33MHZ)) {
316 dev_dbg(slot->pci_bus->self, 296 dev_dbg(slot->pci_bus->self,
317 "Cannot remove last 33MHz card\n"); 297 "Cannot remove last 33MHz card\n");
318 return -EPERM; 298 return -EPERM;
319 } 299 }
320 300
321 if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_L1_ERR) { 301 if ((action == PCI_REQ_SLOT_ELIGIBLE) && (rc == PCI_L1_ERR)) {
322 dev_dbg(slot->pci_bus->self, 302 dev_dbg(slot->pci_bus->self,
323 "L1 failure %d with message \n%s\n", 303 "L1 failure %d with message \n%s\n",
324 resp.resp_sub_errno, resp.resp_l1_msg); 304 resp.resp_sub_errno, resp.resp_l1_msg);
325 return -EPERM; 305 return -EPERM;
326 } 306 }
327 307
328 if (action == PCI_REQ_SLOT_ELIGIBLE && rc) { 308 if ((action == PCI_REQ_SLOT_ELIGIBLE) && rc) {
329 dev_dbg(slot->pci_bus->self, 309 dev_dbg(slot->pci_bus->self,
330 "remove failed with error %d sub-error %d\n", 310 "remove failed with error %d sub-error %d\n",
331 rc, resp.resp_sub_errno); 311 rc, resp.resp_sub_errno);
332 return -EIO; 312 return -EIO;
333 } 313 }
334 314
335 if (action == PCI_REQ_SLOT_ELIGIBLE && !rc) 315 if ((action == PCI_REQ_SLOT_ELIGIBLE) && !rc)
336 return 0; 316 return 0;
337 317
338 if (action == PCI_REQ_SLOT_DISABLE && !rc) { 318 if ((action == PCI_REQ_SLOT_DISABLE) && !rc) {
339 sn_slot_mark_disable(bss_hotplug_slot, device_num); 319 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
320 pcibus_info->pbi_enabled_devices &= ~(1 << device_num);
340 dev_dbg(slot->pci_bus->self, "remove successful\n"); 321 dev_dbg(slot->pci_bus->self, "remove successful\n");
341 return 0; 322 return 0;
342 } 323 }
343 324
344 if (action == PCI_REQ_SLOT_DISABLE && rc) { 325 if ((action == PCI_REQ_SLOT_DISABLE) && rc) {
345 dev_dbg(slot->pci_bus->self,"remove failed rc = %d\n", rc); 326 dev_dbg(slot->pci_bus->self,"remove failed rc = %d\n", rc);
346 return rc;
347 } 327 }
348 328
349 return rc; 329 return rc;
@@ -351,7 +331,7 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot,
351 331
352static int enable_slot(struct hotplug_slot *bss_hotplug_slot) 332static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
353{ 333{
354 struct slot *slot = (struct slot *)bss_hotplug_slot->private; 334 struct slot *slot = bss_hotplug_slot->private;
355 struct pci_bus *new_bus = NULL; 335 struct pci_bus *new_bus = NULL;
356 struct pci_dev *dev; 336 struct pci_dev *dev;
357 int func, num_funcs; 337 int func, num_funcs;
@@ -371,8 +351,8 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
371 return rc; 351 return rc;
372 } 352 }
373 353
374 num_funcs = pci_scan_slot(slot->pci_bus, PCI_DEVFN(slot->device_num+1, 354 num_funcs = pci_scan_slot(slot->pci_bus,
375 PCI_FUNC(0))); 355 PCI_DEVFN(slot->device_num + 1, 0));
376 if (!num_funcs) { 356 if (!num_funcs) {
377 dev_dbg(slot->pci_bus->self, "no device in slot\n"); 357 dev_dbg(slot->pci_bus->self, "no device in slot\n");
378 up(&sn_hotplug_sem); 358 up(&sn_hotplug_sem);
@@ -391,8 +371,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
391 dev = pci_get_slot(slot->pci_bus, 371 dev = pci_get_slot(slot->pci_bus,
392 PCI_DEVFN(slot->device_num + 1, 372 PCI_DEVFN(slot->device_num + 1,
393 PCI_FUNC(func))); 373 PCI_FUNC(func)));
394
395
396 if (dev) { 374 if (dev) {
397 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { 375 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
398 unsigned char sec_bus; 376 unsigned char sec_bus;
@@ -431,7 +409,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
431 409
432static int disable_slot(struct hotplug_slot *bss_hotplug_slot) 410static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
433{ 411{
434 struct slot *slot = (struct slot *)bss_hotplug_slot->private; 412 struct slot *slot = bss_hotplug_slot->private;
435 struct pci_dev *dev; 413 struct pci_dev *dev;
436 int func; 414 int func;
437 int rc; 415 int rc;
@@ -448,7 +426,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
448 /* Free the SN resources assigned to the Linux device.*/ 426 /* Free the SN resources assigned to the Linux device.*/
449 for (func = 0; func < 8; func++) { 427 for (func = 0; func < 8; func++) {
450 dev = pci_get_slot(slot->pci_bus, 428 dev = pci_get_slot(slot->pci_bus,
451 PCI_DEVFN(slot->device_num+1, 429 PCI_DEVFN(slot->device_num + 1,
452 PCI_FUNC(func))); 430 PCI_FUNC(func)));
453 if (dev) { 431 if (dev) {
454 /* 432 /*
@@ -477,10 +455,15 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
477 return rc; 455 return rc;
478} 456}
479 457
480static int get_power_status(struct hotplug_slot *bss_hotplug_slot, u8 *value) 458static inline int get_power_status(struct hotplug_slot *bss_hotplug_slot,
459 u8 *value)
481{ 460{
461 struct slot *slot = bss_hotplug_slot->private;
462 struct pcibus_info *pcibus_info;
463
464 pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus);
482 down(&sn_hotplug_sem); 465 down(&sn_hotplug_sem);
483 *value = sn_power_status_get(bss_hotplug_slot); 466 *value = pcibus_info->pbi_enabled_devices & (1 << slot->device_num);
484 up(&sn_hotplug_sem); 467 up(&sn_hotplug_sem);
485 return 0; 468 return 0;
486} 469}
@@ -508,7 +491,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
508 if (sn_pci_slot_valid(pci_bus, device) != 1) 491 if (sn_pci_slot_valid(pci_bus, device) != 1)
509 continue; 492 continue;
510 493
511 bss_hotplug_slot = kcalloc(1,sizeof(struct hotplug_slot), 494 bss_hotplug_slot = kcalloc(1, sizeof(*bss_hotplug_slot),
512 GFP_KERNEL); 495 GFP_KERNEL);
513 if (!bss_hotplug_slot) { 496 if (!bss_hotplug_slot) {
514 rc = -ENOMEM; 497 rc = -ENOMEM;
@@ -516,7 +499,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
516 } 499 }
517 500
518 bss_hotplug_slot->info = 501 bss_hotplug_slot->info =
519 kcalloc(1,sizeof(struct hotplug_slot_info), 502 kcalloc(1, sizeof(struct hotplug_slot_info),
520 GFP_KERNEL); 503 GFP_KERNEL);
521 if (!bss_hotplug_slot->info) { 504 if (!bss_hotplug_slot->info) {
522 rc = -ENOMEM; 505 rc = -ENOMEM;
@@ -535,6 +518,11 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
535 rc = pci_hp_register(bss_hotplug_slot); 518 rc = pci_hp_register(bss_hotplug_slot);
536 if (rc) 519 if (rc)
537 goto register_err; 520 goto register_err;
521
522 rc = sysfs_create_file(&bss_hotplug_slot->kobj,
523 &sn_slot_path_attr.attr);
524 if (rc)
525 goto register_err;
538 } 526 }
539 dev_dbg(pci_bus->self, "Registered bus with hotplug\n"); 527 dev_dbg(pci_bus->self, "Registered bus with hotplug\n");
540 return rc; 528 return rc;
@@ -564,14 +552,14 @@ static int sn_pci_hotplug_init(void)
564 int rc; 552 int rc;
565 int registered = 0; 553 int registered = 0;
566 554
567 INIT_LIST_HEAD(&sn_hp_list);
568
569 if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) { 555 if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) {
570 printk(KERN_ERR "%s: PROM version must be greater than 4.05\n", 556 printk(KERN_ERR "%s: PROM version must be greater than 4.30\n",
571 __FUNCTION__); 557 __FUNCTION__);
572 return -EPERM; 558 return -EPERM;
573 } 559 }
574 560
561 INIT_LIST_HEAD(&sn_hp_list);
562
575 while ((pci_bus = pci_find_next_bus(pci_bus))) { 563 while ((pci_bus = pci_find_next_bus(pci_bus))) {
576 if (!pci_bus->sysdata) 564 if (!pci_bus->sysdata)
577 continue; 565 continue;
@@ -584,9 +572,9 @@ static int sn_pci_hotplug_init(void)
584 dev_dbg(pci_bus->self, "valid hotplug bus\n"); 572 dev_dbg(pci_bus->self, "valid hotplug bus\n");
585 573
586 rc = sn_hotplug_slot_register(pci_bus); 574 rc = sn_hotplug_slot_register(pci_bus);
587 if (!rc) 575 if (!rc) {
588 registered = 1; 576 registered = 1;
589 else { 577 } else {
590 registered = 0; 578 registered = 0;
591 break; 579 break;
592 } 580 }
@@ -599,9 +587,8 @@ static void sn_pci_hotplug_exit(void)
599{ 587{
600 struct hotplug_slot *bss_hotplug_slot; 588 struct hotplug_slot *bss_hotplug_slot;
601 589
602 while ((bss_hotplug_slot = sn_hp_destroy())) { 590 while ((bss_hotplug_slot = sn_hp_destroy()))
603 pci_hp_deregister(bss_hotplug_slot); 591 pci_hp_deregister(bss_hotplug_slot);
604 }
605 592
606 if (!list_empty(&sn_hp_list)) 593 if (!list_empty(&sn_hp_list))
607 printk(KERN_ERR "%s: internal list is not empty\n", __FILE__); 594 printk(KERN_ERR "%s: internal list is not empty\n", __FILE__);
diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h
index fe4d653da188..b7d1c61d6bbb 100644
--- a/drivers/pci/hotplug/shpchp.h
+++ b/drivers/pci/hotplug/shpchp.h
@@ -411,7 +411,7 @@ static inline void return_resource(struct pci_resource **head, struct pci_resour
411 411
412static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) 412static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot)
413{ 413{
414 snprintf(buffer, buffer_size, "%d", slot->number); 414 snprintf(buffer, buffer_size, "%04d_%04d", slot->bus, slot->number);
415} 415}
416 416
417enum php_ctlr_type { 417enum php_ctlr_type {
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 532f73bb2224..ee8677bda950 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -439,10 +439,7 @@ static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
439 } 439 }
440 if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { 440 if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
441 /* PCI Express Endpoint device detected */ 441 /* PCI Express Endpoint device detected */
442 u16 cmd; 442 pci_intx(dev, 0); /* disable intx */
443 pci_read_config_word(dev, PCI_COMMAND, &cmd);
444 cmd |= PCI_COMMAND_INTX_DISABLE;
445 pci_write_config_word(dev, PCI_COMMAND, cmd);
446 } 443 }
447} 444}
448 445
@@ -461,10 +458,7 @@ void disable_msi_mode(struct pci_dev *dev, int pos, int type)
461 } 458 }
462 if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { 459 if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
463 /* PCI Express Endpoint device detected */ 460 /* PCI Express Endpoint device detected */
464 u16 cmd; 461 pci_intx(dev, 1); /* enable intx */
465 pci_read_config_word(dev, PCI_COMMAND, &cmd);
466 cmd &= ~PCI_COMMAND_INTX_DISABLE;
467 pci_write_config_word(dev, PCI_COMMAND, cmd);
468 } 462 }
469} 463}
470 464
diff --git a/drivers/pci/names.c b/drivers/pci/names.c
deleted file mode 100644
index ad224aada7c9..000000000000
--- a/drivers/pci/names.c
+++ /dev/null
@@ -1,137 +0,0 @@
1/*
2 * PCI Class and Device Name Tables
3 *
4 * Copyright 1993--1999 Drew Eckhardt, Frederic Potter,
5 * David Mosberger-Tang, Martin Mares
6 */
7
8#include <linux/config.h>
9#include <linux/types.h>
10#include <linux/kernel.h>
11#include <linux/pci.h>
12#include <linux/init.h>
13
14#ifdef CONFIG_PCI_NAMES
15
16struct pci_device_info {
17 unsigned short device;
18 unsigned short seen;
19 const char *name;
20};
21
22struct pci_vendor_info {
23 unsigned short vendor;
24 unsigned short nr;
25 const char *name;
26 struct pci_device_info *devices;
27};
28
29/*
30 * This is ridiculous, but we want the strings in
31 * the .init section so that they don't take up
32 * real memory.. Parse the same file multiple times
33 * to get all the info.
34 */
35#define VENDOR( vendor, name ) static char __vendorstr_##vendor[] __devinitdata = name;
36#define ENDVENDOR()
37#define DEVICE( vendor, device, name ) static char __devicestr_##vendor##device[] __devinitdata = name;
38#include "devlist.h"
39
40
41#define VENDOR( vendor, name ) static struct pci_device_info __devices_##vendor[] __devinitdata = {
42#define ENDVENDOR() };
43#define DEVICE( vendor, device, name ) { 0x##device, 0, __devicestr_##vendor##device },
44#include "devlist.h"
45
46static struct pci_vendor_info __devinitdata pci_vendor_list[] = {
47#define VENDOR( vendor, name ) { 0x##vendor, sizeof(__devices_##vendor) / sizeof(struct pci_device_info), __vendorstr_##vendor, __devices_##vendor },
48#define ENDVENDOR()
49#define DEVICE( vendor, device, name )
50#include "devlist.h"
51};
52
53#define VENDORS (sizeof(pci_vendor_list)/sizeof(struct pci_vendor_info))
54
55void __devinit pci_name_device(struct pci_dev *dev)
56{
57 const struct pci_vendor_info *vendor_p = pci_vendor_list;
58 int i = VENDORS;
59 char *name = dev->pretty_name;
60
61 do {
62 if (vendor_p->vendor == dev->vendor)
63 goto match_vendor;
64 vendor_p++;
65 } while (--i);
66
67 /* Couldn't find either the vendor nor the device */
68 sprintf(name, "PCI device %04x:%04x", dev->vendor, dev->device);
69 return;
70
71 match_vendor: {
72 struct pci_device_info *device_p = vendor_p->devices;
73 int i = vendor_p->nr;
74
75 while (i > 0) {
76 if (device_p->device == dev->device)
77 goto match_device;
78 device_p++;
79 i--;
80 }
81
82 /* Ok, found the vendor, but unknown device */
83 sprintf(name, "PCI device %04x:%04x (%." PCI_NAME_HALF "s)",
84 dev->vendor, dev->device, vendor_p->name);
85 return;
86
87 /* Full match */
88 match_device: {
89 char *n = name + sprintf(name, "%s %s",
90 vendor_p->name, device_p->name);
91 int nr = device_p->seen + 1;
92 device_p->seen = nr;
93 if (nr > 1)
94 sprintf(n, " (#%d)", nr);
95 }
96 }
97}
98
99/*
100 * Class names. Not in .init section as they are needed in runtime.
101 */
102
103static u16 pci_class_numbers[] = {
104#define CLASS(x,y) 0x##x,
105#include "classlist.h"
106};
107
108static char *pci_class_names[] = {
109#define CLASS(x,y) y,
110#include "classlist.h"
111};
112
113char *
114pci_class_name(u32 class)
115{
116 int i;
117
118 for(i=0; i<sizeof(pci_class_numbers)/sizeof(pci_class_numbers[0]); i++)
119 if (pci_class_numbers[i] == class)
120 return pci_class_names[i];
121 return NULL;
122}
123
124#else
125
126void __devinit pci_name_device(struct pci_dev *dev)
127{
128}
129
130char *
131pci_class_name(u32 class)
132{
133 return NULL;
134}
135
136#endif /* CONFIG_PCI_NAMES */
137
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index e4115a0d5ba6..0d0d533894e0 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -7,6 +7,7 @@
7#include <linux/module.h> 7#include <linux/module.h>
8#include <linux/init.h> 8#include <linux/init.h>
9#include <linux/device.h> 9#include <linux/device.h>
10#include <linux/mempolicy.h>
10#include "pci.h" 11#include "pci.h"
11 12
12/* 13/*
@@ -163,6 +164,34 @@ const struct pci_device_id *pci_match_device(struct pci_driver *drv,
163 return NULL; 164 return NULL;
164} 165}
165 166
167static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
168 const struct pci_device_id *id)
169{
170 int error;
171#ifdef CONFIG_NUMA
172 /* Execute driver initialization on node where the
173 device's bus is attached to. This way the driver likely
174 allocates its local memory on the right node without
175 any need to change it. */
176 struct mempolicy *oldpol;
177 cpumask_t oldmask = current->cpus_allowed;
178 int node = pcibus_to_node(dev->bus);
179 if (node >= 0 && node_online(node))
180 set_cpus_allowed(current, node_to_cpumask(node));
181 /* And set default memory allocation policy */
182 oldpol = current->mempolicy;
183 current->mempolicy = &default_policy;
184 mpol_get(current->mempolicy);
185#endif
186 error = drv->probe(dev, id);
187#ifdef CONFIG_NUMA
188 set_cpus_allowed(current, oldmask);
189 mpol_free(current->mempolicy);
190 current->mempolicy = oldpol;
191#endif
192 return error;
193}
194
166/** 195/**
167 * __pci_device_probe() 196 * __pci_device_probe()
168 * 197 *
@@ -180,7 +209,7 @@ __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
180 209
181 id = pci_match_device(drv, pci_dev); 210 id = pci_match_device(drv, pci_dev);
182 if (id) 211 if (id)
183 error = drv->probe(pci_dev, id); 212 error = pci_call_probe(drv, pci_dev, id);
184 if (error >= 0) { 213 if (error >= 0) {
185 pci_dev->driver = drv; 214 pci_dev->driver = drv;
186 error = 0; 215 error = 0;
@@ -243,17 +272,19 @@ static int pci_device_suspend(struct device * dev, pm_message_t state)
243} 272}
244 273
245 274
246/* 275/*
247 * Default resume method for devices that have no driver provided resume, 276 * Default resume method for devices that have no driver provided resume,
248 * or not even a driver at all. 277 * or not even a driver at all.
249 */ 278 */
250static void pci_default_resume(struct pci_dev *pci_dev) 279static void pci_default_resume(struct pci_dev *pci_dev)
251{ 280{
281 int retval;
282
252 /* restore the PCI config space */ 283 /* restore the PCI config space */
253 pci_restore_state(pci_dev); 284 pci_restore_state(pci_dev);
254 /* if the device was enabled before suspend, reenable */ 285 /* if the device was enabled before suspend, reenable */
255 if (pci_dev->is_enabled) 286 if (pci_dev->is_enabled)
256 pci_enable_device(pci_dev); 287 retval = pci_enable_device(pci_dev);
257 /* if the device was busmaster before the suspend, make it busmaster again */ 288 /* if the device was busmaster before the suspend, make it busmaster again */
258 if (pci_dev->is_busmaster) 289 if (pci_dev->is_busmaster)
259 pci_set_master(pci_dev); 290 pci_set_master(pci_dev);
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index c62d2f043397..992db89adce7 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -222,6 +222,37 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res)
222} 222}
223 223
224/** 224/**
225 * pci_restore_bars - restore a devices BAR values (e.g. after wake-up)
226 * @dev: PCI device to have its BARs restored
227 *
228 * Restore the BAR values for a given device, so as to make it
229 * accessible by its driver.
230 */
231void
232pci_restore_bars(struct pci_dev *dev)
233{
234 int i, numres;
235
236 switch (dev->hdr_type) {
237 case PCI_HEADER_TYPE_NORMAL:
238 numres = 6;
239 break;
240 case PCI_HEADER_TYPE_BRIDGE:
241 numres = 2;
242 break;
243 case PCI_HEADER_TYPE_CARDBUS:
244 numres = 1;
245 break;
246 default:
247 /* Should never get here, but just in case... */
248 return;
249 }
250
251 for (i = 0; i < numres; i ++)
252 pci_update_resource(dev, &dev->resource[i], i);
253}
254
255/**
225 * pci_set_power_state - Set the power state of a PCI device 256 * pci_set_power_state - Set the power state of a PCI device
226 * @dev: PCI device to be suspended 257 * @dev: PCI device to be suspended
227 * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering 258 * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering
@@ -239,7 +270,7 @@ int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t t);
239int 270int
240pci_set_power_state(struct pci_dev *dev, pci_power_t state) 271pci_set_power_state(struct pci_dev *dev, pci_power_t state)
241{ 272{
242 int pm; 273 int pm, need_restore = 0;
243 u16 pmcsr, pmc; 274 u16 pmcsr, pmc;
244 275
245 /* bound the state we're entering */ 276 /* bound the state we're entering */
@@ -263,7 +294,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
263 return -EIO; 294 return -EIO;
264 295
265 pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); 296 pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc);
266 if ((pmc & PCI_PM_CAP_VER_MASK) > 2) { 297 if ((pmc & PCI_PM_CAP_VER_MASK) > 3) {
267 printk(KERN_DEBUG 298 printk(KERN_DEBUG
268 "PCI: %s has unsupported PM cap regs version (%u)\n", 299 "PCI: %s has unsupported PM cap regs version (%u)\n",
269 pci_name(dev), pmc & PCI_PM_CAP_VER_MASK); 300 pci_name(dev), pmc & PCI_PM_CAP_VER_MASK);
@@ -271,21 +302,22 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
271 } 302 }
272 303
273 /* check if this device supports the desired state */ 304 /* check if this device supports the desired state */
274 if (state == PCI_D1 || state == PCI_D2) { 305 if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1))
275 if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1)) 306 return -EIO;
276 return -EIO; 307 else if (state == PCI_D2 && !(pmc & PCI_PM_CAP_D2))
277 else if (state == PCI_D2 && !(pmc & PCI_PM_CAP_D2)) 308 return -EIO;
278 return -EIO; 309
279 } 310 pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
280 311
281 /* If we're in D3, force entire word to 0. 312 /* If we're in D3, force entire word to 0.
282 * This doesn't affect PME_Status, disables PME_En, and 313 * This doesn't affect PME_Status, disables PME_En, and
283 * sets PowerState to 0. 314 * sets PowerState to 0.
284 */ 315 */
285 if (dev->current_state >= PCI_D3hot) 316 if (dev->current_state >= PCI_D3hot) {
317 if (!(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET))
318 need_restore = 1;
286 pmcsr = 0; 319 pmcsr = 0;
287 else { 320 } else {
288 pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
289 pmcsr &= ~PCI_PM_CTRL_STATE_MASK; 321 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
290 pmcsr |= state; 322 pmcsr |= state;
291 } 323 }
@@ -308,6 +340,22 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
308 platform_pci_set_power_state(dev, state); 340 platform_pci_set_power_state(dev, state);
309 341
310 dev->current_state = state; 342 dev->current_state = state;
343
344 /* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
345 * INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
346 * from D3hot to D0 _may_ perform an internal reset, thereby
347 * going to "D0 Uninitialized" rather than "D0 Initialized".
348 * For example, at least some versions of the 3c905B and the
349 * 3c556B exhibit this behaviour.
350 *
351 * At least some laptop BIOSen (e.g. the Thinkpad T21) leave
352 * devices in a D3hot state at boot. Consequently, we need to
353 * restore at least the BARs so that the device will be
354 * accessible to its driver.
355 */
356 if (need_restore)
357 pci_restore_bars(dev);
358
311 return 0; 359 return 0;
312} 360}
313 361
@@ -394,8 +442,11 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
394{ 442{
395 int err; 443 int err;
396 444
397 pci_set_power_state(dev, PCI_D0); 445 err = pci_set_power_state(dev, PCI_D0);
398 if ((err = pcibios_enable_device(dev, bars)) < 0) 446 if (err < 0 && err != -EIO)
447 return err;
448 err = pcibios_enable_device(dev, bars);
449 if (err < 0)
399 return err; 450 return err;
400 return 0; 451 return 0;
401} 452}
@@ -747,6 +798,31 @@ pci_clear_mwi(struct pci_dev *dev)
747 } 798 }
748} 799}
749 800
801/**
802 * pci_intx - enables/disables PCI INTx for device dev
803 * @dev: the PCI device to operate on
804 * @enable: boolean
805 *
806 * Enables/disables PCI INTx for device dev
807 */
808void
809pci_intx(struct pci_dev *pdev, int enable)
810{
811 u16 pci_command, new;
812
813 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
814
815 if (enable) {
816 new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
817 } else {
818 new = pci_command | PCI_COMMAND_INTX_DISABLE;
819 }
820
821 if (new != pci_command) {
822 pci_write_config_word(pdev, PCI_COMMAND, new);
823 }
824}
825
750#ifndef HAVE_ARCH_PCI_SET_DMA_MASK 826#ifndef HAVE_ARCH_PCI_SET_DMA_MASK
751/* 827/*
752 * These can be overridden by arch-specific implementations 828 * These can be overridden by arch-specific implementations
@@ -809,6 +885,7 @@ struct pci_dev *isa_bridge;
809EXPORT_SYMBOL(isa_bridge); 885EXPORT_SYMBOL(isa_bridge);
810#endif 886#endif
811 887
888EXPORT_SYMBOL_GPL(pci_restore_bars);
812EXPORT_SYMBOL(pci_enable_device_bars); 889EXPORT_SYMBOL(pci_enable_device_bars);
813EXPORT_SYMBOL(pci_enable_device); 890EXPORT_SYMBOL(pci_enable_device);
814EXPORT_SYMBOL(pci_disable_device); 891EXPORT_SYMBOL(pci_disable_device);
@@ -823,6 +900,7 @@ EXPORT_SYMBOL(pci_request_region);
823EXPORT_SYMBOL(pci_set_master); 900EXPORT_SYMBOL(pci_set_master);
824EXPORT_SYMBOL(pci_set_mwi); 901EXPORT_SYMBOL(pci_set_mwi);
825EXPORT_SYMBOL(pci_clear_mwi); 902EXPORT_SYMBOL(pci_clear_mwi);
903EXPORT_SYMBOL_GPL(pci_intx);
826EXPORT_SYMBOL(pci_set_dma_mask); 904EXPORT_SYMBOL(pci_set_dma_mask);
827EXPORT_SYMBOL(pci_set_consistent_dma_mask); 905EXPORT_SYMBOL(pci_set_consistent_dma_mask);
828EXPORT_SYMBOL(pci_assign_resource); 906EXPORT_SYMBOL(pci_assign_resource);
diff --git a/drivers/pci/pci.ids b/drivers/pci/pci.ids
deleted file mode 100644
index 1d2ef1e2ffc6..000000000000
--- a/drivers/pci/pci.ids
+++ /dev/null
@@ -1,10180 +0,0 @@
1#
2# List of PCI ID's
3#
4# Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the
5# Linux PCI ID's Project at http://pciids.sf.net/. New data are always
6# welcome (if they are accurate), we're eagerly expecting new entries,
7# so if you have anything to contribute, please visit the home page or
8# send a diff -u against the most recent pci.ids to pci-ids@ucw.cz.
9#
10# Daily snapshot on Tue 2005-03-08 10:11:48
11#
12
13# Vendors, devices and subsystems. Please keep sorted.
14
15# Syntax:
16# vendor vendor_name
17# device device_name <-- single tab
18# subvendor subdevice subsystem_name <-- two tabs
19
200000 Gammagraphx, Inc.
21001a Ascend Communications, Inc.
220033 Paradyne corp.
23003d Lockheed Martin-Marietta Corp
24# Real TJN ID is e159, but they got it wrong several times --mj
250059 Tiger Jet Network Inc. (Wrong ID)
260070 Hauppauge computer works Inc.
27 4000 WinTV PVR-350
28 4001 WinTV PVR-250 (v1)
29 4009 WinTV PVR-250
30 4801 WinTV PVR-250 MCE
310071 Nebula Electronics Ltd.
320095 Silicon Image, Inc. (Wrong ID)
33 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD
340100 Ncipher Corp Ltd
35# 018a is not LevelOne but there is a board misprogrammed
36018a LevelOne
37 0106 FPC-0106TX misprogrammed [RTL81xx]
38# 021b is not Compaq but there is a board misprogrammed
39021b Compaq Computer Corporation
40 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking]
41# http://www.davicom.com.tw/
420291 Davicom Semiconductor, Inc.
43 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)
44# SpeedStream is Efficient Networks, Inc, a Siemens Company
4502ac SpeedStream
46 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]
470357 TTTech AG
48 000a TTP-Monitoring Card V2.0
490432 SCM Microsystems, Inc.
50 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]
5105e3 CyberDoor
52 0701 CBD516
530675 Dynalink
54 1700 IS64PH ISDN Adapter
55 1702 IS64PH ISDN Adapter
56# Wrong ID used in subsystem ID of VIA USB controllers.
570925 VIA Technologies, Inc. (Wrong ID)
5809c1 Arris
59 0704 CM 200E Cable Modem
600a89 BREA Technologies Inc
610b49 ASCII Corporation
62# see http://homepage1.nifty.com/mcn/lab/machines/trance_vibrator/usbview.vib.txt
63 064f Trance Vibrator
640e11 Compaq Computer Corporation
65 0001 PCI to EISA Bridge
66 0002 PCI to ISA Bridge
67 0046 Smart Array 64xx
68 0e11 409a Smart Array 641
69 0e11 409b Smart Array 642
70 0e11 409c Smart Array 6400
71 0e11 409d Smart Array 6400 EM
72 0049 NC7132 Gigabit Upgrade Module
73 004a NC6136 Gigabit Server Adapter
74 007c NC7770 1000BaseTX
75 007d NC6770 1000BaseTX
76 0085 NC7780 1000BaseTX
77 00bb NC7760
78 00ca NC7771
79 00cb NC7781
80 00cf NC7772
81 00d0 NC7782
82 00d1 NC7783
83 00e3 NC7761
84 0508 Netelligent 4/16 Token Ring
85 1000 Triflex/Pentium Bridge, Model 1000
86 2000 Triflex/Pentium Bridge, Model 2000
87 3032 QVision 1280/p
88 3033 QVision 1280/p
89 3034 QVision 1280/p
90 4000 4000 [Triflex]
91 4030 SMART-2/P
92 4031 SMART-2SL
93 4032 Smart Array 3200
94 4033 Smart Array 3100ES
95 4034 Smart Array 221
96 4040 Integrated Array
97 4048 Compaq Raid LC2
98 4050 Smart Array 4200
99 4051 Smart Array 4250ES
100 4058 Smart Array 431
101 4070 Smart Array 5300
102 4080 Smart Array 5i
103 4082 Smart Array 532
104 4083 Smart Array 5312
105 4091 Smart Array 6i
106 409a Smart Array 641
107 409b Smart Array 642
108 409c Smart Array 6400
109 409d Smart Array 6400 EM
110 6010 HotPlug PCI Bridge 6010
111 7020 USB Controller
112 a0ec Fibre Channel Host Controller
113 a0f0 Advanced System Management Controller
114 a0f3 Triflex PCI to ISA Bridge
115 a0f7 PCI Hotplug Controller
116 8086 002a PCI Hotplug Controller A
117 8086 002b PCI Hotplug Controller B
118 a0f8 ZFMicro Chipset USB
119 a0fc FibreChannel HBA Tachyon
120 ae10 Smart-2/P RAID Controller
121 0e11 4030 Smart-2/P Array Controller
122 0e11 4031 Smart-2SL Array Controller
123 0e11 4032 Smart Array Controller
124 0e11 4033 Smart 3100ES Array Controller
125 ae29 MIS-L
126 ae2a MPC
127 ae2b MIS-E
128 ae31 System Management Controller
129 ae32 Netelligent 10/100 TX PCI UTP
130 ae33 Triflex Dual EIDE Controller
131 ae34 Netelligent 10 T PCI UTP
132 ae35 Integrated NetFlex-3/P
133 ae40 Netelligent Dual 10/100 TX PCI UTP
134 ae43 Netelligent Integrated 10/100 TX UTP
135 ae69 CETUS-L
136 ae6c Northstar
137 ae6d NorthStar CPU to PCI Bridge
138 b011 Netelligent 10/100 TX Embedded UTP
139 b012 Netelligent 10 T/2 PCI UTP/Coax
140 b01e NC3120 Fast Ethernet NIC
141 b01f NC3122 Fast Ethernet NIC
142 b02f NC1120 Ethernet NIC
143 b030 Netelligent 10/100 TX UTP
144 b04a 10/100 TX PCI Intel WOL UTP Controller
145 b060 Smart Array 5300 Controller
146 b0c6 NC3161 Fast Ethernet NIC
147 b0c7 NC3160 Fast Ethernet NIC
148 b0d7 NC3121 Fast Ethernet NIC
149 b0dd NC3131 Fast Ethernet NIC
150 b0de NC3132 Fast Ethernet Module
151 b0df NC6132 Gigabit Module
152 b0e0 NC6133 Gigabit Module
153 b0e1 NC3133 Fast Ethernet Module
154 b123 NC6134 Gigabit NIC
155 b134 NC3163 Fast Ethernet NIC
156 b13c NC3162 Fast Ethernet NIC
157 b144 NC3123 Fast Ethernet NIC
158 b163 NC3134 Fast Ethernet NIC
159 b164 NC3165 Fast Ethernet Upgrade Module
160 b178 Smart Array 5i/532
161 0e11 4080 Smart Array 5i
162 0e11 4082 Smart Array 532
163 0e11 4083 Smart Array 5312
164 b1a4 NC7131 Gigabit Server Adapter
165# HP Memory Hot-Plug Controller
166 b200 Memory Hot-Plug Controller
167 b203 Integrated Lights Out Controller
168 b204 Integrated Lights Out Processor
169 f130 NetFlex-3/P ThunderLAN 1.0
170 f150 NetFlex-3/P ThunderLAN 2.3
1710e55 HaSoTec GmbH
172# Formerly NCR
1731000 LSI Logic / Symbios Logic
174 0001 53c810
175 1000 1000 LSI53C810AE PCI to SCSI I/O Processor
176 0002 53c820
177 0003 53c825
178 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)
179 0004 53c815
180 0005 53c810AP
181 0006 53c860
182 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor
183 000a 53c1510
184 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
185 000b 53C896/897
186 0e11 6004 EOB003 Series SCSI host adapter
187 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
188 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter
189 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter
190# multifunction PCI card: Dual U2W SCSI, dual 10/100TX, graphics
191 13e9 1000 6221L-4U
192 000c 53c895
193 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter
194 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter
195 1de1 3906 DC-390U2B SCSI adapter
196 1de1 3907 DC-390U2W
197 000d 53c885
198 000f 53c875
199 0e11 7004 Embedded Ultra Wide SCSI Controller
200 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller
201 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter
202 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter
203 1092 8760 FirePort 40 Dual SCSI Controller
204 1de1 3904 DC390F/U Ultra Wide SCSI Adapter
205 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
206 4c53 1050 CT7 mainboard
207 0010 53C1510
208 0e11 4040 Integrated Array Controller
209 0e11 4048 RAID LC2 Controller
210 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)
211 0012 53c895a
212 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller
213 0013 53c875a
214 1000 1000 LSI53C875A PCI to Ultra SCSI Controller
215 0020 53c1010 Ultra3 SCSI Adapter
216 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller
217 1de1 1020 DC-390U3W
218 0021 53c1010 66MHz Ultra3 SCSI Adapter
219 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller
220 1000 1010 Asus TR-DLS onboard 53C1010-66
221 124b 1070 PMC-USCSI3
222 4c53 1080 CT8 mainboard
223 4c53 1300 P017 mezzanine (32-bit PMC)
224 4c53 1310 P017 mezzanine (64-bit PMC)
225 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI
226 1028 0123 PowerEdge 2600
227 1028 014a PowerEdge 1750
228 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)
229 1028 0183 PowerEdge 1800
230 1028 1010 LSI U320 SCSI Controller
231 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
232 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
233 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller
234 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
235 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
236 1000 0033 MegaRAID SCSI 320-2XR
237 1000 0066 MegaRAID SCSI 320-2XRWS
238 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
239 008f 53c875J
240 1092 8000 FirePort 40 SCSI Controller
241 1092 8760 FirePort 40 Dual SCSI Host Adapter
242 0407 MegaRAID
243 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller
244 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller
245 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller
246 1028 0531 PowerEdge Expandable RAID Controller 4/QC
247 1028 0533 PowerEdge Expandable RAID Controller 4/QC
248 8086 0530 MegaRAID Intel RAID Controller SRCZCRX
249 8086 0532 MegaRAID Intel RAID Controller SRCU42X
250 0408 MegaRAID
251 1000 0001 MegaRAID SCSI 320-1E RAID Controller
252 1000 0002 MegaRAID SCSI 320-2E RAID Controller
253 1025 004d MegaRAID ACER ROMB-2E RAID Controller
254 1028 0001 PowerEdge RAID Controller PERC4e/SC
255 1028 0002 PowerEdge RAID Controller PERC4e/DC
256 1734 1065 FSC MegaRAID PCI Express ROMB
257 8086 0002 MegaRAID Intel RAID Controller SRCU42E
258 0409 MegaRAID
259 1000 3004 MegaRAID SATA 300-4X RAID Controller
260 1000 3008 MegaRAID SATA 300-8X RAID Controller
261 8086 3008 MegaRAID RAID Controller SRCS28X
262 8086 3431 MegaRAID RAID Controller Alief SROMBU42E
263 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E
264 0621 FC909 Fibre Channel Adapter
265 0622 FC929 Fibre Channel Adapter
266 1000 1020 44929 O Dual Fibre Channel card
267 0623 FC929 LAN
268 0624 FC919 Fibre Channel Adapter
269 0625 FC919 LAN
270 0626 FC929X Fibre Channel Adapter
271 1000 1010 7202-XP-LC Dual Fibre Channel card
272 0627 FC929X LAN
273 0628 FC919X Fibre Channel Adapter
274 0629 FC919X LAN
275 0701 83C885 NT50 DigitalScape Fast Ethernet
276 0702 Yellowfin G-NIC gigabit ethernet
277 1318 0000 PEI100X
278 0804 SA2010
279 0805 SA2010ZC
280 0806 SA2020
281 0807 SA2020ZC
282 0901 61C102
283 1000 63C815
284 1960 MegaRAID
285 1000 0518 MegaRAID 518 SCSI 320-2 Controller
286 1000 0520 MegaRAID 520 SCSI 320-1 Controller
287 1000 0522 MegaRAID 522 i4 133 RAID Controller
288 1000 0523 MegaRAID SATA 150-6 RAID Controller
289 1000 4523 MegaRAID SATA 150-4 RAID Controller
290 1000 a520 MegaRAID ZCR SCSI 320-0 Controller
291 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller
292 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller
293 1028 0531 PowerEdge Expandable RAID Controller 4/QC
294 1028 0533 PowerEdge Expandable RAID Controller 4/QC
295 8086 0520 MegaRAIDRAID Controller SRCU41L
296 8086 0523 MegaRAID RAID Controller SRCS16
2971001 Kolter Electronic
298 0010 PCI 1616 Measurement card with 32 digital I/O lines
299 0011 OPTO-PCI Opto-Isolated digital I/O board
300 0012 PCI-AD/DA Analogue I/O board
301 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs
302 0014 PCI-Counter/Timer Counter Timer board
303 0015 PCI-DAC416 Analogue output board
304 0016 PCI-MFB Analogue I/O board
305 0017 PROTO-3 PCI Prototyping board
306 9100 INI-9100/9100W SCSI Host
3071002 ATI Technologies Inc
308 3150 M24 1P [Radeon Mobility X600]
309 3154 M24 1T [FireGL M24 GL]
310 3e50 RV380 0x3e50 [Radeon X600]
311 3e54 RV380 0x3e54 [FireGL V3200]
312 3e70 RV380 [Radeon X600] Secondary
313 4136 Radeon IGP 320 M
314 4137 Radeon IGP330/340/350
315 4144 R300 AD [Radeon 9500 Pro]
316# New PCI ID provided by ATI developer relations (correction to above)
317 4145 R300 AE [Radeon 9700 Pro]
318# New PCI ID provided by ATI developer relations (oops, correction to above)
319 4146 R300 AF [Radeon 9700 Pro]
320 4147 R300 AG [FireGL Z1/X1]
321 4148 R350 AH [Radeon 9800]
322 4149 R350 AI [Radeon 9800]
323 414a R350 AJ [Radeon 9800]
324 414b R350 AK [Fire GL X2]
325# New PCI ID provided by ATI developer relations
326 4150 RV350 AP [Radeon 9600]
327 1002 0002 R9600 Pro primary (Asus OEM for HP)
328 1002 0003 R9600 Pro secondary (Asus OEM for HP)
329 1458 4024 Giga-Byte GV-R96128D Primary
330 148c 2064 PowerColor R96A-C3N
331 148c 2066 PowerColor R96A-C3N
332 174b 7c19 Sapphire Atlantis Radeon 9600 Pro
333 174b 7c29 GC-R9600PRO Primary [Sapphire]
334 17ee 2002 Radeon 9600 256Mb Primary
335 18bc 0101 GC-R9600PRO Primary
336# New PCI ID provided by ATI developer relations
337 4151 RV350 AQ [Radeon 9600]
338 1043 c004 A9600SE
339# New PCI ID provided by ATI developer relations
340 4152 RV350 AR [Radeon 9600]
341 1002 0002 Radeon 9600XT
342 1043 c002 Radeon 9600 XT TVD
343 174b 7c29 Sapphire Radeon 9600XT
344 1787 4002 Radeon 9600 XT
345 4153 RV350 AS [Radeon 9600 AS]
346 4154 RV350 AT [Fire GL T2]
347 4155 RV350 AU [Fire GL T2]
348 4156 RV350 AV [Fire GL T2]
349 4157 RV350 AW [Fire GL T2]
350 4158 68800AX [Mach32]
351# The PCI ID is unrelated to any DVI output.
352 4164 R300 AD [Radeon 9500 Pro] (Secondary)
353# New PCI ID info provided by ATI developer relations
354 4165 R300 AE [Radeon 9700 Pro] (Secondary)
355# New PCI ID info provided by ATI developer relations
356 4166 R300 AF [Radeon 9700 Pro] (Secondary)
357# New PCI ID provided by ATI developer relations
358 4168 Radeon R350 [Radeon 9800] (Secondary)
359# New PCI ID provided by ATI developer relations (correction to above)
360 4170 RV350 AP [Radeon 9600] (Secondary)
361 1458 4025 Giga-Byte GV-R96128D Secondary
362 148c 2067 PowerColor R96A-C3N (Secondary)
363 174b 7c28 GC-R9600PRO Secondary [Sapphire]
364 17ee 2003 Radeon 9600 256Mb Secondary
365 18bc 0100 GC-R9600PRO Secondary
366# New PCI ID provided by ATI developer relations (correction to above)
367 4171 RV350 AQ [Radeon 9600] (Secondary)
368 1043 c005 A9600SE (Secondary)
369# New PCI ID provided by ATI developer relations (correction to above)
370 4172 RV350 AR [Radeon 9600] (Secondary)
371 1002 0003 Radeon 9600XT (Secondary)
372 1043 c003 A9600XT (Secondary)
373 174b 7c28 Sapphire Radeon 9600XT (Secondary)
374 1787 4003 Radeon 9600 XT (Secondary)
375 4173 RV350 ?? [Radeon 9550] (Secondary)
376 4237 Radeon 7000 IGP
377 4242 R200 BB [Radeon All in Wonder 8500DV]
378 1002 02aa Radeon 8500 AIW DV Edition
379 4243 R200 BC [Radeon All in Wonder 8500]
380 4336 Radeon Mobility U1
381 103c 0024 Pavilion ze4400 builtin Video
382 4337 Radeon IGP 330M/340M/350M
383 1014 053a ThinkPad R40e (2684-HVG) builtin VGA controller
384 103c 0850 Radeon IGP 345M
385 4341 IXP150 AC'97 Audio Controller
386 4345 EHCI USB Controller
387 4347 OHCI USB Controller #1
388 4348 OHCI USB Controller #2
389 4349 ATI Dual Channel Bus Master PCI IDE Controller
390 434d IXP AC'97 Modem
391 4353 ATI SMBus
392 4354 215CT [Mach64 CT]
393 4358 210888CX [Mach64 CX]
394 4363 ATI SMBus
395 436e ATI 436E Serial ATA Controller
396 4372 ATI SMBus
397 4376 Standard Dual Channel PCI IDE Controller ATI
398 4379 ATI 4379 Serial ATA Controller
399 437a ATI 437A Serial ATA Controller
400 4437 Radeon Mobility 7000 IGP
401 4554 210888ET [Mach64 ET]
402 4654 Mach64 VT
403 4742 3D Rage Pro AGP 1X/2X
404 1002 0040 Rage Pro Turbo AGP 2X
405 1002 0044 Rage Pro Turbo AGP 2X
406 1002 0061 Rage Pro AIW AGP 2X
407 1002 0062 Rage Pro AIW AGP 2X
408 1002 0063 Rage Pro AIW AGP 2X
409 1002 0080 Rage Pro Turbo AGP 2X
410 1002 0084 Rage Pro Turbo AGP 2X
411 1002 4742 Rage Pro Turbo AGP 2X
412 1002 8001 Rage Pro Turbo AGP 2X
413 1028 0082 Rage Pro Turbo AGP 2X
414 1028 4082 Optiplex GX1 Onboard Display Adapter
415 1028 8082 Rage Pro Turbo AGP 2X
416 1028 c082 Rage Pro Turbo AGP 2X
417 8086 4152 Xpert 98D AGP 2X
418 8086 464a Rage Pro Turbo AGP 2X
419 4744 3D Rage Pro AGP 1X
420 1002 4744 Rage Pro Turbo AGP
421 4747 3D Rage Pro
422 4749 3D Rage Pro
423 1002 0061 Rage Pro AIW
424 1002 0062 Rage Pro AIW
425 474c Rage XC
426 474d Rage XL AGP 2X
427 1002 0004 Xpert 98 RXL AGP 2X
428 1002 0008 Xpert 98 RXL AGP 2X
429 1002 0080 Rage XL AGP 2X
430 1002 0084 Xpert 98 AGP 2X
431 1002 474d Rage XL AGP
432 1033 806a Rage XL AGP
433 474e Rage XC AGP
434 1002 474e Rage XC AGP
435 474f Rage XL
436 1002 0008 Rage XL
437 1002 474f Rage XL
438 4750 3D Rage Pro 215GP
439 1002 0040 Rage Pro Turbo
440 1002 0044 Rage Pro Turbo
441 1002 0080 Rage Pro Turbo
442 1002 0084 Rage Pro Turbo
443 1002 4750 Rage Pro Turbo
444 4751 3D Rage Pro 215GQ
445 4752 Rage XL
446 1002 0008 Rage XL
447 1002 4752 Rage XL
448 1002 8008 Rage XL
449 1028 00ce PowerEdge 1400
450 1028 00d1 PowerEdge 2550
451 1028 00d9 PowerEdge 2500
452 8086 3411 SDS2 Mainboard
453 8086 3427 S875WP1-E mainboard
454 4753 Rage XC
455 1002 4753 Rage XC
456 4754 3D Rage I/II 215GT [Mach64 GT]
457 4755 3D Rage II+ 215GTB [Mach64 GTB]
458 4756 3D Rage IIC 215IIC [Mach64 GT IIC]
459 1002 4756 Rage IIC
460 4757 3D Rage IIC AGP
461 1002 4757 Rage IIC AGP
462 1028 0089 Rage 3D IIC
463 1028 4082 Rage 3D IIC
464 1028 8082 Rage 3D IIC
465 1028 c082 Rage 3D IIC
466 4758 210888GX [Mach64 GX]
467 4759 3D Rage IIC
468 475a 3D Rage IIC AGP
469 1002 0084 Rage 3D Pro AGP 2x XPERT 98
470 1002 0087 Rage 3D IIC
471 1002 475a Rage IIC AGP
472 4964 Radeon RV250 Id [Radeon 9000]
473 4965 Radeon RV250 Ie [Radeon 9000]
474 4966 Radeon RV250 If [Radeon 9000]
475 10f1 0002 RV250 If [Tachyon G9000 PRO]
476 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"]
477 1509 9a00 RV250 If [Radeon 9000 "AT009"]
478# New subdevice - 3D Prophet 9000 PCI by Hercules. AGP version probably would have same ID, so not specified.
479 1681 0040 RV250 If [3D prophet 9000]
480 174b 7176 RV250 If [Sapphire Radeon 9000 Pro]
481 174b 7192 RV250 If [Radeon 9000 "Atlantis"]
482 17af 2005 RV250 If [Excalibur Radeon 9000 Pro]
483 17af 2006 RV250 If [Excalibur Radeon 9000]
484 4967 Radeon RV250 Ig [Radeon 9000]
485 496e Radeon RV250 [Radeon 9000] (Secondary)
486 4a48 R420 JH [Radeon X800]
487 4a49 R420 JI [Radeon X800PRO]
488 4a4a R420 JJ [Radeon X800SE]
489 4a4b R420 JK [Radeon X800]
490 4a4c R420 JL [Radeon X800]
491 4a4d R420 JM [FireGL X3]
492 4a4e M18 JN [Radeon Mobility 9800]
493 4a50 R420 JP [Radeon X800XT]
494 4a70 R420 [X800XT-PE] (Secondary)
495 4c42 3D Rage LT Pro AGP-133
496 0e11 b0e7 Rage LT Pro (Compaq Presario 5240)
497 0e11 b0e8 Rage 3D LT Pro
498 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750)
499 1002 0040 Rage LT Pro AGP 2X
500 1002 0044 Rage LT Pro AGP 2X
501 1002 4c42 Rage LT Pro AGP 2X
502 1002 8001 Rage LT Pro AGP 2X
503 1028 0085 Rage 3D LT Pro
504 4c44 3D Rage LT Pro AGP-66
505 4c45 Rage Mobility M3 AGP
506 4c46 Rage Mobility M3 AGP 2x
507 1028 00b1 Latitude C600
508 4c47 3D Rage LT-G 215LG
509 4c49 3D Rage LT Pro
510 1002 0004 Rage LT Pro
511 1002 0040 Rage LT Pro
512 1002 0044 Rage LT Pro
513 1002 4c49 Rage LT Pro
514 4c4d Rage Mobility P/M AGP 2x
515 0e11 b111 Armada M700
516 0e11 b160 Armada E500
517 1002 0084 Xpert 98 AGP 2X (Mobility)
518 1014 0154 ThinkPad A20m
519 1028 00aa Latitude CPt
520 1028 00bb Latitude CPx
521 4c4e Rage Mobility L AGP 2x
522 4c50 3D Rage LT Pro
523 1002 4c50 Rage LT Pro
524 4c51 3D Rage LT Pro
525 4c52 Rage Mobility P/M
526 1033 8112 Versa Note VXi
527 4c53 Rage Mobility L
528 4c54 264LT [Mach64 LT]
529 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500]
530 1014 0517 ThinkPad T30
531 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100)
532 1028 012a Latitude C640
533 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4
534 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7]
535 4c59 Radeon Mobility M6 LY
536 1014 0235 ThinkPad A30/A30p (2652/2653)
537 1014 0239 ThinkPad X22/X23/X24
538 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
539 4c5a Radeon Mobility M6 LZ
540 4c64 Radeon R250 Ld [Radeon Mobility 9000 M9]
541 4c65 Radeon R250 Le [Radeon Mobility 9000 M9]
542 4c66 Radeon R250 Lf [FireGL 9000]
543 4c67 Radeon R250 Lg [Radeon Mobility 9000 M9]
544# Secondary chip to the Lf
545 4c6e Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary]
546 4d46 Rage Mobility M4 AGP
547 4d4c Rage Mobility M4 AGP
548 4e44 Radeon R300 ND [Radeon 9700 Pro]
549 4e45 Radeon R300 NE [Radeon 9500 Pro]
550 1002 0002 Radeon R300 NE [Radeon 9500 Pro]
551 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]
552# New PCI ID provided by ATI developer relations (correction to above)
553 4e46 RV350 NF [Radeon 9600]
554 4e47 Radeon R300 NG [FireGL X1]
555# (added pro)
556 4e48 Radeon R350 [Radeon 9800 Pro]
557# New PCI ID provided by ATI developer relations
558 4e49 Radeon R350 [Radeon 9800]
559 4e4a RV350 NJ [Radeon 9800 XT]
560 4e4b R350 NK [Fire GL X2]
561# New PCI ID provided by ATI developer relations
562 4e50 RV350 [Mobility Radeon 9600 M10]
563 1025 005a TravelMate 290
564 103c 088c nc8000 laptop
565 103c 0890 nc6000 laptop
566 1734 1055 Amilo M1420W
567 4e51 M10 NQ [Radeon Mobility 9600]
568 4e52 RV350 [Mobility Radeon 9600 M10]
569 4e53 M10 NS [Radeon Mobility 9600]
570 4e54 M10 NT [FireGL Mobility T2]
571 4e56 M11 NV [FireGL Mobility T2e]
572 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary)
573 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary)
574 1002 0003 Radeon R300 NE [Radeon 9500 Pro]
575 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)
576# New PCI ID provided by ATI developer relations (correction to above)
577 4e66 RV350 NF [Radeon 9600] (Secondary)
578 4e67 Radeon R300 [FireGL X1] (Secondary)
579# (added pro)
580 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary)
581# New PCI ID provided by ATI developer relations
582 4e69 Radeon R350 [Radeon 9800] (Secondary)
583 4e6a RV350 NJ [Radeon 9800 XT] (Secondary)
584 1002 4e71 ATI Technologies Inc M10 NQ [Radeon Mobility 9600]
585 5041 Rage 128 PA/PRO
586 5042 Rage 128 PB/PRO AGP 2x
587 5043 Rage 128 PC/PRO AGP 4x
588 5044 Rage 128 PD/PRO TMDS
589 1002 0028 Rage 128 AIW
590 1002 0029 Rage 128 AIW
591 5045 Rage 128 PE/PRO AGP 2x TMDS
592 5046 Rage 128 PF/PRO AGP 4x TMDS
593 1002 0004 Rage Fury Pro
594 1002 0008 Rage Fury Pro/Xpert 2000 Pro
595 1002 0014 Rage Fury Pro
596 1002 0018 Rage Fury Pro/Xpert 2000 Pro
597 1002 0028 Rage 128 Pro AIW AGP
598 1002 002a Rage 128 Pro AIW AGP
599 1002 0048 Rage Fury Pro
600 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device)
601 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)
602 5047 Rage 128 PG/PRO
603 5048 Rage 128 PH/PRO AGP 2x
604 5049 Rage 128 PI/PRO AGP 4x
605 504a Rage 128 PJ/PRO TMDS
606 504b Rage 128 PK/PRO AGP 2x TMDS
607 504c Rage 128 PL/PRO AGP 4x TMDS
608 504d Rage 128 PM/PRO
609 504e Rage 128 PN/PRO AGP 2x
610 504f Rage 128 PO/PRO AGP 4x
611 5050 Rage 128 PP/PRO TMDS [Xpert 128]
612 1002 0008 Xpert 128
613 5051 Rage 128 PQ/PRO AGP 2x TMDS
614 5052 Rage 128 PR/PRO AGP 4x TMDS
615 5053 Rage 128 PS/PRO
616 5054 Rage 128 PT/PRO AGP 2x
617 5055 Rage 128 PU/PRO AGP 4x
618 5056 Rage 128 PV/PRO TMDS
619 5057 Rage 128 PW/PRO AGP 2x TMDS
620 5058 Rage 128 PX/PRO AGP 4x TMDS
621 5144 Radeon R100 QD [Radeon 7200]
622 1002 0008 Radeon 7000/Radeon VE
623 1002 0009 Radeon 7000/Radeon
624 1002 000a Radeon 7000/Radeon
625 1002 001a Radeon 7000/Radeon
626 1002 0029 Radeon AIW
627 1002 0038 Radeon 7000/Radeon
628 1002 0039 Radeon 7000/Radeon
629 1002 008a Radeon 7000/Radeon
630 1002 00ba Radeon 7000/Radeon
631 1002 0139 Radeon 7000/Radeon
632 1002 028a Radeon 7000/Radeon
633 1002 02aa Radeon AIW
634 1002 053a Radeon 7000/Radeon
635 5145 Radeon R100 QE
636 5146 Radeon R100 QF
637 5147 Radeon R100 QG
638 5148 Radeon R200 QH [Radeon 8500]
639 1002 010a FireGL 8800 64Mb
640 1002 0152 FireGL 8800 128Mb
641 1002 0162 FireGL 8700 32Mb
642 1002 0172 FireGL 8700 64Mb
643 5149 Radeon R200 QI
644 514a Radeon R200 QJ
645 514b Radeon R200 QK
646 514c Radeon R200 QL [Radeon 8500 LE]
647 1002 003a Radeon R200 QL [Radeon 8500 LE]
648 1002 013a Radeon 8500
649 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition]
650 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb]
651 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE]
652 514d Radeon R200 QM [Radeon 9100]
653 514e Radeon R200 QN [Radeon 8500LE]
654 514f Radeon R200 QO [Radeon 8500LE]
655 5154 R200 QT [Radeon 8500]
656 5155 R200 QU [Radeon 9100]
657 5157 Radeon RV200 QW [Radeon 7500]
658 1002 013a Radeon 7500
659 1002 103a Dell Optiplex GX260
660 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR]
661 148c 2024 RV200 QW [Radeon 7500LE Dual Display]
662 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition]
663 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display]
664 174b 7146 RV200 QW [Radeon 7500 LE]
665 174b 7147 RV200 QW [Sapphire Radeon 7500LE]
666 174b 7161 Radeon RV200 QW [Radeon 7500 LE]
667 17af 0202 RV200 QW [Excalibur Radeon 7500LE]
668 5158 Radeon RV200 QX [Radeon 7500]
669 5159 Radeon RV100 QY [Radeon 7000/VE]
670 1002 000a Radeon 7000/Radeon VE
671 1002 000b Radeon 7000
672 1002 0038 Radeon 7000/Radeon VE
673 1002 003a Radeon 7000/Radeon VE
674 1002 00ba Radeon 7000/Radeon VE
675 1002 013a Radeon 7000/Radeon VE
676 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series]
677 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition]
678 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display]
679 174b 7112 RV100 QY [Sapphire Radeon VE 7000]
680 174b 7c28 Sapphire Radeon VE 7000 DDR
681 1787 0202 RV100 QY [Excalibur Radeon 7000]
682 515a Radeon RV100 QZ [Radeon 7000/VE]
683 5168 Radeon R200 Qh
684 5169 Radeon R200 Qi
685 516a Radeon R200 Qj
686 516b Radeon R200 Qk
687# This one is not in ATI documentation, but is in XFree86 source code
688 516c Radeon R200 Ql
689 5245 Rage 128 RE/SG
690 1002 0008 Xpert 128
691 1002 0028 Rage 128 AIW
692 1002 0029 Rage 128 AIW
693 1002 0068 Rage 128 AIW
694 5246 Rage 128 RF/SG AGP
695 1002 0004 Magnum/Xpert 128/Xpert 99
696 1002 0008 Magnum/Xpert128/X99/Xpert2000
697 1002 0028 Rage 128 AIW AGP
698 1002 0044 Rage Fury/Xpert 128/Xpert 2000
699 1002 0068 Rage 128 AIW AGP
700 1002 0448 Rage Fury
701 5247 Rage 128 RG
702 524b Rage 128 RK/VR
703 524c Rage 128 RL/VR AGP
704 1002 0008 Xpert 99/Xpert 2000
705 1002 0088 Xpert 99
706 5345 Rage 128 SE/4x
707 5346 Rage 128 SF/4x AGP 2x
708 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL
709 5347 Rage 128 SG/4x AGP 4x
710 5348 Rage 128 SH
711 534b Rage 128 SK/4x
712 534c Rage 128 SL/4x AGP 2x
713 534d Rage 128 SM/4x AGP 4x
714 1002 0008 Xpert 99/Xpert 2000
715 1002 0018 Xpert 2000
716 534e Rage 128 4x
717 5354 Mach 64 VT
718 1002 5654 Mach 64 reference
719 5446 Rage 128 Pro Ultra TF
720 1002 0004 Rage Fury Pro
721 1002 0008 Rage Fury Pro/Xpert 2000 Pro
722 1002 0018 Rage Fury Pro/Xpert 2000 Pro
723 1002 0028 Rage 128 AIW Pro AGP
724 1002 0029 Rage 128 AIW
725 1002 002a Rage 128 AIW Pro AGP
726 1002 002b Rage 128 AIW
727 1002 0048 Xpert 2000 Pro
728 544c Rage 128 Pro Ultra TL
729 5452 Rage 128 Pro Ultra TR
730 1002 001c Rage 128 Pro 4XL
731 103c 1279 Rage 128 Pro 4XL
732 5453 Rage 128 Pro Ultra TS
733 5454 Rage 128 Pro Ultra TT
734 5455 Rage 128 Pro Ultra TU
735 5460 M22 [Radeon Mobility M300]
736 5464 M22 [FireGL GL]
737 5548 R423 UH [Radeon X800 (PCIE)]
738 5549 R423 UI [Radeon X800PRO (PCIE)]
739 554a R423 UJ [Radeon X800LE (PCIE)]
740 554b R423 UK [Radeon X800SE (PCIE)]
741 5551 R423 UQ [FireGL V7200 (PCIE)]
742 5552 R423 UR [FireGL V5100 (PCIE)]
743 5554 R423 UT [FireGL V7100 (PCIE)]
744 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary)
745 5654 264VT [Mach64 VT]
746 1002 5654 Mach64VT Reference
747 5655 264VT3 [Mach64 VT3]
748 5656 264VT4 [Mach64 VT4]
749 5830 RS300 Host Bridge
750 5831 RS300 Host Bridge
751 5832 RS300 Host Bridge
752 5833 Radeon 9100 IGP Host Bridge
753 5834 Radeon 9100 IGP
754 5835 RS300M AGP [Radeon Mobility 9100IGP]
755 5838 Radeon 9100 IGP AGP Bridge
756 5941 RV280 [Radeon 9200] (Secondary)
757 1458 4019 Gigabyte Radeon 9200
758 174b 7c12 Sapphire Radeon 9200
759# http://www.hightech.com.hk/html/9200.htm
760 17af 200d Excalibur Radeon 9200
761 18bc 0050 GeXcube GC-R9200-C3 (Secondary)
762 5944 RV280 [Radeon 9200 SE (PCI)]
763 5960 RV280 [Radeon 9200 PRO]
764 5961 RV280 [Radeon 9200]
765 1002 2f72 All-in-Wonder 9200 Series
766 1019 4c30 Radeon 9200 VIVO
767 12ab 5961 YUAN SMARTVGA Radeon 9200
768 1458 4018 Gigabyte Radeon 9200
769 174b 7c13 Sapphire Radeon 9200
770# http://www.hightech.com.hk/html/9200.htm
771 17af 200c Excalibur Radeon 9200
772 18bc 0050 Radeon 9200 Game Buster
773 18bc 0051 GeXcube GC-R9200-C3
774 18bc 0053 Radeon 9200 Game Buster VIVO
775 5962 RV280 [Radeon 9200]
776 5964 RV280 [Radeon 9200 SE]
777 1043 c006 ASUS Radeon 9200 SE / TD / 128M
778 1458 4018 Radeon 9200 SE
779 148c 2073 CN-AG92E
780 174b 7c13 Sapphire Radeon 9200 SE
781 1787 5964 Excalibur 9200SE VIVO 128M
782 17af 2012 Radeon 9200 SE Excalibur
783 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster
784# 128MB DDR, DVI/VGA/TV out
785 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
786 5b60 RV370 5B60 [Radeon X300 (PCIE)]
787 1043 002a Extreme AX300SE-X
788 1043 032e Extreme AX300/TD
789 5b62 RV370 5B62 [Radeon X600 (PCIE)]
790 5b64 RV370 5B64 [FireGL V3100 (PCIE)]
791 5b65 RV370 5B65 [FireGL D1100 (PCIE)]
792 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]
793 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]
794 5d44 RV280 [Radeon 9200 SE] (Secondary)
795 1458 4019 Radeon 9200 SE (Secondary)
796 174b 7c12 Sapphire Radeon 9200 SE (Secondary)
797 1787 5965 Excalibur 9200SE VIVO 128M (Secondary)
798 17af 2013 Radeon 9200 SE Excalibur (Secondary)
799 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary)
800 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
801 5d4d R480 [Radeon X850XT Platinum]
802 5d57 R423 5F57 [Radeon X800XT (PCIE)]
803 700f PCI Bridge [IGP 320M]
804 7010 PCI Bridge [IGP 340M]
805 7834 Radeon 9100 PRO IGP
806 7835 Radeon Mobility 9200 IGP
807 7c37 RV350 AQ [Radeon 9600 SE]
808 cab0 AGP Bridge [IGP 320M]
809 cab2 RS200/RS200M AGP Bridge [IGP 340M]
810 cbb2 RS200/RS200M AGP Bridge [IGP 340M]
8111003 ULSI Systems
812 0201 US201
8131004 VLSI Technology Inc
814 0005 82C592-FC1
815 0006 82C593-FC1
816 0007 82C594-AFC2
817 0008 82C596/7 [Wildcat]
818 0009 82C597-AFC2
819 000c 82C541 [Lynx]
820 000d 82C543 [Lynx]
821 0101 82C532
822 0102 82C534 [Eagle]
823 0103 82C538
824 0104 82C535
825 0105 82C147
826 0200 82C975
827 0280 82C925
828 0304 QSound ThunderBird PCI Audio
829 1004 0304 QSound ThunderBird PCI Audio
830 122d 1206 DSP368 Audio
831 1483 5020 XWave Thunder 3D Audio
832 0305 QSound ThunderBird PCI Audio Gameport
833 1004 0305 QSound ThunderBird PCI Audio Gameport
834 122d 1207 DSP368 Audio Gameport
835 1483 5021 XWave Thunder 3D Audio Gameport
836 0306 QSound ThunderBird PCI Audio Support Registers
837 1004 0306 QSound ThunderBird PCI Audio Support Registers
838 122d 1208 DSP368 Audio Support Registers
839 1483 5022 XWave Thunder 3D Audio Support Registers
840 0307 Thunderbird
841 0308 Thunderbird
842 0702 VAS96011 [Golden Gate II]
843 0703 Tollgate
8441005 Avance Logic Inc. [ALI]
845 2064 ALG2032/2064
846 2128 ALG2364A
847 2301 ALG2301
848 2302 ALG2302
849 2364 ALG2364
850 2464 ALG2364A
851 2501 ALG2564A/25128A
8521006 Reply Group
8531007 NetFrame Systems Inc
8541008 Epson
855100a Phoenix Technologies
856100b National Semiconductor Corporation
857 0001 DP83810
858 0002 87415/87560 IDE
859 000e 87560 Legacy I/O
860 000f FireWire Controller
861 0011 NS87560 National PCI System I/O
862 0012 USB Controller
863 0020 DP83815 (MacPhyter) Ethernet Controller
864 103c 0024 Pavilion ze4400 builtin Network
865 1385 f311 FA311 / FA312 (FA311 with WoL HW)
866 0022 DP83820 10/100/1000 Ethernet Controller
867 0028 Geode GX2 Host Bridge
868 002a CS5535 South Bridge
869 002b CS5535 ISA bridge
870 002d CS5535 IDE
871 002e CS5535 Audio
872 002f CS5535 USB
873 0030 Geode GX2 Graphics Processor
874 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller
875 0500 SCx200 Bridge
876 0501 SCx200 SMI
877 0502 SCx200 IDE
878 0503 SCx200 Audio
879 0504 SCx200 Video
880 0505 SCx200 XBus
881 0510 SC1100 Bridge
882 0511 SC1100 SMI
883 0515 SC1100 XBus
884 d001 87410 IDE
885100c Tseng Labs Inc
886 3202 ET4000/W32p rev A
887 3205 ET4000/W32p rev B
888 3206 ET4000/W32p rev C
889 3207 ET4000/W32p rev D
890 3208 ET6000
891 4702 ET6300
892100d AST Research Inc
893100e Weitek
894 9000 P9000 Viper
895 9001 P9000 Viper
896 9002 P9000 Viper
897 9100 P9100 Viper Pro/SE
8981010 Video Logic, Ltd.
8991011 Digital Equipment Corporation
900 0001 DECchip 21050
901 0002 DECchip 21040 [Tulip]
902 0004 DECchip 21030 [TGA]
903 0007 NVRAM [Zephyr NVRAM]
904 0008 KZPSA [KZPSA]
905 0009 DECchip 21140 [FasterNet]
906 1025 0310 21140 Fast Ethernet
907 10b8 2001 SMC9332BDT EtherPower 10/100
908 10b8 2002 SMC9332BVT EtherPower T4 10/100
909 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port)
910 1109 2400 ANA-6944A/TX Fast Ethernet
911 1112 2300 RNS2300 Fast Ethernet
912 1112 2320 RNS2320 Fast Ethernet
913 1112 2340 RNS2340 Fast Ethernet
914 1113 1207 EN-1207-TX Fast Ethernet
915 1186 1100 DFE-500TX Fast Ethernet
916 1186 1112 DFE-570TX Fast Ethernet
917 1186 1140 DFE-660 Cardbus Ethernet 10/100
918 1186 1142 DFE-660 Cardbus Ethernet 10/100
919 11f6 0503 Freedomline Fast Ethernet
920 1282 9100 AEF-380TXD Fast Ethernet
921 1385 1100 FA310TX Fast Ethernet
922 2646 0001 KNE100TX Fast Ethernet
923 000a 21230 Video Codec
924 000d PBXGB [TGA2]
925 000f DEFPA
926 0014 DECchip 21041 [Tulip Pass 3]
927 1186 0100 DE-530+
928 0016 DGLPB [OPPO]
929 0017 PV-PCI Graphics Controller (ZLXp-L)
930 0019 DECchip 21142/43
931 1011 500a DE500A Fast Ethernet
932 1011 500b DE500B Fast Ethernet
933 1014 0001 10/100 EtherJet Cardbus
934 1025 0315 ALN315 Fast Ethernet
935 1033 800c PC-9821-CS01 100BASE-TX Interface Card
936 1033 800d PC-9821NR-B06 100BASE-TX Interface Card
937 108d 0016 Rapidfire 2327 10/100 Ethernet
938 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus
939 10b8 2005 SMC8032DT Extreme Ethernet 10/100
940 10b8 8034 SMC8034 Extreme Ethernet 10/100
941 10ef 8169 Cardbus Fast Ethernet
942 1109 2a00 ANA-6911A/TX Fast Ethernet
943 1109 2b00 ANA-6911A/TXC Fast Ethernet
944 1109 3000 ANA-6922/TX Fast Ethernet
945 1113 1207 Cheetah Fast Ethernet
946 1113 2220 Cardbus Fast Ethernet
947 115d 0002 Cardbus Ethernet 10/100
948 1179 0203 Fast Ethernet
949 1179 0204 Cardbus Fast Ethernet
950 1186 1100 DFE-500TX Fast Ethernet
951 1186 1101 DFE-500TX Fast Ethernet
952 1186 1102 DFE-500TX Fast Ethernet
953 1186 1112 DFE-570TX Quad Fast Ethernet
954 1259 2800 AT-2800Tx Fast Ethernet
955 1266 0004 Eagle Fast EtherMAX
956 12af 0019 NetFlyer Cardbus Fast Ethernet
957 1374 0001 Cardbus Ethernet Card 10/100
958 1374 0002 Cardbus Ethernet Card 10/100
959 1374 0007 Cardbus Ethernet Card 10/100
960 1374 0008 Cardbus Ethernet Card 10/100
961 1385 2100 FA510
962 1395 0001 10/100 Ethernet CardBus PC Card
963 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200)
964 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card
965 8086 0001 EtherExpress PRO/100 Mobile CardBus 32
966 001a Farallon PN9000SX Gigabit Ethernet
967 0021 DECchip 21052
968 0022 DECchip 21150
969 0023 DECchip 21150
970 0024 DECchip 21152
971 0025 DECchip 21153
972 0026 DECchip 21154
973 0034 56k Modem Cardbus
974 1374 0003 56k Modem Cardbus
975 0045 DECchip 21553
976 0046 DECchip 21554
977 0e11 4050 Integrated Smart Array
978 0e11 4051 Integrated Smart Array
979 0e11 4058 Integrated Smart Array
980 103c 10c2 Hewlett-Packard NetRAID-4M
981 12d9 000a IP Telephony card
982 4c53 1050 CT7 mainboard
983 4c53 1051 CE7 mainboard
984 9005 0364 5400S (Mustang)
985 9005 0365 5400S (Mustang)
986 9005 1364 Dell PowerEdge RAID Controller 2
987 9005 1365 Dell PowerEdge RAID Controller 2
988 e4bf 1000 CC8-1-BLUES
989 1065 StrongARM DC21285
990 1069 0020 DAC960P / DAC1164P
9911012 Micronics Computers Inc
9921013 Cirrus Logic
993 0038 GD 7548
994 0040 GD 7555 Flat Panel GUI Accelerator
995 004c GD 7556 Video/Graphics LCD/CRT Ctrlr
996 00a0 GD 5430/40 [Alpine]
997 00a2 GD 5432 [Alpine]
998 00a4 GD 5434-4 [Alpine]
999 00a8 GD 5434-8 [Alpine]
1000 00ac GD 5436 [Alpine]
1001 00b0 GD 5440
1002 00b8 GD 5446
1003 00bc GD 5480
1004 1013 00bc CL-GD5480
1005 00d0 GD 5462
1006 00d2 GD 5462 [Laguna I]
1007 00d4 GD 5464 [Laguna]
1008 00d5 GD 5464 BD [Laguna]
1009 00d6 GD 5465 [Laguna]
1010 13ce 8031 Barco Metheus 2 Megapixel, Dual Head
1011 13cf 8031 Barco Metheus 2 Megapixel, Dual Head
1012 00e8 GD 5436U
1013 1100 CL 6729
1014 1110 PD 6832 PCMCIA/CardBus Ctrlr
1015 1112 PD 6834 PCMCIA/CardBus Ctrlr
1016 1113 PD 6833 PCMCIA/CardBus Ctrlr
1017 1200 GD 7542 [Nordic]
1018 1202 GD 7543 [Viking]
1019 1204 GD 7541 [Nordic Light]
1020 4000 MD 5620 [CLM Data Fax Voice]
1021 4400 CD 4400
1022 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]
1023 1014 1010 CS4610 SoundFusion Audio Accelerator
1024 6003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
1025 1013 4280 Crystal SoundFusion PCI Audio Accelerator
1026 153b 1136 SiXPack 5.1+
1027 1681 0050 Game Theater XP
1028 1681 a011 Fortissimo III 7.1
1029 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
1030 6005 Crystal CS4281 PCI Audio
1031 1013 4281 Crystal CS4281 PCI Audio
1032 10cf 10a8 Crystal CS4281 PCI Audio
1033 10cf 10a9 Crystal CS4281 PCI Audio
1034 10cf 10aa Crystal CS4281 PCI Audio
1035 10cf 10ab Crystal CS4281 PCI Audio
1036 10cf 10ac Crystal CS4281 PCI Audio
1037 10cf 10ad Crystal CS4281 PCI Audio
1038 10cf 10b4 Crystal CS4281 PCI Audio
1039 1179 0001 Crystal CS4281 PCI Audio
1040 14c0 000c Crystal CS4281 PCI Audio
10411014 IBM
1042 0002 PCI to MCA Bridge
1043 0005 Alta Lite
1044 0007 Alta MP
1045 000a Fire Coral
1046 0017 CPU to PCI Bridge
1047 0018 TR Auto LANstreamer
1048 001b GXT-150P
1049 001c Carrera
1050 001d 82G2675
1051 0020 GXT1000 Graphics Adapter
1052 0022 IBM27-82351
1053 002d Python
1054# [official name in AIX 5]
1055 002e SCSI RAID Adapter [ServeRAID]
1056 1014 002e ServeRAID-3x
1057 1014 022e ServeRAID-4H
1058 0031 2 Port Serial Adapter
1059# AS400 iSeries PCI sync serial card
1060 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter
1061 0036 Miami
1062 0037 82660 CPU to PCI Bridge
1063 003a CPU to PCI Bridge
1064 003c GXT250P/GXT255P Graphics Adapter
1065 003e 16/4 Token ring UTP/STP controller
1066 1014 003e Token-Ring Adapter
1067 1014 00cd Token-Ring Adapter + Wake-On-LAN
1068 1014 00ce 16/4 Token-Ring Adapter 2
1069 1014 00cf 16/4 Token-Ring Adapter Special
1070 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter
1071 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN
1072 1014 016d iSeries 2744 Card
1073 0045 SSA Adapter
1074 0046 MPIC interrupt controller
1075 0047 PCI to PCI Bridge
1076 0048 PCI to PCI Bridge
1077 0049 Warhead SCSI Controller
1078 004e ATM Controller (14104e00)
1079 004f ATM Controller (14104f00)
1080 0050 ATM Controller (14105000)
1081 0053 25 MBit ATM Controller
1082 0054 GXT500P/GXT550P Graphics Adapter
1083 0057 MPEG PCI Bridge
1084 005c i82557B 10/100
1085 005e GXT800P Graphics Adapter
1086 007c ATM Controller (14107c00)
1087 007d 3780IDSP [MWave]
1088 008b EADS PCI to PCI Bridge
1089 008e GXT3000P Graphics Adapter
1090 0090 GXT 3000P
1091 1014 008e GXT-3000P
1092 0091 SSA Adapter
1093 0095 20H2999 PCI Docking Bridge
1094 0096 Chukar chipset SCSI controller
1095 1014 0097 iSeries 2778 DASD IOA
1096 1014 0098 iSeries 2763 DASD IOA
1097 1014 0099 iSeries 2748 DASD IOA
1098 009f PCI 4758 Cryptographic Accelerator
1099 00a5 ATM Controller (1410a500)
1100 00a6 ATM 155MBPS MM Controller (1410a600)
1101 00b7 256-bit Graphics Rasterizer [Fire GL1]
1102 1092 00b8 FireGL1 AGP 32Mb
1103 00b8 GXT2000P Graphics Adapter
1104 00be ATM 622MBPS Controller (1410be00)
1105 00dc Advanced Systems Management Adapter (ASMA)
1106 00fc CPC710 Dual Bridge and Memory Controller (PCI-64)
1107 0104 Gigabit Ethernet-SX Adapter
1108 0105 CPC710 Dual Bridge and Memory Controller (PCI-32)
1109 010f Remote Supervisor Adapter (RSA)
1110 0142 Yotta Video Compositor Input
1111 1014 0143 Yotta Input Controller (ytin)
1112 0144 Yotta Video Compositor Output
1113 1014 0145 Yotta Output Controller (ytout)
1114 0156 405GP PLB to PCI Bridge
1115 015e 622Mbps ATM PCI Adapter
1116 0160 64bit/66MHz PCI ATM 155 MMF
1117 016e GXT4000P Graphics Adapter
1118 0170 GXT6000P Graphics Adapter
1119 017d GXT300P Graphics Adapter
1120 0180 Snipe chipset SCSI controller
1121 1014 0241 iSeries 2757 DASD IOA
1122 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780)
1123 0188 EADS-X PCI-X to PCI-X Bridge
1124 01a7 PCI-X to PCI-X Bridge
1125 01bd ServeRAID Controller
1126 1014 01be ServeRAID-4M
1127 1014 01bf ServeRAID-4L
1128 1014 0208 ServeRAID-4Mx
1129 1014 020e ServeRAID-4Lx
1130 1014 022e ServeRAID-4H
1131 1014 0258 ServeRAID-5i
1132 1014 0259 ServeRAID-5i
1133 01c1 64bit/66MHz PCI ATM 155 UTP
1134 01e6 Cryptographic Accelerator
1135 01ff 10/100 Mbps Ethernet
1136 0219 Multiport Serial Adapter
1137 1014 021a Dual RVX
1138 1014 0251 Internal Modem/RVX
1139 1014 0252 Quad Internal Modem
1140 021b GXT6500P Graphics Adapter
1141 021c GXT4500P Graphics Adapter
1142 0233 GXT135P Graphics Adapter
1143 0266 PCI-X Dual Channel SCSI
1144 0268 Gigabit Ethernet-SX Adapter (PCI-X)
1145 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
1146 028c Citrine chipset SCSI controller
1147 1014 028D Dual Channel PCI-X DDR SAS RAID Adapter (572E)
1148 1014 02BE Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B)
1149 1014 02C0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A)
1150 0302 X-Architecture Bridge [Summit]
1151 0314 ZISC 036 Neural accelerator card
1152 ffff MPIC-2 interrupt controller
11531015 LSI Logic Corp of Canada
11541016 ICL Personal Systems
11551017 SPEA Software AG
1156 5343 SPEA 3D Accelerator
11571018 Unisys Systems
11581019 Elitegroup Computer Systems
1159101a AT&T GIS (NCR)
1160 0005 100VG ethernet
1161101b Vitesse Semiconductor
1162101c Western Digital
1163 0193 33C193A
1164 0196 33C196A
1165 0197 33C197A
1166 0296 33C296A
1167 3193 7193
1168 3197 7197
1169 3296 33C296A
1170 4296 34C296
1171 9710 Pipeline 9710
1172 9712 Pipeline 9712
1173 c24a 90C
1174101e American Megatrends Inc.
1175 1960 MegaRAID
1176 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller
1177 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller
1178 101e 0477 MegaRAID 477 Elite 3100 RAID Controller
1179 101e 0493 MegaRAID 493 Elite 1600 RAID Controller
1180 101e 0494 MegaRAID 494 Elite 1650 RAID Controller
1181 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller
1182 101e 0511 MegaRAID 511 i4 IDE RAID Controller
1183 101e 0522 MegaRAID 522 i4133 RAID Controller
1184 1028 0471 PowerEdge RAID Controller 3/QC
1185 1028 0475 PowerEdge RAID Controller 3/SC
1186 1028 0493 PowerEdge RAID Controller 3/DC
1187 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch
1188 9010 MegaRAID 428 Ultra RAID Controller
1189 9030 EIDE Controller
1190 9031 EIDE Controller
1191 9032 EIDE & SCSI Controller
1192 9033 SCSI Controller
1193 9040 Multimedia card
1194 9060 MegaRAID 434 Ultra GT RAID Controller
1195 9063 MegaRAC
1196 101e 0767 Dell Remote Assistant Card 2
1197101f PictureTel
11981020 Hitachi Computer Products
11991021 OKI Electric Industry Co. Ltd.
12001022 Advanced Micro Devices [AMD]
1201 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration
1202 1101 K8 [Athlon64/Opteron] Address Map
1203 1102 K8 [Athlon64/Opteron] DRAM Controller
1204 1103 K8 [Athlon64/Opteron] Miscellaneous Control
1205 2000 79c970 [PCnet32 LANCE]
1206 1014 2000 NetFinity 10/100 Fast Ethernet
1207 1022 2000 PCnet - Fast 79C971
1208 103c 104c Ethernet with LAN remote power Adapter
1209 103c 1064 Ethernet with LAN remote power Adapter
1210 103c 1065 Ethernet with LAN remote power Adapter
1211 103c 106c Ethernet with LAN remote power Adapter
1212 103c 106e Ethernet with LAN remote power Adapter
1213 103c 10ea Ethernet with LAN remote power Adapter
1214 1113 1220 EN1220 10/100 Fast Ethernet
1215 1259 2450 AT-2450 10/100 Fast Ethernet
1216 1259 2454 AT-2450v4 10Mb Ethernet Adapter
1217 1259 2700 AT-2700TX 10/100 Fast Ethernet
1218 1259 2701 AT-2700FX 100Mb Ethernet
1219 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
1220 4c53 1010 CP5/CR6 mainboard
1221 4c53 1020 VR6 mainboard
1222 4c53 1030 PC5 mainboard
1223 4c53 1040 CL7 mainboard
1224 4c53 1060 PC7 mainboard
1225 2001 79c978 [HomePNA]
1226 1092 0a78 Multimedia Home Network Adapter
1227 1668 0299 ActionLink Home Network Adapter
1228 2003 Am 1771 MBW [Alchemy]
1229 2020 53c974 [PCscsi]
1230 2040 79c974
1231 3000 ELanSC520 Microcontroller
1232 7006 AMD-751 [Irongate] System Controller
1233 7007 AMD-751 [Irongate] AGP Bridge
1234 700a AMD-IGR4 AGP Host to PCI Bridge
1235 700b AMD-IGR4 PCI to PCI Bridge
1236 700c AMD-760 MP [IGD4-2P] System Controller
1237 700d AMD-760 MP [IGD4-2P] AGP Bridge
1238 700e AMD-760 [IGD4-1P] System Controller
1239 700f AMD-760 [IGD4-1P] AGP Bridge
1240 7400 AMD-755 [Cobra] ISA
1241 7401 AMD-755 [Cobra] IDE
1242 7403 AMD-755 [Cobra] ACPI
1243 7404 AMD-755 [Cobra] USB
1244 7408 AMD-756 [Viper] ISA
1245 7409 AMD-756 [Viper] IDE
1246 740b AMD-756 [Viper] ACPI
1247 740c AMD-756 [Viper] USB
1248 7410 AMD-766 [ViperPlus] ISA
1249 7411 AMD-766 [ViperPlus] IDE
1250 7413 AMD-766 [ViperPlus] ACPI
1251 7414 AMD-766 [ViperPlus] USB
1252 7440 AMD-768 [Opus] ISA
1253 1043 8044 A7M-D Mainboard
1254 7441 AMD-768 [Opus] IDE
1255 7443 AMD-768 [Opus] ACPI
1256 1043 8044 A7M-D Mainboard
1257 7445 AMD-768 [Opus] Audio
1258 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)
1259 7448 AMD-768 [Opus] PCI
1260 7449 AMD-768 [Opus] USB
1261 7450 AMD-8131 PCI-X Bridge
1262 7451 AMD-8131 PCI-X APIC
1263 7454 AMD-8151 System Controller
1264 7455 AMD-8151 AGP Bridge
1265 7460 AMD-8111 PCI
1266 161f 3017 HDAMB
1267 7461 AMD-8111 USB
1268 7462 AMD-8111 Ethernet
1269 7464 AMD-8111 USB
1270 161f 3017 HDAMB
1271 7468 AMD-8111 LPC
1272 161f 3017 HDAMB
1273 7469 AMD-8111 IDE
1274 161f 3017 HDAMB
1275 746a AMD-8111 SMBus 2.0
1276 746b AMD-8111 ACPI
1277 161f 3017 HDAMB
1278 746d AMD-8111 AC97 Audio
1279 161f 3017 HDAMB
1280 746e AMD-8111 MC97 Modem
1281 756b AMD-8111 ACPI
12821023 Trident Microsystems
1283 0194 82C194
1284 2000 4DWave DX
1285 2001 4DWave NX
1286 122d 1400 Trident PCI288-Q3DII (NX)
1287 2100 CyberBlade XP4m32
1288 2200 XGI Volari XP5
1289 8400 CyberBlade/i7
1290 1023 8400 CyberBlade i7 AGP
1291 8420 CyberBlade/i7d
1292 0e11 b15a CyberBlade i7 AGP
1293 8500 CyberBlade/i1
1294 8520 CyberBlade i1
1295 0e11 b16e CyberBlade i1 AGP
1296 1023 8520 CyberBlade i1 AGP
1297 8620 CyberBlade/i1
1298 1014 0502 ThinkPad R30/T30
1299 8820 CyberBlade XPAi1
1300 9320 TGUI 9320
1301 9350 GUI Accelerator
1302 9360 Flat panel GUI Accelerator
1303 9382 Cyber 9382 [Reference design]
1304 9383 Cyber 9383 [Reference design]
1305 9385 Cyber 9385 [Reference design]
1306 9386 Cyber 9386
1307 9388 Cyber 9388
1308 9397 Cyber 9397
1309 939a Cyber 9397DVD
1310 9420 TGUI 9420
1311 9430 TGUI 9430
1312 9440 TGUI 9440
1313 9460 TGUI 9460
1314 9470 TGUI 9470
1315 9520 Cyber 9520
1316 9525 Cyber 9525
1317 10cf 1094 Lifebook C6155
1318 9540 Cyber 9540
1319 9660 TGUI 9660/938x/968x
1320 9680 TGUI 9680
1321 9682 TGUI 9682
1322 9683 TGUI 9683
1323 9685 ProVIDIA 9685
1324 9750 3DImage 9750
1325 1014 9750 3DImage 9750
1326 1023 9750 3DImage 9750
1327 9753 TGUI 9753
1328 9754 TGUI 9754
1329 9759 TGUI 975
1330 9783 TGUI 9783
1331 9785 TGUI 9785
1332 9850 3DImage 9850
1333 9880 Blade 3D PCI/AGP
1334 1023 9880 Blade 3D
1335 9910 CyberBlade/XP
1336 9930 CyberBlade/XPm
13371024 Zenith Data Systems
13381025 Acer Incorporated [ALI]
1339 1435 M1435
1340 1445 M1445
1341 1449 M1449
1342 1451 M1451
1343 1461 M1461
1344 1489 M1489
1345 1511 M1511
1346 1512 ALI M1512 Aladdin
1347 1513 M1513
1348 1521 ALI M1521 Aladdin III CPU Bridge
1349 10b9 1521 ALI M1521 Aladdin III CPU Bridge
1350 1523 ALI M1523 ISA Bridge
1351 10b9 1523 ALI M1523 ISA Bridge
1352 1531 M1531 Northbridge [Aladdin IV/IV+]
1353 1533 M1533 PCI-to-ISA Bridge
1354 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge
1355 1535 M1535 PCI Bridge + Super I/O + FIR
1356 1541 M1541 Northbridge [Aladdin V]
1357 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
1358 1542 M1542 Northbridge [Aladdin V]
1359 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR
1360 1561 M1561 Northbridge [Aladdin 7]
1361 1621 M1621 Northbridge [Aladdin-Pro II]
1362 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2]
1363 1641 M1641 Northbridge [Aladdin-Pro IV]
1364 1647 M1647 [MaGiK1] PCI North Bridge
1365 1671 M1671 Northbridge [ALADDiN-P4]
1366 1672 Northbridge [CyberALADDiN-P4]
1367 3141 M3141
1368 3143 M3143
1369 3145 M3145
1370 3147 M3147
1371 3149 M3149
1372 3151 M3151
1373 3307 M3307 MPEG-I Video Controller
1374 3309 M3309 MPEG-II Video w/ Software Audio Decoder
1375 3321 M3321 MPEG-II Audio/Video Decoder
1376 5212 M4803
1377 5215 ALI PCI EIDE Controller
1378 5217 M5217H
1379 5219 M5219
1380 5225 M5225
1381 5229 M5229
1382 5235 M5235
1383 5237 M5237 PCI USB Host Controller
1384 5240 EIDE Controller
1385 5241 PCMCIA Bridge
1386 5242 General Purpose Controller
1387 5243 PCI to PCI Bridge Controller
1388 5244 Floppy Disk Controller
1389 5247 M1541 PCI to PCI Bridge
1390 5251 M5251 P1394 Controller
1391 5427 PCI to AGP Bridge
1392 5451 M5451 PCI AC-Link Controller Audio Device
1393 5453 M5453 PCI AC-Link Controller Modem Device
1394 7101 M7101 PCI PMU Power Management Controller
1395 10b9 7101 M7101 PCI PMU Power Management Controller
13961028 Dell
1397 0001 PowerEdge Expandable RAID Controller 2/Si
1398 1028 0001 PowerEdge 2400
1399 0002 PowerEdge Expandable RAID Controller 3/Di
1400 1028 0002 PowerEdge 4400
1401 0003 PowerEdge Expandable RAID Controller 3/Si
1402 1028 0003 PowerEdge 2450
1403 0006 PowerEdge Expandable RAID Controller 3/Di
1404 0007 Remote Access Card III
1405 0008 Remote Access Card III
1406 0009 Remote Access Card III: BMC/SMIC device not present
1407 000a PowerEdge Expandable RAID Controller 3/Di
1408 000c Embedded Remote Access or ERA/O
1409 000d Embedded Remote Access: BMC/SMIC device
1410 000e PowerEdge Expandable RAID controller 4/Di
1411 000f PowerEdge Expandable RAID controller 4/Di
1412 0010 Remote Access Card 4
1413 0011 Remote Access Card 4 Daughter Card
1414 0012 Remote Access Card 4 Daughter Card Virtual UART
1415 0013 PowerEdge Expandable RAID controller 4
1416 1028 016c PowerEdge Expandable RAID Controller 4e/Si
1417 1028 016d PowerEdge Expandable RAID Controller 4e/Di
1418 1028 016e PowerEdge Expandable RAID Controller 4e/Di
1419 1028 016f PowerEdge Expandable RAID Controller 4e/Di
1420 1028 0170 PowerEdge Expandable RAID Controller 4e/Di
1421 0014 Remote Access Card 4 Daughter Card SMIC interface
14221029 Siemens Nixdorf IS
1423102a LSI Logic
1424 0000 HYDRA
1425 0010 ASPEN
1426 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers
1427 9005 000f 2940U2W SCSI Controller
1428 9005 0106 2940U2W SCSI Controller
1429 9005 a180 2940U2W SCSI Controller
1430 00c5 AIC-7899 U160/m SCSI Controller
1431 1028 00c5 PowerEdge 2550/2650/4600
1432 00cf AIC-7899P U160/m
1433 1028 0106 PowerEdge 4600
1434 1028 0121 PowerEdge 2650
1435102b Matrox Graphics, Inc.
1436# DJ: I've a suspicion that 0010 is a duplicate of 0d10.
1437 0010 MGA-I [Impression?]
1438 0100 MGA 1064SG [Mystique]
1439 0518 MGA-II [Athena]
1440 0519 MGA 2064W [Millennium]
1441 051a MGA 1064SG [Mystique]
1442 102b 0100 MGA-1064SG Mystique
1443 102b 1100 MGA-1084SG Mystique
1444 102b 1200 MGA-1084SG Mystique
1445 1100 102b MGA-1084SG Mystique
1446 110a 0018 Scenic Pro C5 (D1025)
1447 051b MGA 2164W [Millennium II]
1448 102b 051b MGA-2164W Millennium II
1449 102b 1100 MGA-2164W Millennium II
1450 102b 1200 MGA-2164W Millennium II
1451 051e MGA 1064SG [Mystique] AGP
1452 051f MGA 2164W [Millennium II] AGP
1453 0520 MGA G200
1454 102b dbc2 G200 Multi-Monitor
1455 102b dbc8 G200 Multi-Monitor
1456 102b dbe2 G200 Multi-Monitor
1457 102b dbe8 G200 Multi-Monitor
1458 102b ff03 Millennium G200 SD
1459 102b ff04 Marvel G200
1460 0521 MGA G200 AGP
1461 1014 ff03 Millennium G200 AGP
1462 102b 48e9 Mystique G200 AGP
1463 102b 48f8 Millennium G200 SD AGP
1464 102b 4a60 Millennium G200 LE AGP
1465 102b 4a64 Millennium G200 AGP
1466 102b c93c Millennium G200 AGP
1467 102b c9b0 Millennium G200 AGP
1468 102b c9bc Millennium G200 AGP
1469 102b ca60 Millennium G250 LE AGP
1470 102b ca6c Millennium G250 AGP
1471 102b dbbc Millennium G200 AGP
1472 102b dbc2 Millennium G200 MMS (Dual G200)
1473 102b dbc3 G200 Multi-Monitor
1474 102b dbc8 Millennium G200 MMS (Dual G200)
1475 102b dbd2 G200 Multi-Monitor
1476 102b dbd3 G200 Multi-Monitor
1477 102b dbd4 G200 Multi-Monitor
1478 102b dbd5 G200 Multi-Monitor
1479 102b dbd8 G200 Multi-Monitor
1480 102b dbd9 G200 Multi-Monitor
1481 102b dbe2 Millennium G200 MMS (Quad G200)
1482 102b dbe3 G200 Multi-Monitor
1483 102b dbe8 Millennium G200 MMS (Quad G200)
1484 102b dbf2 G200 Multi-Monitor
1485 102b dbf3 G200 Multi-Monitor
1486 102b dbf4 G200 Multi-Monitor
1487 102b dbf5 G200 Multi-Monitor
1488 102b dbf8 G200 Multi-Monitor
1489 102b dbf9 G200 Multi-Monitor
1490 102b f806 Mystique G200 Video AGP
1491 102b ff00 MGA-G200 AGP
1492 102b ff02 Mystique G200 AGP
1493 102b ff03 Millennium G200 AGP
1494 102b ff04 Marvel G200 AGP
1495 110a 0032 MGA-G200 AGP
1496 0525 MGA G400 AGP
1497 0e11 b16f MGA-G400 AGP
1498 102b 0328 Millennium G400 16Mb SDRAM
1499 102b 0338 Millennium G400 16Mb SDRAM
1500 102b 0378 Millennium G400 32Mb SDRAM
1501 102b 0541 Millennium G450 Dual Head
1502 102b 0542 Millennium G450 Dual Head LX
1503 102b 0543 Millennium G450 Single Head LX
1504 102b 0641 Millennium G450 32Mb SDRAM Dual Head
1505 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX
1506 102b 0643 Millennium G450 32Mb SDRAM Single Head LX
1507 102b 07c0 Millennium G450 Dual Head LE
1508 102b 07c1 Millennium G450 SDR Dual Head LE
1509 102b 0d41 Millennium G450 Dual Head PCI
1510 102b 0d42 Millennium G450 Dual Head LX PCI
1511 102b 0d43 Millennium G450 32Mb Dual Head PCI
1512 102b 0e00 Marvel G450 eTV
1513 102b 0e01 Marvel G450 eTV
1514 102b 0e02 Marvel G450 eTV
1515 102b 0e03 Marvel G450 eTV
1516 102b 0f80 Millennium G450 Low Profile
1517 102b 0f81 Millennium G450 Low Profile
1518 102b 0f82 Millennium G450 Low Profile DVI
1519 102b 0f83 Millennium G450 Low Profile DVI
1520 102b 19d8 Millennium G400 16Mb SGRAM
1521 102b 19f8 Millennium G400 32Mb SGRAM
1522 102b 2159 Millennium G400 Dual Head 16Mb
1523 102b 2179 Millennium G400 MAX/Dual Head 32Mb
1524 102b 217d Millennium G400 Dual Head Max
1525 102b 23c0 Millennium G450
1526 102b 23c1 Millennium G450
1527 102b 23c2 Millennium G450 DVI
1528 102b 23c3 Millennium G450 DVI
1529 102b 2f58 Millennium G400
1530 102b 2f78 Millennium G400
1531 102b 3693 Marvel G400 AGP
1532 102b 5dd0 4Sight II
1533 102b 5f50 4Sight II
1534 102b 5f51 4Sight II
1535 102b 5f52 4Sight II
1536 102b 9010 Millennium G400 Dual Head
1537 1458 0400 GA-G400
1538 1705 0001 Millennium G450 32MB SGRAM
1539 1705 0002 Millennium G450 16MB SGRAM
1540 1705 0003 Millennium G450 32MB
1541 1705 0004 Millennium G450 16MB
1542 0527 MGA Parhelia AGP
1543 102b 0840 Parhelia 128Mb
1544 0d10 MGA Ultima/Impression
1545 1000 MGA G100 [Productiva]
1546 102b ff01 Productiva G100
1547 102b ff05 Productiva G100 Multi-Monitor
1548 1001 MGA G100 [Productiva] AGP
1549 102b 1001 MGA-G100 AGP
1550 102b ff00 MGA-G100 AGP
1551 102b ff01 MGA-G100 Productiva AGP
1552 102b ff03 Millennium G100 AGP
1553 102b ff04 MGA-G100 AGP
1554 102b ff05 MGA-G100 Productiva AGP Multi-Monitor
1555 110a 001e MGA-G100 AGP
1556 2007 MGA Mistral
1557 2527 MGA G550 AGP
1558 102b 0f83 Millennium G550
1559 102b 0f84 Millennium G550 Dual Head DDR 32Mb
1560 102b 1e41 Millennium G550
1561 2537 MGA G650 AGP
1562 4536 VIA Framegrabber
1563 6573 Shark 10/100 Multiport SwitchNIC
1564102c Chips and Technologies
1565 00b8 F64310
1566 00c0 F69000 HiQVideo
1567 102c 00c0 F69000 HiQVideo
1568 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
1569 4c53 1010 CP5/CR6 mainboard
1570 4c53 1020 VR6 mainboard
1571 4c53 1030 PC5 mainboard
1572 4c53 1050 CT7 mainboard
1573 4c53 1051 CE7 mainboard
1574 00d0 F65545
1575 00d8 F65545
1576 00dc F65548
1577 00e0 F65550
1578 00e4 F65554
1579 00e5 F65555 HiQVPro
1580 0e11 b049 Armada 1700 Laptop Display Controller
1581 00f0 F68554
1582 00f4 F68554 HiQVision
1583 00f5 F68555
1584 0c30 F69030
1585 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
1586 4c53 1050 CT7 mainboard
1587 4c53 1051 CE7 mainboard
1588# C5C project cancelled
1589 4c53 1080 CT8 mainboard
1590102d Wyse Technology Inc.
1591 50dc 3328 Audio
1592102e Olivetti Advanced Technology
1593102f Toshiba America
1594 0009 r4x00
1595 000a TX3927 MIPS RISC PCI Controller
1596 0020 ATM Meteor 155
1597 102f 00f8 ATM Meteor 155
1598 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller
1599 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
1600 0105 TC86C001 [goku-s] IDE
1601 0106 TC86C001 [goku-s] USB 1.1 Host
1602 0107 TC86C001 [goku-s] USB Device Controller
1603 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller
1604 0180 TX4927/38 MIPS RISC PCI Controller
1605 0181 TX4925 MIPS RISC PCI Controller
1606 0182 TX4937 MIPS RISC PCI Controller
16071030 TMC Research
16081031 Miro Computer Products AG
1609 5601 DC20 ASIC
1610 5607 Video I/O & motion JPEG compressor
1611 5631 Media 3D
1612 6057 MiroVideo DC10/DC30+
16131032 Compaq
16141033 NEC Corporation
1615 0000 Vr4181A USB Host or Function Control Unit
1616 0001 PCI to 486-like bus Bridge
1617 0002 PCI to VL98 Bridge
1618 0003 ATM Controller
1619 0004 R4000 PCI Bridge
1620 0005 PCI to 486-like bus Bridge
1621 0006 PC-9800 Graphic Accelerator
1622 0007 PCI to UX-Bus Bridge
1623 0008 PC-9800 Graphic Accelerator
1624 0009 PCI to PC9800 Core-Graph Bridge
1625 0016 PCI to VL Bridge
1626 001a [Nile II]
1627 0021 Vrc4373 [Nile I]
1628 0029 PowerVR PCX1
1629 002a PowerVR 3D
1630 002c Star Alpha 2
1631 002d PCI to C-bus Bridge
1632 0035 USB
1633 1179 0001 USB
1634 12ee 7000 Root Hub
1635 1799 0001 Root Hub
1636 807d 0035 PCI-USB2 (OHCI subsystem)
1637 003b PCI to C-bus Bridge
1638 003e NAPCCARD Cardbus Controller
1639 0046 PowerVR PCX2 [midas]
1640 005a Vrc5074 [Nile 4]
1641 0063 Firewarden
1642 0067 PowerVR Neon 250 Chipset
1643 1010 0020 PowerVR Neon 250 AGP 32Mb
1644 1010 0080 PowerVR Neon 250 AGP 16Mb
1645 1010 0088 PowerVR Neon 250 16Mb
1646 1010 0090 PowerVR Neon 250 AGP 16Mb
1647 1010 0098 PowerVR Neon 250 16Mb
1648 1010 00a0 PowerVR Neon 250 AGP 32Mb
1649 1010 00a8 PowerVR Neon 250 32Mb
1650 1010 0120 PowerVR Neon 250 AGP 32Mb
1651 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
1652 0074 56k Voice Modem
1653 1033 8014 RCV56ACF 56k Voice Modem
1654 009b Vrc5476
1655 00a5 VRC4173
1656 00a6 VRC5477 AC97
1657 00cd IEEE 1394 [OrangeLink] Host Controller
1658 12ee 8011 Root hub
1659 00ce IEEE 1394 Host Controller
1660 00df Vr4131
1661 00e0 USB 2.0
1662 0ee4 3383 Sitecom IEEE 1394 / USB2.0 Combo Card
1663 12ee 7001 Root hub
1664 1799 0002 Root Hub
1665 807d 1043 PCI-USB2 (EHCI subsystem)
1666 00e7 IEEE 1394 Host Controller
1667 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
1668 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2]
1669 010c VR7701
16701034 Framatome Connectors USA Inc.
16711035 Comp. & Comm. Research Lab
16721036 Future Domain Corp.
1673 0000 TMC-18C30 [36C70]
16741037 Hitachi Micro Systems
16751038 AMP, Inc
16761039 Silicon Integrated Systems [SiS]
1677 0001 Virtual PCI-to-PCI bridge (AGP)
1678 0002 SG86C202
1679 0006 85C501/2/3
1680 0008 SiS85C503/5513 (LPC Bridge)
1681 0009 ACPI
1682# source: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt
1683 0016 SiS961/2 SMBus Controller
1684 0018 SiS85C503/5513 (LPC Bridge)
1685# Controller for 2 PATA and 2 SATA channels
1686 0180 RAID bus controller 180 SATA/PATA [SiS]
1687 0181 SiS SATA
1688 0200 5597/5598/6326 VGA
1689 1039 0000 SiS5597 SVGA (Shared RAM)
1690 0204 82C204
1691 0205 SG86C205
1692 0300 300/305 PCI/AGP VGA Display Adapter
1693 107d 2720 Leadtek WinFast VR300
1694 0310 315H PCI/AGP VGA Display Adapter
1695 0315 315 PCI/AGP VGA Display Adapter
1696 0325 315PRO PCI/AGP VGA Display Adapter
1697 0330 330 [Xabre] PCI/AGP VGA Display Adapter
1698 0406 85C501/2
1699 0496 85C496
1700 0530 530 Host
1701 0540 540 Host
1702 0550 550 Host
1703 0597 5513C
1704 0601 85C601
1705 0620 620 Host
1706 0630 630 Host
1707 0633 633 Host
1708 0635 635 Host
1709 0645 SiS645 Host & Memory & AGP Controller
1710 0646 SiS645DX Host & Memory & AGP Controller
1711 0648 SiS 645xx
1712 0650 650/M650 Host
1713 0651 651 Host
1714 0655 655 Host
1715 0660 660 Host
1716 0661 661FX/M661FX/M661MX Host
1717 0730 730 Host
1718 0733 733 Host
1719 0735 735 Host
1720 0740 740 Host
1721 0741 741/741GX/M741 Host
1722 0745 745 Host
1723 0746 746 Host
1724 0755 755 Host
1725 0760 760/M760 Host
1726 0900 SiS900 PCI Fast Ethernet
1727 1019 0a14 K7S5A motherboard
1728 1039 0900 SiS900 10/100 Ethernet Adapter
1729 1043 8035 CUSI-FX motherboard
1730 0961 SiS961 [MuTIOL Media IO]
1731 0962 SiS962 [MuTIOL Media IO]
1732 0963 SiS963 [MuTIOL Media IO]
1733 0964 SiS964 [MuTIOL Media IO]
1734 0965 SiS965 [MuTIOL Media IO]
1735 3602 83C602
1736 5107 5107
1737 5300 SiS540 PCI Display Adapter
1738 5315 550 PCI/AGP VGA Display Adapter
1739 5401 486 PCI Chipset
1740 5511 5511/5512
1741 5513 5513 [IDE]
1742 1019 0970 P6STP-FL motherboard
1743 1039 5513 SiS5513 EIDE Controller (A,B step)
1744 1043 8035 CUSI-FX motherboard
1745 5517 5517
1746 5571 5571
1747 5581 5581 Pentium Chipset
1748 5582 5582
1749 5591 5591/5592 Host
1750 5596 5596 Pentium Chipset
1751 5597 5597 [SiS5582]
1752 5600 5600 Host
1753 6204 Video decoder & MPEG interface
1754 6205 VGA Controller
1755 6236 6236 3D-AGP
1756 6300 630/730 PCI/AGP VGA Display Adapter
1757 1019 0970 P6STP-FL motherboard
1758 1043 8035 CUSI-FX motherboard
1759 6306 530/620 PCI/AGP VGA Display Adapter
1760 1039 6306 SiS530,620 GUI Accelerator+3D
1761 6325 65x/M650/740 PCI/AGP VGA Display Adapter
1762 6326 86C326 5598/6326
1763 1039 6326 SiS6326 GUI Accelerator
1764 1092 0a50 SpeedStar A50
1765 1092 0a70 SpeedStar A70
1766 1092 4910 SpeedStar A70
1767 1092 4920 SpeedStar A70
1768 1569 6326 SiS6326 GUI Accelerator
1769 6330 661/741/760 PCI/AGP VGA Display Adapter
1770 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter
1771 7001 USB 1.0 Controller
1772 1019 0a14 K7S5A motherboard
1773 1039 7000 Onboard USB Controller
1774 7002 USB 2.0 Controller
1775 1509 7002 Onboard USB Controller
1776 7007 FireWire Controller
1777 7012 Sound Controller
1778# There are may be different modem codecs here (Intel537 compatible and incompatible)
1779 7013 AC'97 Modem Controller
1780 7016 SiS7016 PCI Fast Ethernet Adapter
1781 1039 7016 SiS7016 10/100 Ethernet Adapter
1782 7018 SiS PCI Audio Accelerator
1783 1014 01b6 SiS PCI Audio Accelerator
1784 1014 01b7 SiS PCI Audio Accelerator
1785 1019 7018 SiS PCI Audio Accelerator
1786 1025 000e SiS PCI Audio Accelerator
1787 1025 0018 SiS PCI Audio Accelerator
1788 1039 7018 SiS PCI Audio Accelerator
1789 1043 800b SiS PCI Audio Accelerator
1790 1054 7018 SiS PCI Audio Accelerator
1791 107d 5330 SiS PCI Audio Accelerator
1792 107d 5350 SiS PCI Audio Accelerator
1793 1170 3209 SiS PCI Audio Accelerator
1794 1462 400a SiS PCI Audio Accelerator
1795 14a4 2089 SiS PCI Audio Accelerator
1796 14cd 2194 SiS PCI Audio Accelerator
1797 14ff 1100 SiS PCI Audio Accelerator
1798 152d 8808 SiS PCI Audio Accelerator
1799 1558 1103 SiS PCI Audio Accelerator
1800 1558 2200 SiS PCI Audio Accelerator
1801 1563 7018 SiS PCI Audio Accelerator
1802 15c5 0111 SiS PCI Audio Accelerator
1803 270f a171 SiS PCI Audio Accelerator
1804 a0a0 0022 SiS PCI Audio Accelerator
1805 7019 SiS7019 Audio Accelerator
1806103a Seiko Epson Corporation
1807103b Tatung Co. of America
1808103c Hewlett-Packard Company
1809 1005 A4977A Visualize EG
1810 1006 Visualize FX6
1811 1008 Visualize FX4
1812 100a Visualize FX2
1813 1028 Tach TL Fibre Channel Host Adapter
1814 1029 Tach XL2 Fibre Channel Host Adapter
1815 107e 000f Interphase 5560 Fibre Channel Adapter
1816 9004 9210 1Gb/2Gb Family Fibre Channel Controller
1817 9004 9211 1Gb/2Gb Family Fibre Channel Controller
1818 102a Tach TS Fibre Channel Host Adapter
1819 107e 000e Interphase 5540/5541 Fibre Channel Adapter
1820 9004 9110 1Gb/2Gb Family Fibre Channel Controller
1821 9004 9111 1Gb/2Gb Family Fibre Channel Controller
1822 1030 J2585A DeskDirect 10/100VG NIC
1823 1031 J2585B HP 10/100VG PCI LAN Adapter
1824 103c 1040 J2973A DeskDirect 10BaseT NIC
1825 103c 1041 J2585B DeskDirect 10/100VG NIC
1826 103c 1042 J2970A DeskDirect 10BaseT/2 NIC
1827 1040 J2973A DeskDirect 10BaseT NIC
1828 1041 J2585B DeskDirect 10/100 NIC
1829 1042 J2970A DeskDirect 10BaseT/2 NIC
1830 1048 Diva Serial [GSP] Multiport UART
1831 103c 1049 Tosca Console
1832 103c 104a Tosca Secondary
1833 103c 104b Maestro SP2
1834 103c 1223 Superdome Console
1835 103c 1226 Keystone SP2
1836 103c 1227 Powerbar SP2
1837 103c 1282 Everest SP2
1838 103c 1301 Diva RMP3
1839 1054 PCI Local Bus Adapter
1840 1064 79C970 PCnet Ethernet Controller
1841 108b Visualize FXe
1842 10c1 NetServer Smart IRQ Router
1843 10ed TopTools Remote Control
1844 10f0 rio System Bus Adapter
1845 10f1 rio I/O Controller
1846 1200 82557B 10/100 NIC
1847 1219 NetServer PCI Hot-Plug Controller
1848 121a NetServer SMIC Controller
1849 121b NetServer Legacy COM Port Decoder
1850 121c NetServer PCI COM Port Decoder
1851 1229 zx1 System Bus Adapter
1852 122a zx1 I/O Controller
1853 122e zx1 Local Bus Adapter
1854 127c sx1000 I/O Controller
1855 1290 Auxiliary Diva Serial Port
1856 12b4 zx1 QuickSilver AGP8x Local Bus Adapter
1857 2910 E2910A PCIBus Exerciser
1858 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
1859103e Solliday Engineering
1860103f Synopsys/Logic Modeling Group
18611040 Accelgraphics Inc.
18621041 Computrend
18631042 Micron
1864 1000 PC Tech RZ1000
1865 1001 PC Tech RZ1001
1866 3000 Samurai_0
1867 3010 Samurai_1
1868 3020 Samurai_IDE
18691043 ASUSTeK Computer Inc.
1870 0675 ISDNLink P-IN100-ST-D
1871 4015 v7100 SDRAM [GeForce2 MX]
1872 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner]
1873 4057 v8200 GeForce 3
1874 8043 v8240 PAL 128M [P4T] Motherboard
1875 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]
1876 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]
1877 80c5 nForce3 chipset motherboard [SK8N]
1878 80df v9520 Magic/T
18791044 Adaptec (formerly DPT)
1880 1012 Domino RAID Engine
1881 a400 SmartCache/Raid I-IV Controller
1882 a500 PCI Bridge
1883 a501 SmartRAID V Controller
1884 1044 c001 PM1554U2 Ultra2 Single Channel
1885 1044 c002 PM1654U2 Ultra2 Single Channel
1886 1044 c003 PM1564U3 Ultra3 Single Channel
1887 1044 c004 PM1564U3 Ultra3 Dual Channel
1888 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI)
1889 1044 c00a PM2554U2 Ultra2 Single Channel
1890 1044 c00b PM2654U2 Ultra2 Single Channel
1891 1044 c00c PM2664U3 Ultra3 Single Channel
1892 1044 c00d PM2664U3 Ultra3 Dual Channel
1893 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI)
1894 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI)
1895 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI)
1896 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI)
1897 1044 c016 PM3755F Fibre Channel (NON ACPI)
1898 1044 c01e PM3757U2 Ultra2 Single Channel
1899 1044 c01f PM3757U2 Ultra2 Dual Channel
1900 1044 c020 PM3767U3 Ultra3 Dual Channel
1901 1044 c021 PM3767U3 Ultra3 Quad Channel
1902 1044 c028 PM2865U3 Ultra3 Single Channel
1903 1044 c029 PM2865U3 Ultra3 Dual Channel
1904 1044 c02a PM2865F Fibre Channel
1905 1044 c03c 2000S Ultra3 Single Channel
1906 1044 c03d 2000S Ultra3 Dual Channel
1907 1044 c03e 2000F Fibre Channel
1908 1044 c046 3000S Ultra3 Single Channel
1909 1044 c047 3000S Ultra3 Dual Channel
1910 1044 c048 3000F Fibre Channel
1911 1044 c050 5000S Ultra3 Single Channel
1912 1044 c051 5000S Ultra3 Dual Channel
1913 1044 c052 5000F Fibre Channel
1914 1044 c05a 2400A UDMA Four Channel
1915 1044 c05b 2400A UDMA Four Channel DAC
1916 1044 c064 3010S Ultra3 Dual Channel
1917 1044 c065 3410S Ultra160 Four Channel
1918 1044 c066 3010S Fibre Channel
1919 a511 SmartRAID V Controller
1920 1044 c032 ASR-2005S I2O Zero Channel
19211045 OPTi Inc.
1922 a0f8 82C750 [Vendetta] USB Controller
1923 c101 92C264
1924 c178 92C178
1925 c556 82X556 [Viper]
1926 c557 82C557 [Viper-M]
1927 c558 82C558 [Viper-M ISA+IDE]
1928 c567 82C750 [Vendetta], device 0
1929 c568 82C750 [Vendetta], device 1
1930 c569 82C579 [Viper XPress+ Chipset]
1931 c621 82C621 [Viper-M/N+]
1932 c700 82C700 [FireStar]
1933 c701 82C701 [FireStar Plus]
1934 c814 82C814 [Firebridge 1]
1935 c822 82C822
1936 c824 82C824
1937 c825 82C825 [Firebridge 2]
1938 c832 82C832
1939 c861 82C861
1940 c895 82C895
1941 c935 EV1935 ECTIVA MachOne PCIAudio
1942 d568 82C825 [Firebridge 2]
1943 d721 IDE [FireStar]
19441046 IPC Corporation, Ltd.
19451047 Genoa Systems Corp
19461048 Elsa AG
1947 0c60 Gladiac MX
1948 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL]
1949 1000 QuickStep 1000
1950 3000 QuickStep 3000
1951 8901 Gloria XL
19521049 Fountain Technologies, Inc.
1953# # nee SGS Thomson Microelectronics
1954104a STMicroelectronics
1955 0008 STG 2000X
1956 0009 STG 1764X
1957 0010 STG4000 [3D Prophet Kyro Series]
1958 0209 STPC Consumer/Industrial North- and Southbridge
1959 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge
1960# From <http://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-stable/src/share/misc/pci_vendors>
1961 0210 STPC Atlas ISA Bridge
1962 021a STPC Consumer S Southbridge
1963 021b STPC Consumer IIA Southbridge
1964 0500 ST70137 [Unicorn] ADSL DMT Transceiver
1965 0564 STPC Client Northbridge
1966 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
1967 1746 STG 1764X
1968 2774 21x4x DEC-Tulip compatible 10/100 Ethernet
1969 3520 MPEG-II decoder card
1970 55cc STPC Client Southbridge
1971104b BusLogic
1972 0140 BT-946C (old) [multimaster 01]
1973 1040 BT-946C (BA80C30) [MultiMaster 10]
1974 8130 Flashpoint LT
1975104c Texas Instruments
1976 0500 100 MBit LAN Controller
1977 0508 TMS380C2X Compressor Interface
1978 1000 Eagle i/f AS
1979 104c PCI1510 PC card Cardbus Controller
1980 3d04 TVP4010 [Permedia]
1981 3d07 TVP4020 [Permedia 2]
1982 1011 4d10 Comet
1983 1040 000f AccelStar II
1984 1040 0011 AccelStar II
1985 1048 0a31 WINNER 2000
1986 1048 0a32 GLoria Synergy
1987 1048 0a35 GLoria Synergy
1988 107d 2633 WinFast 3D L2300
1989 1092 0127 FIRE GL 1000 PRO
1990 1092 0136 FIRE GL 1000 PRO
1991 1092 0141 FIRE GL 1000 PRO
1992 1092 0146 FIRE GL 1000 PRO
1993 1092 0148 FIRE GL 1000 PRO
1994 1092 0149 FIRE GL 1000 PRO
1995 1092 0152 FIRE GL 1000 PRO
1996 1092 0154 FIRE GL 1000 PRO
1997 1092 0155 FIRE GL 1000 PRO
1998 1092 0156 FIRE GL 1000 PRO
1999 1092 0157 FIRE GL 1000 PRO
2000 1097 3d01 Jeronimo Pro
2001 1102 100f Graphics Blaster Extreme
2002 3d3d 0100 Reference Permedia 2 3D
2003 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller
2004 e4bf 1010 CF1-1-SNARE
2005 e4bf 1020 CF1-2-SNARE
2006 8009 FireWire Controller
2007 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller
2008 8017 PCI4410 FireWire Controller
2009 8019 TSB12LV23 IEEE-1394 Controller
2010 11bd 000a Studio DV500-1394
2011 11bd 000e Studio DV
2012 e4bf 1010 CF2-1-CYMBAL
2013 8020 TSB12LV26 IEEE-1394 Controller (Link)
2014 11bd 000f Studio DV500-1394
2015 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)
2016 104d 80df Vaio PCG-FX403
2017 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
2018 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link)
2019 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
2020 103c 088c nc8000 laptop
2021 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
2022 8025 TSB82AA2 IEEE-1394b Link Layer Controller
2023 55aa 55aa FireWire 800 PCI Card
2024 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
2025 8027 PCI4451 IEEE-1394 Controller
2026 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)
2027 8029 PCI4510 IEEE-1394 Controller
2028 1028 0163 Latitude D505
2029 1071 8160 MIM2900
2030 802b PCI7410,7510,7610 OHCI-Lynx Controller
2031 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Dell Latitude D800)
2032 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller
2033 8031 Texas Instruments PCIxx21/x515 Cardbus Controller
2034 8032 Texas Instruments OHCI Compliant IEEE 1394 Host Controller
2035 8033 Texas Instruments PCIxx21 Integrated FlashMedia Controller
2036 8034 Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller
2037 8035 Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Smart Card Controller (SMC)
2038 8201 PCI1620 Firmware Loading Function
2039 8204 PCI7410,7510,7610 PCI Firmware Loading Function
2040 1028 014e Latitude D800
2041 8400 ACX 100 22Mbps Wireless Interface
2042 00fc 16ec U.S. Robotics 22 Mbps Wireless PC Card (model 2210)
2043 00fd 16ec U.S. Robotics 22Mbps Wireless PCI Adapter (model 2216)
2044 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]
2045 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter
2046 8401 ACX 100 22Mbps Wireless Interface
2047# OK, this info is almost useless as is, but at least it's known that it's a wireless card. More info requested from reporter (whi
2048 9000 Wireless Interface (of unknown type)
2049 9066 ACX 111 54Mbps Wireless Interface
2050 a001 TDC1570
2051 a100 TDC1561
2052 a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f
2053 a106 TMS320C6205 Fixed Point DSP
2054 175c 5000 ASI50xx Audio Adapter
2055 175c 8700 ASI87xx Radio Tuner card
2056 ac10 PCI1050
2057 ac11 PCI1053
2058 ac12 PCI1130
2059 ac13 PCI1031
2060 ac15 PCI1131
2061 ac16 PCI1250
2062 1014 0092 ThinkPad 600
2063 ac17 PCI1220
2064 ac18 PCI1260
2065 ac19 PCI1221
2066 ac1a PCI1210
2067 ac1b PCI1450
2068 0e11 b113 Armada M700
2069 ac1c PCI1225
2070 0e11 b121 Armada E500
2071 1028 0088 Dell Computer Corporation Latitude CPi A400XT
2072 ac1d PCI1251A
2073 ac1e PCI1211
2074 ac1f PCI1251B
2075 ac20 TI 2030
2076 ac21 PCI2031
2077 ac22 PCI2032 PCI Docking Bridge
2078 ac23 PCI2250 PCI-to-PCI Bridge
2079 ac28 PCI2050 PCI-to-PCI Bridge
2080 ac30 PCI1260 PC card Cardbus Controller
2081 ac40 PCI4450 PC card Cardbus Controller
2082 ac41 PCI4410 PC card Cardbus Controller
2083 ac42 PCI4451 PC card Cardbus Controller
2084 1028 00e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100)
2085 ac44 PCI4510 PC card Cardbus Controller
2086 1028 0163 Latitude D505
2087 1071 8160 MIM2000
2088 ac46 PCI4520 PC card Cardbus Controller
2089 ac47 PCI7510 PC card Cardbus Controller
2090 1028 014e Latitude D800
2091 ac4a PCI7510,7610 PC card Cardbus Controller
2092 1028 014e Latitude D800
2093 ac50 PCI1410 PC card Cardbus Controller
2094 ac51 PCI1420
2095 1014 023b ThinkPad T23 (2647-4MG)
2096 1028 00b1 Latitude C600
2097 1028 012a Latitude C640
2098 1033 80cd Versa Note VXi
2099 10cf 1095 Lifebook C6155
2100 e4bf 1000 CP2-2-HIPHOP
2101 ac52 PCI1451 PC card Cardbus Controller
2102 ac53 PCI1421 PC card Cardbus Controller
2103 ac54 PCI1620 PC Card Controller
2104 ac55 PCI1520 PC card Cardbus Controller
2105 1014 0512 ThinkPad T30/T40
2106 ac56 PCI1510 PC card Cardbus Controller
2107 1014 0528 ThinkPad R40e (2684-HVG) Cardbus Controller
2108 ac60 PCI2040 PCI to DSP Bridge Controller
2109 175c 5100 ASI51xx Audio Adapter
2110 175c 6100 ASI61xx Audio Adapter
2111 175c 6200 ASI62xx Audio Adapter
2112 ac8d PCI 7620
2113 ac8e PCI7420 CardBus Controller
2114 ac8f PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets
2115 fe00 FireWire Host Controller
2116 fe03 12C01A FireWire Host Controller
2117104d Sony Corporation
2118 8004 DTL-H2500 [Playstation development board]
2119 8009 CXD1947Q i.LINK Controller
2120 8039 CXD3222 i.LINK Controller
2121 8056 Rockwell HCF 56K modem
2122 808a Memory Stick Controller
2123104e Oak Technology, Inc
2124 0017 OTI-64017
2125 0107 OTI-107 [Spitfire]
2126 0109 Video Adapter
2127 0111 OTI-64111 [Spitfire]
2128 0217 OTI-64217
2129 0317 OTI-64317
2130104f Co-time Computer Ltd
21311050 Winbond Electronics Corp
2132 0000 NE2000
2133 0001 W83769F
2134 0105 W82C105
2135 0840 W89C840
2136 1050 0001 W89C840 Ethernet Adapter
2137 1050 0840 W89C840 Ethernet Adapter
2138 0940 W89C940
2139 5a5a W89C940F
2140 6692 W6692
2141 9921 W99200F MPEG-1 Video Encoder
2142 9922 W99200F/W9922PF MPEG-1/2 Video Encoder
2143 9970 W9970CF
21441051 Anigma, Inc.
21451052 ?Young Micro Systems
21461053 Young Micro Systems
21471054 Hitachi, Ltd
21481055 Efar Microsystems
2149 9130 SLC90E66 [Victory66] IDE
2150 9460 SLC90E66 [Victory66] ISA
2151 9462 SLC90E66 [Victory66] USB
2152 9463 SLC90E66 [Victory66] ACPI
21531056 ICL
2154# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this.
21551057 Motorola
2156 0001 MPC105 [Eagle]
2157 0002 MPC106 [Grackle]
2158 0003 MPC8240 [Kahlua]
2159 0004 MPC107
2160 0006 MPC8245 [Unity]
2161 0008 MPC8540
2162 0009 MPC8560
2163 0100 MC145575 [HFC-PCI]
2164 0431 KTI829c 100VG
2165 1801 DSP56301 Digital Signal Processor
2166 14fb 0101 Transas Radar Imitator Board [RIM]
2167 14fb 0102 Transas Radar Imitator Board [RIM-2]
2168 14fb 0202 Transas Radar Integrator Board [RIB-2]
2169 14fb 0611 1 channel CAN bus Controller [CanPci-1]
2170 14fb 0612 2 channels CAN bus Controller [CanPci-2]
2171 14fb 0613 3 channels CAN bus Controller [CanPci-3]
2172 14fb 0614 4 channels CAN bus Controller [CanPci-4]
2173 14fb 0621 1 channel CAN bus Controller [CanPci2-1]
2174 14fb 0622 2 channels CAN bus Controller [CanPci2-2]
2175 14fb 0810 Transas VTS Radar Integrator Board [RIB-4]
2176 175c 4200 ASI4215 Audio Adapter
2177 175c 4300 ASI43xx Audio Adapter
2178 175c 4400 ASI4401 Audio Adapter
2179 ecc0 0010 Darla
2180 ecc0 0020 Gina
2181 ecc0 0030 Layla rev.0
2182 ecc0 0031 Layla rev.1
2183 ecc0 0040 Darla24 rev.0
2184 ecc0 0041 Darla24 rev.1
2185 ecc0 0050 Gina24 rev.0
2186 ecc0 0051 Gina24 rev.1
2187 ecc0 0070 Mona rev.0
2188 ecc0 0071 Mona rev.1
2189 ecc0 0072 Mona rev.2
2190 18c0 MPC8265A/MPC8266
2191 18c1 MPC8271/MPC8272
2192 3410 DSP56361 Digital Signal Processor
2193 ecc0 0050 Gina24 rev.0
2194 ecc0 0051 Gina24 rev.1
2195 ecc0 0060 Layla24
2196 ecc0 0070 Mona rev.0
2197 ecc0 0071 Mona rev.1
2198 ecc0 0072 Mona rev.2
2199 ecc0 0080 Mia rev.0
2200 ecc0 0081 Mia rev.1
2201 ecc0 0090 Indigo
2202 ecc0 00a0 Indigo IO
2203 ecc0 00b0 Indigo DJ
2204 ecc0 0100 3G
2205 4801 Raven
2206 4802 Falcon
2207 4803 Hawk
2208 4806 CPX8216
2209 4d68 20268
2210 5600 SM56 PCI Modem
2211 1057 0300 SM56 PCI Speakerphone Modem
2212 1057 0301 SM56 PCI Voice Modem
2213 1057 0302 SM56 PCI Fax Modem
2214 1057 5600 SM56 PCI Voice modem
2215 13d2 0300 SM56 PCI Speakerphone Modem
2216 13d2 0301 SM56 PCI Voice modem
2217 13d2 0302 SM56 PCI Fax Modem
2218 1436 0300 SM56 PCI Speakerphone Modem
2219 1436 0301 SM56 PCI Voice modem
2220 1436 0302 SM56 PCI Fax Modem
2221 144f 100c SM56 PCI Fax Modem
2222 1494 0300 SM56 PCI Speakerphone Modem
2223 1494 0301 SM56 PCI Voice modem
2224 14c8 0300 SM56 PCI Speakerphone Modem
2225 14c8 0302 SM56 PCI Fax Modem
2226 1668 0300 SM56 PCI Speakerphone Modem
2227 1668 0302 SM56 PCI Fax Modem
2228 5803 MPC5200
2229 6400 MPC190 Security Processor (S1 family, encryption)
2230 6405 MPC184 Security Processor (S1 family)
22311058 Electronics & Telecommunications RSH
22321059 Teknor Industrial Computers Inc
2233105a Promise Technology, Inc.
2234# more correct description from promise linux sources
2235 0d30 PDC20265 (FastTrak100 Lite/Ultra100)
2236 105a 4d33 Ultra100
2237 0d38 20263
2238 105a 4d39 Fasttrak66
2239 1275 20275
2240 3318 PDC20318 (SATA150 TX4)
2241 3319 PDC20319 (FastTrak S150 TX4)
2242 8086 3427 S875WP1-E mainboard
2243 3371 PDC20371 (FastTrak S150 TX2plus)
2244 3373 PDC20378 (FastTrak 378/SATA 378)
2245 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard
2246 1462 702e K8T NEO FIS2R motherboard
2247 3375 PDC20375 (SATA150 TX2plus)
2248 3376 PDC20376 (FastTrak 376)
2249 1043 809e A7V8X motherboard
2250 3574 PDC20579 SATAII 150 IDE Controller
2251 3d18 PDC20518/PDC40518 (SATAII 150 TX4)
2252 3d75 PDC20575 (SATAII150 TX2plus)
2253 4d30 PDC20267 (FastTrak100/Ultra100)
2254 105a 4d33 Ultra100
2255 105a 4d39 FastTrak100
2256 4d33 20246
2257 105a 4d33 20246 IDE Controller
2258 4d38 PDC20262 (FastTrak66/Ultra66)
2259 105a 4d30 Ultra Device on SuperTrak
2260 105a 4d33 Ultra66
2261 105a 4d39 FastTrak66
2262 4d68 PDC20268 (Ultra100 TX2)
2263 105a 4d68 Ultra100TX2
2264 4d69 20269
2265 105a 4d68 Ultra133TX2
2266 5275 PDC20276 (MBFastTrak133 Lite)
2267 105a 0275 SuperTrak SX6000 IDE
2268 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode)
2269 1458 b001 MBUltra 133
2270 5300 DC5300
2271 6268 PDC20270 (FastTrak100 LP/TX2/TX4)
2272 105a 4d68 FastTrak100 TX2
2273 6269 PDC20271 (FastTrak TX2000)
2274 105a 6269 FastTrak TX2/TX2000
2275 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
2276 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
2277 6626 PDC20618 (Ultra 618)
2278 6629 PDC20619 (FastTrak TX4000)
2279 7275 PDC20277 (SBFastTrak133 Lite)
2280105b Foxconn International, Inc.
2281105c Wipro Infotech Limited
2282105d Number 9 Computer Company
2283 2309 Imagine 128
2284 2339 Imagine 128-II
2285 105d 0000 Imagine 128 series 2 4Mb VRAM
2286 105d 0001 Imagine 128 series 2 4Mb VRAM
2287 105d 0002 Imagine 128 series 2 4Mb VRAM
2288 105d 0003 Imagine 128 series 2 4Mb VRAM
2289 105d 0004 Imagine 128 series 2 4Mb VRAM
2290 105d 0005 Imagine 128 series 2 4Mb VRAM
2291 105d 0006 Imagine 128 series 2 4Mb VRAM
2292 105d 0007 Imagine 128 series 2 4Mb VRAM
2293 105d 0008 Imagine 128 series 2e 4Mb DRAM
2294 105d 0009 Imagine 128 series 2e 4Mb DRAM
2295 105d 000a Imagine 128 series 2 8Mb VRAM
2296 105d 000b Imagine 128 series 2 8Mb H-VRAM
2297 11a4 000a Barco Metheus 5 Megapixel
2298 13cc 0000 Barco Metheus 5 Megapixel
2299 13cc 0004 Barco Metheus 5 Megapixel
2300 13cc 0005 Barco Metheus 5 Megapixel
2301 13cc 0006 Barco Metheus 5 Megapixel
2302 13cc 0008 Barco Metheus 5 Megapixel
2303 13cc 0009 Barco Metheus 5 Megapixel
2304 13cc 000a Barco Metheus 5 Megapixel
2305 13cc 000c Barco Metheus 5 Megapixel
2306 493d Imagine 128 T2R [Ticket to Ride]
2307 11a4 000a Barco Metheus 5 Megapixel, Dual Head
2308 11a4 000b Barco Metheus 5 Megapixel, Dual Head
2309 13cc 0002 Barco Metheus 4 Megapixel, Dual Head
2310 13cc 0003 Barco Metheus 5 Megapixel, Dual Head
2311 13cc 0007 Barco Metheus 5 Megapixel, Dual Head
2312 13cc 0008 Barco Metheus 5 Megapixel, Dual Head
2313 13cc 0009 Barco Metheus 5 Megapixel, Dual Head
2314 13cc 000a Barco Metheus 5 Megapixel, Dual Head
2315 5348 Revolution 4
2316 105d 0037 Revolution IV-FP AGP (For SGI 1600SW)
2317105e Vtech Computers Ltd
2318105f Infotronic America Inc
23191060 United Microelectronics [UMC]
2320 0001 UM82C881
2321 0002 UM82C886
2322 0101 UM8673F
2323 0881 UM8881
2324 0886 UM8886F
2325 0891 UM8891A
2326 1001 UM886A
2327 673a UM8886BF
2328 673b EIDE Master/DMA
2329 8710 UM8710
2330 886a UM8886A
2331 8881 UM8881F
2332 8886 UM8886F
2333 888a UM8886A
2334 8891 UM8891A
2335 9017 UM9017F
2336 9018 UM9018
2337 9026 UM9026
2338 e881 UM8881N
2339 e886 UM8886N
2340 e88a UM8886N
2341 e891 UM8891N
23421061 I.I.T.
2343 0001 AGX016
2344 0002 IIT3204/3501
23451062 Maspar Computer Corp
23461063 Ocean Office Automation
23471064 Alcatel
23481065 Texas Microsystems
23491066 PicoPower Technology
2350 0000 PT80C826
2351 0001 PT86C521 [Vesuvius v1] Host Bridge
2352 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master
2353 0003 PT86C524 [Nile] PCI-to-PCI Bridge
2354 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge
2355 0005 National PC87550 System Controller
2356 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave
23571067 Mitsubishi Electric
2358 0301 AccelGraphics AccelECLIPSE
2359 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
2360 0308 Tornado 3000 [OEM Evans & Sutherland]
2361 1002 VG500 [VolumePro Volume Rendering Accelerator]
23621068 Diversified Technology
23631069 Mylex Corporation
2364 0001 DAC960P
2365 0002 DAC960PD
2366 0010 DAC960PG
2367 0020 DAC960LA
2368 0050 AcceleRAID 352/170/160 support Device
2369 b166 Gemstone chipset SCSI controller
2370 1014 0242 iSeries 2872 DASD IOA
2371 1014 0266 Dual Channel PCI-X U320 SCSI Adapter
2372 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter
2373 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter
2374 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter
2375 ba55 eXtremeRAID 1100 support Device
2376 ba56 eXtremeRAID 2000/3000 support Device
2377106a Aten Research Inc
2378106b Apple Computer Inc.
2379 0001 Bandit PowerPC host bridge
2380 0002 Grand Central I/O
2381 0003 Control Video
2382 0004 PlanB Video-In
2383 0007 O'Hare I/O
2384 000c DOS on Mac
2385 000e Hydra Mac I/O
2386 0010 Heathrow Mac I/O
2387 0017 Paddington Mac I/O
2388 0018 UniNorth FireWire
2389 0019 KeyLargo USB
2390 001e UniNorth Internal PCI
2391 001f UniNorth PCI
2392 0020 UniNorth AGP
2393 0021 UniNorth GMAC (Sun GEM)
2394 0022 KeyLargo Mac I/O
2395 0024 UniNorth/Pangea GMAC (Sun GEM)
2396 0025 KeyLargo/Pangea Mac I/O
2397 0026 KeyLargo/Pangea USB
2398 0027 UniNorth/Pangea AGP
2399 0028 UniNorth/Pangea PCI
2400 0029 UniNorth/Pangea Internal PCI
2401 002d UniNorth 1.5 AGP
2402 002e UniNorth 1.5 PCI
2403 002f UniNorth 1.5 Internal PCI
2404 0030 UniNorth/Pangea FireWire
2405 0031 UniNorth 2 FireWire
2406 0032 UniNorth 2 GMAC (Sun GEM)
2407 0033 UniNorth 2 ATA/100
2408 0034 UniNorth 2 AGP
2409 0035 UniNorth 2 PCI
2410 0036 UniNorth 2 Internal PCI
2411 003b UniNorth/Intrepid ATA/100
2412 003e KeyLargo/Intrepid Mac I/O
2413 003f KeyLargo/Intrepid USB
2414 0040 K2 KeyLargo USB
2415 0041 K2 KeyLargo Mac/IO
2416 0042 K2 FireWire
2417 0043 K2 ATA/100
2418 0045 K2 HT-PCI Bridge
2419 0046 K2 HT-PCI Bridge
2420 0047 K2 HT-PCI Bridge
2421 0048 K2 HT-PCI Bridge
2422 0049 K2 HT-PCI Bridge
2423 004b U3 AGP
2424 004c K2 GMAC (Sun GEM)
2425 004f Shasta Mac I/O
2426 0050 Shasta IDE
2427 0051 Shasta (Sun GEM)
2428 0052 Shasta Firewire
2429 0053 Shasta PCI Bridge
2430 0054 Shasta PCI Bridge
2431 0055 Shasta PCI Bridge
2432 0058 U3L AGP Bridge
2433 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)
2434106c Hynix Semiconductor
2435 8801 Dual Pentium ISA/PCI Motherboard
2436 8802 PowerPC ISA/PCI Motherboard
2437 8803 Dual Window Graphics Accelerator
2438 8804 LAN Controller
2439 8805 100-BaseT LAN
2440106d Sequent Computer Systems
2441106e DFI, Inc
2442106f City Gate Development Ltd
24431070 Daewoo Telecom Ltd
24441071 Mitac
2445 8160 Mitac 8060B Mobile Platform
24461072 GIT Co Ltd
24471073 Yamaha Corporation
2448 0001 3D GUI Accelerator
2449 0002 YGV615 [RPA3 3D-Graphics Controller]
2450 0003 YMF-740
2451 0004 YMF-724
2452 1073 0004 YMF724-Based PCI Audio Adapter
2453 0005 DS1 Audio
2454 1073 0005 DS-XG PCI Audio CODEC
2455 0006 DS1 Audio
2456 0008 DS1 Audio
2457 1073 0008 DS-XG PCI Audio CODEC
2458 000a DS1L Audio
2459 1073 0004 DS-XG PCI Audio CODEC
2460 1073 000a DS-XG PCI Audio CODEC
2461 000c YMF-740C [DS-1L Audio Controller]
2462 107a 000c DS-XG PCI Audio CODEC
2463 000d YMF-724F [DS-1 Audio Controller]
2464 1073 000d DS-XG PCI Audio CODEC
2465 0010 YMF-744B [DS-1S Audio Controller]
2466 1073 0006 DS-XG PCI Audio CODEC
2467 1073 0010 DS-XG PCI Audio CODEC
2468 0012 YMF-754 [DS-1E Audio Controller]
2469 1073 0012 DS-XG PCI Audio Codec
2470 0020 DS-1 Audio
2471 2000 DS2416 Digital Mixing Card
2472 1073 2000 DS2416 Digital Mixing Card
24731074 NexGen Microsystems
2474 4e78 82c500/1
24751075 Advanced Integrations Research
24761076 Chaintech Computer Co. Ltd
24771077 QLogic Corp.
2478 1016 ISP10160 Single Channel Ultra3 SCSI Processor
2479 1020 ISP1020 Fast-wide SCSI
2480 1022 ISP1022 Fast-wide SCSI
2481 1080 ISP1080 SCSI Host Adapter
2482 1216 ISP12160 Dual Channel Ultra3 SCSI Processor
2483 101e 8471 QLA12160 on AMI MegaRAID
2484 101e 8493 QLA12160 on AMI MegaRAID
2485 1240 ISP1240 SCSI Host Adapter
2486 1280 ISP1280 SCSI Host Adapter
2487 2020 ISP2020A Fast!SCSI Basic Adapter
2488 2100 QLA2100 64-bit Fibre Channel Adapter
2489 1077 0001 QLA2100 64-bit Fibre Channel Adapter
2490 2200 QLA2200 64-bit Fibre Channel Adapter
2491 1077 0002 QLA2200
2492 2300 QLA2300 64-bit Fibre Channel Adapter
2493 2312 QLA2312 Fibre Channel Adapter
24941078 Cyrix Corporation
2495 0000 5510 [Grappa]
2496 0001 PCI Master
2497 0002 5520 [Cognac]
2498 0100 5530 Legacy [Kahlua]
2499 0101 5530 SMI [Kahlua]
2500 0102 5530 IDE [Kahlua]
2501 0103 5530 Audio [Kahlua]
2502 0104 5530 Video [Kahlua]
2503 0400 ZFMicro PCI Bridge
2504 0401 ZFMicro Chipset SMI
2505 0402 ZFMicro Chipset IDE
2506 0403 ZFMicro Expansion Bus
25071079 I-Bus
2508107a NetWorth
2509107b Gateway 2000
2510107c LG Electronics [Lucky Goldstar Co. Ltd]
2511107d LeadTek Research Inc.
2512 0000 P86C850
2513 2134 WinFast 3D S320 II
2514 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo
2515107e Interphase Corporation
2516 0001 5515 ATM Adapter [Flipper]
2517 0002 100 VG AnyLan Controller
2518 0004 5526 Fibre Channel Host Adapter
2519 0005 x526 Fibre Channel Host Adapter
2520 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic]
2521 9003 5535-4P-BRI-ST
2522 9007 5535-4P-BRI-U
2523 9008 5535-1P-SR
2524 900c 5535-1P-SR-ST
2525 900e 5535-1P-SR-U
2526 9011 5535-1P-PRI
2527 9013 5535-2P-PRI
2528 9023 5536-4P-BRI-ST
2529 9027 5536-4P-BRI-U
2530 9031 5536-1P-PRI
2531 9033 5536-2P-PRI
2532107f Data Technology Corporation
2533 0802 SL82C105
25341080 Contaq Microsystems
2535 0600 82C599
2536 c691 Cypress CY82C691
2537 c693 82c693
25381081 Supermac Technology
2539 0d47 Radius PCI to NuBUS Bridge
25401082 EFA Corporation of America
25411083 Forex Computer Corporation
2542 0001 FR710
25431084 Parador
25441085 Tulip Computers Int.B.V.
25451086 J. Bond Computer Systems
25461087 Cache Computer
25471088 Microcomputer Systems (M) Son
25481089 Data General Corporation
2549# Formerly Bit3 Computer Corp.
2550108a SBS Technologies
2551 0001 VME Bridge Model 617
2552 0010 VME Bridge Model 618
2553 0040 dataBLIZZARD
2554 3000 VME Bridge Model 2706
2555108c Oakleigh Systems Inc.
2556108d Olicom
2557 0001 Token-Ring 16/4 PCI Adapter (3136/3137)
2558 0002 16/4 Token Ring
2559 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter
2560 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
2561 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card
2562 0006 OC-3530 RapidFire Token-Ring 100
2563 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter
2564 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter
2565 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter
2566 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter
2567 0011 OC-2315
2568 0012 OC-2325
2569 0013 OC-2183/2185
2570 0014 OC-2326
2571 0019 OC-2327/2250 10/100 Ethernet Adapter
2572 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter
2573 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter
2574 0021 OC-6151/6152 [RapidFire ATM 155]
2575 0022 ATM Adapter
2576108e Sun Microsystems Computer Corp.
2577 0001 EBUS
2578 1000 EBUS
2579 1001 Happy Meal
2580 1100 RIO EBUS
2581 1101 RIO GEM
2582 1102 RIO 1394
2583 1103 RIO USB
2584 1648 [bge] Gigabit Ethernet
2585 2bad GEM
2586 5000 Simba Advanced PCI Bridge
2587 5043 SunPCI Co-processor
2588 8000 Psycho PCI Bus Module
2589 8001 Schizo PCI Bus Module
2590 8002 Schizo+ PCI Bus Module
2591 a000 Ultra IIi
2592 a001 Ultra IIe
2593 a801 Tomatillo PCI Bus Module
2594 abba Cassini 10/100/1000
2595108f Systemsoft
25961090 Encore Computer Corporation
25971091 Intergraph Corporation
2598 0020 3D graphics processor
2599 0021 3D graphics processor w/Texturing
2600 0040 3D graphics frame buffer
2601 0041 3D graphics frame buffer
2602 0060 Proprietary bus bridge
2603 00e4 Powerstorm 4D50T
2604 0720 Motion JPEG codec
2605 07a0 Sun Expert3D-Lite Graphics Accelerator
2606 1091 Sun Expert3D Graphics Accelerator
26071092 Diamond Multimedia Systems
2608 00a0 Speedstar Pro SE
2609 00a8 Speedstar 64
2610 0550 Viper V550
2611 08d4 Supra 2260 Modem
2612 094c SupraExpress 56i Pro
2613 1092 Viper V330
2614 6120 Maximum DVD
2615 8810 Stealth SE
2616 8811 Stealth 64/SE
2617 8880 Stealth
2618 8881 Stealth
2619 88b0 Stealth 64
2620 88b1 Stealth 64
2621 88c0 Stealth 64
2622 88c1 Stealth 64
2623 88d0 Stealth 64
2624 88d1 Stealth 64
2625 88f0 Stealth 64
2626 88f1 Stealth 64
2627 9999 DMD-I0928-1 "Monster sound" sound chip
26281093 National Instruments
2629 0160 PCI-DIO-96
2630 0162 PCI-MIO-16XE-50
2631 1170 PCI-MIO-16XE-10
2632 1180 PCI-MIO-16E-1
2633 1190 PCI-MIO-16E-4
2634 1310 PCI-6602
2635 1330 PCI-6031E
2636 1350 PCI-6071E
2637 14e0 PCI-6110
2638 14f0 PCI-6111
2639 17d0 PCI-6503
2640 1870 PCI-6713
2641 1880 PCI-6711
2642 18b0 PCI-6052E
2643 2410 PCI-6733
2644 2890 PCI-6036E
2645 2a60 PCI-6023E
2646 2a70 PCI-6024E
2647 2a80 PCI-6025E
2648 2c80 PCI-6035E
2649 2ca0 PCI-6034E
2650 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ]
2651 b001 IMAQ-PCI-1408
2652 b011 IMAQ-PXI-1408
2653 b021 IMAQ-PCI-1424
2654 b031 IMAQ-PCI-1413
2655 b041 IMAQ-PCI-1407
2656 b051 IMAQ-PXI-1407
2657 b061 IMAQ-PCI-1411
2658 b071 IMAQ-PCI-1422
2659 b081 IMAQ-PXI-1422
2660 b091 IMAQ-PXI-1411
2661 c801 PCI-GPIB
2662 c831 PCI-GPIB bridge
26631094 First International Computers [FIC]
26641095 Silicon Image, Inc. (formerly CMD Technology Inc)
2665 0240 Adaptec AAR-1210SA SATA HostRAID Controller
2666 0640 PCI0640
2667 0643 PCI0643
2668 0646 PCI0646
2669 0647 PCI0647
2670 0648 PCI0648
2671 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller
2672 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller
2673 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller
2674 101e 0649 AMI MegaRAID IDE 100 Controller
2675 0650 PBC0650A
2676 0670 USB0670
2677 1095 0670 USB0670
2678 0673 USB0673
2679 0680 PCI0680 Ultra ATA-133 Host Controller
2680 1095 3680 Winic W-680 (Silicon Image 680 based)
2681 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller
2682 1095 3112 SiI 3112 SATALink Controller
2683 1095 6112 SiI 3112 SATARaid Controller
2684 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller
2685 1095 3114 SiI 3114 SATALink Controller
2686 1095 6114 SiI 3114 SATARaid Controller
2687 3124 SiI 3124 PCI-X Serial ATA Controller
2688 1095 3124 SiI 3124 PCI-X Serial ATA Controller
2689 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller
2690 1095 3512 SiI 3512 SATALink Controller
2691 1095 6512 SiI 3512 SATARaid Controller
26921096 Alacron
26931097 Appian Technology
26941098 Quantum Designs (H.K.) Ltd
2695 0001 QD-8500
2696 0002 QD-8580
26971099 Samsung Electronics Co., Ltd
2698109a Packard Bell
2699109b Gemlight Computer Ltd.
2700109c Megachips Corporation
2701109d Zida Technologies Ltd.
2702109e Brooktree Corporation
2703 0350 Bt848 Video Capture
2704 0351 Bt849A Video capture
2705 0369 Bt878 Video Capture
2706 1002 0001 TV-Wonder
2707 1002 0003 TV-Wonder/VE
2708 036c Bt879(??) Video Capture
2709 13e9 0070 Win/TV (Video Section)
2710 036e Bt878 Video Capture
2711 0070 13eb WinTV Series
2712 0070 ff01 Viewcast Osprey 200
2713 0071 0101 DigiTV PCI
2714 107d 6606 WinFast TV 2000
2715 11bd 0012 PCTV pro (TV + FM stereo receiver)
2716 11bd 001c PCTV Sat (DBC receiver)
2717 127a 0001 Bt878 Mediastream Controller NTSC
2718 127a 0002 Bt878 Mediastream Controller PAL BG
2719 127a 0003 Bt878a Mediastream Controller PAL BG
2720 127a 0048 Bt878/832 Mediastream Controller
2721 144f 3000 MagicTView CPH060 - Video
2722 1461 0002 TV98 Series (TV/No FM/Remote)
2723 1461 0003 AverMedia UltraTV PCI 350
2724 1461 0004 AVerTV WDM Video Capture
2725 1461 0761 AverTV DVB-T
2726 14f1 0001 Bt878 Mediastream Controller NTSC
2727 14f1 0002 Bt878 Mediastream Controller PAL BG
2728 14f1 0003 Bt878a Mediastream Controller PAL BG
2729 14f1 0048 Bt878/832 Mediastream Controller
2730 1822 0001 VisionPlus DVB card
2731 1851 1850 FlyVideo'98 - Video
2732 1851 1851 FlyVideo II
2733 1852 1852 FlyVideo'98 - Video (with FM Tuner)
2734 270f fc00 Digitop DTT-1000
2735 bd11 1200 PCTV pro (TV + FM stereo receiver)
2736 036f Bt879 Video Capture
2737 127a 0044 Bt879 Video Capture NTSC
2738 127a 0122 Bt879 Video Capture PAL I
2739 127a 0144 Bt879 Video Capture NTSC
2740 127a 0222 Bt879 Video Capture PAL BG
2741 127a 0244 Bt879a Video Capture NTSC
2742 127a 0322 Bt879 Video Capture NTSC
2743 127a 0422 Bt879 Video Capture NTSC
2744 127a 1122 Bt879 Video Capture PAL I
2745 127a 1222 Bt879 Video Capture PAL BG
2746 127a 1322 Bt879 Video Capture NTSC
2747 127a 1522 Bt879a Video Capture PAL I
2748 127a 1622 Bt879a Video Capture PAL BG
2749 127a 1722 Bt879a Video Capture NTSC
2750 14f1 0044 Bt879 Video Capture NTSC
2751 14f1 0122 Bt879 Video Capture PAL I
2752 14f1 0144 Bt879 Video Capture NTSC
2753 14f1 0222 Bt879 Video Capture PAL BG
2754 14f1 0244 Bt879a Video Capture NTSC
2755 14f1 0322 Bt879 Video Capture NTSC
2756 14f1 0422 Bt879 Video Capture NTSC
2757 14f1 1122 Bt879 Video Capture PAL I
2758 14f1 1222 Bt879 Video Capture PAL BG
2759 14f1 1322 Bt879 Video Capture NTSC
2760 14f1 1522 Bt879a Video Capture PAL I
2761 14f1 1622 Bt879a Video Capture PAL BG
2762 14f1 1722 Bt879a Video Capture NTSC
2763 1851 1850 FlyVideo'98 - Video
2764 1851 1851 FlyVideo II
2765 1852 1852 FlyVideo'98 - Video (with FM Tuner)
2766 0370 Bt880 Video Capture
2767 1851 1850 FlyVideo'98
2768 1851 1851 FlyVideo'98 EZ - video
2769 1852 1852 FlyVideo'98 (with FM Tuner)
2770 0878 Bt878 Audio Capture
2771 0070 13eb WinTV Series
2772 0070 ff01 Viewcast Osprey 200
2773 0071 0101 DigiTV PCI
2774 1002 0001 TV-Wonder
2775 1002 0003 TV-Wonder/VE
2776 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section)
2777 11bd 001c PCTV Sat (DBC receiver)
2778 127a 0001 Bt878 Video Capture (Audio Section)
2779 127a 0002 Bt878 Video Capture (Audio Section)
2780 127a 0003 Bt878 Video Capture (Audio Section)
2781 127a 0048 Bt878 Video Capture (Audio Section)
2782 13e9 0070 Win/TV (Audio Section)
2783 144f 3000 MagicTView CPH060 - Audio
2784 1461 0004 AVerTV WDM Audio Capture
2785 1461 0761 AVerTV DVB-T
2786 14f1 0001 Bt878 Video Capture (Audio Section)
2787 14f1 0002 Bt878 Video Capture (Audio Section)
2788 14f1 0003 Bt878 Video Capture (Audio Section)
2789 14f1 0048 Bt878 Video Capture (Audio Section)
2790 1822 0001 VisionPlus DVB Card
2791 270f fc00 Digitop DTT-1000
2792 bd11 1200 PCTV pro (TV + FM stereo receiver, audio section)
2793 0879 Bt879 Audio Capture
2794 127a 0044 Bt879 Video Capture (Audio Section)
2795 127a 0122 Bt879 Video Capture (Audio Section)
2796 127a 0144 Bt879 Video Capture (Audio Section)
2797 127a 0222 Bt879 Video Capture (Audio Section)
2798 127a 0244 Bt879 Video Capture (Audio Section)
2799 127a 0322 Bt879 Video Capture (Audio Section)
2800 127a 0422 Bt879 Video Capture (Audio Section)
2801 127a 1122 Bt879 Video Capture (Audio Section)
2802 127a 1222 Bt879 Video Capture (Audio Section)
2803 127a 1322 Bt879 Video Capture (Audio Section)
2804 127a 1522 Bt879 Video Capture (Audio Section)
2805 127a 1622 Bt879 Video Capture (Audio Section)
2806 127a 1722 Bt879 Video Capture (Audio Section)
2807 14f1 0044 Bt879 Video Capture (Audio Section)
2808 14f1 0122 Bt879 Video Capture (Audio Section)
2809 14f1 0144 Bt879 Video Capture (Audio Section)
2810 14f1 0222 Bt879 Video Capture (Audio Section)
2811 14f1 0244 Bt879 Video Capture (Audio Section)
2812 14f1 0322 Bt879 Video Capture (Audio Section)
2813 14f1 0422 Bt879 Video Capture (Audio Section)
2814 14f1 1122 Bt879 Video Capture (Audio Section)
2815 14f1 1222 Bt879 Video Capture (Audio Section)
2816 14f1 1322 Bt879 Video Capture (Audio Section)
2817 14f1 1522 Bt879 Video Capture (Audio Section)
2818 14f1 1622 Bt879 Video Capture (Audio Section)
2819 14f1 1722 Bt879 Video Capture (Audio Section)
2820 0880 Bt880 Audio Capture
2821 2115 BtV 2115 Mediastream controller
2822 2125 BtV 2125 Mediastream controller
2823 2164 BtV 2164
2824 2165 BtV 2165
2825 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC)
2826 8472 Bt8472
2827 8474 Bt8474
2828109f Trigem Computer Inc.
282910a0 Meidensha Corporation
283010a1 Juko Electronics Ind. Co. Ltd
283110a2 Quantum Corporation
283210a3 Everex Systems Inc
283310a4 Globe Manufacturing Sales
283410a5 Smart Link Ltd.
2835 3052 SmartPCI562 56K Modem
2836 5449 SmartPCI561 modem
283710a6 Informtech Industrial Ltd.
283810a7 Benchmarq Microelectronics
283910a8 Sierra Semiconductor
2840 0000 STB Horizon 64
284110a9 Silicon Graphics, Inc.
2842 0001 Crosstalk to PCI Bridge
2843 0002 Linc I/O controller
2844 0003 IOC3 I/O controller
2845 0004 O2 MACE
2846 0005 RAD Audio
2847 0006 HPCEX
2848 0007 RPCEX
2849 0008 DiVO VIP
2850 0009 AceNIC Gigabit Ethernet
2851 10a9 8002 AceNIC Gigabit Ethernet
2852 0010 AMP Video I/O
2853 0011 GRIP
2854 0012 SGH PSHAC GSN
2855 1001 Magic Carpet
2856 1002 Lithium
2857 1003 Dual JPEG 1
2858 1004 Dual JPEG 2
2859 1005 Dual JPEG 3
2860 1006 Dual JPEG 4
2861 1007 Dual JPEG 5
2862 1008 Cesium
2863 100a IOC4 I/O controller
2864 2001 Fibre Channel
2865 2002 ASDE
2866 8001 O2 1394
2867 8002 G-net NT
286810aa ACC Microelectronics
2869 0000 ACCM 2188
287010ab Digicom
287110ac Honeywell IAC
287210ad Symphony Labs
2873 0001 W83769F
2874 0003 SL82C103
2875 0005 SL82C105
2876 0103 SL82c103
2877 0105 SL82c105
2878 0565 W83C553
287910ae Cornerstone Technology
288010af Micro Computer Systems Inc
288110b0 CardExpert Technology
288210b1 Cabletron Systems Inc
288310b2 Raytheon Company
288410b3 Databook Inc
2885 3106 DB87144
2886 b106 DB87144
288710b4 STB Systems Inc
2888 1b1d Velocity 128 3D
2889 10b4 237e Velocity 4400
289010b5 PLX Technology, Inc.
2891 0001 i960 PCI bus interface
2892 1076 VScom 800 8 port serial adaptor
2893 1077 VScom 400 4 port serial adaptor
2894 1078 VScom 210 2 port serial and 1 port parallel adaptor
2895 1103 VScom 200 2 port serial adaptor
2896 1146 VScom 010 1 port parallel adaptor
2897 1147 VScom 020 2 port parallel adaptor
2898 2724 Thales PCSM Security Card
2899 8516 PEX 8516 Versatile PCI Express Switch
2900 8532 PEX 8532 Versatile PCI Express Switch
2901 9030 PCI <-> IOBus Bridge Hot Swap
2902 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board
2903 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board
2904 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board
2905 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board
2906 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board
2907 15ed 1002 MCCS 8-port Serial Hot Swap
2908 15ed 1003 MCCS 16-port Serial Hot Swap
2909 9036 9036
2910 9050 PCI <-> IOBus Bridge
2911 10b5 1067 IXXAT CAN i165
2912 10b5 1172 IK220 (Heidenhain)
2913 10b5 2036 SatPak GPS
2914 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board
2915 10b5 2273 SH-ARC SoHard ARCnet card
2916 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board
2917 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board
2918 10b5 9050 MP9050
2919 1498 0362 TPMC866 8 Channel Serial Card
2920 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem
2921 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem
2922 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem
2923 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem
2924 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem
2925 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem
2926 15ed 1000 Macrolink MCCS 8-port Serial
2927 15ed 1001 Macrolink MCCS 16-port Serial
2928 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap
2929 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap
2930# Sorry, there was a typo
2931 5654 2036 OpenSwitch 6 Telephony card
2932# Sorry, there was a typo
2933 5654 3132 OpenSwitch 12 Telephony card
2934 5654 5634 OpenLine4 Telephony Card
2935 d531 c002 PCIntelliCAN 2xSJA1000 CAN bus
2936 d84d 4006 EX-4006 1P
2937 d84d 4008 EX-4008 1P EPP/ECP
2938 d84d 4014 EX-4014 2P
2939 d84d 4018 EX-4018 3P EPP/ECP
2940 d84d 4025 EX-4025 1S(16C550) RS-232
2941 d84d 4027 EX-4027 1S(16C650) RS-232
2942 d84d 4028 EX-4028 1S(16C850) RS-232
2943 d84d 4036 EX-4036 2S(16C650) RS-232
2944 d84d 4037 EX-4037 2S(16C650) RS-232
2945 d84d 4038 EX-4038 2S(16C850) RS-232
2946 d84d 4052 EX-4052 1S(16C550) RS-422/485
2947 d84d 4053 EX-4053 2S(16C550) RS-422/485
2948 d84d 4055 EX-4055 4S(16C550) RS-232
2949 d84d 4058 EX-4055 4S(16C650) RS-232
2950 d84d 4065 EX-4065 8S(16C550) RS-232
2951 d84d 4068 EX-4068 8S(16C650) RS-232
2952 d84d 4078 EX-4078 2S(16C552) RS-232+1P
2953 9054 PCI <-> IOBus Bridge
2954 10b5 2455 Wessex Techology PHIL-PCI
2955 10b5 2696 Innes Corp AM Radcap card
2956 10b5 2717 Innes Corp Auricon card
2957 10b5 2844 Innes Corp TVS Encoder card
2958 12d9 0002 PCI Prosody Card rev 1.5
2959 16df 0011 PIKA PrimeNet MM PCI
2960 16df 0012 PIKA PrimeNet MM cPCI 8
2961 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling Option)
2962 16df 0014 PIKA PrimeNet MM cPCI 4
2963 16df 0015 PIKA Daytona MM
2964 16df 0016 PIKA InLine MM
2965 9056 Francois
2966 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1
2967 9060 9060
2968 906d 9060SD
2969 125c 0640 Aries 16000P
2970 906e 9060ES
2971 9080 9080
2972 103c 10eb (Agilent) E2777B 83K Series PCI based Optical Communication Interface
2973 103c 10ec (Agilent) E6978-66442 PCI CIC
2974 10b5 9080 9080 [real subsystem ID not set]
2975 129d 0002 Aculab PCI Prosidy card
2976 12d9 0002 PCI Prosody Card
2977 12df 4422 4422PCI ["Do-All" Telemetry Data Aquisition System]
2978 bb04 B&B 3PCIOSD1A Isolated PCI Serial
297910b6 Madge Networks
2980 0001 Smart 16/4 PCI Ringnode
2981 0002 Smart 16/4 PCI Ringnode Mk2
2982 10b6 0002 Smart 16/4 PCI Ringnode Mk2
2983 10b6 0006 16/4 CardBus Adapter
2984 0003 Smart 16/4 PCI Ringnode Mk3
2985 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL
2986 10b6 0003 Smart 16/4 PCI Ringnode Mk3
2987 10b6 0007 Presto PCI Plus Adapter
2988 0004 Smart 16/4 PCI Ringnode Mk1
2989 0006 16/4 Cardbus Adapter
2990 10b6 0006 16/4 CardBus Adapter
2991 0007 Presto PCI Adapter
2992 10b6 0007 Presto PCI
2993 0009 Smart 100/16/4 PCI-HS Ringnode
2994 10b6 0009 Smart 100/16/4 PCI-HS Ringnode
2995 000a Smart 100/16/4 PCI Ringnode
2996 10b6 000a Smart 100/16/4 PCI Ringnode
2997 000b 16/4 CardBus Adapter Mk2
2998 10b6 0008 16/4 CardBus Adapter Mk2
2999 10b6 000b 16/4 Cardbus Adapter Mk2
3000 000c RapidFire 3140V2 16/4 TR Adapter
3001 10b6 000c RapidFire 3140V2 16/4 TR Adapter
3002 1000 Collage 25/155 ATM Client Adapter
3003 1001 Collage 155 ATM Server Adapter
300410b7 3Com Corporation
3005 0001 3c985 1000BaseSX (SX/TX)
3006 0013 AR5212 802.11abg NIC (3CRDAG675)
3007 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter
3008 0910 3C910-A01
3009 1006 MINI PCI type 3B Data Fax Modem
3010 1007 Mini PCI 56k Winmodem
3011 10b7 615c Mini PCI 56K Modem
3012 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]
3013 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]
3014 1700 3c940 10/100/1000Base-T [Marvell]
3015 1043 80eb P4P800/K8V Deluxe motherboard
3016 10b7 0010 3C940 Gigabit LOM Ethernet Adapter
3017 10b7 0020 3C941 Gigabit LOM Ethernet Adapter
3018 147b 1407 KV8-MAX3 motherboard
3019 3390 3c339 TokenLink Velocity
3020 3590 3c359 TokenLink Velocity XL
3021 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B)
3022 4500 3c450 HomePNA [Tornado]
3023 5055 3c555 Laptop Hurricane
3024 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang]
3025 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card
3026 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]
3027 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
3028 5257 3cCFE575CT CardBus [Cyclone]
3029 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet
3030 5900 3c590 10BaseT [Vortex]
3031 5920 3c592 EISA 10mbps Demon/Vortex
3032 5950 3c595 100BaseTX [Vortex]
3033 5951 3c595 100BaseT4 [Vortex]
3034 5952 3c595 100Base-MII [Vortex]
3035 5970 3c597 EISA Fast Demon/Vortex
3036 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang]
3037 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card
3038 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]
3039 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]
3040 6055 3c556 Hurricane CardBus [Cyclone]
3041 6056 3c556B CardBus [Tornado]
3042 10b7 6556 10/100 Mini PCI Ethernet Adapter
3043 6560 3cCFE656 CardBus [Cyclone]
3044 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus
3045 6561 3cCFEM656 10/100 LAN+56K Modem CardBus
3046 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
3047 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]
3048 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus
3049 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus
3050 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus
3051 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]
3052 7646 3cSOHO100-TX Hurricane
3053 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]
3054 7940 3c803 FDDILink UTP Controller
3055 7980 3c804 FDDILink SAS Controller
3056 7990 3c805 FDDILink DAS Controller
3057 80eb 3c940B 10/100/1000Base-T
3058 8811 Token ring
3059 9000 3c900 10BaseT [Boomerang]
3060 9001 3c900 10Mbps Combo [Boomerang]
3061 9004 3c900B-TPO Etherlink XL [Cyclone]
3062 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb
3063 9005 3c900B-Combo Etherlink XL [Cyclone]
3064 10b7 9005 3C900B-Combo Etherlink XL Combo
3065 9006 3c900B-TPC Etherlink XL [Cyclone]
3066 900a 3c900B-FL 10base-FL [Cyclone]
3067 9050 3c905 100BaseTX [Boomerang]
3068 9051 3c905 100BaseT4 [Boomerang]
3069 9055 3c905B 100BaseTX [Cyclone]
3070 1028 0080 3C905B Fast Etherlink XL 10/100
3071 1028 0081 3C905B Fast Etherlink XL 10/100
3072 1028 0082 3C905B Fast Etherlink XL 10/100
3073 1028 0083 3C905B Fast Etherlink XL 10/100
3074 1028 0084 3C905B Fast Etherlink XL 10/100
3075 1028 0085 3C905B Fast Etherlink XL 10/100
3076 1028 0086 3C905B Fast Etherlink XL 10/100
3077 1028 0087 3C905B Fast Etherlink XL 10/100
3078 1028 0088 3C905B Fast Etherlink XL 10/100
3079 1028 0089 3C905B Fast Etherlink XL 10/100
3080 1028 0090 3C905B Fast Etherlink XL 10/100
3081 1028 0091 3C905B Fast Etherlink XL 10/100
3082 1028 0092 3C905B Fast Etherlink XL 10/100
3083 1028 0093 3C905B Fast Etherlink XL 10/100
3084 1028 0094 3C905B Fast Etherlink XL 10/100
3085 1028 0095 3C905B Fast Etherlink XL 10/100
3086 1028 0096 3C905B Fast Etherlink XL 10/100
3087 1028 0097 3C905B Fast Etherlink XL 10/100
3088 1028 0098 3C905B Fast Etherlink XL 10/100
3089 1028 0099 3C905B Fast Etherlink XL 10/100
3090 10b7 9055 3C905B Fast Etherlink XL 10/100
3091 9056 3c905B-T4 Fast EtherLink XL [Cyclone]
3092 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]
3093 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]
3094 9200 3c905C-TX/TX-M [Tornado]
3095 1028 0095 3C920 Integrated Fast Ethernet Controller
3096 1028 0097 3C920 Integrated Fast Ethernet Controller
3097 1028 00fe Optiplex GX240
3098 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640]
3099 10b7 1000 3C905C-TX Fast Etherlink for PC Management NIC
3100 10b7 7000 10/100 Mini PCI Ethernet Adapter
3101 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)
3102 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]
3103 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller
3104 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller
3105 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller
3106 9300 3CSOHO100B-TX 910-A01 [tulip]
3107 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]
3108 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter
3109 9805 3c980-C 10/100baseTX NIC [Python-T]
3110 10b7 1201 EtherLink Server 10/100 Dual Port A
3111 10b7 1202 EtherLink Server 10/100 Dual Port B
3112 10b7 9805 3c980 10/100baseTX NIC [Python-T]
3113 10f1 2462 Thunder K7 S2462
3114 9900 3C990-TX [Typhoon]
3115 9902 3CR990-TX-95 [Typhoon 56-bit]
3116 9903 3CR990-TX-97 [Typhoon 168-bit]
3117 9904 3C990B-TX-M/3C990BSVR [Typhoon2]
3118 10b7 1000 3CR990B-TX-M [Typhoon2]
3119 10b7 2000 3CR990BSVR [Typhoon2 Server]
3120 9905 3CR990-FX-95/97/95 [Typhon Fiber]
3121 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit]
3122 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit]
3123 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit]
3124 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit]
3125 9908 3CR990SVR95 [Typhoon Server 56-bit]
3126 9909 3CR990SVR97 [Typhoon Server 168-bit]
3127 990a 3C990SVR [Typhoon Server]
3128 990b 3C990SVR [Typhoon Server]
312910b8 Standard Microsystems Corp [SMC]
3130 0005 83c170 EPIC/100 Fast Ethernet Adapter
3131 1055 e000 LANEPIC 10/100 [EVB171Q-PCI]
3132 1055 e002 LANEPIC 10/100 [EVB171G-PCI]
3133 10b8 a011 EtherPower II 10/100
3134 10b8 a014 EtherPower II 10/100
3135 10b8 a015 EtherPower II 10/100
3136 10b8 a016 EtherPower II 10/100
3137 10b8 a017 EtherPower II 10/100
3138 0006 83c175 EPIC/100 Fast Ethernet Adapter
3139 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter
3140 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter
3141 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter
3142 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter
3143 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter
3144 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter
3145 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter
3146 1000 FDC 37c665
3147 1001 FDC 37C922
3148# 802.11g card
3149 2802 SMC2802W [EZ Connect g]
3150 a011 83C170QF
3151 b106 SMC34C90
315210b9 ALi Corporation
3153 0101 CMI8338/C3DX PCI Audio Device
3154 0111 C-Media CMI8738/C3DX Audio Device (OEM)
3155 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM)
3156 0780 Multi-IO Card
3157 0782 Multi-IO Card
3158 1435 M1435
3159 1445 M1445
3160 1449 M1449
3161 1451 M1451
3162 1461 M1461
3163 1489 M1489
3164 1511 M1511 [Aladdin]
3165 1512 M1512 [Aladdin]
3166 1513 M1513 [Aladdin]
3167 1521 M1521 [Aladdin III]
3168 10b9 1521 ALI M1521 Aladdin III CPU Bridge
3169 1523 M1523
3170 10b9 1523 ALI M1523 ISA Bridge
3171 1531 M1531 [Aladdin IV]
3172 1533 M1533 PCI to ISA Bridge [Aladdin IV]
3173 1014 053b ThinkPad R40e (2684-HVG) PCI to ISA Bridge
3174 10b9 1533 ALI M1533 Aladdin IV ISA Bridge
3175 1541 M1541
3176 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller
3177 1543 M1543
3178 1563 M1563 HyperTransport South Bridge
3179 1621 M1621
3180 1631 ALI M1631 PCI North Bridge Aladdin Pro III
3181 1632 M1632M Northbridge+Trident
3182 1641 ALI M1641 PCI North Bridge Aladdin Pro IV
3183 1644 M1644/M1644T Northbridge+Trident
3184 1646 M1646 Northbridge+Trident
3185 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]
3186 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]
3187 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]
3188 1672 M1672 Northbridge [CyberALADDiN-P4]
3189 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]
3190 1687 M1687 K8 Northbridge [AGP8X and HyperTransport]
3191 1689 M1689 K8 Northbridge [Super K8 Single Chip]
3192 3141 M3141
3193 3143 M3143
3194 3145 M3145
3195 3147 M3147
3196 3149 M3149
3197 3151 M3151
3198 3307 M3307
3199 3309 M3309
3200 3323 M3325 Video/Audio Decoder
3201 5212 M4803
3202 5215 MS4803
3203 5217 M5217H
3204 5219 M5219
3205 5225 M5225
3206 5228 M5228 ALi ATA/RAID Controller
3207 5229 M5229 IDE
3208 1014 050f ThinkPad R30
3209 1014 053d ThinkPad R40e (2684-HVG) builtin IDE
3210 103c 0024 Pavilion ze4400 builtin IDE
3211 1043 8053 A7A266 Motherboard IDE
3212 5235 M5225
3213 5237 USB 1.1 Controller
3214 1014 0540 ThinkPad R40e (2684-HVG) builtin USB
3215 103c 0024 Pavilion ze4400 builtin USB
3216 5239 USB 2.0 Controller
3217 5243 M1541 PCI to AGP Controller
3218 5246 AGP8X Controller
3219 5247 PCI to AGP Controller
3220 5249 M5249 HTT to PCI Bridge
3221 5251 M5251 P1394 OHCI 1.0 Controller
3222 5253 M5253 P1394 OHCI 1.1 Controller
3223 5261 M5261 Ethernet Controller
3224 5263 M5263 Ethernet Controller
3225 5281 ALi M5281 Serial ATA / RAID Host Controller
3226 5287 ULi 5287 SATA
3227 5289 ULi 5289 SATA
3228 5450 Lucent Technologies Soft Modem AMR
3229 5451 M5451 PCI AC-Link Controller Audio Device
3230 1014 0506 ThinkPad R30
3231 1014 053e ThinkPad R40e (2684-HVG) builtin Audio
3232 103c 0024 Pavilion ze4400 builtin Audio
3233 10b9 5451 HP Compaq nc4010 (DY885AA#ABN)
3234 5453 M5453 PCI AC-Link Controller Modem Device
3235 5455 M5455 PCI AC-Link Controller Audio Device
3236 5457 M5457 AC'97 Modem Controller
3237 1014 0535 ThinkPad R40e (2684-HVG) builtin modem
3238 103c 0024 Pavilion ze4400 builtin Modem Device
3239# Same but more usefull for driver's lookup
3240 5459 SmartLink SmartPCI561 56K Modem
3241# SmartLink PCI SoftModem
3242 545a SmartLink SmartPCI563 56K Modem
3243 5471 M5471 Memory Stick Controller
3244 5473 M5473 SD-MMC Controller
3245 7101 M7101 Power Management Controller [PMU]
3246 1014 0510 ThinkPad R30
3247 1014 053c ThinkPad R40e (2684-HVG) Power Management Controller
3248 103c 0024 Pavilion ze4400
324910ba Mitsubishi Electric Corp.
3250 0301 AccelGraphics AccelECLIPSE
3251 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]
3252 0308 Tornado 3000 [OEM Evans & Sutherland]
3253 1002 VG500 [VolumePro Volume Rendering Accelerator]
325410bb Dapha Electronics Corporation
325510bc Advanced Logic Research
325610bd Surecom Technology
3257 0e34 NE-34
325810be Tseng Labs International Co.
325910bf Most Inc
326010c0 Boca Research Inc.
326110c1 ICM Co., Ltd.
326210c2 Auspex Systems Inc.
326310c3 Samsung Semiconductors, Inc.
3264 1100 Smartether100 SC1100 LAN Adapter (i82557B)
326510c4 Award Software International Inc.
326610c5 Xerox Corporation
326710c6 Rambus Inc.
326810c7 Media Vision
326910c8 Neomagic Corporation
3270 0001 NM2070 [MagicGraph 128]
3271 0002 NM2090 [MagicGraph 128V]
3272 0003 NM2093 [MagicGraph 128ZV]
3273 0004 NM2160 [MagicGraph 128XD]
3274 1014 00ba MagicGraph 128XD
3275 1025 1007 MagicGraph 128XD
3276 1028 0074 MagicGraph 128XD
3277 1028 0075 MagicGraph 128XD
3278 1028 007d MagicGraph 128XD
3279 1028 007e MagicGraph 128XD
3280 1033 802f MagicGraph 128XD
3281 104d 801b MagicGraph 128XD
3282 104d 802f MagicGraph 128XD
3283 104d 830b MagicGraph 128XD
3284 10ba 0e00 MagicGraph 128XD
3285 10c8 0004 MagicGraph 128XD
3286 10cf 1029 MagicGraph 128XD
3287 10f7 8308 MagicGraph 128XD
3288 10f7 8309 MagicGraph 128XD
3289 10f7 830b MagicGraph 128XD
3290 10f7 830d MagicGraph 128XD
3291 10f7 8312 MagicGraph 128XD
3292 0005 NM2200 [MagicGraph 256AV]
3293 1014 00dd ThinkPad 570
3294 1028 0088 Latitude CPi A
3295 0006 NM2360 [MagicMedia 256ZX]
3296 0016 NM2380 [MagicMedia 256XL+]
3297 10c8 0016 MagicMedia 256XL+
3298 0025 NM2230 [MagicGraph 256AV+]
3299 0083 NM2093 [MagicGraph 128ZV+]
3300 8005 NM2200 [MagicMedia 256AV Audio]
3301 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery
3302 0e11 b126 MagicMedia 256AV Audio Device on Durango
3303 1014 00dd MagicMedia 256AV Audio Device on BlackTip Thinkpad
3304 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720
3305 1028 0088 Latitude CPi A
3306 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron
3307 103c 0007 MagicMedia 256AV Audio Device on Voyager II
3308 103c 0008 MagicMedia 256AV Audio Device on Voyager III
3309 103c 000d MagicMedia 256AV Audio Device on Omnibook 900
3310 10c8 8005 MagicMedia 256AV Audio Device on FireAnt
3311 110a 8005 MagicMedia 256AV Audio Device
3312 14c0 0004 MagicMedia 256AV Audio Device
3313 8006 NM2360 [MagicMedia 256ZX Audio]
3314 8016 NM2380 [MagicMedia 256XL+ Audio]
331510c9 Dataexpert Corporation
331610ca Fujitsu Microelectr., Inc.
331710cb Omron Corporation
3318# nee Mentor ARC Inc
331910cc Mai Logic Incorporated
3320 0660 Articia S Host Bridge
3321 0661 Articia S PCI Bridge
332210cd Advanced System Products, Inc
3323 1100 ASC1100
3324 1200 ASC1200 [(abp940) Fast SCSI-II]
3325 1300 ABP940-U / ABP960-U
3326 10cd 1310 ASC1300 SCSI Adapter
3327 2300 ABP940-UW
3328 2500 ABP940-U2W
332910ce Radius
3330# nee Citicorp TTI
333110cf Fujitsu Limited.
3332 2001 mb86605
333310d1 FuturePlus Systems Corp.
333410d2 Molex Incorporated
333510d3 Jabil Circuit Inc
333610d4 Hualon Microelectronics
333710d5 Autologic Inc.
333810d6 Cetia
333910d7 BCM Advanced Research
334010d8 Advanced Peripherals Labs
334110d9 Macronix, Inc. [MXIC]
3342 0431 MX98715
3343 0512 MX98713
3344 0531 MX987x5
3345 1186 1200 DFE-540TX ProFAST 10/100 Adapter
3346 8625 MX86250
3347 8888 MX86200
334810da Compaq IPG-Austin
3349 0508 TC4048 Token Ring 4/16
3350 3390 Tl3c3x9
335110db Rohm LSI Systems, Inc.
335210dc CERN/ECP/EDU
3353 0001 STAR/RD24 SCI-PCI (PMC)
3354 0002 TAR/RD24 SCI-PCI (PMC)
3355 0021 HIPPI destination
3356 0022 HIPPI source
3357 10dc ATT2C15-3 FPGA
335810dd Evans & Sutherland
335910de nVidia Corporation
3360 0008 NV1 [EDGE 3D]
3361 0009 NV1 [EDGE 3D]
3362 0010 NV2 [Mutara V08]
3363 0020 NV4 [RIVA TNT]
3364 1043 0200 V3400 TNT
3365 1048 0c18 Erazor II SGRAM
3366 1048 0c1b Erazor II
3367 1092 0550 Viper V550
3368 1092 0552 Viper V550
3369 1092 4804 Viper V550
3370 1092 4808 Viper V550
3371 1092 4810 Viper V550
3372 1092 4812 Viper V550
3373 1092 4815 Viper V550
3374 1092 4820 Viper V550 with TV out
3375 1092 4822 Viper V550
3376 1092 4904 Viper V550
3377 1092 4914 Viper V550
3378 1092 8225 Viper V550
3379 10b4 273d Velocity 4400
3380 10b4 273e Velocity 4400
3381 10b4 2740 Velocity 4400
3382 10de 0020 Riva TNT
3383 1102 1015 Graphics Blaster CT6710
3384 1102 1016 Graphics Blaster RIVA TNT
3385 0028 NV5 [RIVA TNT2/TNT2 Pro]
3386 1043 0200 AGP-V3800 SGRAM
3387 1043 0201 AGP-V3800 SDRAM
3388 1043 0205 PCI-V3800
3389 1043 4000 AGP-V3800PRO
3390 1048 0c21 Synergy II
3391 1048 0c31 Erazor III
3392 107d 2134 WinFast 3D S320 II + TV-Out
3393 1092 4804 Viper V770
3394 1092 4a00 Viper V770
3395 1092 4a02 Viper V770 Ultra
3396 1092 5a00 RIVA TNT2/TNT2 Pro
3397 1092 6a02 Viper V770 Ultra
3398 1092 7a02 Viper V770 Ultra
3399 10de 0005 RIVA TNT2 Pro
3400 10de 000f Compaq NVIDIA TNT2 Pro
3401 1102 1020 3D Blaster RIVA TNT2
3402 1102 1026 3D Blaster RIVA TNT2 Digital
3403 14af 5810 Maxi Gamer Xentor
3404 0029 NV5 [RIVA TNT2 Ultra]
3405 1043 0200 AGP-V3800 Deluxe
3406 1043 0201 AGP-V3800 Ultra SDRAM
3407 1043 0205 PCI-V3800 Ultra
3408 1102 1021 3D Blaster RIVA TNT2 Ultra
3409 1102 1029 3D Blaster RIVA TNT2 Ultra
3410 1102 102f 3D Blaster RIVA TNT2 Ultra
3411 14af 5820 Maxi Gamer Xentor 32
3412 002a NV5 [Riva TnT2]
3413 002b NV5 [Riva TnT2]
3414 002c NV6 [Vanta/Vanta LT]
3415 1043 0200 AGP-V3800 Combat SDRAM
3416 1043 0201 AGP-V3800 Combat
3417 1092 6820 Viper V730
3418 1102 1031 CT6938 VANTA 8MB
3419 1102 1034 CT6894 VANTA 16MB
3420 14af 5008 Maxi Gamer Phoenix 2
3421 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]
3422 1043 0200 AGP-V3800M
3423 1043 0201 AGP-V3800M
3424 1048 0c3a Erazor III LT
3425 10de 001e M64 AGP4x
3426 1102 1023 CT6892 RIVA TNT2 Value
3427 1102 1024 CT6932 RIVA TNT2 Value 32Mb
3428 1102 102c CT6931 RIVA TNT2 Value [Jumper]
3429 1462 8808 MSI-8808
3430 1554 1041 Pixelview RIVA TNT2 M64
3431 1569 002d Palit Microsystems Daytona TNT2 M64
3432 002e NV6 [Vanta]
3433 002f NV6 [Vanta]
3434 0034 MCP04 SMBus
3435 0035 MCP04 IDE
3436 0036 MCP04 Serial ATA Controller
3437 0037 MCP04 Ethernet Controller
3438 0038 MCP04 Ethernet Controller
3439 003a MCP04 AC'97 Audio Controller
3440 003b MCP04 USB Controller
3441 003c MCP04 USB Controller
3442 003d MCP04 PCI Bridge
3443 003e MCP04 Serial ATA Controller
3444 0040 nv40 [GeForce 6800 Ultra]
3445 0041 NV40 [GeForce 6800]
3446 0042 NV40.2
3447 0043 NV40.3
3448 0045 NV40 [GeForce 6800 GT]
3449 0049 NV40GL
3450 004e NV40GL [Quadro FX 4000]
3451 0051 CK804 ISA Bridge
3452 0052 CK804 SMBus
3453 0053 CK804 IDE
3454 0054 CK804 Serial ATA Controller
3455 0055 CK804 Serial ATA Controller
3456 0056 CK804 Ethernet Controller
3457 0057 CK804 Ethernet Controller
3458 0059 CK804 AC'97 Audio Controller
3459 005a CK804 USB Controller
3460 005b CK804 USB Controller
3461 005c CK804 PCI Bridge
3462 005d CK804 PCIE Bridge
3463 005e CK804 Memory Controller
3464 0060 nForce2 ISA Bridge
3465 1043 80ad A7N8X Mainboard
3466 0064 nForce2 SMBus (MCP)
3467 0065 nForce2 IDE
3468 0066 nForce2 Ethernet Controller
3469 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet
3470 0067 nForce2 USB Controller
3471 1043 0c11 A7N8X Mainboard
3472 0068 nForce2 USB Controller
3473 1043 0c11 A7N8X Mainboard
3474 006a nForce2 AC97 Audio Controler (MCP)
3475 006b nForce Audio Processing Unit
3476 10de 006b nForce2 MCP Audio Processing Unit
3477 006c nForce2 External PCI Bridge
3478 006d nForce2 PCI Bridge
3479 006e nForce2 FireWire (IEEE 1394) Controller
3480 0084 MCP2A SMBus
3481 0085 MCP2A IDE
3482 0086 MCP2A Ethernet Controller
3483 0087 MCP2A USB Controller
3484 0088 MCP2A USB Controller
3485 008a MCP2S AC'97 Audio Controller
3486 008b MCP2A PCI Bridge
3487 008c MCP2A Ethernet Controller
3488 008e nForce2 Serial ATA Controller
3489 00a0 NV5 [Aladdin TNT2]
3490 14af 5810 Maxi Gamer Xentor
3491 00c0 NV41.0
3492 00c1 NV41.1
3493 00c2 NV41.2
3494 00c8 NV41.8
3495 00ce NV41GL
3496 00d0 nForce3 LPC Bridge
3497 00d1 nForce3 Host Bridge
3498 00d2 nForce3 AGP Bridge
3499 00d3 CK804 Memory Controller
3500 00d4 nForce3 SMBus
3501 00d5 nForce3 IDE
3502 00d6 nForce3 Ethernet
3503 00d7 nForce3 USB 1.1
3504 00d8 nForce3 USB 2.0
3505 00da nForce3 Audio
3506 00dd nForce3 PCI Bridge
3507 00df CK8S Ethernet Controller
3508 00e0 nForce3 250Gb LPC Bridge
3509 00e1 nForce3 250Gb Host Bridge
3510 00e2 nForce3 250Gb AGP Host to PCI Bridge
3511 00e3 CK8S Serial ATA Controller (v2.5)
3512 00e4 nForce 250Gb PCI System Management
3513 00e5 CK8S Parallel ATA Controller (v2.5)
3514 00e6 CK8S Ethernet Controller
3515 00e7 CK8S USB Controller
3516 00e8 nForce3 EHCI USB 2.0 Controller
3517 00ea nForce3 250Gb AC'97 Audio Controller
3518 00ed nForce3 250Gb PCI-to-PCI Bridge
3519 00ee CK8S Serial ATA Controller (v2.5)
3520 00f0 NV40 [GeForce 6800/GeForce 6800 Ultra]
3521 00f1 NV43 [GeForce 6600/GeForce 6600 GT]
3522 00f2 NV43 [GeForce 6600 GT]
3523 00f8 NV45GL [Quadro FX 3400]
3524 00f9 NV40 [GeForce 6800 Ultra/GeForce 6800 GT]
3525 1682 2120 GEFORCE 6800 GT PCI-E
3526 00fa NV36 [GeForce PCX 5750]
3527 00fb NV35 [GeForce PCX 5900]
3528 00fc NV37GL [Quadro FX 330/GeForce PCX 5300]
3529 00fd NV37GL [Quadro FX 330]
3530 00fe NV38GL [Quadro FX 1300]
3531 00ff NV18 [GeForce PCX 4300]
3532 0100 NV10 [GeForce 256 SDR]
3533 1043 0200 AGP-V6600 SGRAM
3534 1043 0201 AGP-V6600 SDRAM
3535 1043 4008 AGP-V6600 SGRAM
3536 1043 4009 AGP-V6600 SDRAM
3537 1102 102d CT6941 GeForce 256
3538 14af 5022 3D Prophet SE
3539 0101 NV10DDR [GeForce 256 DDR]
3540 1043 0202 AGP-V6800 DDR
3541 1043 400a AGP-V6800 DDR SGRAM
3542 1043 400b AGP-V6800 DDR SDRAM
3543 107d 2822 WinFast GeForce 256
3544 1102 102e CT6971 GeForce 256 DDR
3545 14af 5021 3D Prophet DDR-DVI
3546 0103 NV10GL [Quadro]
3547 0110 NV11 [GeForce2 MX/MX 400]
3548 1043 4015 AGP-V7100 Pro
3549 1043 4031 V7100 Pro with TV output
3550 10de 0091 Dell OEM GeForce 2 MX 400
3551 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817]
3552 14af 7102 3D Prophet II MX
3553 14af 7103 3D Prophet II MX Dual-Display
3554 0111 NV11DDR [GeForce2 MX 100 DDR/200 DDR]
3555 0112 NV11 [GeForce2 Go]
3556 0113 NV11GL [Quadro2 MXR/EX]
3557 0140 NV43 [MSI NX6600GT-TD128E]
3558 014f NV43 [GeForce 6200]
3559 0150 NV15 [GeForce2 GTS/Pro]
3560 1043 4016 V7700 AGP Video Card
3561 107d 2840 WinFast GeForce2 GTS with TV output
3562 107d 2842 WinFast GeForce 2 Pro
3563 1462 8831 Creative GeForce2 Pro
3564 0151 NV15DDR [GeForce2 Ti]
3565 1043 405f V7700Ti
3566 1462 5506 Creative 3D Blaster Geforce2 Titanium
3567 0152 NV15BR [GeForce2 Ultra, Bladerunner]
3568 1048 0c56 GLADIAC Ultra
3569 0153 NV15GL [Quadro2 Pro]
3570 0170 NV17 [GeForce4 MX 460]
3571 0171 NV17 [GeForce4 MX 440]
3572 10b0 0002 Gainward Pro/600 TV
3573 1462 8661 G4MX440-VTP
3574 1462 8730 MX440SES-T (MS-8873)
3575 147b 8f00 Abit Siluro GeForce4MX440
3576 0172 NV17 [GeForce4 MX 420]
3577 0173 NV17 [GeForce4 MX 440-SE]
3578 0174 NV17 [GeForce4 440 Go]
3579 0175 NV17 [GeForce4 420 Go]
3580 0176 NV17 [GeForce4 420 Go 32M]
3581 4c53 1090 Cx9 / Vx9 mainboard
3582 0177 NV17 [GeForce4 460 Go]
3583 0178 NV17GL [Quadro4 550 XGL]
3584 0179 NV17 [GeForce4 440 Go 64M]
3585 10de 0179 GeForce4 MX (Mac)
3586 017a NV17GL [Quadro4 200/400 NVS]
3587 017b NV17GL [Quadro4 550 XGL]
3588 017c NV17GL [Quadro4 550 GoGL]
3589 017d NV17 [GeForce4 410 Go 16M]
3590 0181 NV18 [GeForce4 MX 440 AGP 8x]
3591 1043 806f V9180 Magic
3592 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X
3593 1462 8900 MS-8890 GeForce 4 MX440 AGP8X
3594 1462 9350 MSI Geforce4 MX T8X with AGP8X
3595 147b 8f0d Siluro GF4 MX-8X
3596 0182 NV18 [GeForce4 MX 440SE AGP 8x]
3597 0183 NV18 [GeForce4 MX 420 AGP 8x]
3598 0185 NV18 [GeForce4 MX 4000 AGP 8x]
3599 0186 NV18M [GeForce4 448 Go]
3600 0187 NV18M [GeForce4 488 Go]
3601 0188 NV18GL [Quadro4 580 XGL]
3602 018a NV18GL [Quadro4 NVS AGP 8x]
3603 018b NV18GL [Quadro4 380 XGL]
3604 018d NV18M [GeForce4 448 Go]
3605 01a0 NVCrush11 [GeForce2 MX Integrated Graphics]
3606 01a4 nForce CPU bridge
3607 01ab nForce 420 Memory Controller (DDR)
3608 01ac nForce 220/420 Memory Controller
3609 01ad nForce 220/420 Memory Controller
3610 01b0 nForce Audio
3611 01b1 nForce Audio
3612 01b2 nForce ISA Bridge
3613 01b4 nForce PCI System Management
3614 01b7 nForce AGP to PCI Bridge
3615 01b8 nForce PCI-to-PCI bridge
3616 01bc nForce IDE
3617 01c1 nForce AC'97 Modem Controller
3618 01c2 nForce USB Controller
3619 01c3 nForce Ethernet Controller
3620 01e0 nForce2 AGP (different version?)
3621 01e8 nForce2 AGP
3622 01ea nForce2 Memory Controller 0
3623 01eb nForce2 Memory Controller 1
3624 01ec nForce2 Memory Controller 2
3625 01ed nForce2 Memory Controller 3
3626 01ee nForce2 Memory Controller 4
3627 01ef nForce2 Memory Controller 5
3628 01f0 NV18 [GeForce4 MX - nForce GPU]
3629 0200 NV20 [GeForce3]
3630 1043 402f AGP-V8200 DDR
3631 0201 NV20 [GeForce3 Ti 200]
3632 0202 NV20 [GeForce3 Ti 500]
3633 1043 405b V8200 T5
3634 1545 002f Xtasy 6964
3635 0203 NV20DCC [Quadro DCC]
3636 0240 C51 PCI Express Bridge
3637 0241 C51 PCI Express Bridge
3638 0242 C51 PCI Express Bridge
3639 0243 C51 PCI Express Bridge
3640 0244 C51 PCI Express Bridge
3641 0245 C51 PCI Express Bridge
3642 0246 C51 PCI Express Bridge
3643 0247 C51 PCI Express Bridge
3644 0248 C51 PCI Express Bridge
3645 0249 C51 PCI Express Bridge
3646 024a C51 PCI Express Bridge
3647 024b C51 PCI Express Bridge
3648 024c C51 PCI Express Bridge
3649 024d C51 PCI Express Bridge
3650 024e C51 PCI Express Bridge
3651 024f C51 PCI Express Bridge
3652 0250 NV25 [GeForce4 Ti 4600]
3653 0251 NV25 [GeForce4 Ti 4400]
3654 1043 8023 v8440 GeForce 4 Ti4400
3655 0252 NV25 [GeForce4 Ti]
3656 0253 NV25 [GeForce4 Ti 4200]
3657 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI)
3658 147b 8f09 Siluro (Dual VGA/TV-out/DVI)
3659 0258 NV25GL [Quadro4 900 XGL]
3660 0259 NV25GL [Quadro4 750 XGL]
3661 025b NV25GL [Quadro4 700 XGL]
3662 0260 MCP51 LPC Bridge
3663 0261 MCP51 LPC Bridge
3664 0262 MCP51 LPC Bridge
3665 0263 MCP51 LPC Bridge
3666 0264 MCP51 SMBus
3667 0265 MCP51 IDE
3668 0266 MCP51 Serial ATA Controller
3669 0267 MCP51 Serial ATA Controller
3670 0268 MCP51 Ethernet Controller
3671 0269 MCP51 Ethernet Controller
3672 026a MCP51 MCI
3673 026b MCP51 AC97 Audio Controller
3674 026c MCP51 High Definition Audio
3675 026d MCP51 USB Controller
3676 026e MCP51 USB Controller
3677 026f MCP51 PCI Bridge
3678 0270 MCP51 Host Bridge
3679 0271 MCP51 PMU
3680 0272 MCP51 Memory Controller 0
3681 027e C51 Memory Controller 2
3682 027f C51 Memory Controller 3
3683 0280 NV28 [GeForce4 Ti 4800]
3684 0281 NV28 [GeForce4 Ti 4200 AGP 8x]
3685 0282 NV28 [GeForce4 Ti 4800 SE]
3686 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x]
3687 0288 NV28GL [Quadro4 980 XGL]
3688 0289 NV28GL [Quadro4 780 XGL]
3689 028c NV28GLM [Quadro4 700 GoGL]
3690 02f0 C51 Host Bridge
3691 02f1 C51 Host Bridge
3692 02f2 C51 Host Bridge
3693 02f3 C51 Host Bridge
3694 02f4 C51 Host Bridge
3695 02f5 C51 Host Bridge
3696 02f6 C51 Host Bridge
3697 02f7 C51 Host Bridge
3698 02f8 C51 Memory Controller 5
3699 02f9 C51 Memory Controller 4
3700 02fa C51 Memory Controller 0
3701 02fb C51 PCI Express Bridge
3702 02fc C51 PCI Express Bridge
3703 02fd C51 PCI Express Bridge
3704 02fe C51 Memory Controller 1
3705 02ff C51 Host Bridge
3706 0300 NV30 [GeForce FX]
3707 0301 NV30 [GeForce FX 5800 Ultra]
3708 0302 NV30 [GeForce FX 5800]
3709 0308 NV30GL [Quadro FX 2000]
3710 0309 NV30GL [Quadro FX 1000]
3711 0311 NV31 [GeForce FX 5600 Ultra]
3712 0312 NV31 [GeForce FX 5600]
3713 0313 NV31
3714 0314 NV31 [GeForce FX 5600XT]
3715 1043 814a V9560XT/TD
3716 0316 NV31
3717 0317 NV31
3718 031a NV31M [GeForce FX Go 5600]
3719 031b NV31M [GeForce FX Go5650]
3720 031c NVIDIA Quadro FX 700 Go
3721 031d NV31
3722 031e NV31
3723 031f NV31
3724 0320 NV34 [GeForce FX 5200]
3725 0321 NV34 [GeForce FX 5200 Ultra]
3726 0322 NV34 [GeForce FX 5200]
3727 1462 9171 MS-8917 (FX5200-T128)
3728 0323 NV34 [GeForce FX 5200LE]
3729 0324 NV34M [GeForce FX Go 5200]
3730 1071 8160 MIM2000
3731 0325 NV34M [GeForce FX Go5250]
3732 0326 NV34 [GeForce FX 5500]
3733 0327 NV34 [GeForce FX 5100]
3734 0328 NV34M [GeForce FX Go 5200]
3735 0329 NV34M [GeForce FX Go5200]
3736 032a NV34GL [Quadro NVS 280 PCI]
3737 032b NV34GL [Quadro FX 500/600 PCI]
3738 032c NV34GLM [GeForce FX Go 5300]
3739 032d NV34 [GeForce FX Go5100]
3740 032f NV34
3741 0330 NV35 [GeForce FX 5900 Ultra]
3742 0331 NV35 [GeForce FX 5900]
3743 1043 8145 V9950GE
3744 0332 NV35 [GeForce FX 5900XT]
3745 0333 NV38 [GeForce FX 5950 Ultra]
3746 0334 NV35 [GeForce FX 5900ZT]
3747 0338 NV35GL [Quadro FX 3000]
3748 033f NV35GL [Quadro FX 700]
3749 0341 NV36.1 [GeForce FX 5700 Ultra]
3750 0342 NV36.2 [GeForce FX 5700]
3751 0343 NV36 [GeForce FX 5700LE]
3752 0344 NV36.4 [GeForce FX 5700VE]
3753 0345 NV36.5
3754 0347 NV36 [GeForce FX Go5700]
3755 0348 NV36 [GeForce FX Go5700]
3756 0349 NV36
3757 034b NV36
3758 034c NV36 [Quadro FX Go1000]
3759 034e NV36GL [Quadro FX 1100]
3760 034f NV36GL
376110df Emulex Corporation
3762 1ae5 LP6000 Fibre Channel Host Adapter
3763 1ae6 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
3764 1ae7 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3)
3765 f005 LP1150e Fibre Channel Host Adapter
3766 f085 LP850 Fibre Channel Host Adapter
3767 f095 LP952 Fibre Channel Host Adapter
3768 f098 LP982 Fibre Channel Host Adapter
3769 f0a5 LP1050 Fibre Channel Host Adapter
3770 f0d5 LP1150 Fibre Channel Host Adapter
3771 f100 LP11000e Fibre Channel Host Adapter
3772 f700 LP7000 Fibre Channel Host Adapter
3773 f701 LP 7000EFibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
3774 f800 LP8000 Fibre Channel Host Adapter
3775 f801 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
3776 f900 LP9000 Fibre Channel Host Adapter
3777 f901 LP 9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
3778 f980 LP9802 Fibre Channel Host Adapter
3779 f981 LP 9802 Fibre Channel Host Adapter Alternate ID
3780 f982 LP 9802 Fibre Channel Host Adapter Alternate ID
3781 fa00 LP10000 Fibre Channel Host Adapter
3782 fa01 LP101 Fibre Channel Host Adapter
3783 fd00 LP11000 Fibre Channel Host Adapter
378410e0 Integrated Micro Solutions Inc.
3785 5026 IMS5026/27/28
3786 5027 IMS5027
3787 5028 IMS5028
3788 8849 IMS8849
3789 8853 IMS8853
3790 9128 IMS9128 [Twin turbo 128]
379110e1 Tekram Technology Co.,Ltd.
3792 0391 TRM-S1040
3793 10e1 0391 DC-315U SCSI-3 Host Adapter
3794 690c DC-690c
3795 dc29 DC-290
379610e2 Aptix Corporation
379710e3 Tundra Semiconductor Corp.
3798 0000 CA91C042 [Universe]
3799 0860 CA91C860 [QSpan]
3800 0862 CA91C862A [QSpan-II]
3801 8260 CA91L8200B [Dual PCI PowerSpan II]
3802 8261 CA91L8260B [Single PCI PowerSpan II]
380310e4 Tandem Computers
380410e5 Micro Industries Corporation
380510e6 Gainbery Computer Products Inc.
380610e7 Vadem
380710e8 Applied Micro Circuits Corp.
3808 1072 INES GPIB-PCI (AMCC5920 based)
3809 2011 Q-Motion Video Capture/Edit board
3810 4750 S5930 [Matchmaker]
3811 5920 S5920
3812 8043 LANai4.x [Myrinet LANai interface chip]
3813 8062 S5933_PARASTATION
3814 807d S5933 [Matchmaker]
3815 8088 Kongsberg Spacetec Format Synchronizer
3816 8089 Kongsberg Spacetec Serial Output Board
3817 809c S5933_HEPC3
3818 80d7 PCI-9112
3819 80d9 PCI-9118
3820 80da PCI-9812
3821 811a PCI-IEEE1355-DS-DE Interface
3822 814c Fastcom ESCC-PCI (Commtech, Inc.)
3823 8170 S5933 [Matchmaker] (Chipset Development Tool)
3824# sold with Roper Scientifc(Photometrics) CoolSnap HQ camera
3825 81e6 Multimedia video controller
3826 8291 Fastcom 232/8-PCI (Commtech, Inc.)
3827 82c4 Fastcom 422/4-PCI (Commtech, Inc.)
3828 82c5 Fastcom 422/2-PCI (Commtech, Inc.)
3829 82c6 Fastcom IG422/1-PCI (Commtech, Inc.)
3830 82c7 Fastcom IG232/2-PCI (Commtech, Inc.)
3831 82ca Fastcom 232/4-PCI (Commtech, Inc.)
3832 82db AJA HDNTV HD SDI Framestore
3833 82e2 Fastcom DIO24H-PCI (Commtech, Inc.)
3834 8851 S5933 on Innes Corp FM Radio Capture card
383510e9 Alps Electric Co., Ltd.
383610ea Intergraphics Systems
3837 1680 IGA-1680
3838 1682 IGA-1682
3839 1683 IGA-1683
3840 2000 CyberPro 2000
3841 2010 CyberPro 2000A
3842 5000 CyberPro 5000
3843 5050 CyberPro 5050
3844 5202 CyberPro 5202
3845# CyberPro5202 Audio Function
3846 5252 CyberPro5252
384710eb Artists Graphics
3848 0101 3GA
3849 8111 Twist3 Frame Grabber
385010ec Realtek Semiconductor Co., Ltd.
3851 8029 RTL-8029(AS)
3852 10b8 2011 EZ-Card (SMC1208)
3853 10ec 8029 RTL-8029(AS)
3854 1113 1208 EN1208
3855 1186 0300 DE-528
3856 1259 2400 AT-2400
3857 8129 RTL-8129
3858 10ec 8129 RT8129 Fast Ethernet Adapter
3859 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter
3860 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter
3861 8139 RTL-8139/8139C/8139C+
3862 0357 000a TTP-Monitoring Card V2.0
3863 1025 005a TravelMate 290
3864 1025 8920 ALN-325
3865 1025 8921 ALN-325
3866 1071 8160 MIM2000
3867 10bd 0320 EP-320X-R
3868 10ec 8139 RT8139
3869 1113 ec01 FNC-0107TX
3870 1186 1300 DFE-538TX
3871 1186 1320 SN5200
3872 1186 8139 DRN-32TX
3873 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter
3874 1259 2500 AT-2500TX
3875 1259 2503 AT-2500TX/ACPI
3876 1429 d010 ND010
3877 1432 9130 EN-9130TX
3878 1436 8139 RT8139
3879 1458 e000 GA-7VM400M/7VT600 Motherboard
3880 146c 1439 FE-1439TX
3881 1489 6001 GF100TXRII
3882 1489 6002 GF100TXRA
3883 149c 139a LFE-8139ATX
3884 149c 8139 LFE-8139TX
3885 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet
3886 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card
3887 2646 0001 EtheRx
3888 8e2e 7000 KF-230TX
3889 8e2e 7100 KF-230TX/2
3890 a0a0 0007 ALN-325C
3891 8169 RTL-8169 Gigabit Ethernet
3892 1259 c107 CG-LAPCIGT
3893 1371 434e ProG-2000L
3894 1458 e000 GA-K8VT800 Pro Motherboard
3895 1462 702c K8T NEO 2 motherboard
3896 8180 RTL8180L 802.11b MAC
3897 8197 SmartLAN56 56K Modem
389810ed Ascii Corporation
3899 7310 V7310
390010ee Xilinx Corporation
3901 3fc0 RME Digi96
3902 3fc1 RME Digi96/8
3903 3fc2 RME Digi96/8 Pro
3904 3fc3 RME Digi96/8 Pad
3905 3fc4 RME Digi9652 (Hammerfall)
3906 3fc5 RME Hammerfall DSP
3907 3fc6 RME Hammerfall DSP MADI
3908 8381 Ellips Santos Frame Grabber
390910ef Racore Computer Products, Inc.
3910 8154 M815x Token Ring Adapter
391110f0 Peritek Corporation
391210f1 Tyan Computer
391310f2 Achme Computer, Inc.
391410f3 Alaris, Inc.
391510f4 S-MOS Systems, Inc.
391610f5 NKK Corporation
3917 a001 NDR4000 [NR4600 Bridge]
391810f6 Creative Electronic Systems SA
391910f7 Matsushita Electric Industrial Co., Ltd.
392010f8 Altos India Ltd
392110f9 PC Direct
392210fa Truevision
3923 000c TARGA 1000
392410fb Thesys Gesellschaft für Mikroelektronik mbH
3925 186f TH 6255
392610fc I-O Data Device, Inc.
3927# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives
3928 0003 Cardbus IDE Controller
3929 0005 Cardbus SCSI CBSC II
393010fd Soyo Computer, Inc
393110fe Fast Multimedia AG
393210ff NCube
39331100 Jazz Multimedia
39341101 Initio Corporation
3935 1060 INI-A100U2W
3936 9100 INI-9100/9100W
3937 9400 INI-940
3938 9401 INI-950
3939 9500 360P
3940 9502 Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip
39411102 Creative Labs
3942 0002 SB Live! EMU10k1
3943 1102 0020 CT4850 SBLive! Value
3944 1102 0021 CT4620 SBLive!
3945 1102 002f SBLive! mainboard implementation
3946 1102 4001 E-mu APS
3947 1102 8022 CT4780 SBLive! Value
3948 1102 8023 CT4790 SoundBlaster PCI512
3949 1102 8024 CT4760 SBLive!
3950 1102 8025 SBLive! Mainboard Implementation
3951 1102 8026 CT4830 SBLive! Value
3952 1102 8027 CT4832 SBLive! Value
3953 1102 8028 CT4760 SBLive! OEM version
3954 1102 8031 CT4831 SBLive! Value
3955 1102 8040 CT4760 SBLive!
3956 1102 8051 CT4850 SBLive! Value
3957 1102 8061 SBLive! Player 5.1
3958 1102 8064 SB Live! 5.1 Model SB0100
3959 1102 8065 SBLive! 5.1 Digital Model SB0220
3960 1102 8067 SBLive! 5.1 eMicro 28028
3961 0004 SB Audigy
3962 1102 0051 SB0090 Audigy Player
3963 1102 0053 SB0090 Audigy Player/OEM
3964 1102 0058 SB0090 Audigy Player/OEM
3965 1102 1007 SB0240 Audigy 2 Platinum 6.1
3966 1102 2002 SB Audigy 2 ZS (SB0350)
3967 0006 [SB Live! Value] EMU10k1X
3968 0007 SB Audigy LS
3969 1102 1001 SB0310 Audigy LS
3970 1102 1002 SB0312 Audigy LS
3971 1102 1006 SB0410 SBLive! 24-bit
3972 0008 SB0400 Audigy2 Value
3973 4001 SB Audigy FireWire Port
3974 1102 0010 SB Audigy FireWire Port
3975 7002 SB Live! MIDI/Game Port
3976 1102 0020 Gameport Joystick
3977 7003 SB Audigy MIDI/Game port
3978 1102 0040 SB Audigy MIDI/Game Port
3979 7004 [SB Live! Value] Input device controller
3980 7005 SB Audigy LS MIDI/Game port
3981 1102 1001 SB0310 Audigy LS MIDI/Game port
3982 1102 1002 SB0312 Audigy LS MIDI/Game port
3983 8064 SB0100 [SBLive! 5.1 OEM]
3984 8938 Ectiva EV1938
3985 1033 80e5 SlimTower-Jim (NEC)
3986 1071 7150 Mitac 7150
3987 110a 5938 Siemens Scenic Mobile 510PIII
3988 13bd 100c Ceres-C (Sharp, Intel BX)
3989 13bd 100d Sharp, Intel Banister
3990 13bd 100e TwinHead P09S/P09S3 (Sharp)
3991 13bd f6f1 Marlin (Sharp)
3992 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp)
3993 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp)
3994 156d b400 G400 - Geo (AlphaTop (Taiwan))
3995 156d b550 G560 (AlphaTop (Taiwan))
3996 156d b560 G560 (AlphaTop (Taiwan))
3997 156d b700 G700/U700 (AlphaTop (Taiwan))
3998 156d b795 G795 (AlphaTop (Taiwan))
3999 156d b797 G797 (AlphaTop (Taiwan))
40001103 Triones Technologies, Inc.
4001 0003 HPT343
4002 0004 HPT366/368/370/370A/372/372N
4003 1103 0001 HPT370A
4004 1103 0003 HPT343 / HPT345 / HPT363 UDMA33
4005 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)
4006 1103 0005 HPT370 UDMA100
4007 1103 0006 HPT302
4008 1103 0007 HPT371 UDMA133
4009 1103 0008 HPT374 UDMA/ATA133 RAID Controller
4010 0005 HPT372A/372N
4011 0006 HPT302
4012 0007 HPT371/371N
4013 0008 HPT374
4014 0009 HPT372N
40151104 RasterOps Corp.
40161105 Sigma Designs, Inc.
4017 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder
4018 8300 REALmagic Hollywood Plus DVD Decoder
4019 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder
4020 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder
4021 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder
4022 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder
4023 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder
4024 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder
4025 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder
4026 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder
40271106 VIA Technologies, Inc.
4028 0102 Embedded VIA Ethernet Controller
4029 0130 VT6305 1394.A Controller
4030 0305 VT8363/8365 [KT133/KM133]
4031 1043 8033 A7V Mainboard
4032 1043 803e A7V-E Mainboard
4033 1043 8042 A7V133/A7V133-C Mainboard
4034 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard
4035 0391 VT8371 [KX133]
4036 0501 VT8501 [Apollo MVP4]
4037 0505 VT82C505
4038# Shares chip with :0576. The VT82C576M has :1571 instead of :0561.
4039 0561 VT82C576MV
4040 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE
4041 1019 0985 P6VXA Motherboard
4042 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
4043 1043 8052 VT8233A Bus Master ATA100/66/33 IDE
4044 1043 808c A7V8X motherboard
4045 1043 80a1 A7V8X-X motherboard rev. 1.01
4046 1043 80ed A7V600 motherboard
4047 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE
4048 1179 0001 Magnia Z310
4049 1297 f641 FX41 motherboard
4050 1458 5002 GA-7VAX Mainboard
4051 1462 7020 K8T NEO 2 motherboard
4052 147b 1407 KV8-MAX3 motherboard
4053 1849 0571 K7VT2 motherboard
4054 0576 VT82C576 3V [Apollo Master]
4055 0585 VT82C585VP [Apollo VP1/VPX]
4056 0586 VT82C586/A/B PCI-to-ISA [Apollo VP]
4057 1106 0000 MVP3 ISA Bridge
4058 0595 VT82C595 [Apollo VP2]
4059 0596 VT82C596 ISA [Mobile South]
4060 1106 0000 VT82C596/A/B PCI to ISA Bridge
4061 1458 0596 VT82C596/A/B PCI to ISA Bridge
4062 0597 VT82C597 [Apollo VP3]
4063 0598 VT82C598 [Apollo MVP3]
4064 0601 VT8601 [Apollo ProMedia]
4065 0605 VT8605 [ProSavage PM133]
4066 1043 802c CUV4X mainboard
4067 0680 VT82C680 [Apollo P6]
4068 0686 VT82C686 [Apollo Super South]
4069 1019 0985 P6VXA Motherboard
4070 1043 802c CUV4X mainboard
4071 1043 8033 A7V Mainboard
4072 1043 803e A7V-E Mainboard
4073 1043 8040 A7M266 Mainboard
4074 1043 8042 A7V133/A7V133-C Mainboard
4075 1106 0000 VT82C686/A PCI to ISA Bridge
4076 1106 0686 VT82C686/A PCI to ISA Bridge
4077 1179 0001 Magnia Z310
4078 147b a702 KG7-Lite Mainboard
4079 0691 VT82C693A/694x [Apollo PRO133x]
4080 1019 0985 P6VXA Motherboard
4081 1179 0001 Magnia Z310
4082 1458 0691 VT82C691 Apollo Pro System Controller
4083 0693 VT82C693 [Apollo Pro Plus]
4084 0698 VT82C693A [Apollo Pro133 AGP]
4085 0926 VT82C926 [Amazon]
4086 1000 VT82C570MV
4087 1106 VT82C570MV
4088 1571 VT82C576M/VT82C586
4089 1595 VT82C595/97 [Apollo VP2/97]
4090 3022 CLE266
4091# This is *not* USB 2.0 as the existing entry suggests
4092 3038 VT82xxxxx UHCI USB 1.1 Controller
4093 0925 1234 USB Controller
4094 1019 0985 P6VXA Motherboard
4095 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
4096 1043 808c VT6202 USB2.0 4 port controller
4097 1043 80a1 A7V8X-X motherboard
4098 1043 80ed A7V600 motherboard
4099 1179 0001 Magnia Z310
4100 1458 5004 GA-7VAX Mainboard
4101 1462 7020 K8T NEO 2 motherboard
4102 147b 1407 KV8-MAX3 motherboard
4103 182d 201d CN-029 USB2.0 4 port PCI Card
4104 3040 VT82C586B ACPI
4105 3043 VT86C100A [Rhine]
4106 10bd 0000 VT86C100A Fast Ethernet Adapter
4107 1106 0100 VT86C100A Fast Ethernet Adapter
4108 1186 1400 DFE-530TX rev A
4109 3044 IEEE 1394 Host Controller
4110 1025 005a TravelMate 290
4111 1458 1000 GA-7VT600-1394 Motherboard
4112 1462 702d K8T NEO 2 motherboard
4113 3050 VT82C596 Power Management
4114 3051 VT82C596 Power Management
4115 3053 VT6105M [Rhine-III]
4116 3057 VT82C686 [Apollo Super ACPI]
4117 1019 0985 P6VXA Motherboard
4118 1043 8033 A7V Mainboard
4119 1043 803e A7V-E Mainboard
4120 1043 8040 A7M266 Mainboard
4121 1043 8042 A7V133/A7V133-C Mainboard
4122 1179 0001 Magnia Z310
4123 3058 VT82C686 AC97 Audio Controller
4124 0e11 0097 SoundMax Digital Integrated Audio
4125 0e11 b194 Soundmax integrated digital audio
4126 1019 0985 P6VXA Motherboard
4127 1043 1106 A7V133/A7V133-C Mainboard
4128 1106 4511 Onboard Audio on EP7KXA
4129 1458 7600 Onboard Audio
4130 1462 3091 MS-6309 Onboard Audio
4131 1462 3300 MS-6330 Onboard Audio
4132 15dd 7609 Onboard Audio
4133 3059 VT8233/A/8235/8237 AC97 Audio Controller
4134 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
4135 1043 8095 A7V8X Motherboard (Realtek ALC650 codec)
4136 1043 80a1 A7V8X-X Motherboard
4137 1043 80b0 A7V600/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX])
4138 1106 3059 L7VMM2 Motherboard
4139 1106 4161 K7VT2 motherboard
4140 1297 c160 FX41 motherboard (Realtek ALC650 codec)
4141 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650)
4142 1462 0080 K8T NEO 2 motherboard
4143 1462 3800 KT266 onboard audio
4144 147b 1407 KV8-MAX3 motherboard
4145 3065 VT6102 [Rhine-II]
4146 1043 80a1 A7V8X-X Motherboard
4147 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235
4148 1186 1400 DFE-530TX rev A
4149 1186 1401 DFE-530TX rev B
4150 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B)
4151# This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs
4152 3068 AC'97 Modem Controller
4153 1462 309e MS-6309 Saturn Motherboard
4154 3074 VT8233 PCI to ISA Bridge
4155 1043 8052 VT8233A
4156 3091 VT8633 [Apollo Pro266]
4157 3099 VT8366/A/7 [Apollo KT266/A/333]
4158 1043 8064 A7V266-E Mainboard
4159 1043 807f A7V333 Mainboard
4160 1849 3099 K7VT2 motherboard
4161 3101 VT8653 Host Bridge
4162 3102 VT8662 Host Bridge
4163 3103 VT8615 Host Bridge
4164 3104 USB 2.0
4165 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
4166 1043 808c A7V8X motherboard
4167 1043 80a1 A7V8X-X motherboard rev 1.01
4168 1043 80ed A7V600 motherboard
4169 1297 f641 FX41 motherboard
4170 1458 5004 GA-7VAX Mainboard
4171 1462 7020 K8T NEO 2 motherboard
4172 147b 1407 KV8-MAX3 motherboard
4173 182d 201d CN-029 USB 2.0 4 port PCI Card
4174 3106 VT6105 [Rhine-III]
4175 1186 1403 DFE-530TX rev C
4176 3108 S3 Unichrome Pro VGA Adapter
4177 3109 VT8233C PCI to ISA Bridge
4178 3112 VT8361 [KLE133] Host Bridge
4179 3116 VT8375 [KM266/KL266] Host Bridge
4180 1297 f641 FX41 motherboard
4181 3118 S3 Unichrome Pro VGA Adapter
4182 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter
4183# found on EPIA M6000/9000 mainboard
4184 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics
4185# found on EPIA M6000/9000 mainboard
4186 3123 VT8623 [Apollo CLE266]
4187 3128 VT8753 [P4X266 AGP]
4188 3133 VT3133 Host Bridge
4189 3147 VT8233A ISA Bridge
4190 3148 P4M266 Host Bridge
4191 3149 VIA VT6420 SATA RAID Controller
4192 1043 80ed A7V600/K8V Deluxe motherboard
4193 1458 b003 GA-7VM400AM(F) Motherboard
4194 1462 7020 K8T Neo 2 Motherboard
4195 147b 1407 KV8-MAX3 motherboard
4196 3156 P/KN266 Host Bridge
4197# on ASUS P4P800
4198 3164 VT6410 ATA133 RAID controller
4199 3168 VT8374 P4X400 Host Controller/AGP Bridge
4200 3177 VT8235 ISA Bridge
4201 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)
4202 1043 808c A7V8X motherboard
4203 1043 80a1 A7V8X-X motherboard
4204 1297 f641 FX41 motherboard
4205 1458 5001 GA-7VAX Mainboard
4206 1849 3177 K7VT2 motherboard
4207 3178 ProSavageDDR P4N333 Host Bridge
4208 3188 VT8385 [K8T800 AGP] Host Bridge
4209 1043 80a3 K8V Deluxe motherboard
4210 147b 1407 KV8-MAX3 motherboard
4211 3189 VT8377 [KT400/KT600 AGP] Host Bridge
4212 1043 807f A7V8X motherboard
4213 1458 5000 GA-7VAX Mainboard
4214 3204 K8M800
4215 3205 VT8378 [KM400/A] Chipset Host Bridge
4216 1458 5000 GA-7VM400M Motherboard
4217 3218 K8T800M Host Bridge
4218 3227 VT8237 ISA bridge [KT600/K8T800 South]
4219 1043 80ed A7V600 motherboard
4220 1106 3227 DFI KT600-AL Motherboard
4221 1458 5001 GA-7VT600 Motherboard
4222 147b 1407 KV8-MAX3 motherboard
4223 3249 VT6421 IDE RAID Controller
4224 4149 VIA VT6420 (ATA133) Controller
4225 5030 VT82C596 ACPI [Apollo PRO]
4226 6100 VT85C100A [Rhine II]
4227 7204 K8M800
4228# S3 Graphics UniChromeâ„¢ 2D/3D Graphics with motion compensation
4229 7205 VT8378 [S3 UniChrome] Integrated Video
4230 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard
4231 8231 VT8231 [PCI-to-ISA Bridge]
4232 8235 VT8235 ACPI
4233 8305 VT8363/8365 [KT133/KM133 AGP]
4234 8391 VT8371 [KX133 AGP]
4235 8501 VT8501 [Apollo MVP4 AGP]
4236 8596 VT82C596 [Apollo PRO AGP]
4237 8597 VT82C597 [Apollo VP3 AGP]
4238 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP]
4239 1019 0985 P6VXA Motherboard
4240 8601 VT8601 [Apollo ProMedia AGP]
4241 8605 VT8605 [PM133 AGP]
4242 8691 VT82C691 [Apollo Pro]
4243 8693 VT82C693 [Apollo Pro Plus] PCI Bridge
4244 b091 VT8633 [Apollo Pro266 AGP]
4245 b099 VT8366/A/7 [Apollo KT266/A/333 AGP]
4246 b101 VT8653 AGP Bridge
4247 b102 VT8362 AGP Bridge
4248 b103 VT8615 AGP Bridge
4249 b112 VT8361 [KLE133] AGP Bridge
4250 b168 VT8235 PCI Bridge
4251 b188 VT8237 PCI bridge [K8T800 South]
4252 147b 1407 KV8-MAX3 motherboard
4253 b198 VT8237 PCI Bridge
4254# 32-Bit PCI bus master Ethernet MAC with standard MII interface
4255 d104 VT8237 Integrated Fast Ethernet Controller
42561107 Stratus Computers
4257 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)
42581108 Proteon, Inc.
4259 0100 p1690plus_AA
4260 0101 p1690plus_AB
4261 0105 P1690Plus
4262 0108 P1690Plus
4263 0138 P1690Plus
4264 0139 P1690Plus
4265 013c P1690Plus
4266 013d P1690Plus
42671109 Cogent Data Technologies, Inc.
4268 1400 EM110TX [EX110TX]
4269110a Siemens Nixdorf AG
4270 0002 Pirahna 2-port
4271 0005 Tulip controller, power management, switch extender
4272 0006 FSC PINC (I/O-APIC)
4273 0015 FSC Multiprocessor Interrupt Controller
4274 001d FSC Copernicus Management Controller
4275 007b FSC Remote Service Controller, mailbox device
4276 007c FSC Remote Service Controller, shared memory device
4277 007d FSC Remote Service Controller, SMIC device
4278# Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter
4279 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels
4280 2104 Eicon Diva 2.02 compatible passive ISDN card
4281 3142 SIMATIC NET CP 5613A1 (Profibus Adapter)
4282 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)
4283 4029 SIMATIC NET CP 5613A2 (Profibus Adapter)
4284 4942 FPGA I-Bus Tracer for MBD
4285 6120 SZB6120
4286110b Chromatic Research Inc.
4287 0001 Mpact Media Processor
4288 0004 Mpact 2
4289110c Mini-Max Technology, Inc.
4290110d Znyx Advanced Systems
4291110e CPU Technology
4292110f Ross Technology
42931110 Powerhouse Systems
4294 6037 Firepower Powerized SMP I/O ASIC
4295 6073 Firepower Powerized SMP I/O ASIC
42961111 Santa Cruz Operation
4297# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom
42981112 Osicom Technologies Inc
4299 2200 FDDI Adapter
4300 2300 Fast Ethernet Adapter
4301 2340 4 Port Fast Ethernet Adapter
4302 2400 ATM Adapter
43031113 Accton Technology Corporation
4304 1211 SMC2-1211TX
4305 103c 1207 EN-1207D Fast Ethernet Adapter
4306 1113 1211 EN-1207D Fast Ethernet Adapter
4307 1216 EN-1216 Ethernet Adapter
4308 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card
4309 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]
4310 1217 EN-1217 Ethernet Adapter
4311 5105 10Mbps Network card
4312 9211 EN-1207D Fast Ethernet Adapter
4313 1113 9211 EN-1207D Fast Ethernet Adapter
4314 9511 21x4x DEC-Tulip compatible Fast Ethernet
4315 d301 CPWNA100 (Philips wireless PCMCIA)
4316 ec02 SMC 1244TX v3
43171114 Atmel Corporation
4318 0506 802.11b Wireless Network Adaptor (at76c506)
43191115 3D Labs
43201116 Data Translation
4321 0022 DT3001
4322 0023 DT3002
4323 0024 DT3003
4324 0025 DT3004
4325 0026 DT3005
4326 0027 DT3001-PGL
4327 0028 DT3003-PGL
43281117 Datacube, Inc
4329 9500 Max-1C SVGA card
4330 9501 Max-1C image processing
43311118 Berg Electronics
43321119 ICP Vortex Computersysteme GmbH
4333 0000 GDT 6000/6020/6050
4334 0001 GDT 6000B/6010
4335 0002 GDT 6110/6510
4336 0003 GDT 6120/6520
4337 0004 GDT 6530
4338 0005 GDT 6550
4339 0006 GDT 6117/6517
4340 0007 GDT 6127/6527
4341 0008 GDT 6537
4342 0009 GDT 6557/6557-ECC
4343 000a GDT 6115/6515
4344 000b GDT 6125/6525
4345 000c GDT 6535
4346 000d GDT 6555
4347 0010 GDT 6115/6515
4348 0011 GDT 6125/6525
4349 0012 GDT 6535
4350 0013 GDT 6555/6555-ECC
4351 0100 GDT 6117RP/6517RP
4352 0101 GDT 6127RP/6527RP
4353 0102 GDT 6537RP
4354 0103 GDT 6557RP
4355 0104 GDT 6111RP/6511RP
4356 0105 GDT 6121RP/6521RP
4357 0110 GDT 6117RD/6517RD
4358 0111 GDT 6127RD/6527RD
4359 0112 GDT 6537RD
4360 0113 GDT 6557RD
4361 0114 GDT 6111RD/6511RD
4362 0115 GDT 6121RD/6521RD
4363 0118 GDT 6118RD/6518RD/6618RD
4364 0119 GDT 6128RD/6528RD/6628RD
4365 011a GDT 6538RD/6638RD
4366 011b GDT 6558RD/6658RD
4367 0120 GDT 6117RP2/6517RP2
4368 0121 GDT 6127RP2/6527RP2
4369 0122 GDT 6537RP2
4370 0123 GDT 6557RP2
4371 0124 GDT 6111RP2/6511RP2
4372 0125 GDT 6121RP2/6521RP2
4373 0136 GDT 6113RS/6513RS
4374 0137 GDT 6123RS/6523RS
4375 0138 GDT 6118RS/6518RS/6618RS
4376 0139 GDT 6128RS/6528RS/6628RS
4377 013a GDT 6538RS/6638RS
4378 013b GDT 6558RS/6658RS
4379 013c GDT 6533RS/6633RS
4380 013d GDT 6543RS/6643RS
4381 013e GDT 6553RS/6653RS
4382 013f GDT 6563RS/6663RS
4383 0166 GDT 7113RN/7513RN/7613RN
4384 0167 GDT 7123RN/7523RN/7623RN
4385 0168 GDT 7118RN/7518RN/7518RN
4386 0169 GDT 7128RN/7528RN/7628RN
4387 016a GDT 7538RN/7638RN
4388 016b GDT 7558RN/7658RN
4389 016c GDT 7533RN/7633RN
4390 016d GDT 7543RN/7643RN
4391 016e GDT 7553RN/7653RN
4392 016f GDT 7563RN/7663RN
4393 01d6 GDT 4x13RZ
4394 01d7 GDT 4x23RZ
4395 01f6 GDT 8x13RZ
4396 01f7 GDT 8x23RZ
4397 01fc GDT 8x33RZ
4398 01fd GDT 8x43RZ
4399 01fe GDT 8x53RZ
4400 01ff GDT 8x63RZ
4401 0210 GDT 6519RD/6619RD
4402 0211 GDT 6529RD/6629RD
4403 0260 GDT 7519RN/7619RN
4404 0261 GDT 7529RN/7629RN
4405 02ff GDT MAXRP
4406 0300 GDT NEWRX
4407111a Efficient Networks, Inc
4408 0000 155P-MF1 (FPGA)
4409 0002 155P-MF1 (ASIC)
4410 0003 ENI-25P ATM
4411 111a 0000 ENI-25p Miniport ATM Adapter
4412 0005 SpeedStream (LANAI)
4413 111a 0001 ENI-3010 ATM
4414 111a 0009 ENI-3060 ADSL (VPI=0)
4415 111a 0101 ENI-3010 ATM
4416 111a 0109 ENI-3060CO ADSL (VPI=0)
4417 111a 0809 ENI-3060 ADSL (VPI=0 or 8)
4418 111a 0909 ENI-3060CO ADSL (VPI=0 or 8)
4419 111a 0a09 ENI-3060 ADSL (VPI=<0..15>)
4420 0007 SpeedStream ADSL
4421 111a 1001 ENI-3061 ADSL [ASIC]
4422 1203 SpeedStream 1023 Wireless PCI Adapter
4423111b Teledyne Electronic Systems
4424111c Tricord Systems Inc.
4425 0001 Powerbis Bridge
4426111d Integrated Device Technology, Inc.
4427 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]
4428 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller
4429 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller
4430 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller
4431111e Eldec
4432111f Precision Digital Images
4433 4a47 Precision MX Video engine interface
4434 5243 Frame capture bus interface
44351120 EMC Corporation
44361121 Zilog
44371122 Multi-tech Systems, Inc.
44381123 Excellent Design, Inc.
44391124 Leutron Vision AG
44401125 Eurocore
44411126 Vigra
44421127 FORE Systems Inc
4443 0200 ForeRunner PCA-200 ATM
4444 0210 PCA-200PC
4445 0250 ATM
4446 0300 ForeRunner PCA-200EPC ATM
4447 0310 ATM
4448 0400 ForeRunnerHE ATM Adapter
4449 1127 0400 ForeRunnerHE ATM
44501129 Firmworks
4451112a Hermes Electronics Company, Ltd.
4452112b Linotype - Hell AG
4453112c Zenith Data Systems
4454112d Ravicad
4455112e Infomedia Microelectronics Inc.
4456112f Imaging Technology Inc
4457 0000 MVC IC-PCI
4458 0001 MVC IM-PCI Video frame grabber/processor
44591130 Computervision
44601131 Philips Semiconductors
4461 1561 USB 1.1 Host Controller
4462 1562 USB 2.0 Host Controller
4463 3400 SmartPCI56(UCB1500) 56K Modem
4464 5400 TriMedia TM1000/1100
4465 5402 TriMedia TM-1300
4466 1244 0f00 Fritz!Card DSL
4467 7130 SAA7130 Video Broadcast Decoder
4468 5168 0138 LiveView FlyVideo 2000
4469 7133 SAA713X Audio+video broadcast decoder
4470 5168 0138 LifeView FlyVideo 3000
4471 5168 0212 LifeView FlyTV Platinum mini
4472 5168 0502 LifeView FlyDVB-T Duo CardBus
4473# PCI audio and video broadcast decoder (http://www.semiconductors.philips.com/pip/saa7134hl)
4474 7134 SAA7134
4475 1043 4842 TV-FM Card 7134
4476 7135 SAA7135 Audio+video broadcast decoder
4477 7145 SAA7145
4478 7146 SAA7146
4479 110a 0000 Fujitsu/Siemens DVB-C card rev1.5
4480 110a ffff Fujitsu/Siemens DVB-C card rev1.5
4481 1131 4f56 KNC1 DVB-S Budget
4482 1131 4f61 Fujitsu-Siemens Activy DVB-S Budget
4483 114b 2003 DVRaptor Video Edit/Capture Card
4484 11bd 0006 DV500 Overlay
4485 11bd 000a DV500 Overlay
4486 11bd 000f DV500 Overlay
4487 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5
4488 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
4489 13c2 0002 Technotrend/Hauppauge DVB card rev2.1
4490 13c2 0003 Technotrend/Hauppauge DVB card rev2.1
4491 13c2 0004 Technotrend/Hauppauge DVB card rev2.1
4492 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6
4493 13c2 0008 Technotrend/Hauppauge DVB-T
4494 13c2 000a Octal/Technotrend DVB-C for iTV
4495 13c2 1003 Technotrend-Budget / Hauppauge WinTV-NOVA-S DVB card
4496 13c2 1004 Technotrend-Budget / Hauppauge WinTV-NOVA-C DVB card
4497 13c2 1005 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card
4498 13c2 100c Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card
4499 13c2 100f Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card
4500 13c2 1011 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card
4501 13c2 1013 SATELCO Multimedia DVB
4502 13c2 1102 Technotrend/Hauppauge DVB card rev2.1
45031132 Mitel Corp.
4504# This is the new official company name. See disclaimer on www.eicon.com for details!
45051133 Eicon Networks Corporation
4506 7901 EiconCard S90
4507 7902 EiconCard S90
4508 7911 EiconCard S91
4509 7912 EiconCard S91
4510 7941 EiconCard S94
4511 7942 EiconCard S94
4512 7943 EiconCard S94
4513 7944 EiconCard S94
4514 b921 EiconCard P92
4515 b922 EiconCard P92
4516 b923 EiconCard P92
4517 e001 Diva Pro 2.0 S/T
4518 e002 Diva 2.0 S/T PCI
4519 e003 Diva Pro 2.0 U
4520 e004 Diva 2.0 U PCI
4521 e005 Diva 2.01 S/T PCI
4522 e006 Diva CT S/T PCI
4523 e007 Diva CT U PCI
4524 e008 Diva CT Lite S/T PCI
4525 e009 Diva CT Lite U PCI
4526 e00a Diva ISDN+V.90 PCI
4527 e00b Diva 2.02 PCI S/T
4528 e00c Diva 2.02 PCI U
4529 e00d Diva ISDN Pro 3.0 PCI
4530 e00e Diva ISDN+CT S/T PCI Rev 2
4531 e010 Diva Server BRI-2M PCI
4532 110a 0021 Fujitsu Siemens ISDN S0
4533 8001 0014 Diva Server BRI-2M PCI Cornet NQ
4534 e011 Diva Server BRI S/T Rev 2
4535 e012 Diva Server 4BRI-8M PCI
4536 8001 0014 Diva Server 4BRI-8M PCI Cornet NQ
4537 e013 Diva Server 4BRI Rev 2
4538 1133 1300 Diva Server V-4BRI-8
4539 1133 e013 Diva Server 4BRI-8M 2.0 PCI
4540 8001 0014 Diva Server 4BRI-8M 2.0 PCI Cornet NQ
4541 e014 Diva Server PRI-30M PCI
4542 0008 0100 Diva Server PRI-30M PCI
4543 8001 0014 Diva Server PRI-30M PCI Cornet NQ
4544 e015 DIVA Server PRI Rev 2
4545 1133 e015 Diva Server PRI 2.0 PCI
4546 8001 0014 Diva Server PRI 2.0 PCI Cornet NQ
4547 e016 Diva Server Voice 4BRI PCI
4548 8001 0014 Diva Server PRI Cornet NQ
4549 e017 Diva Server Voice 4BRI Rev 2
4550 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI
4551 8001 0014 Diva Server Voice 4BRI-8M 2.0 PCI Cornet NQ
4552 e018 Diva Server BRI-2M 2.0 PCI
4553 1133 1800 Diva Server V-BRI-2
4554 1133 e018 Diva Server BRI-2M 2.0 PCI
4555 8001 0014 Diva Server BRI-2M 2.0 PCI Cornet NQ
4556 e019 Diva Server Voice PRI Rev 2
4557 1133 e019 Diva Server Voice PRI 2.0 PCI
4558 8001 0014 Diva Server Voice PRI 2.0 PCI Cornet NQ
4559 e01a Diva Server 2FX
4560 e01b Diva Server Voice BRI-2M 2.0 PCI
4561 1133 e01b Diva Server Voice BRI-2M 2.0 PCI
4562 8001 0014 Diva Server Voice BRI-2M 2.0 PCI Cornet NQ
4563 e01c Diva Server PRI Rev 3
4564 1133 1c01 Diva Server PRI/E1/T1-8
4565 1133 1c02 Diva Server PRI/T1-24
4566 1133 1c03 Diva Server PRI/E1-30
4567 1133 1c04 Diva Server PRI/E1/T1
4568 1133 1c05 Diva Server V-PRI/T1-24
4569 1133 1c06 Diva Server V-PRI/E1-30
4570 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ
4571 1133 1c08 Diva Server PRI/T1-24 Cornet NQ
4572 1133 1c09 Diva Server PRI/E1-30 Cornet NQ
4573 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ
4574 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ
4575 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ
4576 e01e Diva Server 2PRI
4577 1133 1e00 Diva Server V-2PRI/E1-60
4578 1133 1e01 Diva Server V-2PRI/T1-48
4579 1133 1e02 Diva Server 2PRI/E1-60
4580 1133 1e03 Diva Server 2PRI/T1-48
4581 e020 Diva Server 4PRI
4582 1133 2000 Diva Server V-4PRI/E1-120
4583 1133 2001 Diva Server V-4PRI/T1-96
4584 1133 2002 Diva Server 4PRI/E1-120
4585 1133 2003 Diva Server 4PRI/T1-96
4586 e024 Diva Server Analog-4P
4587 1133 2400 Diva Server V-Analog-4P
4588 1133 e024 Diva Server Analog-4P
4589 e028 Diva Server Analog-8P
4590 1133 2800 Diva Server V-Analog-8P
4591 1133 e028 Diva Server Analog-8P
45921134 Mercury Computer Systems
4593 0001 Raceway Bridge
4594 0002 Dual PCI to RapidIO Bridge
45951135 Fuji Xerox Co Ltd
4596 0001 Printer controller
45971136 Momentum Data Systems
45981137 Cisco Systems Inc
45991138 Ziatech Corporation
4600 8905 8905 [STD 32 Bridge]
46011139 Dynamic Pictures, Inc
4602 0001 VGA Compatable 3D Graphics
4603113a FWB Inc
4604113b Network Computing Devices
4605113c Cyclone Microsystems, Inc.
4606 0000 PCI-9060 i960 Bridge
4607 0001 PCI-SDK [PCI i960 Evaluation Platform]
4608 0911 PCI-911 [i960Jx-based Intelligent I/O Controller]
4609 0912 PCI-912 [i960CF-based Intelligent I/O Controller]
4610 0913 PCI-913
4611 0914 PCI-914 [I/O Controller w/ secondary PCI bus]
4612113d Leading Edge Products Inc
4613113e Sanyo Electric Co - Computer Engineering Dept
4614113f Equinox Systems, Inc.
4615 0808 SST-64P Adapter
4616 1010 SST-128P Adapter
4617 80c0 SST-16P DB Adapter
4618 80c4 SST-16P RJ Adapter
4619 80c8 SST-16P Adapter
4620 8888 SST-4P Adapter
4621 9090 SST-8P Adapter
46221140 Intervoice Inc
46231141 Crest Microsystem Inc
46241142 Alliance Semiconductor Corporation
4625 3210 AP6410
4626 6422 ProVideo 6422
4627 6424 ProVideo 6424
4628 6425 ProMotion AT25
4629 643d ProMotion AT3D
46301143 NetPower, Inc
46311144 Cincinnati Milacron
4632 0001 Noservo controller
46331145 Workbit Corporation
4634 8007 NinjaSCSI-32 Workbit
4635 f007 NinjaSCSI-32 KME
4636 f010 NinjaSCSI-32 Workbit
4637 f012 NinjaSCSI-32 Logitec
4638 f013 NinjaSCSI-32 Logitec
4639 f015 NinjaSCSI-32 Melco
46401146 Force Computers
46411147 Interface Corp
4642# Formerly (Schneider & Koch)
46431148 SysKonnect
4644 4000 FDDI Adapter
4645 0e11 b03b Netelligent 100 FDDI DAS Fibre SC
4646 0e11 b03c Netelligent 100 FDDI SAS Fibre SC
4647 0e11 b03d Netelligent 100 FDDI DAS UTP
4648 0e11 b03e Netelligent 100 FDDI SAS UTP
4649 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC
4650 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP)
4651 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS)
4652 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP)
4653 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP)
4654 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS)
4655 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64)
4656 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS)
4657 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64)
4658 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64)
4659 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS)
4660 4200 Token Ring adapter
4661 4300 SK-98xx Gigabit Ethernet Server Adapter
4662 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)
4663 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)
4664 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)
4665 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)
4666 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)
4667 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)
4668 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)
4669 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)
4670 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
4671 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
4672 1259 2970 AT-2970SX Gigabit Ethernet Adapter
4673 1259 2971 AT-2970LX Gigabit Ethernet Adapter
4674 1259 2972 AT-2970TX Gigabit Ethernet Adapter
4675 1259 2973 AT-2971SX Gigabit Ethernet Adapter
4676 1259 2974 AT-2971T Gigabit Ethernet Adapter
4677 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter
4678 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter
4679 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter
4680 4320 SK-98xx V2.0 Gigabit Ethernet Adapter
4681 1148 0121 Marvell RDK-8001 Adapter
4682 1148 0221 Marvell RDK-8002 Adapter
4683 1148 0321 Marvell RDK-8003 Adapter
4684 1148 0421 Marvell RDK-8004 Adapter
4685 1148 0621 Marvell RDK-8006 Adapter
4686 1148 0721 Marvell RDK-8007 Adapter
4687 1148 0821 Marvell RDK-8008 Adapter
4688 1148 0921 Marvell RDK-8009 Adapter
4689 1148 1121 Marvell RDK-8011 Adapter
4690 1148 1221 Marvell RDK-8012 Adapter
4691 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter
4692 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
4693 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
4694 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
4695 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
4696 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
4697 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
4698 1148 9521 SK-9521 10/100/1000Base-T Adapter
4699 4400 SK-9Dxx Gigabit Ethernet Adapter
4700 4500 SK-9Mxx Gigabit Ethernet Adapter
4701 9000 SK-9Sxx Gigabit Ethernet Server Adapter PCI-X
4702 9843 [Fujitsu] Gigabit Ethernet
4703 9e00 SK-9Exx 10/100/1000Base-T Adapter
4704 1148 2100 SK-9E21 Server Adapter
4705 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter
4706 1148 2200 SK-9E22 Server Adapter
4707 1148 8100 SK-9E81 Server Adapter
4708 1148 8200 SK-9E82 Server Adapter
4709 1148 9100 SK-9E91 Server Adapter
4710 1148 9200 SK-9E92 Server Adapter
47111149 Win System Corporation
4712114a VMIC
4713 5579 VMIPCI-5579 (Reflective Memory Card)
4714 5587 VMIPCI-5587 (Reflective Memory Card)
4715 6504 VMIC PCI 7755 FPGA
4716 7587 VMIVME-7587
4717114b Canopus Co., Ltd
4718114c Annabooks
4719114d IC Corporation
4720114e Nikon Systems Inc
4721114f Digi International
4722 0002 AccelePort EPC
4723 0003 RightSwitch SE-6
4724 0004 AccelePort Xem
4725 0005 AccelePort Xr
4726 0006 AccelePort Xr,C/X
4727 0009 AccelePort Xr/J
4728 000a AccelePort EPC/J
4729 000c DataFirePRIme T1 (1-port)
4730 000d SyncPort 2-Port (x.25/FR)
4731 0011 AccelePort 8r EIA-232 (IBM)
4732 0012 AccelePort 8r EIA-422
4733 0013 AccelePort Xr
4734 0014 AccelePort 8r EIA-422
4735 0015 AccelePort Xem
4736 0016 AccelePort EPC/X
4737 0017 AccelePort C/X
4738 001a DataFirePRIme E1 (1-port)
4739 001b AccelePort C/X (IBM)
4740 001d DataFire RAS T1/E1/PRI
4741 114f 0050 DataFire RAS E1 Adapter
4742 114f 0051 DataFire RAS Dual E1 Adapter
4743 114f 0052 DataFire RAS T1 Adapter
4744 114f 0053 DataFire RAS Dual T1 Adapter
4745 0023 AccelePort RAS
4746 0024 DataFire RAS B4 ST/U
4747 114f 0030 DataFire RAS BRI U Adapter
4748 114f 0031 DataFire RAS BRI S/T Adapter
4749 0026 AccelePort 4r 920
4750 0027 AccelePort Xr 920
4751 0028 ClassicBoard 4
4752 0029 ClassicBoard 8
4753 0034 AccelePort 2r 920
4754 0035 DataFire DSP T1/E1/PRI cPCI
4755 0040 AccelePort Xp
4756 0042 AccelePort 2p
4757 0043 AccelePort 4p
4758 0044 AccelePort 8p
4759 0045 AccelePort 16p
4760 004e AccelePort 32p
4761 0070 Datafire Micro V IOM2 (Europe)
4762 0071 Datafire Micro V (Europe)
4763 0072 Datafire Micro V IOM2 (North America)
4764 0073 Datafire Micro V (North America)
4765 00b0 Digi Neo 4
4766 00b1 Digi Neo 8
4767 00c8 Digi Neo 2 DB9
4768 00c9 Digi Neo 2 DB9 PRI
4769 00ca Digi Neo 2 RJ45
4770 00cb Digi Neo 2 RJ45 PRI
4771 00d0 ClassicBoard 4 422
4772 00d1 ClassicBoard 8 422
4773 6001 Avanstar
47741150 Thinking Machines Corp
47751151 JAE Electronics Inc.
47761152 Megatek
47771153 Land Win Electronic Corp
47781154 Melco Inc
47791155 Pine Technology Ltd
47801156 Periscope Engineering
47811157 Avsys Corporation
47821158 Voarx R & D Inc
4783 3011 Tokenet/vg 1001/10m anylan
4784 9050 Lanfleet/Truevalue
4785 9051 Lanfleet/Truevalue
47861159 Mutech Corp
4787 0001 MV-1000
4788115a Harlequin Ltd
4789115b Parallax Graphics
4790115c Photron Ltd.
4791115d Xircom
4792 0003 Cardbus Ethernet 10/100
4793 1014 0181 10/100 EtherJet Cardbus Adapter
4794 1014 1181 10/100 EtherJet Cardbus Adapter
4795 1014 8181 10/100 EtherJet Cardbus Adapter
4796 1014 9181 10/100 EtherJet Cardbus Adapter
4797 115d 0181 Cardbus Ethernet 10/100
4798 115d 1181 Cardbus Ethernet 10/100
4799 1179 0181 Cardbus Ethernet 10/100
4800 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
4801 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter
4802 0005 Cardbus Ethernet 10/100
4803 1014 0182 10/100 EtherJet Cardbus Adapter
4804 1014 1182 10/100 EtherJet Cardbus Adapter
4805 115d 0182 Cardbus Ethernet 10/100
4806 115d 1182 Cardbus Ethernet 10/100
4807 0007 Cardbus Ethernet 10/100
4808 1014 0182 10/100 EtherJet Cardbus Adapter
4809 1014 1182 10/100 EtherJet Cardbus Adapter
4810 115d 0182 Cardbus Ethernet 10/100
4811 115d 1182 Cardbus Ethernet 10/100
4812 000b Cardbus Ethernet 10/100
4813 1014 0183 10/100 EtherJet Cardbus Adapter
4814 115d 0183 Cardbus Ethernet 10/100
4815 000c Mini-PCI V.90 56k Modem
4816 000f Cardbus Ethernet 10/100
4817 1014 0183 10/100 EtherJet Cardbus Adapter
4818 115d 0183 Cardbus Ethernet 10/100
4819 00d4 Mini-PCI K56Flex Modem
4820 0101 Cardbus 56k modem
4821 115d 1081 Cardbus 56k Modem
4822 0103 Cardbus Ethernet + 56k Modem
4823 1014 9181 Cardbus 56k Modem
4824 1115 1181 Cardbus Ethernet 100 + 56k Modem
4825 115d 1181 CBEM56G-100 Ethernet + 56k Modem
4826 8086 9181 PRO/100 LAN + Modem56 CardBus
4827115e Peer Protocols Inc
4828115f Maxtor Corporation
48291160 Megasoft Inc
48301161 PFU Limited
48311162 OA Laboratory Co Ltd
48321163 Rendition
4833 0001 Verite 1000
4834 2000 Verite V2000/V2100/V2200
4835 1092 2000 Stealth II S220
48361164 Advanced Peripherals Technologies
48371165 Imagraph Corporation
4838 0001 Motion TPEG Recorder/Player with audio
48391166 ServerWorks
4840 0000 CMIC-LE
4841 0005 CNB20-LE Host Bridge
4842 0006 CNB20HE Host Bridge
4843 0007 CNB20-LE Host Bridge
4844 0008 CNB20HE Host Bridge
4845 0009 CNB20LE Host Bridge
4846 0010 CIOB30
4847 0011 CMIC-HE
4848 0012 CMIC-WS Host Bridge (GC-LE chipset)
4849 0013 CNB20-HE Host Bridge
4850 0014 CMIC-LE Host Bridge (GC-LE chipset)
4851 0015 CMIC-GC Host Bridge
4852 0016 CMIC-GC Host Bridge
4853 0017 GCNB-LE Host Bridge
4854 0101 CIOB-X2 PCI-X I/O Bridge
4855 0110 CIOB-E I/O Bridge with Gigabit Ethernet
4856 0200 OSB4 South Bridge
4857 0201 CSB5 South Bridge
4858 4c53 1080 CT8 mainboard
4859 0203 CSB6 South Bridge
4860 0211 OSB4 IDE Controller
4861 0212 CSB5 IDE Controller
4862 4c53 1080 CT8 mainboard
4863 0213 CSB6 RAID/IDE Controller
4864 0217 CSB6 IDE Controller
4865 0220 OSB4/CSB5 OHCI USB Controller
4866 4c53 1080 CT8 mainboard
4867 0221 CSB6 OHCI USB Controller
4868 0225 CSB5 LPC bridge
4869# cancelled
4870 4c53 1080 CT8 mainboard
4871 0227 GCLE-2 Host Bridge
4872 0230 CSB5 LPC bridge
4873 4c53 1080 CT8 mainboard
4874 0240 K2 SATA
4875 0241 K2 SATA
4876 0242 K2 SATA
48771167 Mutoh Industries Inc
48781168 Thine Electronics Inc
48791169 Centre for Development of Advanced Computing
4880116a Polaris Communications
4881 6100 Bus/Tag Channel
4882 6800 Escon Channel
4883 7100 Bus/Tag Channel
4884 7800 Escon Channel
4885116b Connectware Inc
4886116c Intelligent Resources Integrated Systems
4887116d Martin-Marietta
4888116e Electronics for Imaging
4889116f Workstation Technology
48901170 Inventec Corporation
48911171 Loughborough Sound Images Plc
48921172 Altera Corporation
48931173 Adobe Systems, Inc
48941174 Bridgeport Machines
48951175 Mitron Computer Inc.
48961176 SBE Incorporated
48971177 Silicon Engineering
48981178 Alfa, Inc.
4899 afa1 Fast Ethernet Adapter
49001179 Toshiba America Info Systems
4901 0103 EX-IDE Type-B
4902 0404 DVD Decoder card
4903 0406 Tecra Video Capture device
4904 0407 DVD Decoder card (Version 2)
4905 0601 CPU to PCI bridge
4906 0603 ToPIC95 PCI to CardBus Bridge for Notebooks
4907 060a ToPIC95
4908 060f ToPIC97
4909 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support
4910 0618 CPU to PCI and PCI to ISA bridge
4911# Claimed to be Lucent DSP1645 [Mars], but that's apparently incorrect. Does anyone know the correct ID?
4912 0701 FIR Port
4913 0804 TC6371AF SmartMedia Controller
4914 0805 SD TypA Controller
4915 0d01 FIR Port Type-DO
4916 1179 0001 FIR Port Type-DO
4917117a A-Trend Technology
4918117b L G Electronics, Inc.
4919117c Atto Technology
4920117d Becton & Dickinson
4921117e T/R Systems
4922117f Integrated Circuit Systems
49231180 Ricoh Co Ltd
4924 0465 RL5c465
4925 0466 RL5c466
4926 0475 RL5c475
4927 144d c006 vpr Matrix 170B4 CardBus bridge
4928 0476 RL5c476 II
4929 1014 0185 ThinkPad A/T/X Series
4930 104d 80df Vaio PCG-FX403
4931 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
4932 14ef 0220 PCD-RP-220S
4933 0477 RL5c477
4934 0478 RL5c478
4935 1014 0184 ThinkPad A30p (2653-64G)
4936 0522 R5C522 IEEE 1394 Controller
4937 1014 01cf ThinkPad A30p (2653-64G)
4938 0551 R5C551 IEEE 1394 Controller
4939 144d c006 vpr Matrix 170B4
4940 0552 R5C552 IEEE 1394 Controller
4941 1014 0511 ThinkPad A/T/X Series
4942 0576 R5C576 SD Bus Host Adapter
4943 0592 R5C592 Memory Stick Bus Host Adapter
49441181 Telmatics International
49451183 Fujikura Ltd
49461184 Forks Inc
49471185 Dataworld International Ltd
49481186 D-Link System Inc
4949 0100 DC21041
4950 1002 DL10050 Sundance Ethernet
4951 1186 1002 DFE-550TX
4952 1186 1012 DFE-580TX
4953 1025 AirPlus Xtreme G DWL-G650 Adapter
4954 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter
4955 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter
4956 1300 RTL8139 Ethernet
4957 1186 1300 DFE-538TX 10/100 Ethernet Adapter
4958 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter
4959 1340 DFE-690TXD CardBus PC Card
4960 1541 DFE-680TXD CardBus PC Card
4961 1561 DRP-32TXD Cardbus PC Card
4962 2027 AirPlus Xtreme G DWL-G520 Adapter
4963 3203 AirPlus Xtreme G DWL-G520 Adapter
4964 3300 DWL-510 2.4GHz Wireless PCI Adapter
4965 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)
4966 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter
4967 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter
4968 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter
4969 3a08 AirXpert DWL-AG520 Wireless PCI Adapter
4970 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)
4971 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)
4972 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
4973 3a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B)
4974 3a14 AirPremier DWL-AG530 Wireless PCI Adapter
4975 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter
4976 3b05 DWL-G650+ CardBus PC Card
4977 4000 DL2000-based Gigabit Ethernet
4978 4300 DGE-528T Gigabit Ethernet Adapter
4979 4c00 Gigabit Ethernet Adapter
4980 1186 4c00 DGE-530T Gigabit Ethernet Adapter
4981 8400 D-Link DWL-650+ CardBus PC Card
49821187 Advanced Technology Laboratories, Inc.
49831188 Shima Seiki Manufacturing Ltd.
49841189 Matsushita Electronics Co Ltd
4985118a Hilevel Technology
4986118b Hypertec Pty Limited
4987118c Corollary, Inc
4988 0014 PCIB [C-bus II to PCI bus host bridge chip]
4989 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]
4990118d BitFlow Inc
4991 0001 Raptor-PCI framegrabber
4992 0012 Model 12 Road Runner Frame Grabber
4993 0014 Model 14 Road Runner Frame Grabber
4994 0024 Model 24 Road Runner Frame Grabber
4995 0044 Model 44 Road Runner Frame Grabber
4996 0112 Model 12 Road Runner Frame Grabber
4997 0114 Model 14 Road Runner Frame Grabber
4998 0124 Model 24 Road Runner Frame Grabber
4999 0144 Model 44 Road Runner Frame Grabber
5000 0212 Model 12 Road Runner Frame Grabber
5001 0214 Model 14 Road Runner Frame Grabber
5002 0224 Model 24 Road Runner Frame Grabber
5003 0244 Model 44 Road Runner Frame Grabber
5004 0312 Model 12 Road Runner Frame Grabber
5005 0314 Model 14 Road Runner Frame Grabber
5006 0324 Model 24 Road Runner Frame Grabber
5007 0344 Model 44 Road Runner Frame Grabber
5008118e Hermstedt GmbH
5009118f Green Logic
50101190 Tripace
5011 c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter
50121191 Artop Electronic Corp
5013 0003 SCSI Cache Host Adapter
5014 0004 ATP8400
5015 0005 ATP850UF
5016 0006 ATP860 NO-BIOS
5017 0007 ATP860
5018 0008 ATP865 NO-ROM
5019 0009 ATP865
5020 8002 AEC6710 SCSI-2 Host Adapter
5021 8010 AEC6712UW SCSI
5022 8020 AEC6712U SCSI
5023 8030 AEC6712S SCSI
5024 8040 AEC6712D SCSI
5025 8050 AEC6712SUW SCSI
5026 8060 AEC6712 SCSI
5027 8080 AEC67160 SCSI
5028 8081 AEC67160S SCSI
5029 808a AEC67162 2-ch. LVD SCSI
50301192 Densan Company Ltd
50311193 Zeitnet Inc.
5032 0001 1221
5033 0002 1225
50341194 Toucan Technology
50351195 Ratoc System Inc
50361196 Hytec Electronics Ltd
50371197 Gage Applied Sciences, Inc.
5038 010c CompuScope 82G 8bit 2GS/s Analog Input Card
50391198 Lambda Systems Inc
50401199 Attachmate Corporation
5041119a Mind Share, Inc.
5042119b Omega Micro Inc.
5043 1221 82C092G
5044119c Information Technology Inst.
5045119d Bug, Inc. Sapporo Japan
5046119e Fujitsu Microelectronics Ltd.
5047 0001 FireStream 155
5048 0003 FireStream 50
5049119f Bull HN Information Systems
505011a0 Convex Computer Corporation
505111a1 Hamamatsu Photonics K.K.
505211a2 Sierra Research and Technology
505311a3 Deuretzbacher GmbH & Co. Eng. KG
505411a4 Barco Graphics NV
505511a5 Microunity Systems Eng. Inc
505611a6 Pure Data Ltd.
505711a7 Power Computing Corp.
505811a8 Systech Corp.
505911a9 InnoSys Inc.
5060 4240 AMCC S933Q Intelligent Serial Card
506111aa Actel
5062# Formerly Galileo Technology, Inc.
506311ab Marvell Technology Group Ltd.
5064 0146 GT-64010/64010A System Controller
5065 138f W8300 802.11 Adapter (rev 07)
5066 1fa6 Marvell W8300 802.11 Adapter
5067 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset
5068 4320 Gigabit Ethernet Controller
5069 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
5070 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS)
5071 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus)
5072 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus)
5073 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)
5074 10b8 b452 SMC EZ Card 1000 (SMC9452TXV.2)
5075 11ab 0121 Marvell RDK-8001
5076 11ab 0321 Marvell RDK-8003
5077 11ab 1021 Marvell RDK-8010
5078 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)
5079 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)
5080 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)
5081 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit)
5082 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill)
5083 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox)
5084 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron)
5085 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)
5086 4350 Fast Ethernet Controller
5087 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba)
5088 11ab 3521 Marvell RDK-8035
5089 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE)
5090 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE)
5091 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE)
5092 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE)
5093 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE)
5094 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE)
5095 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE)
5096 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE)
5097 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE)
5098 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE)
5099 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE)
5100 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE)
5101 4351 Fast Ethernet Controller
5102 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron)
5103 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic)
5104 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba)
5105 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal)
5106 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec)
5107 11ab 3621 Marvell RDK-8036
5108 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard
5109 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima)
5110 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE)
5111 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE)
5112 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE)
5113 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE)
5114 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE)
5115 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE)
5116 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE)
5117 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE)
5118 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE)
5119 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE)
5120 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE)
5121 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE)
5122 4360 Gigabit Ethernet Controller
5123 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus)
5124 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron)
5125 11ab 5221 Marvell RDK-8052
5126 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
5127 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI)
5128 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock)
5129 1940 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
5130 a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen)
5131 4361 Gigabit Ethernet Controller
5132 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway)
5133 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel)
5134 8086 3063 D925XCVLK mainboard
5135 4362 Gigabit Ethernet Controller
5136 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus)
5137 1043 8142 Marvell 88E8053 Gigabit Ethernet Controller (Asus)
5138 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem)
5139 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)
5140 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO)
5141 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)
5142 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
5143 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec)
5144 11ab 5321 Marvell RDK-8053
5145 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
5146 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
5147 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
5148 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
5149 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
5150 13d1 ac11 Abocom EGE5K - Giga Ethernet Expresscard
5151 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
5152 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI)
5153 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal)
5154 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo)
5155 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI)
5156 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima)
5157 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima)
5158 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox)
5159 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron)
5160 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta)
5161 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock)
5162 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5163 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5164 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5165 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5166 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5167 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5168 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5169 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5170 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5171 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5172 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5173 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE)
5174 1940 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
5175 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)
5176 a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen)
5177 4611 GT-64115 System Controller
5178 4620 GT-64120/64120A/64121A System Controller
5179 4801 GT-48001
5180 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card
5181 5040 MV88SX5040 4-port SATA I PCI-X Controller
5182 5041 MV88SX5041 4-port SATA I PCI-X Controller
5183 5080 MV88SX5080 8-port SATA I PCI-X Controller
5184 5081 MV88SX5081 8-port SATA I PCI-X Controller
5185 6041 MV88SX6041 4-port SATA II PCI-X Controller
5186 6081 MV88SX6081 8-port SATA II PCI-X Controller
5187 6460 MV64360/64361/64362 System Controller
5188 f003 GT-64010 Primary Image Piranha Image Generator
518911ac Canon Information Systems Research Aust.
519011ad Lite-On Communications Inc
5191 0002 LNE100TX
5192 11ad 0002 LNE100TX
5193 11ad 0003 LNE100TX
5194 11ad f003 LNE100TX
5195 11ad ffff LNE100TX
5196 1385 f004 FA310TX
5197 c115 LNE100TX [Linksys EtherFast 10/100]
5198 11ad c001 LNE100TX [ver 2.0]
519911ae Aztech System Ltd
520011af Avid Technology Inc.
5201 0001 [Cinema]
520211b0 V3 Semiconductor Inc.
5203 0002 V300PSC
5204 0292 V292PBC [Am29030/40 Bridge]
5205 0960 V96xPBC
5206 c960 V96DPC
520711b1 Apricot Computers
520811b2 Eastman Kodak
520911b3 Barr Systems Inc.
521011b4 Leitch Technology International
521111b5 Radstone Technology Plc
521211b6 United Video Corp
521311b7 Motorola
521411b8 XPoint Technologies, Inc
5215 0001 Quad PeerMaster
521611b9 Pathlight Technology Inc.
5217 c0ed SSA Controller
521811ba Videotron Corp
521911bb Pyramid Technology
522011bc Network Peripherals Inc
5221 0001 NP-PCI
522211bd Pinnacle Systems Inc.
522311be International Microcircuits Inc
522411bf Astrodesign, Inc.
522511c0 Hewlett Packard
522611c1 Agere Systems (former Lucent Microelectronics)
5227 0440 56k WinModem
5228 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd
5229 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd
5230 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd
5231 10cf 102c LB LT Modem V.90 56k
5232 10cf 104a BIBLO LT Modem 56k
5233 10cf 105f LB2 LT Modem V.90 56k
5234 1179 0001 Internal V.90 Modem
5235 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
5236 122d 4101 MDP7800-U Modem
5237 122d 4102 MDP7800SP-U Modem
5238 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
5239 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
5240 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd
5241 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd
5242 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd
5243 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd
5244 144d 2101 LT56PV Modem
5245 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd
5246 0441 56k WinModem
5247 1033 804d LT WinModem 56k Data+Fax
5248 1033 8065 LT WinModem 56k Data+Fax
5249 1092 0440 Supra 56i
5250 1179 0001 Internal V.90 Modem
5251 11c1 0440 LT WinModem 56k Data+Fax
5252 11c1 0441 LT WinModem 56k Data+Fax
5253 122d 4100 MDP7800-U Modem
5254 13e0 0040 LT WinModem 56k Data+Fax
5255 13e0 0100 LT WinModem 56k Data+Fax
5256 13e0 0410 LT WinModem 56k Data+Fax
5257 13e0 0420 TelePath Internet 56k WinModem
5258 13e0 0440 LT WinModem 56k Data+Fax
5259 13e0 0443 LT WinModem 56k Data+Fax
5260 13e0 f102 LT WinModem 56k Data+Fax
5261 1416 9804 CommWave 56k Modem
5262 141d 0440 LT WinModem 56k Data+Fax
5263 144f 0441 Lucent 56k V.90 DF Modem
5264 144f 0449 Lucent 56k V.90 DF Modem
5265 144f 110d Lucent Win Modem
5266 1468 0441 Presario 56k V.90 DF Modem
5267 1668 0440 Lucent Win Modem
5268 0442 56k WinModem
5269 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5270 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5271 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5272 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5273 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5274 144d 2104 LT56PT Modem
5275 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5276 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5277 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5278 0443 LT WinModem
5279 0444 LT WinModem
5280 0445 LT WinModem
5281 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)
5282 8086 2204 PRO/100+ MiniPCI on Armada E500
5283 0446 LT WinModem
5284 0447 LT WinModem
5285 0448 WinModem 56k
5286 1014 0131 Lucent Win Modem
5287 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd
5288 13e0 0030 56k Voice Modem
5289 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd
5290# Actiontech eth+modem card as used by Dell &c.
5291 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem)
5292 0449 WinModem 56k
5293 0e11 b14d 56k V.90 Modem
5294 13e0 0020 LT WinModem 56k Data+Fax
5295 13e0 0041 TelePath Internet 56k WinModem
5296 1436 0440 Lucent Win Modem
5297 144f 0449 Lucent 56k V.90 DFi Modem
5298 1468 0410 IBM ThinkPad T23 (2647-4MG)
5299 1468 0440 Lucent Win Modem
5300 1468 0449 Presario 56k V.90 DFi Modem
5301 044a F-1156IV WinModem (V90, 56KFlex)
5302 10cf 1072 LB Global LT Modem
5303 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5304 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5305 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
5306 044b LT WinModem
5307 044c LT WinModem
5308 044d LT WinModem
5309 044e LT WinModem
5310 044f V90 WildWire Modem
5311 0450 LT WinModem
5312 1033 80a8 Versa Note Vxi
5313 144f 4005 Magnia SG20
5314 0451 LT WinModem
5315 0452 LT WinModem
5316 0453 LT WinModem
5317 0454 LT WinModem
5318 0455 LT WinModem
5319 0456 LT WinModem
5320 0457 LT WinModem
5321 0458 LT WinModem
5322 0459 LT WinModem
5323 045a LT WinModem
5324 045c LT WinModem
5325 0461 V90 WildWire Modem
5326 0462 V90 WildWire Modem
5327 0480 Venus Modem (V90, 56KFlex)
5328 048c V.92 56K WinModem
5329# InPorte Home Internal 56k Modem/fax/answering machine/SMS Features
5330 048f V.92 56k WinModem
5331 5801 USB
5332 5802 USS-312 USB Controller
5333# 4 port PCI USB Controller made by Agere (formely Lucent)
5334 5803 USS-344S USB Controller
5335 5811 FW323
5336 8086 524c D865PERL mainboard
5337 dead 0800 FireWire Host Bus Adapter
5338 ab10 WL60010 Wireless LAN MAC
5339 ab11 WL60040 Multimode Wireles LAN MAC
5340 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102)
5341 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512)
5342 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106)
5343 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516)
5344 ab20 ORiNOCO PCI Adapter
5345 ab21 Agere Wireless PCI Adapter
5346 ab30 Hermes2 Mini-PCI WaveLAN a/b/g
5347 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g
534811c2 Sand Microelectronics
534911c3 NEC Corporation
535011c4 Document Technologies, Inc
535111c5 Shiva Corporation
535211c6 Dainippon Screen Mfg. Co. Ltd
535311c7 D.C.M. Data Systems
535411c8 Dolphin Interconnect Solutions AS
5355 0658 PSB32 SCI-Adapter D31x
5356 d665 PSB64 SCI-Adapter D32x
5357 d667 PSB66 SCI-Adapter D33x
535811c9 Magma
5359 0010 16-line serial port w/- DMA
5360 0011 4-line serial port w/- DMA
536111ca LSI Systems, Inc
536211cb Specialix Research Ltd.
5363 2000 PCI_9050
5364 11cb 0200 SX
5365 11cb b008 I/O8+
5366 4000 SUPI_1
5367 8000 T225
536811cc Michels & Kleberhoff Computer GmbH
536911cd HAL Computer Systems, Inc.
537011ce Netaccess
537111cf Pioneer Electronic Corporation
537211d0 Lockheed Martin Federal Systems-Manassas
537311d1 Auravision
5374 01f7 VxP524
537511d2 Intercom Inc.
537611d3 Trancell Systems Inc
537711d4 Analog Devices
5378 1535 Blackfin BF535 processor
5379 1805 SM56 PCI modem
5380 1889 AD1889 sound chip
538111d5 Ikon Corporation
5382 0115 10115
5383 0117 10117
538411d6 Tekelec Telecom
538511d7 Trenton Technology, Inc.
538611d8 Image Technologies Development
538711d9 TEC Corporation
538811da Novell
538911db Sega Enterprises Ltd
539011dc Questra Corporation
539111dd Crosfield Electronics Limited
539211de Zoran Corporation
5393 6057 ZR36057PQC Video cutting chipset
5394 1031 7efe DC10 Plus
5395 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board
5396 13ca 4231 JPEG/TV Card
5397 6120 ZR36120
5398 1328 f001 Cinemaster C DVD Decoder
539911df New Wave PDG
540011e0 Cray Communications A/S
540111e1 GEC Plessey Semi Inc.
540211e2 Samsung Information Systems America
540311e3 Quicklogic Corporation
5404 5030 PC Watchdog
540511e4 Second Wave Inc
540611e5 IIX Consulting
540711e6 Mitsui-Zosen System Research
540811e7 Toshiba America, Elec. Company
540911e8 Digital Processing Systems Inc.
541011e9 Highwater Designs Ltd.
541111ea Elsag Bailey
541211eb Formation Inc.
541311ec Coreco Inc
541411ed Mediamatics
541511ee Dome Imaging Systems Inc
541611ef Nicolet Technologies B.V.
541711f0 Compu-Shack
5418 4231 FDDI
5419 4232 FASTline UTP Quattro
5420 4233 FASTline FO
5421 4234 FASTline UTP
5422 4235 FASTline-II UTP
5423 4236 FASTline-II FO
5424 4731 GIGAline
542511f1 Symbios Logic Inc
542611f2 Picture Tel Japan K.K.
542711f3 Keithley Metrabyte
542811f4 Kinetic Systems Corporation
5429 2915 CAMAC controller
543011f5 Computing Devices International
543111f6 Compex
5432 0112 ENet100VG4
5433 0113 FreedomLine 100
5434 1401 ReadyLink 2000
5435 2011 RL100-ATX 10/100
5436 11f6 2011 RL100-ATX
5437 2201 ReadyLink 100TX (Winbond W89C840)
5438 11f6 2011 ReadyLink 100TX
5439 9881 RL100TX Fast Ethernet
544011f7 Scientific Atlanta
544111f8 PMC-Sierra Inc.
5442 7375 PM7375 [LASAR-155 ATM SAR]
544311f9 I-Cube Inc
544411fa Kasan Electronics Company, Ltd.
544511fb Datel Inc
544611fc Silicon Magic
544711fd High Street Consultants
544811fe Comtrol Corporation
5449 0001 RocketPort 32 port w/external I/F
5450 0002 RocketPort 8 port w/external I/F
5451 0003 RocketPort 16 port w/external I/F
5452 0004 RocketPort 4 port w/quad cable
5453 0005 RocketPort 8 port w/octa cable
5454 0006 RocketPort 8 port w/RJ11 connectors
5455 0007 RocketPort 4 port w/RJ11 connectors
5456 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector
5457 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector
5458 000a RocketPort Plus 4 port
5459 000b RocketPort Plus 8 port
5460 000c RocketModem 6 port
5461 000d RocketModem 4-port
5462 000e RocketPort Plus 2 port RS232
5463 000f RocketPort Plus 2 port RS422
5464 0801 RocketPort UPCI 32 port w/external I/F
5465 0802 RocketPort UPCI 8 port w/external I/F
5466 0803 RocketPort UPCI 16 port w/external I/F
5467 0805 RocketPort UPCI 8 port w/octa cable
5468 080c RocketModem III 8 port
5469 080d RocketModem III 4 port
5470 0903 RocketPort Compact PCI 16 port w/external I/F
5471 8015 RocketPort 4-port UART 16954
547211ff Scion Corporation
5473 0003 AG-5
54741200 CSS Corporation
54751201 Vista Controls Corp
54761202 Network General Corp.
5477 4300 Gigabit Ethernet Adapter
5478 1202 9841 SK-9841 LX
5479 1202 9842 SK-9841 LX dual link
5480 1202 9843 SK-9843 SX
5481 1202 9844 SK-9843 SX dual link
54821203 Bayer Corporation, Agfa Division
54831204 Lattice Semiconductor Corporation
54841205 Array Corporation
54851206 Amdahl Corporation
54861208 Parsytec GmbH
5487 4853 HS-Link Device
54881209 SCI Systems Inc
5489120a Synaptel
5490120b Adaptive Solutions
5491120c Technical Corp.
5492120d Compression Labs, Inc.
5493120e Cyclades Corporation
5494 0100 Cyclom-Y below first megabyte
5495 0101 Cyclom-Y above first megabyte
5496 0102 Cyclom-4Y below first megabyte
5497 0103 Cyclom-4Y above first megabyte
5498 0104 Cyclom-8Y below first megabyte
5499 0105 Cyclom-8Y above first megabyte
5500 0200 Cyclades-Z below first megabyte
5501 0201 Cyclades-Z above first megabyte
5502 0300 PC300/RSV or /X21 (2 ports)
5503 0301 PC300/RSV or /X21 (1 port)
5504 0310 PC300/TE (2 ports)
5505 0311 PC300/TE (1 port)
5506 0320 PC300/TE-M (2 ports)
5507 0321 PC300/TE-M (1 port)
5508 0400 PC400
5509120f Essential Communications
5510 0001 Roadrunner serial HIPPI
55111210 Hyperparallel Technologies
55121211 Braintech Inc
55131212 Kingston Technology Corp.
55141213 Applied Intelligent Systems, Inc.
55151214 Performance Technologies, Inc.
55161215 Interware Co., Ltd
55171216 Purup Prepress A/S
55181217 O2 Micro, Inc.
5519 6729 OZ6729
5520 673a OZ6730
5521 6832 OZ6832/6833 CardBus Controller
5522 6836 OZ6836/6860 CardBus Controller
5523 6872 OZ6812 CardBus Controller
5524 6925 OZ6922 CardBus Controller
5525 6933 OZ6933/711E1 CardBus/SmartCardBus Controller
5526 1025 1016 Travelmate 612 TX
5527 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller
5528 1014 020c ThinkPad R30
5529 1179 0001 Magnia Z310
5530 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator
5531 103c 088c nc8000 laptop
5532 103c 0890 nc6000 laptop
5533 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller
5534 7113 OZ711EC1 SmartCardBus Controller
5535 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller
5536 7134 OZ711MP1/MS1 MemoryCardBus Controller
5537 71e2 OZ711E2 SmartCardBus Controller
5538 7212 OZ711M2 4-in-1 MemoryCardBus Controller
5539 7213 OZ6933E CardBus Controller
5540 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller
5541 103c 088c nc8000 laptop
5542 103c 0890 nc6000 laptop
5543 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller
55441218 Hybricon Corp.
55451219 First Virtual Corporation
5546121a 3Dfx Interactive, Inc.
5547 0001 Voodoo
5548 0002 Voodoo 2
5549 0003 Voodoo Banshee
5550 1092 0003 Monster Fusion
5551 1092 4000 Monster Fusion
5552 1092 4002 Monster Fusion
5553 1092 4801 Monster Fusion AGP
5554 1092 4803 Monster Fusion AGP
5555 1092 8030 Monster Fusion
5556 1092 8035 Monster Fusion AGP
5557 10b0 0001 Dragon 4000
5558 1102 1018 3D Blaster Banshee VE
5559 121a 0001 Voodoo Banshee AGP
5560 121a 0003 Voodoo Banshee AGP SGRAM
5561 121a 0004 Voodoo Banshee
5562 139c 0016 Raven
5563 139c 0017 Raven
5564 14af 0002 Maxi Gamer Phoenix
5565 0004 Voodoo Banshee [Velocity 100]
5566 0005 Voodoo 3
5567 121a 0004 Voodoo3 AGP
5568 121a 0030 Voodoo3 AGP
5569 121a 0031 Voodoo3 AGP
5570 121a 0034 Voodoo3 AGP
5571 121a 0036 Voodoo3 2000 PCI
5572 121a 0037 Voodoo3 AGP
5573 121a 0038 Voodoo3 AGP
5574 121a 003a Voodoo3 AGP
5575 121a 0044 Voodoo3
5576 121a 004b Velocity 100
5577 121a 004c Velocity 200
5578 121a 004d Voodoo3 AGP
5579 121a 004e Voodoo3 AGP
5580 121a 0051 Voodoo3 AGP
5581 121a 0052 Voodoo3 AGP
5582 121a 0060 Voodoo3 3500 TV (NTSC)
5583 121a 0061 Voodoo3 3500 TV (PAL)
5584 121a 0062 Voodoo3 3500 TV (SECAM)
5585 0009 Voodoo 4 / Voodoo 5
5586 121a 0003 Voodoo5 PCI 5500
5587 121a 0009 Voodoo5 AGP 5500/6000
5588 0057 Voodoo 3/3000 [Avenger]
5589121b Advanced Telecommunications Modules
5590121c Nippon Texaco., Ltd
5591121d Lippert Automationstechnik GmbH
5592121e CSPI
5593121f Arcus Technology, Inc.
55941220 Ariel Corporation
5595 1220 AMCC 5933 TMS320C80 DSP/Imaging board
55961221 Contec Co., Ltd
55971222 Ancor Communications, Inc.
55981223 Artesyn Communication Products
5599 0003 PM/Link
5600 0004 PM/T1
5601 0005 PM/E1
5602 0008 PM/SLS
5603 0009 BajaSpan Resource Target
5604 000a BajaSpan Section 0
5605 000b BajaSpan Section 1
5606 000c BajaSpan Section 2
5607 000d BajaSpan Section 3
5608 000e PM/PPC
56091224 Interactive Images
56101225 Power I/O, Inc.
56111227 Tech-Source
5612 0006 Raptor GFX 8P
56131228 Norsk Elektro Optikk A/S
56141229 Data Kinesis Inc.
5615122a Integrated Telecom
5616122b LG Industrial Systems Co., Ltd
5617122c Sican GmbH
5618122d Aztech System Ltd
5619 1206 368DSP
5620 1400 Trident PCI288-Q3DII (NX)
5621 50dc 3328 Audio
5622 122d 0001 3328 Audio
5623 80da 3328 Audio
5624 122d 0001 3328 Audio
5625122e Xyratex
5626122f Andrew Corporation
56271230 Fishcamp Engineering
56281231 Woodward McCoach, Inc.
56291232 GPT Limited
56301233 Bus-Tech, Inc.
56311234 Technical Corp.
56321235 Risq Modular Systems, Inc.
56331236 Sigma Designs Corporation
5634 0000 RealMagic64/GX
5635 6401 REALmagic 64/GX (SD 6425)
56361237 Alta Technology Corporation
56371238 Adtran
56381239 3DO Company
5639123a Visicom Laboratories, Inc.
5640123b Seeq Technology, Inc.
5641123c Century Systems, Inc.
5642123d Engineering Design Team, Inc.
5643 0000 EasyConnect 8/32
5644 0002 EasyConnect 8/64
5645 0003 EasyIO
5646123e Simutech, Inc.
5647123f C-Cube Microsystems
5648 00e4 MPEG
5649 8120 E4?
5650 11bd 0006 DV500 E4
5651 11bd 000a DV500 E4
5652 11bd 000f DV500 E4
5653 8888 Cinemaster C 3.0 DVD Decoder
5654 1002 0001 Cinemaster C 3.0 DVD Decoder
5655 1002 0002 Cinemaster C 3.0 DVD Decoder
5656 1328 0001 Cinemaster C 3.0 DVD Decoder
56571240 Marathon Technologies Corp.
56581241 DSC Communications
5659# Formerly Jaycor Networks, Inc.
56601242 JNI Corporation
5661 1560 JNIC-1560 PCI-X Fibre Channel Controller
5662 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
5663 1242 656a FCX-6562 PCI-X Fibre Channel Adapter
5664 4643 FCI-1063 Fibre Channel Adapter
5665 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
5666 656a FCX-6562 PCI-X Fibre Channel Adapter
56671243 Delphax
56681244 AVM Audiovisuelles MKTG & Computer System GmbH
5669 0700 B1 ISDN
5670 0800 C4 ISDN
5671 0a00 A1 ISDN [Fritz]
5672 1244 0a00 FRITZ!Card ISDN Controller
5673 0e00 Fritz!PCI v2.0 ISDN
5674 1100 C2 ISDN
5675 1200 T1 ISDN
5676 2700 Fritz!Card DSL SL
5677 2900 Fritz!Card DSL v2.0
56781245 A.P.D., S.A.
56791246 Dipix Technologies, Inc.
56801247 Xylon Research, Inc.
56811248 Central Data Corporation
56821249 Samsung Electronics Co., Ltd.
5683124a AEG Electrocom GmbH
5684124b SBS/Greenspring Modular I/O
5685 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier
5686 124b 9080 PCI9080 Bridge
5687124c Solitron Technologies, Inc.
5688124d Stallion Technologies, Inc.
5689 0000 EasyConnection 8/32
5690 0002 EasyConnection 8/64
5691 0003 EasyIO
5692 0004 EasyConnection/RA
5693124e Cylink
5694124f Infortrend Technology, Inc.
5695 0041 IFT-2000 Series RAID Controller
56961250 Hitachi Microcomputer System Ltd
56971251 VLSI Solutions Oy
56981253 Guzik Technical Enterprises
56991254 Linear Systems Ltd.
57001255 Optibase Ltd
5701 1110 MPEG Forge
5702 1210 MPEG Fusion
5703 2110 VideoPlex
5704 2120 VideoPlex CC
5705 2130 VideoQuest
57061256 Perceptive Solutions, Inc.
5707 4201 PCI-2220I
5708 4401 PCI-2240I
5709 5201 PCI-2000
57101257 Vertex Networks, Inc.
57111258 Gilbarco, Inc.
57121259 Allied Telesyn International
5713 2560 AT-2560 Fast Ethernet Adapter (i82557B)
5714 a117 RTL81xx Fast Ethernet
5715 a120 21x4x DEC-Tulip compatible 10/100 Ethernet
5716125a ABB Power Systems
5717125b Asix Electronics Corporation
5718 1400 ALFA GFC2204 Fast Ethernet
5719125c Aurora Technologies, Inc.
5720 0101 Saturn 4520P
5721 0640 Aries 16000P
5722125d ESS Technology
5723 0000 ES336H Fax Modem (Early Model)
5724 1948 Solo?
5725 1968 ES1968 Maestro 2
5726 1028 0085 ES1968 Maestro-2 PCI
5727 1033 8051 ES1968 Maestro-2 Audiodrive
5728 1969 ES1969 Solo-1 Audiodrive
5729 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard
5730 125d 8888 Solo-1 Audio Adapter
5731 153b 111b Terratec 128i PCI
5732 1978 ES1978 Maestro 2E
5733 0e11 b112 Armada M700/E500
5734 1033 803c ES1978 Maestro-2E Audiodrive
5735 1033 8058 ES1978 Maestro-2E Audiodrive
5736 1092 4000 Monster Sound MX400
5737 1179 0001 ES1978 Maestro-2E Audiodrive
5738 1988 ES1988 Allegro-1
5739 1092 4100 Sonic Impact S100
5740 125d 1988 ESS Allegro-1 Audiodrive
5741 1989 ESS Modem
5742 125d 1989 ESS Modem
5743 1998 ES1983S Maestro-3i PCI Audio Accelerator
5744 1028 00b1 Latitude C600
5745 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100)
5746 1999 ES1983S Maestro-3i PCI Modem Accelerator
5747 199a ES1983S Maestro-3i PCI Audio Accelerator
5748 199b ES1983S Maestro-3i PCI Modem Accelerator
5749 2808 ES336H Fax Modem (Later Model)
5750 2838 ES2838/2839 SuperLink Modem
5751 2898 ES2898 Modem
5752 125d 0424 ES56-PI Data Fax Modem
5753 125d 0425 ES56T-PI Data Fax Modem
5754 125d 0426 ES56V-PI Data Fax Modem
5755 125d 0427 VW-PI Data Fax Modem
5756 125d 0428 ES56ST-PI Data Fax Modem
5757 125d 0429 ES56SV-PI Data Fax Modem
5758 147a c001 ES56-PI Data Fax Modem
5759 14fe 0428 ES56-PI Data Fax Modem
5760 14fe 0429 ES56-PI Data Fax Modem
5761125e Specialvideo Engineering SRL
5762125f Concurrent Technologies, Inc.
57631260 Intersil Corporation
5764 3872 Prism 2.5 Wavelan chipset
5765 1468 0202 LAN-Express IEEE 802.11b Wireless LAN
5766 3873 Prism 2.5 Wavelan chipset
5767 1186 3501 DWL-520 Wireless PCI Adapter
5768 1186 3700 DWL-520 Wireless PCI Adapter, Rev E1
5769 1385 4105 MA311 802.11b wireless adapter
5770 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter
5771 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter
5772 1737 3874 WMP11 Wireless 802.11b PCI Adapter
5773 8086 2513 Wireless 802.11b MiniPCI Adapter
5774 3886 ISL3886 [Prism Javelin/Prism Xbow]
5775 17cf 0037 Z-Com XG-901 and clones Wireless Adapter
5776 3890 Intersil ISL3890 [Prism GT/Prism Duette]
5777 10b8 2802 SMC2802W Wireless PCI Adapter
5778 10b8 2835 SMC2835W Wireless Cardbus Adapter
5779 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter
5780 1113 ee03 SMC2802W V2 Wireless PCI Adapter
5781 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter
5782 1186 3202 DWL-G650 A1 Wireless Adapter
5783 1259 c104 CG-WLCB54GT Wireless Adapter
5784 1385 4800 WG511 Wireless Adapter
5785 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter
5786 17cf 0014 Z-Com XG-600 and clones Wireless Adapter
5787 17cf 0020 Z-Com XG-900 and clones Wireless Adapter
5788 8130 HMP8130 NTSC/PAL Video Decoder
5789 8131 HMP8131 NTSC/PAL Video Decoder
57901261 Matsushita-Kotobuki Electronics Industries, Ltd.
57911262 ES Computer Company, Ltd.
57921263 Sonic Solutions
57931264 Aval Nagasaki Corporation
57941265 Casio Computer Co., Ltd.
57951266 Microdyne Corporation
5796 0001 NE10/100 Adapter (i82557B)
5797 1910 NE2000Plus (RT8029) Ethernet Adapter
5798 1266 1910 NE2000Plus Ethernet Adapter
57991267 S. A. Telecommunications
5800 5352 PCR2101
5801 5a4b Telsat Turbo
58021268 Tektronix
58031269 Thomson-CSF/TTM
5804126a Lexmark International, Inc.
5805126b Adax, Inc.
5806126c Northern Telecom
5807 1211 10/100BaseTX [RTL81xx]
5808 126c 802.11b Wireless Ethernet Adapter
5809126d Splash Technology, Inc.
5810126e Sumitomo Metal Industries, Ltd.
5811126f Silicon Motion, Inc.
5812 0501 SM501 VoyagerGX
5813 0710 SM710 LynxEM
5814 0712 SM712 LynxEM+
5815 0720 SM720 Lynx3DM
5816 0730 SM731 Cougar3DR
5817 0810 SM810 LynxE
5818 0811 SM811 LynxE
5819 0820 SM820 Lynx3D
5820 0910 SM910
58211270 Olympus Optical Co., Ltd.
58221271 GW Instruments
58231272 Telematics International
58241273 Hughes Network Systems
5825 0002 DirecPC
58261274 Ensoniq
5827 1171 ES1373 [AudioPCI] (also Creative Labs CT5803)
5828 1371 ES1371 [AudioPCI-97]
5829 0e11 0024 AudioPCI on Motherboard Compaq Deskpro
5830 0e11 b1a7 ES1371, ES1373 AudioPCI
5831 1033 80ac ES1371, ES1373 AudioPCI
5832 1042 1854 Tazer
5833 107b 8054 Tabor2
5834 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128
5835 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A
5836 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10
5837 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A
5838 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A
5839 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A
5840 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A
5841 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00
5842 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A
5843 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00
5844 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00
5845 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00
5846 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191
5847 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193
5848 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A
5849 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A
5850 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639
5851 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800
5852 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801
5853 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739
5854 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11
5855 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31
5856 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11
5857 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13
5858 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E
5859 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810
5860 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E
5861 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S
5862 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S
5863 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR
5864 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX
5865 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV
5866 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2
5867 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV
5868 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2
5869 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX
5870 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX
5871 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX
5872 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman
5873 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod
5874 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island
5875 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX
5876 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal
5877 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX
5878 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX
5879 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver
5880 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver
5881 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX
5882 5000 ES1370 [AudioPCI]
5883 5880 5880 AudioPCI
5884 1274 2000 Creative Sound Blaster AudioPCI128
5885 1274 2003 Creative SoundBlaster AudioPCI 128
5886 1274 5880 Creative Sound Blaster AudioPCI128
5887 1274 8001 Sound Blaster 16PCI 4.1ch
5888 1458 a000 5880 AudioPCI On Motherboard 6OXET
5889 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00
5890 270f 2001 5880 AudioPCI On Motherboard 6CTR
5891 270f 2200 5880 AudioPCI On Motherboard 6WTX
5892 270f 7040 5880 AudioPCI On Motherboard 6ATA4
58931275 Network Appliance Corporation
58941276 Switched Network Technologies, Inc.
58951277 Comstream
58961278 Transtech Parallel Systems Ltd.
5897 0701 TPE3/TM3 PowerPC Node
5898 0710 TPE5 PowerPC PCI board
58991279 Transmeta Corporation
5900 0295 Northbridge
5901 0395 LongRun Northbridge
5902 0396 SDRAM controller
5903 0397 BIOS scratchpad
5904127a Rockwell International
5905 1002 HCF 56k Data/Fax Modem
5906 1092 094c SupraExpress 56i PRO [Diamond SUP2380]
5907 122d 4002 HPG / MDP3858-U
5908 122d 4005 MDP3858-E
5909 122d 4007 MDP3858-A/-NZ
5910 122d 4012 MDP3858-SA
5911 122d 4017 MDP3858-W
5912 122d 4018 MDP3858-W
5913 127a 1002 Rockwell 56K D/F HCF Modem
5914 1003 HCF 56k Data/Fax Modem
5915 0e11 b0bc 229-DF Zephyr
5916 0e11 b114 229-DF Cheetah
5917 1033 802b 229-DF
5918 13df 1003 PCI56RX Modem
5919 13e0 0117 IBM
5920 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem
5921 13e0 0197 IBM
5922 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem
5923 13e0 01f7 IBM
5924 1436 1003 IBM
5925 1436 1103 IBM 5614PM3G V.90 Modem
5926 1436 1602 Compaq 229-DF Ducati
5927 1004 HCF 56k Data/Fax/Voice Modem
5928 1048 1500 MicroLink 56k Modem
5929 10cf 1059 Fujitsu 229-DFRT
5930 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
5931 1005 127a AOpen FM56-P
5932 1033 8029 229-DFSV
5933 1033 8054 Modem
5934 10cf 103c Fujitsu
5935 10cf 1055 Fujitsu 229-DFSV
5936 10cf 1056 Fujitsu 229-DFSV
5937 122d 4003 MDP3858SP-U
5938 122d 4006 Packard Bell MDP3858V-E
5939 122d 4008 MDP3858SP-A/SP-NZ
5940 122d 4009 MDP3858SP-E
5941 122d 4010 MDP3858V-U
5942 122d 4011 MDP3858SP-SA
5943 122d 4013 MDP3858V-A/V-NZ
5944 122d 4015 MDP3858SP-W
5945 122d 4016 MDP3858V-W
5946 122d 4019 MDP3858V-SA
5947 13df 1005 PCI56RVP Modem
5948 13e0 0187 IBM
5949 13e0 01a7 IBM
5950 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem
5951 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem
5952 1436 1005 IBM
5953 1436 1105 IBM
5954 1437 1105 IBM 5614PS3G V.90 Modem
5955 1022 HCF 56k Modem
5956 1436 1303 M3-5614PM3G V.90 Modem
5957 1023 HCF 56k Data/Fax Modem
5958 122d 4020 Packard Bell MDP3858-WE
5959 122d 4023 MDP3858-UE
5960 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem
5961 13e0 0297 IBM
5962 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem
5963 1436 1203 IBM
5964 1436 1303 IBM
5965 1024 HCF 56k Data/Fax/Voice Modem
5966 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
5967 10cf 106a Fujitsu 235-DFSV
5968 122d 4021 Packard Bell MDP3858V-WE
5969 122d 4022 MDP3858SP-WE
5970 122d 4024 MDP3858V-UE
5971 122d 4025 MDP3858SP-UE
5972 1026 HCF 56k PCI Speakerphone Modem
5973 1032 HCF 56k Modem
5974 1033 HCF 56k Modem
5975 1034 HCF 56k Modem
5976 1035 HCF 56k PCI Speakerphone Modem
5977 1036 HCF 56k Modem
5978 1085 HCF 56k Volcano PCI Modem
5979 2005 HCF 56k Data/Fax Modem
5980 104d 8044 229-DFSV
5981 104d 8045 229-DFSV
5982 104d 8055 PBE/Aztech 235W-DFSV
5983 104d 8056 235-DFSV
5984 104d 805a Modem
5985 104d 805f Modem
5986 104d 8074 Modem
5987 2013 HSF 56k Data/Fax Modem
5988 1179 0001 Modem
5989 1179 ff00 Modem
5990 2014 HSF 56k Data/Fax/Voice Modem
5991 10cf 1057 Fujitsu Citicorp III
5992 122d 4050 MSP3880-U
5993 122d 4055 MSP3880-W
5994 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
5995 10cf 1063 Fujitsu
5996 10cf 1064 Fujitsu
5997 1468 2015 Fujitsu
5998 2016 HSF 56k Data/Fax/Voice/Spkp Modem
5999 122d 4051 MSP3880V-W
6000 122d 4052 MSP3880SP-W
6001 122d 4054 MSP3880V-U
6002 122d 4056 MSP3880SP-U
6003 122d 4057 MSP3880SP-A
6004 4311 Riptide HSF 56k PCI Modem
6005 127a 4311 Ring Modular? Riptide HSF RT HP Dom
6006 13e0 0210 HP-GVC
6007 4320 Riptide PCI Audio Controller
6008 1235 4320 Riptide PCI Audio Controller
6009 4321 Riptide HCF 56k PCI Modem
6010 1235 4321 Hewlett Packard DF
6011 1235 4324 Hewlett Packard DF
6012 13e0 0210 Hewlett Packard DF
6013 144d 2321 Riptide
6014 4322 Riptide PCI Game Controller
6015 1235 4322 Riptide PCI Game Controller
6016 8234 RapidFire 616X ATM155 Adapter
6017 108d 0022 RapidFire 616X ATM155 Adapter
6018 108d 0027 RapidFire 616X ATM155 Adapter
6019127b Pixera Corporation
6020127c Crosspoint Solutions, Inc.
6021127d Vela Research
6022127e Winnov, L.P.
6023127f Fujifilm
60241280 Photoscript Group Ltd.
60251281 Yokogawa Electric Corporation
60261282 Davicom Semiconductor, Inc.
6027 9009 Ethernet 100/10 MBit
6028 9100 21x4x DEC-Tulip compatible 10/100 Ethernet
6029 9102 21x4x DEC-Tulip compatible 10/100 Ethernet
6030 9132 Ethernet 100/10 MBit
60311283 Integrated Technology Express, Inc.
6032 673a IT8330G
6033 8212 IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212)
6034 1283 0001 IT/ITE8212 Dual channel ATA RAID controller
6035 8330 IT8330G
6036 8872 IT8874F PCI Dual Serial Port Controller
6037 8888 IT8888F PCI to ISA Bridge with SMB
6038 8889 IT8889F PCI to ISA Bridge
6039 e886 IT8330G
60401284 Sahara Networks, Inc.
60411285 Platform Technologies, Inc.
6042 0100 AGOGO sound chip (aka ESS Maestro 1)
60431286 Mazet GmbH
60441287 M-Pact, Inc.
6045 001e LS220D DVD Decoder
6046 001f LS220C DVD Decoder
60471288 Timestep Corporation
60481289 AVC Technology, Inc.
6049128a Asante Technologies, Inc.
6050128b Transwitch Corporation
6051128c Retix Corporation
6052128d G2 Networks, Inc.
6053 0021 ATM155 Adapter
6054128e Hoontech Corporation/Samho Multi Tech Ltd.
6055 0008 ST128 WSS/SB
6056 0009 ST128 SAM9407
6057 000a ST128 Game Port
6058 000b ST128 MPU Port
6059 000c ST128 Ctrl Port
6060128f Tateno Dennou, Inc.
60611290 Sord Computer Corporation
60621291 NCS Computer Italia
60631292 Tritech Microelectronics Inc
60641293 Media Reality Technology
60651294 Rhetorex, Inc.
60661295 Imagenation Corporation
60671296 Kofax Image Products
60681297 Holco Enterprise Co, Ltd/Shuttle Computer
60691298 Spellcaster Telecommunications Inc.
60701299 Knowledge Technology Lab.
6071129a VMetro, inc.
6072 0615 PBT-615 PCI-X Bus Analyzer
6073129b Image Access
6074129c Jaycor
6075129d Compcore Multimedia, Inc.
6076129e Victor Company of Japan, Ltd.
6077129f OEC Medical Systems, Inc.
607812a0 Allen-Bradley Company
607912a1 Simpact Associates, Inc.
608012a2 Newgen Systems Corporation
608112a3 Lucent Technologies
6082 8105 T8105 H100 Digital Switch
608312a4 NTT Electronics Technology Company
608412a5 Vision Dynamics Ltd.
608512a6 Scalable Networks, Inc.
608612a7 AMO GmbH
608712a8 News Datacom
608812a9 Xiotech Corporation
608912aa SDL Communications, Inc.
609012ab Yuan Yuan Enterprise Co., Ltd.
6091 0002 AU8830 [Vortex2] Based Sound Card With A3D Support
6092 3000 MPG-200C PCI DVD Decoder Card
609312ac Measurex Corporation
609412ad Multidata GmbH
609512ae Alteon Networks Inc.
6096 0001 AceNIC Gigabit Ethernet
6097 1014 0104 Gigabit Ethernet-SX PCI Adapter
6098 12ae 0001 Gigabit Ethernet-SX (Universal)
6099 1410 0104 Gigabit Ethernet-SX PCI Adapter
6100 0002 AceNIC Gigabit Ethernet (Copper)
6101 10a9 8002 Acenic Gigabit Ethernet
6102 12ae 0002 Gigabit Ethernet-T (3C986-T)
6103 00fa Farallon PN9100-T Gigabit Ethernet
610412af TDK USA Corp
610512b0 Jorge Scientific Corp
610612b1 GammaLink
610712b2 General Signal Networks
610812b3 Inter-Face Co Ltd
610912b4 FutureTel Inc
611012b5 Granite Systems Inc.
611112b6 Natural Microsystems
611212b7 Cognex Modular Vision Systems Div. - Acumen Inc.
611312b8 Korg
611412b9 3Com Corp, Modem Division (formerly US Robotics)
6115 1006 WinModem
6116 12b9 005c USR 56k Internal Voice WinModem (Model 3472)
6117 12b9 005e USR 56k Internal WinModem (Models 662975)
6118 12b9 0062 USR 56k Internal Voice WinModem (Model 662978)
6119 12b9 0068 USR 56k Internal Voice WinModem (Model 5690)
6120 12b9 007a USR 56k Internal Voice WinModem (Model 662974)
6121 12b9 007f USR 56k Internal WinModem (Models 5698, 5699)
6122 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528)
6123 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529)
6124 12b9 0091 USR 56k Internal Voice WinModem (Model 2978)
6125 1007 USR 56k Internal WinModem
6126 12b9 00a3 USR 56k Internal WinModem (Model 3595)
6127 1008 56K FaxModem Model 5610
6128 12b9 00a2 USR 56k Internal FAX Modem (Model 2977)
6129 12b9 00aa USR 56k Internal Voice Modem (Model 2976)
6130 12b9 00ab USR 56k Internal Voice Modem (Model 5609)
6131 12b9 00ac USR 56k Internal Voice Modem (Model 3298)
6132 12b9 00ad USR 56k Internal FAX Modem (Model 5610)
613312ba BittWare, Inc.
613412bb Nippon Unisoft Corporation
613512bc Array Microsystems
613612bd Computerm Corp.
613712be Anchor Chips Inc.
6138 3041 AN3041Q CO-MEM
6139 3042 AN3042Q CO-MEM Lite
6140 12be 3042 Anchor Chips Lite Evaluation Board
614112bf Fujifilm Microdevices
614212c0 Infimed
614312c1 GMM Research Corp
614412c2 Mentec Limited
614512c3 Holtek Microelectronics Inc
6146 0058 PCI NE2K Ethernet
6147 5598 PCI NE2K Ethernet
614812c4 Connect Tech Inc
6149 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11)
6150 0002 Blue HEAT/PCI 4 (RS232)
6151 0003 Blue HEAT/PCI 2 (RS232)
6152 0004 Blue HEAT/PCI 8 (UNIV, RS485)
6153 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485)
6154 0006 Blue HEAT/PCI 4 (OPTO, RS485)
6155 0007 Blue HEAT/PCI 2+2 (RS232/485)
6156 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485)
6157 0009 Blue HEAT/PCI 2+6 (RS232/485)
6158 000a Blue HEAT/PCI 8 (Tx, RS485)
6159 000b Blue HEAT/PCI 4 (Tx, RS485)
6160 000c Blue HEAT/PCI 2 (20 MHz, RS485)
6161 000d Blue HEAT/PCI 2 PTM
6162 0100 NT960/PCI
6163 0201 cPCI Titan - 2 Port
6164 0202 cPCI Titan - 4 Port
6165 0300 CTI PCI UART 2 (RS232)
6166 0301 CTI PCI UART 4 (RS232)
6167 0302 CTI PCI UART 8 (RS232)
6168 0310 CTI PCI UART 1+1 (RS232/485)
6169 0311 CTI PCI UART 2+2 (RS232/485)
6170 0312 CTI PCI UART 4+4 (RS232/485)
6171 0320 CTI PCI UART 2
6172 0321 CTI PCI UART 4
6173 0322 CTI PCI UART 8
6174 0330 CTI PCI UART 2 (RS485)
6175 0331 CTI PCI UART 4 (RS485)
6176 0332 CTI PCI UART 8 (RS485)
617712c5 Picture Elements Incorporated
6178 007e Imaging/Scanning Subsystem Engine
6179 007f Imaging/Scanning Subsystem Engine
6180 0081 PCIVST [Grayscale Thresholding Engine]
6181 0085 Video Simulator/Sender
6182 0086 THR2 Multi-scale Thresholder
618312c6 Mitani Corporation
618412c7 Dialogic Corp
618512c8 G Force Co, Ltd
618612c9 Gigi Operations
618712ca Integrated Computing Engines
618812cb Antex Electronics Corporation
618912cc Pluto Technologies International
619012cd Aims Lab
619112ce Netspeed Inc.
619212cf Prophet Systems, Inc.
619312d0 GDE Systems, Inc.
619412d1 PSITech
619512d2 NVidia / SGS Thomson (Joint Venture)
6196 0008 NV1
6197 0009 DAC64
6198 0018 Riva128
6199 1048 0c10 VICTORY Erazor
6200 107b 8030 STB Velocity 128
6201 1092 0350 Viper V330
6202 1092 1092 Viper V330
6203 10b4 1b1b STB Velocity 128
6204 10b4 1b1d STB Velocity 128
6205 10b4 1b1e STB Velocity 128, PAL TV-Out
6206 10b4 1b20 STB Velocity 128 Sapphire
6207 10b4 1b21 STB Velocity 128
6208 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out
6209 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out
6210 10b4 1b27 STB Velocity 128 DVD
6211 10b4 1b88 MVP Pro 128
6212 10b4 222a STB Velocity 128 AGP
6213 10b4 2230 STB Velocity 128
6214 10b4 2232 STB Velocity 128
6215 10b4 2235 STB Velocity 128 AGP
6216 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000
6217 0019 Riva128ZX
6218 0020 TNT
6219 0028 TNT2
6220 0029 UTNT2
6221 002c VTNT2
6222 00a0 ITNT2
622312d3 Vingmed Sound A/S
622412d4 Ulticom (Formerly DGM&S)
6225 0200 T1 Card
622612d5 Equator Technologies Inc
6227 0003 BSP16
6228 1000 BSP15
622912d6 Analogic Corp
623012d7 Biotronic SRL
623112d8 Pericom Semiconductor
623212d9 Aculab PLC
6233 0002 PCI Prosody
6234 0004 cPCI Prosody
6235 0005 Aculab E1/T1 PCI card
623612da True Time Inc.
623712db Annapolis Micro Systems, Inc
623812dc Symicron Computer Communication Ltd.
623912dd Management Graphics
624012de Rainbow Technologies
6241 0200 CryptoSwift CS200
624212df SBS Technologies Inc
624312e0 Chase Research
6244 0010 ST16C654 Quad UART
6245 0020 ST16C654 Quad UART
6246 0030 ST16C654 Quad UART
624712e1 Nintendo Co, Ltd
624812e2 Datum Inc. Bancomm-Timing Division
624912e3 Imation Corp - Medical Imaging Systems
625012e4 Brooktrout Technology Inc
625112e5 Apex Semiconductor Inc
625212e6 Cirel Systems
625312e7 Sunsgroup Corporation
625412e8 Crisc Corp
625512e9 GE Spacenet
625612ea Zuken
625712eb Aureal Semiconductor
6258 0001 Vortex 1
6259 104d 8036 AU8820 Vortex Digital Audio Processor
6260 1092 2000 Sonic Impact A3D
6261 1092 2100 Sonic Impact A3D
6262 1092 2110 Sonic Impact A3D
6263 1092 2200 Sonic Impact A3D
6264 122d 1002 AU8820 Vortex Digital Audio Processor
6265 12eb 0001 AU8820 Vortex Digital Audio Processor
6266 5053 3355 Montego
6267 0002 Vortex 2
6268 104d 8049 AU8830 Vortex 3D Digital Audio Processor
6269 104d 807b AU8830 Vortex 3D Digital Audio Processor
6270 1092 3000 Monster Sound II
6271 1092 3001 Monster Sound II
6272 1092 3002 Monster Sound II
6273 1092 3003 Monster Sound II
6274 1092 3004 Monster Sound II
6275 12eb 0001 AU8830 Vortex 3D Digital Audio Processor
6276 12eb 0002 AU8830 Vortex 3D Digital Audio Processor
6277 12eb 0088 AU8830 Vortex 3D Digital Audio Processor
6278 144d 3510 AU8830 Vortex 3D Digital Audio Processor
6279 5053 3356 Montego II
6280 0003 AU8810 Vortex Digital Audio Processor
6281 104d 8049 AU8810 Vortex Digital Audio Processor
6282 104d 8077 AU8810 Vortex Digital Audio Processor
6283 109f 1000 AU8810 Vortex Digital Audio Processor
6284 12eb 0003 AU8810 Vortex Digital Audio Processor
6285 1462 6780 AU8810 Vortex Digital Audio Processor
6286 14a4 2073 AU8810 Vortex Digital Audio Processor
6287 14a4 2091 AU8810 Vortex Digital Audio Processor
6288 14a4 2104 AU8810 Vortex Digital Audio Processor
6289 14a4 2106 AU8810 Vortex Digital Audio Processor
6290 8803 Vortex 56k Software Modem
6291 12eb 8803 Vortex 56k Software Modem
629212ec 3A International, Inc.
629312ed Optivision Inc.
629412ee Orange Micro
629512ef Vienna Systems
629612f0 Pentek
629712f1 Sorenson Vision Inc
629812f2 Gammagraphx, Inc.
629912f3 Radstone Technology
630012f4 Megatel
630112f5 Forks
630212f6 Dawson France
630312f7 Cognex
630412f8 Electronic Design GmbH
6305 0002 VideoMaker
630612f9 Four Fold Ltd
630712fb Spectrum Signal Processing
630812fc Capital Equipment Corp
630912fd I2S
631012fe ESD Electronic System Design GmbH
631112ff Lexicon
63121300 Harman International Industries Inc
63131302 Computer Sciences Corp
63141303 Innovative Integration
63151304 Juniper Networks
63161305 Netphone, Inc
63171306 Duet Technologies
6318# Formerly ComputerBoards
63191307 Measurement Computing
6320 0001 PCI-DAS1602/16
6321 000b PCI-DIO48H
6322 000c PCI-PDISO8
6323 000d PCI-PDISO16
6324 000f PCI-DAS1200
6325 0010 PCI-DAS1602/12
6326 0014 PCI-DIO24H
6327 0015 PCI-DIO24H/CTR3
6328 0016 PCI-DIO48H/CTR15
6329 0017 PCI-DIO96H
6330 0018 PCI-CTR05
6331 0019 PCI-DAS1200/JR
6332 001a PCI-DAS1001
6333 001b PCI-DAS1002
6334 001c PCI-DAS1602JR/16
6335 001d PCI-DAS6402/16
6336 001e PCI-DAS6402/12
6337 001f PCI-DAS16/M1
6338 0020 PCI-DDA02/12
6339 0021 PCI-DDA04/12
6340 0022 PCI-DDA08/12
6341 0023 PCI-DDA02/16
6342 0024 PCI-DDA04/16
6343 0025 PCI-DDA08/16
6344 0026 PCI-DAC04/12-HS
6345 0027 PCI-DAC04/16-HS
6346 0028 PCI-DIO24
6347 0029 PCI-DAS08
6348 002c PCI-INT32
6349 0033 PCI-DUAL-AC5
6350 0034 PCI-DAS-TC
6351 0035 PCI-DAS64/M1/16
6352 0036 PCI-DAS64/M2/16
6353 0037 PCI-DAS64/M3/16
6354 004c PCI-DAS1000
6355 004d PCI-QUAD04
6356 0052 PCI-DAS4020/12
6357 005e PCI-DAS6025
63581308 Jato Technologies Inc.
6359 0001 NetCelerator Adapter
6360 1308 0001 NetCelerator Adapter
63611309 AB Semiconductor Ltd
6362130a Mitsubishi Electric Microcomputer
6363130b Colorgraphic Communications Corp
6364130c Ambex Technologies, Inc
6365130d Accelerix Inc
6366130e Yamatake-Honeywell Co. Ltd
6367130f Advanet Inc
63681310 Gespac
63691311 Videoserver, Inc
63701312 Acuity Imaging, Inc
63711313 Yaskawa Electric Co.
63721316 Teradyne Inc
63731317 Linksys
6374 0981 21x4x DEC-Tulip compatible 10/100 Ethernet
6375 0985 NC100 Network Everywhere Fast Ethernet 10/100
6376 1985 21x4x DEC-Tulip compatible 10/100 Ethernet
6377 2850 HSP MicroModem 56
6378 8201 ADMtek ADM8211 802.11b Wireless Interface
6379 10b8 2635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card
6380 1317 8201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card
6381 8211 ADMtek ADM8211 802.11b Wireless Interface
6382 9511 21x4x DEC-Tulip compatible 10/100 Ethernet
63831318 Packet Engines Inc.
6384 0911 GNIC-II PCI Gigabit Ethernet [Hamachi]
63851319 Fortemedia, Inc
6386 0801 Xwave QS3000A [FM801]
6387 0802 Xwave QS3000A [FM801 game port]
6388 1000 FM801 PCI Audio
6389 1001 FM801 PCI Joystick
6390131a Finisar Corp.
6391131c Nippon Electro-Sensory Devices Corp
6392131d Sysmic, Inc.
6393131e Xinex Networks Inc
6394131f Siig Inc
6395 1000 CyberSerial (1-port) 16550
6396 1001 CyberSerial (1-port) 16650
6397 1002 CyberSerial (1-port) 16850
6398 1010 Duet 1S(16550)+1P
6399 1011 Duet 1S(16650)+1P
6400 1012 Duet 1S(16850)+1P
6401 1020 CyberParallel (1-port)
6402 1021 CyberParallel (2-port)
6403 1030 CyberSerial (2-port) 16550
6404 1031 CyberSerial (2-port) 16650
6405 1032 CyberSerial (2-port) 16850
6406 1034 Trio 2S(16550)+1P
6407 1035 Trio 2S(16650)+1P
6408 1036 Trio 2S(16850)+1P
6409 1050 CyberSerial (4-port) 16550
6410 1051 CyberSerial (4-port) 16650
6411 1052 CyberSerial (4-port) 16850
6412 2000 CyberSerial (1-port) 16550
6413 2001 CyberSerial (1-port) 16650
6414 2002 CyberSerial (1-port) 16850
6415 2010 Duet 1S(16550)+1P
6416 2011 Duet 1S(16650)+1P
6417 2012 Duet 1S(16850)+1P
6418 2020 CyberParallel (1-port)
6419 2021 CyberParallel (2-port)
6420 2030 CyberSerial (2-port) 16550
6421 131f 2030 PCI Serial Card
6422 2031 CyberSerial (2-port) 16650
6423 2032 CyberSerial (2-port) 16850
6424 2040 Trio 1S(16550)+2P
6425 2041 Trio 1S(16650)+2P
6426 2042 Trio 1S(16850)+2P
6427 2050 CyberSerial (4-port) 16550
6428 2051 CyberSerial (4-port) 16650
6429 2052 CyberSerial (4-port) 16850
6430 2060 Trio 2S(16550)+1P
6431 2061 Trio 2S(16650)+1P
6432 2062 Trio 2S(16850)+1P
6433 2081 CyberSerial (8-port) ST16654
64341320 Crypto AG
64351321 Arcobel Graphics BV
64361322 MTT Co., Ltd
64371323 Dome Inc
64381324 Sphere Communications
64391325 Salix Technologies, Inc
64401326 Seachange international
64411327 Voss scientific
64421328 quadrant international
64431329 Productivity Enhancement
6444132a Microcom Inc.
6445132b Broadband Technologies
6446132c Micrel Inc
6447132d Integrated Silicon Solution, Inc.
64481330 MMC Networks
64491331 Radisys Corp.
6450 0030 ENP-2611
6451 8200 82600 Host Bridge
6452 8201 82600 IDE
6453 8202 82600 USB
6454 8210 82600 PCI Bridge
64551332 Micro Memory
6456 5415 MM-5415CN PCI Memory Module with Battery Backup
6457 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup
64581334 Redcreek Communications, Inc
64591335 Videomail, Inc
64601337 Third Planet Publishing
64611338 BT Electronics
6462133a Vtel Corp
6463133b Softcom Microsystems
6464133c Holontech Corp
6465133d SS Technologies
6466133e Virtual Computer Corp
6467133f SCM Microsystems
64681340 Atalla Corp
64691341 Kyoto Microcomputer Co
64701342 Promax Systems Inc
64711343 Phylon Communications Inc
64721344 Crucial Technology
64731345 Arescom Inc
64741347 Odetics
64751349 Sumitomo Electric Industries, Ltd.
6476134a DTC Technology Corp.
6477 0001 Domex 536
6478 0002 Domex DMX3194UP SCSI Adapter
6479134b ARK Research Corp.
6480134c Chori Joho System Co. Ltd
6481134d PCTel Inc
6482 2189 HSP56 MicroModem
6483 2486 2304WT V.92 MDC Modem
6484 7890 HSP MicroModem 56
6485 134d 0001 PCT789 adapter
6486 7891 HSP MicroModem 56
6487 134d 0001 HSP MicroModem 56
6488 7892 HSP MicroModem 56
6489 7893 HSP MicroModem 56
6490 7894 HSP MicroModem 56
6491 7895 HSP MicroModem 56
6492 7896 HSP MicroModem 56
6493 7897 HSP MicroModem 56
6494134e CSTI
6495134f Algo System Co Ltd
64961350 Systec Co. Ltd
64971351 Sonix Inc
64981353 Thales Idatys
6499 0002 Proserver
6500 0003 PCI-FUT
6501 0004 PCI-S0
6502 0005 PCI-FUT-S0
65031354 Dwave System Inc
65041355 Kratos Analytical Ltd
65051356 The Logical Co
65061359 Prisa Networks
6507135a Brain Boxes
6508135b Giganet Inc
6509135c Quatech Inc
6510 0010 QSC-100
6511 0020 DSC-100
6512 0030 DSC-200/300
6513 0040 QSC-200/300
6514 0050 ESC-100D
6515 0060 ESC-100M
6516 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230)
6517 0170 QSCLP-100
6518 0180 DSCLP-100
6519 0190 SSCLP-100
6520 01a0 QSCLP-200/300
6521 01b0 DSCLP-200/300
6522 01c0 SSCLP-200/300
6523135d ABB Network Partner AB
6524135e Sealevel Systems Inc
6525 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)
6526 7101 Single Port RS-232/422/485/530
6527 7201 Dual Port RS-232/422/485 Interface
6528 7202 Dual Port RS-232 Interface
6529 7401 Four Port RS-232 Interface
6530 7402 Four Port RS-422/485 Interface
6531 7801 Eight Port RS-232 Interface
6532 7804 Eight Port RS-232/422/485 Interface
6533 8001 8001 Digital I/O Adapter
6534135f I-Data International A-S
65351360 Meinberg Funkuhren
6536 0101 PCI32 DCF77 Radio Clock
6537 0102 PCI509 DCF77 Radio Clock
6538 0103 PCI510 DCF77 Radio Clock
6539 0201 GPS167PCI GPS Receiver
6540 0202 GPS168PCI GPS Receiver
6541 0203 GPS169PCI GPS Receiver
6542 0301 TCR510PCI IRIG Receiver
65431361 Soliton Systems K.K.
65441362 Fujifacom Corporation
65451363 Phoenix Technology Ltd
65461364 ATM Communications Inc
65471365 Hypercope GmbH
65481366 Teijin Seiki Co. Ltd
65491367 Hitachi Zosen Corporation
65501368 Skyware Corporation
65511369 Digigram
6552136a High Soft Tech
6553136b Kawasaki Steel Corporation
6554 ff01 KL5A72002 Motion JPEG
6555136c Adtek System Science Co Ltd
6556136d Gigalabs Inc
6557136f Applied Magic Inc
65581370 ATL Products
65591371 CNet Technology Inc
6560 434e GigaCard Network Adapter
6561 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
65621373 Silicon Vision Inc
65631374 Silicom Ltd
65641375 Argosystems Inc
65651376 LMC
65661377 Electronic Equipment Production & Distribution GmbH
65671378 Telemann Co. Ltd
65681379 Asahi Kasei Microsystems Co Ltd
6569137a Mark of the Unicorn Inc
6570 0001 PCI-324 Audiowire Interface
6571137b PPT Vision
6572137c Iwatsu Electric Co Ltd
6573137d Dynachip Corporation
6574137e Patriot Scientific Corporation
6575137f Japan Satellite Systems Inc
65761380 Sanritz Automation Co Ltd
65771381 Brains Co. Ltd
65781382 Marian - Electronic & Software
6579 0001 ARC88 audio recording card
6580 2008 Prodif 96 Pro sound system
6581 2088 Marc 8 Midi sound system
6582 20c8 Marc A sound system
6583 4008 Marc 2 sound system
6584 4010 Marc 2 Pro sound system
6585 4048 Marc 4 MIDI sound system
6586 4088 Marc 4 Digi sound system
6587 4248 Marc X sound system
65881383 Controlnet Inc
65891384 Reality Simulation Systems Inc
65901385 Netgear
6591# Note: This lists as Atheros Communications, Inc. AR5212 802.11abg NIC because of Madwifi
6592 0013 WG311T
6593 311a GA511 Gigabit Ethernet
6594 4100 802.11b Wireless Adapter (MA301)
6595 4105 MA311 802.11b wireless adapter
6596 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card
6597 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card
6598 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card
6599 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card
6600 4a00 WAG311 802.11a/g Wireless PCI Adapter
6601 4c00 WG311v2 54 Mbps Wireless PCI Adapter
6602 620a GA620 Gigabit Ethernet
6603 622a GA622
6604 630a GA630 Gigabit Ethernet
6605 f004 FA310TX
66061386 Video Domain Technologies
66071387 Systran Corp
66081388 Hitachi Information Technology Co Ltd
66091389 Applicom International
6610 0001 PCI1500PFB [Intelligent fieldbus adaptor]
6611138a Fusion Micromedia Corp
6612138b Tokimec Inc
6613138c Silicon Reality
6614138d Future Techno Designs pte Ltd
6615138e Basler GmbH
6616138f Patapsco Designs Inc
66171390 Concept Development Inc
66181391 Development Concepts Inc
66191392 Medialight Inc
66201393 Moxa Technologies Co Ltd
6621 1040 Smartio C104H/PCI
6622 1141 Industrio CP-114
6623 1680 Smartio C168H/PCI
6624 2040 Intellio CP-204J
6625 2180 Intellio C218 Turbo PCI
6626 3200 Intellio C320 Turbo PCI
66271394 Level One Communications
6628 0001 LXT1001 Gigabit Ethernet
6629 1394 0001 NetCelerator Adapter
66301395 Ambicom Inc
66311396 Cipher Systems Inc
66321397 Cologne Chip Designs GmbH
6633 2bd0 ISDN network controller [HFC-PCI]
6634 1397 2bd0 ISDN Board
6635 e4bf 1000 CI1-1-Harp
66361398 Clarion co. Ltd
66371399 Rios systems Co Ltd
6638139a Alacritech Inc
6639 0001 Quad Port 10/100 Server Accelerator
6640 0003 Single Port 10/100 Server Accelerator
6641 0005 Single Port Gigabit Server Accelerator
6642139b Mediasonic Multimedia Systems Ltd
6643139c Quantum 3d Inc
6644139d EPL limited
6645139e Media4
6646139f Aethra s.r.l.
664713a0 Crystal Group Inc
664813a1 Kawasaki Heavy Industries Ltd
664913a2 Ositech Communications Inc
665013a3 Hifn Inc.
6651 0005 7751 Security Processor
6652 0006 6500 Public Key Processor
6653 0007 7811 Security Processor
6654 0012 7951 Security Processor
6655 0014 78XX Security Processor
6656 0016 8065 Security Processor
6657 0017 8165 Security Processor
6658 0018 8154 Security Processor
6659 001d 7956 Security Processor
6660 0020 7955 Security Processor
666113a4 Rascom Inc
666213a5 Audio Digital Imaging Inc
666313a6 Videonics Inc
666413a7 Teles AG
666513a8 Exar Corp.
6666 0154 XR17C154 Quad UART
6667 0158 XR17C158 Octal UART
666813a9 Siemens Medical Systems, Ultrasound Group
666913aa Broadband Networks Inc
667013ab Arcom Control Systems Ltd
667113ac Motion Media Technology Ltd
667213ad Nexus Inc
667313ae ALD Technology Ltd
667413af T.Sqware
667513b0 Maxspeed Corp
667613b1 Tamura corporation
667713b2 Techno Chips Co. Ltd
667813b3 Lanart Corporation
667913b4 Wellbean Co Inc
668013b5 ARM
668113b6 Dlog GmbH
668213b7 Logic Devices Inc
668313b8 Nokia Telecommunications oy
668413b9 Elecom Co Ltd
668513ba Oxford Instruments
668613bb Sanyo Technosound Co Ltd
668713bc Bitran Corporation
668813bd Sharp corporation
668913be Miroku Jyoho Service Co. Ltd
669013bf Sharewave Inc
669113c0 Microgate Corporation
6692 0010 SyncLink Adapter v1
6693 0020 SyncLink SCC Adapter
6694 0030 SyncLink Multiport Adapter
6695 0210 SyncLink Adapter v2
669613c1 3ware Inc
6697 1000 3ware Inc 3ware 5xxx/6xxx-series PATA-RAID
6698 1001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID
6699 13c1 1001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID
6700 1002 3ware Inc 3ware 9xxx-series SATA-RAID
670113c2 Technotrend Systemtechnik GmbH
670213c3 Janz Computer AG
670313c4 Phase Metrics
670413c5 Alphi Technology Corp
670513c6 Condor Engineering Inc
6706 0520 CEI-520 A429 Card
6707 0620 CEI-620 A429 Card
6708 0820 CEI-820 A429 Card
670913c7 Blue Chip Technology Ltd
671013c8 Apptech Inc
671113c9 Eaton Corporation
671213ca Iomega Corporation
671313cb Yano Electric Co Ltd
671413cc Metheus Corporation
671513cd Compatible Systems Corporation
671613ce Cocom A/S
671713cf Studio Audio & Video Ltd
671813d0 Techsan Electronics Co Ltd
6719 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card
6720 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card
672113d1 Abocom Systems Inc
6722 ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter
6723 ab03 21x4x DEC-Tulip compatible 10/100 Ethernet
6724 ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter
6725 ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
672613d2 Shark Multimedia Inc
672713d3 IMC Networks
672813d4 Graphics Microsystems Inc
672913d5 Media 100 Inc
673013d6 K.I. Technology Co Ltd
673113d7 Toshiba Engineering Corporation
673213d8 Phobos corporation
673313d9 Apex PC Solutions Inc
673413da Intresource Systems pte Ltd
673513db Janich & Klass Computertechnik GmbH
673613dc Netboost Corporation
673713dd Multimedia Bundle Inc
673813de ABB Robotics Products AB
673913df E-Tech Inc
6740 0001 PCI56RVP Modem
6741 13df 0001 PCI56RVP Modem
674213e0 GVC Corporation
674313e1 Silicom Multimedia Systems Inc
674413e2 Dynamics Research Corporation
674513e3 Nest Inc
674613e4 Calculex Inc
674713e5 Telesoft Design Ltd
674813e6 Argosy research Inc
674913e7 NAC Incorporated
675013e8 Chip Express Corporation
675113e9 Intraserver Technology Inc
675213ea Dallas Semiconductor
675313eb Hauppauge Computer Works Inc
675413ec Zydacron Inc
675513ed Raytheion E-Systems
675613ee Hayes Microcomputer Products Inc
675713ef Coppercom Inc
675813f0 Sundance Technology Inc
6759 0201 ST201 Sundance Ethernet
676013f1 Oce' - Technologies B.V.
676113f2 Ford Microelectronics Inc
676213f3 Mcdata Corporation
676313f4 Troika Networks, Inc.
6764 1401 Zentai Fibre Channel Adapter
676513f5 Kansai Electric Co. Ltd
676613f6 C-Media Electronics Inc
6767 0011 CMI8738
6768 0100 CM8338A
6769 13f6 ffff CMI8338/C3DX PCI Audio Device
6770 0101 CM8338B
6771 13f6 0101 CMI8338-031 PCI Audio Device
6772 0111 CM8738
6773 1019 0970 P6STP-FL motherboard
6774 1043 8035 CUSI-FX motherboard
6775 1043 8077 CMI8738 6-channel audio controller
6776 1043 80e2 CMI8738 6ch-MX
6777 13f6 0111 CMI8738/C3DX PCI Audio Device
6778 1681 a000 Gamesurround MUSE XL
6779 0211 CM8738
678013f7 Wildfire Communications
678113f8 Ad Lib Multimedia Inc
678213f9 NTT Advanced Technology Corp.
678313fa Pentland Systems Ltd
678413fb Aydin Corp
678513fc Computer Peripherals International
678613fd Micro Science Inc
678713fe Advantech Co. Ltd
6788 1240 PCI-1240 4-channel stepper motor controller card w. Nova Electronics MCX314
6789 1600 PCI-1612 4-port RS-232/422/485 PCI Communication Card
6790 1752 PCI-1752
6791 1754 PCI-1754
6792 1756 PCI-1756
679313ff Silicon Spice Inc
67941400 Artx Inc
6795 1401 9432 TX
67961401 CR-Systems A/S
67971402 Meilhaus Electronic GmbH
67981403 Ascor Inc
67991404 Fundamental Software Inc
68001405 Excalibur Systems Inc
68011406 Oce' Printing Systems GmbH
68021407 Lava Computer mfg Inc
6803 0100 Lava Dual Serial
6804 0101 Lava Quatro A
6805 0102 Lava Quatro B
6806 0110 Lava DSerial-PCI Port A
6807 0111 Lava DSerial-PCI Port B
6808 0120 Quattro-PCI A
6809 0121 Quattro-PCI B
6810 0180 Lava Octo A
6811 0181 Lava Octo B
6812 0200 Lava Port Plus
6813 0201 Lava Quad A
6814 0202 Lava Quad B
6815 0220 Lava Quattro PCI Ports A/B
6816 0221 Lava Quattro PCI Ports C/D
6817 0500 Lava Single Serial
6818 0600 Lava Port 650
6819 8000 Lava Parallel
6820 8001 Dual parallel port controller A
6821 8002 Lava Dual Parallel port A
6822 8003 Lava Dual Parallel port B
6823 8800 BOCA Research IOPPAR
68241408 Aloka Co. Ltd
68251409 Timedia Technology Co Ltd
6826 7168 PCI2S550 (Dual 16550 UART)
6827140a DSP Research Inc
6828140b Ramix Inc
6829140c Elmic Systems Inc
6830140d Matsushita Electric Works Ltd
6831140e Goepel Electronic GmbH
6832140f Salient Systems Corp
68331410 Midas lab Inc
68341411 Ikos Systems Inc
6835# formerly IC Ensemble Inc.
68361412 VIA Technologies Inc.
6837 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller
6838 1412 1712 Hoontech ST Audio DSP 24
6839 1412 d630 M-Audio Delta 1010
6840 1412 d631 M-Audio Delta DiO
6841 1412 d632 M-Audio Delta 66
6842 1412 d633 M-Audio Delta 44
6843 1412 d634 M-Audio Delta Audiophile
6844 1412 d635 M-Audio Delta TDIF
6845 1412 d637 M-Audio Delta RBUS
6846 1412 d638 M-Audio Delta 410
6847 1412 d63b M-Audio Delta 1010LT
6848 1412 d63c Digigram VX442
6849 1416 1712 Hoontech ST Audio DSP 24 Media 7.1
6850 153b 1115 EWS88 MT
6851 153b 1125 EWS88 MT (Master)
6852 153b 112b EWS88 D
6853 153b 112c EWS88 D (Master)
6854 153b 1130 EWX 24/96
6855 153b 1138 DMX 6fire 24/96
6856 153b 1151 PHASE88
6857 16ce 1040 Edirol DA-2496
6858 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller
6859 1412 1724 AMP Ltd AUDIO2000
6860 1412 3630 M-Audio Revolution 7.1
6861 153b 1145 Aureon 7.1 Space
6862 153b 1147 Aureon 5.1 Sky
6863 153b 1153 Aureon 7.1 Universe
6864 270f f641 ZNF3-150
6865 270f f645 ZNF3-250
68661413 Addonics
68671414 Microsoft Corporation
68681415 Oxford Semiconductor Ltd
6869 8403 VScom 011H-EP1 1 port parallel adaptor
6870 9501 OX16PCI954 (Quad 16950 UART) function 0
6871 131f 2050 CyberPro (4-port)
6872# Model IO1085, Part No: JJ-P46012
6873 131f 2051 CyberSerial 4S Plus
6874 15ed 2000 MCCR Serial p0-3 of 8
6875 15ed 2001 MCCR Serial p0-3 of 16
6876 950a EXSYS EX-41092 Dual 16950 Serial adapter
6877 950b OXCB950 Cardbus 16950 UART
6878 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled)
6879 9511 OX16PCI954 (Quad 16950 UART) function 1
6880 15ed 2000 MCCR Serial p4-7 of 8
6881 15ed 2001 MCCR Serial p4-15 of 16
6882 9521 OX16PCI952 (Dual 16950 UART)
68831416 Multiwave Innovation pte Ltd
68841417 Convergenet Technologies Inc
68851418 Kyushu electronics systems Inc
68861419 Excel Switching Corp
6887141a Apache Micro Peripherals Inc
6888141b Zoom Telephonics Inc
6889141d Digitan Systems Inc
6890141e Fanuc Ltd
6891141f Visiontech Ltd
68921420 Psion Dacom plc
6893 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
6894 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
68951421 Ads Technologies Inc
68961422 Ygrec Systems Co Ltd
68971423 Custom Technology Corp.
68981424 Videoserver Connections
68991425 Chelsio Communications Inc
69001426 Storage Technology Corp.
69011427 Better On-Line Solutions
69021428 Edec Co Ltd
69031429 Unex Technology Corp.
6904142a Kingmax Technology Inc
6905142b Radiolan
6906142c Minton Optic Industry Co Ltd
6907142d Pix stream Inc
6908142e Vitec Multimedia
6909 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder
6910142f Radicom Research Inc
69111430 ITT Aerospace/Communications Division
69121431 Gilat Satellite Networks
69131432 Edimax Computer Co.
6914 9130 RTL81xx Fast Ethernet
69151433 Eltec Elektronik GmbH
69161435 Real Time Devices US Inc.
69171436 CIS Technology Inc
69181437 Nissin Inc Co
69191438 Atmel-dream
69201439 Outsource Engineering & Mfg. Inc
6921143a Stargate Solutions Inc
6922143b Canon Research Center, America
6923143c Amlogic Inc
6924143d Tamarack Microelectronics Inc
6925143e Jones Futurex Inc
6926143f Lightwell Co Ltd - Zax Division
69271440 ALGOL Corp.
69281441 AGIE Ltd
69291442 Phoenix Contact GmbH & Co.
69301443 Unibrain S.A.
69311444 TRW
69321445 Logical DO Ltd
69331446 Graphin Co Ltd
69341447 AIM GmBH
69351448 Alesis Studio Electronics
69361449 TUT Systems Inc
6937144a Adlink Technology
6938 7296 PCI-7296
6939 7432 PCI-7432
6940 7433 PCI-7433
6941 7434 PCI-7434
6942 7841 PCI-7841
6943 8133 PCI-8133
6944 8164 PCI-8164
6945 8554 PCI-8554
6946 9111 PCI-9111
6947 9113 PCI-9113
6948 9114 PCI-9114
6949144b Loronix Information Systems Inc
6950144c Catalina Research Inc
6951144d Samsung Electronics Co Ltd
6952144e OLITEC
6953144f Askey Computer Corp.
69541450 Octave Communications Ind.
69551451 SP3D Chip Design GmBH
69561453 MYCOM Inc
69571454 Altiga Networks
69581455 Logic Plus Plus Inc
69591456 Advanced Hardware Architectures
69601457 Nuera Communications Inc
69611458 Giga-byte Technology
6962 0c11 K8NS Pro Mainboard
69631459 DOOIN Electronics
6964145a Escalate Networks Inc
6965145b PRAIM SRL
6966145c Cryptek
6967145d Gallant Computer Inc
6968145e Aashima Technology B.V.
6969145f Baldor Electric Company
6970 0001 NextMove PCI
69711460 DYNARC INC
69721461 Avermedia Technologies Inc
69731462 Micro-Star International Co., Ltd.
6974# MSI CB54G Wireless PC Card that seems to use the Broadcom 4306 Chipset
6975 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G]
6976 6825 PCI Card wireless 11g [PC54G]
6977 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter
6978# MSI G4Ti4800, 128MB DDR SDRAM, TV-Out, DVI-I
6979 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter
6980 9110 GeFORCE FX5200
6981 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter
6982 9591 nVidia Corporation NV36 [GeForce FX 5700LE]
69831463 Fast Corporation
69841464 Interactive Circuits & Systems Ltd
69851465 GN NETTEST Telecom DIV.
69861466 Designpro Inc.
69871467 DIGICOM SPA
69881468 AMBIT Microsystem Corp.
69891469 Cleveland Motion Controls
6990146a IFR
6991146b Parascan Technologies Ltd
6992146c Ruby Tech Corp.
6993 1430 FE-1430TX Fast Ethernet PCI Adapter
6994146d Tachyon, INC.
6995146e Williams Electronics Games, Inc.
6996146f Multi Dimensional Consulting Inc
69971470 Bay Networks
69981471 Integrated Telecom Express Inc
69991472 DAIKIN Industries, Ltd
70001473 ZAPEX Technologies Inc
70011474 Doug Carson & Associates
70021475 PICAZO Communications
70031476 MORTARA Instrument Inc
70041477 Net Insight
70051478 DIATREND Corporation
70061479 TORAY Industries Inc
7007147a FORMOSA Industrial Computing
7008147b ABIT Computer Corp.
7009147c AWARE, Inc.
7010147d Interworks Computer Products
7011147e Matsushita Graphic Communication Systems, Inc.
7012147f NIHON UNISYS, Ltd.
70131480 SCII Telecom
70141481 BIOPAC Systems Inc
70151482 ISYTEC - Integrierte Systemtechnik GmBH
70161483 LABWAY Corporation
70171484 Logic Corporation
70181485 ERMA - Electronic GmBH
70191486 L3 Communications Telemetry & Instrumentation
70201487 MARQUETTE Medical Systems
70211488 KONTRON Electronik GmBH
70221489 KYE Systems Corporation
7023148a OPTO
7024148b INNOMEDIALOGIC Inc.
7025148c C.P. Technology Co. Ltd
7026148d DIGICOM Systems, Inc.
7027 1003 HCF 56k Data/Fax Modem
7028148e OSI Plus Corporation
7029148f Plant Equipment, Inc.
70301490 Stone Microsystems PTY Ltd.
70311491 ZEAL Corporation
70321492 Time Logic Corporation
70331493 MAKER Communications
70341494 WINTOP Technology, Inc.
70351495 TOKAI Communications Industry Co. Ltd
70361496 JOYTECH Computer Co., Ltd.
70371497 SMA Regelsysteme GmBH
70381498 TEWS Datentechnik GmBH
7039 30c8 TPCI200
70401499 EMTEC CO., Ltd
7041149a ANDOR Technology Ltd
7042149b SEIKO Instruments Inc
7043149c OVISLINK Corp.
7044149d NEWTEK Inc
7045 0001 Video Toaster for PC
7046149e Mapletree Networks Inc.
7047149f LECTRON Co Ltd
704814a0 SOFTING GmBH
704914a1 Systembase Co Ltd
705014a2 Millennium Engineering Inc
705114a3 Maverick Networks
705214a4 GVC/BCM Advanced Research
705314a5 XIONICS Document Technologies Inc
705414a6 INOVA Computers GmBH & Co KG
705514a7 MYTHOS Systems Inc
705614a8 FEATRON Technologies Corporation
705714a9 HIVERTEC Inc
705814aa Advanced MOS Technology Inc
705914ab Mentor Graphics Corp.
706014ac Novaweb Technologies Inc
706114ad Time Space Radio AB
706214ae CTI, Inc
706314af Guillemot Corporation
7064 7102 3D Prophet II MX
706514b0 BST Communication Technology Ltd
706614b1 Nextcom K.K.
706714b2 ENNOVATE Networks Inc
706814b3 XPEED Inc
7069 0000 DSL NIC
707014b4 PHILIPS Business Electronics B.V.
707114b5 Creamware GmBH
7072 0200 Scope
7073 0300 Pulsar
7074 0400 PulsarSRB
7075 0600 Pulsar2
7076 0800 DSP-Board
7077 0900 DSP-Board
7078 0a00 DSP-Board
7079 0b00 DSP-Board
708014b6 Quantum Data Corp.
708114b7 PROXIM Inc
7082 0001 Symphony 4110
708314b8 Techsoft Technology Co Ltd
708414b9 AIRONET Wireless Communications
7085 0001 PC4800
7086 0340 PC4800
7087 0350 PC4800
7088 4500 PC4500
7089 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800
7090 a504 Cisco Aironet Wireless 802.11b
7091 a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter
7092 a506 Cisco Aironet Mini PCI b/g
709314ba INTERNIX Inc.
709414bb SEMTECH Corporation
709514bc Globespan Semiconductor Inc.
709614bd CARDIO Control N.V.
709714be L3 Communications
709814bf SPIDER Communications Inc.
709914c0 COMPAL Electronics Inc
710014c1 MYRICOM Inc.
7101 8043 Myrinet 2000 Scalable Cluster Interconnect
710214c2 DTK Computer
710314c3 MEDIATEK Corp.
710414c4 IWASAKI Information Systems Co Ltd
710514c5 Automation Products AB
710614c6 Data Race Inc
710714c7 Modular Technology Holdings Ltd
710814c8 Turbocomm Tech. Inc.
710914c9 ODIN Telesystems Inc
711014ca PE Logic Corp.
711114cb Billionton Systems Inc
711214cc NAKAYO Telecommunications Inc
711314cd Universal Scientific Ind.
711414ce Whistle Communications
711514cf TEK Microsystems Inc.
711614d0 Ericsson Axe R & D
711714d1 Computer Hi-Tech Co Ltd
711814d2 Titan Electronics Inc
7119 8001 VScom 010L 1 port parallel adaptor
7120 8002 VScom 020L 2 port parallel adaptor
7121 8010 VScom 100L 1 port serial adaptor
7122 8011 VScom 110L 1 port serial and 1 port parallel adaptor
7123 8020 VScom 200L 1 port serial adaptor
7124 8021 VScom 210L 2 port serial and 1 port parallel adaptor
7125 8040 VScom 400L 4 port serial adaptor
7126 8080 VScom 800L 8 port serial adaptor
7127 a000 VScom 010H 1 port parallel adaptor
7128 a001 VScom 100H 1 port serial adaptor
7129 a003 VScom 400H 4 port serial adaptor
7130 a004 VScom 400HF1 4 port serial adaptor
7131 a005 VScom 200H 2 port serial adaptor
7132 e001 VScom 010HV2 1 port parallel adaptor
7133 e010 VScom 100HV2 1 port serial adaptor
7134 e020 VScom 200HV2 2 port serial adaptor
713514d3 CIRTECH (UK) Ltd
713614d4 Panacom Technology Corp
713714d5 Nitsuko Corporation
713814d6 Accusys Inc
713914d7 Hirakawa Hewtech Corp
714014d8 HOPF Elektronik GmBH
7141# Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc.
714214d9 Alliance Semiconductor Corporation
7143 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
7144 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge
714514da National Aerospace Laboratories
714614db AFAVLAB Technology Inc
7147 2120 TK9902
714814dc Amplicon Liveline Ltd
7149 0000 PCI230
7150 0001 PCI242
7151 0002 PCI244
7152 0003 PCI247
7153 0004 PCI248
7154 0005 PCI249
7155 0006 PCI260
7156 0007 PCI224
7157 0008 PCI234
7158 0009 PCI236
7159 000a PCI272
7160 000b PCI215
716114dd Boulder Design Labs Inc
716214de Applied Integration Corporation
716314df ASIC Communications Corp
716414e1 INVERTEX
716514e2 INFOLIBRIA
716614e3 AMTELCO
716714e4 Broadcom Corporation
7168 0800 Sentry5 Chipcommon I/O Controller
7169 0804 Sentry5 PCI Bridge
7170 0805 Sentry5 MIPS32 CPU
7171 0806 Sentry5 Ethernet Controller
7172 080b Sentry5 Crypto Accelerator
7173 080f Sentry5 DDR/SDR RAM Controller
7174 0811 Sentry5 External Interface Core
7175 0816 BCM3302 Sentry5 MIPS32 CPU
7176 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express
7177 1644 NetXtreme BCM5700 Gigabit Ethernet
7178 1014 0277 Broadcom Vigil B5700 1000Base-T
7179 1028 00d1 Broadcom BCM5700
7180 1028 0106 Broadcom BCM5700
7181 1028 0109 Broadcom BCM5700 1000Base-T
7182 1028 010a Broadcom BCM5700 1000BaseTX
7183 10b7 1000 3C996-T 1000Base-T
7184 10b7 1001 3C996B-T 1000Base-T
7185 10b7 1002 3C996C-T 1000Base-T
7186 10b7 1003 3C997-T 1000Base-T Dual Port
7187 10b7 1004 3C996-SX 1000Base-SX
7188 10b7 1005 3C997-SX 1000Base-SX Dual Port
7189 10b7 1008 3C942 Gigabit LOM (31X31)
7190 14e4 0002 NetXtreme 1000Base-SX
7191 14e4 0003 NetXtreme 1000Base-SX
7192 14e4 0004 NetXtreme 1000Base-T
7193 14e4 1028 NetXtreme 1000BaseTX
7194 14e4 1644 BCM5700 1000Base-T
7195 1645 NetXtreme BCM5701 Gigabit Ethernet
7196 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
7197 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
7198 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL)
7199 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL)
7200 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
7201 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
7202 1028 0121 Broadcom BCM5701 1000Base-T
7203 103c 128a HP 1000Base-T (PCI) [A7061A]
7204 103c 128b HP 1000Base-SX (PCI) [A7073A]
7205 103c 12a4 HP Core Lan 1000Base-T
7206 103c 12c1 HP IOX Core Lan 1000Base-T [A7109AX]
7207 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)
7208 10a9 8011 SGI Gigabit Ethernet (Copper)
7209 10a9 8012 SGI Gigabit Ethernet (Fiber)
7210 10b7 1004 3C996-SX 1000Base-SX
7211 10b7 1006 3C996B-T 1000Base-T
7212 10b7 1007 3C1000-T 1000Base-T
7213 10b7 1008 3C940-BR01 1000Base-T
7214 14e4 0001 BCM5701 1000Base-T
7215 14e4 0005 BCM5701 1000Base-T
7216 14e4 0006 BCM5701 1000Base-T
7217 14e4 0007 BCM5701 1000Base-SX
7218 14e4 0008 BCM5701 1000Base-T
7219 14e4 8008 BCM5701 1000Base-T
7220 1646 NetXtreme BCM5702 Gigabit Ethernet
7221 0e11 00bb NC7760 1000BaseTX
7222 1028 0126 Broadcom BCM5702 1000BaseTX
7223 14e4 8009 BCM5702 1000BaseTX
7224 1647 NetXtreme BCM5703 Gigabit Ethernet
7225 0e11 0099 NC7780 1000BaseTX
7226 0e11 009a NC7770 1000BaseTX
7227 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)
7228 14e4 0009 BCM5703 1000BaseTX
7229 14e4 000a BCM5703 1000BaseSX
7230 14e4 000b BCM5703 1000BaseTX
7231 14e4 8009 BCM5703 1000BaseTX
7232 14e4 800a BCM5703 1000BaseTX
7233 1648 NetXtreme BCM5704 Gigabit Ethernet
7234 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7235 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7236 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7237 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X
7238 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X
7239 1166 1648 NetXtreme CIOB-E 1000Base-T
7240 164a NetXtreme II BCM5706 Gigabit Ethernet
7241 164d NetXtreme BCM5702FE Gigabit Ethernet
7242 1653 NetXtreme BCM5705 Gigabit Ethernet
7243 0e11 00e3 NC7761 Gigabit Server Adapter
7244 1654 NetXtreme BCM5705_2 Gigabit Ethernet
7245 0e11 00e3 NC7761 Gigabit Server Adapter
7246 103c 3100 NC1020 HP ProLiant Gigabit Server Adapter 32 PCI
7247 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express
7248 165d NetXtreme BCM5705M Gigabit Ethernet
7249 165e NetXtreme BCM5705M_2 Gigabit Ethernet
7250 103c 088c nc8000 laptop
7251 103c 0890 nc6000 laptop
7252 166e 570x 10/100 Integrated Controller
7253 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express
7254 1028 0179 Optiplex GX280
7255 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express
7256 167e NetXtreme BCM5751F Fast Ethernet PCI Express
7257 1696 NetXtreme BCM5782 Gigabit Ethernet
7258 103c 12bc HP d530 CMT (DG746A)
7259 14e4 000d NetXtreme BCM5782 1000Base-T
7260 169c NetXtreme BCM5788 Gigabit Ethernet
7261 169d NetLink BCM5789 Gigabit Ethernet PCI Express
7262 16a6 NetXtreme BCM5702X Gigabit Ethernet
7263 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
7264 1028 0126 BCM5702 1000Base-T
7265 14e4 000c BCM5702 1000Base-T
7266 14e4 8009 BCM5702 1000Base-T
7267 16a7 NetXtreme BCM5703X Gigabit Ethernet
7268 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7269 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7270 14e4 0009 NetXtreme BCM5703 1000Base-T
7271 14e4 000a NetXtreme BCM5703 1000Base-SX
7272 14e4 000b NetXtreme BCM5703 1000Base-T
7273 14e4 800a NetXtreme BCM5703 1000Base-T
7274 16a8 NetXtreme BCM5704S Gigabit Ethernet
7275 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X
7276 16aa NetXtreme II BCM5706S Gigabit Ethernet
7277 16c6 NetXtreme BCM5702A3 Gigabit Ethernet
7278 10b7 1100 3C1000B-T 10/100/1000 PCI
7279 14e4 000c BCM5702 1000Base-T
7280 14e4 8009 BCM5702 1000Base-T
7281 16c7 NetXtreme BCM5703 Gigabit Ethernet
7282 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7283 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
7284 103c 12c3 HP Combo FC/GigE-SX [A9782A]
7285 103c 12ca HP Combo FC/GigE-T [A9784A]
7286 14e4 0009 NetXtreme BCM5703 1000Base-T
7287 14e4 000a NetXtreme BCM5703 1000Base-SX
7288 16dd NetLink BCM5781 Gigabit Ethernet PCI Express
7289 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express
7290 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express
7291 16fe NetXtreme BCM5753F Fast Ethernet PCI Express
7292 170c BCM4401-B0 100Base-TX
7293 170d NetXtreme BCM5901 100Base-TX
7294 1014 0545 ThinkPad R40e (2684-HVG) builtin ethernet controller
7295 170e NetXtreme BCM5901 100Base-TX
7296 3352 BCM3352
7297 3360 BCM3360
7298 4210 BCM4210 iLine10 HomePNA 2.0
7299 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem
7300 4212 BCM4212 v.90 56k modem
7301 4301 BCM4303 802.11b Wireless LAN Controller
7302 1028 0407 TrueMobile 1180 Onboard WLAN
7303 1043 0120 WL-103b Wireless LAN PC Card
7304 4305 BCM4307 V.90 56k Modem
7305 4306 BCM4307 Ethernet Controller
7306 4307 BCM4307 802.11b Wireless LAN Controller
7307 4310 BCM4310 Chipcommon I/OController
7308 4312 BCM4310 UART
7309 4313 BCM4310 Ethernet Controller
7310 4315 BCM4310 USB Controller
7311 4320 BCM4306 802.11b/g Wireless LAN Controller
7312 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card
7313 1028 0003 Wireless 1350 WLAN Mini-PCI Card
7314 1043 100f WL-100G
7315 14e4 4320 Linksys WMP54G PCI
7316 1737 4320 WPC54G
7317 1799 7010 Belkin F5D7010 54g Wireless Network card
7318 4321 BCM4306 802.11a Wireless LAN Controller
7319 4322 BCM4306 UART
7320 4324 BCM4309 802.11a/b/g
7321 1028 0001 Truemobile 1400
7322 1028 0003 Truemobile 1450 MiniPCI
7323 4325 BCM43xG 802.11b/g
7324 1414 0003 Wireless Notebook Adapter MN-720
7325 1414 0004 Wireless PCI Adapter MN-730
7326# probably this is a correct ID...
7327 4326 BCM4307 Chipcommon I/O Controller?
7328 4401 BCM4401 100Base-T
7329 1043 80a8 A7V8X motherboard
7330 4402 BCM4402 Integrated 10/100BaseT
7331 4403 BCM4402 V.90 56k Modem
7332 4410 BCM4413 iLine32 HomePNA 2.0
7333 4411 BCM4413 V.90 56k modem
7334 4412 BCM4412 10/100BaseT
7335 4430 BCM44xx CardBus iLine32 HomePNA 2.0
7336 4432 BCM4432 CardBus 10/100BaseT
7337 4610 BCM4610 Sentry5 PCI to SB Bridge
7338 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0
7339 4612 BCM4610 Sentry5 V.90 56k Modem
7340 4613 BCM4610 Sentry5 Ethernet Controller
7341 4614 BCM4610 Sentry5 External Interface
7342 4615 BCM4610 Sentry5 USB Controller
7343 4704 BCM4704 PCI to SB Bridge
7344 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller
7345 4706 BCM4704 Sentry5 Ethernet Controller
7346 4707 BCM4704 Sentry5 USB Controller
7347 4708 BCM4704 Crypto Accelerator
7348 4710 BCM4710 Sentry5 PCI to SB Bridge
7349 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0
7350 4712 BCM47xx V.92 56k modem
7351 4713 Sentry5 Ethernet Controller
7352 4714 BCM47xx Sentry5 External Interface
7353 4715 Sentry5 USB Controller
7354 4716 BCM47xx Sentry5 USB Host Controller
7355 4717 BCM47xx Sentry5 USB Device Controller
7356 4718 Sentry5 Crypto Accelerator
7357 4720 BCM4712 MIPS CPU
7358 5365 BCM5365P Sentry5 Host Bridge
7359 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller
7360 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller
7361 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller
7362 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller
7363 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller
7364 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric
7365 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller
7366 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch
7367 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller
7368 5820 BCM5820 Crypto Accelerator
7369 5821 BCM5821 Crypto Accelerator
7370 5822 BCM5822 Crypto Accelerator
7371 5823 BCM5823 Crypto Accelerator
7372 5824 BCM5824 Crypto Accelerator
7373 5840 BCM5840 Crypto Accelerator
7374 5841 BCM5841 Crypto Accelerator
7375 5850 BCM5850 Crypto Accelerator
737614e5 Pixelfusion Ltd
737714e6 SHINING Technology Inc
737814e7 3CX
737914e8 RAYCER Inc
738014e9 GARNETS System CO Ltd
738114ea Planex Communications, Inc
7382 ab06 FNW-3603-TX CardBus Fast Ethernet
7383 ab07 RTL81xx RealTek Ethernet
738414eb SEIKO EPSON Corp
738514ec ACQIRIS
738614ed DATAKINETICS Ltd
738714ee MASPRO KENKOH Corp
738814ef CARRY Computer ENG. CO Ltd
738914f0 CANON RESEACH CENTRE FRANCE
739014f1 Conexant
7391 1002 HCF 56k Modem
7392 1003 HCF 56k Modem
7393 1004 HCF 56k Modem
7394 1005 HCF 56k Modem
7395 1006 HCF 56k Modem
7396 1022 HCF 56k Modem
7397 1023 HCF 56k Modem
7398 1024 HCF 56k Modem
7399 1025 HCF 56k Modem
7400 1026 HCF 56k Modem
7401 1032 HCF 56k Modem
7402 1033 HCF 56k Data/Fax Modem
7403 1033 8077 NEC
7404 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem
7405 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem
7406 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem
7407 13e0 020d Dell Copper
7408 13e0 020e Dell Silver
7409 13e0 0261 IBM
7410 13e0 0290 Compaq Goldwing
7411 13e0 02a0 IBM
7412 13e0 02b0 IBM
7413 13e0 02c0 Compaq Scooter
7414 13e0 02d0 IBM
7415 144f 1500 IBM P85-DF (1)
7416 144f 1501 IBM P85-DF (2)
7417 144f 150a IBM P85-DF (3)
7418 144f 150b IBM P85-DF Low Profile (1)
7419 144f 1510 IBM P85-DF Low Profile (2)
7420 1034 HCF 56k Data/Fax/Voice Modem
7421 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7422 10cf 1098 Fujitsu P85-DFSV
7423 1036 HCF 56k Data/Fax/Voice/Spkp Modem
7424 104d 8067 HCF 56k Modem
7425 122d 4029 MDP3880SP-W
7426 122d 4031 MDP3880SP-U
7427 13e0 0209 Dell Titanium
7428 13e0 020a Dell Graphite
7429 13e0 0260 Gateway Red Owl
7430 13e0 0270 Gateway White Horse
7431 1052 HCF 56k Data/Fax Modem (Worldwide)
7432 1053 HCF 56k Data/Fax Modem (Worldwide)
7433 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)
7434 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
7435 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
7436 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
7437 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)
7438 1063 HCF 56k Data/Fax Modem
7439 1064 HCF 56k Data/Fax/Voice Modem
7440 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7441 1066 HCF 56k Data/Fax/Voice/Spkp Modem
7442 122d 4033 Dell Athena - MDP3900V-U
7443 1433 HCF 56k Data/Fax Modem
7444 1434 HCF 56k Data/Fax/Voice Modem
7445 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7446 1436 HCF 56k Data/Fax Modem
7447 1453 HCF 56k Data/Fax Modem
7448 13e0 0240 IBM
7449 13e0 0250 IBM
7450 144f 1502 IBM P95-DF (1)
7451 144f 1503 IBM P95-DF (2)
7452 1454 HCF 56k Data/Fax/Voice Modem
7453 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7454 1456 HCF 56k Data/Fax/Voice/Spkp Modem
7455 122d 4035 Dell Europa - MDP3900V-W
7456 122d 4302 Dell MP3930V-W(C) MiniPCI
7457 1610 ADSL AccessRunner PCI Arbitration Device
7458 1611 AccessRunner PCI ADSL Interface Device
7459 1620 ADSL AccessRunner V2 PCI Arbitration Device
7460 1621 AccessRunner V2 PCI ADSL Interface Device
7461 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter
7462 1803 HCF 56k Modem
7463 0e11 0023 623-LAN Grizzly
7464 0e11 0043 623-LAN Yogi
7465 1815 HCF 56k Modem
7466 0e11 0022 Grizzly
7467 0e11 0042 Yogi
7468 2003 HSF 56k Data/Fax Modem
7469 2004 HSF 56k Data/Fax/Voice Modem
7470 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7471 2006 HSF 56k Data/Fax/Voice/Spkp Modem
7472 2013 HSF 56k Data/Fax Modem
7473 0e11 b195 Bear
7474 0e11 b196 Seminole 1
7475 0e11 b1be Seminole 2
7476 1025 8013 Acer
7477 1033 809d NEC
7478 1033 80bc NEC
7479 155d 6793 HP
7480 155d 8850 E Machines
7481 2014 HSF 56k Data/Fax/Voice Modem
7482 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
7483 2016 HSF 56k Data/Fax/Voice/Spkp Modem
7484 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)
7485 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
7486 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
7487 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
7488 2063 HSF 56k Data/Fax Modem (SmartDAA)
7489 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)
7490 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
7491 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
7492 2093 HSF 56k Modem
7493 155d 2f07 Legend
7494 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
7495 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
7496 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
7497 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
7498 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
7499 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
7500 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
7501 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
7502 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
7503 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
7504 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
7505 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
7506 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
7507 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
7508 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
7509 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
7510 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
7511 104d 8075 Modem
7512 104d 8083 Modem
7513 104d 8097 Modem
7514 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
7515 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
7516 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
7517 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)
7518 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
7519 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
7520 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
7521 2f00 HSF 56k HSFi Modem
7522 13e0 8d84 IBM HSFi V.90
7523 13e0 8d85 Compaq Stinger
7524 14f1 2004 Dynalink 56PMi
7525 2f02 HSF 56k HSFi Data/Fax
7526 2f11 HSF 56k HSFi Modem
7527 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
7528 8800 CX22702 DVB-T 2k/8k
7529 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Video Capture
7530 8802 CX23883 Broadcast Decoder
7531 17de 08a1 Xpert DVB-T PCI 2388x Transport Stream Capture
753214f2 MOBILITY Electronics
7533 0120 EV1000 bridge
7534 0121 EV1000 Parallel port
7535 0122 EV1000 Serial port
7536 0123 EV1000 Keyboard controller
7537 0124 EV1000 Mouse controller
753814f3 BroadLogic
7539 2030 2030 DVB-S Satellite Reciever
7540 2050 2050 DVB-T Terrestrial (Cable) Reciever
7541 2060 2060 ATSC Terrestrial (Cable) Reciever
754214f4 TOKYO Electronic Industry CO Ltd
754314f5 SOPAC Ltd
754414f6 COYOTE Technologies LLC
754514f7 WOLF Technology Inc
754614f8 AUDIOCODES Inc
7547 2077 TP-240 dual span E1 VoIP PCI card
754814f9 AG COMMUNICATIONS
754914fa WANDEL & GOCHERMANN
755014fb TRANSAS MARINE (UK) Ltd
755114fc Quadrics Ltd
7552 0000 QsNet Elan3 Network Adapter
7553 0001 QsNetII Elan4 Network Adapter
755414fd JAPAN Computer Industry Inc
755514fe ARCHTEK TELECOM Corp
755614ff TWINHEAD INTERNATIONAL Corp
75571500 DELTA Electronics, Inc
7558 1360 RTL81xx RealTek Ethernet
75591501 BANKSOFT CANADA Ltd
75601502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd
75611503 KAWASAKI LSI USA Inc
75621504 KAISER Electronics
75631505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH
75641506 CHAMELEON Systems Inc
7565# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057).
75661507 Motorola ?? / HTEC
7567 0001 MPC105 [Eagle]
7568 0002 MPC106 [Grackle]
7569 0003 MPC8240 [Kahlua]
7570 0100 MC145575 [HFC-PCI]
7571 0431 KTI829c 100VG
7572 4801 Raven
7573 4802 Falcon
7574 4803 Hawk
7575 4806 CPX8216
75761508 HONDA CONNECTORS/MHOTRONICS Inc
75771509 FIRST INTERNATIONAL Computer Inc
7578150a FORVUS RESEARCH Inc
7579150b YAMASHITA Systems Corp
7580150c KYOPAL CO Ltd
7581150d WARPSPPED Inc
7582150e C-PORT Corp
7583150f INTEC GmbH
75841510 BEHAVIOR TECH Computer Corp
75851511 CENTILLIUM Technology Corp
75861512 ROSUN Technologies Inc
75871513 Raychem
75881514 TFL LAN Inc
75891515 Advent design
75901516 MYSON Technology Inc
7591 0800 MTD-8xx 100/10M Ethernet PCI Adapter
7592 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
7593 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
7594 0891 MTD-8xx 100/10M Ethernet PCI Adapter
75951517 ECHOTEK Corp
75961518 PEP MODULAR Computers GmbH
75971519 TELEFON AKTIEBOLAGET LM Ericsson
7598151a Globetek
7599 1002 PCI-1002
7600 1004 PCI-1004
7601 1008 PCI-1008
7602151b COMBOX Ltd
7603151c DIGITAL AUDIO LABS Inc
7604 0003 Prodif T 2496
7605 4000 Prodif 88
7606151d Fujitsu Computer Products Of America
7607151e MATRIX Corp
7608151f TOPIC SEMICONDUCTOR Corp
7609 0000 TP560 Data/Fax/Voice 56k modem
76101520 CHAPLET System Inc
76111521 BELL Corp
76121522 MainPine Ltd
7613 0100 PCI <-> IOBus Bridge
7614 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem
7615 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem
7616 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem
7617 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem
7618 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem
7619 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem
7620 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem
7621 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
7622 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
7623# this is a correction to a recent entry. 1522:0E00 should be 1522:1D00
7624 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
76251523 MUSIC Semiconductors
76261524 ENE Technology Inc
7627 0510 CB710 Memory Card Reader Controller
7628 0610 PCI Smart Card Reader Controller
7629 1211 CB1211 Cardbus Controller
7630 1225 CB1225 Cardbus Controller
7631 1410 CB1410 Cardbus Controller
7632 1025 005a TravelMate 290
7633 1411 CB-710/2/4 Cardbus Controller
7634 1412 CB-712/4 Cardbus Controller
7635 1420 CB1420 Cardbus Controller
7636 1421 CB-720/2/4 Cardbus Controller
7637 1422 CB-722/4 Cardbus Controller
76381525 IMPACT Technologies
76391526 ISS, Inc
76401527 SOLECTRON
76411528 ACKSYS
76421529 AMERICAN MICROSystems Inc
7643152a QUICKTURN DESIGN Systems
7644152b FLYTECH Technology CO Ltd
7645152c MACRAIGOR Systems LLC
7646152d QUANTA Computer Inc
7647152e MELEC Inc
7648152f PHILIPS - CRYPTO
76491530 ACQIS Technology Inc
76501531 CHRYON Corp
76511532 ECHELON Corp
76521533 BALTIMORE
76531534 ROAD Corp
76541535 EVERGREEN Technologies Inc
76551537 DATALEX COMMUNCATIONS
76561538 ARALION Inc
7657 0303 ARS106S Ultra ATA 133/100/66 Host Controller
76581539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.
7659153a ONO SOKKI
7660153b TERRATEC Electronic GmbH
7661 1144 Aureon 5.1
7662# Terratec seems to use several IDs for the same card.
7663 1147 Aureon 5.1 Sky
7664 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]
7665153c ANTAL Electronic
7666153d FILANET Corp
7667153e TECHWELL Inc
7668153f MIPS DENMARK
76691540 PROVIDEO MULTIMEDIA Co Ltd
76701541 MACHONE Communications
76711542 VIVID Technology Inc
76721543 SILICON Laboratories
7673 3052 Intel 537 [Winmodem]
7674 4c22 Si3036 MC'97 DAA
76751544 DCM DATA Systems
76761545 VISIONTEK
76771546 IOI Technology Corp
76781547 MITUTOYO Corp
76791548 JET PROPULSION Laboratory
76801549 INTERCONNECT Systems Solutions
7681154a MAX Technologies Inc
7682154b COMPUTEX Co Ltd
7683154c VISUAL Technology Inc
7684154d PAN INTERNATIONAL Industrial Corp
7685154e SERVOTEST Ltd
7686154f STRATABEAM Technology
76871550 OPEN NETWORK Co Ltd
76881551 SMART Electronic DEVELOPMENT GmBH
76891552 RACAL AIRTECH Ltd
76901553 CHICONY Electronics Co Ltd
76911554 PROLINK Microsystems Corp
76921555 GESYTEC GmBH
76931556 PLD APPLICATIONS
76941557 MEDIASTAR Co Ltd
76951558 CLEVO/KAPOK Computer
76961559 SI LOGIC Ltd
7697155a INNOMEDIA Inc
7698155b PROTAC INTERNATIONAL Corp
7699155c Cemax-Icon Inc
7700155d Mac System Co Ltd
7701155e LP Elektronik GmbH
7702155f Perle Systems Ltd
77031560 Terayon Communications Systems
77041561 Viewgraphics Inc
77051562 Symbol Technologies
77061563 A-Trend Technology Co Ltd
77071564 Yamakatsu Electronics Industry Co Ltd
77081565 Biostar Microtech Int'l Corp
77091566 Ardent Technologies Inc
77101567 Jungsoft
77111568 DDK Electronics Inc
77121569 Palit Microsystems Inc.
7713156a Avtec Systems
7714156b 2wire Inc
7715156c Vidac Electronics GmbH
7716156d Alpha-Top Corp
7717156e Alfa Inc
7718156f M-Systems Flash Disk Pioneers Ltd
77191570 Lecroy Corp
77201571 Contemporary Controls
7721 a001 CCSI PCI20-485 ARCnet
7722 a002 CCSI PCI20-485D ARCnet
7723 a003 CCSI PCI20-485X ARCnet
7724 a004 CCSI PCI20-CXB ARCnet
7725 a005 CCSI PCI20-CXS ARCnet
7726 a006 CCSI PCI20-FOG-SMA ARCnet
7727 a007 CCSI PCI20-FOG-ST ARCnet
7728 a008 CCSI PCI20-TB5 ARCnet
7729 a009 CCSI PCI20-5-485 5Mbit ARCnet
7730 a00a CCSI PCI20-5-485D 5Mbit ARCnet
7731 a00b CCSI PCI20-5-485X 5Mbit ARCnet
7732 a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet
7733 a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet
7734 a201 CCSI PCI22-485 10Mbit ARCnet
7735 a202 CCSI PCI22-485D 10Mbit ARCnet
7736 a203 CCSI PCI22-485X 10Mbit ARCnet
7737 a204 CCSI PCI22-CHB 10Mbit ARCnet
7738 a205 CCSI PCI22-FOG_ST 10Mbit ARCnet
7739 a206 CCSI PCI22-THB 10Mbit ARCnet
77401572 Otis Elevator Company
77411573 Lattice - Vantis
77421574 Fairchild Semiconductor
77431575 Voltaire Advanced Data Security Ltd
77441576 Viewcast COM
77451578 HITT
7746 5615 VPMK3 [Video Processor Mk III]
77471579 Dual Technology Corp
7748157a Japan Elecronics Ind Inc
7749157b Star Multimedia Corp
7750157c Eurosoft (UK)
7751 8001 Fix2000 PCI Y2K Compliance Card
7752157d Gemflex Networks
7753157e Transition Networks
7754157f PX Instruments Technology Ltd
77551580 Primex Aerospace Co
77561581 SEH Computertechnik GmbH
77571582 Cytec Corp
77581583 Inet Technologies Inc
77591584 Uniwill Computer Corp
77601585 Logitron
77611586 Lancast Inc
77621587 Konica Corp
77631588 Solidum Systems Corp
77641589 Atlantek Microsystems Pty Ltd
7765158a Digalog Systems Inc
7766158b Allied Data Technologies
7767158c Hitachi Semiconductor & Devices Sales Co Ltd
7768158d Point Multimedia Systems
7769158e Lara Technology Inc
7770158f Ditect Coop
77711590 3pardata Inc
77721591 ARN
77731592 Syba Tech Ltd
7774 0781 Multi-IO Card
7775 0782 Parallel Port Card 2xEPP
7776 0783 Multi-IO Card
7777 0785 Multi-IO Card
7778 0786 Multi-IO Card
7779 0787 Multi-IO Card
7780 0788 Multi-IO Card
7781 078a Multi-IO Card
77821593 Bops Inc
77831594 Netgame Ltd
77841595 Diva Systems Corp
77851596 Folsom Research Inc
77861597 Memec Design Services
77871598 Granite Microsystems
77881599 Delta Electronics Inc
7789159a General Instrument
7790159b Faraday Technology Corp
7791159c Stratus Computer Systems
7792159d Ningbo Harrison Electronics Co Ltd
7793159e A-Max Technology Co Ltd
7794159f Galea Network Security
779515a0 Compumaster SRL
779615a1 Geocast Network Systems
779715a2 Catalyst Enterprises Inc
7798 0001 TA700 PCI Bus Analyzer/Exerciser
779915a3 Italtel
780015a4 X-Net OY
780115a5 Toyota Macs Inc
780215a6 Sunlight Ultrasound Technologies Ltd
780315a7 SSE Telecom Inc
780415a8 Shanghai Communications Technologies Center
780515aa Moreton Bay
780615ab Bluesteel Networks Inc
780715ac North Atlantic Instruments
780815ad VMware Inc
7809 0405 [VMware SVGA II] PCI Display Adapter
7810 0710 Virtual SVGA
7811 0720 VMware High-Speed Virtual NIC [vmxnet]
781215ae Amersham Pharmacia Biotech
781315b0 Zoltrix International Ltd
781415b1 Source Technology Inc
781515b2 Mosaid Technologies Inc
781615b3 Mellanox Technologies
7817 5274 MT21108 InfiniBridge
7818 5a44 MT23108 InfiniHost
7819 5a45 MT23108 [Infinihost HCA Flash Recovery]
7820 5a46 MT23108 PCI Bridge
7821 5e8c MT24204 [InfiniHost III Lx HCA]
7822 5e8d MT24204 [InfiniHost III Lx HCA Flash Recovery]
7823 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
7824 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery]
7825 6282 MT25208 InfiniHost III Ex
782615b4 CCI/TRIAD
782715b5 Cimetrics Inc
782815b6 Texas Memory Systems Inc
782915b7 Sandisk Corp
783015b8 ADDI-DATA GmbH
783115b9 Maestro Digital Communications
783215ba Impacct Technology Corp
783315bb Portwell Inc
783415bc Agilent Technologies
7835 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
7836 2928 64 Bit, 66MHz PCI Exerciser & Analyzer
7837 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser
783815bd DFI Inc
783915be Sola Electronics
784015bf High Tech Computer Corp (HTC)
784115c0 BVM Ltd
784215c1 Quantel
784315c2 Newer Technology Inc
784415c3 Taiwan Mycomp Co Ltd
784515c4 EVSX Inc
784615c5 Procomp Informatics Ltd
7847 8010 1394b - 1394 Firewire 3-Port Host Adapter Card
784815c6 Technical University of Budapest
784915c7 Tateyama System Laboratory Co Ltd
7850 0349 Tateyama C-PCI PLC/NC card Rev.01A
785115c8 Penta Media Co Ltd
785215c9 Serome Technology Inc
785315ca Bitboys OY
785415cb AG Electronics Ltd
785515cc Hotrail Inc
785615cd Dreamtech Co Ltd
785715ce Genrad Inc
785815cf Hilscher GmbH
785915d1 Infineon Technologies AG
786015d2 FIC (First International Computer Inc)
786115d3 NDS Technologies Israel Ltd
786215d4 Iwill Corp
786315d5 Tatung Co
786415d6 Entridia Corp
786515d7 Rockwell-Collins Inc
786615d8 Cybernetics Technology Co Ltd
786715d9 Super Micro Computer Inc
786815da Cyberfirm Inc
786915db Applied Computing Systems Inc
787015dc Litronic Inc
7871 0001 Argus 300 PCI Cryptography Module
787215dd Sigmatel Inc
787315de Malleable Technologies Inc
787415df Infinilink Corp
787515e0 Cacheflow Inc
787615e1 Voice Technologies Group Inc
787715e2 Quicknet Technologies Inc
787815e3 Networth Technologies Inc
787915e4 VSN Systemen BV
788015e5 Valley technologies Inc
788115e6 Agere Inc
788215e7 Get Engineering Corp
788315e8 National Datacomm Corp
7884 0130 Wireless PCI Card
788515e9 Pacific Digital Corp
7886 1841 ADMA-100 DiscStaQ ATA Controller
788715ea Tokyo Denshi Sekei K.K.
788815eb Drsearch GmbH
788915ec Beckhoff GmbH
7890 3101 FC3101 Profibus DP 1 Channel PCI
7891 5102 FC5102
789215ed Macrolink Inc
789315ee In Win Development Inc
789415ef Intelligent Paradigm Inc
789515f0 B-Tree Systems Inc
789615f1 Times N Systems Inc
789715f2 Diagnostic Instruments Inc
789815f3 Digitmedia Corp
789915f4 Valuesoft
790015f5 Power Micro Research
790115f6 Extreme Packet Device Inc
790215f7 Banctec
790315f8 Koga Electronics Co
790415f9 Zenith Electronics Corp
790515fa J.P. Axzam Corp
790615fb Zilog Inc
790715fc Techsan Electronics Co Ltd
790815fd N-CUBED.NET
790915fe Kinpo Electronics Inc
791015ff Fastpoint Technologies Inc
79111600 Northrop Grumman - Canada Ltd
79121601 Tenta Technology
79131602 Prosys-tec Inc
79141603 Nokia Wireless Communications
79151604 Central System Research Co Ltd
79161605 Pairgain Technologies
79171606 Europop AG
79181607 Lava Semiconductor Manufacturing Inc
79191608 Automated Wagering International
79201609 Scimetric Instruments Inc
79211612 Telesynergy Research Inc.
79221619 FarSite Communications Ltd
7923 0400 FarSync T2P (2 port X.21/V.35/V.24)
7924 0440 FarSync T4P (4 port X.21/V.35/V.24)
7925# www.rioworks.com
7926161f Rioworks
79271626 TDK Semiconductor Corp.
7928 8410 RTL81xx Fast Ethernet
79291629 Kongsberg Spacetec AS
7930 1003 Format synchronizer v3.0
7931 2002 Fast Universal Data Output
7932# This seems to occur on their 802.11b Wireless card WMP-11
79331637 Linksys
7934 3874 Linksys 802.11b WMP11 PCI Wireless card
79351638 Standard Microsystems Corp [SMC]
7936 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000
7937163c Smart Link Ltd.
7938 3052 SmartLink SmartPCI562 56K Modem
7939 5449 SmartPCI561 Modem
79401657 Brocade Communications Systems, Inc.
7941165a Epix Inc
7942 c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]
7943 d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232]
7944 d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232]
7945165d Hsing Tech. Enterprise Co., Ltd.
79461661 Worldspace Corp.
79471668 Actiontec Electronics Inc
7948 0100 Mini-PCI bridge
7949# Formerly SiByte, Inc.
7950166d Broadcom Corporation
7951 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI
7952 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport
79531677 Bernecker + Rainer
7954 104e 5LS172.6 B&R Dual CAN Interface Card
7955 12d7 5LS172.61 B&R Dual CAN Interface Card
7956167b ZyDAS Technology Corp.
7957 2102 ZyDAS ZD1202
7958 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card
79591681 Hercules
7960# More specs, more accurate desc.
7961 0010 Hercules 3d Prophet II Ultra 64MB [ 350 MHz NV15BR core, 128-bit DDR @ 460 MHz, 1.5v AGP4x ]
79621682 XFX Pine Group Inc.
79631688 CastleNet Technology Inc.
7964 1170 WLAN 802.11b card
7965168c Atheros Communications, Inc.
7966 0007 AR5000 802.11a Wireless Adapter
7967 0011 AR5210 802.11a NIC
7968 0012 AR5211 802.11ab NIC
7969 0013 AR5212 802.11abg NIC
7970 1113 d301 Philips CPWNA100 Wireless CardBus adapter
7971 1186 3202 D-link DWL-G650 B3 Wireless cardbus adapter
7972 1186 3203 DWL-G520 Wireless PCI Adapter
7973 1186 3a13 DWL-G520 Wireless PCI Adapter rev. B
7974 1186 3a94 C54C Wireless 801.11g cardbus
7975 1385 4d00 Netgear WG311T Wireless PCI Adapter
7976 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter
7977 168c 0013 WG511T Wireless CardBus Adapter
7978 168c 1025 DWL-G650B2 Wireless CardBus Adapter
7979 168c 1027 Netgate NL-3054CB ARIES b/g CardBus Adapter
7980 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter
7981 168c 2041 Netgate 5354MP Plus ARIES2 b/g MiniPCI Adapter
7982 168c 2042 Netgate 5354MP Plus ARIES2 a/b/g MiniPCI Adapter
7983 1014 AR5212 802.11abg NIC
7984169c Netcell Corporation
7985 0044 SyncRAID SR3000/5000 Series SATA RAID Controllers
798616a5 Tekram Technology Co.,Ltd.
798716ab Global Sun Technology Inc
7988 1100 GL24110P
7989 1101 PLX9052 PCMCIA-to-PCI Wireless LAN
7990 1102 PCMCIA-to-PCI Wireless Network Bridge
7991 8501 WL-8305 Wireless LAN PCI Adapter
799216ae Safenet Inc
7993 1141 SafeXcel-1141
799416b4 Aspex Semiconductor Ltd
799516be Creatix Polymedia GmbH
799616ca CENATEK Inc
7997 0001 Rocket Drive DL
799816cd Densitron Technologies
799916ce Roland Corp.
8000# www.pikatechnologies.com
800116df PIKA Technologies Inc.
800216e3 European Space Agency
8003 1e0f LEON2FT Processor
800416ec U.S. Robotics
8005 00ff USR997900 10/100 Mbps PCI Network Card
8006 0116 USR997902 10/100/1000 Mbps PCI Network Card
8007 3685 Wireless Access PCI Adapter Model 022415
800816ed Sycron N. V.
8009 1001 UMIO communication card
801016f3 Jetway Information Co., Ltd.
801116f4 Vweb Corp
8012 8000 VW2010
801316f6 VideoTele.com, Inc.
8014# www.internetmachines.com
80151702 Internet Machines Corporation (IMC)
80161705 Digital First, Inc.
8017170b NetOctave
8018 0100 NSP2000-SSL crypto accelerator
8019170c YottaYotta Inc.
8020# Seems to be a 2nd ID for Vitesse Semiconductor
80211725 Vitesse Semiconductor
8022 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
8023172a Accelerated Encryption
80241734 Fujitsu Siemens Computer GmbH
80251737 Linksys
8026 0013 WMP54G Wireless Pci Card
8027 0015 WMP54GS Wireless Pci Card
8028 1032 Gigabit Network Adapter
8029 1737 0015 EG1032 v2 Instant Gigabit Network Adapter
8030 1064 Gigabit Network Adapter
8031 1737 0016 EG1064 v2 Instant Gigabit Network Adapter
8032 ab08 21x4x DEC-Tulip compatible 10/100 Ethernet
8033 ab09 21x4x DEC-Tulip compatible 10/100 Ethernet
8034173b Altima (nee Broadcom)
8035 03e8 AC1000 Gigabit Ethernet
8036 03e9 AC1001 Gigabit Ethernet
8037 03ea AC9100 Gigabit Ethernet
8038 173b 0001 AC1002
8039 03eb AC1003 Gigabit Ethernet
80401743 Peppercon AG
8041 8139 ROL/F-100 Fast Ethernet Adapter with ROL
80421749 RLX Technologies
8043174b PC Partner Limited
8044174d WellX Telecom SA
8045175c AudioScience Inc
8046175e Sanera Systems, Inc.
80471787 Hightech Information System Ltd.
8048# also used by Struck Innovative Systeme for joint developments
80491796 Research Centre Juelich
8050 0001 SIS1100 [Gigabit link]
8051 0002 HOTlink
8052 0003 Counter Timer
8053 0004 CAMAC Controller
8054 0005 PROFIBUS
8055 0006 AMCC HOTlink
80561797 JumpTec h, GMBH
80571799 Belkin
8058 6001 Wireless PCI Card - F5D6001
8059 6020 Wireless PCMCIA Card - F5D6020
8060 6060 Wireless PDA Card - F5D6060
8061 7000 Wireless PCI Card - F5D7000
806217a0 Genesys Logic, Inc
8063 8033 GL880S USB 1.1 controller
8064 8034 GL880S USB 2.0 controller
806517af Hightech Information System Ltd.
806617b3 Hawking Technologies
8067 ab08 PN672TX 10/100 Ethernet
806817b4 Indra Networks, Inc.
8069 0011 WebEnhance 100 GZIP Compression Card
807017c0 Wistron Corp.
807117c2 Newisys, Inc.
807217cc NetChip Technology, Inc
8073 2280 USB 2.0
807417d3 Areca Technology Corp.
8075 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller
8076 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller
8077 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller
8078 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
8079 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller
8080 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller
8081 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller
8082 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller
8083# S2io ships 10Gb PCI-X Ethernet adapters www.s2io.com
808417d5 S2io Inc.
8085 5831 Xframe 10 Gigabit Ethernet PCI-X
8086 103c 12d5 HP PCI-X 133MHz 10GbE SR Fiber [AB287A]
808717de KWorld Computer Co. Ltd.
8088# http://www.connect3d.com
808917ee Connect Components Ltd
809017fe Linksys, A Division of Cisco Systems
8091 2120 WMP11v4 802.11b PCI card
8092 2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)
80931813 Ambient Technologies Inc
8094 4000 HaM controllerless modem
8095 16be 0001 V9x HAM Data Fax Modem
8096 4100 HaM plus Data Fax Modem
8097 16be 0002 V9x HAM 1394
80981814 RaLink
8099 0101 Wireless PCI Adpator RT2400 / RT2460
8100 3306 1113 Quidway WL100M
8101 0201 Ralink RT2500 802.11 Cardbus Reference Card
8102 1371 001e CWC-854 Wireless-G CardBus Adapter
8103 1371 001f CWM-854 Wireless-G Mini PCI Adapter
8104 1371 0020 CWP-854 Wireless-G PCI Adapter
8105 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter
81061820 InfiniCon Systems Inc.
81071822 Twinhan Technology Co. Ltd
8108182d SiteCom Europe BV
8109# HFC-based ISDN card
8110 3069 ISDN PCI DC-105V2
8111 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]
81121830 Credence Systems Corporation
8113183b MikroM GmbH
8114 08a7 MVC100 DVI
8115 08a8 MVC101 SDI
8116 08a9 MVC102 DVI+Audio
81171849 ASRock Incorporation
81181851 Microtune, Inc.
81191852 Anritsu Corp.
8120185f Wistron NeWeb Corp.
81211867 Topspin Communications
8122 5a44 MT23108 PCI-X HCA
8123 5a45 MT23108 PCI-X HCA flash recovery
8124 5a46 MT23108 PCI-X HCA bridge
8125 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)
8126 6282 MT25208 InfiniHost III Ex
8127187e ZyXEL Communication Corporation
81281888 Varisys Ltd
8129 0301 VMFX1 FPGA PMC module
8130 0601 VSM2 dual PMC carrier
8131 0710 VS14x series PowerPC PCI board
8132 0720 VS24x series PowerPC PCI board
8133# found e.g. on KNC DVB-S card
81341894 KNC One
81351896 B&B Electronics Manufacturing Company, Inc.
813618a1 Astute Networks Inc.
813718ac DViCO Corporation
8138 d810 FusionHDTV 3 Gold
813918b8 Ammasso
8140 b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor
814118bc Info-Tek Corp.
8142# assigned to Octigabay System, which has been acquired by Cray
814318c8 Cray Inc
814418c9 ARVOO Engineering BV
814518ca XGI - Xabre Graphics Inc
8146 0040 Volari V8
814718e6 MPL AG
8148 0001 OSCI [Octal Serial Communication Interface]
814918f7 Commtech, Inc.
8150 0001 Fastcom ESCC-PCI-335
8151 0002 Fastcom 422/4-PCI-335
8152 0004 Fastcom 422/2-PCI-335
8153 0005 Fastcom IGESCC-PCI-ISO/1
8154 000a Fastcom 232/4-PCI-335
815518fb Resilience Corporation
81561924 Level 5 Networks Inc.
81571966 Orad Hi-Tec Systems
8158 1975 DVG64 family
81591993 Innominate Security Technologies AG
8160# http://www.progeny.net
816119ae Progeny Systems Corporation
81621a08 Sierra semiconductor
8163 0000 SC15064
81641b13 Jaton Corp
81651c1c Symphony
8166 0001 82C101
81671d44 DPT
8168 a400 PM2x24/PM3224
81691de1 Tekram Technology Co.,Ltd.
8170 0391 TRM-S1040
8171 2020 DC-390
8172 690c 690c
8173 dc29 DC290
81741fc0 Tumsan Oy
8175 0300 E2200 Dual E1/Rawpipe Card
81762000 Smart Link Ltd.
81772001 Temporal Research Ltd
81782003 Smart Link Ltd.
81792004 Smart Link Ltd.
818021c3 21st Century Computer Corp.
81812348 Racore
8182 2010 8142 100VG/AnyLAN
81832646 Kingston Technologies
8184270b Xantel Corporation
8185270f Chaintech Computer Co. Ltd
81862711 AVID Technology Inc.
81872a15 3D Vision(???)
81883000 Hansol Electronics Inc.
81893142 Post Impression Systems.
81903388 Hint Corp
8191 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller
8192 0014 HiNT HC4 PCI to ISDN bridge, Network controller
8193 0020 HB6 Universal PCI-PCI bridge (transparent mode)
8194 0021 HB6 Universal PCI-PCI bridge (non-transparent mode)
8195 4c53 1050 CT7 mainboard
8196 4c53 1080 CT8 mainboard
8197 4c53 10a0 CA3/CR3 mainboard
8198 4c53 3010 PPCI mezzanine (32-bit PMC)
8199 4c53 3011 PPCI mezzanine (64-bit PMC)
8200 0022 HiNT HB4 PCI-PCI Bridge (PCI6150)
8201 0026 HB2 PCI-PCI Bridge
8202 101a E.Band [AudioTrak Inca88]
8203 101b E.Band [AudioTrak Inca88]
8204 8011 VXPro II Chipset
8205 3388 8011 VXPro II Chipset CPU to PCI Bridge
8206 8012 VXPro II Chipset
8207 3388 8012 VXPro II Chipset PCI to ISA Bridge
8208 8013 VXPro II IDE
8209 3388 8013 VXPro II Chipset EIDE Controller
82103411 Quantum Designs (H.K.) Inc
82113513 ARCOM Control Systems Ltd
82123842 eVga.com. Corp.
821338ef 4Links
82143d3d 3DLabs
8215 0001 GLINT 300SX
8216 0002 GLINT 500TX
8217 0003 GLINT Delta
8218 0004 Permedia
8219 0005 Permedia
8220 0006 GLINT MX
8221 0007 3D Extreme
8222 0008 GLINT Gamma G1
8223 0009 Permedia II 2D+3D
8224 1040 0011 AccelStar II
8225 13e9 1000 6221L-4U
8226 3d3d 0100 AccelStar II 3D Accelerator
8227 3d3d 0111 Permedia 3:16
8228 3d3d 0114 Santa Ana
8229 3d3d 0116 Oxygen GVX1
8230 3d3d 0119 Scirocco
8231 3d3d 0120 Santa Ana PCL
8232 3d3d 0125 Oxygen VX1
8233 3d3d 0127 Permedia3 Create!
8234 000a GLINT R3
8235 3d3d 0121 Oxygen VX1
8236 000c GLINT R3 [Oxygen VX1]
8237 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4]
8238 000d GLint R4 rev A
8239 0011 GLint R4 rev B
8240 0012 GLint R5 rev A
8241 0013 GLint R5 rev B
8242 0020 VP10 visual processor
8243# P10 generic II
8244 0022 VP10 visual processor
8245 0024 VP9 visual processor
8246 0100 Permedia II 2D+3D
8247 07a1 Wildcat III 6210
8248 07a2 Sun XVR-500 Graphics Accelerator
8249 07a3 Wildcat IV 7210
8250 1004 Permedia
8251 3d04 Permedia
8252 ffff Glint VGA
82534005 Avance Logic Inc.
8254 0300 ALS300 PCI Audio Device
8255 0308 ALS300+ PCI Audio Device
8256 0309 PCI Input Controller
8257 1064 ALG-2064
8258 2064 ALG-2064i
8259 2128 ALG-2364A GUI Accelerator
8260 2301 ALG-2301
8261 2302 ALG-2302
8262 2303 AVG-2302 GUI Accelerator
8263 2364 ALG-2364A
8264 2464 ALG-2464
8265 2501 ALG-2564A/25128A
8266 4000 ALS4000 Audio Chipset
8267 4005 4000 ALS4000 Audio Chipset
8268 4710 ALC200/200P
82694033 Addtron Technology Co, Inc.
8270 1360 RTL8139 Ethernet
82714143 Digital Equipment Corp
82724144 Alpha Data
8273 0044 ADM-XRCIIPro
8274416c Aladdin Knowledge Systems
8275 0100 AladdinCARD
8276 0200 CPC
82774444 Internext Compression Inc
8278 0016 iTVC16 (CX23416) MPEG-2 Encoder
8279 0070 4009 WinTV PVR 250
8280 0070 8003 WinTV PVR 150
8281 0803 iTVC15 MPEG-2 Encoder
8282 0070 4000 WinTV PVR-350
8283 0070 4001 WinTV PVR-250
8284# video capture card
8285 1461 a3cf M179
82864468 Bridgeport machines
82874594 Cogetec Informatique Inc
828845fb Baldor Electric Company
82894680 Umax Computer Corp
82904843 Hercules Computer Technology Inc
82914916 RedCreek Communications Inc
8292 1960 RedCreek PCI adapter
82934943 Growth Networks
8294494f ACCES I/O Products, Inc.
8295 10e8 LPCI-COM-8SM
82964978 Axil Computer Inc
82974a14 NetVin
8298 5000 NV5000SC
8299 4a14 5000 RT8029-Based Ethernet Adapter
83004b10 Buslogic Inc.
83014c48 LUNG HWA Electronics
83024c53 SBS Technologies
8303 0000 PLUSTEST device
8304 4c53 3000 PLUSTEST card (PC104+)
8305 4c53 3001 PLUSTEST card (PMC)
8306 0001 PLUSTEST-MM device
8307 4c53 3002 PLUSTEST-MM card (PMC)
83084ca1 Seanix Technology Inc
83094d51 MediaQ Inc.
8310 0200 MQ-200
83114d54 Microtechnica Co Ltd
83124ddc ILC Data Device Corp
8313 0100 DD-42924I5-300 (ARINC 429 Data Bus)
8314 0801 BU-65570I1 MIL-STD-1553 Test and Simulation
8315 0802 BU-65570I2 MIL-STD-1553 Test and Simulation
8316 0811 BU-65572I1 MIL-STD-1553 Test and Simulation
8317 0812 BU-65572I2 MIL-STD-1553 Test and Simulation
8318 0881 BU-65570T1 MIL-STD-1553 Test and Simulation
8319 0882 BU-65570T2 MIL-STD-1553 Test and Simulation
8320 0891 BU-65572T1 MIL-STD-1553 Test and Simulation
8321 0892 BU-65572T2 MIL-STD-1553 Test and Simulation
8322 0901 BU-65565C1 MIL-STD-1553 Data Bus
8323 0902 BU-65565C2 MIL-STD-1553 Data Bus
8324 0903 BU-65565C3 MIL-STD-1553 Data Bus
8325 0904 BU-65565C4 MIL-STD-1553 Data Bus
8326 0b01 BU-65569I1 MIL-STD-1553 Data Bus
8327 0b02 BU-65569I2 MIL-STD-1553 Data Bus
8328 0b03 BU-65569I3 MIL-STD-1553 Data Bus
8329 0b04 BU-65569I4 MIL-STD-1553 Data Bus
83305046 GemTek Technology Corporation
8331 1001 PCI Radio
83325053 Voyetra Technologies
8333 2010 Daytona Audio Adapter
83345136 S S Technologies
83355143 Qualcomm Inc
83365145 Ensoniq (Old)
8337 3031 Concert AudioPCI
83385168 Animation Technologies Inc.
83395301 Alliance Semiconductor Corp.
8340 0001 ProMotion aT3D
83415333 S3 Inc.
8342 0551 Plato/PX (system)
8343 5631 86c325 [ViRGE]
8344 8800 86c866 [Vision 866]
8345 8801 86c964 [Vision 964]
8346 8810 86c764_0 [Trio 32 vers 0]
8347 8811 86c764/765 [Trio32/64/64V+]
8348 8812 86cM65 [Aurora64V+]
8349 8813 86c764_3 [Trio 32/64 vers 3]
8350 8814 86c767 [Trio 64UV+]
8351 8815 86cM65 [Aurora 128]
8352 883d 86c988 [ViRGE/VX]
8353 8870 FireGL
8354 8880 86c868 [Vision 868 VRAM] vers 0
8355 8881 86c868 [Vision 868 VRAM] vers 1
8356 8882 86c868 [Vision 868 VRAM] vers 2
8357 8883 86c868 [Vision 868 VRAM] vers 3
8358 88b0 86c928 [Vision 928 VRAM] vers 0
8359 88b1 86c928 [Vision 928 VRAM] vers 1
8360 88b2 86c928 [Vision 928 VRAM] vers 2
8361 88b3 86c928 [Vision 928 VRAM] vers 3
8362 88c0 86c864 [Vision 864 DRAM] vers 0
8363 88c1 86c864 [Vision 864 DRAM] vers 1
8364 88c2 86c864 [Vision 864-P DRAM] vers 2
8365 88c3 86c864 [Vision 864-P DRAM] vers 3
8366 88d0 86c964 [Vision 964 VRAM] vers 0
8367 88d1 86c964 [Vision 964 VRAM] vers 1
8368 88d2 86c964 [Vision 964-P VRAM] vers 2
8369 88d3 86c964 [Vision 964-P VRAM] vers 3
8370 88f0 86c968 [Vision 968 VRAM] rev 0
8371 88f1 86c968 [Vision 968 VRAM] rev 1
8372 88f2 86c968 [Vision 968 VRAM] rev 2
8373 88f3 86c968 [Vision 968 VRAM] rev 3
8374 8900 86c755 [Trio 64V2/DX]
8375 5333 8900 86C775 Trio64V2/DX
8376 8901 86c775/86c785 [Trio 64V2/DX or /GX]
8377 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX
8378 8902 Plato/PX
8379 8903 Trio 3D business multimedia
8380 8904 Trio 64 3D
8381 1014 00db Integrated Trio3D
8382 5333 8904 86C365 Trio3D AGP
8383 8905 Trio 64V+ family
8384 8906 Trio 64V+ family
8385 8907 Trio 64V+ family
8386 8908 Trio 64V+ family
8387 8909 Trio 64V+ family
8388 890a Trio 64V+ family
8389 890b Trio 64V+ family
8390 890c Trio 64V+ family
8391 890d Trio 64V+ family
8392 890e Trio 64V+ family
8393 890f Trio 64V+ family
8394 8a01 ViRGE/DX or /GX
8395 0e11 b032 ViRGE/GX
8396 10b4 1617 Nitro 3D
8397 10b4 1717 Nitro 3D
8398 5333 8a01 ViRGE/DX
8399 8a10 ViRGE/GX2
8400 1092 8a10 Stealth 3D 4000
8401 8a13 86c368 [Trio 3D/2X]
8402 5333 8a13 Trio3D/2X
8403 8a20 86c794 [Savage 3D]
8404 5333 8a20 86C391 Savage3D
8405 8a21 86c390 [Savage 3D/MV]
8406 5333 8a21 86C390 Savage3D/MV
8407 8a22 Savage 4
8408 1033 8068 Savage 4
8409 1033 8069 Savage 4
8410 1033 8110 Savage4 LT
8411 105d 0018 SR9 8Mb SDRAM
8412 105d 002a SR9 Pro 16Mb SDRAM
8413 105d 003a SR9 Pro 32Mb SDRAM
8414 105d 092f SR9 Pro+ 16Mb SGRAM
8415 1092 4207 Stealth III S540
8416 1092 4800 Stealth III S540
8417 1092 4807 SpeedStar A90
8418 1092 4808 Stealth III S540
8419 1092 4809 Stealth III S540
8420 1092 480e Stealth III S540
8421 1092 4904 Stealth III S520
8422 1092 4905 SpeedStar A200
8423 1092 4a09 Stealth III S540
8424 1092 4a0b Stealth III S540 Xtreme
8425 1092 4a0f Stealth III S540
8426 1092 4e01 Stealth III S540
8427 1102 101d 3d Blaster Savage 4
8428 1102 101e 3d Blaster Savage 4
8429 5333 8100 86C394-397 Savage4 SDRAM 100
8430 5333 8110 86C394-397 Savage4 SDRAM 110
8431 5333 8125 86C394-397 Savage4 SDRAM 125
8432 5333 8143 86C394-397 Savage4 SDRAM 143
8433 5333 8a22 86C394-397 Savage4
8434 5333 8a2e 86C394-397 Savage4 32bit
8435 5333 9125 86C394-397 Savage4 SGRAM 125
8436 5333 9143 86C394-397 Savage4 SGRAM 143
8437 8a23 Savage 4
8438 8a25 ProSavage PM133
8439 8a26 ProSavage KM133
8440 8c00 ViRGE/M3
8441 8c01 ViRGE/MX
8442 1179 0001 ViRGE/MX
8443 8c02 ViRGE/MX+
8444 8c03 ViRGE/MX+MV
8445 8c10 86C270-294 Savage/MX-MV
8446 8c11 82C270-294 Savage/MX
8447 8c12 86C270-294 Savage/IX-MV
8448 1014 017f ThinkPad T20
8449 1179 0001 86C584 SuperSavage/IXC Toshiba
8450 8c13 86C270-294 Savage/IX
8451 1179 0001 Magnia Z310
8452 8c22 SuperSavage MX/128
8453 8c24 SuperSavage MX/64
8454 8c26 SuperSavage MX/64C
8455 8c2a SuperSavage IX/128 SDR
8456 8c2b SuperSavage IX/128 DDR
8457 8c2c SuperSavage IX/64 SDR
8458 8c2d SuperSavage IX/64 DDR
8459 8c2e SuperSavage IX/C SDR
8460 1014 01fc ThinkPad T23 (2647-4MG)
8461 8c2f SuperSavage IX/C DDR
8462 8d01 86C380 [ProSavageDDR K4M266]
8463 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)
8464 8d03 VT8751 [ProSavageDDR P4M266]
8465 8d04 VT8375 [ProSavage8 KM266/KL266]
8466 9102 86C410 Savage 2000
8467 1092 5932 Viper II Z200
8468 1092 5934 Viper II Z200
8469 1092 5952 Viper II Z200
8470 1092 5954 Viper II Z200
8471 1092 5a35 Viper II Z200
8472 1092 5a37 Viper II Z200
8473 1092 5a55 Viper II Z200
8474 1092 5a57 Viper II Z200
8475 ca00 SonicVibes
8476544c Teralogic Inc
8477 0350 TL880-based HDTV/ATSC tuner
84785455 Technische University Berlin
8479 4458 S5933
84805519 Cnet Technologies, Inc.
84815544 Dunord Technologies
8482 0001 I-30xx Scanner Interface
84835555 Genroco, Inc
8484 0003 TURBOstor HFP-832 [HiPPI NIC]
84855654 VoiceTronix Pty Ltd
8486 3132 OpenSwitch12
84875700 Netpower
84885851 Exacq Technologies
84896356 UltraStor
84906374 c't Magazin für Computertechnik
8491 6773 GPPCI
84926409 Logitec Corp.
84936666 Decision Computer International Co.
8494 0001 PCCOM4
8495 0002 PCCOM8
84967604 O.N. Electronic Co Ltd.
84977bde MIDAC Corporation
84987fed PowerTV
84998008 Quancom Electronic GmbH
8500 0010 WDOG1 [PCI-Watchdog 1]
8501 0011 PWDOG2 [PCI-Watchdog 2]
8502# Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card.
8503807d Asustek Computer, Inc.
85048086 Intel Corporation
8505 0007 82379AB
8506 0008 Extended Express System Support Controller
8507 0008 1000 WorldMark 4300 INCA ASIC
8508 0039 21145 Fast Ethernet
8509 0122 82437FX
8510 0309 80303 I/O Processor PCI-to-PCI Bridge
8511 030d 80312 I/O Companion Chip PCI-to-PCI Bridge
8512 0326 6700/6702PXH I/OxAPIC Interrupt Controller A
8513 0327 6700PXH I/OxAPIC Interrupt Controller B
8514 0329 6700PXH PCI Express-to-PCI Bridge A
8515 032a 6700PXH PCI Express-to-PCI Bridge B
8516 032c 6702PXH PCI Express-to-PCI Bridge A
8517# A-segment bridge
8518 0330 80332 [Dobson] I/O processor
8519# A-segment IOAPIC
8520 0331 80332 [Dobson] I/O processor
8521# B-segment bridge
8522 0332 80332 [Dobson] I/O processor
8523# B-segment IOAPIC
8524 0333 80332 [Dobson] I/O processor
8525# Address Translation Unit (ATU)
8526 0334 80332 [Dobson] I/O processor
8527# PCI-X bridge
8528 0335 80331 [Lindsay] I/O processor
8529# Address Translation Unit (ATU)
8530 0336 80331 [Lindsay] I/O processor
8531# A-segment bridge
8532 0340 41210 [Lanai] Serial to Parallel PCI Bridge
8533# B-segment bridge
8534 0341 41210 [Lanai] Serial to Parallel PCI Bridge
8535 0482 82375EB/SB PCI to EISA Bridge
8536 0483 82424TX/ZX [Saturn] CPU to PCI bridge
8537 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge
8538 0486 82425EX/ZX [Aries] PCIset with ISA bridge
8539 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge
8540 04d0 82437FX [Triton FX]
8541 0500 E8870 Processor bus control
8542 0501 E8870 Memory controller
8543# and registers common to both SPs
8544 0502 E8870 Scalability Port 0
8545# and global performance monitoring
8546 0503 E8870 Scalability Port 1
8547 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port)
8548 0511 E8870IO Hub Interface Port 1 registers
8549 0512 E8870IO Hub Interface Port 2 registers
8550 0513 E8870IO Hub Interface Port 3 registers
8551 0514 E8870IO Hub Interface Port 4 registers
8552 0515 E8870IO General SIOH registers
8553 0516 E8870IO RAS registers
8554 0530 E8870SP Scalability Port 0 registers
8555 0531 E8870SP Scalability Port 1 registers
8556 0532 E8870SP Scalability Port 2 registers
8557 0533 E8870SP Scalability Port 3 registers
8558 0534 E8870SP Scalability Port 4 registers
8559 0535 E8870SP Scalability Port 5 registers
8560# (bi-interleave 0) and global registers that are neither per-port nor per-interleave
8561 0536 E8870SP Interleave registers 0 and 1
8562# (bi-interleave 1)
8563 0537 E8870SP Interleave registers 2 and 3
8564 0600 RAID Controller
8565 8086 01c1 ICP Vortex GDT8546RZ
8566 8086 01f7 SCRU32
8567# uninitialized SRCU32 RAID Controller
8568 061f 80303 I/O Processor
8569 0960 80960RP [i960 RP Microprocessor/Bridge]
8570 0962 80960RM [i960RM Bridge]
8571 0964 80960RP [i960 RP Microprocessor/Bridge]
8572 1000 82542 Gigabit Ethernet Controller
8573 0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX)
8574 0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX)
8575 0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX)
8576 1014 0119 Netfinity Gigabit Ethernet SX Adapter
8577 8086 1000 PRO/1000 Gigabit Server Adapter
8578 1001 82543GC Gigabit Ethernet Controller (Fiber)
8579 0e11 004a NC6136 Gigabit Server Adapter
8580 1014 01ea Netfinity Gigabit Ethernet SX Adapter
8581 8086 1002 PRO/1000 F Server Adapter
8582 8086 1003 PRO/1000 F Server Adapter
8583 1002 Pro 100 LAN+Modem 56 Cardbus II
8584 8086 200e Pro 100 LAN+Modem 56 Cardbus II
8585 8086 2013 Pro 100 SR Mobile Combo Adapter
8586 8086 2017 Pro 100 S Combo Mobile Adapter
8587 1004 82543GC Gigabit Ethernet Controller (Copper)
8588 0e11 0049 NC7132 Gigabit Upgrade Module
8589 0e11 b1a4 NC7131 Gigabit Server Adapter
8590 1014 10f2 Gigabit Ethernet Server Adapter
8591 8086 1004 PRO/1000 T Server Adapter
8592 8086 2004 PRO/1000 T Server Adapter
8593 1008 82544EI Gigabit Ethernet Controller (Copper)
8594 1014 0269 iSeries 1000/100/10 Ethernet Adapter
8595 1028 011c PRO/1000 XT Network Connection
8596 8086 1107 PRO/1000 XT Server Adapter
8597 8086 2107 PRO/1000 XT Server Adapter
8598 8086 2110 PRO/1000 XT Server Adapter
8599 8086 3108 PRO/1000 XT Network Connection
8600 1009 82544EI Gigabit Ethernet Controller (Fiber)
8601 1014 0268 iSeries Gigabit Ethernet Adapter
8602 8086 1109 PRO/1000 XF Server Adapter
8603 8086 2109 PRO/1000 XF Server Adapter
8604 100c 82544GC Gigabit Ethernet Controller (Copper)
8605 8086 1112 PRO/1000 T Desktop Adapter
8606 8086 2112 PRO/1000 T Desktop Adapter
8607 100d 82544GC Gigabit Ethernet Controller (LOM)
8608 1028 0123 PRO/1000 XT Network Connection
8609 1079 891f 82544GC Based Network Connection
8610 4c53 1080 CT8 mainboard
8611 8086 110d 82544GC Based Network Connection
8612 100e 82540EM Gigabit Ethernet Controller
8613 1014 0265 PRO/1000 MT Network Connection
8614 1014 0267 PRO/1000 MT Network Connection
8615 1014 026a PRO/1000 MT Network Connection
8616 1028 002e Optiplex GX260
8617 1028 0151 PRO/1000 MT Network Connection
8618 107b 8920 PRO/1000 MT Desktop Adapter
8619 8086 001e PRO/1000 MT Desktop Adapter
8620 8086 002e PRO/1000 MT Desktop Adapter
8621 100f 82545EM Gigabit Ethernet Controller (Copper)
8622 1014 0269 iSeries 1000/100/10 Ethernet Adapter
8623 1014 028e PRO/1000 MT Network Connection
8624 8086 1000 PRO/1000 MT Network Connection
8625 8086 1001 PRO/1000 MT Server Adapter
8626 1010 82546EB Gigabit Ethernet Controller (Copper)
8627 1014 027c PRO/1000 MT Dual Port Network Adapter
8628 18fb 7872 RESlink-X
8629 4c53 1080 CT8 mainboard
8630 4c53 10a0 CA3/CR3 mainboard
8631 8086 1011 PRO/1000 MT Dual Port Server Adapter
8632 8086 101a PRO/1000 MT Dual Port Network Adapter
8633 8086 3424 SE7501HG2 Mainboard
8634 1011 82545EM Gigabit Ethernet Controller (Fiber)
8635 1014 0268 iSeries Gigabit Ethernet Adapter
8636 8086 1002 PRO/1000 MF Server Adapter
8637 8086 1003 PRO/1000 MF Server Adapter (LX)
8638 1012 82546EB Gigabit Ethernet Controller (Fiber)
8639 8086 1012 PRO/1000 MF Dual Port Server Adapter
8640 1013 82541EI Gigabit Ethernet Controller (Copper)
8641 8086 0013 PRO/1000 MT Network Connection
8642 8086 1013 IBM ThinkCentre Network Card
8643 8086 1113 PRO/1000 MT Desktop Adapter
8644 1014 82541ER Gigabit Ethernet Controller
8645 1015 82540EM Gigabit Ethernet Controller (LOM)
8646 1016 82540EP Gigabit Ethernet Controller (LOM)
8647 1014 052c PRO/1000 MT Mobile Connection
8648 1179 0001 PRO/1000 MT Mobile Connection
8649 8086 1016 PRO/1000 MT Mobile Connection
8650 1017 82540EP Gigabit Ethernet Controller (LOM)
8651 8086 1017 PR0/1000 MT Desktop Connection
8652# Update controller name from 82541EP to 82541EI
8653 1018 82541EI Gigabit Ethernet Controller
8654 8086 1018 PRO/1000 MT Desktop Adapter
8655 1019 82547EI Gigabit Ethernet Controller (LOM)
8656 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE)
8657 1458 e000 Intel Gigabit Ethernet (Kenai II)
8658 8086 1019 PRO/1000 CT Desktop Connection
8659 8086 301f D865PERL mainboard
8660 8086 3427 S875WP1-E mainboard
8661 101d 82546EB Gigabit Ethernet Controller
8662 8086 1000 PRO/1000 MT Quad Port Server Adapter
8663 101e 82540EP Gigabit Ethernet Controller (Mobile)
8664 1014 0549 PRO/1000 MT Mobile Connection
8665 1179 0001 PRO/1000 MT Mobile Connection
8666 8086 101e PRO/1000 MT Mobile Connection
8667 1026 82545GM Gigabit Ethernet Controller
8668 8086 1000 PRO/1000 MT Server Connection
8669 8086 1001 PRO/1000 MT Server Adapter
8670 8086 1002 PRO/1000 MT Server Adapter
8671 8086 1026 PRO/1000 MT Server Connection
8672 1027 82545GM Gigabit Ethernet Controller
8673 8086 1001 PRO/1000 MF Server Adapter(LX)
8674 8086 1002 PRO/1000 MF Server Adapter(LX)
8675 8086 1003 PRO/1000 MF Server Adapter(LX)
8676 8086 1027 PRO/1000 MF Server Adapter
8677 1028 82545GM Gigabit Ethernet Controller
8678 8086 1028 PRO/1000 MB Server Adapter
8679 1029 82559 Ethernet Controller
8680 1030 82559 InBusiness 10/100
8681 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller
8682 1014 0209 ThinkPad A/T/X Series
8683 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
8684 107b 5350 EtherExpress PRO/100 VE
8685 1179 0001 EtherExpress PRO/100 VE
8686 144d c000 EtherExpress PRO/100 VE
8687 144d c001 EtherExpress PRO/100 VE
8688 144d c003 EtherExpress PRO/100 VE
8689 144d c006 vpr Matrix 170B4
8690 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller
8691 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller
8692 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller
8693 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller
8694 1036 82801CAM (ICH3) 82562EH Ethernet Controller
8695 1037 82801CAM (ICH3) Chipset Ethernet Controller
8696 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller
8697 1039 82801DB PRO/100 VE (LOM) Ethernet Controller
8698 1014 0267 NetVista A30p
8699 103a 82801DB PRO/100 VE (CNR) Ethernet Controller
8700 103b 82801DB PRO/100 VM (LOM) Ethernet Controller
8701 103c 82801DB PRO/100 VM (CNR) Ethernet Controller
8702 103d 82801DB PRO/100 VE (MOB) Ethernet Controller
8703 103e 82801DB PRO/100 VM (MOB) Ethernet Controller
8704 1040 536EP Data Fax Modem
8705 16be 1040 V.9X DSP Data Fax Modem
8706 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter
8707 8086 2527 MIM2000/Centrino
8708 1048 PRO/10GbE LR Server Adapter
8709 8086 a01f PRO/10GbE LR Server Adapter
8710 8086 a11f PRO/10GbE LR Server Adapter
8711 1050 82562EZ 10/100 Ethernet Controller
8712 1462 728c 865PE Neo2 (MS-6728)
8713 1462 758c MS-6758 (875P Neo)
8714 8086 3020 D865PERL mainboard
8715 8086 3427 S875WP1-E mainboard
8716 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller
8717 1059 82551QM Ethernet Controller
8718# ICH-6 Component
8719 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller
8720# ICH-6 Component
8721 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller
8722# ICH-6 Component
8723 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller
8724# ICH-6 Component
8725 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller
8726# ICH-6 Component
8727 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile
8728# ICH-6 Component
8729 1069 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile
8730# ICH-6 Component
8731 106a 82562G \t- PRO/100 VE (LOM) Ethernet Controller
8732# ICH-6 Component
8733 106b 82562G \t- PRO/100 VE Ethernet Controller Mobile
8734 1075 82547GI Gigabit Ethernet Controller
8735 1028 0165 PowerEdge 750
8736 8086 0075 PRO/1000 CT Network Connection
8737 8086 1075 PRO/1000 CT Network Connection
8738 1076 82541GI/PI Gigabit Ethernet Controller
8739 1028 0165 PowerEdge 750
8740 8086 0076 PRO/1000 MT Network Connection
8741 8086 1076 PRO/1000 MT Network Connection
8742 8086 1176 PRO/1000 MT Desktop Adapter
8743 8086 1276 PRO/1000 MT Desktop Adapter
8744 1077 82541GI Gigabit Ethernet Controller
8745 1179 0001 PRO/1000 MT Mobile Connection
8746 8086 0077 PRO/1000 MT Mobile Connection
8747 8086 1077 PRO/1000 MT Mobile Connection
8748 1078 82541EI Gigabit Ethernet Controller
8749 8086 1078 PRO/1000 MT Network Connection
8750 1079 82546GB Gigabit Ethernet Controller
8751 103c 12a6 HP Dual Port 1000Base-T [A9900A]
8752 103c 12cf HP Core Dual Port 1000Base-T [AB352A]
8753 4c53 1090 Cx9 / Vx9 mainboard
8754 4c53 10b0 CL9 mainboard
8755 8086 0079 PRO/1000 MT Dual Port Network Connection
8756 8086 1079 PRO/1000 MT Dual Port Network Connection
8757 8086 1179 PRO/1000 MT Dual Port Network Connection
8758 8086 117a PRO/1000 MT Dual Port Server Adapter
8759 107a 82546GB Gigabit Ethernet Controller
8760 103c 12a8 HP Dual Port 1000base-SX [A9899A]
8761 8086 107a PRO/1000 MF Dual Port Server Adapter
8762 8086 127a PRO/1000 MF Dual Port Server Adapter
8763 107b 82546GB Gigabit Ethernet Controller
8764 8086 007b PRO/1000 MB Dual Port Server Connection
8765 8086 107b PRO/1000 MB Dual Port Server Connection
8766 1107 PRO/1000 MF Server Adapter (LX)
8767 1130 82815 815 Chipset Host Bridge and Memory Controller Hub
8768 1025 1016 Travelmate 612 TX
8769 1043 8027 TUSL2-C Mainboard
8770 104d 80df Vaio PCG-FX403
8771 8086 4532 D815EEA2 mainboard
8772 8086 4557 D815EGEW Mainboard
8773 1131 82815 815 Chipset AGP Bridge
8774 1132 82815 CGC [Chipset Graphics Controller]
8775 1025 1016 Travelmate 612 TX
8776 104d 80df Vaio PCG-FX403
8777 8086 4532 D815EEA2 Mainboard
8778 8086 4557 D815EGEW Mainboard
8779 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
8780 8086 1161 82806AA PCI64 Hub APIC
8781 1162 Xscale 80200 Big Endian Companion Chip
8782 1200 Intel IXP1200 Network Processor
8783 172a 0000 AEP SSL Accelerator
8784 1209 8255xER/82551IT Fast Ethernet Controller
8785 4c53 1050 CT7 mainboard
8786 4c53 1051 CE7 mainboard
8787 4c53 1070 PC6 mainboard
8788 1221 82092AA PCI to PCMCIA Bridge
8789 1222 82092AA IDE Controller
8790 1223 SAA7116
8791 1225 82452KX/GX [Orion]
8792 1226 82596 PRO/10 PCI
8793 1227 82865 EtherExpress PRO/100A
8794 1228 82556 EtherExpress PRO/100 Smart
8795# the revision field differentiates between them (1-3 is 82557, 4-5 is 82558, 6-8 is 82559, 9 is 82559ER)
8796 1229 82557/8/9 [Ethernet Pro 100]
8797 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN*
8798 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN*
8799 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN*
8800 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN*
8801 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN*
8802 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN*
8803 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN*
8804 0e11 b01e NC3120 Fast Ethernet NIC
8805 0e11 b01f NC3122 Fast Ethernet NIC (dual port)
8806 0e11 b02f NC1120 Ethernet NIC
8807 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN
8808 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL)
8809 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded)
8810 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL)
8811 0e11 b0dd NC3131 Fast Ethernet NIC (dual port)
8812 0e11 b0de NC3132 Fast Ethernet Module (dual port)
8813 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX)
8814 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL)
8815 0e11 b13c NC3162 Fast Ethernet NIC (embedded)
8816 0e11 b144 NC3123 Fast Ethernet NIC (WOL)
8817 0e11 b163 NC3134 Fast Ethernet NIC (dual port)
8818 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port)
8819 0e11 b1a4 NC7131 Gigabit Server Adapter
8820 1014 005c 82558B Ethernet Pro 10/100
8821 1014 01bc 82559 Fast Ethernet LAN On Motherboard
8822 1014 01f1 10/100 Ethernet Server Adapter
8823 1014 01f2 10/100 Ethernet Server Adapter
8824 1014 0207 Ethernet Pro/100 S
8825 1014 0232 10/100 Dual Port Server Adapter
8826 1014 023a ThinkPad R30
8827 1014 105c Netfinity 10/100
8828 1014 2205 ThinkPad A22p
8829 1014 305c 10/100 EtherJet Management Adapter
8830 1014 405c 10/100 EtherJet Adapter with Alert on LAN
8831 1014 505c 10/100 EtherJet Secure Management Adapter
8832 1014 605c 10/100 EtherJet Secure Management Adapter
8833 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter
8834 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter
8835 1028 009b PowerEdge 2500/2550
8836 1028 00ce PowerEdge 1400
8837 1033 8000 PC-9821X-B06
8838 1033 8016 PK-UG-X006
8839 1033 801f PK-UG-X006
8840 1033 8026 PK-UG-X006
8841 1033 8063 82559-based Fast Ethernet Adapter
8842 1033 8064 82559-based Fast Ethernet Adapter
8843 103c 10c0 NetServer 10/100TX
8844 103c 10c3 NetServer 10/100TX
8845 103c 10ca NetServer 10/100TX
8846 103c 10cb NetServer 10/100TX
8847 103c 10e3 NetServer 10/100TX
8848 103c 10e4 NetServer 10/100TX
8849 103c 1200 NetServer 10/100TX
8850 10c3 1100 SmartEther100 SC1100
8851 10cf 1115 8255x-based Ethernet Adapter (10/100)
8852 10cf 1143 8255x-based Ethernet Adapter (10/100)
8853 1179 0001 8255x-based Ethernet Adapter (10/100)
8854 1179 0002 PCI FastEther LAN on Docker
8855 1179 0003 8255x-based Fast Ethernet
8856 1259 2560 AT-2560 100
8857 1259 2561 AT-2560 100 FX Ethernet Adapter
8858 1266 0001 NE10/100 Adapter
8859 13e9 1000 6221L-4U
8860 144d 2501 SEM-2000 MiniPCI LAN Adapter
8861 144d 2502 SEM-2100IL MiniPCI LAN Adapter
8862 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)
8863 4c53 1080 CT8 mainboard
8864 8086 0001 EtherExpress PRO/100B (TX)
8865 8086 0002 EtherExpress PRO/100B (T4)
8866 8086 0003 EtherExpress PRO/10+
8867 8086 0004 EtherExpress PRO/100 WfM
8868 8086 0005 82557 10/100
8869 8086 0006 82557 10/100 with Wake on LAN
8870 8086 0007 82558 10/100 Adapter
8871 8086 0008 82558 10/100 with Wake on LAN
8872 8086 0009 EtherExpress PRO/100+
8873 8086 000a EtherExpress PRO/100+ Management Adapter
8874 8086 000b EtherExpress PRO/100+
8875 8086 000c EtherExpress PRO/100+ Management Adapter
8876 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter
8877 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN*
8878 8086 000f EtherExpress PRO/100 Desktop Adapter
8879 8086 0010 EtherExpress PRO/100 S Management Adapter
8880 8086 0011 EtherExpress PRO/100 S Management Adapter
8881 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D)
8882 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E)
8883 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC
8884 8086 0031 EtherExpress PRO/100 Desktop Adapter
8885 8086 0040 EtherExpress PRO/100 S Desktop Adapter
8886 8086 0041 EtherExpress PRO/100 S Desktop Adapter
8887 8086 0042 EtherExpress PRO/100 Desktop Adapter
8888 8086 0050 EtherExpress PRO/100 S Desktop Adapter
8889 8086 1009 EtherExpress PRO/100+ Server Adapter
8890 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B)
8891 8086 1012 EtherExpress PRO/100 S Server Adapter (D)
8892 8086 1013 EtherExpress PRO/100 S Server Adapter (E)
8893 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter
8894 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter
8895 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server
8896 8086 1040 EtherExpress PRO/100 S Server Adapter
8897 8086 1041 EtherExpress PRO/100 S Server Adapter
8898 8086 1042 EtherExpress PRO/100 Server Adapter
8899 8086 1050 EtherExpress PRO/100 S Server Adapter
8900 8086 1051 EtherExpress PRO/100 Server Adapter
8901 8086 1052 EtherExpress PRO/100 Server Adapter
8902 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter
8903 8086 2009 EtherExpress PRO/100 S Mobile Adapter
8904 8086 200d EtherExpress PRO/100 Cardbus
8905 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem
8906 8086 200f EtherExpress PRO/100 SR Mobile Adapter
8907 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter
8908 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter
8909 8086 2016 EtherExpress PRO/100 S Mobile Adapter
8910 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter
8911 8086 2018 EtherExpress PRO/100 SR Mobile Adapter
8912 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter
8913 8086 2101 EtherExpress PRO/100 P Mobile Adapter
8914 8086 2102 EtherExpress PRO/100 SP Mobile Adapter
8915 8086 2103 EtherExpress PRO/100 SP Mobile Adapter
8916 8086 2104 EtherExpress PRO/100 SP Mobile Adapter
8917 8086 2105 EtherExpress PRO/100 SP Mobile Adapter
8918 8086 2106 EtherExpress PRO/100 P Mobile Adapter
8919 8086 2107 EtherExpress PRO/100 Network Connection
8920 8086 2108 EtherExpress PRO/100 Network Connection
8921 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter
8922 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter
8923 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter
8924 8086 2203 EtherExpress PRO/100+ MiniPCI
8925 8086 2204 EtherExpress PRO/100+ MiniPCI
8926 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter
8927 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter
8928 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter
8929 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter
8930 8086 2402 EtherExpress PRO/100+ MiniPCI
8931 8086 2407 EtherExpress PRO/100+ MiniPCI
8932 8086 2408 EtherExpress PRO/100+ MiniPCI
8933 8086 2409 EtherExpress PRO/100+ MiniPCI
8934 8086 240f EtherExpress PRO/100+ MiniPCI
8935 8086 2410 EtherExpress PRO/100+ MiniPCI
8936 8086 2411 EtherExpress PRO/100+ MiniPCI
8937 8086 2412 EtherExpress PRO/100+ MiniPCI
8938 8086 2413 EtherExpress PRO/100+ MiniPCI
8939 8086 3000 82559 Fast Ethernet LAN on Motherboard
8940 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN*
8941 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II*
8942 8086 3006 EtherExpress PRO/100 S Network Connection
8943 8086 3007 EtherExpress PRO/100 S Network Connection
8944 8086 3008 EtherExpress PRO/100 Network Connection
8945 8086 3010 EtherExpress PRO/100 S Network Connection
8946 8086 3011 EtherExpress PRO/100 S Network Connection
8947 8086 3012 EtherExpress PRO/100 Network Connection
8948 8086 3411 SDS2 Mainboard
8949 122d 430FX - 82437FX TSC [Triton I]
8950 122e 82371FB PIIX ISA [Triton I]
8951 1230 82371FB PIIX IDE [Triton I]
8952 1231 DSVD Modem
8953 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)
8954 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)
8955 1237 440FX - 82441FX PMC [Natoma]
8956 1239 82371FB PIIX IDE Interface
8957 123b 82380PB PCI to PCI Docking Bridge
8958 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge
8959 123d 683053 Programmable Interrupt Device
8960# in" hidden" mode
8961 123e 82466GX (IHPC) Integrated Hot-Plug Controller
8962 123f 82466GX Integrated Hot-Plug Controller (IHPC)
8963 1240 82752 (752) AGP Graphics Accelerator
8964 124b 82380FB (MPCI2) Mobile Docking Controller
8965 1250 430HX - 82439HX TXC [Triton II]
8966 1360 82806AA PCI64 Hub PCI Bridge
8967 1361 82806AA PCI64 Hub Controller (HRes)
8968 8086 1361 82806AA PCI64 Hub Controller (HRes)
8969 8086 8000 82806AA PCI64 Hub Controller (HRes)
8970 1460 82870P2 P64H2 Hub PCI Bridge
8971 1461 82870P2 P64H2 I/OxAPIC
8972 15d9 3480 P4DP6
8973 4c53 1090 Cx9 / Vx9 mainboard
8974 1462 82870P2 P64H2 Hot Plug Controller
8975 1960 80960RP [i960RP Microprocessor]
8976 101e 0431 MegaRAID 431 RAID Controller
8977 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller
8978 101e 0466 MegaRAID 466 Express Plus RAID Controller
8979 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller
8980 101e 0490 MegaRAID 490 Express 300 RAID Controller
8981 101e 0762 MegaRAID 762 Express RAID Controller
8982 101e 09a0 PowerEdge Expandable RAID Controller 2/SC
8983 1028 0467 PowerEdge Expandable RAID Controller 2/DC
8984 1028 1111 PowerEdge Expandable RAID Controller 2/SC
8985 103c 03a2 MegaRAID
8986 103c 10c6 MegaRAID 438, HP NetRAID-3Si
8987 103c 10c7 MegaRAID T5, Integrated HP NetRAID
8988 103c 10cc MegaRAID, Integrated HP NetRAID
8989 103c 10cd HP NetRAID-1Si
8990 105a 0000 SuperTrak
8991 105a 2168 SuperTrak Pro
8992 105a 5168 SuperTrak66/100
8993 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC
8994 1111 1112 PowerEdge Expandable RAID Controller 2/SC
8995 113c 03a2 MegaRAID
8996 e4bf 1010 CG1-RADIO
8997 e4bf 1020 CU2-QUARTET
8998 e4bf 1040 CU1-CHORUS
8999 e4bf 3100 CX1-BAND
9000 1962 80960RM [i960RM Microprocessor]
9001 105a 0000 SuperTrak SX6000 I2O CPU
9002 1a21 82840 840 (Carmel) Chipset Host Bridge (Hub A)
9003 1a23 82840 840 (Carmel) Chipset AGP Bridge
9004 1a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B)
9005 1a30 82845 845 (Brookdale) Chipset Host Bridge
9006 1028 010e Optiplex GX240
9007 1a31 82845 845 (Brookdale) Chipset AGP Bridge
9008 2410 82801AA ISA Bridge (LPC)
9009 2411 82801AA IDE
9010 2412 82801AA USB
9011 2413 82801AA SMBus
9012 2415 82801AA AC'97 Audio
9013 1028 0095 Precision Workstation 220 Integrated Digital Audio
9014 11d4 0040 SoundMAX Integrated Digital Audio
9015 11d4 0048 SoundMAX Integrated Digital Audio
9016 11d4 5340 SoundMAX Integrated Digital Audio
9017 2416 82801AA AC'97 Modem
9018 2418 82801AA PCI Bridge
9019 2420 82801AB ISA Bridge (LPC)
9020 2421 82801AB IDE
9021 2422 82801AB USB
9022 2423 82801AB SMBus
9023 2425 82801AB AC'97 Audio
9024 11d4 0040 SoundMAX Integrated Digital Audio
9025 11d4 0048 SoundMAX Integrated Digital Audio
9026 2426 82801AB AC'97 Modem
9027 2428 82801AB PCI Bridge
9028 2440 82801BA ISA Bridge (LPC)
9029 2442 82801BA/BAM USB (Hub #1)
9030 1014 01c6 Netvista A40/A40p
9031 1025 1016 Travelmate 612 TX
9032 1028 010e Optiplex GX240
9033 1043 8027 TUSL2-C Mainboard
9034 104d 80df Vaio PCG-FX403
9035 147b 0507 TH7II-RAID
9036 8086 4532 D815EEA2 mainboard
9037 8086 4557 D815EGEW Mainboard
9038 2443 82801BA/BAM SMBus
9039 1014 01c6 Netvista A40/A40p
9040 1025 1016 Travelmate 612 TX
9041 1028 010e Optiplex GX240
9042 1043 8027 TUSL2-C Mainboard
9043 104d 80df Vaio PCG-FX403
9044 147b 0507 TH7II-RAID
9045 8086 4532 D815EEA2 mainboard
9046 8086 4557 D815EGEW Mainboard
9047 2444 82801BA/BAM USB (Hub #2)
9048 1025 1016 Travelmate 612 TX
9049 1028 010e Optiplex GX240
9050 1043 8027 TUSL2-C Mainboard
9051 104d 80df Vaio PCG-FX403
9052 147b 0507 TH7II-RAID
9053 8086 4532 D815EEA2 mainboard
9054 2445 82801BA/BAM AC'97 Audio
9055 1014 01c6 Netvista A40/A40p
9056 1025 1016 Travelmate 612 TX
9057 104d 80df Vaio PCG-FX403
9058 1462 3370 STAC9721 AC
9059 147b 0507 TH7II-RAID
9060 8086 4557 D815EGEW Mainboard
9061 2446 82801BA/BAM AC'97 Modem
9062 1025 1016 Travelmate 612 TX
9063 104d 80df Vaio PCG-FX403
9064 2448 82801 Mobile PCI Bridge
9065 2449 82801BA/BAM/CA/CAM Ethernet Controller
9066 0e11 0012 EtherExpress PRO/100 VM
9067 0e11 0091 EtherExpress PRO/100 VE
9068 1014 01ce EtherExpress PRO/100 VE
9069 1014 01dc EtherExpress PRO/100 VE
9070 1014 01eb EtherExpress PRO/100 VE
9071 1014 01ec EtherExpress PRO/100 VE
9072 1014 0202 EtherExpress PRO/100 VE
9073 1014 0205 EtherExpress PRO/100 VE
9074 1014 0217 EtherExpress PRO/100 VE
9075 1014 0234 EtherExpress PRO/100 VE
9076 1014 023d EtherExpress PRO/100 VE
9077 1014 0244 EtherExpress PRO/100 VE
9078 1014 0245 EtherExpress PRO/100 VE
9079 1014 0265 PRO/100 VE Desktop Connection
9080 1014 0267 PRO/100 VE Desktop Connection
9081 1014 026a PRO/100 VE Desktop Connection
9082 109f 315d EtherExpress PRO/100 VE
9083 109f 3181 EtherExpress PRO/100 VE
9084 1179 ff01 PRO/100 VE Network Connection
9085 1186 7801 EtherExpress PRO/100 VE
9086 144d 2602 HomePNA 1M CNR
9087 8086 3010 EtherExpress PRO/100 VE
9088 8086 3011 EtherExpress PRO/100 VM
9089 8086 3012 82562EH based Phoneline
9090 8086 3013 EtherExpress PRO/100 VE
9091 8086 3014 EtherExpress PRO/100 VM
9092 8086 3015 82562EH based Phoneline
9093 8086 3016 EtherExpress PRO/100 P Mobile Combo
9094 8086 3017 EtherExpress PRO/100 P Mobile
9095 8086 3018 EtherExpress PRO/100
9096 244a 82801BAM IDE U100
9097 1025 1016 Travelmate 612TX
9098 104d 80df Vaio PCG-FX403
9099 244b 82801BA IDE U100
9100 1014 01c6 Netvista A40/A40p
9101 1028 010e Optiplex GX240
9102 1043 8027 TUSL2-C Mainboard
9103 147b 0507 TH7II-RAID
9104 8086 4532 D815EEA2 mainboard
9105 8086 4557 D815EGEW Mainboard
9106 244c 82801BAM ISA Bridge (LPC)
9107 244e 82801 PCI Bridge
9108 1014 0267 NetVista A30p
9109 2450 82801E ISA Bridge (LPC)
9110 2452 82801E USB
9111 2453 82801E SMBus
9112 2459 82801E Ethernet Controller 0
9113 245b 82801E IDE U100
9114 245d 82801E Ethernet Controller 1
9115 245e 82801E PCI Bridge
9116 2480 82801CA LPC Interface Controller
9117 2482 82801CA/CAM USB (Hub #1)
9118 1014 0220 ThinkPad A/T/X Series
9119 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9120 15d9 3480 P4DP6
9121 8086 1958 vpr Matrix 170B4
9122 8086 3424 SE7501HG2 Mainboard
9123 8086 4541 Latitude C640
9124 2483 82801CA/CAM SMBus Controller
9125 1014 0220 ThinkPad A/T/X Series
9126 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9127 15d9 3480 P4DP6
9128 8086 1958 vpr Matrix 170B4
9129 2484 82801CA/CAM USB (Hub #2)
9130 1014 0220 ThinkPad A/T/X Series
9131 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9132 15d9 3480 P4DP6
9133 8086 1958 vpr Matrix 170B4
9134 2485 82801CA/CAM AC'97 Audio Controller
9135 1013 5959 Crystal WMD Audio Codec
9136 1014 0222 ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653)
9137 1014 0508 ThinkPad T30
9138 1014 051c ThinkPad A/T/X Series
9139 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9140 144d c006 vpr Matrix 170B4
9141 2486 82801CA/CAM AC'97 Modem Controller
9142 1014 0223 ThinkPad A/T/X Series
9143 1014 0503 ThinkPad R31 2656BBG
9144 1014 051a ThinkPad A/T/X Series
9145 101f 1025 Acer 620 Series
9146 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9147 1179 0001 Toshiba Satellite 1110 Z15 internal Modem
9148 134d 4c21 Dell Inspiron 2100 internal modem
9149 144d 2115 vpr Matrix 170B4 internal modem
9150 14f1 5421 MD56ORD V.92 MDC Modem
9151 2487 82801CA/CAM USB (Hub #3)
9152 1014 0220 ThinkPad A/T/X Series
9153 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9154 15d9 3480 P4DP6
9155 8086 1958 vpr Matrix 170B4
9156 248a 82801CAM IDE U100
9157 1014 0220 ThinkPad A/T/X Series
9158 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9159 8086 1958 vpr Matrix 170B4
9160 8086 4541 Latitude C640
9161 248b 82801CA Ultra ATA Storage Controller
9162 15d9 3480 P4DP6
9163 248c 82801CAM ISA Bridge (LPC)
9164 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
9165 1014 0267 NetVista A30p
9166 1462 5800 845PE Max (MS-6580)
9167 24c1 82801DBL (ICH4-L) IDE Controller
9168 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
9169 1014 0267 NetVista A30p
9170 1025 005a TravelMate 290
9171 1028 0126 Optiplex GX260
9172 1028 0163 Latitude D505
9173 103c 088c nc8000 laptop
9174 103c 0890 nc6000 laptop
9175 1071 8160 MIM2000
9176 1462 5800 845PE Max (MS-6580)
9177 1509 2990 Averatec 5110H laptop
9178 4c53 1090 Cx9 / Vx9 mainboard
9179 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
9180 1014 0267 NetVista A30p
9181 1025 005a TravelMate 290
9182 1028 0126 Optiplex GX260
9183 103c 088c nc8000 laptop
9184 103c 0890 nc6000 laptop
9185 1071 8160 MIM2000
9186 1458 24c2 GA-8PE667 Ultra
9187 1462 5800 845PE Max (MS-6580)
9188 4c53 1090 Cx9 / Vx9 mainboard
9189 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
9190 1014 0267 NetVista A30p
9191 1025 005a TravelMate 290
9192 1028 0126 Optiplex GX260
9193 1028 0163 Latitude D505
9194 103c 088c nc8000 laptop
9195 103c 0890 nc6000 laptop
9196 1071 8160 MIM2000
9197 1462 5800 845PE Max (MS-6580)
9198 1509 2990 Averatec 5110H
9199 4c53 1090 Cx9 / Vx9 mainboard
9200 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller
9201 0e11 00b8 Analog Devices Inc. codec [SoundMAX]
9202 1014 0267 NetVista A30p
9203 1025 005a TravelMate 290
9204 1028 0163 Latitude D505
9205 103c 088c nc8000 laptop
9206 103c 0890 nc6000 laptop
9207 1071 8160 MIM2000
9208 1458 a002 GA-8PE667 Ultra
9209 1462 5800 845PE Max (MS-6580)
9210 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
9211 1025 005a TravelMate 290
9212 103c 088c nc8000 laptop
9213 103c 0890 nc6000 laptop
9214 1071 8160 MIM2000
9215 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
9216 1014 0267 NetVista A30p
9217 1025 005a TravelMate 290
9218 1028 0126 Optiplex GX260
9219 1028 0163 Latitude D505
9220 103c 088c nc8000 laptop
9221 103c 0890 nc6000 laptop
9222 1071 8160 MIM2000
9223 1462 5800 845PE Max (MS-6580)
9224 1509 2990 Averatec 5110H
9225 4c53 1090 Cx9 / Vx9 mainboard
9226 24ca 82801DBM (ICH4-M) IDE Controller
9227 1025 005a TravelMate 290
9228 1028 0163 Latitude D505
9229 103c 088c nc8000 laptop
9230 103c 0890 nc6000 laptop
9231 1071 8160 MIM2000
9232 24cb 82801DB (ICH4) IDE Controller
9233 1014 0267 NetVista A30p
9234 1028 0126 Optiplex GX260
9235 1458 24c2 GA-8PE667 Ultra
9236 1462 5800 845PE Max (MS-6580)
9237 4c53 1090 Cx9 / Vx9 mainboard
9238 24cc 82801DBM (ICH4-M) LPC Interface Bridge
9239 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
9240 1014 0267 NetVista A30p
9241 1025 005a TravelMate 290
9242 1028 0126 Optiplex GX260
9243 1028 0163 Latitude D505
9244 103c 088c nc8000 laptop
9245 103c 0890 nc6000 laptop
9246 1071 8160 MIM2000
9247 1462 3981 845PE Max (MS-6580)
9248 1509 1968 Averatec 5110H
9249 4c53 1090 Cx9 / Vx9 mainboard
9250 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
9251 24d1 82801EB (ICH5) SATA Controller
9252 103c 12bc d530 CMT (DG746A)
9253 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE)
9254 1462 7280 865PE Neo2 (MS-6728)
9255 8086 3427 S875WP1-E mainboard
9256 8086 524c D865PERL mainboard
9257 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
9258 1028 0183 PowerEdge 1800
9259 103c 12bc d530 CMT (DG746A)
9260 1043 80a6 P4P800 Mainboard
9261 1458 24d2 GA-8IPE1000/8KNXP motherboard
9262 1462 7280 865PE Neo2 (MS-6728)
9263 8086 3427 S875WP1-E mainboard
9264 8086 524c D865PERL mainboard
9265 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller
9266 1043 80a6 P4P800 Mainboard
9267 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
9268 1462 7280 865PE Neo2 (MS-6728)
9269 8086 3427 S875WP1-E mainboard
9270 8086 524c D865PERL mainboard
9271 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
9272 1028 0183 PowerEdge 1800
9273 103c 12bc d530 CMT (DG746A)
9274 1043 80a6 P4P800 Mainboard
9275 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
9276 1462 7280 865PE Neo2 (MS-6728)
9277 8086 3427 S875WP1-E mainboard
9278 8086 524c D865PERL mainboard
9279 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
9280 103c 12bc Analog Devices codec [SoundMAX Integrated Digital Audio]
9281 1043 80f3 P4P800 Mainboard
9282# Again, I suppose they use the same in different subsystems
9283 1458 a002 GA-8IPE1000/8KNXP motherboard
9284 1462 7280 865PE Neo2 (MS-6728)
9285 8086 a000 D865PERL mainboard
9286 8086 e000 D865PERL mainboard
9287 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
9288 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI #3
9289 1028 0183 PowerEdge 1800
9290 103c 12bc d530 CMT (DG746A)
9291 1043 80a6 P4P800 Mainboard
9292 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
9293 1462 7280 865PE Neo2 (MS-6728)
9294 8086 3427 S875WP1-E mainboard
9295 8086 524c D865PERL mainboard
9296 24db 82801EB/ER (ICH5/ICH5R) IDE Controller
9297 103c 12bc d530 CMT (DG746A)
9298 1043 80a6 P4P800 Mainboard
9299 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
9300 1462 7280 865PE Neo2 (MS-6728)
9301 1462 7580 MSI 875P
9302 8086 24db P4C800 Mainboard
9303 8086 3427 S875WP1-E mainboard
9304 8086 524c D865PERL mainboard
9305 24dc 82801EB (ICH5) LPC Interface Bridge
9306 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
9307 1028 0183 PowerEdge 1800
9308 103c 12bc d530 CMT (DG746A)
9309 1043 80a6 P4P800 Mainboard
9310 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE)
9311 1462 7280 865PE Neo2 (MS-6728)
9312 8086 3427 S875WP1-E mainboard
9313 8086 524c D865PERL mainboard
9314 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
9315 1043 80a6 P4P800 Mainboard
9316 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)
9317 1462 7280 865PE Neo2 (MS-6728)
9318 8086 3427 S875WP1-E mainboard
9319 8086 524c D865PERL mainboard
9320 24df 82801ER (ICH5R) SATA Controller
9321 2500 82820 820 (Camino) Chipset Host Bridge (MCH)
9322 1028 0095 Precision Workstation 220 Chipset
9323 1043 801c P3C-2000 system chipset
9324 2501 82820 820 (Camino) Chipset Host Bridge (MCH)
9325 1043 801c P3C-2000 system chipset
9326 250b 82820 820 (Camino) Chipset Host Bridge
9327 250f 82820 820 (Camino) Chipset AGP Bridge
9328 2520 82805AA MTH Memory Translator Hub
9329 2521 82804AA MRH-S Memory Repeater Hub for SDRAM
9330 2530 82850 850 (Tehama) Chipset Host Bridge (MCH)
9331 147b 0507 TH7II-RAID
9332 2531 82860 860 (Wombat) Chipset Host Bridge (MCH)
9333 2532 82850 850 (Tehama) Chipset AGP Bridge
9334 2533 82860 860 (Wombat) Chipset AGP Bridge
9335 2534 82860 860 (Wombat) Chipset PCI Bridge
9336 2540 E7500 Memory Controller Hub
9337 15d9 3480 P4DP6
9338 2541 E7500/E7501 Host RASUM Controller
9339 15d9 3480 P4DP6
9340 4c53 1090 Cx9 / Vx9 mainboard
9341 8086 3424 SE7501HG2 Mainboard
9342 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge
9343 2544 E7500/E7501 Hub Interface B RASUM Controller
9344 4c53 1090 Cx9 / Vx9 mainboard
9345 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge
9346 2546 E7500/E7501 Hub Interface C RASUM Controller
9347 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge
9348 2548 E7500/E7501 Hub Interface D RASUM Controller
9349 254c E7501 Memory Controller Hub
9350 4c53 1090 Cx9 / Vx9 mainboard
9351 8086 3424 SE7501HG2 Mainboard
9352 2550 E7505 Memory Controller Hub
9353 2551 E7505/E7205 Series RAS Controller
9354 2552 E7505/E7205 PCI-to-AGP Bridge
9355 2553 E7505 Hub Interface B PCI-to-PCI Bridge
9356 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller
9357 255d E7205 Memory Controller Hub
9358 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
9359 1028 0126 Optiplex GX260
9360 1458 2560 GA-8PE667 Ultra
9361 1462 5800 845PE Max (MS-6580)
9362 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge
9363 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
9364 1014 0267 NetVista A30p
9365 2570 82865G/PE/P DRAM Controller/Host-Hub Interface
9366 1043 80f2 P4P800 Mainboard
9367 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE)
9368 2571 82865G/PE/P PCI to AGP Controller
9369 2572 82865G Integrated Graphics Controller
9370 2573 82865G/PE/P PCI to CSA Bridge
9371 2576 82865G/PE/P Processor to I/O Memory Interface
9372 2578 82875P/E7210 Memory Controller Hub
9373 1458 2578 GA-8KNXP motherboard (875P)
9374 1462 7580 MS-6758 (875P Neo)
9375# Motherboard P4SCE
9376 15d9 4580 Super Micro Computer Inc. P4SCE
9377 2579 82875P Processor to AGP Controller
9378 257b 82875P/E7210 Processor to PCI to CSA Bridge
9379 257e 82875P/E7210 Processor to I/O Memory Interface
9380 2580 915G/P/GV/GL/PL/910GL Processor to I/O Controller
9381 2581 915G/P/GV/GL/PL/910GL PCI Express Root Port
9382 2582 82915G/GV/910GL Express Chipset Family Graphics Controller
9383 1028 1079 Optiplex GX280
9384 2584 925X/XE Memory Controller Hub
9385 2585 925X/XE PCI Express Root Port
9386 2588 E7220/E7221 Memory Controller Hub
9387 2589 E7220/E7221 PCI Express Root Port
9388 258a E7221 Integrated Graphics Controller
9389 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller
9390 2591 Mobile 915GM/PM Express PCI Express Root Port
9391 2592 Mobile 915GM/GMS/910GML Express Graphics Controller
9392 25a1 6300ESB LPC Interface Controller
9393 25a2 6300ESB PATA Storage Controller
9394 4c53 10b0 CL9 mainboard
9395 25a3 6300ESB SATA Storage Controller
9396 4c53 10b0 CL9 mainboard
9397 25a4 6300ESB SMBus Controller
9398 4c53 10b0 CL9 mainboard
9399 25a6 6300ESB AC'97 Audio Controller
9400 4c53 10b0 CL9 mainboard
9401 25a7 6300ESB AC'97 Modem Controller
9402 25a9 6300ESB USB Universal Host Controller
9403 4c53 10b0 CL9 mainboard
9404 25aa 6300ESB USB Universal Host Controller
9405 4c53 10b0 CL9 mainboard
9406 25ab 6300ESB Watchdog Timer
9407 4c53 10b0 CL9 mainboard
9408 25ac 6300ESB I/O Advanced Programmable Interrupt Controller
9409 4c53 10b0 CL9 mainboard
9410 25ad 6300ESB USB2 Enhanced Host Controller
9411 25ae 6300ESB 64-bit PCI-X Bridge
9412 25b0 6300ESB SATA RAID Controller
9413 2600 E8500 Hub Interface
9414 2601 E8500 PCI Express x4 Port D
9415 2602 E8500 PCI Express x4 Port C0
9416 2603 E8500 PCI Express x4 Port C1
9417 2604 E8500 PCI Express x4 Port B0
9418 2605 E8500 PCI Express x4 Port B1
9419 2606 E8500 PCI Express x4 Port A0
9420 2607 E8500 PCI Express x4 Port A1
9421 2608 E8500 PCI Express x8 Port C
9422 2609 E8500 PCI Express x8 Port B
9423 260a E8500 PCI Express x8 Port A
9424 260c E8500 IMI Registers
9425 2610 E8500 System Bus, Boot, and Interrupt Registers
9426 2611 E8500 Address Mapping Registers
9427 2612 E8500 RAS Registers
9428 2613 E8500 Reserved Registers
9429 2614 E8500 Reserved Registers
9430 2615 E8500 Miscellaneous Registers
9431 2617 E8500 Reserved Registers
9432 2618 E8500 Reserved Registers
9433 2619 E8500 Reserved Registers
9434 261a E8500 Reserved Registers
9435 261b E8500 Reserved Registers
9436 261c E8500 Reserved Registers
9437 261d E8500 Reserved Registers
9438 261e E8500 Reserved Registers
9439 2620 E8500 eXternal Memory Bridge
9440 2621 E8500 XMB Miscellaneous Registers
9441 2622 E8500 XMB Memory Interleaving Registers
9442 2623 E8500 XMB DDR Initialization and Calibration
9443 2624 E8500 XMB Reserved Registers
9444 2625 E8500 XMB Reserved Registers
9445 2626 E8500 XMB Reserved Registers
9446 2627 E8500 XMB Reserved Registers
9447 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
9448 2641 82801FBM (ICH6M) LPC Interface Bridge
9449 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
9450 2651 82801FB/FW (ICH6/ICH6W) SATA Controller
9451 1028 0179 Optiplex GX280
9452 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
9453 2653 82801FBM (ICH6M) SATA Controller
9454 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1
9455 1028 0179 Optiplex GX280
9456 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2
9457 1028 0179 Optiplex GX280
9458 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3
9459 1028 0179 Optiplex GX280
9460 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4
9461 1028 0179 Optiplex GX280
9462 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
9463 1028 0179 Optiplex GX280
9464 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1
9465 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2
9466 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3
9467 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4
9468 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller
9469 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller
9470 1028 0179 Optiplex GX280
9471 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller
9472 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller
9473 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller
9474 1028 0179 Optiplex GX280
9475 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller
9476 2770 Memory Controller Hub
9477 2771 PCI Express Graphics Port
9478 2772 Integrated Graphics Controller
9479 2774 Workstation Memory Controller Hub
9480 2775 PCI Express Graphics Port
9481 2776 Integrated Graphics Controller
9482 2778 Server Memory Controller Hub
9483 2779 PCI Express Root Port
9484 2782 82915G Express Chipset Family Graphics Controller
9485 2792 Mobile 915GM/GMS/910GML Express Graphics Controller
9486 27b8 I/O Controller Hub LPC
9487 27b9 Mobile I/O Controller Hub LPC
9488 27c0 I/O Controller Hub SATA cc=IDE
9489 27c1 I/O Controller Hub SATA cc=AHCI
9490 27c3 I/O Controller Hub SATA cc=RAID
9491 27c4 Mobile I/O Controller Hub SATA cc=IDE
9492 27c5 Mobile I/O Controller Hub SATA cc=AHCI
9493 27c8 I/O Controller Hub UHCI USB #1
9494 27c9 I/O Controller Hub UHCI USB #2
9495 27ca I/O Controller Hub UHCI USB #3
9496 27cb I/O Controller Hub UHCI USB #4
9497 27cc I/O Controller Hub EHCI USB
9498 27d0 I/O Controller Hub PCI Express Port 1
9499 27d2 I/O Controller Hub PCI Express Port 2
9500 27d4 I/O Controller Hub PCI Express Port 3
9501 27d6 I/O Controller Hub PCI Express Port 4
9502 27d8 I/O Controller Hub High Definition Audio
9503 27da I/O Controller Hub SMBus
9504 27dc I/O Controller Hub LAN
9505 27dd I/O Controller Hub AC'97 Modem
9506 27de I/O Controller Hub AC'97 Audio
9507 27df I/O Controller Hub PATA
9508 27e0 I/O Controller Hub PCI Express Port 5
9509 27e2 I/O Controller Hub PCI Express Port 6
9510 3092 Integrated RAID
9511 3200 GD31244 PCI-X SATA HBA
9512 3340 82855PM Processor to I/O Controller
9513 1025 005a TravelMate 290
9514 103c 088c nc8000 laptop
9515 103c 0890 nc6000 laptop
9516 3341 82855PM Processor to AGP Controller
9517 3575 82830 830 Chipset Host Bridge
9518 1014 021d ThinkPad A/T/X Series
9519 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
9520 3576 82830 830 Chipset AGP Bridge
9521 3577 82830 CGC [Chipset Graphics Controller]
9522 1014 0513 ThinkPad A/T/X Series
9523 3578 82830 830 Chipset Host Bridge
9524 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
9525 1028 0163 Latitude D505
9526 4c53 10b0 CL9 mainboard
9527 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller
9528 3582 82852/855GM Integrated Graphics Device
9529 1028 0163 Latitude D505
9530 4c53 10b0 CL9 mainboard
9531 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
9532 1028 0163 Latitude D505
9533 4c53 10b0 CL9 mainboard
9534 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
9535 1028 0163 Latitude D505
9536 4c53 10b0 CL9 mainboard
9537 3590 E7520 Memory Controller Hub
9538 3591 E7525/E7520 Error Reporting Registers
9539 3592 E7320 Memory Controller Hub
9540 3593 E7320 Error Reporting Registers
9541 3594 E7520 DMA Controller
9542 3595 E7525/E7520/E7320 PCI Express Port A
9543 3596 E7525/E7520/E7320 PCI Express Port A1
9544 3597 E7525/E7520 PCI Express Port B
9545 3598 E7520 PCI Express Port B1
9546 3599 E7520 PCI Express Port C
9547 359a E7520 PCI Express Port C1
9548 359b E7525/E7520/E7320 Extended Configuration Registers
9549 359e E7525 Memory Controller Hub
9550 4220 PRO/Wireless 2200BG
9551 4223 PRO/Wireless 2915ABG MiniPCI Adapter
9552 5200 EtherExpress PRO/100 Intelligent Server
9553 5201 EtherExpress PRO/100 Intelligent Server
9554 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter
9555 530d 80310 IOP [IO Processor]
9556 7000 82371SB PIIX3 ISA [Natoma/Triton II]
9557 7010 82371SB PIIX3 IDE [Natoma/Triton II]
9558 7020 82371SB PIIX3 USB [Natoma/Triton II]
9559 7030 430VX - 82437VX TVX [Triton VX]
9560 7050 Intel Intercast Video Capture Card
9561 7100 430TX - 82439TX MTXC
9562 7110 82371AB/EB/MB PIIX4 ISA
9563 15ad 1976 virtualHW v3
9564 7111 82371AB/EB/MB PIIX4 IDE
9565 15ad 1976 virtualHW v3
9566 7112 82371AB/EB/MB PIIX4 USB
9567 15ad 1976 virtualHW v3
9568 7113 82371AB/EB/MB PIIX4 ACPI
9569 15ad 1976 virtualHW v3
9570 7120 82810 GMCH [Graphics Memory Controller Hub]
9571 4c53 1040 CL7 mainboard
9572 4c53 1060 PC7 mainboard
9573 7121 82810 CGC [Chipset Graphics Controller]
9574 4c53 1040 CL7 mainboard
9575 4c53 1060 PC7 mainboard
9576 8086 4341 Cayman (CA810) Mainboard
9577 7122 82810 DC-100 GMCH [Graphics Memory Controller Hub]
9578 7123 82810 DC-100 CGC [Chipset Graphics Controller]
9579 7124 82810E DC-133 GMCH [Graphics Memory Controller Hub]
9580 7125 82810E DC-133 CGC [Chipset Graphics Controller]
9581 7126 82810 DC-133 System and Graphics Controller
9582 7128 82810-M DC-100 System and Graphics Controller
9583 712a 82810-M DC-133 System and Graphics Controller
9584 7180 440LX/EX - 82443LX/EX Host bridge
9585 7181 440LX/EX - 82443LX/EX AGP bridge
9586 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge
9587 0e11 0500 Armada 1750 Laptop System Chipset
9588 0e11 b110 Armada M700/E500
9589 1179 0001 Toshiba Tecra 8100 Laptop System Chipset
9590 15ad 1976 virtualHW v3
9591 4c53 1050 CT7 mainboard
9592 4c53 1051 CE7 mainboard
9593 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge
9594 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
9595 0e11 0460 Armada 1700 Laptop System Chipset
9596 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
9597 7194 82440MX Host Bridge
9598 1033 0000 Versa Note Vxi
9599 4c53 10a0 CA3/CR3 mainboard
9600 7195 82440MX AC'97 Audio Controller
9601 1033 80cc Versa Note VXi
9602 10cf 1099 QSound_SigmaTel Stac97 PCI Audio
9603 11d4 0040 SoundMAX Integrated Digital Audio
9604 11d4 0048 SoundMAX Integrated Digital Audio
9605 7196 82440MX AC'97 Modem Controller
9606 7198 82440MX ISA Bridge
9607 7199 82440MX EIDE Controller
9608 719a 82440MX USB Universal Host Controller
9609 719b 82440MX Power Management Controller
9610 71a0 440GX - 82443GX Host bridge
9611 4c53 1050 CT7 mainboard
9612 4c53 1051 CE7 mainboard
9613 71a1 440GX - 82443GX AGP bridge
9614 71a2 440GX - 82443GX Host bridge (AGP disabled)
9615 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard
9616 7600 82372FB PIIX5 ISA
9617 7601 82372FB PIIX5 IDE
9618 7602 82372FB PIIX5 USB
9619 7603 82372FB PIIX5 SMBus
9620 7800 82740 (i740) AGP Graphics Accelerator
9621 003d 0008 Starfighter AGP
9622 003d 000b Starfighter AGP
9623 1092 0100 Stealth II G460
9624 10b4 201a Lightspeed 740
9625 10b4 202f Lightspeed 740
9626 8086 0000 Terminator 2x/i
9627 8086 0100 Intel740 Graphics Accelerator
9628 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge
9629 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller
9630 84ca 450NX - 82451NX Memory & I/O Controller
9631 84cb 450NX - 82454NX/84460GX PCI Expander Bridge
9632 84e0 460GX - 84460GX System Address Controller (SAC)
9633 84e1 460GX - 84460GX System Data Controller (SDC)
9634 84e2 460GX - 84460GX AGP Bridge (GXB function 2)
9635 84e3 460GX - 84460GX Memory Address Controller (MAC)
9636 84e4 460GX - 84460GX Memory Data Controller (MDC)
9637 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)
9638 84ea 460GX - 84460GX AGP Bridge (GXB function 1)
9639 8500 IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100
9640 1993 0dee mGuard-PCI AV#1
9641 1993 0def mGuard-PCI AV#0
9642 9000 IXP2000 Family Network Processor
9643 9001 IXP2400 Network Processor
9644 9004 IXP2800 Network Processor
9645 9621 Integrated RAID
9646 9622 Integrated RAID
9647 9641 Integrated RAID
9648 96a1 Integrated RAID
9649# retail verson
9650 a01f PRO/10GbE LR Server Adapter
9651# OEM version
9652 a11f PRO/10GbE LR Server Adapter
9653 b152 21152 PCI-to-PCI Bridge
9654# observed, and documented in Intel revision note; new mask of 1011:0026
9655 b154 21154 PCI-to-PCI Bridge
9656 b555 21555 Non transparent PCI-to-PCI Bridge
9657 12d9 000a PCI VoIP Gateway
9658 4c53 1050 CT7 mainboard
9659 4c53 1051 CE7 mainboard
9660 e4bf 1000 CC8-1-BLUES
9661 ffff 450NX/GX [Orion] - 82453KX/GX Memory controller [BUG]
96628401 TRENDware International Inc.
96638800 Trigem Computer Inc.
9664 2008 Video assistent component
96658866 T-Square Design Inc.
96668888 Silicon Magic
9667# 8c4a is not Winbond but there is a board misprogrammed
96688c4a Winbond
9669 1980 W89C940 misprogrammed [ne2k]
96708e0e Computone Corporation
96718e2e KTI
9672 3000 ET32P2
96739004 Adaptec
9674 0078 AHA-2940U_CN
9675 1078 AIC-7810
9676 1160 AIC-1160 [Family Fibre Channel Adapter]
9677 2178 AIC-7821
9678 3860 AHA-2930CU
9679 3b78 AHA-4844W/4844UW
9680 5075 AIC-755x
9681 5078 AHA-7850
9682 9004 7850 AHA-2904/Integrated AIC-7850
9683 5175 AIC-755x
9684 5178 AIC-7851
9685 5275 AIC-755x
9686 5278 AIC-7852
9687 5375 AIC-755x
9688 5378 AIC-7850
9689 5475 AIC-755x
9690 5478 AIC-7850
9691 5575 AVA-2930
9692 5578 AIC-7855
9693 5647 ANA-7711 TCP Offload Engine
9694 9004 7710 ANA-7711F TCP Offload Engine - Optical
9695 9004 7711 ANA-7711LP TCP Offload Engine - Copper
9696 5675 AIC-755x
9697 5678 AIC-7856
9698 5775 AIC-755x
9699 5778 AIC-7850
9700 5800 AIC-5800
9701 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter
9702 5905 ANA-5910A/5930A/5940A ATM Adapter
9703 6038 AIC-3860
9704 6075 AIC-1480 / APA-1480
9705 9004 7560 AIC-1480 / APA-1480 Cardbus
9706 6078 AIC-7860
9707 6178 AIC-7861
9708 9004 7861 AHA-2940AU Single
9709 6278 AIC-7860
9710 6378 AIC-7860
9711 6478 AIC-786x
9712 6578 AIC-786x
9713 6678 AIC-786x
9714 6778 AIC-786x
9715 6915 ANA620xx/ANA69011A
9716 9004 0008 ANA69011A/TX 10/100
9717 9004 0009 ANA69011A/TX 10/100
9718 9004 0010 ANA62022 2-port 10/100
9719 9004 0018 ANA62044 4-port 10/100
9720 9004 0019 ANA62044 4-port 10/100
9721 9004 0020 ANA62022 2-port 10/100
9722 9004 0028 ANA69011A/TX 10/100
9723 9004 8008 ANA69011A/TX 64 bit 10/100
9724 9004 8009 ANA69011A/TX 64 bit 10/100
9725 9004 8010 ANA62022 2-port 64 bit 10/100
9726 9004 8018 ANA62044 4-port 64 bit 10/100
9727 9004 8019 ANA62044 4-port 64 bit 10/100
9728 9004 8020 ANA62022 2-port 64 bit 10/100
9729 9004 8028 ANA69011A/TX 64 bit 10/100
9730 7078 AHA-294x / AIC-7870
9731 7178 AHA-2940/2940W / AIC-7871
9732 7278 AHA-3940/3940W / AIC-7872
9733 7378 AHA-3985 / AIC-7873
9734 7478 AHA-2944/2944W / AIC-7874
9735 7578 AHA-3944/3944W / AIC-7875
9736 7678 AHA-4944W/UW / AIC-7876
9737 7710 ANA-7711F Network Accelerator Card (NAC) - Optical
9738 7711 ANA-7711C Network Accelerator Card (NAC) - Copper
9739 7778 AIC-787x
9740 7810 AIC-7810
9741 7815 AIC-7815 RAID+Memory Controller IC
9742 9004 7815 ARO-1130U2 RAID Controller
9743 9004 7840 AIC-7815 RAID+Memory Controller IC
9744 7850 AIC-7850
9745 7855 AHA-2930
9746 7860 AIC-7860
9747 7870 AIC-7870
9748 7871 AHA-2940
9749 7872 AHA-3940
9750 7873 AHA-3980
9751 7874 AHA-2944
9752 7880 AIC-7880P
9753 7890 AIC-7890
9754 7891 AIC-789x
9755 7892 AIC-789x
9756 7893 AIC-789x
9757 7894 AIC-789x
9758 7895 AHA-2940U/UW / AHA-39xx / AIC-7895
9759 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
9760 9004 7891 AHA-2940U/2940UW Dual
9761 9004 7892 AHA-3940AU/AUW/AUWD/UWD
9762 9004 7894 AHA-3944AUWD
9763 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
9764 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
9765 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
9766 7896 AIC-789x
9767 7897 AIC-789x
9768 8078 AIC-7880U
9769 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset
9770 8178 AHA-2940U/UW/D / AIC-7881U
9771 9004 7881 AHA-2940UW SCSI Host Adapter
9772 8278 AHA-3940U/UW/UWD / AIC-7882U
9773 8378 AHA-3940U/UW / AIC-7883U
9774 8478 AHA-2944UW / AIC-7884U
9775 8578 AHA-3944U/UWD / AIC-7885
9776 8678 AHA-4944UW / AIC-7886
9777 8778 AHA-2940UW Pro / AIC-788x
9778 9004 7887 2940UW Pro Ultra-Wide SCSI Controller
9779 8878 AHA-2930UW / AIC-7888
9780 9004 7888 AHA-2930UW SCSI Controller
9781 8b78 ABA-1030
9782 ec78 AHA-4944W/UW
97839005 Adaptec
9784 0010 AHA-2940U2/U2W
9785 9005 2180 AHA-2940U2 SCSI Controller
9786 9005 8100 AHA-2940U2B SCSI Controller
9787 9005 a100 AHA-2940U2B SCSI Controller
9788 9005 a180 AHA-2940U2W SCSI Controller
9789 9005 e100 AHA-2950U2B SCSI Controller
9790 0011 AHA-2930U2
9791 0013 78902
9792 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller
9793 9005 000f AIC7890_ARO
9794 001f AHA-2940U2/U2W / 7890/7891
9795 9005 000f 2940U2W SCSI Controller
9796 9005 a180 2940U2W SCSI Controller
9797 0020 AIC-7890
9798 002f AIC-7890
9799 0030 AIC-7890
9800 003f AIC-7890
9801 0050 AHA-3940U2x/395U2x
9802 9005 f500 AHA-3950U2B
9803 9005 ffff AHA-3950U2B
9804 0051 AHA-3950U2D
9805 9005 b500 AHA-3950U2D
9806 0053 AIC-7896 SCSI Controller
9807 9005 ffff AIC-7896 SCSI Controller mainboard implementation
9808 005f AIC-7896U2/7897U2
9809 0080 AIC-7892A U160/m
9810 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter
9811 9005 6220 AHA-29160C
9812 9005 62a0 29160N Ultra160 SCSI Controller
9813 9005 e220 29160LP Low Profile Ultra160 SCSI Controller
9814 9005 e2a0 29160 Ultra160 SCSI Controller
9815 0081 AIC-7892B U160/m
9816 9005 62a1 19160 Ultra160 SCSI Controller
9817 0083 AIC-7892D U160/m
9818 008f AIC-7892P U160/m
9819 1179 0001 Magnia Z310
9820 15d9 9005 Onboard SCSI Host Adapter
9821 00c0 AHA-3960D / AIC-7899A U160/m
9822 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter
9823 9005 f620 AHA-3960D U160/m
9824 00c1 AIC-7899B U160/m
9825 00c3 AIC-7899D U160/m
9826 00c5 RAID subsystem HBA
9827 1028 00c5 PowerEdge 2400,2500,2550,4400
9828 00cf AIC-7899P U160/m
9829 1028 00ce PowerEdge 1400
9830 1028 00d1 PowerEdge 2550
9831 1028 00d9 PowerEdge 2500
9832 10f1 2462 Thunder K7 S2462
9833 15d9 9005 Onboard SCSI Host Adapter
9834 8086 3411 SDS2 Mainboard
9835 0250 ServeRAID Controller
9836 1014 0279 ServeRAID-xx
9837 1014 028c ServeRAID-xx
9838# from kernel sources
9839 0279 ServeRAID 6M
9840 0283 AAC-RAID
9841 9005 0283 Catapult
9842 0284 AAC-RAID
9843 9005 0284 Tomcat
9844 0285 AAC-RAID
9845 0e11 0295 SATA 6Ch (Bearcat)
9846 1014 02f2 ServeRAID 8i
9847 1028 0287 PowerEdge Expandable RAID Controller 320/DC
9848 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)
9849 103c 3227 AAR-2610SA
9850 17aa 0286 Legend S220 (Legend Crusader)
9851 17aa 0287 Legend S230 (Legend Vulcan)
9852 9005 0285 2200S (Vulcan)
9853 9005 0286 2120S (Crusader)
9854 9005 0287 2200S (Vulcan-2m)
9855 9005 0288 3230S (Harrier)
9856 9005 0289 3240S (Tornado)
9857 9005 028a ASR-2020S PCI-X ZCR (Skyhawk)
9858 9005 028b ASR-2020S SO-DIMM PCI-X ZCR (Terminator)
9859 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II)
9860 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8)
9861 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16)
9862 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler)
9863 0286 AAC-RAID (Rocket)
9864 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer)
9865 0503 Scamp chipset SCSI controller
9866 1014 02BF Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E)
9867 8000 ASC-29320A U320
9868 800f AIC-7901 U320
9869 8010 ASC-39320 U320
9870 8011 ASC-32320D U320
9871 0e11 00ac ASC-39320D U320
9872 9005 0041 ASC-39320D U320
9873 8012 ASC-29320 U320
9874 8013 ASC-29320B U320
9875 8014 ASC-29320LP U320
9876 8015 ASC-39320B U320
9877 8016 ASC-39320A U320
9878 8017 ASC-29320ALP U320
9879 801c ASC-39320D U320
9880 801d AIC-7902B U320
9881 801e AIC-7901A U320
9882 801f AIC-7902 U320
9883 8080 ASC-29320A U320 w/HostRAID
9884 808f AIC-7901 U320 w/HostRAID
9885 8090 ASC-39320 U320 w/HostRAID
9886 8091 ASC-39320D U320 w/HostRAID
9887 8092 ASC-29320 U320 w/HostRAID
9888 8093 ASC-29320B U320 w/HostRAID
9889 8094 ASC-29320LP U320 w/HostRAID
9890 8095 ASC-39320(B) U320 w/HostRAID
9891 8096 ASC-39320A U320 w/HostRAID
9892 8097 ASC-29320ALP U320 w/HostRAID
9893 809c ASC-39320D(B) U320 w/HostRAID
9894 809d AIC-7902(B) U320 w/HostRAID
9895 809e AIC-7901A U320 w/HostRAID
9896 809f AIC-7902 U320 w/HostRAID
9897907f Atronics
9898 2015 IDE-2015PL
9899919a Gigapixel Corp
99009412 Holtek
9901 6565 6565
99029699 Omni Media Technology Inc
9903 6565 6565
99049710 NetMos Technology
9905 7780 USB IRDA-port
9906 9705 PCI 9705 Parallel Port
9907 9715 PCI 9715 Dual Parallel Port
9908 9735 PCI 9735 Multi-I/O Controller
9909 1000 0002 0P2S (2 serial)
9910 1000 0012 1P2S (1 parallel + 2 serial)
9911 9745 PCI 9745 Multi-I/O Controller
9912 1000 0002 0P2S (2 serial)
9913 1000 0012 1P2S (1 parallel + 2 serial)
9914 9755 PCI 9755 Parallel Port and ISA Bridge
9915 9805 PCI 9805 Parallel Port
9916 9815 PCI 9815 Dual Parallel Port
9917 1000 0020 2P0S (2 port parallel adaptor)
9918 9835 PCI 9835 Multi-I/O Controller
9919 1000 0002 0P2S (16C550 UART)
9920 1000 0012 1P2S
9921 9845 PCI 9845 Multi-I/O Controller
9922 1000 0004 0P4S (4 port 16550A serial card)
9923 1000 0006 0P6S (6 port 16550A serial card)
9924 1000 0014 1P4S (4 port 16550A serial card + parallel)
9925 9855 PCI 9855 Multi-I/O Controller
9926 1000 0014 1P4S
99279902 Stargen Inc.
9928 0001 SG2010 PCI over Starfabric Bridge
9929 0002 SG2010 PCI to Starfabric Gateway
9930 0003 SG1010 Starfabric Switch and PCI Bridge
9931a0a0 AOPEN Inc.
9932a0f1 UNISYS Corporation
9933a200 NEC Corporation
9934a259 Hewlett Packard
9935a25b Hewlett Packard GmbH PL24-MKT
9936a304 Sony
9937a727 3Com Corporation
9938 0013 3CRPAG175 Wireless PC Card
9939aa42 Scitex Digital Video
9940ac1e Digital Receiver Technology Inc
9941ac3d Actuality Systems
9942aecb Adrienne Electronics Corporation
9943b1b3 Shiva Europe Limited
9944# Pinnacle should be 11bd, but they got it wrong several times --mj
9945bd11 Pinnacle Systems, Inc. (Wrong ID)
9946c001 TSI Telsys
9947c0a9 Micron/Crucial Technology
9948c0de Motorola
9949c0fe Motion Engineering, Inc.
9950ca50 Varian Australia Pty Ltd
9951cafe Chrysalis-ITS
9952cccc Catapult Communications
9953cddd Tyzx, Inc.
9954 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber
9955 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber
9956d4d4 Dy4 Systems Inc
9957 0601 PCI Mezzanine Card
9958d531 I+ME ACTIA GmbH
9959d84d Exsys
9960dead Indigita Corporation
9961deaf Middle Digital Inc.
9962 9050 PC Weasel Virtual VGA
9963 9051 PC Weasel Serial Port
9964 9052 PC Weasel Watchdog Timer
9965e000 Winbond
9966 e000 W89C940
9967# see also : http://www.schoenfeld.de/inside/Inside_CWMK3.txt maybe a misuse of TJN id or it use the TJN 3XX chip for other applic
9968e159 Tiger Jet Network Inc.
9969 0001 Tiger3XX Modem/ISDN interface
9970 0059 0001 128k ISDN-S/T Adapter
9971 0059 0003 128k ISDN-U Adapter
9972 0002 Tiger100APC ISDN chipset
9973e4bf EKF Elektronik GmbH
9974# Innovative and scalable network IC vendor
9975e55e Essence Technology, Inc.
9976ea01 Eagle Technology
9977# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID.
9978ea60 RME
9979 9896 Digi32
9980 9897 Digi32 Pro
9981 9898 Digi32/8
9982eabb Aashima Technology B.V.
9983eace Endace Measurement Systems, Ltd
9984 3100 DAG 3.10 OC-3/OC-12
9985 3200 DAG 3.2x OC-3/OC-12
9986 320e DAG 3.2E Fast Ethernet
9987 340e DAG 3.4E Fast Ethernet
9988 341e DAG 3.41E Fast Ethernet
9989 3500 DAG 3.5 OC-3/OC-12
9990 351c DAG 3.5ECM Fast Ethernet
9991 4100 DAG 4.10 OC-48
9992 4110 DAG 4.11 OC-48
9993 4220 DAG 4.2 OC-48
9994 422e DAG 4.2E Dual Gigabit Ethernet
9995ec80 Belkin Corporation
9996 ec00 F5D6000
9997ecc0 Echo Digital Audio Corporation
9998edd8 ARK Logic Inc
9999 a091 1000PV [Stingray]
10000 a099 2000PV [Stingray]
10001 a0a1 2000MT
10002 a0a9 2000MI
10003f1d0 AJA Video
10004# All boards I have seen have this ID not efac, though all docs say efac...
10005 cafe KONA SD SMPTE 259M I/O
10006 efac KONA SD SMPTE 259M I/O
10007 facd KONA HD SMPTE 292M I/O
10008fa57 Interagon AS
10009 0001 PMC [Pattern Matching Chip]
10010febd Ultraview Corp.
10011feda Broadcom Inc (nee Epigram)
10012 a0fa BCM4210 iLine10 HomePNA 2.0
10013 a10e BCM4230 iLine10 HomePNA 2.0
10014# IT & Telecom company, develops PCI Trunk cards <www.fedetec.es>
10015fede Fedetec Inc.
10016 0003 TABIC PCI v3
10017fffe VMWare Inc
10018 0405 Virtual SVGA 4.0
10019 0710 Virtual SVGA
10020ffff Illegal Vendor ID
10021
10022
10023# List of known device classes, subclasses and programming interfaces
10024
10025# Syntax:
10026# C class class_name
10027# subclass subclass_name <-- single tab
10028# prog-if prog-if_name <-- two tabs
10029
10030C 00 Unclassified device
10031 00 Non-VGA unclassified device
10032 01 VGA compatible unclassified device
10033C 01 Mass storage controller
10034 00 SCSI storage controller
10035 01 IDE interface
10036 02 Floppy disk controller
10037 03 IPI bus controller
10038 04 RAID bus controller
10039 80 Unknown mass storage controller
10040C 02 Network controller
10041 00 Ethernet controller
10042 01 Token ring network controller
10043 02 FDDI network controller
10044 03 ATM network controller
10045 04 ISDN controller
10046 80 Network controller
10047C 03 Display controller
10048 00 VGA compatible controller
10049 00 VGA
10050 01 8514
10051 01 XGA compatible controller
10052 02 3D controller
10053 80 Display controller
10054C 04 Multimedia controller
10055 00 Multimedia video controller
10056 01 Multimedia audio controller
10057 02 Computer telephony device
10058 80 Multimedia controller
10059C 05 Memory controller
10060 00 RAM memory
10061 01 FLASH memory
10062 80 Memory controller
10063C 06 Bridge
10064 00 Host bridge
10065 01 ISA bridge
10066 02 EISA bridge
10067 03 MicroChannel bridge
10068 04 PCI bridge
10069 00 Normal decode
10070 01 Subtractive decode
10071 05 PCMCIA bridge
10072 06 NuBus bridge
10073 07 CardBus bridge
10074 08 RACEway bridge
10075 00 Transparent mode
10076 01 Endpoint mode
10077 09 Semi-transparent PCI-to-PCI bridge
10078 40 Primary bus towards host CPU
10079 80 Secondary bus towards host CPU
10080 0a InfiniBand to PCI host bridge
10081 80 Bridge
10082C 07 Communication controller
10083 00 Serial controller
10084 00 8250
10085 01 16450
10086 02 16550
10087 03 16650
10088 04 16750
10089 05 16850
10090 06 16950
10091 01 Parallel controller
10092 00 SPP
10093 01 BiDir
10094 02 ECP
10095 03 IEEE1284
10096 fe IEEE1284 Target
10097 02 Multiport serial controller
10098 03 Modem
10099 00 Generic
10100 01 Hayes/16450
10101 02 Hayes/16550
10102 03 Hayes/16650
10103 04 Hayes/16750
10104 80 Communication controller
10105C 08 Generic system peripheral
10106 00 PIC
10107 00 8259
10108 01 ISA PIC
10109 02 EISA PIC
10110 10 IO-APIC
10111 20 IO(X)-APIC
10112 01 DMA controller
10113 00 8237
10114 01 ISA DMA
10115 02 EISA DMA
10116 02 Timer
10117 00 8254
10118 01 ISA Timer
10119 02 EISA Timers
10120 03 RTC
10121 00 Generic
10122 01 ISA RTC
10123 04 PCI Hot-plug controller
10124 80 System peripheral
10125C 09 Input device controller
10126 00 Keyboard controller
10127 01 Digitizer Pen
10128 02 Mouse controller
10129 03 Scanner controller
10130 04 Gameport controller
10131 00 Generic
10132 10 Extended
10133 80 Input device controller
10134C 0a Docking station
10135 00 Generic Docking Station
10136 80 Docking Station
10137C 0b Processor
10138 00 386
10139 01 486
10140 02 Pentium
10141 10 Alpha
10142 20 Power PC
10143 30 MIPS
10144 40 Co-processor
10145C 0c Serial bus controller
10146 00 FireWire (IEEE 1394)
10147 00 Generic
10148 10 OHCI
10149 01 ACCESS Bus
10150 02 SSA
10151 03 USB Controller
10152 00 UHCI
10153 10 OHCI
10154 20 EHCI
10155 80 Unspecified
10156 fe USB Device
10157 04 Fibre Channel
10158 05 SMBus
10159 06 InfiniBand
10160C 0d Wireless controller
10161 00 IRDA controller
10162 01 Consumer IR controller
10163 10 RF controller
10164 80 Wireless controller
10165C 0e Intelligent controller
10166 00 I2O
10167C 0f Satellite communications controller
10168 00 Satellite TV controller
10169 01 Satellite audio communication controller
10170 03 Satellite voice communication controller
10171 04 Satellite data communication controller
10172C 10 Encryption controller
10173 00 Network and computing encryption device
10174 10 Entertainment encryption device
10175 80 Encryption controller
10176C 11 Signal processing controller
10177 00 DPIO module
10178 01 Performance counters
10179 10 Communication synchronizer
10180 80 Signal processing controller
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
index 30bac7ed7c16..3c565ce7f77b 100644
--- a/drivers/pci/pcie/portdrv_pci.c
+++ b/drivers/pci/pcie/portdrv_pci.c
@@ -90,15 +90,19 @@ static void pcie_portdrv_save_config(struct pci_dev *dev)
90 pci_save_msi_state(dev); 90 pci_save_msi_state(dev);
91} 91}
92 92
93static void pcie_portdrv_restore_config(struct pci_dev *dev) 93static int pcie_portdrv_restore_config(struct pci_dev *dev)
94{ 94{
95 struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); 95 struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev);
96 int retval;
96 97
97 pci_restore_state(dev); 98 pci_restore_state(dev);
98 if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE) 99 if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE)
99 pci_restore_msi_state(dev); 100 pci_restore_msi_state(dev);
100 pci_enable_device(dev); 101 retval = pci_enable_device(dev);
102 if (retval)
103 return retval;
101 pci_set_master(dev); 104 pci_set_master(dev);
105 return 0;
102} 106}
103 107
104/* 108/*
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 93e8a878ea95..b9c9b03919d4 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -584,7 +584,7 @@ static int pci_setup_device(struct pci_dev * dev)
584 dev->vendor, dev->device, class, dev->hdr_type); 584 dev->vendor, dev->device, class, dev->hdr_type);
585 585
586 /* "Unknown power state" */ 586 /* "Unknown power state" */
587 dev->current_state = 4; 587 dev->current_state = PCI_UNKNOWN;
588 588
589 /* Early fixups, before probing the BARs */ 589 /* Early fixups, before probing the BARs */
590 pci_fixup_device(pci_fixup_early, dev); 590 pci_fixup_device(pci_fixup_early, dev);
@@ -757,8 +757,6 @@ pci_scan_device(struct pci_bus *bus, int devfn)
757 dev->dev.release = pci_release_dev; 757 dev->dev.release = pci_release_dev;
758 pci_dev_get(dev); 758 pci_dev_get(dev);
759 759
760 pci_name_device(dev);
761
762 dev->dev.dma_mask = &dev->dma_mask; 760 dev->dev.dma_mask = &dev->dma_mask;
763 dev->dev.coherent_dma_mask = 0xffffffffull; 761 dev->dev.coherent_dma_mask = 0xffffffffull;
764 762
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
index 7988fc8df3fd..9613f666c110 100644
--- a/drivers/pci/proc.c
+++ b/drivers/pci/proc.c
@@ -474,7 +474,7 @@ static int show_dev_config(struct seq_file *m, void *v)
474 struct pci_dev *first_dev; 474 struct pci_dev *first_dev;
475 struct pci_driver *drv; 475 struct pci_driver *drv;
476 u32 class_rev; 476 u32 class_rev;
477 unsigned char latency, min_gnt, max_lat, *class; 477 unsigned char latency, min_gnt, max_lat;
478 int reg; 478 int reg;
479 479
480 first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); 480 first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
@@ -490,16 +490,8 @@ static int show_dev_config(struct seq_file *m, void *v)
490 pci_read_config_byte (dev, PCI_MAX_LAT, &max_lat); 490 pci_read_config_byte (dev, PCI_MAX_LAT, &max_lat);
491 seq_printf(m, " Bus %2d, device %3d, function %2d:\n", 491 seq_printf(m, " Bus %2d, device %3d, function %2d:\n",
492 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); 492 dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
493 class = pci_class_name(class_rev >> 16); 493 seq_printf(m, " Class %04x", class_rev >> 16);
494 if (class)
495 seq_printf(m, " %s", class);
496 else
497 seq_printf(m, " Class %04x", class_rev >> 16);
498#ifdef CONFIG_PCI_NAMES
499 seq_printf(m, ": %s", dev->pretty_name);
500#else
501 seq_printf(m, ": PCI device %04x:%04x", dev->vendor, dev->device); 494 seq_printf(m, ": PCI device %04x:%04x", dev->vendor, dev->device);
502#endif
503 seq_printf(m, " (rev %d).\n", class_rev & 0xff); 495 seq_printf(m, " (rev %d).\n", class_rev & 0xff);
504 496
505 if (dev->irq) 497 if (dev->irq)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 140354a2aa72..4f0c1bd3674a 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -245,12 +245,19 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsi
245{ 245{
246 region &= ~(size-1); 246 region &= ~(size-1);
247 if (region) { 247 if (region) {
248 struct pci_bus_region bus_region;
248 struct resource *res = dev->resource + nr; 249 struct resource *res = dev->resource + nr;
249 250
250 res->name = pci_name(dev); 251 res->name = pci_name(dev);
251 res->start = region; 252 res->start = region;
252 res->end = region + size - 1; 253 res->end = region + size - 1;
253 res->flags = IORESOURCE_IO; 254 res->flags = IORESOURCE_IO;
255
256 /* Convert from PCI bus to resource space. */
257 bus_region.start = res->start;
258 bus_region.end = res->end;
259 pcibios_bus_to_resource(dev, res, &bus_region);
260
254 pci_claim_resource(dev, nr); 261 pci_claim_resource(dev, nr);
255 } 262 }
256} 263}
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index 5598b4714f77..50d6685dcbcc 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -26,7 +26,7 @@
26#include "pci.h" 26#include "pci.h"
27 27
28 28
29static void 29void
30pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) 30pci_update_resource(struct pci_dev *dev, struct resource *res, int resno)
31{ 31{
32 struct pci_bus_region region; 32 struct pci_bus_region region;
@@ -97,10 +97,7 @@ pci_claim_resource(struct pci_dev *dev, int resource)
97 char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge"; 97 char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge";
98 int err; 98 int err;
99 99
100 if (res->flags & IORESOURCE_IO) 100 root = pcibios_select_root(dev, res);
101 root = &ioport_resource;
102 if (res->flags & IORESOURCE_MEM)
103 root = &iomem_resource;
104 101
105 err = -EINVAL; 102 err = -EINVAL;
106 if (root != NULL) 103 if (root != NULL)
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
index 320df6cd3def..c2c8fa828e24 100644
--- a/drivers/scsi/ahci.c
+++ b/drivers/scsi/ahci.c
@@ -865,22 +865,6 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
865 return 0; 865 return 0;
866} 866}
867 867
868/* move to PCI layer, integrate w/ MSI stuff */
869static void pci_intx(struct pci_dev *pdev, int enable)
870{
871 u16 pci_command, new;
872
873 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
874
875 if (enable)
876 new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
877 else
878 new = pci_command | PCI_COMMAND_INTX_DISABLE;
879
880 if (new != pci_command)
881 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
882}
883
884static void ahci_print_info(struct ata_probe_ent *probe_ent) 868static void ahci_print_info(struct ata_probe_ent *probe_ent)
885{ 869{
886 struct ahci_host_priv *hpriv = probe_ent->private_data; 870 struct ahci_host_priv *hpriv = probe_ent->private_data;
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
index 5f8688529041..87e0c36f1554 100644
--- a/drivers/scsi/ata_piix.c
+++ b/drivers/scsi/ata_piix.c
@@ -568,18 +568,6 @@ static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev)
568 } 568 }
569} 569}
570 570
571/* move to PCI layer, integrate w/ MSI stuff */
572static void pci_enable_intx(struct pci_dev *pdev)
573{
574 u16 pci_command;
575
576 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
577 if (pci_command & PCI_COMMAND_INTX_DISABLE) {
578 pci_command &= ~PCI_COMMAND_INTX_DISABLE;
579 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
580 }
581}
582
583#define AHCI_PCI_BAR 5 571#define AHCI_PCI_BAR 5
584#define AHCI_GLOBAL_CTL 0x04 572#define AHCI_GLOBAL_CTL 0x04
585#define AHCI_ENABLE (1 << 31) 573#define AHCI_ENABLE (1 << 31)
@@ -677,7 +665,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
677 * message-signalled interrupts currently). 665 * message-signalled interrupts currently).
678 */ 666 */
679 if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR) 667 if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR)
680 pci_enable_intx(pdev); 668 pci_intx(pdev, 1);
681 669
682 if (combined) { 670 if (combined) {
683 port_info[sata_chan] = &piix_port_info[ent->driver_data]; 671 port_info[sata_chan] = &piix_port_info[ent->driver_data];
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c
index f97e3afa97d9..ea76fe44585e 100644
--- a/drivers/scsi/sata_mv.c
+++ b/drivers/scsi/sata_mv.c
@@ -699,22 +699,6 @@ static int mv_host_init(struct ata_probe_ent *probe_ent)
699 return rc; 699 return rc;
700} 700}
701 701
702/* move to PCI layer, integrate w/ MSI stuff */
703static void pci_intx(struct pci_dev *pdev, int enable)
704{
705 u16 pci_command, new;
706
707 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
708
709 if (enable)
710 new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
711 else
712 new = pci_command | PCI_COMMAND_INTX_DISABLE;
713
714 if (new != pci_command)
715 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
716}
717
718static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 702static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
719{ 703{
720 static int printed_version = 0; 704 static int printed_version = 0;
diff --git a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c
index 7d1aaa99aaae..a63f93186e41 100644
--- a/drivers/scsi/sata_sis.c
+++ b/drivers/scsi/sata_sis.c
@@ -55,7 +55,7 @@ enum {
55 SIS180_SATA1_OFS = 0x10, /* offset from sata0->sata1 phy regs */ 55 SIS180_SATA1_OFS = 0x10, /* offset from sata0->sata1 phy regs */
56 SIS182_SATA1_OFS = 0x20, /* offset from sata0->sata1 phy regs */ 56 SIS182_SATA1_OFS = 0x20, /* offset from sata0->sata1 phy regs */
57 SIS_PMR = 0x90, /* port mapping register */ 57 SIS_PMR = 0x90, /* port mapping register */
58 SIS_PMR_COMBINED = 0x30, 58 SIS_PMR_COMBINED = 0x30,
59 59
60 /* random bits */ 60 /* random bits */
61 SIS_FLAG_CFGSCR = (1 << 30), /* host flag: SCRs via PCI cfg */ 61 SIS_FLAG_CFGSCR = (1 << 30), /* host flag: SCRs via PCI cfg */
@@ -147,11 +147,13 @@ static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg,
147{ 147{
148 unsigned int addr = SIS_SCR_BASE + (4 * sc_reg); 148 unsigned int addr = SIS_SCR_BASE + (4 * sc_reg);
149 149
150 if (port_no) 150 if (port_no) {
151 if (device == 0x182) 151 if (device == 0x182)
152 addr += SIS182_SATA1_OFS; 152 addr += SIS182_SATA1_OFS;
153 else 153 else
154 addr += SIS180_SATA1_OFS; 154 addr += SIS180_SATA1_OFS;
155 }
156
155 return addr; 157 return addr;
156} 158}
157 159
@@ -166,10 +168,10 @@ static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
166 return 0xffffffff; 168 return 0xffffffff;
167 169
168 pci_read_config_byte(pdev, SIS_PMR, &pmr); 170 pci_read_config_byte(pdev, SIS_PMR, &pmr);
169 171
170 pci_read_config_dword(pdev, cfg_addr, &val); 172 pci_read_config_dword(pdev, cfg_addr, &val);
171 173
172 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) 174 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
173 pci_read_config_dword(pdev, cfg_addr+0x10, &val2); 175 pci_read_config_dword(pdev, cfg_addr+0x10, &val2);
174 176
175 return val|val2; 177 return val|val2;
@@ -185,7 +187,7 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
185 return; 187 return;
186 188
187 pci_read_config_byte(pdev, SIS_PMR, &pmr); 189 pci_read_config_byte(pdev, SIS_PMR, &pmr);
188 190
189 pci_write_config_dword(pdev, cfg_addr, val); 191 pci_write_config_dword(pdev, cfg_addr, val);
190 192
191 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) 193 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
@@ -195,7 +197,7 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
195static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg) 197static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
196{ 198{
197 struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); 199 struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
198 u32 val,val2; 200 u32 val, val2 = 0;
199 u8 pmr; 201 u8 pmr;
200 202
201 if (sc_reg > SCR_CONTROL) 203 if (sc_reg > SCR_CONTROL)
@@ -209,9 +211,9 @@ static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
209 val = inl(ap->ioaddr.scr_addr + (sc_reg * 4)); 211 val = inl(ap->ioaddr.scr_addr + (sc_reg * 4));
210 212
211 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) 213 if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
212 val2 = inl(ap->ioaddr.scr_addr + (sc_reg * 4)+0x10); 214 val2 = inl(ap->ioaddr.scr_addr + (sc_reg * 4) + 0x10);
213 215
214 return val|val2; 216 return val | val2;
215} 217}
216 218
217static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) 219static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
@@ -223,7 +225,7 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
223 return; 225 return;
224 226
225 pci_read_config_byte(pdev, SIS_PMR, &pmr); 227 pci_read_config_byte(pdev, SIS_PMR, &pmr);
226 228
227 if (ap->flags & SIS_FLAG_CFGSCR) 229 if (ap->flags & SIS_FLAG_CFGSCR)
228 sis_scr_cfg_write(ap, sc_reg, val); 230 sis_scr_cfg_write(ap, sc_reg, val);
229 else { 231 else {
@@ -233,18 +235,6 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
233 } 235 }
234} 236}
235 237
236/* move to PCI layer, integrate w/ MSI stuff */
237static void pci_enable_intx(struct pci_dev *pdev)
238{
239 u16 pci_command;
240
241 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
242 if (pci_command & PCI_COMMAND_INTX_DISABLE) {
243 pci_command &= ~PCI_COMMAND_INTX_DISABLE;
244 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
245 }
246}
247
248static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 238static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
249{ 239{
250 struct ata_probe_ent *probe_ent = NULL; 240 struct ata_probe_ent *probe_ent = NULL;
@@ -319,7 +309,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
319 } 309 }
320 310
321 pci_set_master(pdev); 311 pci_set_master(pdev);
322 pci_enable_intx(pdev); 312 pci_intx(pdev, 1);
323 313
324 /* FIXME: check ata_device_add return value */ 314 /* FIXME: check ata_device_add return value */
325 ata_device_add(probe_ent); 315 ata_device_add(probe_ent);
diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c
index 42e13ed8eb5b..4c9fb8b71be1 100644
--- a/drivers/scsi/sata_uli.c
+++ b/drivers/scsi/sata_uli.c
@@ -176,18 +176,6 @@ static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
176 uli_scr_cfg_write(ap, sc_reg, val); 176 uli_scr_cfg_write(ap, sc_reg, val);
177} 177}
178 178
179/* move to PCI layer, integrate w/ MSI stuff */
180static void pci_enable_intx(struct pci_dev *pdev)
181{
182 u16 pci_command;
183
184 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
185 if (pci_command & PCI_COMMAND_INTX_DISABLE) {
186 pci_command &= ~PCI_COMMAND_INTX_DISABLE;
187 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
188 }
189}
190
191static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 179static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
192{ 180{
193 struct ata_probe_ent *probe_ent; 181 struct ata_probe_ent *probe_ent;
@@ -260,7 +248,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
260 } 248 }
261 249
262 pci_set_master(pdev); 250 pci_set_master(pdev);
263 pci_enable_intx(pdev); 251 pci_intx(pdev, 1);
264 252
265 /* FIXME: check ata_device_add return value */ 253 /* FIXME: check ata_device_add return value */
266 ata_device_add(probe_ent); 254 ata_device_add(probe_ent);
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 30a0a3d10145..5b65e208893b 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2536,7 +2536,7 @@ static int __init serial8250_init(void)
2536 goto out; 2536 goto out;
2537 2537
2538 serial8250_isa_devs = platform_device_register_simple("serial8250", 2538 serial8250_isa_devs = platform_device_register_simple("serial8250",
2539 -1, NULL, 0); 2539 PLAT8250_DEV_LEGACY, NULL, 0);
2540 if (IS_ERR(serial8250_isa_devs)) { 2540 if (IS_ERR(serial8250_isa_devs)) {
2541 ret = PTR_ERR(serial8250_isa_devs); 2541 ret = PTR_ERR(serial8250_isa_devs);
2542 goto unreg; 2542 goto unreg;
diff --git a/drivers/serial/8250_accent.c b/drivers/serial/8250_accent.c
index 1f2c276063ef..9c10262f2469 100644
--- a/drivers/serial/8250_accent.c
+++ b/drivers/serial/8250_accent.c
@@ -29,7 +29,7 @@ static struct plat_serial8250_port accent_data[] = {
29 29
30static struct platform_device accent_device = { 30static struct platform_device accent_device = {
31 .name = "serial8250", 31 .name = "serial8250",
32 .id = 2, 32 .id = PLAT8250_DEV_ACCENT,
33 .dev = { 33 .dev = {
34 .platform_data = accent_data, 34 .platform_data = accent_data,
35 }, 35 },
diff --git a/drivers/serial/8250_boca.c b/drivers/serial/8250_boca.c
index 465c9ea1e7a3..3bfe0f7b26fb 100644
--- a/drivers/serial/8250_boca.c
+++ b/drivers/serial/8250_boca.c
@@ -43,7 +43,7 @@ static struct plat_serial8250_port boca_data[] = {
43 43
44static struct platform_device boca_device = { 44static struct platform_device boca_device = {
45 .name = "serial8250", 45 .name = "serial8250",
46 .id = 3, 46 .id = PLAT8250_DEV_BOCA,
47 .dev = { 47 .dev = {
48 .platform_data = boca_data, 48 .platform_data = boca_data,
49 }, 49 },
diff --git a/drivers/serial/8250_fourport.c b/drivers/serial/8250_fourport.c
index e9b4d908ef42..6375d68b7913 100644
--- a/drivers/serial/8250_fourport.c
+++ b/drivers/serial/8250_fourport.c
@@ -35,7 +35,7 @@ static struct plat_serial8250_port fourport_data[] = {
35 35
36static struct platform_device fourport_device = { 36static struct platform_device fourport_device = {
37 .name = "serial8250", 37 .name = "serial8250",
38 .id = 1, 38 .id = PLAT8250_DEV_FOURPORT,
39 .dev = { 39 .dev = {
40 .platform_data = fourport_data, 40 .platform_data = fourport_data,
41 }, 41 },
diff --git a/drivers/serial/8250_hub6.c b/drivers/serial/8250_hub6.c
index 77f396f84b4c..daf569cd3c8f 100644
--- a/drivers/serial/8250_hub6.c
+++ b/drivers/serial/8250_hub6.c
@@ -40,7 +40,7 @@ static struct plat_serial8250_port hub6_data[] = {
40 40
41static struct platform_device hub6_device = { 41static struct platform_device hub6_device = {
42 .name = "serial8250", 42 .name = "serial8250",
43 .id = 4, 43 .id = PLAT8250_DEV_HUB6,
44 .dev = { 44 .dev = {
45 .platform_data = hub6_data, 45 .platform_data = hub6_data,
46 }, 46 },
diff --git a/drivers/serial/8250_mca.c b/drivers/serial/8250_mca.c
index f0c40d68b8c1..ac205256d5f3 100644
--- a/drivers/serial/8250_mca.c
+++ b/drivers/serial/8250_mca.c
@@ -44,7 +44,7 @@ static struct plat_serial8250_port mca_data[] = {
44 44
45static struct platform_device mca_device = { 45static struct platform_device mca_device = {
46 .name = "serial8250", 46 .name = "serial8250",
47 .id = 5, 47 .id = PLAT8250_DEV_MCA,
48 .dev = { 48 .dev = {
49 .platform_data = mca_data, 49 .platform_data = mca_data,
50 }, 50 },
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c
index 8e184e2641cb..79861ee12a29 100644
--- a/drivers/usb/atm/cxacru.c
+++ b/drivers/usb/atm/cxacru.c
@@ -715,13 +715,11 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
715 usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), 715 usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD),
716 instance->rcv_buf, PAGE_SIZE, 716 instance->rcv_buf, PAGE_SIZE,
717 cxacru_blocking_completion, &instance->rcv_done, 1); 717 cxacru_blocking_completion, &instance->rcv_done, 1);
718 instance->rcv_urb->transfer_flags |= URB_ASYNC_UNLINK;
719 718
720 usb_fill_int_urb(instance->snd_urb, 719 usb_fill_int_urb(instance->snd_urb,
721 usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), 720 usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD),
722 instance->snd_buf, PAGE_SIZE, 721 instance->snd_buf, PAGE_SIZE,
723 cxacru_blocking_completion, &instance->snd_done, 4); 722 cxacru_blocking_completion, &instance->snd_done, 4);
724 instance->snd_urb->transfer_flags |= URB_ASYNC_UNLINK;
725 723
726 init_MUTEX(&instance->cm_serialize); 724 init_MUTEX(&instance->cm_serialize);
727 725
diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig
index 0561d0234f23..333e39bb105f 100644
--- a/drivers/usb/class/Kconfig
+++ b/drivers/usb/class/Kconfig
@@ -4,9 +4,22 @@
4comment "USB Device Class drivers" 4comment "USB Device Class drivers"
5 depends on USB 5 depends on USB
6 6
7config OBSOLETE_OSS_USB_DRIVER
8 bool "Obsolete OSS USB drivers"
9 depends on USB && SOUND
10 help
11 This option enables support for the obsolete USB Audio and Midi
12 drivers that are scheduled for removal in the near future since
13 there are ALSA drivers for the same hardware.
14
15 Please contact Adrian Bunk <bunk@stusta.de> if you had to
16 say Y here because of missing support in the ALSA drivers.
17
18 If unsure, say N.
19
7config USB_AUDIO 20config USB_AUDIO
8 tristate "USB Audio support" 21 tristate "USB Audio support"
9 depends on USB && SOUND 22 depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER
10 help 23 help
11 Say Y here if you want to connect USB audio equipment such as 24 Say Y here if you want to connect USB audio equipment such as
12 speakers to your computer's USB port. You only need this if you use 25 speakers to your computer's USB port. You only need this if you use
@@ -40,10 +53,12 @@ config USB_BLUETOOTH_TTY
40 53
41config USB_MIDI 54config USB_MIDI
42 tristate "USB MIDI support" 55 tristate "USB MIDI support"
43 depends on USB && SOUND 56 depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER
44 ---help--- 57 ---help---
45 Say Y here if you want to connect a USB MIDI device to your 58 Say Y here if you want to connect a USB MIDI device to your
46 computer's USB port. This driver is for devices that comply with 59 computer's USB port. You only need this if you use the OSS
60 sound system; USB MIDI devices are supported by ALSA's USB
61 audio driver. This driver is for devices that comply with
47 'Universal Serial Bus Device Class Definition for MIDI Device'. 62 'Universal Serial Bus Device Class Definition for MIDI Device'.
48 63
49 The following devices are known to work: 64 The following devices are known to work:
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
index 7ce43fb8118a..e195709c9c7f 100644
--- a/drivers/usb/class/usblp.c
+++ b/drivers/usb/class/usblp.c
@@ -310,8 +310,9 @@ static int usblp_check_status(struct usblp *usblp, int err)
310 310
311 error = usblp_read_status (usblp, usblp->statusbuf); 311 error = usblp_read_status (usblp, usblp->statusbuf);
312 if (error < 0) { 312 if (error < 0) {
313 err("usblp%d: error %d reading printer status", 313 if (printk_ratelimit())
314 usblp->minor, error); 314 err("usblp%d: error %d reading printer status",
315 usblp->minor, error);
315 return 0; 316 return 0;
316 } 317 }
317 318
@@ -604,7 +605,9 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
604 605
605 case LPGETSTATUS: 606 case LPGETSTATUS:
606 if (usblp_read_status(usblp, usblp->statusbuf)) { 607 if (usblp_read_status(usblp, usblp->statusbuf)) {
607 err("usblp%d: failed reading printer status", usblp->minor); 608 if (printk_ratelimit())
609 err("usblp%d: failed reading printer status",
610 usblp->minor);
608 retval = -EIO; 611 retval = -EIO;
609 goto done; 612 goto done;
610 } 613 }
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 9e8c377b8161..d5503cf0bf74 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -3,14 +3,14 @@
3# 3#
4 4
5usbcore-objs := usb.o hub.o hcd.o urb.o message.o \ 5usbcore-objs := usb.o hub.o hcd.o urb.o message.o \
6 config.o file.o buffer.o sysfs.o 6 config.o file.o buffer.o sysfs.o devio.o
7 7
8ifeq ($(CONFIG_PCI),y) 8ifeq ($(CONFIG_PCI),y)
9 usbcore-objs += hcd-pci.o 9 usbcore-objs += hcd-pci.o
10endif 10endif
11 11
12ifeq ($(CONFIG_USB_DEVICEFS),y) 12ifeq ($(CONFIG_USB_DEVICEFS),y)
13 usbcore-objs += devio.o inode.o devices.o 13 usbcore-objs += inode.o devices.o
14endif 14endif
15 15
16obj-$(CONFIG_USB) += usbcore.o 16obj-$(CONFIG_USB) += usbcore.o
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index f86bf1454e21..b4265aa7d45e 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -43,6 +43,7 @@
43#include <linux/module.h> 43#include <linux/module.h>
44#include <linux/usb.h> 44#include <linux/usb.h>
45#include <linux/usbdevice_fs.h> 45#include <linux/usbdevice_fs.h>
46#include <linux/cdev.h>
46#include <asm/uaccess.h> 47#include <asm/uaccess.h>
47#include <asm/byteorder.h> 48#include <asm/byteorder.h>
48#include <linux/moduleparam.h> 49#include <linux/moduleparam.h>
@@ -50,6 +51,10 @@
50#include "hcd.h" /* for usbcore internals */ 51#include "hcd.h" /* for usbcore internals */
51#include "usb.h" 52#include "usb.h"
52 53
54#define USB_MAXBUS 64
55#define USB_DEVICE_MAX USB_MAXBUS * 128
56static struct class *usb_device_class;
57
53struct async { 58struct async {
54 struct list_head asynclist; 59 struct list_head asynclist;
55 struct dev_state *ps; 60 struct dev_state *ps;
@@ -71,6 +76,8 @@ MODULE_PARM_DESC (usbfs_snoop, "true to log all usbfs traffic");
71 dev_info( dev , format , ## arg); \ 76 dev_info( dev , format , ## arg); \
72 } while (0) 77 } while (0)
73 78
79#define USB_DEVICE_DEV MKDEV(USB_DEVICE_MAJOR, 0)
80
74 81
75#define MAX_USBFS_BUFFER_SIZE 16384 82#define MAX_USBFS_BUFFER_SIZE 16384
76 83
@@ -487,7 +494,7 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig
487 */ 494 */
488static int usbdev_open(struct inode *inode, struct file *file) 495static int usbdev_open(struct inode *inode, struct file *file)
489{ 496{
490 struct usb_device *dev; 497 struct usb_device *dev = NULL;
491 struct dev_state *ps; 498 struct dev_state *ps;
492 int ret; 499 int ret;
493 500
@@ -501,11 +508,16 @@ static int usbdev_open(struct inode *inode, struct file *file)
501 508
502 lock_kernel(); 509 lock_kernel();
503 ret = -ENOENT; 510 ret = -ENOENT;
504 dev = usb_get_dev(inode->u.generic_ip); 511 /* check if we are called from a real node or usbfs */
512 if (imajor(inode) == USB_DEVICE_MAJOR)
513 dev = usbdev_lookup_minor(iminor(inode));
514 if (!dev)
515 dev = inode->u.generic_ip;
505 if (!dev) { 516 if (!dev) {
506 kfree(ps); 517 kfree(ps);
507 goto out; 518 goto out;
508 } 519 }
520 usb_get_dev(dev);
509 ret = 0; 521 ret = 0;
510 ps->dev = dev; 522 ps->dev = dev;
511 ps->file = file; 523 ps->file = file;
@@ -1226,7 +1238,6 @@ static int proc_ioctl (struct dev_state *ps, void __user *arg)
1226 int retval = 0; 1238 int retval = 0;
1227 struct usb_interface *intf = NULL; 1239 struct usb_interface *intf = NULL;
1228 struct usb_driver *driver = NULL; 1240 struct usb_driver *driver = NULL;
1229 int i;
1230 1241
1231 /* get input parameters and alloc buffer */ 1242 /* get input parameters and alloc buffer */
1232 if (copy_from_user(&ctrl, arg, sizeof (ctrl))) 1243 if (copy_from_user(&ctrl, arg, sizeof (ctrl)))
@@ -1258,15 +1269,6 @@ static int proc_ioctl (struct dev_state *ps, void __user *arg)
1258 /* disconnect kernel driver from interface */ 1269 /* disconnect kernel driver from interface */
1259 case USBDEVFS_DISCONNECT: 1270 case USBDEVFS_DISCONNECT:
1260 1271
1261 /* don't allow the user to unbind the hub driver from
1262 * a hub with children to manage */
1263 for (i = 0; i < ps->dev->maxchild; ++i) {
1264 if (ps->dev->children[i])
1265 retval = -EBUSY;
1266 }
1267 if (retval)
1268 break;
1269
1270 down_write(&usb_bus_type.subsys.rwsem); 1272 down_write(&usb_bus_type.subsys.rwsem);
1271 if (intf->dev.driver) { 1273 if (intf->dev.driver) {
1272 driver = to_usb_driver(intf->dev.driver); 1274 driver = to_usb_driver(intf->dev.driver);
@@ -1477,3 +1479,79 @@ struct file_operations usbfs_device_file_operations = {
1477 .open = usbdev_open, 1479 .open = usbdev_open,
1478 .release = usbdev_release, 1480 .release = usbdev_release,
1479}; 1481};
1482
1483struct usb_device *usbdev_lookup_minor(int minor)
1484{
1485 struct class_device *class_dev;
1486 struct usb_device *dev = NULL;
1487
1488 down(&usb_device_class->sem);
1489 list_for_each_entry(class_dev, &usb_device_class->children, node) {
1490 if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) {
1491 dev = class_dev->class_data;
1492 break;
1493 }
1494 }
1495 up(&usb_device_class->sem);
1496
1497 return dev;
1498};
1499
1500void usbdev_add(struct usb_device *dev)
1501{
1502 int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1);
1503
1504 dev->class_dev = class_device_create(usb_device_class,
1505 MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev,
1506 "usbdev%d.%d", dev->bus->busnum, dev->devnum);
1507
1508 dev->class_dev->class_data = dev;
1509}
1510
1511void usbdev_remove(struct usb_device *dev)
1512{
1513 class_device_unregister(dev->class_dev);
1514}
1515
1516static struct cdev usb_device_cdev = {
1517 .kobj = {.name = "usb_device", },
1518 .owner = THIS_MODULE,
1519};
1520
1521int __init usbdev_init(void)
1522{
1523 int retval;
1524
1525 retval = register_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX,
1526 "usb_device");
1527 if (retval) {
1528 err("unable to register minors for usb_device");
1529 goto out;
1530 }
1531 cdev_init(&usb_device_cdev, &usbfs_device_file_operations);
1532 retval = cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX);
1533 if (retval) {
1534 err("unable to get usb_device major %d", USB_DEVICE_MAJOR);
1535 unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
1536 goto out;
1537 }
1538 usb_device_class = class_create(THIS_MODULE, "usb_device");
1539 if (IS_ERR(usb_device_class)) {
1540 err("unable to register usb_device class");
1541 retval = PTR_ERR(usb_device_class);
1542 usb_device_class = NULL;
1543 cdev_del(&usb_device_cdev);
1544 unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
1545 }
1546
1547out:
1548 return retval;
1549}
1550
1551void usbdev_cleanup(void)
1552{
1553 class_destroy(usb_device_class);
1554 cdev_del(&usb_device_cdev);
1555 unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX);
1556}
1557
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
index fc056062c960..cbb451d227d2 100644
--- a/drivers/usb/core/hcd-pci.c
+++ b/drivers/usb/core/hcd-pci.c
@@ -121,10 +121,6 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id)
121 } 121 }
122 } 122 }
123 123
124#ifdef CONFIG_PCI_NAMES
125 hcd->product_desc = dev->pretty_name;
126#endif
127
128 pci_set_master (dev); 124 pci_set_master (dev);
129 125
130 retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ); 126 retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ);
@@ -264,8 +260,10 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
264 retval = pci_set_power_state (dev, PCI_D3hot); 260 retval = pci_set_power_state (dev, PCI_D3hot);
265 if (retval == 0) { 261 if (retval == 0) {
266 dev_dbg (hcd->self.controller, "--> PCI D3\n"); 262 dev_dbg (hcd->self.controller, "--> PCI D3\n");
267 pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup); 263 retval = pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup);
268 pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup); 264 if (retval)
265 break;
266 retval = pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup);
269 } else if (retval < 0) { 267 } else if (retval < 0) {
270 dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n", 268 dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n",
271 retval); 269 retval);
@@ -339,8 +337,20 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
339 dev->current_state); 337 dev->current_state);
340 } 338 }
341#endif 339#endif
342 pci_enable_wake (dev, dev->current_state, 0); 340 retval = pci_enable_wake (dev, dev->current_state, 0);
343 pci_enable_wake (dev, PCI_D3cold, 0); 341 if (retval) {
342 dev_err(hcd->self.controller,
343 "can't enable_wake to %d, %d!\n",
344 dev->current_state, retval);
345 return retval;
346 }
347 retval = pci_enable_wake (dev, PCI_D3cold, 0);
348 if (retval) {
349 dev_err(hcd->self.controller,
350 "can't enable_wake to %d, %d!\n",
351 PCI_D3cold, retval);
352 return retval;
353 }
344 } else { 354 } else {
345 /* Same basic cases: clean (powered/not), dirty */ 355 /* Same basic cases: clean (powered/not), dirty */
346 dev_dbg(hcd->self.controller, "PCI legacy resume\n"); 356 dev_dbg(hcd->self.controller, "PCI legacy resume\n");
@@ -380,7 +390,7 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
380 usb_hc_died (hcd); 390 usb_hc_died (hcd);
381 } 391 }
382 392
383 pci_enable_device(dev); 393 retval = pci_enable_device(dev);
384 return retval; 394 return retval;
385} 395}
386EXPORT_SYMBOL (usb_hcd_pci_resume); 396EXPORT_SYMBOL (usb_hcd_pci_resume);
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
index 28055f95645b..ac451fa7e4d2 100644
--- a/drivers/usb/core/hcd.h
+++ b/drivers/usb/core/hcd.h
@@ -339,11 +339,11 @@ extern int usb_check_bandwidth (struct usb_device *dev, struct urb *urb);
339 * to preallocate bandwidth) 339 * to preallocate bandwidth)
340 */ 340 */
341#define USB2_HOST_DELAY 5 /* nsec, guess */ 341#define USB2_HOST_DELAY 5 /* nsec, guess */
342#define HS_NSECS(bytes) ( ((55 * 8 * 2083)/1000) \ 342#define HS_NSECS(bytes) ( ((55 * 8 * 2083) \
343 + ((2083UL * (3167 + BitTime (bytes)))/1000) \ 343 + (2083UL * (3 + BitTime(bytes))))/1000 \
344 + USB2_HOST_DELAY) 344 + USB2_HOST_DELAY)
345#define HS_NSECS_ISO(bytes) ( ((38 * 8 * 2083)/1000) \ 345#define HS_NSECS_ISO(bytes) ( ((38 * 8 * 2083) \
346 + ((2083UL * (3167 + BitTime (bytes)))/1000) \ 346 + (2083UL * (3 + BitTime(bytes))))/1000 \
347 + USB2_HOST_DELAY) 347 + USB2_HOST_DELAY)
348#define HS_USECS(bytes) NS_TO_US (HS_NSECS(bytes)) 348#define HS_USECS(bytes) NS_TO_US (HS_NSECS(bytes))
349#define HS_USECS_ISO(bytes) NS_TO_US (HS_NSECS_ISO(bytes)) 349#define HS_USECS_ISO(bytes) NS_TO_US (HS_NSECS_ISO(bytes))
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index c9412daff682..758c7f0ed159 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -492,6 +492,23 @@ static int hub_hub_status(struct usb_hub *hub,
492 return ret; 492 return ret;
493} 493}
494 494
495static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
496{
497 struct usb_device *hdev = hub->hdev;
498 int ret;
499
500 if (hdev->children[port1-1] && set_state) {
501 usb_set_device_state(hdev->children[port1-1],
502 USB_STATE_NOTATTACHED);
503 }
504 ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
505 if (ret)
506 dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
507 port1, ret);
508
509 return ret;
510}
511
495static int hub_configure(struct usb_hub *hub, 512static int hub_configure(struct usb_hub *hub,
496 struct usb_endpoint_descriptor *endpoint) 513 struct usb_endpoint_descriptor *endpoint)
497{ 514{
@@ -610,19 +627,33 @@ static int hub_configure(struct usb_hub *hub,
610 break; 627 break;
611 } 628 }
612 629
630 /* Note 8 FS bit times == (8 bits / 12000000 bps) ~= 666ns */
613 switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { 631 switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {
614 case 0x00: 632 case HUB_TTTT_8_BITS:
615 if (hdev->descriptor.bDeviceProtocol != 0) 633 if (hdev->descriptor.bDeviceProtocol != 0) {
616 dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n"); 634 hub->tt.think_time = 666;
635 dev_dbg(hub_dev, "TT requires at most %d "
636 "FS bit times (%d ns)\n",
637 8, hub->tt.think_time);
638 }
617 break; 639 break;
618 case 0x20: 640 case HUB_TTTT_16_BITS:
619 dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n"); 641 hub->tt.think_time = 666 * 2;
642 dev_dbg(hub_dev, "TT requires at most %d "
643 "FS bit times (%d ns)\n",
644 16, hub->tt.think_time);
620 break; 645 break;
621 case 0x40: 646 case HUB_TTTT_24_BITS:
622 dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n"); 647 hub->tt.think_time = 666 * 3;
648 dev_dbg(hub_dev, "TT requires at most %d "
649 "FS bit times (%d ns)\n",
650 24, hub->tt.think_time);
623 break; 651 break;
624 case 0x60: 652 case HUB_TTTT_32_BITS:
625 dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n"); 653 hub->tt.think_time = 666 * 4;
654 dev_dbg(hub_dev, "TT requires at most %d "
655 "FS bit times (%d ns)\n",
656 32, hub->tt.think_time);
626 break; 657 break;
627 } 658 }
628 659
@@ -712,20 +743,36 @@ fail:
712 743
713static unsigned highspeed_hubs; 744static unsigned highspeed_hubs;
714 745
746/* Called after the hub driver is unbound from a hub with children */
747static void hub_remove_children_work(void *__hub)
748{
749 struct usb_hub *hub = __hub;
750 struct usb_device *hdev = hub->hdev;
751 int i;
752
753 kfree(hub);
754
755 usb_lock_device(hdev);
756 for (i = 0; i < hdev->maxchild; ++i) {
757 if (hdev->children[i])
758 usb_disconnect(&hdev->children[i]);
759 }
760 usb_unlock_device(hdev);
761 usb_put_dev(hdev);
762}
763
715static void hub_disconnect(struct usb_interface *intf) 764static void hub_disconnect(struct usb_interface *intf)
716{ 765{
717 struct usb_hub *hub = usb_get_intfdata (intf); 766 struct usb_hub *hub = usb_get_intfdata (intf);
718 struct usb_device *hdev; 767 struct usb_device *hdev;
768 int n, port1;
719 769
720 if (!hub) 770 usb_set_intfdata (intf, NULL);
721 return;
722 hdev = hub->hdev; 771 hdev = hub->hdev;
723 772
724 if (hdev->speed == USB_SPEED_HIGH) 773 if (hdev->speed == USB_SPEED_HIGH)
725 highspeed_hubs--; 774 highspeed_hubs--;
726 775
727 usb_set_intfdata (intf, NULL);
728
729 hub_quiesce(hub); 776 hub_quiesce(hub);
730 usb_free_urb(hub->urb); 777 usb_free_urb(hub->urb);
731 hub->urb = NULL; 778 hub->urb = NULL;
@@ -746,8 +793,27 @@ static void hub_disconnect(struct usb_interface *intf)
746 hub->buffer = NULL; 793 hub->buffer = NULL;
747 } 794 }
748 795
749 /* Free the memory */ 796 /* If there are any children then this is an unbind only, not a
750 kfree(hub); 797 * physical disconnection. The active ports must be disabled
798 * and later on we must call usb_disconnect(). We can't call
799 * it now because we may not hold the hub's device lock.
800 */
801 n = 0;
802 for (port1 = 1; port1 <= hdev->maxchild; ++port1) {
803 if (hdev->children[port1 - 1]) {
804 ++n;
805 hub_port_disable(hub, port1, 1);
806 }
807 }
808
809 if (n == 0)
810 kfree(hub);
811 else {
812 /* Reuse the hub->leds work_struct for our own purposes */
813 INIT_WORK(&hub->leds, hub_remove_children_work, hub);
814 schedule_work(&hub->leds);
815 usb_get_dev(hdev);
816 }
751} 817}
752 818
753static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) 819static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@ -1051,6 +1117,7 @@ void usb_disconnect(struct usb_device **pdev)
1051 dev_dbg (&udev->dev, "unregistering device\n"); 1117 dev_dbg (&udev->dev, "unregistering device\n");
1052 release_address(udev); 1118 release_address(udev);
1053 usbfs_remove_device(udev); 1119 usbfs_remove_device(udev);
1120 usbdev_remove(udev);
1054 usb_remove_sysfs_dev_files(udev); 1121 usb_remove_sysfs_dev_files(udev);
1055 1122
1056 /* Avoid races with recursively_mark_NOTATTACHED() */ 1123 /* Avoid races with recursively_mark_NOTATTACHED() */
@@ -1290,6 +1357,7 @@ int usb_new_device(struct usb_device *udev)
1290 /* USB device state == configured ... usable */ 1357 /* USB device state == configured ... usable */
1291 1358
1292 /* add a /proc/bus/usb entry */ 1359 /* add a /proc/bus/usb entry */
1360 usbdev_add(udev);
1293 usbfs_add_device(udev); 1361 usbfs_add_device(udev);
1294 return 0; 1362 return 0;
1295 1363
@@ -1428,23 +1496,6 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
1428 return status; 1496 return status;
1429} 1497}
1430 1498
1431static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
1432{
1433 struct usb_device *hdev = hub->hdev;
1434 int ret;
1435
1436 if (hdev->children[port1-1] && set_state) {
1437 usb_set_device_state(hdev->children[port1-1],
1438 USB_STATE_NOTATTACHED);
1439 }
1440 ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
1441 if (ret)
1442 dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
1443 port1, ret);
1444
1445 return ret;
1446}
1447
1448/* 1499/*
1449 * Disable a port and mark a logical connnect-change event, so that some 1500 * Disable a port and mark a logical connnect-change event, so that some
1450 * time later khubd will disconnect() any existing usb_device on the port 1501 * time later khubd will disconnect() any existing usb_device on the port
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index 53bf5649621e..e7fa9b5a521e 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -157,6 +157,12 @@ enum hub_led_mode {
157 157
158struct usb_device; 158struct usb_device;
159 159
160/* Transaction Translator Think Times, in bits */
161#define HUB_TTTT_8_BITS 0x00
162#define HUB_TTTT_16_BITS 0x20
163#define HUB_TTTT_24_BITS 0x40
164#define HUB_TTTT_32_BITS 0x60
165
160/* 166/*
161 * As of USB 2.0, full/low speed devices are segregated into trees. 167 * As of USB 2.0, full/low speed devices are segregated into trees.
162 * One type grows from USB 1.1 host controllers (OHCI, UHCI etc). 168 * One type grows from USB 1.1 host controllers (OHCI, UHCI etc).
@@ -170,6 +176,7 @@ struct usb_device;
170struct usb_tt { 176struct usb_tt {
171 struct usb_device *hub; /* upstream highspeed hub */ 177 struct usb_device *hub; /* upstream highspeed hub */
172 int multi; /* true means one TT per port */ 178 int multi; /* true means one TT per port */
179 unsigned think_time; /* think time in ns */
173 180
174 /* for control/bulk error recovery (CLEAR_TT_BUFFER) */ 181 /* for control/bulk error recovery (CLEAR_TT_BUFFER) */
175 spinlock_t lock; 182 spinlock_t lock;
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c
index c3e3a95d3804..640f41e47029 100644
--- a/drivers/usb/core/inode.c
+++ b/drivers/usb/core/inode.c
@@ -728,15 +728,9 @@ int __init usbfs_init(void)
728{ 728{
729 int retval; 729 int retval;
730 730
731 retval = usb_register(&usbfs_driver);
732 if (retval)
733 return retval;
734
735 retval = register_filesystem(&usb_fs_type); 731 retval = register_filesystem(&usb_fs_type);
736 if (retval) { 732 if (retval)
737 usb_deregister(&usbfs_driver);
738 return retval; 733 return retval;
739 }
740 734
741 /* create mount point for usbfs */ 735 /* create mount point for usbfs */
742 usbdir = proc_mkdir("usb", proc_bus); 736 usbdir = proc_mkdir("usb", proc_bus);
@@ -746,7 +740,6 @@ int __init usbfs_init(void)
746 740
747void usbfs_cleanup(void) 741void usbfs_cleanup(void)
748{ 742{
749 usb_deregister(&usbfs_driver);
750 unregister_filesystem(&usb_fs_type); 743 unregister_filesystem(&usb_fs_type);
751 if (usbdir) 744 if (usbdir)
752 remove_proc_entry("usb", proc_bus); 745 remove_proc_entry("usb", proc_bus);
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 88d1b376f67c..c47c8052b486 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -48,7 +48,6 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
48 48
49 init_completion(&done); 49 init_completion(&done);
50 urb->context = &done; 50 urb->context = &done;
51 urb->transfer_flags |= URB_ASYNC_UNLINK;
52 urb->actual_length = 0; 51 urb->actual_length = 0;
53 status = usb_submit_urb(urb, GFP_NOIO); 52 status = usb_submit_urb(urb, GFP_NOIO);
54 53
@@ -266,7 +265,9 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs)
266 continue; 265 continue;
267 if (found) { 266 if (found) {
268 status = usb_unlink_urb (io->urbs [i]); 267 status = usb_unlink_urb (io->urbs [i]);
269 if (status != -EINPROGRESS && status != -EBUSY) 268 if (status != -EINPROGRESS
269 && status != -ENODEV
270 && status != -EBUSY)
270 dev_err (&io->dev->dev, 271 dev_err (&io->dev->dev,
271 "%s, unlink --> %d\n", 272 "%s, unlink --> %d\n",
272 __FUNCTION__, status); 273 __FUNCTION__, status);
@@ -357,8 +358,7 @@ int usb_sg_init (
357 if (!io->urbs) 358 if (!io->urbs)
358 goto nomem; 359 goto nomem;
359 360
360 urb_flags = URB_ASYNC_UNLINK | URB_NO_TRANSFER_DMA_MAP 361 urb_flags = URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT;
361 | URB_NO_INTERRUPT;
362 if (usb_pipein (pipe)) 362 if (usb_pipein (pipe))
363 urb_flags |= URB_SHORT_NOT_OK; 363 urb_flags |= URB_SHORT_NOT_OK;
364 364
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index c0feee25ff0a..c846fefb7386 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -309,9 +309,8 @@ int usb_submit_urb(struct urb *urb, unsigned mem_flags)
309 unsigned int allowed; 309 unsigned int allowed;
310 310
311 /* enforce simple/standard policy */ 311 /* enforce simple/standard policy */
312 allowed = URB_ASYNC_UNLINK; // affects later unlinks 312 allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP |
313 allowed |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); 313 URB_NO_INTERRUPT);
314 allowed |= URB_NO_INTERRUPT;
315 switch (temp) { 314 switch (temp) {
316 case PIPE_BULK: 315 case PIPE_BULK:
317 if (is_out) 316 if (is_out)
@@ -400,14 +399,8 @@ int usb_submit_urb(struct urb *urb, unsigned mem_flags)
400 * canceled (rather than any other code) and will quickly be removed 399 * canceled (rather than any other code) and will quickly be removed
401 * from host controller data structures. 400 * from host controller data structures.
402 * 401 *
403 * In the past, clearing the URB_ASYNC_UNLINK transfer flag for the 402 * This request is always asynchronous.
404 * URB indicated that the request was synchronous. This usage is now 403 * Success is indicated by returning -EINPROGRESS,
405 * deprecated; if the flag is clear the call will be forwarded to
406 * usb_kill_urb() and the return value will be 0. In the future, drivers
407 * should call usb_kill_urb() directly for synchronous unlinking.
408 *
409 * When the URB_ASYNC_UNLINK transfer flag for the URB is set, this
410 * request is asynchronous. Success is indicated by returning -EINPROGRESS,
411 * at which time the URB will normally have been unlinked but not yet 404 * at which time the URB will normally have been unlinked but not yet
412 * given back to the device driver. When it is called, the completion 405 * given back to the device driver. When it is called, the completion
413 * function will see urb->status == -ECONNRESET. Failure is indicated 406 * function will see urb->status == -ECONNRESET. Failure is indicated
@@ -453,17 +446,6 @@ int usb_unlink_urb(struct urb *urb)
453{ 446{
454 if (!urb) 447 if (!urb)
455 return -EINVAL; 448 return -EINVAL;
456 if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) {
457#ifdef CONFIG_DEBUG_KERNEL
458 if (printk_ratelimit()) {
459 printk(KERN_NOTICE "usb_unlink_urb() is deprecated for "
460 "synchronous unlinks. Use usb_kill_urb() instead.\n");
461 WARN_ON(1);
462 }
463#endif
464 usb_kill_urb(urb);
465 return 0;
466 }
467 if (!(urb->dev && urb->dev->bus && urb->dev->bus->op)) 449 if (!(urb->dev && urb->dev->bus && urb->dev->bus->op))
468 return -ENODEV; 450 return -ENODEV;
469 return urb->dev->bus->op->unlink_urb(urb, -ECONNRESET); 451 return urb->dev->bus->op->unlink_urb(urb, -ECONNRESET);
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 2cddd8a00437..087af73a59dd 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -65,6 +65,16 @@ static int generic_probe (struct device *dev)
65} 65}
66static int generic_remove (struct device *dev) 66static int generic_remove (struct device *dev)
67{ 67{
68 struct usb_device *udev = to_usb_device(dev);
69
70 /* if this is only an unbind, not a physical disconnect, then
71 * unconfigure the device */
72 if (udev->state == USB_STATE_CONFIGURED)
73 usb_set_configuration(udev, 0);
74
75 /* in case the call failed or the device was suspended */
76 if (udev->state >= USB_STATE_CONFIGURED)
77 usb_disable_device(udev, 0);
68 return 0; 78 return 0;
69} 79}
70 80
@@ -912,7 +922,7 @@ int usb_trylock_device(struct usb_device *udev)
912 * is neither BINDING nor BOUND. Rather than sleeping to wait for the 922 * is neither BINDING nor BOUND. Rather than sleeping to wait for the
913 * lock, the routine polls repeatedly. This is to prevent deadlock with 923 * lock, the routine polls repeatedly. This is to prevent deadlock with
914 * disconnect; in some drivers (such as usb-storage) the disconnect() 924 * disconnect; in some drivers (such as usb-storage) the disconnect()
915 * callback will block waiting for a device reset to complete. 925 * or suspend() method will block waiting for a device reset to complete.
916 * 926 *
917 * Returns a negative error code for failure, otherwise 1 or 0 to indicate 927 * Returns a negative error code for failure, otherwise 1 or 0 to indicate
918 * that the device will or will not have to be unlocked. (0 can be 928 * that the device will or will not have to be unlocked. (0 can be
@@ -922,6 +932,8 @@ int usb_trylock_device(struct usb_device *udev)
922int usb_lock_device_for_reset(struct usb_device *udev, 932int usb_lock_device_for_reset(struct usb_device *udev,
923 struct usb_interface *iface) 933 struct usb_interface *iface)
924{ 934{
935 unsigned long jiffies_expire = jiffies + HZ;
936
925 if (udev->state == USB_STATE_NOTATTACHED) 937 if (udev->state == USB_STATE_NOTATTACHED)
926 return -ENODEV; 938 return -ENODEV;
927 if (udev->state == USB_STATE_SUSPENDED) 939 if (udev->state == USB_STATE_SUSPENDED)
@@ -938,6 +950,12 @@ int usb_lock_device_for_reset(struct usb_device *udev,
938 } 950 }
939 951
940 while (!usb_trylock_device(udev)) { 952 while (!usb_trylock_device(udev)) {
953
954 /* If we can't acquire the lock after waiting one second,
955 * we're probably deadlocked */
956 if (time_after(jiffies, jiffies_expire))
957 return -EBUSY;
958
941 msleep(15); 959 msleep(15);
942 if (udev->state == USB_STATE_NOTATTACHED) 960 if (udev->state == USB_STATE_NOTATTACHED)
943 return -ENODEV; 961 return -ENODEV;
@@ -1478,13 +1496,18 @@ static int __init usb_init(void)
1478 retval = usb_major_init(); 1496 retval = usb_major_init();
1479 if (retval) 1497 if (retval)
1480 goto major_init_failed; 1498 goto major_init_failed;
1499 retval = usb_register(&usbfs_driver);
1500 if (retval)
1501 goto driver_register_failed;
1502 retval = usbdev_init();
1503 if (retval)
1504 goto usbdevice_init_failed;
1481 retval = usbfs_init(); 1505 retval = usbfs_init();
1482 if (retval) 1506 if (retval)
1483 goto fs_init_failed; 1507 goto fs_init_failed;
1484 retval = usb_hub_init(); 1508 retval = usb_hub_init();
1485 if (retval) 1509 if (retval)
1486 goto hub_init_failed; 1510 goto hub_init_failed;
1487
1488 retval = driver_register(&usb_generic_driver); 1511 retval = driver_register(&usb_generic_driver);
1489 if (!retval) 1512 if (!retval)
1490 goto out; 1513 goto out;
@@ -1493,7 +1516,11 @@ static int __init usb_init(void)
1493hub_init_failed: 1516hub_init_failed:
1494 usbfs_cleanup(); 1517 usbfs_cleanup();
1495fs_init_failed: 1518fs_init_failed:
1496 usb_major_cleanup(); 1519 usbdev_cleanup();
1520usbdevice_init_failed:
1521 usb_deregister(&usbfs_driver);
1522driver_register_failed:
1523 usb_major_cleanup();
1497major_init_failed: 1524major_init_failed:
1498 usb_host_cleanup(); 1525 usb_host_cleanup();
1499host_init_failed: 1526host_init_failed:
@@ -1514,6 +1541,8 @@ static void __exit usb_exit(void)
1514 driver_unregister(&usb_generic_driver); 1541 driver_unregister(&usb_generic_driver);
1515 usb_major_cleanup(); 1542 usb_major_cleanup();
1516 usbfs_cleanup(); 1543 usbfs_cleanup();
1544 usb_deregister(&usbfs_driver);
1545 usbdev_cleanup();
1517 usb_hub_cleanup(); 1546 usb_hub_cleanup();
1518 usb_host_cleanup(); 1547 usb_host_cleanup();
1519 bus_unregister(&usb_bus_type); 1548 bus_unregister(&usb_bus_type);
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 2c690f6d4c18..83d48c8133af 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -37,6 +37,11 @@ extern struct file_operations usbfs_devices_fops;
37extern struct file_operations usbfs_device_file_operations; 37extern struct file_operations usbfs_device_file_operations;
38extern void usbfs_conn_disc_event(void); 38extern void usbfs_conn_disc_event(void);
39 39
40extern int usbdev_init(void);
41extern void usbdev_cleanup(void);
42extern void usbdev_add(struct usb_device *dev);
43extern void usbdev_remove(struct usb_device *dev);
44extern struct usb_device *usbdev_lookup_minor(int minor);
40 45
41struct dev_state { 46struct dev_state {
42 struct list_head list; /* state list */ 47 struct list_head list; /* state list */
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 8509e955007d..49459e33e952 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -2181,6 +2181,7 @@ eth_bind (struct usb_gadget *gadget)
2181 u8 cdc = 1, zlp = 1, rndis = 1; 2181 u8 cdc = 1, zlp = 1, rndis = 1;
2182 struct usb_ep *in_ep, *out_ep, *status_ep = NULL; 2182 struct usb_ep *in_ep, *out_ep, *status_ep = NULL;
2183 int status = -ENOMEM; 2183 int status = -ENOMEM;
2184 int gcnum;
2184 2185
2185 /* these flags are only ever cleared; compiler take note */ 2186 /* these flags are only ever cleared; compiler take note */
2186#ifndef DEV_CONFIG_CDC 2187#ifndef DEV_CONFIG_CDC
@@ -2194,44 +2195,26 @@ eth_bind (struct usb_gadget *gadget)
2194 * standard protocol is _strongly_ preferred for interop purposes. 2195 * standard protocol is _strongly_ preferred for interop purposes.
2195 * (By everyone except Microsoft.) 2196 * (By everyone except Microsoft.)
2196 */ 2197 */
2197 if (gadget_is_net2280 (gadget)) { 2198 if (gadget_is_pxa (gadget)) {
2198 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201);
2199 } else if (gadget_is_dummy (gadget)) {
2200 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0202);
2201 } else if (gadget_is_pxa (gadget)) {
2202 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203);
2203 /* pxa doesn't support altsettings */ 2199 /* pxa doesn't support altsettings */
2204 cdc = 0; 2200 cdc = 0;
2205 } else if (gadget_is_sh(gadget)) { 2201 } else if (gadget_is_sh(gadget)) {
2206 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204);
2207 /* sh doesn't support multiple interfaces or configs */ 2202 /* sh doesn't support multiple interfaces or configs */
2208 cdc = 0; 2203 cdc = 0;
2209 rndis = 0; 2204 rndis = 0;
2210 } else if (gadget_is_sa1100 (gadget)) { 2205 } else if (gadget_is_sa1100 (gadget)) {
2211 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205);
2212 /* hardware can't write zlps */ 2206 /* hardware can't write zlps */
2213 zlp = 0; 2207 zlp = 0;
2214 /* sa1100 CAN do CDC, without status endpoint ... we use 2208 /* sa1100 CAN do CDC, without status endpoint ... we use
2215 * non-CDC to be compatible with ARM Linux-2.4 "usb-eth". 2209 * non-CDC to be compatible with ARM Linux-2.4 "usb-eth".
2216 */ 2210 */
2217 cdc = 0; 2211 cdc = 0;
2218 } else if (gadget_is_goku (gadget)) { 2212 }
2219 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206); 2213
2220 } else if (gadget_is_mq11xx (gadget)) { 2214 gcnum = usb_gadget_controller_number (gadget);
2221 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207); 2215 if (gcnum >= 0)
2222 } else if (gadget_is_omap (gadget)) { 2216 device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum);
2223 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208); 2217 else {
2224 } else if (gadget_is_lh7a40x(gadget)) {
2225 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209);
2226 } else if (gadget_is_n9604(gadget)) {
2227 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210);
2228 } else if (gadget_is_pxa27x(gadget)) {
2229 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211);
2230 } else if (gadget_is_s3c2410(gadget)) {
2231 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0212);
2232 } else if (gadget_is_at91(gadget)) {
2233 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0213);
2234 } else {
2235 /* can't assume CDC works. don't want to default to 2218 /* can't assume CDC works. don't want to default to
2236 * anything less functional on CDC-capable hardware, 2219 * anything less functional on CDC-capable hardware,
2237 * so we fail in this case. 2220 * so we fail in this case.
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 4f57085619b4..a41d9d4baee3 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -3713,6 +3713,7 @@ static void fsg_unbind(struct usb_gadget *gadget)
3713static int __init check_parameters(struct fsg_dev *fsg) 3713static int __init check_parameters(struct fsg_dev *fsg)
3714{ 3714{
3715 int prot; 3715 int prot;
3716 int gcnum;
3716 3717
3717 /* Store the default values */ 3718 /* Store the default values */
3718 mod_data.transport_type = USB_PR_BULK; 3719 mod_data.transport_type = USB_PR_BULK;
@@ -3724,33 +3725,13 @@ static int __init check_parameters(struct fsg_dev *fsg)
3724 mod_data.can_stall = 0; 3725 mod_data.can_stall = 0;
3725 3726
3726 if (mod_data.release == 0xffff) { // Parameter wasn't set 3727 if (mod_data.release == 0xffff) { // Parameter wasn't set
3727 if (gadget_is_net2280(fsg->gadget))
3728 mod_data.release = 0x0301;
3729 else if (gadget_is_dummy(fsg->gadget))
3730 mod_data.release = 0x0302;
3731 else if (gadget_is_pxa(fsg->gadget))
3732 mod_data.release = 0x0303;
3733 else if (gadget_is_sh(fsg->gadget))
3734 mod_data.release = 0x0304;
3735
3736 /* The sa1100 controller is not supported */ 3728 /* The sa1100 controller is not supported */
3737 3729 if (gadget_is_sa1100(fsg->gadget))
3738 else if (gadget_is_goku(fsg->gadget)) 3730 gcnum = -1;
3739 mod_data.release = 0x0306; 3731 else
3740 else if (gadget_is_mq11xx(fsg->gadget)) 3732 gcnum = usb_gadget_controller_number(fsg->gadget);
3741 mod_data.release = 0x0307; 3733 if (gcnum >= 0)
3742 else if (gadget_is_omap(fsg->gadget)) 3734 mod_data.release = 0x0300 + gcnum;
3743 mod_data.release = 0x0308;
3744 else if (gadget_is_lh7a40x(fsg->gadget))
3745 mod_data.release = 0x0309;
3746 else if (gadget_is_n9604(fsg->gadget))
3747 mod_data.release = 0x0310;
3748 else if (gadget_is_pxa27x(fsg->gadget))
3749 mod_data.release = 0x0311;
3750 else if (gadget_is_s3c2410(gadget))
3751 mod_data.release = 0x0312;
3752 else if (gadget_is_at91(fsg->gadget))
3753 mod_data.release = 0x0313;
3754 else { 3735 else {
3755 WARN(fsg, "controller '%s' not recognized\n", 3736 WARN(fsg, "controller '%s' not recognized\n",
3756 fsg->gadget->name); 3737 fsg->gadget->name);
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h
index ea2eb52c766d..8cbae21d84b9 100644
--- a/drivers/usb/gadget/gadget_chips.h
+++ b/drivers/usb/gadget/gadget_chips.h
@@ -5,6 +5,7 @@
5 * 5 *
6 * This could eventually work like the ARM mach_is_*() stuff, driven by 6 * This could eventually work like the ARM mach_is_*() stuff, driven by
7 * some config file that gets updated as new hardware is supported. 7 * some config file that gets updated as new hardware is supported.
8 * (And avoiding the runtime comparisons in typical one-choice cases.)
8 * 9 *
9 * NOTE: some of these controller drivers may not be available yet. 10 * NOTE: some of these controller drivers may not be available yet.
10 */ 11 */
@@ -86,7 +87,61 @@
86#define gadget_is_at91(g) 0 87#define gadget_is_at91(g) 0
87#endif 88#endif
88 89
90#ifdef CONFIG_USB_GADGET_IMX
91#define gadget_is_imx(g) !strcmp("imx_udc", (g)->name)
92#else
93#define gadget_is_imx(g) 0
94#endif
95
89// CONFIG_USB_GADGET_SX2 96// CONFIG_USB_GADGET_SX2
90// CONFIG_USB_GADGET_AU1X00 97// CONFIG_USB_GADGET_AU1X00
91// ... 98// ...
92 99
100
101/**
102 * usb_gadget_controller_number - support bcdDevice id convention
103 * @gadget: the controller being driven
104 *
105 * Return a 2-digit BCD value associated with the peripheral controller,
106 * suitable for use as part of a bcdDevice value, or a negative error code.
107 *
108 * NOTE: this convention is purely optional, and has no meaning in terms of
109 * any USB specification. If you want to use a different convention in your
110 * gadget driver firmware -- maybe a more formal revision ID -- feel free.
111 *
112 * Hosts see these bcdDevice numbers, and are allowed (but not encouraged!)
113 * to change their behavior accordingly. For example it might help avoiding
114 * some chip bug.
115 */
116static inline int usb_gadget_controller_number(struct usb_gadget *gadget)
117{
118 if (gadget_is_net2280(gadget))
119 return 0x01;
120 else if (gadget_is_dummy(gadget))
121 return 0x02;
122 else if (gadget_is_pxa(gadget))
123 return 0x03;
124 else if (gadget_is_sh(gadget))
125 return 0x04;
126 else if (gadget_is_sa1100(gadget))
127 return 0x05;
128 else if (gadget_is_goku(gadget))
129 return 0x06;
130 else if (gadget_is_mq11xx(gadget))
131 return 0x07;
132 else if (gadget_is_omap(gadget))
133 return 0x08;
134 else if (gadget_is_lh7a40x(gadget))
135 return 0x09;
136 else if (gadget_is_n9604(gadget))
137 return 0x10;
138 else if (gadget_is_pxa27x(gadget))
139 return 0x11;
140 else if (gadget_is_s3c2410(gadget))
141 return 0x12;
142 else if (gadget_is_at91(gadget))
143 return 0x13;
144 else if (gadget_is_imx(gadget))
145 return 0x14;
146 return -ENOENT;
147}
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c
index 9e4f1c6935a5..c925d9222f53 100644
--- a/drivers/usb/gadget/serial.c
+++ b/drivers/usb/gadget/serial.c
@@ -1422,49 +1422,20 @@ static int gs_bind(struct usb_gadget *gadget)
1422 int ret; 1422 int ret;
1423 struct usb_ep *ep; 1423 struct usb_ep *ep;
1424 struct gs_dev *dev; 1424 struct gs_dev *dev;
1425 int gcnum;
1425 1426
1426 /* device specific */ 1427 /* Some controllers can't support CDC ACM:
1427 if (gadget_is_net2280(gadget)) { 1428 * - sh doesn't support multiple interfaces or configs;
1428 gs_device_desc.bcdDevice = 1429 * - sa1100 doesn't have a third interrupt endpoint
1429 __constant_cpu_to_le16(GS_VERSION_NUM|0x0001); 1430 */
1430 } else if (gadget_is_pxa(gadget)) { 1431 if (gadget_is_sh(gadget) || gadget_is_sa1100(gadget))
1431 gs_device_desc.bcdDevice =
1432 __constant_cpu_to_le16(GS_VERSION_NUM|0x0002);
1433 } else if (gadget_is_sh(gadget)) {
1434 gs_device_desc.bcdDevice =
1435 __constant_cpu_to_le16(GS_VERSION_NUM|0x0003);
1436 /* sh doesn't support multiple interfaces or configs */
1437 use_acm = 0; 1432 use_acm = 0;
1438 } else if (gadget_is_sa1100(gadget)) { 1433
1439 gs_device_desc.bcdDevice = 1434 gcnum = usb_gadget_controller_number(gadget);
1440 __constant_cpu_to_le16(GS_VERSION_NUM|0x0004); 1435 if (gcnum >= 0)
1441 /* sa1100 doesn't support necessary endpoints */
1442 use_acm = 0;
1443 } else if (gadget_is_goku(gadget)) {
1444 gs_device_desc.bcdDevice =
1445 __constant_cpu_to_le16(GS_VERSION_NUM|0x0005);
1446 } else if (gadget_is_mq11xx(gadget)) {
1447 gs_device_desc.bcdDevice =
1448 __constant_cpu_to_le16(GS_VERSION_NUM|0x0006);
1449 } else if (gadget_is_omap(gadget)) {
1450 gs_device_desc.bcdDevice =
1451 __constant_cpu_to_le16(GS_VERSION_NUM|0x0007);
1452 } else if (gadget_is_lh7a40x(gadget)) {
1453 gs_device_desc.bcdDevice =
1454 __constant_cpu_to_le16(GS_VERSION_NUM|0x0008);
1455 } else if (gadget_is_n9604(gadget)) {
1456 gs_device_desc.bcdDevice =
1457 __constant_cpu_to_le16(GS_VERSION_NUM|0x0009);
1458 } else if (gadget_is_pxa27x(gadget)) {
1459 gs_device_desc.bcdDevice =
1460 __constant_cpu_to_le16(GS_VERSION_NUM|0x0011);
1461 } else if (gadget_is_s3c2410(gadget)) {
1462 gs_device_desc.bcdDevice =
1463 __constant_cpu_to_le16(GS_VERSION_NUM|0x0012);
1464 } else if (gadget_is_at91(gadget)) {
1465 gs_device_desc.bcdDevice = 1436 gs_device_desc.bcdDevice =
1466 __constant_cpu_to_le16(GS_VERSION_NUM|0x0013); 1437 cpu_to_le16(GS_VERSION_NUM | gcnum);
1467 } else { 1438 else {
1468 printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n", 1439 printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n",
1469 gadget->name); 1440 gadget->name);
1470 /* unrecognized, but safe unless bulk is REALLY quirky */ 1441 /* unrecognized, but safe unless bulk is REALLY quirky */
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c
index bb9b2d94eed5..6890e773b2a2 100644
--- a/drivers/usb/gadget/zero.c
+++ b/drivers/usb/gadget/zero.c
@@ -1139,6 +1139,13 @@ zero_bind (struct usb_gadget *gadget)
1139{ 1139{
1140 struct zero_dev *dev; 1140 struct zero_dev *dev;
1141 struct usb_ep *ep; 1141 struct usb_ep *ep;
1142 int gcnum;
1143
1144 /* FIXME this can't yet work right with SH ... it has only
1145 * one configuration, numbered one.
1146 */
1147 if (gadget_is_sh(gadget))
1148 return -ENODEV;
1142 1149
1143 /* Bulk-only drivers like this one SHOULD be able to 1150 /* Bulk-only drivers like this one SHOULD be able to
1144 * autoconfigure on any sane usb controller driver, 1151 * autoconfigure on any sane usb controller driver,
@@ -1161,43 +1168,10 @@ autoconf_fail:
1161 EP_OUT_NAME = ep->name; 1168 EP_OUT_NAME = ep->name;
1162 ep->driver_data = ep; /* claim */ 1169 ep->driver_data = ep; /* claim */
1163 1170
1164 1171 gcnum = usb_gadget_controller_number (gadget);
1165 /* 1172 if (gcnum >= 0)
1166 * DRIVER POLICY CHOICE: you may want to do this differently. 1173 device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum);
1167 * One thing to avoid is reusing a bcdDevice revision code 1174 else {
1168 * with different host-visible configurations or behavior
1169 * restrictions -- using ep1in/ep2out vs ep1out/ep3in, etc
1170 */
1171 if (gadget_is_net2280 (gadget)) {
1172 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201);
1173 } else if (gadget_is_pxa (gadget)) {
1174 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203);
1175#if 0
1176 } else if (gadget_is_sh(gadget)) {
1177 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204);
1178 /* SH has only one configuration; see "loopdefault" */
1179 device_desc.bNumConfigurations = 1;
1180 /* FIXME make 1 == default.bConfigurationValue */
1181#endif
1182 } else if (gadget_is_sa1100 (gadget)) {
1183 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205);
1184 } else if (gadget_is_goku (gadget)) {
1185 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206);
1186 } else if (gadget_is_mq11xx (gadget)) {
1187 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207);
1188 } else if (gadget_is_omap (gadget)) {
1189 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208);
1190 } else if (gadget_is_lh7a40x(gadget)) {
1191 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209);
1192 } else if (gadget_is_n9604(gadget)) {
1193 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210);
1194 } else if (gadget_is_pxa27x(gadget)) {
1195 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211);
1196 } else if (gadget_is_s3c2410(gadget)) {
1197 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0212);
1198 } else if (gadget_is_at91(gadget)) {
1199 device_desc.bcdDevice = __constant_cpu_to_le16 (0x0213);
1200 } else {
1201 /* gadget zero is so simple (for now, no altsettings) that 1175 /* gadget zero is so simple (for now, no altsettings) that
1202 * it SHOULD NOT have problems with bulk-capable hardware. 1176 * it SHOULD NOT have problems with bulk-capable hardware.
1203 * so warn about unrcognized controllers, don't panic. 1177 * so warn about unrcognized controllers, don't panic.
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 149b13fc0a71..2507e898af09 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -549,7 +549,9 @@ static int ehci_start (struct usb_hcd *hcd)
549 hcd->can_wakeup = (port_wake & 1) != 0; 549 hcd->can_wakeup = (port_wake & 1) != 0;
550 550
551 /* help hc dma work well with cachelines */ 551 /* help hc dma work well with cachelines */
552 pci_set_mwi (pdev); 552 retval = pci_set_mwi(pdev);
553 if (retval)
554 ehci_dbg(ehci, "unable to enable MWI - not fatal.\n");
553 } 555 }
554#endif 556#endif
555 557
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 20df01a79b2e..940d38ca7d91 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -677,6 +677,9 @@ qh_make (
677 goto done; 677 goto done;
678 } 678 }
679 } else { 679 } else {
680 struct usb_tt *tt = urb->dev->tt;
681 int think_time;
682
680 /* gap is f(FS/LS transfer times) */ 683 /* gap is f(FS/LS transfer times) */
681 qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed, 684 qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed,
682 is_input, 0, maxp) / (125 * 1000); 685 is_input, 0, maxp) / (125 * 1000);
@@ -690,6 +693,10 @@ qh_make (
690 qh->c_usecs = HS_USECS (0); 693 qh->c_usecs = HS_USECS (0);
691 } 694 }
692 695
696 think_time = tt ? tt->think_time : 0;
697 qh->tt_usecs = NS_TO_US (think_time +
698 usb_calc_bus_time (urb->dev->speed,
699 is_input, 0, max_packet (maxp)));
693 qh->period = urb->interval; 700 qh->period = urb->interval;
694 } 701 }
695 } 702 }
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index 4c972b57c7c3..ccc7300baa6d 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -700,6 +700,7 @@ iso_stream_init (
700 700
701 } else { 701 } else {
702 u32 addr; 702 u32 addr;
703 int think_time;
703 704
704 addr = dev->ttport << 24; 705 addr = dev->ttport << 24;
705 if (!ehci_is_TDI(ehci) 706 if (!ehci_is_TDI(ehci)
@@ -709,6 +710,9 @@ iso_stream_init (
709 addr |= epnum << 8; 710 addr |= epnum << 8;
710 addr |= dev->devnum; 711 addr |= dev->devnum;
711 stream->usecs = HS_USECS_ISO (maxp); 712 stream->usecs = HS_USECS_ISO (maxp);
713 think_time = dev->tt ? dev->tt->think_time : 0;
714 stream->tt_usecs = NS_TO_US (think_time + usb_calc_bus_time (
715 dev->speed, is_input, 1, maxp));
712 if (is_input) { 716 if (is_input) {
713 u32 tmp; 717 u32 tmp;
714 718
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index a7542157534c..20c9b550097d 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -421,6 +421,7 @@ struct ehci_qh {
421 u8 usecs; /* intr bandwidth */ 421 u8 usecs; /* intr bandwidth */
422 u8 gap_uf; /* uframes split/csplit gap */ 422 u8 gap_uf; /* uframes split/csplit gap */
423 u8 c_usecs; /* ... split completion bw */ 423 u8 c_usecs; /* ... split completion bw */
424 u16 tt_usecs; /* tt downstream bandwidth */
424 unsigned short period; /* polling interval */ 425 unsigned short period; /* polling interval */
425 unsigned short start; /* where polling starts */ 426 unsigned short start; /* where polling starts */
426#define NO_FRAME ((unsigned short)~0) /* pick new start */ 427#define NO_FRAME ((unsigned short)~0) /* pick new start */
@@ -479,6 +480,7 @@ struct ehci_iso_stream {
479 */ 480 */
480 u8 interval; 481 u8 interval;
481 u8 usecs, c_usecs; 482 u8 usecs, c_usecs;
483 u16 tt_usecs;
482 u16 maxp; 484 u16 maxp;
483 u16 raw_mask; 485 u16 raw_mask;
484 unsigned bandwidth; 486 unsigned bandwidth;
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c
index 75128c371800..41bbae83fc71 100644
--- a/drivers/usb/host/isp116x-hcd.c
+++ b/drivers/usb/host/isp116x-hcd.c
@@ -83,7 +83,7 @@
83#include "../core/hcd.h" 83#include "../core/hcd.h"
84#include "isp116x.h" 84#include "isp116x.h"
85 85
86#define DRIVER_VERSION "08 Apr 2005" 86#define DRIVER_VERSION "05 Aug 2005"
87#define DRIVER_DESC "ISP116x USB Host Controller Driver" 87#define DRIVER_DESC "ISP116x USB Host Controller Driver"
88 88
89MODULE_DESCRIPTION(DRIVER_DESC); 89MODULE_DESCRIPTION(DRIVER_DESC);
@@ -629,14 +629,12 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs)
629 ERR("Unrecoverable error\n"); 629 ERR("Unrecoverable error\n");
630 /* What should we do here? Reset? */ 630 /* What should we do here? Reset? */
631 } 631 }
632 if (intstat & HCINT_RHSC) { 632 if (intstat & HCINT_RHSC)
633 isp116x->rhstatus = 633 /* When root hub or any of its ports is going
634 isp116x_read_reg32(isp116x, HCRHSTATUS); 634 to come out of suspend, it may take more
635 isp116x->rhport[0] = 635 than 10ms for status bits to stabilize. */
636 isp116x_read_reg32(isp116x, HCRHPORT1); 636 mod_timer(&hcd->rh_timer, jiffies
637 isp116x->rhport[1] = 637 + msecs_to_jiffies(20) + 1);
638 isp116x_read_reg32(isp116x, HCRHPORT2);
639 }
640 if (intstat & HCINT_RD) { 638 if (intstat & HCINT_RD) {
641 DBG("---- remote wakeup\n"); 639 DBG("---- remote wakeup\n");
642 schedule_work(&isp116x->rh_resume); 640 schedule_work(&isp116x->rh_resume);
@@ -925,20 +923,27 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
925{ 923{
926 struct isp116x *isp116x = hcd_to_isp116x(hcd); 924 struct isp116x *isp116x = hcd_to_isp116x(hcd);
927 int ports, i, changed = 0; 925 int ports, i, changed = 0;
926 unsigned long flags;
928 927
929 if (!HC_IS_RUNNING(hcd->state)) 928 if (!HC_IS_RUNNING(hcd->state))
930 return -ESHUTDOWN; 929 return -ESHUTDOWN;
931 930
932 ports = isp116x->rhdesca & RH_A_NDP; 931 /* Report no status change now, if we are scheduled to be
932 called later */
933 if (timer_pending(&hcd->rh_timer))
934 return 0;
933 935
934 /* init status */ 936 ports = isp116x->rhdesca & RH_A_NDP;
937 spin_lock_irqsave(&isp116x->lock, flags);
938 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
935 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) 939 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
936 buf[0] = changed = 1; 940 buf[0] = changed = 1;
937 else 941 else
938 buf[0] = 0; 942 buf[0] = 0;
939 943
940 for (i = 0; i < ports; i++) { 944 for (i = 0; i < ports; i++) {
941 u32 status = isp116x->rhport[i]; 945 u32 status = isp116x->rhport[i] =
946 isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
942 947
943 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC 948 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
944 | RH_PS_OCIC | RH_PS_PRSC)) { 949 | RH_PS_OCIC | RH_PS_PRSC)) {
@@ -947,6 +952,7 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
947 continue; 952 continue;
948 } 953 }
949 } 954 }
955 spin_unlock_irqrestore(&isp116x->lock, flags);
950 return changed; 956 return changed;
951} 957}
952 958
@@ -1463,10 +1469,6 @@ static int isp116x_sw_reset(struct isp116x *isp116x)
1463 return ret; 1469 return ret;
1464} 1470}
1465 1471
1466/*
1467 Reset. Tries to perform platform-specific hardware
1468 reset first; falls back to software reset.
1469*/
1470static int isp116x_reset(struct usb_hcd *hcd) 1472static int isp116x_reset(struct usb_hcd *hcd)
1471{ 1473{
1472 struct isp116x *isp116x = hcd_to_isp116x(hcd); 1474 struct isp116x *isp116x = hcd_to_isp116x(hcd);
@@ -1474,17 +1476,7 @@ static int isp116x_reset(struct usb_hcd *hcd)
1474 u16 clkrdy = 0; 1476 u16 clkrdy = 0;
1475 int ret = 0, timeout = 15 /* ms */ ; 1477 int ret = 0, timeout = 15 /* ms */ ;
1476 1478
1477 if (isp116x->board && isp116x->board->reset) { 1479 ret = isp116x_sw_reset(isp116x);
1478 /* Hardware reset */
1479 isp116x->board->reset(hcd->self.controller, 1);
1480 msleep(10);
1481 if (isp116x->board->clock)
1482 isp116x->board->clock(hcd->self.controller, 1);
1483 msleep(1);
1484 isp116x->board->reset(hcd->self.controller, 0);
1485 } else
1486 ret = isp116x_sw_reset(isp116x);
1487
1488 if (ret) 1480 if (ret)
1489 return ret; 1481 return ret;
1490 1482
@@ -1501,10 +1493,7 @@ static int isp116x_reset(struct usb_hcd *hcd)
1501 ERR("Clock not ready after 20ms\n"); 1493 ERR("Clock not ready after 20ms\n");
1502 /* After sw_reset the clock won't report to be ready, if 1494 /* After sw_reset the clock won't report to be ready, if
1503 H_WAKEUP pin is high. */ 1495 H_WAKEUP pin is high. */
1504 if (!isp116x->board || !isp116x->board->reset) 1496 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
1505 ERR("The driver does not support hardware wakeup.\n");
1506 ERR("Please make sure that the H_WAKEUP pin "
1507 "is pulled low!\n");
1508 ret = -ENODEV; 1497 ret = -ENODEV;
1509 } 1498 }
1510 return ret; 1499 return ret;
@@ -1527,15 +1516,7 @@ static void isp116x_stop(struct usb_hcd *hcd)
1527 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); 1516 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1528 spin_unlock_irqrestore(&isp116x->lock, flags); 1517 spin_unlock_irqrestore(&isp116x->lock, flags);
1529 1518
1530 /* Put the chip into reset state */ 1519 isp116x_sw_reset(isp116x);
1531 if (isp116x->board && isp116x->board->reset)
1532 isp116x->board->reset(hcd->self.controller, 0);
1533 else
1534 isp116x_sw_reset(isp116x);
1535
1536 /* Stop the clock */
1537 if (isp116x->board && isp116x->board->clock)
1538 isp116x->board->clock(hcd->self.controller, 0);
1539} 1520}
1540 1521
1541/* 1522/*
@@ -1561,6 +1542,9 @@ static int isp116x_start(struct usb_hcd *hcd)
1561 return -ENODEV; 1542 return -ENODEV;
1562 } 1543 }
1563 1544
1545 /* To be removed in future */
1546 hcd->uses_new_polling = 1;
1547
1564 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); 1548 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1565 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); 1549 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1566 1550
@@ -1569,7 +1553,7 @@ static int isp116x_start(struct usb_hcd *hcd)
1569 if (board->sel15Kres) 1553 if (board->sel15Kres)
1570 val |= HCHWCFG_15KRSEL; 1554 val |= HCHWCFG_15KRSEL;
1571 /* Remote wakeup won't work without working clock */ 1555 /* Remote wakeup won't work without working clock */
1572 if (board->clknotstop || board->remote_wakeup_enable) 1556 if (board->remote_wakeup_enable)
1573 val |= HCHWCFG_CLKNOTSTOP; 1557 val |= HCHWCFG_CLKNOTSTOP;
1574 if (board->oc_enable) 1558 if (board->oc_enable)
1575 val |= HCHWCFG_ANALOG_OC; 1559 val |= HCHWCFG_ANALOG_OC;
@@ -1580,16 +1564,13 @@ static int isp116x_start(struct usb_hcd *hcd)
1580 isp116x_write_reg16(isp116x, HCHWCFG, val); 1564 isp116x_write_reg16(isp116x, HCHWCFG, val);
1581 1565
1582 /* ----- Root hub conf */ 1566 /* ----- Root hub conf */
1583 val = 0; 1567 val = (25 << 24) & RH_A_POTPGT;
1584 /* AN10003_1.pdf recommends NPS to be always 1 */ 1568 /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to
1585 if (board->no_power_switching) 1569 be always set. Yet, instead, we request individual port
1586 val |= RH_A_NPS; 1570 power switching. */
1587 if (board->power_switching_mode) 1571 val |= RH_A_PSM;
1588 val |= RH_A_PSM; 1572 /* Report overcurrent per port */
1589 if (board->potpg) 1573 val |= RH_A_OCPM;
1590 val |= (board->potpg << 24) & RH_A_POTPGT;
1591 else
1592 val |= (25 << 24) & RH_A_POTPGT;
1593 isp116x_write_reg32(isp116x, HCRHDESCA, val); 1574 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1594 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); 1575 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1595 1576
@@ -1619,9 +1600,6 @@ static int isp116x_start(struct usb_hcd *hcd)
1619 1600
1620 /* Go operational */ 1601 /* Go operational */
1621 val = HCCONTROL_USB_OPER; 1602 val = HCCONTROL_USB_OPER;
1622 /* Remote wakeup connected - NOT SUPPORTED */
1623 /* if (board->remote_wakeup_connected)
1624 val |= HCCONTROL_RWC; */
1625 if (board->remote_wakeup_enable) 1603 if (board->remote_wakeup_enable)
1626 val |= HCCONTROL_RWE; 1604 val |= HCCONTROL_RWE;
1627 isp116x_write_reg32(isp116x, HCCONTROL, val); 1605 isp116x_write_reg32(isp116x, HCCONTROL, val);
@@ -1670,7 +1648,7 @@ static int __init_or_module isp116x_remove(struct device *dev)
1670 struct platform_device *pdev; 1648 struct platform_device *pdev;
1671 struct resource *res; 1649 struct resource *res;
1672 1650
1673 if(!hcd) 1651 if (!hcd)
1674 return 0; 1652 return 0;
1675 isp116x = hcd_to_isp116x(hcd); 1653 isp116x = hcd_to_isp116x(hcd);
1676 pdev = container_of(dev, struct platform_device, dev); 1654 pdev = container_of(dev, struct platform_device, dev);
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c
index 17964c39d06a..251533363028 100644
--- a/drivers/usb/host/ohci-ppc-soc.c
+++ b/drivers/usb/host/ohci-ppc-soc.c
@@ -14,8 +14,6 @@
14 * This file is licenced under the GPL. 14 * This file is licenced under the GPL.
15 */ 15 */
16 16
17#include <asm/usb.h>
18
19/* configure so an HC device and id are always provided */ 17/* configure so an HC device and id are always provided */
20/* always called with process context; sleeping is OK */ 18/* always called with process context; sleeping is OK */
21 19
@@ -23,9 +21,7 @@
23 * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs 21 * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs
24 * Context: !in_interrupt() 22 * Context: !in_interrupt()
25 * 23 *
26 * Allocates basic resources for this USB host controller, and 24 * Allocates basic resources for this USB host controller.
27 * then invokes the start() method for the HCD associated with it
28 * through the hotplug entry's driver_data.
29 * 25 *
30 * Store this function in the HCD's struct pci_driver as probe(). 26 * Store this function in the HCD's struct pci_driver as probe().
31 */ 27 */
@@ -37,7 +33,6 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver,
37 struct ohci_hcd *ohci; 33 struct ohci_hcd *ohci;
38 struct resource *res; 34 struct resource *res;
39 int irq; 35 int irq;
40 struct usb_hcd_platform_data *pd = pdev->dev.platform_data;
41 36
42 pr_debug("initializing PPC-SOC USB Controller\n"); 37 pr_debug("initializing PPC-SOC USB Controller\n");
43 38
@@ -73,9 +68,6 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver,
73 goto err2; 68 goto err2;
74 } 69 }
75 70
76 if (pd->start && (retval = pd->start(pdev)))
77 goto err3;
78
79 ohci = hcd_to_ohci(hcd); 71 ohci = hcd_to_ohci(hcd);
80 ohci->flags |= OHCI_BIG_ENDIAN; 72 ohci->flags |= OHCI_BIG_ENDIAN;
81 ohci_hcd_init(ohci); 73 ohci_hcd_init(ohci);
@@ -85,9 +77,7 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver,
85 return retval; 77 return retval;
86 78
87 pr_debug("Removing PPC-SOC USB Controller\n"); 79 pr_debug("Removing PPC-SOC USB Controller\n");
88 if (pd && pd->stop) 80
89 pd->stop(pdev);
90 err3:
91 iounmap(hcd->regs); 81 iounmap(hcd->regs);
92 err2: 82 err2:
93 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 83 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
@@ -105,25 +95,21 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver,
105 * @pdev: USB Host Controller being removed 95 * @pdev: USB Host Controller being removed
106 * Context: !in_interrupt() 96 * Context: !in_interrupt()
107 * 97 *
108 * Reverses the effect of usb_hcd_ppc_soc_probe(), first invoking 98 * Reverses the effect of usb_hcd_ppc_soc_probe().
109 * the HCD's stop() method. It is always called from a thread 99 * It is always called from a thread
110 * context, normally "rmmod", "apmd", or something similar. 100 * context, normally "rmmod", "apmd", or something similar.
111 * 101 *
112 */ 102 */
113static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd, 103static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd,
114 struct platform_device *pdev) 104 struct platform_device *pdev)
115{ 105{
116 struct usb_hcd_platform_data *pd = pdev->dev.platform_data;
117
118 usb_remove_hcd(hcd); 106 usb_remove_hcd(hcd);
119 107
120 pr_debug("stopping PPC-SOC USB Controller\n"); 108 pr_debug("stopping PPC-SOC USB Controller\n");
121 if (pd && pd->stop)
122 pd->stop(pdev);
123 109
124 iounmap(hcd->regs); 110 iounmap(hcd->regs);
125 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 111 release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
126 usb_hcd_put(hcd); 112 usb_put_hcd(hcd);
127} 113}
128 114
129static int __devinit 115static int __devinit
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c
index e9401662503c..3d9bcf78a9a4 100644
--- a/drivers/usb/host/ohci-s3c2410.c
+++ b/drivers/usb/host/ohci-s3c2410.c
@@ -129,7 +129,7 @@ static void s3c2410_usb_set_power(struct s3c2410_hcd_info *info,
129 129
130 if (info->power_control != NULL) { 130 if (info->power_control != NULL) {
131 info->port[port-1].power = to; 131 info->port[port-1].power = to;
132 (info->power_control)(port, to); 132 (info->power_control)(port-1, to);
133 } 133 }
134} 134}
135 135
@@ -339,8 +339,8 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver,
339 struct usb_hcd *hcd = NULL; 339 struct usb_hcd *hcd = NULL;
340 int retval; 340 int retval;
341 341
342 s3c2410_usb_set_power(dev->dev.platform_data, 0, 1);
343 s3c2410_usb_set_power(dev->dev.platform_data, 1, 1); 342 s3c2410_usb_set_power(dev->dev.platform_data, 1, 1);
343 s3c2410_usb_set_power(dev->dev.platform_data, 2, 1);
344 344
345 hcd = usb_create_hcd(driver, &dev->dev, "s3c24xx"); 345 hcd = usb_create_hcd(driver, &dev->dev, "s3c24xx");
346 if (hcd == NULL) 346 if (hcd == NULL)
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
index 298e4a25e3d3..482c4be521f5 100644
--- a/drivers/usb/input/Kconfig
+++ b/drivers/usb/input/Kconfig
@@ -230,6 +230,20 @@ config USB_EGALAX
230 To compile this driver as a module, choose M here: the 230 To compile this driver as a module, choose M here: the
231 module will be called touchkitusb. 231 module will be called touchkitusb.
232 232
233config USB_YEALINK
234 tristate "Yealink usb-p1k voip phone"
235 depends on USB && INPUT && EXPERIMENTAL
236 ---help---
237 Say Y here if you want to enable keyboard and LCD functions of the
238 Yealink usb-p1k usb phones. The audio part is enabled by the generic
239 usb sound driver, so you might want to enable that as well.
240
241 For information about how to use these additional functions, see
242 <file:Documentation/input/yealink.txt>.
243
244 To compile this driver as a module, choose M here: the module will be
245 called yealink.
246
233config USB_XPAD 247config USB_XPAD
234 tristate "X-Box gamepad support" 248 tristate "X-Box gamepad support"
235 depends on USB && INPUT 249 depends on USB && INPUT
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
index f1547be632d4..43b2f999edfe 100644
--- a/drivers/usb/input/Makefile
+++ b/drivers/usb/input/Makefile
@@ -39,4 +39,5 @@ obj-$(CONFIG_USB_EGALAX) += touchkitusb.o
39obj-$(CONFIG_USB_POWERMATE) += powermate.o 39obj-$(CONFIG_USB_POWERMATE) += powermate.o
40obj-$(CONFIG_USB_WACOM) += wacom.o 40obj-$(CONFIG_USB_WACOM) += wacom.o
41obj-$(CONFIG_USB_ACECAD) += acecad.o 41obj-$(CONFIG_USB_ACECAD) += acecad.o
42obj-$(CONFIG_USB_YEALINK) += yealink.o
42obj-$(CONFIG_USB_XPAD) += xpad.o 43obj-$(CONFIG_USB_XPAD) += xpad.o
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index b2cb2b35892e..1ab95d24c5e2 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -1444,6 +1444,8 @@ void hid_init_reports(struct hid_device *hid)
1444#define USB_DEVICE_ID_NETWORKANALYSER 0x2020 1444#define USB_DEVICE_ID_NETWORKANALYSER 0x2020
1445#define USB_DEVICE_ID_POWERCONTROL 0x2030 1445#define USB_DEVICE_ID_POWERCONTROL 0x2030
1446 1446
1447#define USB_VENDOR_ID_APPLE 0x05ac
1448#define USB_DEVICE_ID_APPLE_BLUETOOTH 0x1000
1447 1449
1448/* 1450/*
1449 * Alphabetically sorted blacklist by quirk type. 1451 * Alphabetically sorted blacklist by quirk type.
@@ -1462,6 +1464,7 @@ static struct hid_blacklist {
1462 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, 1464 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE },
1463 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, 1465 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE },
1464 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, 1466 { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE },
1467 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_BLUETOOTH, HID_QUIRK_IGNORE },
1465 { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, 1468 { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE },
1466 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE }, 1469 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE },
1467 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24, HID_QUIRK_IGNORE }, 1470 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24, HID_QUIRK_IGNORE },
@@ -1685,7 +1688,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1685 usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, 0, 1688 usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, 0,
1686 hid_irq_in, hid, interval); 1689 hid_irq_in, hid, interval);
1687 hid->urbin->transfer_dma = hid->inbuf_dma; 1690 hid->urbin->transfer_dma = hid->inbuf_dma;
1688 hid->urbin->transfer_flags |=(URB_NO_TRANSFER_DMA_MAP | URB_ASYNC_UNLINK); 1691 hid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1689 } else { 1692 } else {
1690 if (hid->urbout) 1693 if (hid->urbout)
1691 continue; 1694 continue;
@@ -1695,7 +1698,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1695 usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0, 1698 usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0,
1696 hid_irq_out, hid, interval); 1699 hid_irq_out, hid, interval);
1697 hid->urbout->transfer_dma = hid->outbuf_dma; 1700 hid->urbout->transfer_dma = hid->outbuf_dma;
1698 hid->urbout->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_ASYNC_UNLINK); 1701 hid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1699 } 1702 }
1700 } 1703 }
1701 1704
@@ -1747,7 +1750,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1747 hid->ctrlbuf, 1, hid_ctrl, hid); 1750 hid->ctrlbuf, 1, hid_ctrl, hid);
1748 hid->urbctrl->setup_dma = hid->cr_dma; 1751 hid->urbctrl->setup_dma = hid->cr_dma;
1749 hid->urbctrl->transfer_dma = hid->ctrlbuf_dma; 1752 hid->urbctrl->transfer_dma = hid->ctrlbuf_dma;
1750 hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP | URB_ASYNC_UNLINK); 1753 hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP);
1751 1754
1752 return hid; 1755 return hid;
1753 1756
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c
index 67dc93685203..99de1b33c07d 100644
--- a/drivers/usb/input/keyspan_remote.c
+++ b/drivers/usb/input/keyspan_remote.c
@@ -431,11 +431,6 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic
431 struct usb_endpoint_descriptor *endpoint; 431 struct usb_endpoint_descriptor *endpoint;
432 struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); 432 struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
433 433
434 /* See if the offered device matches what we can accept */
435 if ((udev->descriptor.idVendor != USB_KEYSPAN_VENDOR_ID) ||
436 (udev->descriptor.idProduct != USB_KEYSPAN_PRODUCT_UIA11) )
437 return -ENODEV;
438
439 /* allocate memory for our device state and initialize it */ 434 /* allocate memory for our device state and initialize it */
440 remote = kmalloc(sizeof(*remote), GFP_KERNEL); 435 remote = kmalloc(sizeof(*remote), GFP_KERNEL);
441 if (remote == NULL) { 436 if (remote == NULL) {
diff --git a/drivers/usb/input/map_to_7segment.h b/drivers/usb/input/map_to_7segment.h
new file mode 100644
index 000000000000..52ff27f15127
--- /dev/null
+++ b/drivers/usb/input/map_to_7segment.h
@@ -0,0 +1,189 @@
1/*
2 * drivers/usb/input/map_to_7segment.h
3 *
4 * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#ifndef MAP_TO_7SEGMENT_H
22#define MAP_TO_7SEGMENT_H
23
24/* This file provides translation primitives and tables for the conversion
25 * of (ASCII) characters to a 7-segments notation.
26 *
27 * The 7 segment's wikipedia notation below is used as standard.
28 * See: http://en.wikipedia.org/wiki/Seven_segment_display
29 *
30 * Notation: +-a-+
31 * f b
32 * +-g-+
33 * e c
34 * +-d-+
35 *
36 * Usage:
37 *
38 * Register a map variable, and fill it with a character set:
39 * static SEG7_DEFAULT_MAP(map_seg7);
40 *
41 *
42 * Then use for conversion:
43 * seg7 = map_to_seg7(&map_seg7, some_char);
44 * ...
45 *
46 * In device drivers it is recommended, if required, to make the char map
47 * accessible via the sysfs interface using the following scheme:
48 *
49 * static ssize_t show_map(struct device *dev, char *buf) {
50 * memcpy(buf, &map_seg7, sizeof(map_seg7));
51 * return sizeof(map_seg7);
52 * }
53 * static ssize_t store_map(struct device *dev, const char *buf, size_t cnt) {
54 * if(cnt != sizeof(map_seg7))
55 * return -EINVAL;
56 * memcpy(&map_seg7, buf, cnt);
57 * return cnt;
58 * }
59 * static DEVICE_ATTR(map_seg7, PERMS_RW, show_map, store_map);
60 *
61 * History:
62 * 2005-05-31 RFC linux-kernel@vger.kernel.org
63 */
64#include <linux/errno.h>
65
66
67#define BIT_SEG7_A 0
68#define BIT_SEG7_B 1
69#define BIT_SEG7_C 2
70#define BIT_SEG7_D 3
71#define BIT_SEG7_E 4
72#define BIT_SEG7_F 5
73#define BIT_SEG7_G 6
74#define BIT_SEG7_RESERVED 7
75
76struct seg7_conversion_map {
77 unsigned char table[128];
78};
79
80static inline int map_to_seg7(struct seg7_conversion_map *map, int c)
81{
82 return c & 0x7f ? map->table[c] : -EINVAL;
83}
84
85#define SEG7_CONVERSION_MAP(_name, _map) \
86 struct seg7_conversion_map _name = { .table = { _map } }
87
88/*
89 * It is recommended to use a facility that allows user space to redefine
90 * custom character sets for LCD devices. Please use a sysfs interface
91 * as described above.
92 */
93#define MAP_TO_SEG7_SYSFS_FILE "map_seg7"
94
95/*******************************************************************************
96 * ASCII conversion table
97 ******************************************************************************/
98
99#define _SEG7(l,a,b,c,d,e,f,g) \
100 ( a<<BIT_SEG7_A | b<<BIT_SEG7_B | c<<BIT_SEG7_C | d<<BIT_SEG7_D | \
101 e<<BIT_SEG7_E | f<<BIT_SEG7_F | g<<BIT_SEG7_G )
102
103#define _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
104 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
105
106#define _MAP_33_47_ASCII_SEG7_SYMBOL \
107 _SEG7('!',0,0,0,0,1,1,0), _SEG7('"',0,1,0,0,0,1,0), _SEG7('#',0,1,1,0,1,1,0),\
108 _SEG7('$',1,0,1,1,0,1,1), _SEG7('%',0,0,1,0,0,1,0), _SEG7('&',1,0,1,1,1,1,1),\
109 _SEG7('\'',0,0,0,0,0,1,0),_SEG7('(',1,0,0,1,1,1,0), _SEG7(')',1,1,1,1,0,0,0),\
110 _SEG7('*',0,1,1,0,1,1,1), _SEG7('+',0,1,1,0,0,0,1), _SEG7(',',0,0,0,0,1,0,0),\
111 _SEG7('-',0,0,0,0,0,0,1), _SEG7('.',0,0,0,0,1,0,0), _SEG7('/',0,1,0,0,1,0,1),
112
113#define _MAP_48_57_ASCII_SEG7_NUMERIC \
114 _SEG7('0',1,1,1,1,1,1,0), _SEG7('1',0,1,1,0,0,0,0), _SEG7('2',1,1,0,1,1,0,1),\
115 _SEG7('3',1,1,1,1,0,0,1), _SEG7('4',0,1,1,0,0,1,1), _SEG7('5',1,0,1,1,0,1,1),\
116 _SEG7('6',1,0,1,1,1,1,1), _SEG7('7',1,1,1,0,0,0,0), _SEG7('8',1,1,1,1,1,1,1),\
117 _SEG7('9',1,1,1,1,0,1,1),
118
119#define _MAP_58_64_ASCII_SEG7_SYMBOL \
120 _SEG7(':',0,0,0,1,0,0,1), _SEG7(';',0,0,0,1,0,0,1), _SEG7('<',1,0,0,0,0,1,1),\
121 _SEG7('=',0,0,0,1,0,0,1), _SEG7('>',1,1,0,0,0,0,1), _SEG7('?',1,1,1,0,0,1,0),\
122 _SEG7('@',1,1,0,1,1,1,1),
123
124#define _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
125 _SEG7('A',1,1,1,0,1,1,1), _SEG7('B',1,1,1,1,1,1,1), _SEG7('C',1,0,0,1,1,1,0),\
126 _SEG7('D',1,1,1,1,1,1,0), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
127 _SEG7('G',1,1,1,1,0,1,1), _SEG7('H',0,1,1,0,1,1,1), _SEG7('I',0,1,1,0,0,0,0),\
128 _SEG7('J',0,1,1,1,0,0,0), _SEG7('K',0,1,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
129 _SEG7('M',1,1,1,0,1,1,0), _SEG7('N',1,1,1,0,1,1,0), _SEG7('O',1,1,1,1,1,1,0),\
130 _SEG7('P',1,1,0,0,1,1,1), _SEG7('Q',1,1,1,1,1,1,0), _SEG7('R',1,1,1,0,1,1,1),\
131 _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('U',0,1,1,1,1,1,0),\
132 _SEG7('V',0,1,1,1,1,1,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
133 _SEG7('Y',0,1,1,0,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
134
135#define _MAP_91_96_ASCII_SEG7_SYMBOL \
136 _SEG7('[',1,0,0,1,1,1,0), _SEG7('\\',0,0,1,0,0,1,1),_SEG7(']',1,1,1,1,0,0,0),\
137 _SEG7('^',1,1,0,0,0,1,0), _SEG7('_',0,0,0,1,0,0,0), _SEG7('`',0,1,0,0,0,0,0),
138
139#define _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
140 _SEG7('A',1,1,1,0,1,1,1), _SEG7('b',0,0,1,1,1,1,1), _SEG7('c',0,0,0,1,1,0,1),\
141 _SEG7('d',0,1,1,1,1,0,1), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
142 _SEG7('G',1,1,1,1,0,1,1), _SEG7('h',0,0,1,0,1,1,1), _SEG7('i',0,0,1,0,0,0,0),\
143 _SEG7('j',0,0,1,1,0,0,0), _SEG7('k',0,0,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
144 _SEG7('M',1,1,1,0,1,1,0), _SEG7('n',0,0,1,0,1,0,1), _SEG7('o',0,0,1,1,1,0,1),\
145 _SEG7('P',1,1,0,0,1,1,1), _SEG7('q',1,1,1,0,0,1,1), _SEG7('r',0,0,0,0,1,0,1),\
146 _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('u',0,0,1,1,1,0,0),\
147 _SEG7('v',0,0,1,1,1,0,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
148 _SEG7('y',0,1,1,1,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
149
150#define _MAP_123_126_ASCII_SEG7_SYMBOL \
151 _SEG7('{',1,0,0,1,1,1,0), _SEG7('|',0,0,0,0,1,1,0), _SEG7('}',1,1,1,1,0,0,0),\
152 _SEG7('~',1,0,0,0,0,0,0),
153
154/* Maps */
155
156/* This set tries to map as close as possible to the visible characteristics
157 * of the ASCII symbol, lowercase and uppercase letters may differ in
158 * presentation on the display.
159 */
160#define MAP_ASCII7SEG_ALPHANUM \
161 _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
162 _MAP_33_47_ASCII_SEG7_SYMBOL \
163 _MAP_48_57_ASCII_SEG7_NUMERIC \
164 _MAP_58_64_ASCII_SEG7_SYMBOL \
165 _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
166 _MAP_91_96_ASCII_SEG7_SYMBOL \
167 _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
168 _MAP_123_126_ASCII_SEG7_SYMBOL
169
170/* This set tries to map as close as possible to the symbolic characteristics
171 * of the ASCII character for maximum discrimination.
172 * For now this means all alpha chars are in lower case representations.
173 * (This for example facilitates the use of hex numbers with uppercase input.)
174 */
175#define MAP_ASCII7SEG_ALPHANUM_LC \
176 _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
177 _MAP_33_47_ASCII_SEG7_SYMBOL \
178 _MAP_48_57_ASCII_SEG7_NUMERIC \
179 _MAP_58_64_ASCII_SEG7_SYMBOL \
180 _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
181 _MAP_91_96_ASCII_SEG7_SYMBOL \
182 _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
183 _MAP_123_126_ASCII_SEG7_SYMBOL
184
185#define SEG7_DEFAULT_MAP(_name) \
186 SEG7_CONVERSION_MAP(_name,MAP_ASCII7SEG_ALPHANUM)
187
188#endif /* MAP_TO_7SEGMENT_H */
189
diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c
new file mode 100644
index 000000000000..58a176ef96a5
--- /dev/null
+++ b/drivers/usb/input/yealink.c
@@ -0,0 +1,1013 @@
1/*
2 * drivers/usb/input/yealink.c
3 *
4 * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of
9 * the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20/*
21 * Description:
22 * Driver for the USB-P1K voip usb phone.
23 * This device is produced by Yealink Network Technology Co Ltd
24 * but may be branded under several names:
25 * - Yealink usb-p1k
26 * - Tiptel 115
27 * - ...
28 *
29 * This driver is based on:
30 * - the usbb2k-api http://savannah.nongnu.org/projects/usbb2k-api/
31 * - information from http://memeteau.free.fr/usbb2k
32 * - the xpad-driver drivers/usb/input/xpad.c
33 *
34 * Thanks to:
35 * - Olivier Vandorpe, for providing the usbb2k-api.
36 * - Martin Diehl, for spotting my memory allocation bug.
37 *
38 * History:
39 * 20050527 henk First version, functional keyboard. Keyboard events
40 * will pop-up on the ../input/eventX bus.
41 * 20050531 henk Added led, LCD, dialtone and sysfs interface.
42 * 20050610 henk Cleanups, make it ready for public consumption.
43 * 20050630 henk Cleanups, fixes in response to comments.
44 * 20050701 henk sysfs write serialisation, fix potential unload races
45 * 20050801 henk Added ringtone, restructure USB
46 * 20050816 henk Merge 2.6.13-rc6
47 */
48
49#include <linux/config.h>
50#include <linux/kernel.h>
51#include <linux/input.h>
52#include <linux/init.h>
53#include <linux/slab.h>
54#include <linux/module.h>
55#include <linux/rwsem.h>
56#include <linux/usb.h>
57
58#include "map_to_7segment.h"
59#include "yealink.h"
60
61#define DRIVER_VERSION "yld-20050816"
62#define DRIVER_AUTHOR "Henk Vergonet"
63#define DRIVER_DESC "Yealink phone driver"
64
65#define YEALINK_POLLING_FREQUENCY 10 /* in [Hz] */
66
67struct yld_status {
68 u8 lcd[24];
69 u8 led;
70 u8 dialtone;
71 u8 ringtone;
72 u8 keynum;
73} __attribute__ ((packed));
74
75/*
76 * Register the LCD segment and icon map
77 */
78#define _LOC(k,l) { .a = (k), .m = (l) }
79#define _SEG(t, a, am, b, bm, c, cm, d, dm, e, em, f, fm, g, gm) \
80 { .type = (t), \
81 .u = { .s = { _LOC(a, am), _LOC(b, bm), _LOC(c, cm), \
82 _LOC(d, dm), _LOC(e, em), _LOC(g, gm), \
83 _LOC(f, fm) } } }
84#define _PIC(t, h, hm, n) \
85 { .type = (t), \
86 .u = { .p = { .name = (n), .a = (h), .m = (hm) } } }
87
88static const struct lcd_segment_map {
89 char type;
90 union {
91 struct pictogram_map {
92 u8 a,m;
93 char name[10];
94 } p;
95 struct segment_map {
96 u8 a,m;
97 } s[7];
98 } u;
99} lcdMap[] = {
100#include "yealink.h"
101};
102
103struct yealink_dev {
104 struct input_dev idev; /* input device */
105 struct usb_device *udev; /* usb device */
106
107 /* irq input channel */
108 struct yld_ctl_packet *irq_data;
109 dma_addr_t irq_dma;
110 struct urb *urb_irq;
111
112 /* control output channel */
113 struct yld_ctl_packet *ctl_data;
114 dma_addr_t ctl_dma;
115 struct usb_ctrlrequest *ctl_req;
116 dma_addr_t ctl_req_dma;
117 struct urb *urb_ctl;
118
119 char phys[64]; /* physical device path */
120
121 u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */
122 int key_code; /* last reported key */
123
124 int stat_ix;
125 union {
126 struct yld_status s;
127 u8 b[sizeof(struct yld_status)];
128 } master, copy;
129};
130
131
132/*******************************************************************************
133 * Yealink lcd interface
134 ******************************************************************************/
135
136/*
137 * Register a default 7 segment character set
138 */
139static SEG7_DEFAULT_MAP(map_seg7);
140
141 /* Display a char,
142 * char '\9' and '\n' are placeholders and do not overwrite the original text.
143 * A space will always hide an icon.
144 */
145static int setChar(struct yealink_dev *yld, int el, int chr)
146{
147 int i, a, m, val;
148
149 if (el >= ARRAY_SIZE(lcdMap))
150 return -EINVAL;
151
152 if (chr == '\t' || chr == '\n')
153 return 0;
154
155 yld->lcdMap[el] = chr;
156
157 if (lcdMap[el].type == '.') {
158 a = lcdMap[el].u.p.a;
159 m = lcdMap[el].u.p.m;
160 if (chr != ' ')
161 yld->master.b[a] |= m;
162 else
163 yld->master.b[a] &= ~m;
164 return 0;
165 }
166
167 val = map_to_seg7(&map_seg7, chr);
168 for (i = 0; i < ARRAY_SIZE(lcdMap[0].u.s); i++) {
169 m = lcdMap[el].u.s[i].m;
170
171 if (m == 0)
172 continue;
173
174 a = lcdMap[el].u.s[i].a;
175 if (val & 1)
176 yld->master.b[a] |= m;
177 else
178 yld->master.b[a] &= ~m;
179 val = val >> 1;
180 }
181 return 0;
182};
183
184/*******************************************************************************
185 * Yealink key interface
186 ******************************************************************************/
187
188/* Map device buttons to internal key events.
189 *
190 * USB-P1K button layout:
191 *
192 * up
193 * IN OUT
194 * down
195 *
196 * pickup C hangup
197 * 1 2 3
198 * 4 5 6
199 * 7 8 9
200 * * 0 #
201 *
202 * The "up" and "down" keys, are symbolised by arrows on the button.
203 * The "pickup" and "hangup" keys are symbolised by a green and red phone
204 * on the button.
205 */
206static int map_p1k_to_key(int scancode)
207{
208 switch(scancode) { /* phone key: */
209 case 0x23: return KEY_LEFT; /* IN */
210 case 0x33: return KEY_UP; /* up */
211 case 0x04: return KEY_RIGHT; /* OUT */
212 case 0x24: return KEY_DOWN; /* down */
213 case 0x03: return KEY_ENTER; /* pickup */
214 case 0x14: return KEY_BACKSPACE; /* C */
215 case 0x13: return KEY_ESC; /* hangup */
216 case 0x00: return KEY_1; /* 1 */
217 case 0x01: return KEY_2; /* 2 */
218 case 0x02: return KEY_3; /* 3 */
219 case 0x10: return KEY_4; /* 4 */
220 case 0x11: return KEY_5; /* 5 */
221 case 0x12: return KEY_6; /* 6 */
222 case 0x20: return KEY_7; /* 7 */
223 case 0x21: return KEY_8; /* 8 */
224 case 0x22: return KEY_9; /* 9 */
225 case 0x30: return KEY_KPASTERISK; /* * */
226 case 0x31: return KEY_0; /* 0 */
227 case 0x32: return KEY_LEFTSHIFT |
228 KEY_3 << 8; /* # */
229 }
230 return -EINVAL;
231}
232
233/* Completes a request by converting the data into events for the
234 * input subsystem.
235 *
236 * The key parameter can be cascaded: key2 << 8 | key1
237 */
238static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs)
239{
240 struct input_dev *idev = &yld->idev;
241
242 input_regs(idev, regs);
243 if (yld->key_code >= 0) {
244 /* old key up */
245 input_report_key(idev, yld->key_code & 0xff, 0);
246 if (yld->key_code >> 8)
247 input_report_key(idev, yld->key_code >> 8, 0);
248 }
249
250 yld->key_code = key;
251 if (key >= 0) {
252 /* new valid key */
253 input_report_key(idev, key & 0xff, 1);
254 if (key >> 8)
255 input_report_key(idev, key >> 8, 1);
256 }
257 input_sync(idev);
258}
259
260/*******************************************************************************
261 * Yealink usb communication interface
262 ******************************************************************************/
263
264static int yealink_cmd(struct yealink_dev *yld, struct yld_ctl_packet *p)
265{
266 u8 *buf = (u8 *)p;
267 int i;
268 u8 sum = 0;
269
270 for(i=0; i<USB_PKT_LEN-1; i++)
271 sum -= buf[i];
272 p->sum = sum;
273 return usb_control_msg(yld->udev,
274 usb_sndctrlpipe(yld->udev, 0),
275 USB_REQ_SET_CONFIGURATION,
276 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT,
277 0x200, 3,
278 p, sizeof(*p),
279 USB_CTRL_SET_TIMEOUT);
280}
281
282static u8 default_ringtone[] = {
283 0xEF, /* volume [0-255] */
284 0xFB, 0x1E, 0x00, 0x0C, /* 1250 [hz], 12/100 [s] */
285 0xFC, 0x18, 0x00, 0x0C, /* 1000 [hz], 12/100 [s] */
286 0xFB, 0x1E, 0x00, 0x0C,
287 0xFC, 0x18, 0x00, 0x0C,
288 0xFB, 0x1E, 0x00, 0x0C,
289 0xFC, 0x18, 0x00, 0x0C,
290 0xFB, 0x1E, 0x00, 0x0C,
291 0xFC, 0x18, 0x00, 0x0C,
292 0xFF, 0xFF, 0x01, 0x90, /* silent, 400/100 [s] */
293 0x00, 0x00 /* end of sequence */
294};
295
296static int yealink_set_ringtone(struct yealink_dev *yld, u8 *buf, size_t size)
297{
298 struct yld_ctl_packet *p = yld->ctl_data;
299 int ix, len;
300
301 if (size <= 0)
302 return -EINVAL;
303
304 /* Set the ringtone volume */
305 memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data)));
306 yld->ctl_data->cmd = CMD_RING_VOLUME;
307 yld->ctl_data->size = 1;
308 yld->ctl_data->data[0] = buf[0];
309 yealink_cmd(yld, p);
310
311 buf++;
312 size--;
313
314 p->cmd = CMD_RING_NOTE;
315 ix = 0;
316 while (size != ix) {
317 len = size - ix;
318 if (len > sizeof(p->data))
319 len = sizeof(p->data);
320 p->size = len;
321 p->offset = cpu_to_be16(ix);
322 memcpy(p->data, &buf[ix], len);
323 yealink_cmd(yld, p);
324 ix += len;
325 }
326 return 0;
327}
328
329/* keep stat_master & stat_copy in sync.
330 */
331static int yealink_do_idle_tasks(struct yealink_dev *yld)
332{
333 u8 val;
334 int i, ix, len;
335
336 ix = yld->stat_ix;
337
338 memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data)));
339 yld->ctl_data->cmd = CMD_KEYPRESS;
340 yld->ctl_data->size = 1;
341 yld->ctl_data->sum = 0xff - CMD_KEYPRESS;
342
343 /* If state update pointer wraps do a KEYPRESS first. */
344 if (ix >= sizeof(yld->master)) {
345 yld->stat_ix = 0;
346 return 0;
347 }
348
349 /* find update candidates: copy != master */
350 do {
351 val = yld->master.b[ix];
352 if (val != yld->copy.b[ix])
353 goto send_update;
354 } while (++ix < sizeof(yld->master));
355
356 /* nothing todo, wait a bit and poll for a KEYPRESS */
357 yld->stat_ix = 0;
358 /* TODO how can we wait abit. ??
359 * msleep_interruptible(1000 / YEALINK_POLLING_FREQUENCY);
360 */
361 return 0;
362
363send_update:
364
365 /* Setup an appropriate update request */
366 yld->copy.b[ix] = val;
367 yld->ctl_data->data[0] = val;
368
369 switch(ix) {
370 case offsetof(struct yld_status, led):
371 yld->ctl_data->cmd = CMD_LED;
372 yld->ctl_data->sum = -1 - CMD_LED - val;
373 break;
374 case offsetof(struct yld_status, dialtone):
375 yld->ctl_data->cmd = CMD_DIALTONE;
376 yld->ctl_data->sum = -1 - CMD_DIALTONE - val;
377 break;
378 case offsetof(struct yld_status, ringtone):
379 yld->ctl_data->cmd = CMD_RINGTONE;
380 yld->ctl_data->sum = -1 - CMD_RINGTONE - val;
381 break;
382 case offsetof(struct yld_status, keynum):
383 val--;
384 val &= 0x1f;
385 yld->ctl_data->cmd = CMD_SCANCODE;
386 yld->ctl_data->offset = cpu_to_be16(val);
387 yld->ctl_data->data[0] = 0;
388 yld->ctl_data->sum = -1 - CMD_SCANCODE - val;
389 break;
390 default:
391 len = sizeof(yld->master.s.lcd) - ix;
392 if (len > sizeof(yld->ctl_data->data))
393 len = sizeof(yld->ctl_data->data);
394
395 /* Combine up to <len> consecutive LCD bytes in a singe request
396 */
397 yld->ctl_data->cmd = CMD_LCD;
398 yld->ctl_data->offset = cpu_to_be16(ix);
399 yld->ctl_data->size = len;
400 yld->ctl_data->sum = -CMD_LCD - ix - val - len;
401 for(i=1; i<len; i++) {
402 ix++;
403 val = yld->master.b[ix];
404 yld->copy.b[ix] = val;
405 yld->ctl_data->data[i] = val;
406 yld->ctl_data->sum -= val;
407 }
408 }
409 yld->stat_ix = ix + 1;
410 return 1;
411}
412
413/* Decide on how to handle responses
414 *
415 * The state transition diagram is somethhing like:
416 *
417 * syncState<--+
418 * | |
419 * | idle
420 * \|/ |
421 * init --ok--> waitForKey --ok--> getKey
422 * ^ ^ |
423 * | +-------ok-------+
424 * error,start
425 *
426 */
427static void urb_irq_callback(struct urb *urb, struct pt_regs *regs)
428{
429 struct yealink_dev *yld = urb->context;
430 int ret;
431
432 if (urb->status)
433 err("%s - urb status %d", __FUNCTION__, urb->status);
434
435 switch (yld->irq_data->cmd) {
436 case CMD_KEYPRESS:
437
438 yld->master.s.keynum = yld->irq_data->data[0];
439 break;
440
441 case CMD_SCANCODE:
442 dbg("get scancode %x", yld->irq_data->data[0]);
443
444 report_key(yld, map_p1k_to_key(yld->irq_data->data[0]), regs);
445 break;
446
447 default:
448 err("unexpected response %x", yld->irq_data->cmd);
449 }
450
451 yealink_do_idle_tasks(yld);
452
453 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC);
454 if (ret)
455 err("%s - usb_submit_urb failed %d", __FUNCTION__, ret);
456}
457
458static void urb_ctl_callback(struct urb *urb, struct pt_regs *regs)
459{
460 struct yealink_dev *yld = urb->context;
461 int ret;
462
463 if (urb->status)
464 err("%s - urb status %d", __FUNCTION__, urb->status);
465
466 switch (yld->ctl_data->cmd) {
467 case CMD_KEYPRESS:
468 case CMD_SCANCODE:
469 /* ask for a response */
470 ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC);
471 break;
472 default:
473 /* send new command */
474 yealink_do_idle_tasks(yld);
475 ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC);
476 }
477
478 if (ret)
479 err("%s - usb_submit_urb failed %d", __FUNCTION__, ret);
480}
481
482/*******************************************************************************
483 * input event interface
484 ******************************************************************************/
485
486/* TODO should we issue a ringtone on a SND_BELL event?
487static int input_ev(struct input_dev *dev, unsigned int type,
488 unsigned int code, int value)
489{
490
491 if (type != EV_SND)
492 return -EINVAL;
493
494 switch (code) {
495 case SND_BELL:
496 case SND_TONE:
497 break;
498 default:
499 return -EINVAL;
500 }
501
502 return 0;
503}
504*/
505
506static int input_open(struct input_dev *dev)
507{
508 struct yealink_dev *yld = dev->private;
509 int i, ret;
510
511 dbg("%s", __FUNCTION__);
512
513 /* force updates to device */
514 for (i = 0; i<sizeof(yld->master); i++)
515 yld->copy.b[i] = ~yld->master.b[i];
516 yld->key_code = -1; /* no keys pressed */
517
518 yealink_set_ringtone(yld, default_ringtone, sizeof(default_ringtone));
519
520 /* issue INIT */
521 memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data)));
522 yld->ctl_data->cmd = CMD_INIT;
523 yld->ctl_data->size = 10;
524 yld->ctl_data->sum = 0x100-CMD_INIT-10;
525 if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) {
526 dbg("%s - usb_submit_urb failed with result %d",
527 __FUNCTION__, ret);
528 return ret;
529 }
530 return 0;
531}
532
533static void input_close(struct input_dev *dev)
534{
535 struct yealink_dev *yld = dev->private;
536
537 usb_kill_urb(yld->urb_ctl);
538 usb_kill_urb(yld->urb_irq);
539}
540
541/*******************************************************************************
542 * sysfs interface
543 ******************************************************************************/
544
545static DECLARE_RWSEM(sysfs_rwsema);
546
547/* Interface to the 7-segments translation table aka. char set.
548 */
549static ssize_t show_map(struct device *dev, struct device_attribute *attr,
550 char *buf)
551{
552 memcpy(buf, &map_seg7, sizeof(map_seg7));
553 return sizeof(map_seg7);
554}
555
556static ssize_t store_map(struct device *dev, struct device_attribute *attr,
557 const char *buf, size_t cnt)
558{
559 if (cnt != sizeof(map_seg7))
560 return -EINVAL;
561 memcpy(&map_seg7, buf, sizeof(map_seg7));
562 return sizeof(map_seg7);
563}
564
565/* Interface to the LCD.
566 */
567
568/* Reading /sys/../lineX will return the format string with its settings:
569 *
570 * Example:
571 * cat ./line3
572 * 888888888888
573 * Linux Rocks!
574 */
575static ssize_t show_line(struct device *dev, char *buf, int a, int b)
576{
577 struct yealink_dev *yld;
578 int i;
579
580 down_read(&sysfs_rwsema);
581 yld = dev_get_drvdata(dev);
582 if (yld == NULL) {
583 up_read(&sysfs_rwsema);
584 return -ENODEV;
585 }
586
587 for (i = a; i < b; i++)
588 *buf++ = lcdMap[i].type;
589 *buf++ = '\n';
590 for (i = a; i < b; i++)
591 *buf++ = yld->lcdMap[i];
592 *buf++ = '\n';
593 *buf = 0;
594
595 up_read(&sysfs_rwsema);
596 return 3 + ((b - a) << 1);
597}
598
599static ssize_t show_line1(struct device *dev, struct device_attribute *attr,
600 char *buf)
601{
602 return show_line(dev, buf, LCD_LINE1_OFFSET, LCD_LINE2_OFFSET);
603}
604
605static ssize_t show_line2(struct device *dev, struct device_attribute *attr,
606 char *buf)
607{
608 return show_line(dev, buf, LCD_LINE2_OFFSET, LCD_LINE3_OFFSET);
609}
610
611static ssize_t show_line3(struct device *dev, struct device_attribute *attr,
612 char *buf)
613{
614 return show_line(dev, buf, LCD_LINE3_OFFSET, LCD_LINE4_OFFSET);
615}
616
617/* Writing to /sys/../lineX will set the coresponding LCD line.
618 * - Excess characters are ignored.
619 * - If less characters are written than allowed, the remaining digits are
620 * unchanged.
621 * - The '\n' or '\t' char is a placeholder, it does not overwrite the
622 * original content.
623 */
624static ssize_t store_line(struct device *dev, const char *buf, size_t count,
625 int el, size_t len)
626{
627 struct yealink_dev *yld;
628 int i;
629
630 down_write(&sysfs_rwsema);
631 yld = dev_get_drvdata(dev);
632 if (yld == NULL) {
633 up_write(&sysfs_rwsema);
634 return -ENODEV;
635 }
636
637 if (len > count)
638 len = count;
639 for (i = 0; i < len; i++)
640 setChar(yld, el++, buf[i]);
641
642 up_write(&sysfs_rwsema);
643 return count;
644}
645
646static ssize_t store_line1(struct device *dev, struct device_attribute *attr,
647 const char *buf, size_t count)
648{
649 return store_line(dev, buf, count, LCD_LINE1_OFFSET, LCD_LINE1_SIZE);
650}
651
652static ssize_t store_line2(struct device *dev, struct device_attribute *attr,
653 const char *buf, size_t count)
654{
655 return store_line(dev, buf, count, LCD_LINE2_OFFSET, LCD_LINE2_SIZE);
656}
657
658static ssize_t store_line3(struct device *dev, struct device_attribute *attr,
659 const char *buf, size_t count)
660{
661 return store_line(dev, buf, count, LCD_LINE3_OFFSET, LCD_LINE3_SIZE);
662}
663
664/* Interface to visible and audible "icons", these include:
665 * pictures on the LCD, the LED, and the dialtone signal.
666 */
667
668/* Get a list of "switchable elements" with their current state. */
669static ssize_t get_icons(struct device *dev, struct device_attribute *attr,
670 char *buf)
671{
672 struct yealink_dev *yld;
673 int i, ret = 1;
674
675 down_read(&sysfs_rwsema);
676 yld = dev_get_drvdata(dev);
677 if (yld == NULL) {
678 up_read(&sysfs_rwsema);
679 return -ENODEV;
680 }
681
682 for (i = 0; i < ARRAY_SIZE(lcdMap); i++) {
683 if (lcdMap[i].type != '.')
684 continue;
685 ret += sprintf(&buf[ret], "%s %s\n",
686 yld->lcdMap[i] == ' ' ? " " : "on",
687 lcdMap[i].u.p.name);
688 }
689 up_read(&sysfs_rwsema);
690 return ret;
691}
692
693/* Change the visibility of a particular element. */
694static ssize_t set_icon(struct device *dev, const char *buf, size_t count,
695 int chr)
696{
697 struct yealink_dev *yld;
698 int i;
699
700 down_write(&sysfs_rwsema);
701 yld = dev_get_drvdata(dev);
702 if (yld == NULL) {
703 up_write(&sysfs_rwsema);
704 return -ENODEV;
705 }
706
707 for (i = 0; i < ARRAY_SIZE(lcdMap); i++) {
708 if (lcdMap[i].type != '.')
709 continue;
710 if (strncmp(buf, lcdMap[i].u.p.name, count) == 0) {
711 setChar(yld, i, chr);
712 break;
713 }
714 }
715
716 up_write(&sysfs_rwsema);
717 return count;
718}
719
720static ssize_t show_icon(struct device *dev, struct device_attribute *attr,
721 const char *buf, size_t count)
722{
723 return set_icon(dev, buf, count, buf[0]);
724}
725
726static ssize_t hide_icon(struct device *dev, struct device_attribute *attr,
727 const char *buf, size_t count)
728{
729 return set_icon(dev, buf, count, ' ');
730}
731
732/* Upload a ringtone to the device.
733 */
734
735/* Stores raw ringtone data in the phone */
736static ssize_t store_ringtone(struct device *dev,
737 struct device_attribute *attr,
738 const char *buf, size_t count)
739{
740 struct yealink_dev *yld;
741
742 down_write(&sysfs_rwsema);
743 yld = dev_get_drvdata(dev);
744 if (yld == NULL) {
745 up_write(&sysfs_rwsema);
746 return -ENODEV;
747 }
748
749 /* TODO locking with async usb control interface??? */
750 yealink_set_ringtone(yld, (char *)buf, count);
751 up_write(&sysfs_rwsema);
752 return count;
753}
754
755#define _M444 S_IRUGO
756#define _M664 S_IRUGO|S_IWUSR|S_IWGRP
757#define _M220 S_IWUSR|S_IWGRP
758
759static DEVICE_ATTR(map_seg7 , _M664, show_map , store_map );
760static DEVICE_ATTR(line1 , _M664, show_line1 , store_line1 );
761static DEVICE_ATTR(line2 , _M664, show_line2 , store_line2 );
762static DEVICE_ATTR(line3 , _M664, show_line3 , store_line3 );
763static DEVICE_ATTR(get_icons , _M444, get_icons , NULL );
764static DEVICE_ATTR(show_icon , _M220, NULL , show_icon );
765static DEVICE_ATTR(hide_icon , _M220, NULL , hide_icon );
766static DEVICE_ATTR(ringtone , _M220, NULL , store_ringtone);
767
768static struct attribute *yld_attributes[] = {
769 &dev_attr_line1.attr,
770 &dev_attr_line2.attr,
771 &dev_attr_line3.attr,
772 &dev_attr_get_icons.attr,
773 &dev_attr_show_icon.attr,
774 &dev_attr_hide_icon.attr,
775 &dev_attr_map_seg7.attr,
776 &dev_attr_ringtone.attr,
777 NULL
778};
779
780static struct attribute_group yld_attr_group = {
781 .attrs = yld_attributes
782};
783
784/*******************************************************************************
785 * Linux interface and usb initialisation
786 ******************************************************************************/
787
788static const struct yld_device {
789 u16 idVendor;
790 u16 idProduct;
791 char *name;
792} yld_device[] = {
793 { 0x6993, 0xb001, "Yealink usb-p1k" },
794};
795
796static struct usb_device_id usb_table [] = {
797 { USB_INTERFACE_INFO(USB_CLASS_HID, 0, 0) },
798 { }
799};
800
801static int usb_cleanup(struct yealink_dev *yld, int err)
802{
803 if (yld == NULL)
804 return err;
805
806 if (yld->urb_irq) {
807 usb_kill_urb(yld->urb_irq);
808 usb_free_urb(yld->urb_irq);
809 }
810 if (yld->urb_ctl)
811 usb_free_urb(yld->urb_ctl);
812 if (yld->idev.dev)
813 input_unregister_device(&yld->idev);
814 if (yld->ctl_req)
815 usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)),
816 yld->ctl_req, yld->ctl_req_dma);
817 if (yld->ctl_data)
818 usb_buffer_free(yld->udev, USB_PKT_LEN,
819 yld->ctl_data, yld->ctl_dma);
820 if (yld->irq_data)
821 usb_buffer_free(yld->udev, USB_PKT_LEN,
822 yld->irq_data, yld->irq_dma);
823 kfree(yld);
824 return err;
825}
826
827static void usb_disconnect(struct usb_interface *intf)
828{
829 struct yealink_dev *yld;
830
831 down_write(&sysfs_rwsema);
832 yld = usb_get_intfdata(intf);
833 sysfs_remove_group(&intf->dev.kobj, &yld_attr_group);
834 usb_set_intfdata(intf, NULL);
835 up_write(&sysfs_rwsema);
836
837 usb_cleanup(yld, 0);
838}
839
840static int usb_match(struct usb_device *udev)
841{
842 int i;
843 u16 idVendor = le16_to_cpu(udev->descriptor.idVendor);
844 u16 idProduct = le16_to_cpu(udev->descriptor.idProduct);
845
846 for (i = 0; i < ARRAY_SIZE(yld_device); i++) {
847 if ((idVendor == yld_device[i].idVendor) &&
848 (idProduct == yld_device[i].idProduct))
849 return i;
850 }
851 return -ENODEV;
852}
853
854static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
855{
856 struct usb_device *udev = interface_to_usbdev (intf);
857 struct usb_host_interface *interface;
858 struct usb_endpoint_descriptor *endpoint;
859 struct yealink_dev *yld;
860 char path[64];
861 int ret, pipe, i;
862
863 i = usb_match(udev);
864 if (i < 0)
865 return -ENODEV;
866
867 interface = intf->cur_altsetting;
868 endpoint = &interface->endpoint[0].desc;
869 if (!(endpoint->bEndpointAddress & 0x80))
870 return -EIO;
871 if ((endpoint->bmAttributes & 3) != 3)
872 return -EIO;
873
874 if ((yld = kmalloc(sizeof(struct yealink_dev), GFP_KERNEL)) == NULL)
875 return -ENOMEM;
876
877 memset(yld, 0, sizeof(*yld));
878 yld->udev = udev;
879
880 /* allocate usb buffers */
881 yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN,
882 SLAB_ATOMIC, &yld->irq_dma);
883 if (yld->irq_data == NULL)
884 return usb_cleanup(yld, -ENOMEM);
885
886 yld->ctl_data = usb_buffer_alloc(udev, USB_PKT_LEN,
887 SLAB_ATOMIC, &yld->ctl_dma);
888 if (!yld->ctl_data)
889 return usb_cleanup(yld, -ENOMEM);
890
891 yld->ctl_req = usb_buffer_alloc(udev, sizeof(*(yld->ctl_req)),
892 SLAB_ATOMIC, &yld->ctl_req_dma);
893 if (yld->ctl_req == NULL)
894 return usb_cleanup(yld, -ENOMEM);
895
896 /* allocate urb structures */
897 yld->urb_irq = usb_alloc_urb(0, GFP_KERNEL);
898 if (yld->urb_irq == NULL)
899 return usb_cleanup(yld, -ENOMEM);
900
901 yld->urb_ctl = usb_alloc_urb(0, GFP_KERNEL);
902 if (yld->urb_ctl == NULL)
903 return usb_cleanup(yld, -ENOMEM);
904
905 /* get a handle to the interrupt data pipe */
906 pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
907 ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
908 if (ret != USB_PKT_LEN)
909 err("invalid payload size %d, expected %d", ret, USB_PKT_LEN);
910
911 /* initialise irq urb */
912 usb_fill_int_urb(yld->urb_irq, udev, pipe, yld->irq_data,
913 USB_PKT_LEN,
914 urb_irq_callback,
915 yld, endpoint->bInterval);
916 yld->urb_irq->transfer_dma = yld->irq_dma;
917 yld->urb_irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
918 yld->urb_irq->dev = udev;
919
920 /* initialise ctl urb */
921 yld->ctl_req->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE |
922 USB_DIR_OUT;
923 yld->ctl_req->bRequest = USB_REQ_SET_CONFIGURATION;
924 yld->ctl_req->wValue = cpu_to_le16(0x200);
925 yld->ctl_req->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber);
926 yld->ctl_req->wLength = cpu_to_le16(USB_PKT_LEN);
927
928 usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0),
929 (void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN,
930 urb_ctl_callback, yld);
931 yld->urb_ctl->setup_dma = yld->ctl_req_dma;
932 yld->urb_ctl->transfer_dma = yld->ctl_dma;
933 yld->urb_ctl->transfer_flags |= URB_NO_SETUP_DMA_MAP |
934 URB_NO_TRANSFER_DMA_MAP;
935 yld->urb_ctl->dev = udev;
936
937 /* find out the physical bus location */
938 if (usb_make_path(udev, path, sizeof(path)) > 0)
939 snprintf(yld->phys, sizeof(yld->phys)-1, "%s/input0", path);
940
941 /* register settings for the input device */
942 init_input_dev(&yld->idev);
943 yld->idev.private = yld;
944 yld->idev.id.bustype = BUS_USB;
945 yld->idev.id.vendor = le16_to_cpu(udev->descriptor.idVendor);
946 yld->idev.id.product = le16_to_cpu(udev->descriptor.idProduct);
947 yld->idev.id.version = le16_to_cpu(udev->descriptor.bcdDevice);
948 yld->idev.dev = &intf->dev;
949 yld->idev.name = yld_device[i].name;
950 yld->idev.phys = yld->phys;
951 /* yld->idev.event = input_ev; TODO */
952 yld->idev.open = input_open;
953 yld->idev.close = input_close;
954
955 /* register available key events */
956 yld->idev.evbit[0] = BIT(EV_KEY);
957 for (i = 0; i < 256; i++) {
958 int k = map_p1k_to_key(i);
959 if (k >= 0) {
960 set_bit(k & 0xff, yld->idev.keybit);
961 if (k >> 8)
962 set_bit(k >> 8, yld->idev.keybit);
963 }
964 }
965
966 printk(KERN_INFO "input: %s on %s\n", yld->idev.name, path);
967
968 input_register_device(&yld->idev);
969
970 usb_set_intfdata(intf, yld);
971
972 /* clear visible elements */
973 for (i=0; i<ARRAY_SIZE(lcdMap); i++)
974 setChar(yld, i, ' ');
975
976 /* display driver version on LCD line 3 */
977 store_line3(&intf->dev, NULL,
978 DRIVER_VERSION, sizeof(DRIVER_VERSION));
979
980 /* Register sysfs hooks (don't care about failure) */
981 sysfs_create_group(&intf->dev.kobj, &yld_attr_group);
982 return 0;
983}
984
985static struct usb_driver yealink_driver = {
986 .owner = THIS_MODULE,
987 .name = "yealink",
988 .probe = usb_probe,
989 .disconnect = usb_disconnect,
990 .id_table = usb_table,
991};
992
993static int __init yealink_dev_init(void)
994{
995 int ret = usb_register(&yealink_driver);
996 if (ret == 0)
997 info(DRIVER_DESC ":" DRIVER_VERSION);
998 return ret;
999}
1000
1001static void __exit yealink_dev_exit(void)
1002{
1003 usb_deregister(&yealink_driver);
1004}
1005
1006module_init(yealink_dev_init);
1007module_exit(yealink_dev_exit);
1008
1009MODULE_DEVICE_TABLE (usb, usb_table);
1010
1011MODULE_AUTHOR(DRIVER_AUTHOR);
1012MODULE_DESCRIPTION(DRIVER_DESC);
1013MODULE_LICENSE("GPL");
diff --git a/drivers/usb/input/yealink.h b/drivers/usb/input/yealink.h
new file mode 100644
index 000000000000..48af0be9cbdf
--- /dev/null
+++ b/drivers/usb/input/yealink.h
@@ -0,0 +1,220 @@
1/*
2 * drivers/usb/input/yealink.h
3 *
4 * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
5 *
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21#ifndef INPUT_YEALINK_H
22#define INPUT_YEALINK_H
23
24/* Using the control channel on interface 3 various aspects of the phone
25 * can be controlled like LCD, LED, dialtone and the ringtone.
26 */
27
28struct yld_ctl_packet {
29 u8 cmd; /* command code, see below */
30 u8 size; /* 1-11, size of used data bytes. */
31 u16 offset; /* internal packet offset */
32 u8 data[11];
33 s8 sum; /* negative sum of 15 preceding bytes */
34} __attribute__ ((packed));
35
36#define USB_PKT_LEN sizeof(struct yld_ctl_packet)
37
38/* The following yld_ctl_packet's are available: */
39
40/* Init registers
41 *
42 * cmd 0x8e
43 * size 10
44 * offset 0
45 * data 0,0,0,0....
46 */
47#define CMD_INIT 0x8e
48
49/* Request key scan
50 *
51 * cmd 0x80
52 * size 1
53 * offset 0
54 * data[0] on return returns the key number, if it changes there's a new
55 * key pressed.
56 */
57#define CMD_KEYPRESS 0x80
58
59/* Request scancode
60 *
61 * cmd 0x81
62 * size 1
63 * offset key number [0-1f]
64 * data[0] on return returns the scancode
65 */
66#define CMD_SCANCODE 0x81
67
68/* Set LCD
69 *
70 * cmd 0x04
71 * size 1-11
72 * offset 0-23
73 * data segment bits
74 */
75#define CMD_LCD 0x04
76
77/* Set led
78 *
79 * cmd 0x05
80 * size 1
81 * offset 0
82 * data[0] 0 OFF / 1 ON
83 */
84#define CMD_LED 0x05
85
86/* Set ringtone volume
87 *
88 * cmd 0x11
89 * size 1
90 * offset 0
91 * data[0] 0-0xff volume
92 */
93#define CMD_RING_VOLUME 0x11
94
95/* Set ringtone notes
96 *
97 * cmd 0x02
98 * size 1-11
99 * offset 0->
100 * data binary representation LE16(-freq), LE16(duration) ....
101 */
102#define CMD_RING_NOTE 0x02
103
104/* Sound ringtone via the speaker on the back
105 *
106 * cmd 0x03
107 * size 1
108 * offset 0
109 * data[0] 0 OFF / 0x24 ON
110 */
111#define CMD_RINGTONE 0x03
112
113/* Sound dial tone via the ear speaker
114 *
115 * cmd 0x09
116 * size 1
117 * offset 0
118 * data[0] 0 OFF / 1 ON
119 */
120#define CMD_DIALTONE 0x09
121
122#endif /* INPUT_YEALINK_H */
123
124
125#if defined(_SEG) && defined(_PIC)
126/* This table maps the LCD segments onto individual bit positions in the
127 * yld_status struct.
128 */
129
130/* LCD, each segment must be driven seperately.
131 *
132 * Layout:
133 *
134 * |[] [][] [][] [][] in |[][]
135 * |[] M [][] D [][] : [][] out |[][]
136 * store
137 *
138 * NEW REP SU MO TU WE TH FR SA
139 *
140 * [] [] [] [] [] [] [] [] [] [] [] []
141 * [] [] [] [] [] [] [] [] [] [] [] []
142 */
143
144/* Line 1
145 * Format : 18.e8.M8.88...188
146 * Icon names : M D : IN OUT STORE
147 */
148#define LCD_LINE1_OFFSET 0
149#define LCD_LINE1_SIZE 17
150
151/* Note: first g then f => ! ! */
152/* _SEG( type a b c d e g f ) */
153 _SEG('1', 0,0 , 22,2 , 22,2 , 0,0 , 0,0 , 0,0 , 0,0 ),
154 _SEG('8', 20,1 , 20,2 , 20,4 , 20,8 , 21,4 , 21,2 , 21,1 ),
155 _PIC('.', 22,1 , "M" ),
156 _SEG('e', 18,1 , 18,2 , 18,4 , 18,1 , 19,2 , 18,1 , 19,1 ),
157 _SEG('8', 16,1 , 16,2 , 16,4 , 16,8 , 17,4 , 17,2 , 17,1 ),
158 _PIC('.', 15,8 , "D" ),
159 _SEG('M', 14,1 , 14,2 , 14,4 , 14,1 , 15,4 , 15,2 , 15,1 ),
160 _SEG('8', 12,1 , 12,2 , 12,4 , 12,8 , 13,4 , 13,2 , 13,1 ),
161 _PIC('.', 11,8 , ":" ),
162 _SEG('8', 10,1 , 10,2 , 10,4 , 10,8 , 11,4 , 11,2 , 11,1 ),
163 _SEG('8', 8,1 , 8,2 , 8,4 , 8,8 , 9,4 , 9,2 , 9,1 ),
164 _PIC('.', 7,1 , "IN" ),
165 _PIC('.', 7,2 , "OUT" ),
166 _PIC('.', 7,4 , "STORE" ),
167 _SEG('1', 0,0 , 5,1 , 5,1 , 0,0 , 0,0 , 0,0 , 0,0 ),
168 _SEG('8', 4,1 , 4,2 , 4,4 , 4,8 , 5,8 , 5,4 , 5,2 ),
169 _SEG('8', 2,1 , 2,2 , 2,4 , 2,8 , 3,4 , 3,2 , 3,1 ),
170
171/* Line 2
172 * Format : .........
173 * Pict. name : NEW REP SU MO TU WE TH FR SA
174 */
175#define LCD_LINE2_OFFSET LCD_LINE1_OFFSET + LCD_LINE1_SIZE
176#define LCD_LINE2_SIZE 9
177
178 _PIC('.', 23,2 , "NEW" ),
179 _PIC('.', 23,4 , "REP" ),
180 _PIC('.', 1,8 , "SU" ),
181 _PIC('.', 1,4 , "MO" ),
182 _PIC('.', 1,2 , "TU" ),
183 _PIC('.', 1,1 , "WE" ),
184 _PIC('.', 0,1 , "TH" ),
185 _PIC('.', 0,2 , "FR" ),
186 _PIC('.', 0,4 , "SA" ),
187
188/* Line 3
189 * Format : 888888888888
190 */
191#define LCD_LINE3_OFFSET LCD_LINE2_OFFSET + LCD_LINE2_SIZE
192#define LCD_LINE3_SIZE 12
193
194 _SEG('8', 22,16, 22,32, 22,64, 22,128, 23,128, 23,64, 23,32 ),
195 _SEG('8', 20,16, 20,32, 20,64, 20,128, 21,128, 21,64, 21,32 ),
196 _SEG('8', 18,16, 18,32, 18,64, 18,128, 19,128, 19,64, 19,32 ),
197 _SEG('8', 16,16, 16,32, 16,64, 16,128, 17,128, 17,64, 17,32 ),
198 _SEG('8', 14,16, 14,32, 14,64, 14,128, 15,128, 15,64, 15,32 ),
199 _SEG('8', 12,16, 12,32, 12,64, 12,128, 13,128, 13,64, 13,32 ),
200 _SEG('8', 10,16, 10,32, 10,64, 10,128, 11,128, 11,64, 11,32 ),
201 _SEG('8', 8,16, 8,32, 8,64, 8,128, 9,128, 9,64, 9,32 ),
202 _SEG('8', 6,16, 6,32, 6,64, 6,128, 7,128, 7,64, 7,32 ),
203 _SEG('8', 4,16, 4,32, 4,64, 4,128, 5,128, 5,64, 5,32 ),
204 _SEG('8', 2,16, 2,32, 2,64, 2,128, 3,128, 3,64, 3,32 ),
205 _SEG('8', 0,16, 0,32, 0,64, 0,128, 1,128, 1,64, 1,32 ),
206
207/* Line 4
208 *
209 * The LED, DIALTONE and RINGTONE are implemented as icons and use the same
210 * sysfs interface.
211 */
212#define LCD_LINE4_OFFSET LCD_LINE3_OFFSET + LCD_LINE3_SIZE
213
214 _PIC('.', offsetof(struct yld_status, led) , 0x01, "LED" ),
215 _PIC('.', offsetof(struct yld_status, dialtone) , 0x01, "DIALTONE" ),
216 _PIC('.', offsetof(struct yld_status, ringtone) , 0x24, "RINGTONE" ),
217
218#undef _SEG
219#undef _PIC
220#endif /* _SEG && _PIC */
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c
index 6f7994f5a714..ae4681f9f0ea 100644
--- a/drivers/usb/misc/auerswald.c
+++ b/drivers/usb/misc/auerswald.c
@@ -426,7 +426,7 @@ static int auerchain_submit_urb (pauerchain_t acp, struct urb * urb)
426 426
427/* cancel an urb which is submitted to the chain 427/* cancel an urb which is submitted to the chain
428 the result is 0 if the urb is cancelled, or -EINPROGRESS if 428 the result is 0 if the urb is cancelled, or -EINPROGRESS if
429 URB_ASYNC_UNLINK is set and the function is successfully started. 429 the function is successfully started.
430*/ 430*/
431static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb) 431static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb)
432{ 432{
@@ -515,7 +515,6 @@ static void auerchain_unlink_all (pauerchain_t acp)
515 acep = acp->active; 515 acep = acp->active;
516 if (acep) { 516 if (acep) {
517 urbp = acep->urbp; 517 urbp = acep->urbp;
518 urbp->transfer_flags &= ~URB_ASYNC_UNLINK;
519 dbg ("unlink active urb"); 518 dbg ("unlink active urb");
520 usb_kill_urb (urbp); 519 usb_kill_urb (urbp);
521 } 520 }
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c
index ad17892aac9e..7e93ac96490f 100644
--- a/drivers/usb/misc/ldusb.c
+++ b/drivers/usb/misc/ldusb.c
@@ -464,7 +464,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count,
464 actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); 464 actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size));
465 bytes_to_read = min(count, *actual_buffer); 465 bytes_to_read = min(count, *actual_buffer);
466 if (bytes_to_read < *actual_buffer) 466 if (bytes_to_read < *actual_buffer)
467 dev_warn(&dev->intf->dev, "Read buffer overflow, %d bytes dropped\n", 467 dev_warn(&dev->intf->dev, "Read buffer overflow, %zd bytes dropped\n",
468 *actual_buffer-bytes_to_read); 468 *actual_buffer-bytes_to_read);
469 469
470 /* copy one interrupt_in_buffer from ring_buffer into userspace */ 470 /* copy one interrupt_in_buffer from ring_buffer into userspace */
@@ -528,8 +528,8 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer,
528 /* write the data into interrupt_out_buffer from userspace */ 528 /* write the data into interrupt_out_buffer from userspace */
529 bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); 529 bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size);
530 if (bytes_to_write < count) 530 if (bytes_to_write < count)
531 dev_warn(&dev->intf->dev, "Write buffer overflow, %d bytes dropped\n",count-bytes_to_write); 531 dev_warn(&dev->intf->dev, "Write buffer overflow, %zd bytes dropped\n",count-bytes_to_write);
532 dbg_info(&dev->intf->dev, "%s: count = %d, bytes_to_write = %d\n", __FUNCTION__, count, bytes_to_write); 532 dbg_info(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", __FUNCTION__, count, bytes_to_write);
533 533
534 if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { 534 if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) {
535 retval = -EFAULT; 535 retval = -EFAULT;
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c
index 2fd12264fd53..d63ce6c030f3 100644
--- a/drivers/usb/misc/sisusbvga/sisusb.c
+++ b/drivers/usb/misc/sisusbvga/sisusb.c
@@ -229,7 +229,7 @@ sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, unsigned int pipe,
229 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, 229 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
230 sisusb_bulk_completeout, &sisusb->urbout_context[index]); 230 sisusb_bulk_completeout, &sisusb->urbout_context[index]);
231 231
232 urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); 232 urb->transfer_flags |= tflags;
233 urb->actual_length = 0; 233 urb->actual_length = 0;
234 234
235 if ((urb->transfer_dma = transfer_dma)) 235 if ((urb->transfer_dma = transfer_dma))
@@ -295,7 +295,7 @@ sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, unsigned int pipe, void *data,
295 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, 295 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
296 sisusb_bulk_completein, sisusb); 296 sisusb_bulk_completein, sisusb);
297 297
298 urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); 298 urb->transfer_flags |= tflags;
299 urb->actual_length = 0; 299 urb->actual_length = 0;
300 300
301 if ((urb->transfer_dma = transfer_dma)) 301 if ((urb->transfer_dma = transfer_dma))
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
index fd7fb98e4b20..54799eb0bc60 100644
--- a/drivers/usb/misc/usbtest.c
+++ b/drivers/usb/misc/usbtest.c
@@ -986,7 +986,6 @@ test_ctrl_queue (struct usbtest_dev *dev, struct usbtest_param *param)
986 986
987 u->context = &context; 987 u->context = &context;
988 u->complete = ctrl_complete; 988 u->complete = ctrl_complete;
989 u->transfer_flags |= URB_ASYNC_UNLINK;
990 } 989 }
991 990
992 /* queue the urbs */ 991 /* queue the urbs */
@@ -1052,7 +1051,6 @@ static int unlink1 (struct usbtest_dev *dev, int pipe, int size, int async)
1052 urb = simple_alloc_urb (testdev_to_usbdev (dev), pipe, size); 1051 urb = simple_alloc_urb (testdev_to_usbdev (dev), pipe, size);
1053 if (!urb) 1052 if (!urb)
1054 return -ENOMEM; 1053 return -ENOMEM;
1055 urb->transfer_flags |= URB_ASYNC_UNLINK;
1056 urb->context = &completion; 1054 urb->context = &completion;
1057 urb->complete = unlink1_callback; 1055 urb->complete = unlink1_callback;
1058 1056
diff --git a/drivers/usb/mon/Makefile b/drivers/usb/mon/Makefile
index b0015b8a1d1f..3cf3ea3a88ed 100644
--- a/drivers/usb/mon/Makefile
+++ b/drivers/usb/mon/Makefile
@@ -2,7 +2,7 @@
2# Makefile for USB Core files and filesystem 2# Makefile for USB Core files and filesystem
3# 3#
4 4
5usbmon-objs := mon_main.o mon_stat.o mon_text.o 5usbmon-objs := mon_main.o mon_stat.o mon_text.o mon_dma.o
6 6
7# This does not use CONFIG_USB_MON because we want this to use a tristate. 7# This does not use CONFIG_USB_MON because we want this to use a tristate.
8obj-$(CONFIG_USB) += usbmon.o 8obj-$(CONFIG_USB) += usbmon.o
diff --git a/drivers/usb/mon/mon_dma.c b/drivers/usb/mon/mon_dma.c
new file mode 100644
index 000000000000..0a1367b760a0
--- /dev/null
+++ b/drivers/usb/mon/mon_dma.c
@@ -0,0 +1,55 @@
1/*
2 * The USB Monitor, inspired by Dave Harding's USBMon.
3 *
4 * mon_dma.c: Library which snoops on DMA areas.
5 *
6 * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com)
7 */
8#include <linux/kernel.h>
9#include <linux/list.h>
10#include <linux/highmem.h>
11#include <asm/page.h>
12
13#include <linux/usb.h> /* Only needed for declarations in usb_mon.h */
14#include "usb_mon.h"
15
16#ifdef __i386__ /* CONFIG_ARCH_I386 does not exit */
17#define MON_HAS_UNMAP 1
18
19#define phys_to_page(phys) pfn_to_page((phys) >> PAGE_SHIFT)
20
21char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len)
22{
23 struct page *pg;
24 unsigned long flags;
25 unsigned char *map;
26 unsigned char *ptr;
27
28 /*
29 * On i386, a DMA handle is the "physical" address of a page.
30 * In other words, the bus address is equal to physical address.
31 * There is no IOMMU.
32 */
33 pg = phys_to_page(dma_addr);
34
35 /*
36 * We are called from hardware IRQs in case of callbacks.
37 * But we can be called from softirq or process context in case
38 * of submissions. In such case, we need to protect KM_IRQ0.
39 */
40 local_irq_save(flags);
41 map = kmap_atomic(pg, KM_IRQ0);
42 ptr = map + (dma_addr & (PAGE_SIZE-1));
43 memcpy(dst, ptr, len);
44 kunmap_atomic(map, KM_IRQ0);
45 local_irq_restore(flags);
46 return 0;
47}
48#endif /* __i386__ */
49
50#ifndef MON_HAS_UNMAP
51char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len)
52{
53 return 'D';
54}
55#endif
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c
index 26266b30028e..417464dea9f6 100644
--- a/drivers/usb/mon/mon_text.c
+++ b/drivers/usb/mon/mon_text.c
@@ -91,25 +91,11 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
91 int len, char ev_type) 91 int len, char ev_type)
92{ 92{
93 int pipe = urb->pipe; 93 int pipe = urb->pipe;
94 unsigned char *data;
95
96 /*
97 * The check to see if it's safe to poke at data has an enormous
98 * number of corner cases, but it seems that the following is
99 * more or less safe.
100 *
101 * We do not even try to look transfer_buffer, because it can
102 * contain non-NULL garbage in case the upper level promised to
103 * set DMA for the HCD.
104 */
105 if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)
106 return 'D';
107 94
108 if (len <= 0) 95 if (len <= 0)
109 return 'L'; 96 return 'L';
110 97 if (len >= DATA_MAX)
111 if ((data = urb->transfer_buffer) == NULL) 98 len = DATA_MAX;
112 return 'Z'; /* '0' would be not as pretty. */
113 99
114 /* 100 /*
115 * Bulk is easy to shortcut reliably. 101 * Bulk is easy to shortcut reliably.
@@ -126,8 +112,21 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
126 } 112 }
127 } 113 }
128 114
129 if (len >= DATA_MAX) 115 /*
130 len = DATA_MAX; 116 * The check to see if it's safe to poke at data has an enormous
117 * number of corner cases, but it seems that the following is
118 * more or less safe.
119 *
120 * We do not even try to look transfer_buffer, because it can
121 * contain non-NULL garbage in case the upper level promised to
122 * set DMA for the HCD.
123 */
124 if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)
125 return mon_dmapeek(ep->data, urb->transfer_dma, len);
126
127 if (urb->transfer_buffer == NULL)
128 return 'Z'; /* '0' would be not as pretty. */
129
131 memcpy(ep->data, urb->transfer_buffer, len); 130 memcpy(ep->data, urb->transfer_buffer, len);
132 return 0; 131 return 0;
133} 132}
diff --git a/drivers/usb/mon/usb_mon.h b/drivers/usb/mon/usb_mon.h
index 9b06784d2c48..4be0f9346071 100644
--- a/drivers/usb/mon/usb_mon.h
+++ b/drivers/usb/mon/usb_mon.h
@@ -45,6 +45,10 @@ struct mon_reader {
45void mon_reader_add(struct mon_bus *mbus, struct mon_reader *r); 45void mon_reader_add(struct mon_bus *mbus, struct mon_reader *r);
46void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); 46void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r);
47 47
48/*
49 */
50extern char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len);
51
48extern struct semaphore mon_lock; 52extern struct semaphore mon_lock;
49 53
50extern struct file_operations mon_fops_text; 54extern struct file_operations mon_fops_text;
diff --git a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig
index b104430e2c6a..8c010bb44eb8 100644
--- a/drivers/usb/net/Kconfig
+++ b/drivers/usb/net/Kconfig
@@ -99,7 +99,7 @@ config USB_USBNET
99 with "minidrivers" built around a common network driver core 99 with "minidrivers" built around a common network driver core
100 that supports deep queues for efficient transfers. (This gives 100 that supports deep queues for efficient transfers. (This gives
101 better performance with small packets and at high speeds). 101 better performance with small packets and at high speeds).
102 102
103 The USB host runs "usbnet", and the other end of the link might be: 103 The USB host runs "usbnet", and the other end of the link might be:
104 104
105 - Another USB host, when using USB "network" or "data transfer" 105 - Another USB host, when using USB "network" or "data transfer"
@@ -125,38 +125,63 @@ config USB_USBNET
125 To compile this driver as a module, choose M here: the 125 To compile this driver as a module, choose M here: the
126 module will be called usbnet. 126 module will be called usbnet.
127 127
128comment "USB Host-to-Host Cables" 128config USB_NET_AX8817X
129 depends on USB_USBNET 129 tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters"
130 130 depends on USB_USBNET && NET_ETHERNET
131config USB_ALI_M5632 131 select CRC32
132 boolean "ALi M5632 based 'USB 2.0 Data Link' cables" 132 select MII
133 depends on USB_USBNET
134 default y 133 default y
135 help 134 help
136 Choose this option if you're using a host-to-host cable 135 This option adds support for ASIX AX88xxx based USB 2.0
137 based on this design, which supports USB 2.0 high speed. 136 10/100 Ethernet adapters.
138 137
139config USB_AN2720 138 This driver should work with at least the following devices:
140 boolean "AnchorChips 2720 based cables (Xircom PGUNET, ...)" 139 * Aten UC210T
141 depends on USB_USBNET 140 * ASIX AX88172
142 default y 141 * Billionton Systems, USB2AR
143 help 142 * Buffalo LUA-U2-KTX
144 Choose this option if you're using a host-to-host cable 143 * Corega FEther USB2-TX
145 based on this design. Note that AnchorChips is now a 144 * D-Link DUB-E100
146 Cypress brand. 145 * Hawking UF200
146 * Linksys USB200M
147 * Netgear FA120
148 * Sitecom LN-029
149 * Intellinet USB 2.0 Ethernet
150 * ST Lab USB 2.0 Ethernet
151 * TrendNet TU2-ET100
147 152
148config USB_BELKIN 153 This driver creates an interface named "ethX", where X depends on
149 boolean "eTEK based host-to-host cables (Advance, Belkin, ...)" 154 what other networking devices you have in use.
155
156
157config USB_NET_CDCETHER
158 tristate "CDC Ethernet support (smart devices such as cable modems)"
150 depends on USB_USBNET 159 depends on USB_USBNET
151 default y 160 default y
152 help 161 help
153 Choose this option if you're using a host-to-host cable 162 This option supports devices conforming to the Communication Device
154 based on this design: two NetChip 2890 chips and an Atmel 163 Class (CDC) Ethernet Control Model, a specification that's easy to
155 microcontroller, with LEDs that indicate traffic. 164 implement in device firmware. The CDC specifications are available
165 from <http://www.usb.org/>.
156 166
157config USB_GENESYS 167 CDC Ethernet is an implementation option for DOCSIS cable modems
158 boolean "GeneSys GL620USB-A based cables" 168 that support USB connectivity, used for non-Microsoft USB hosts.
159 default y 169 The Linux-USB CDC Ethernet Gadget driver is an open implementation.
170 This driver should work with at least the following devices:
171
172 * Ericsson PipeRider (all variants)
173 * Motorola (DM100 and SB4100)
174 * Broadcom Cable Modem (reference design)
175 * Toshiba PCX1100U
176 * ...
177
178 This driver creates an interface named "ethX", where X depends on
179 what other networking devices you have in use. However, if the
180 IEEE 802 "local assignment" bit is set in the address, a "usbX"
181 name is used instead.
182
183config USB_NET_GL620A
184 tristate "GeneSys GL620USB-A based cables"
160 depends on USB_USBNET 185 depends on USB_USBNET
161 help 186 help
162 Choose this option if you're using a host-to-host cable, 187 Choose this option if you're using a host-to-host cable,
@@ -164,38 +189,78 @@ config USB_GENESYS
164 189
165 Note that the half-duplex "GL620USB" is not supported. 190 Note that the half-duplex "GL620USB" is not supported.
166 191
167config USB_NET1080 192config USB_NET_NET1080
168 boolean "NetChip 1080 based cables (Laplink, ...)" 193 tristate "NetChip 1080 based cables (Laplink, ...)"
169 default y 194 default y
170 depends on USB_USBNET 195 depends on USB_USBNET
171 help 196 help
172 Choose this option if you're using a host-to-host cable based 197 Choose this option if you're using a host-to-host cable based
173 on this design: one NetChip 1080 chips and supporting logic, 198 on this design: one NetChip 1080 chip and supporting logic,
174 supporting LEDs that indicate traffic 199 optionally with LEDs that indicate traffic
175 200
176config USB_PL2301 201config USB_NET_PLUSB
177 boolean "Prolific PL-2301/2302 based cables" 202 tristate "Prolific PL-2301/2302 based cables"
178 default y 203 # if the handshake/init/reset problems, from original 'plusb',
179 # handshake/init/reset problems, from original 'plusb' driver 204 # are ever resolved ... then remove "experimental"
180 depends on USB_USBNET && EXPERIMENTAL 205 depends on USB_USBNET && EXPERIMENTAL
181 help 206 help
182 Choose this option if you're using a host-to-host cable 207 Choose this option if you're using a host-to-host cable
183 with one of these chips. 208 with one of these chips.
184 209
185config USB_KC2190 210config USB_NET_RNDIS_HOST
186 boolean "KT Technology KC2190 based cables (InstaNet)" 211 tristate "Host for RNDIS devices (EXPERIMENTAL)"
187 default y
188 depends on USB_USBNET && EXPERIMENTAL 212 depends on USB_USBNET && EXPERIMENTAL
213 select USB_NET_CDCETHER
189 help 214 help
190 Choose this option if you're using a host-to-host cable 215 This option enables hosting "Remote NDIS" USB networking links,
191 with one of these chips. 216 as encouraged by Microsoft (instead of CDC Ethernet!) for use in
217 various devices that may only support this protocol.
192 218
193comment "Intelligent USB Devices/Gadgets" 219 Avoid using this protocol unless you have no better options.
220 The protocol specification is incomplete, and is controlled by
221 (and for) Microsoft; it isn't an "Open" ecosystem or market.
222
223config USB_NET_CDC_SUBSET
224 tristate "Simple USB Network Links (CDC Ethernet subset)"
194 depends on USB_USBNET 225 depends on USB_USBNET
226 help
227 This driver module supports USB network devices that can work
228 without any device-specific information. Select it if you have
229 one of these drivers.
230
231 Note that while many USB host-to-host cables can work in this mode,
232 that may mean not being able to talk to Win32 systems or more
233 commonly not being able to handle certain events (like replugging
234 the host on the other end) very well. Also, these devices will
235 not generally have permanently assigned Ethernet addresses.
236
237config USB_ALI_M5632
238 boolean "ALi M5632 based 'USB 2.0 Data Link' cables"
239 depends on USB_NET_CDC_SUBSET
240 help
241 Choose this option if you're using a host-to-host cable
242 based on this design, which supports USB 2.0 high speed.
243
244config USB_AN2720
245 boolean "AnchorChips 2720 based cables (Xircom PGUNET, ...)"
246 depends on USB_NET_CDC_SUBSET
247 help
248 Choose this option if you're using a host-to-host cable
249 based on this design. Note that AnchorChips is now a
250 Cypress brand.
251
252config USB_BELKIN
253 boolean "eTEK based host-to-host cables (Advance, Belkin, ...)"
254 depends on USB_NET_CDC_SUBSET
255 default y
256 help
257 Choose this option if you're using a host-to-host cable
258 based on this design: two NetChip 2890 chips and an Atmel
259 microcontroller, with LEDs that indicate traffic.
195 260
196config USB_ARMLINUX 261config USB_ARMLINUX
197 boolean "Embedded ARM Linux links (iPaq, ...)" 262 boolean "Embedded ARM Linux links (iPaq, ...)"
198 depends on USB_USBNET 263 depends on USB_NET_CDC_SUBSET
199 default y 264 default y
200 help 265 help
201 Choose this option to support the "usb-eth" networking driver 266 Choose this option to support the "usb-eth" networking driver
@@ -212,15 +277,15 @@ config USB_ARMLINUX
212 277
213config USB_EPSON2888 278config USB_EPSON2888
214 boolean "Epson 2888 based firmware (DEVELOPMENT)" 279 boolean "Epson 2888 based firmware (DEVELOPMENT)"
215 depends on USB_USBNET 280 depends on USB_NET_CDC_SUBSET
216 default y
217 help 281 help
218 Choose this option to support the usb networking links used 282 Choose this option to support the usb networking links used
219 by some sample firmware from Epson. 283 by some sample firmware from Epson.
220 284
221config USB_ZAURUS 285config USB_NET_ZAURUS
222 boolean "Sharp Zaurus (stock ROMs) and compatible" 286 tristate "Sharp Zaurus (stock ROMs) and compatible"
223 depends on USB_USBNET 287 depends on USB_USBNET
288 select USB_NET_CDCETHER
224 select CRC32 289 select CRC32
225 default y 290 default y
226 help 291 help
@@ -235,61 +300,6 @@ config USB_ZAURUS
235 really need this non-conformant variant of CDC Ethernet (or in 300 really need this non-conformant variant of CDC Ethernet (or in
236 some cases CDC MDLM) protocol, not "g_ether". 301 some cases CDC MDLM) protocol, not "g_ether".
237 302
238config USB_CDCETHER
239 boolean "CDC Ethernet support (smart devices such as cable modems)"
240 depends on USB_USBNET
241 default y
242 help
243 This option supports devices conforming to the Communication Device
244 Class (CDC) Ethernet Control Model, a specification that's easy to
245 implement in device firmware. The CDC specifications are available
246 from <http://www.usb.org/>.
247
248 CDC Ethernet is an implementation option for DOCSIS cable modems
249 that support USB connectivity, used for non-Microsoft USB hosts.
250 This driver should work with at least the following devices:
251
252 * Ericsson PipeRider (all variants)
253 * Motorola (DM100 and SB4100)
254 * Broadcom Cable Modem (reference design)
255 * Toshiba PCX1100U
256 * ...
257
258 This driver creates an interface named "ethX", where X depends on
259 what other networking devices you have in use. However, if the
260 IEEE 802 "local assignment" bit is set in the address, a "usbX"
261 name is used instead.
262
263comment "USB Network Adapters"
264 depends on USB_USBNET
265
266config USB_AX8817X
267 boolean "ASIX AX88xxx Based USB 2.0 Ethernet Devices"
268 depends on USB_USBNET && NET_ETHERNET
269 select CRC32
270 select MII
271 default y
272 help
273 This option adds support for ASIX AX88xxx based USB 2.0
274 10/100 Ethernet devices.
275
276 This driver should work with at least the following devices:
277 * Aten UC210T
278 * ASIX AX88172
279 * Billionton Systems, USB2AR
280 * Buffalo LUA-U2-KTX
281 * Corega FEther USB2-TX
282 * D-Link DUB-E100
283 * Hawking UF200
284 * Linksys USB200M
285 * Netgear FA120
286 * Sitecom LN-029
287 * Intellinet USB 2.0 Ethernet
288 * ST Lab USB 2.0 Ethernet
289 * TrendNet TU2-ET100
290
291 This driver creates an interface named "ethX", where X depends on
292 what other networking devices you have in use.
293 303
294config USB_ZD1201 304config USB_ZD1201
295 tristate "USB ZD1201 based Wireless device support" 305 tristate "USB ZD1201 based Wireless device support"
diff --git a/drivers/usb/net/Makefile b/drivers/usb/net/Makefile
index fe3fd4115e1e..222c0495f791 100644
--- a/drivers/usb/net/Makefile
+++ b/drivers/usb/net/Makefile
@@ -6,5 +6,13 @@ obj-$(CONFIG_USB_CATC) += catc.o
6obj-$(CONFIG_USB_KAWETH) += kaweth.o 6obj-$(CONFIG_USB_KAWETH) += kaweth.o
7obj-$(CONFIG_USB_PEGASUS) += pegasus.o 7obj-$(CONFIG_USB_PEGASUS) += pegasus.o
8obj-$(CONFIG_USB_RTL8150) += rtl8150.o 8obj-$(CONFIG_USB_RTL8150) += rtl8150.o
9obj-$(CONFIG_USB_NET_AX8817X) += asix.o
10obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
11obj-$(CONFIG_USB_NET_GL620A) += gl620a.o
12obj-$(CONFIG_USB_NET_NET1080) += net1080.o
13obj-$(CONFIG_USB_NET_PLUSB) += plusb.o
14obj-$(CONFIG_USB_NET_RNDIS_HOST) += rndis_host.o
15obj-$(CONFIG_USB_NET_CDC_SUBSET) += cdc_subset.o
16obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o
9obj-$(CONFIG_USB_USBNET) += usbnet.o 17obj-$(CONFIG_USB_USBNET) += usbnet.o
10obj-$(CONFIG_USB_ZD1201) += zd1201.o 18obj-$(CONFIG_USB_ZD1201) += zd1201.o
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c
new file mode 100644
index 000000000000..861f00a43750
--- /dev/null
+++ b/drivers/usb/net/asix.c
@@ -0,0 +1,948 @@
1/*
2 * ASIX AX8817X based USB 2.0 Ethernet Devices
3 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
4 * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
5 * Copyright (c) 2002-2003 TiVo Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22// #define DEBUG // error path messages, extra info
23// #define VERBOSE // more; success messages
24
25#include <linux/config.h>
26#ifdef CONFIG_USB_DEBUG
27# define DEBUG
28#endif
29#include <linux/module.h>
30#include <linux/kmod.h>
31#include <linux/sched.h>
32#include <linux/init.h>
33#include <linux/netdevice.h>
34#include <linux/etherdevice.h>
35#include <linux/ethtool.h>
36#include <linux/workqueue.h>
37#include <linux/mii.h>
38#include <linux/usb.h>
39#include <linux/crc32.h>
40
41#include "usbnet.h"
42
43
44/* ASIX AX8817X based USB 2.0 Ethernet Devices */
45
46#define AX_CMD_SET_SW_MII 0x06
47#define AX_CMD_READ_MII_REG 0x07
48#define AX_CMD_WRITE_MII_REG 0x08
49#define AX_CMD_SET_HW_MII 0x0a
50#define AX_CMD_READ_EEPROM 0x0b
51#define AX_CMD_WRITE_EEPROM 0x0c
52#define AX_CMD_WRITE_ENABLE 0x0d
53#define AX_CMD_WRITE_DISABLE 0x0e
54#define AX_CMD_WRITE_RX_CTL 0x10
55#define AX_CMD_READ_IPG012 0x11
56#define AX_CMD_WRITE_IPG0 0x12
57#define AX_CMD_WRITE_IPG1 0x13
58#define AX_CMD_WRITE_IPG2 0x14
59#define AX_CMD_WRITE_MULTI_FILTER 0x16
60#define AX_CMD_READ_NODE_ID 0x17
61#define AX_CMD_READ_PHY_ID 0x19
62#define AX_CMD_READ_MEDIUM_STATUS 0x1a
63#define AX_CMD_WRITE_MEDIUM_MODE 0x1b
64#define AX_CMD_READ_MONITOR_MODE 0x1c
65#define AX_CMD_WRITE_MONITOR_MODE 0x1d
66#define AX_CMD_WRITE_GPIOS 0x1f
67#define AX_CMD_SW_RESET 0x20
68#define AX_CMD_SW_PHY_STATUS 0x21
69#define AX_CMD_SW_PHY_SELECT 0x22
70#define AX88772_CMD_READ_NODE_ID 0x13
71
72#define AX_MONITOR_MODE 0x01
73#define AX_MONITOR_LINK 0x02
74#define AX_MONITOR_MAGIC 0x04
75#define AX_MONITOR_HSFS 0x10
76
77/* AX88172 Medium Status Register values */
78#define AX_MEDIUM_FULL_DUPLEX 0x02
79#define AX_MEDIUM_TX_ABORT_ALLOW 0x04
80#define AX_MEDIUM_FLOW_CONTROL_EN 0x10
81
82#define AX_MCAST_FILTER_SIZE 8
83#define AX_MAX_MCAST 64
84
85#define AX_EEPROM_LEN 0x40
86
87#define AX_SWRESET_CLEAR 0x00
88#define AX_SWRESET_RR 0x01
89#define AX_SWRESET_RT 0x02
90#define AX_SWRESET_PRTE 0x04
91#define AX_SWRESET_PRL 0x08
92#define AX_SWRESET_BZ 0x10
93#define AX_SWRESET_IPRL 0x20
94#define AX_SWRESET_IPPD 0x40
95
96#define AX88772_IPG0_DEFAULT 0x15
97#define AX88772_IPG1_DEFAULT 0x0c
98#define AX88772_IPG2_DEFAULT 0x12
99
100#define AX88772_MEDIUM_FULL_DUPLEX 0x0002
101#define AX88772_MEDIUM_RESERVED 0x0004
102#define AX88772_MEDIUM_RX_FC_ENABLE 0x0010
103#define AX88772_MEDIUM_TX_FC_ENABLE 0x0020
104#define AX88772_MEDIUM_PAUSE_FORMAT 0x0080
105#define AX88772_MEDIUM_RX_ENABLE 0x0100
106#define AX88772_MEDIUM_100MB 0x0200
107#define AX88772_MEDIUM_DEFAULT \
108 (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \
109 AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \
110 AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE )
111
112#define AX_EEPROM_MAGIC 0xdeadbeef
113
114/* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */
115struct ax8817x_data {
116 u8 multi_filter[AX_MCAST_FILTER_SIZE];
117};
118
119struct ax88172_int_data {
120 u16 res1;
121 u8 link;
122 u16 res2;
123 u8 status;
124 u16 res3;
125} __attribute__ ((packed));
126
127static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
128 u16 size, void *data)
129{
130 return usb_control_msg(
131 dev->udev,
132 usb_rcvctrlpipe(dev->udev, 0),
133 cmd,
134 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
135 value,
136 index,
137 data,
138 size,
139 USB_CTRL_GET_TIMEOUT);
140}
141
142static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
143 u16 size, void *data)
144{
145 return usb_control_msg(
146 dev->udev,
147 usb_sndctrlpipe(dev->udev, 0),
148 cmd,
149 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
150 value,
151 index,
152 data,
153 size,
154 USB_CTRL_SET_TIMEOUT);
155}
156
157static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
158{
159 struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
160
161 if (urb->status < 0)
162 printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d",
163 urb->status);
164
165 kfree(req);
166 usb_free_urb(urb);
167}
168
169static void ax8817x_status(struct usbnet *dev, struct urb *urb)
170{
171 struct ax88172_int_data *event;
172 int link;
173
174 if (urb->actual_length < 8)
175 return;
176
177 event = urb->transfer_buffer;
178 link = event->link & 0x01;
179 if (netif_carrier_ok(dev->net) != link) {
180 if (link) {
181 netif_carrier_on(dev->net);
182 usbnet_defer_kevent (dev, EVENT_LINK_RESET );
183 } else
184 netif_carrier_off(dev->net);
185 devdbg(dev, "ax8817x - Link Status is: %d", link);
186 }
187}
188
189static void
190ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
191 u16 size, void *data)
192{
193 struct usb_ctrlrequest *req;
194 int status;
195 struct urb *urb;
196
197 if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) {
198 devdbg(dev, "Error allocating URB in write_cmd_async!");
199 return;
200 }
201
202 if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) {
203 deverr(dev, "Failed to allocate memory for control request");
204 usb_free_urb(urb);
205 return;
206 }
207
208 req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
209 req->bRequest = cmd;
210 req->wValue = cpu_to_le16(value);
211 req->wIndex = cpu_to_le16(index);
212 req->wLength = cpu_to_le16(size);
213
214 usb_fill_control_urb(urb, dev->udev,
215 usb_sndctrlpipe(dev->udev, 0),
216 (void *)req, data, size,
217 ax8817x_async_cmd_callback, req);
218
219 if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
220 deverr(dev, "Error submitting the control message: status=%d",
221 status);
222 kfree(req);
223 usb_free_urb(urb);
224 }
225}
226
227static void ax8817x_set_multicast(struct net_device *net)
228{
229 struct usbnet *dev = netdev_priv(net);
230 struct ax8817x_data *data = (struct ax8817x_data *)&dev->data;
231 u8 rx_ctl = 0x8c;
232
233 if (net->flags & IFF_PROMISC) {
234 rx_ctl |= 0x01;
235 } else if (net->flags & IFF_ALLMULTI
236 || net->mc_count > AX_MAX_MCAST) {
237 rx_ctl |= 0x02;
238 } else if (net->mc_count == 0) {
239 /* just broadcast and directed */
240 } else {
241 /* We use the 20 byte dev->data
242 * for our 8 byte filter buffer
243 * to avoid allocating memory that
244 * is tricky to free later */
245 struct dev_mc_list *mc_list = net->mc_list;
246 u32 crc_bits;
247 int i;
248
249 memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE);
250
251 /* Build the multicast hash filter. */
252 for (i = 0; i < net->mc_count; i++) {
253 crc_bits =
254 ether_crc(ETH_ALEN,
255 mc_list->dmi_addr) >> 26;
256 data->multi_filter[crc_bits >> 3] |=
257 1 << (crc_bits & 7);
258 mc_list = mc_list->next;
259 }
260
261 ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0,
262 AX_MCAST_FILTER_SIZE, data->multi_filter);
263
264 rx_ctl |= 0x10;
265 }
266
267 ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);
268}
269
270static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc)
271{
272 struct usbnet *dev = netdev_priv(netdev);
273 u16 res;
274 u8 buf[1];
275
276 ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf);
277 ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id,
278 (__u16)loc, 2, (u16 *)&res);
279 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf);
280
281 return res & 0xffff;
282}
283
284/* same as above, but converts resulting value to cpu byte order */
285static int ax8817x_mdio_read_le(struct net_device *netdev, int phy_id, int loc)
286{
287 return le16_to_cpu(ax8817x_mdio_read(netdev,phy_id, loc));
288}
289
290static void
291ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
292{
293 struct usbnet *dev = netdev_priv(netdev);
294 u16 res = val;
295 u8 buf[1];
296
297 ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf);
298 ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id,
299 (__u16)loc, 2, (u16 *)&res);
300 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf);
301}
302
303/* same as above, but converts new value to le16 byte order before writing */
304static void
305ax8817x_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val)
306{
307 ax8817x_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) );
308}
309
310static int ax88172_link_reset(struct usbnet *dev)
311{
312 u16 lpa;
313 u16 adv;
314 u16 res;
315 u8 mode;
316
317 mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN;
318 lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA);
319 adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE);
320 res = mii_nway_result(lpa|adv);
321 if (res & LPA_DUPLEX)
322 mode |= AX_MEDIUM_FULL_DUPLEX;
323 ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
324
325 return 0;
326}
327
328static void
329ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
330{
331 struct usbnet *dev = netdev_priv(net);
332 u8 opt;
333
334 if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) {
335 wolinfo->supported = 0;
336 wolinfo->wolopts = 0;
337 return;
338 }
339 wolinfo->supported = WAKE_PHY | WAKE_MAGIC;
340 wolinfo->wolopts = 0;
341 if (opt & AX_MONITOR_MODE) {
342 if (opt & AX_MONITOR_LINK)
343 wolinfo->wolopts |= WAKE_PHY;
344 if (opt & AX_MONITOR_MAGIC)
345 wolinfo->wolopts |= WAKE_MAGIC;
346 }
347}
348
349static int
350ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
351{
352 struct usbnet *dev = netdev_priv(net);
353 u8 opt = 0;
354 u8 buf[1];
355
356 if (wolinfo->wolopts & WAKE_PHY)
357 opt |= AX_MONITOR_LINK;
358 if (wolinfo->wolopts & WAKE_MAGIC)
359 opt |= AX_MONITOR_MAGIC;
360 if (opt != 0)
361 opt |= AX_MONITOR_MODE;
362
363 if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE,
364 opt, 0, 0, &buf) < 0)
365 return -EINVAL;
366
367 return 0;
368}
369
370static int ax8817x_get_eeprom_len(struct net_device *net)
371{
372 return AX_EEPROM_LEN;
373}
374
375static int ax8817x_get_eeprom(struct net_device *net,
376 struct ethtool_eeprom *eeprom, u8 *data)
377{
378 struct usbnet *dev = netdev_priv(net);
379 u16 *ebuf = (u16 *)data;
380 int i;
381
382 /* Crude hack to ensure that we don't overwrite memory
383 * if an odd length is supplied
384 */
385 if (eeprom->len % 2)
386 return -EINVAL;
387
388 eeprom->magic = AX_EEPROM_MAGIC;
389
390 /* ax8817x returns 2 bytes from eeprom on read */
391 for (i=0; i < eeprom->len / 2; i++) {
392 if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM,
393 eeprom->offset + i, 0, 2, &ebuf[i]) < 0)
394 return -EINVAL;
395 }
396 return 0;
397}
398
399static void ax8817x_get_drvinfo (struct net_device *net,
400 struct ethtool_drvinfo *info)
401{
402 /* Inherit standard device info */
403 usbnet_get_drvinfo(net, info);
404 info->eedump_len = 0x3e;
405}
406
407static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd)
408{
409 struct usbnet *dev = netdev_priv(net);
410
411 return mii_ethtool_gset(&dev->mii,cmd);
412}
413
414static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd)
415{
416 struct usbnet *dev = netdev_priv(net);
417
418 return mii_ethtool_sset(&dev->mii,cmd);
419}
420
421/* We need to override some ethtool_ops so we require our
422 own structure so we don't interfere with other usbnet
423 devices that may be connected at the same time. */
424static struct ethtool_ops ax8817x_ethtool_ops = {
425 .get_drvinfo = ax8817x_get_drvinfo,
426 .get_link = ethtool_op_get_link,
427 .get_msglevel = usbnet_get_msglevel,
428 .set_msglevel = usbnet_set_msglevel,
429 .get_wol = ax8817x_get_wol,
430 .set_wol = ax8817x_set_wol,
431 .get_eeprom_len = ax8817x_get_eeprom_len,
432 .get_eeprom = ax8817x_get_eeprom,
433 .get_settings = ax8817x_get_settings,
434 .set_settings = ax8817x_set_settings,
435};
436
437static int ax8817x_ioctl (struct net_device *net, struct ifreq *rq, int cmd)
438{
439 struct usbnet *dev = netdev_priv(net);
440
441 return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
442}
443
444static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
445{
446 int ret = 0;
447 void *buf;
448 int i;
449 unsigned long gpio_bits = dev->driver_info->data;
450
451 usbnet_get_endpoints(dev,intf);
452
453 buf = kmalloc(ETH_ALEN, GFP_KERNEL);
454 if(!buf) {
455 ret = -ENOMEM;
456 goto out1;
457 }
458
459 /* Toggle the GPIOs in a manufacturer/model specific way */
460 for (i = 2; i >= 0; i--) {
461 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
462 (gpio_bits >> (i * 8)) & 0xff, 0, 0,
463 buf)) < 0)
464 goto out2;
465 msleep(5);
466 }
467
468 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL,
469 0x80, 0, 0, buf)) < 0) {
470 dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret);
471 goto out2;
472 }
473
474 /* Get the MAC address */
475 memset(buf, 0, ETH_ALEN);
476 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID,
477 0, 0, 6, buf)) < 0) {
478 dbg("read AX_CMD_READ_NODE_ID failed: %d", ret);
479 goto out2;
480 }
481 memcpy(dev->net->dev_addr, buf, ETH_ALEN);
482
483 /* Get the PHY id */
484 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID,
485 0, 0, 2, buf)) < 0) {
486 dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret);
487 goto out2;
488 } else if (ret < 2) {
489 /* this should always return 2 bytes */
490 dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x",
491 ret);
492 ret = -EIO;
493 goto out2;
494 }
495
496 /* Initialize MII structure */
497 dev->mii.dev = dev->net;
498 dev->mii.mdio_read = ax8817x_mdio_read;
499 dev->mii.mdio_write = ax8817x_mdio_write;
500 dev->mii.phy_id_mask = 0x3f;
501 dev->mii.reg_num_mask = 0x1f;
502 dev->mii.phy_id = *((u8 *)buf + 1);
503 dev->net->do_ioctl = ax8817x_ioctl;
504
505 dev->net->set_multicast_list = ax8817x_set_multicast;
506 dev->net->ethtool_ops = &ax8817x_ethtool_ops;
507
508 ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
509 ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE,
510 ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
511 mii_nway_restart(&dev->mii);
512
513 return 0;
514out2:
515 kfree(buf);
516out1:
517 return ret;
518}
519
520static struct ethtool_ops ax88772_ethtool_ops = {
521 .get_drvinfo = ax8817x_get_drvinfo,
522 .get_link = ethtool_op_get_link,
523 .get_msglevel = usbnet_get_msglevel,
524 .set_msglevel = usbnet_set_msglevel,
525 .get_wol = ax8817x_get_wol,
526 .set_wol = ax8817x_set_wol,
527 .get_eeprom_len = ax8817x_get_eeprom_len,
528 .get_eeprom = ax8817x_get_eeprom,
529 .get_settings = ax8817x_get_settings,
530 .set_settings = ax8817x_set_settings,
531};
532
533static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
534{
535 int ret;
536 void *buf;
537
538 usbnet_get_endpoints(dev,intf);
539
540 buf = kmalloc(6, GFP_KERNEL);
541 if(!buf) {
542 dbg ("Cannot allocate memory for buffer");
543 ret = -ENOMEM;
544 goto out1;
545 }
546
547 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
548 0x00B0, 0, 0, buf)) < 0)
549 goto out2;
550
551 msleep(5);
552 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
553 0x0001, 0, 0, buf)) < 0) {
554 dbg("Select PHY #1 failed: %d", ret);
555 goto out2;
556 }
557
558 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD,
559 0, 0, buf)) < 0) {
560 dbg("Failed to power down internal PHY: %d", ret);
561 goto out2;
562 }
563
564 msleep(150);
565 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR,
566 0, 0, buf)) < 0) {
567 dbg("Failed to perform software reset: %d", ret);
568 goto out2;
569 }
570
571 msleep(150);
572 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET,
573 AX_SWRESET_IPRL | AX_SWRESET_PRL,
574 0, 0, buf)) < 0) {
575 dbg("Failed to set Internal/External PHY reset control: %d",
576 ret);
577 goto out2;
578 }
579
580 msleep(150);
581 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL,
582 0x0000, 0, 0, buf)) < 0) {
583 dbg("Failed to reset RX_CTL: %d", ret);
584 goto out2;
585 }
586
587 /* Get the MAC address */
588 memset(buf, 0, ETH_ALEN);
589 if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID,
590 0, 0, ETH_ALEN, buf)) < 0) {
591 dbg("Failed to read MAC address: %d", ret);
592 goto out2;
593 }
594 memcpy(dev->net->dev_addr, buf, ETH_ALEN);
595
596 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII,
597 0, 0, 0, buf)) < 0) {
598 dbg("Enabling software MII failed: %d", ret);
599 goto out2;
600 }
601
602 if (((ret = ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG,
603 0x0010, 2, 2, buf)) < 0)
604 || (*((u16 *)buf) != 0x003b)) {
605 dbg("Read PHY register 2 must be 0x3b00: %d", ret);
606 goto out2;
607 }
608
609 /* Initialize MII structure */
610 dev->mii.dev = dev->net;
611 dev->mii.mdio_read = ax8817x_mdio_read;
612 dev->mii.mdio_write = ax8817x_mdio_write;
613 dev->mii.phy_id_mask = 0xff;
614 dev->mii.reg_num_mask = 0xff;
615 dev->net->do_ioctl = ax8817x_ioctl;
616
617 /* Get the PHY id */
618 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID,
619 0, 0, 2, buf)) < 0) {
620 dbg("Error reading PHY ID: %02x", ret);
621 goto out2;
622 } else if (ret < 2) {
623 /* this should always return 2 bytes */
624 dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x",
625 ret);
626 ret = -EIO;
627 goto out2;
628 }
629 dev->mii.phy_id = *((u8 *)buf + 1);
630
631 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL,
632 0, 0, buf)) < 0) {
633 dbg("Set external PHY reset pin level: %d", ret);
634 goto out2;
635 }
636 msleep(150);
637 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET,
638 AX_SWRESET_IPRL | AX_SWRESET_PRL,
639 0, 0, buf)) < 0) {
640 dbg("Set Internal/External PHY reset control: %d", ret);
641 goto out2;
642 }
643 msleep(150);
644
645
646 dev->net->set_multicast_list = ax8817x_set_multicast;
647 dev->net->ethtool_ops = &ax88772_ethtool_ops;
648
649 ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
650 ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE,
651 ADVERTISE_ALL | ADVERTISE_CSMA);
652 mii_nway_restart(&dev->mii);
653
654 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE,
655 AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) {
656 dbg("Write medium mode register: %d", ret);
657 goto out2;
658 }
659
660 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0,
661 AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,
662 AX88772_IPG2_DEFAULT, 0, buf)) < 0) {
663 dbg("Write IPG,IPG1,IPG2 failed: %d", ret);
664 goto out2;
665 }
666 if ((ret =
667 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) {
668 dbg("Failed to set hardware MII: %02x", ret);
669 goto out2;
670 }
671
672 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
673 if ((ret =
674 ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0,
675 buf)) < 0) {
676 dbg("Reset RX_CTL failed: %d", ret);
677 goto out2;
678 }
679
680 kfree(buf);
681
682 /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */
683 if (dev->driver_info->flags & FLAG_FRAMING_AX) {
684 /* hard_mtu is still the default - the device does not support
685 jumbo eth frames */
686 dev->rx_urb_size = 2048;
687 }
688
689 return 0;
690
691out2:
692 kfree(buf);
693out1:
694 return ret;
695}
696
697static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
698{
699 u8 *head;
700 u32 header;
701 char *packet;
702 struct sk_buff *ax_skb;
703 u16 size;
704
705 head = (u8 *) skb->data;
706 memcpy(&header, head, sizeof(header));
707 le32_to_cpus(&header);
708 packet = head + sizeof(header);
709
710 skb_pull(skb, 4);
711
712 while (skb->len > 0) {
713 if ((short)(header & 0x0000ffff) !=
714 ~((short)((header & 0xffff0000) >> 16))) {
715 devdbg(dev,"header length data is error");
716 }
717 /* get the packet length */
718 size = (u16) (header & 0x0000ffff);
719
720 if ((skb->len) - ((size + 1) & 0xfffe) == 0)
721 return 2;
722 if (size > ETH_FRAME_LEN) {
723 devdbg(dev,"invalid rx length %d", size);
724 return 0;
725 }
726 ax_skb = skb_clone(skb, GFP_ATOMIC);
727 if (ax_skb) {
728 ax_skb->len = size;
729 ax_skb->data = packet;
730 ax_skb->tail = packet + size;
731 usbnet_skb_return(dev, ax_skb);
732 } else {
733 return 0;
734 }
735
736 skb_pull(skb, (size + 1) & 0xfffe);
737
738 if (skb->len == 0)
739 break;
740
741 head = (u8 *) skb->data;
742 memcpy(&header, head, sizeof(header));
743 le32_to_cpus(&header);
744 packet = head + sizeof(header);
745 skb_pull(skb, 4);
746 }
747
748 if (skb->len < 0) {
749 devdbg(dev,"invalid rx length %d", skb->len);
750 return 0;
751 }
752 return 1;
753}
754
755static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
756 unsigned flags)
757{
758 int padlen;
759 int headroom = skb_headroom(skb);
760 int tailroom = skb_tailroom(skb);
761 u32 packet_len;
762 u32 padbytes = 0xffff0000;
763
764 padlen = ((skb->len + 4) % 512) ? 0 : 4;
765
766 if ((!skb_cloned(skb))
767 && ((headroom + tailroom) >= (4 + padlen))) {
768 if ((headroom < 4) || (tailroom < padlen)) {
769 skb->data = memmove(skb->head + 4, skb->data, skb->len);
770 skb->tail = skb->data + skb->len;
771 }
772 } else {
773 struct sk_buff *skb2;
774 skb2 = skb_copy_expand(skb, 4, padlen, flags);
775 dev_kfree_skb_any(skb);
776 skb = skb2;
777 if (!skb)
778 return NULL;
779 }
780
781 skb_push(skb, 4);
782 packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4);
783 memcpy(skb->data, &packet_len, sizeof(packet_len));
784
785 if ((skb->len % 512) == 0) {
786 memcpy( skb->tail, &padbytes, sizeof(padbytes));
787 skb_put(skb, sizeof(padbytes));
788 }
789 return skb;
790}
791
792static int ax88772_link_reset(struct usbnet *dev)
793{
794 u16 lpa;
795 u16 adv;
796 u16 res;
797 u16 mode;
798
799 mode = AX88772_MEDIUM_DEFAULT;
800 lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA);
801 adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE);
802 res = mii_nway_result(lpa|adv);
803
804 if ((res & LPA_DUPLEX) == 0)
805 mode &= ~AX88772_MEDIUM_FULL_DUPLEX;
806 if ((res & LPA_100) == 0)
807 mode &= ~AX88772_MEDIUM_100MB;
808 ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
809
810 return 0;
811}
812
813static const struct driver_info ax8817x_info = {
814 .description = "ASIX AX8817x USB 2.0 Ethernet",
815 .bind = ax8817x_bind,
816 .status = ax8817x_status,
817 .link_reset = ax88172_link_reset,
818 .reset = ax88172_link_reset,
819 .flags = FLAG_ETHER,
820 .data = 0x00130103,
821};
822
823static const struct driver_info dlink_dub_e100_info = {
824 .description = "DLink DUB-E100 USB Ethernet",
825 .bind = ax8817x_bind,
826 .status = ax8817x_status,
827 .link_reset = ax88172_link_reset,
828 .reset = ax88172_link_reset,
829 .flags = FLAG_ETHER,
830 .data = 0x009f9d9f,
831};
832
833static const struct driver_info netgear_fa120_info = {
834 .description = "Netgear FA-120 USB Ethernet",
835 .bind = ax8817x_bind,
836 .status = ax8817x_status,
837 .link_reset = ax88172_link_reset,
838 .reset = ax88172_link_reset,
839 .flags = FLAG_ETHER,
840 .data = 0x00130103,
841};
842
843static const struct driver_info hawking_uf200_info = {
844 .description = "Hawking UF200 USB Ethernet",
845 .bind = ax8817x_bind,
846 .status = ax8817x_status,
847 .link_reset = ax88172_link_reset,
848 .reset = ax88172_link_reset,
849 .flags = FLAG_ETHER,
850 .data = 0x001f1d1f,
851};
852
853static const struct driver_info ax88772_info = {
854 .description = "ASIX AX88772 USB 2.0 Ethernet",
855 .bind = ax88772_bind,
856 .status = ax8817x_status,
857 .link_reset = ax88772_link_reset,
858 .reset = ax88772_link_reset,
859 .flags = FLAG_ETHER | FLAG_FRAMING_AX,
860 .rx_fixup = ax88772_rx_fixup,
861 .tx_fixup = ax88772_tx_fixup,
862 .data = 0x00130103,
863};
864
865static const struct usb_device_id products [] = {
866{
867 // Linksys USB200M
868 USB_DEVICE (0x077b, 0x2226),
869 .driver_info = (unsigned long) &ax8817x_info,
870}, {
871 // Netgear FA120
872 USB_DEVICE (0x0846, 0x1040),
873 .driver_info = (unsigned long) &netgear_fa120_info,
874}, {
875 // DLink DUB-E100
876 USB_DEVICE (0x2001, 0x1a00),
877 .driver_info = (unsigned long) &dlink_dub_e100_info,
878}, {
879 // Intellinet, ST Lab USB Ethernet
880 USB_DEVICE (0x0b95, 0x1720),
881 .driver_info = (unsigned long) &ax8817x_info,
882}, {
883 // Hawking UF200, TrendNet TU2-ET100
884 USB_DEVICE (0x07b8, 0x420a),
885 .driver_info = (unsigned long) &hawking_uf200_info,
886}, {
887 // Billionton Systems, USB2AR
888 USB_DEVICE (0x08dd, 0x90ff),
889 .driver_info = (unsigned long) &ax8817x_info,
890}, {
891 // ATEN UC210T
892 USB_DEVICE (0x0557, 0x2009),
893 .driver_info = (unsigned long) &ax8817x_info,
894}, {
895 // Buffalo LUA-U2-KTX
896 USB_DEVICE (0x0411, 0x003d),
897 .driver_info = (unsigned long) &ax8817x_info,
898}, {
899 // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter"
900 USB_DEVICE (0x6189, 0x182d),
901 .driver_info = (unsigned long) &ax8817x_info,
902}, {
903 // corega FEther USB2-TX
904 USB_DEVICE (0x07aa, 0x0017),
905 .driver_info = (unsigned long) &ax8817x_info,
906}, {
907 // Surecom EP-1427X-2
908 USB_DEVICE (0x1189, 0x0893),
909 .driver_info = (unsigned long) &ax8817x_info,
910}, {
911 // goodway corp usb gwusb2e
912 USB_DEVICE (0x1631, 0x6200),
913 .driver_info = (unsigned long) &ax8817x_info,
914}, {
915 // ASIX AX88772 10/100
916 USB_DEVICE (0x0b95, 0x7720),
917 .driver_info = (unsigned long) &ax88772_info,
918},
919 { }, // END
920};
921MODULE_DEVICE_TABLE(usb, products);
922
923static struct usb_driver asix_driver = {
924 .owner = THIS_MODULE,
925 .name = "asix",
926 .id_table = products,
927 .probe = usbnet_probe,
928 .suspend = usbnet_suspend,
929 .resume = usbnet_resume,
930 .disconnect = usbnet_disconnect,
931};
932
933static int __init asix_init(void)
934{
935 return usb_register(&asix_driver);
936}
937module_init(asix_init);
938
939static void __exit asix_exit(void)
940{
941 usb_deregister(&asix_driver);
942}
943module_exit(asix_exit);
944
945MODULE_AUTHOR("David Hollis");
946MODULE_DESCRIPTION("ASIX AX8817X based USB 2.0 Ethernet Devices");
947MODULE_LICENSE("GPL");
948
diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c
index c8be912f24e1..37ef365a2472 100644
--- a/drivers/usb/net/catc.c
+++ b/drivers/usb/net/catc.c
@@ -383,7 +383,6 @@ static void catc_tx_done(struct urb *urb, struct pt_regs *regs)
383 383
384 if (urb->status == -ECONNRESET) { 384 if (urb->status == -ECONNRESET) {
385 dbg("Tx Reset."); 385 dbg("Tx Reset.");
386 urb->transfer_flags &= ~URB_ASYNC_UNLINK;
387 urb->status = 0; 386 urb->status = 0;
388 catc->netdev->trans_start = jiffies; 387 catc->netdev->trans_start = jiffies;
389 catc->stats.tx_errors++; 388 catc->stats.tx_errors++;
@@ -445,7 +444,6 @@ static void catc_tx_timeout(struct net_device *netdev)
445 struct catc *catc = netdev_priv(netdev); 444 struct catc *catc = netdev_priv(netdev);
446 445
447 warn("Transmit timed out."); 446 warn("Transmit timed out.");
448 catc->tx_urb->transfer_flags |= URB_ASYNC_UNLINK;
449 usb_unlink_urb(catc->tx_urb); 447 usb_unlink_urb(catc->tx_urb);
450} 448}
451 449
diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c
new file mode 100644
index 000000000000..652b04bbf6af
--- /dev/null
+++ b/drivers/usb/net/cdc_ether.c
@@ -0,0 +1,509 @@
1/*
2 * CDC Ethernet based networking peripherals
3 * Copyright (C) 2003-2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20// #define DEBUG // error path messages, extra info
21// #define VERBOSE // more; success messages
22
23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h>
28#include <linux/sched.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/ctype.h>
33#include <linux/ethtool.h>
34#include <linux/workqueue.h>
35#include <linux/mii.h>
36#include <linux/usb.h>
37#include <linux/usb_cdc.h>
38
39#include "usbnet.h"
40
41
42/*
43 * probes control interface, claims data interface, collects the bulk
44 * endpoints, activates data interface (if needed), maybe sets MTU.
45 * all pure cdc, except for certain firmware workarounds, and knowing
46 * that rndis uses one different rule.
47 */
48int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
49{
50 u8 *buf = intf->cur_altsetting->extra;
51 int len = intf->cur_altsetting->extralen;
52 struct usb_interface_descriptor *d;
53 struct cdc_state *info = (void *) &dev->data;
54 int status;
55 int rndis;
56 struct usb_driver *driver = driver_of(intf);
57
58 if (sizeof dev->data < sizeof *info)
59 return -EDOM;
60
61 /* expect strict spec conformance for the descriptors, but
62 * cope with firmware which stores them in the wrong place
63 */
64 if (len == 0 && dev->udev->actconfig->extralen) {
65 /* Motorola SB4100 (and others: Brad Hards says it's
66 * from a Broadcom design) put CDC descriptors here
67 */
68 buf = dev->udev->actconfig->extra;
69 len = dev->udev->actconfig->extralen;
70 if (len)
71 dev_dbg(&intf->dev,
72 "CDC descriptors on config\n");
73 }
74
75 /* this assumes that if there's a non-RNDIS vendor variant
76 * of cdc-acm, it'll fail RNDIS requests cleanly.
77 */
78 rndis = (intf->cur_altsetting->desc.bInterfaceProtocol == 0xff);
79
80 memset(info, 0, sizeof *info);
81 info->control = intf;
82 while (len > 3) {
83 if (buf [1] != USB_DT_CS_INTERFACE)
84 goto next_desc;
85
86 /* use bDescriptorSubType to identify the CDC descriptors.
87 * We expect devices with CDC header and union descriptors.
88 * For CDC Ethernet we need the ethernet descriptor.
89 * For RNDIS, ignore two (pointless) CDC modem descriptors
90 * in favor of a complicated OID-based RPC scheme doing what
91 * CDC Ethernet achieves with a simple descriptor.
92 */
93 switch (buf [2]) {
94 case USB_CDC_HEADER_TYPE:
95 if (info->header) {
96 dev_dbg(&intf->dev, "extra CDC header\n");
97 goto bad_desc;
98 }
99 info->header = (void *) buf;
100 if (info->header->bLength != sizeof *info->header) {
101 dev_dbg(&intf->dev, "CDC header len %u\n",
102 info->header->bLength);
103 goto bad_desc;
104 }
105 break;
106 case USB_CDC_UNION_TYPE:
107 if (info->u) {
108 dev_dbg(&intf->dev, "extra CDC union\n");
109 goto bad_desc;
110 }
111 info->u = (void *) buf;
112 if (info->u->bLength != sizeof *info->u) {
113 dev_dbg(&intf->dev, "CDC union len %u\n",
114 info->u->bLength);
115 goto bad_desc;
116 }
117
118 /* we need a master/control interface (what we're
119 * probed with) and a slave/data interface; union
120 * descriptors sort this all out.
121 */
122 info->control = usb_ifnum_to_if(dev->udev,
123 info->u->bMasterInterface0);
124 info->data = usb_ifnum_to_if(dev->udev,
125 info->u->bSlaveInterface0);
126 if (!info->control || !info->data) {
127 dev_dbg(&intf->dev,
128 "master #%u/%p slave #%u/%p\n",
129 info->u->bMasterInterface0,
130 info->control,
131 info->u->bSlaveInterface0,
132 info->data);
133 goto bad_desc;
134 }
135 if (info->control != intf) {
136 dev_dbg(&intf->dev, "bogus CDC Union\n");
137 /* Ambit USB Cable Modem (and maybe others)
138 * interchanges master and slave interface.
139 */
140 if (info->data == intf) {
141 info->data = info->control;
142 info->control = intf;
143 } else
144 goto bad_desc;
145 }
146
147 /* a data interface altsetting does the real i/o */
148 d = &info->data->cur_altsetting->desc;
149 if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
150 dev_dbg(&intf->dev, "slave class %u\n",
151 d->bInterfaceClass);
152 goto bad_desc;
153 }
154 break;
155 case USB_CDC_ETHERNET_TYPE:
156 if (info->ether) {
157 dev_dbg(&intf->dev, "extra CDC ether\n");
158 goto bad_desc;
159 }
160 info->ether = (void *) buf;
161 if (info->ether->bLength != sizeof *info->ether) {
162 dev_dbg(&intf->dev, "CDC ether len %u\n",
163 info->ether->bLength);
164 goto bad_desc;
165 }
166 dev->hard_mtu = le16_to_cpu(
167 info->ether->wMaxSegmentSize);
168 /* because of Zaurus, we may be ignoring the host
169 * side link address we were given.
170 */
171 break;
172 }
173next_desc:
174 len -= buf [0]; /* bLength */
175 buf += buf [0];
176 }
177
178 if (!info->header || !info->u || (!rndis && !info->ether)) {
179 dev_dbg(&intf->dev, "missing cdc %s%s%sdescriptor\n",
180 info->header ? "" : "header ",
181 info->u ? "" : "union ",
182 info->ether ? "" : "ether ");
183 goto bad_desc;
184 }
185
186 /* claim data interface and set it up ... with side effects.
187 * network traffic can't flow until an altsetting is enabled.
188 */
189 status = usb_driver_claim_interface(driver, info->data, dev);
190 if (status < 0)
191 return status;
192 status = usbnet_get_endpoints(dev, info->data);
193 if (status < 0) {
194 /* ensure immediate exit from usbnet_disconnect */
195 usb_set_intfdata(info->data, NULL);
196 usb_driver_release_interface(driver, info->data);
197 return status;
198 }
199
200 /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
201 dev->status = NULL;
202 if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
203 struct usb_endpoint_descriptor *desc;
204
205 dev->status = &info->control->cur_altsetting->endpoint [0];
206 desc = &dev->status->desc;
207 if (desc->bmAttributes != USB_ENDPOINT_XFER_INT
208 || !(desc->bEndpointAddress & USB_DIR_IN)
209 || (le16_to_cpu(desc->wMaxPacketSize)
210 < sizeof(struct usb_cdc_notification))
211 || !desc->bInterval) {
212 dev_dbg(&intf->dev, "bad notification endpoint\n");
213 dev->status = NULL;
214 }
215 }
216 if (rndis && !dev->status) {
217 dev_dbg(&intf->dev, "missing RNDIS status endpoint\n");
218 usb_set_intfdata(info->data, NULL);
219 usb_driver_release_interface(driver, info->data);
220 return -ENODEV;
221 }
222 return 0;
223
224bad_desc:
225 dev_info(&dev->udev->dev, "bad CDC descriptors\n");
226 return -ENODEV;
227}
228EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
229
230void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
231{
232 struct cdc_state *info = (void *) &dev->data;
233 struct usb_driver *driver = driver_of(intf);
234
235 /* disconnect master --> disconnect slave */
236 if (intf == info->control && info->data) {
237 /* ensure immediate exit from usbnet_disconnect */
238 usb_set_intfdata(info->data, NULL);
239 usb_driver_release_interface(driver, info->data);
240 info->data = NULL;
241 }
242
243 /* and vice versa (just in case) */
244 else if (intf == info->data && info->control) {
245 /* ensure immediate exit from usbnet_disconnect */
246 usb_set_intfdata(info->control, NULL);
247 usb_driver_release_interface(driver, info->control);
248 info->control = NULL;
249 }
250}
251EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
252
253
254/*-------------------------------------------------------------------------
255 *
256 * Communications Device Class, Ethernet Control model
257 *
258 * Takes two interfaces. The DATA interface is inactive till an altsetting
259 * is selected. Configuration data includes class descriptors. There's
260 * an optional status endpoint on the control interface.
261 *
262 * This should interop with whatever the 2.4 "CDCEther.c" driver
263 * (by Brad Hards) talked with, with more functionality.
264 *
265 *-------------------------------------------------------------------------*/
266
267static void dumpspeed(struct usbnet *dev, __le32 *speeds)
268{
269 if (netif_msg_timer(dev))
270 devinfo(dev, "link speeds: %u kbps up, %u kbps down",
271 __le32_to_cpu(speeds[0]) / 1000,
272 __le32_to_cpu(speeds[1]) / 1000);
273}
274
275static void cdc_status(struct usbnet *dev, struct urb *urb)
276{
277 struct usb_cdc_notification *event;
278
279 if (urb->actual_length < sizeof *event)
280 return;
281
282 /* SPEED_CHANGE can get split into two 8-byte packets */
283 if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
284 dumpspeed(dev, (__le32 *) urb->transfer_buffer);
285 return;
286 }
287
288 event = urb->transfer_buffer;
289 switch (event->bNotificationType) {
290 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
291 if (netif_msg_timer(dev))
292 devdbg(dev, "CDC: carrier %s",
293 event->wValue ? "on" : "off");
294 if (event->wValue)
295 netif_carrier_on(dev->net);
296 else
297 netif_carrier_off(dev->net);
298 break;
299 case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
300 if (netif_msg_timer(dev))
301 devdbg(dev, "CDC: speed change (len %d)",
302 urb->actual_length);
303 if (urb->actual_length != (sizeof *event + 8))
304 set_bit(EVENT_STS_SPLIT, &dev->flags);
305 else
306 dumpspeed(dev, (__le32 *) &event[1]);
307 break;
308 /* USB_CDC_NOTIFY_RESPONSE_AVAILABLE can happen too (e.g. RNDIS),
309 * but there are no standard formats for the response data.
310 */
311 default:
312 deverr(dev, "CDC: unexpected notification %02x!",
313 event->bNotificationType);
314 break;
315 }
316}
317
318static u8 nibble(unsigned char c)
319{
320 if (likely(isdigit(c)))
321 return c - '0';
322 c = toupper(c);
323 if (likely(isxdigit(c)))
324 return 10 + c - 'A';
325 return 0;
326}
327
328static inline int
329get_ethernet_addr(struct usbnet *dev, struct usb_cdc_ether_desc *e)
330{
331 int tmp, i;
332 unsigned char buf [13];
333
334 tmp = usb_string(dev->udev, e->iMACAddress, buf, sizeof buf);
335 if (tmp != 12) {
336 dev_dbg(&dev->udev->dev,
337 "bad MAC string %d fetch, %d\n", e->iMACAddress, tmp);
338 if (tmp >= 0)
339 tmp = -EINVAL;
340 return tmp;
341 }
342 for (i = tmp = 0; i < 6; i++, tmp += 2)
343 dev->net->dev_addr [i] =
344 (nibble(buf [tmp]) << 4) + nibble(buf [tmp + 1]);
345 return 0;
346}
347
348static int cdc_bind(struct usbnet *dev, struct usb_interface *intf)
349{
350 int status;
351 struct cdc_state *info = (void *) &dev->data;
352
353 status = usbnet_generic_cdc_bind(dev, intf);
354 if (status < 0)
355 return status;
356
357 status = get_ethernet_addr(dev, info->ether);
358 if (status < 0) {
359 usb_set_intfdata(info->data, NULL);
360 usb_driver_release_interface(driver_of(intf), info->data);
361 return status;
362 }
363
364 /* FIXME cdc-ether has some multicast code too, though it complains
365 * in routine cases. info->ether describes the multicast support.
366 * Implement that here, manipulating the cdc filter as needed.
367 */
368 return 0;
369}
370
371static const struct driver_info cdc_info = {
372 .description = "CDC Ethernet Device",
373 .flags = FLAG_ETHER,
374 // .check_connect = cdc_check_connect,
375 .bind = cdc_bind,
376 .unbind = usbnet_cdc_unbind,
377 .status = cdc_status,
378};
379
380/*-------------------------------------------------------------------------*/
381
382
383static const struct usb_device_id products [] = {
384/*
385 * BLACKLIST !!
386 *
387 * First blacklist any products that are egregiously nonconformant
388 * with the CDC Ethernet specs. Minor braindamage we cope with; when
389 * they're not even trying, needing a separate driver is only the first
390 * of the differences to show up.
391 */
392
393#define ZAURUS_MASTER_INTERFACE \
394 .bInterfaceClass = USB_CLASS_COMM, \
395 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
396 .bInterfaceProtocol = USB_CDC_PROTO_NONE
397
398/* SA-1100 based Sharp Zaurus ("collie"), or compatible;
399 * wire-incompatible with true CDC Ethernet implementations.
400 * (And, it seems, needlessly so...)
401 */
402{
403 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
404 | USB_DEVICE_ID_MATCH_DEVICE,
405 .idVendor = 0x04DD,
406 .idProduct = 0x8004,
407 ZAURUS_MASTER_INTERFACE,
408 .driver_info = 0,
409},
410
411/* PXA-25x based Sharp Zaurii. Note that it seems some of these
412 * (later models especially) may have shipped only with firmware
413 * advertising false "CDC MDLM" compatibility ... but we're not
414 * clear which models did that, so for now let's assume the worst.
415 */
416{
417 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
418 | USB_DEVICE_ID_MATCH_DEVICE,
419 .idVendor = 0x04DD,
420 .idProduct = 0x8005, /* A-300 */
421 ZAURUS_MASTER_INTERFACE,
422 .driver_info = 0,
423}, {
424 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
425 | USB_DEVICE_ID_MATCH_DEVICE,
426 .idVendor = 0x04DD,
427 .idProduct = 0x8006, /* B-500/SL-5600 */
428 ZAURUS_MASTER_INTERFACE,
429 .driver_info = 0,
430}, {
431 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
432 | USB_DEVICE_ID_MATCH_DEVICE,
433 .idVendor = 0x04DD,
434 .idProduct = 0x8007, /* C-700 */
435 ZAURUS_MASTER_INTERFACE,
436 .driver_info = 0,
437}, {
438 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
439 | USB_DEVICE_ID_MATCH_DEVICE,
440 .idVendor = 0x04DD,
441 .idProduct = 0x9031, /* C-750 C-760 */
442 ZAURUS_MASTER_INTERFACE,
443 .driver_info = 0,
444}, {
445 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
446 | USB_DEVICE_ID_MATCH_DEVICE,
447 .idVendor = 0x04DD,
448 .idProduct = 0x9032, /* SL-6000 */
449 ZAURUS_MASTER_INTERFACE,
450 .driver_info = 0,
451}, {
452 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
453 | USB_DEVICE_ID_MATCH_DEVICE,
454 .idVendor = 0x04DD,
455 /* reported with some C860 units */
456 .idProduct = 0x9050, /* C-860 */
457 ZAURUS_MASTER_INTERFACE,
458 .driver_info = 0,
459},
460
461/*
462 * WHITELIST!!!
463 *
464 * CDC Ether uses two interfaces, not necessarily consecutive.
465 * We match the main interface, ignoring the optional device
466 * class so we could handle devices that aren't exclusively
467 * CDC ether.
468 *
469 * NOTE: this match must come AFTER entries blacklisting devices
470 * because of bugs/quirks in a given product (like Zaurus, above).
471 */
472{
473 USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
474 USB_CDC_PROTO_NONE),
475 .driver_info = (unsigned long) &cdc_info,
476},
477 { }, // END
478};
479MODULE_DEVICE_TABLE(usb, products);
480
481static struct usb_driver cdc_driver = {
482 .owner = THIS_MODULE,
483 .name = "cdc_ether",
484 .id_table = products,
485 .probe = usbnet_probe,
486 .disconnect = usbnet_disconnect,
487 .suspend = usbnet_suspend,
488 .resume = usbnet_resume,
489};
490
491
492static int __init cdc_init(void)
493{
494 BUG_ON((sizeof(((struct usbnet *)0)->data)
495 < sizeof(struct cdc_state)));
496
497 return usb_register(&cdc_driver);
498}
499module_init(cdc_init);
500
501static void __exit cdc_exit(void)
502{
503 usb_deregister(&cdc_driver);
504}
505module_exit(cdc_exit);
506
507MODULE_AUTHOR("David Brownell");
508MODULE_DESCRIPTION("USB CDC Ethernet devices");
509MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/cdc_subset.c b/drivers/usb/net/cdc_subset.c
new file mode 100644
index 000000000000..f1730b685fd2
--- /dev/null
+++ b/drivers/usb/net/cdc_subset.c
@@ -0,0 +1,335 @@
1/*
2 * Simple "CDC Subset" USB Networking Links
3 * Copyright (C) 2000-2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20#include <linux/config.h>
21#ifdef CONFIG_USB_DEBUG
22# define DEBUG
23#endif
24#include <linux/module.h>
25#include <linux/kmod.h>
26#include <linux/sched.h>
27#include <linux/init.h>
28#include <linux/netdevice.h>
29#include <linux/etherdevice.h>
30#include <linux/ethtool.h>
31#include <linux/workqueue.h>
32#include <linux/mii.h>
33#include <linux/usb.h>
34
35#include "usbnet.h"
36
37
38/*
39 * This supports simple USB network links that don't require any special
40 * framing or hardware control operations. The protocol used here is a
41 * strict subset of CDC Ethernet, with three basic differences reflecting
42 * the goal that almost any hardware should run it:
43 *
44 * - Minimal runtime control: one interface, no altsettings, and
45 * no vendor or class specific control requests. If a device is
46 * configured, it is allowed to exchange packets with the host.
47 * Fancier models would mean not working on some hardware.
48 *
49 * - Minimal manufacturing control: no IEEE "Organizationally
50 * Unique ID" required, or an EEPROMs to store one. Each host uses
51 * one random "locally assigned" Ethernet address instead, which can
52 * of course be overridden using standard tools like "ifconfig".
53 * (With 2^46 such addresses, same-net collisions are quite rare.)
54 *
55 * - There is no additional framing data for USB. Packets are written
56 * exactly as in CDC Ethernet, starting with an Ethernet header and
57 * terminated by a short packet. However, the host will never send a
58 * zero length packet; some systems can't handle those robustly.
59 *
60 * Anything that can transmit and receive USB bulk packets can implement
61 * this protocol. That includes both smart peripherals and quite a lot
62 * of "host-to-host" USB cables (which embed two devices back-to-back).
63 *
64 * Note that although Linux may use many of those host-to-host links
65 * with this "cdc_subset" framing, that doesn't mean there may not be a
66 * better approach. Handling the "other end unplugs/replugs" scenario
67 * well tends to require chip-specific vendor requests. Also, Windows
68 * peers at the other end of host-to-host cables may expect their own
69 * framing to be used rather than this "cdc_subset" model.
70 */
71
72#if defined(CONFIG_USB_EPSON2888) || defined(CONFIG_USB_ARMLINUX)
73/* PDA style devices are always connected if present */
74static int always_connected (struct usbnet *dev)
75{
76 return 0;
77}
78#endif
79
80#ifdef CONFIG_USB_ALI_M5632
81#define HAVE_HARDWARE
82
83/*-------------------------------------------------------------------------
84 *
85 * ALi M5632 driver ... does high speed
86 *
87 *-------------------------------------------------------------------------*/
88
89static const struct driver_info ali_m5632_info = {
90 .description = "ALi M5632",
91};
92
93
94#endif
95
96
97#ifdef CONFIG_USB_AN2720
98#define HAVE_HARDWARE
99
100/*-------------------------------------------------------------------------
101 *
102 * AnchorChips 2720 driver ... http://www.cypress.com
103 *
104 * This doesn't seem to have a way to detect whether the peer is
105 * connected, or need any reset handshaking. It's got pretty big
106 * internal buffers (handles most of a frame's worth of data).
107 * Chip data sheets don't describe any vendor control messages.
108 *
109 *-------------------------------------------------------------------------*/
110
111static const struct driver_info an2720_info = {
112 .description = "AnchorChips/Cypress 2720",
113 // no reset available!
114 // no check_connect available!
115
116 .in = 2, .out = 2, // direction distinguishes these
117};
118
119#endif /* CONFIG_USB_AN2720 */
120
121
122#ifdef CONFIG_USB_BELKIN
123#define HAVE_HARDWARE
124
125/*-------------------------------------------------------------------------
126 *
127 * Belkin F5U104 ... two NetChip 2280 devices + Atmel AVR microcontroller
128 *
129 * ... also two eTEK designs, including one sold as "Advance USBNET"
130 *
131 *-------------------------------------------------------------------------*/
132
133static const struct driver_info belkin_info = {
134 .description = "Belkin, eTEK, or compatible",
135};
136
137#endif /* CONFIG_USB_BELKIN */
138
139
140
141#ifdef CONFIG_USB_EPSON2888
142#define HAVE_HARDWARE
143
144/*-------------------------------------------------------------------------
145 *
146 * EPSON USB clients
147 *
148 * This is the same idea as Linux PDAs (below) except the firmware in the
149 * device might not be Tux-powered. Epson provides reference firmware that
150 * implements this interface. Product developers can reuse or modify that
151 * code, such as by using their own product and vendor codes.
152 *
153 * Support was from Juro Bystricky <bystricky.juro@erd.epson.com>
154 *
155 *-------------------------------------------------------------------------*/
156
157static const struct driver_info epson2888_info = {
158 .description = "Epson USB Device",
159 .check_connect = always_connected,
160
161 .in = 4, .out = 3,
162};
163
164#endif /* CONFIG_USB_EPSON2888 */
165
166
167#ifdef CONFIG_USB_KC2190
168#define HAVE_HARDWARE
169static const struct driver_info kc2190_info = {
170 .description = "KC Technology KC-190",
171};
172#endif /* CONFIG_USB_KC2190 */
173
174
175#ifdef CONFIG_USB_ARMLINUX
176#define HAVE_HARDWARE
177
178/*-------------------------------------------------------------------------
179 *
180 * Intel's SA-1100 chip integrates basic USB support, and is used
181 * in PDAs like some iPaqs, the Yopy, some Zaurus models, and more.
182 * When they run Linux, arch/arm/mach-sa1100/usb-eth.c may be used to
183 * network using minimal USB framing data.
184 *
185 * This describes the driver currently in standard ARM Linux kernels.
186 * The Zaurus uses a different driver (see later).
187 *
188 * PXA25x and PXA210 use XScale cores (ARM v5TE) with better USB support
189 * and different USB endpoint numbering than the SA1100 devices. The
190 * mach-pxa/usb-eth.c driver re-uses the device ids from mach-sa1100
191 * so we rely on the endpoint descriptors.
192 *
193 *-------------------------------------------------------------------------*/
194
195static const struct driver_info linuxdev_info = {
196 .description = "Linux Device",
197 .check_connect = always_connected,
198};
199
200static const struct driver_info yopy_info = {
201 .description = "Yopy",
202 .check_connect = always_connected,
203};
204
205static const struct driver_info blob_info = {
206 .description = "Boot Loader OBject",
207 .check_connect = always_connected,
208};
209
210#endif /* CONFIG_USB_ARMLINUX */
211
212
213/*-------------------------------------------------------------------------*/
214
215#ifndef HAVE_HARDWARE
216#error You need to configure some hardware for this driver
217#endif
218
219/*
220 * chip vendor names won't normally be on the cables, and
221 * may not be on the device.
222 */
223
224static const struct usb_device_id products [] = {
225
226#ifdef CONFIG_USB_ALI_M5632
227{
228 USB_DEVICE (0x0402, 0x5632), // ALi defaults
229 .driver_info = (unsigned long) &ali_m5632_info,
230},
231#endif
232
233#ifdef CONFIG_USB_AN2720
234{
235 USB_DEVICE (0x0547, 0x2720), // AnchorChips defaults
236 .driver_info = (unsigned long) &an2720_info,
237}, {
238 USB_DEVICE (0x0547, 0x2727), // Xircom PGUNET
239 .driver_info = (unsigned long) &an2720_info,
240},
241#endif
242
243#ifdef CONFIG_USB_BELKIN
244{
245 USB_DEVICE (0x050d, 0x0004), // Belkin
246 .driver_info = (unsigned long) &belkin_info,
247}, {
248 USB_DEVICE (0x056c, 0x8100), // eTEK
249 .driver_info = (unsigned long) &belkin_info,
250}, {
251 USB_DEVICE (0x0525, 0x9901), // Advance USBNET (eTEK)
252 .driver_info = (unsigned long) &belkin_info,
253},
254#endif
255
256#ifdef CONFIG_USB_EPSON2888
257{
258 USB_DEVICE (0x0525, 0x2888), // EPSON USB client
259 .driver_info = (unsigned long) &epson2888_info,
260},
261#endif
262
263#ifdef CONFIG_USB_KC2190
264{
265 USB_DEVICE (0x050f, 0x0190), // KC-190
266 .driver_info = (unsigned long) &kc2190_info,
267},
268#endif
269
270#ifdef CONFIG_USB_ARMLINUX
271/*
272 * SA-1100 using standard ARM Linux kernels, or compatible.
273 * Often used when talking to Linux PDAs (iPaq, Yopy, etc).
274 * The sa-1100 "usb-eth" driver handles the basic framing.
275 *
276 * PXA25x or PXA210 ... these use a "usb-eth" driver much like
277 * the sa1100 one, but hardware uses different endpoint numbers.
278 *
279 * Or the Linux "Ethernet" gadget on hardware that can't talk
280 * CDC Ethernet (e.g., no altsettings), in either of two modes:
281 * - acting just like the old "usb-eth" firmware, though
282 * the implementation is different
283 * - supporting RNDIS as the first/default configuration for
284 * MS-Windows interop; Linux needs to use the other config
285 */
286{
287 // 1183 = 0x049F, both used as hex values?
288 // Compaq "Itsy" vendor/product id
289 USB_DEVICE (0x049F, 0x505A), // usb-eth, or compatible
290 .driver_info = (unsigned long) &linuxdev_info,
291}, {
292 USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy"
293 .driver_info = (unsigned long) &yopy_info,
294}, {
295 USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader
296 .driver_info = (unsigned long) &blob_info,
297}, {
298 // Linux Ethernet/RNDIS gadget on pxa210/25x/26x, second config
299 // e.g. Gumstix, current OpenZaurus, ...
300 USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203),
301 .driver_info = (unsigned long) &linuxdev_info,
302},
303#endif
304
305 { }, // END
306};
307MODULE_DEVICE_TABLE(usb, products);
308
309/*-------------------------------------------------------------------------*/
310
311static struct usb_driver cdc_subset_driver = {
312 .owner = THIS_MODULE,
313 .name = "cdc_subset",
314 .probe = usbnet_probe,
315 .suspend = usbnet_suspend,
316 .resume = usbnet_resume,
317 .disconnect = usbnet_disconnect,
318 .id_table = products,
319};
320
321static int __init cdc_subset_init(void)
322{
323 return usb_register(&cdc_subset_driver);
324}
325module_init(cdc_subset_init);
326
327static void __exit cdc_subset_exit(void)
328{
329 usb_deregister(&cdc_subset_driver);
330}
331module_exit(cdc_subset_exit);
332
333MODULE_AUTHOR("David Brownell");
334MODULE_DESCRIPTION("Simple 'CDC Subset' USB networking links");
335MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/gl620a.c b/drivers/usb/net/gl620a.c
new file mode 100644
index 000000000000..c8763ae33c73
--- /dev/null
+++ b/drivers/usb/net/gl620a.c
@@ -0,0 +1,407 @@
1/*
2 * GeneSys GL620USB-A based links
3 * Copyright (C) 2001 by Jiun-Jie Huang <huangjj@genesyslogic.com.tw>
4 * Copyright (C) 2001 by Stanislav Brabec <utx@penguin.cz>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21// #define DEBUG // error path messages, extra info
22// #define VERBOSE // more; success messages
23
24#include <linux/config.h>
25#ifdef CONFIG_USB_DEBUG
26# define DEBUG
27#endif
28#include <linux/module.h>
29#include <linux/sched.h>
30#include <linux/init.h>
31#include <linux/netdevice.h>
32#include <linux/etherdevice.h>
33#include <linux/ethtool.h>
34#include <linux/workqueue.h>
35#include <linux/mii.h>
36#include <linux/usb.h>
37
38#include "usbnet.h"
39
40
41/*
42 * GeneSys GL620USB-A (www.genesyslogic.com.tw)
43 *
44 * ... should partially interop with the Win32 driver for this hardware.
45 * The GeneSys docs imply there's some NDIS issue motivating this framing.
46 *
47 * Some info from GeneSys:
48 * - GL620USB-A is full duplex; GL620USB is only half duplex for bulk.
49 * (Some cables, like the BAFO-100c, use the half duplex version.)
50 * - For the full duplex model, the low bit of the version code says
51 * which side is which ("left/right").
52 * - For the half duplex type, a control/interrupt handshake settles
53 * the transfer direction. (That's disabled here, partially coded.)
54 * A control URB would block until other side writes an interrupt.
55 *
56 * Original code from Jiun-Jie Huang <huangjj@genesyslogic.com.tw>
57 * and merged into "usbnet" by Stanislav Brabec <utx@penguin.cz>.
58 */
59
60// control msg write command
61#define GENELINK_CONNECT_WRITE 0xF0
62// interrupt pipe index
63#define GENELINK_INTERRUPT_PIPE 0x03
64// interrupt read buffer size
65#define INTERRUPT_BUFSIZE 0x08
66// interrupt pipe interval value
67#define GENELINK_INTERRUPT_INTERVAL 0x10
68// max transmit packet number per transmit
69#define GL_MAX_TRANSMIT_PACKETS 32
70// max packet length
71#define GL_MAX_PACKET_LEN 1514
72// max receive buffer size
73#define GL_RCV_BUF_SIZE \
74 (((GL_MAX_PACKET_LEN + 4) * GL_MAX_TRANSMIT_PACKETS) + 4)
75
76struct gl_packet {
77 u32 packet_length;
78 char packet_data [1];
79};
80
81struct gl_header {
82 u32 packet_count;
83 struct gl_packet packets;
84};
85
86#ifdef GENELINK_ACK
87
88// FIXME: this code is incomplete, not debugged; it doesn't
89// handle interrupts correctly; it should use the generic
90// status IRQ code (which didn't exist back in 2001).
91
92struct gl_priv {
93 struct urb *irq_urb;
94 char irq_buf [INTERRUPT_BUFSIZE];
95};
96
97static inline int gl_control_write(struct usbnet *dev, u8 request, u16 value)
98{
99 int retval;
100
101 retval = usb_control_msg(dev->udev,
102 usb_sndctrlpipe(dev->udev, 0),
103 request,
104 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
105 value,
106 0, // index
107 0, // data buffer
108 0, // size
109 USB_CTRL_SET_TIMEOUT);
110 return retval;
111}
112
113static void gl_interrupt_complete(struct urb *urb, struct pt_regs *regs)
114{
115 int status = urb->status;
116
117 switch (status) {
118 case 0:
119 /* success */
120 break;
121 case -ECONNRESET:
122 case -ENOENT:
123 case -ESHUTDOWN:
124 /* this urb is terminated, clean up */
125 dbg("%s - urb shutting down with status: %d",
126 __FUNCTION__, status);
127 return;
128 default:
129 dbg("%s - nonzero urb status received: %d",
130 __FUNCTION__, urb->status);
131 }
132
133 status = usb_submit_urb(urb, GFP_ATOMIC);
134 if (status)
135 err("%s - usb_submit_urb failed with result %d",
136 __FUNCTION__, status);
137}
138
139static int gl_interrupt_read(struct usbnet *dev)
140{
141 struct gl_priv *priv = dev->priv_data;
142 int retval;
143
144 // issue usb interrupt read
145 if (priv && priv->irq_urb) {
146 // submit urb
147 if ((retval = usb_submit_urb(priv->irq_urb, GFP_KERNEL)) != 0)
148 dbg("gl_interrupt_read: submit fail - %X...", retval);
149 else
150 dbg("gl_interrupt_read: submit success...");
151 }
152
153 return 0;
154}
155
156// check whether another side is connected
157static int genelink_check_connect(struct usbnet *dev)
158{
159 int retval;
160
161 dbg("genelink_check_connect...");
162
163 // detect whether another side is connected
164 if ((retval = gl_control_write(dev, GENELINK_CONNECT_WRITE, 0)) != 0) {
165 dbg("%s: genelink_check_connect write fail - %X",
166 dev->net->name, retval);
167 return retval;
168 }
169
170 // usb interrupt read to ack another side
171 if ((retval = gl_interrupt_read(dev)) != 0) {
172 dbg("%s: genelink_check_connect read fail - %X",
173 dev->net->name, retval);
174 return retval;
175 }
176
177 dbg("%s: genelink_check_connect read success", dev->net->name);
178 return 0;
179}
180
181// allocate and initialize the private data for genelink
182static int genelink_init(struct usbnet *dev)
183{
184 struct gl_priv *priv;
185
186 // allocate the private data structure
187 if ((priv = kmalloc(sizeof *priv, GFP_KERNEL)) == 0) {
188 dbg("%s: cannot allocate private data per device",
189 dev->net->name);
190 return -ENOMEM;
191 }
192
193 // allocate irq urb
194 if ((priv->irq_urb = usb_alloc_urb(0, GFP_KERNEL)) == 0) {
195 dbg("%s: cannot allocate private irq urb per device",
196 dev->net->name);
197 kfree(priv);
198 return -ENOMEM;
199 }
200
201 // fill irq urb
202 usb_fill_int_urb(priv->irq_urb, dev->udev,
203 usb_rcvintpipe(dev->udev, GENELINK_INTERRUPT_PIPE),
204 priv->irq_buf, INTERRUPT_BUFSIZE,
205 gl_interrupt_complete, 0,
206 GENELINK_INTERRUPT_INTERVAL);
207
208 // set private data pointer
209 dev->priv_data = priv;
210
211 return 0;
212}
213
214// release the private data
215static int genelink_free(struct usbnet *dev)
216{
217 struct gl_priv *priv = dev->priv_data;
218
219 if (!priv)
220 return 0;
221
222// FIXME: can't cancel here; it's synchronous, and
223// should have happened earlier in any case (interrupt
224// handling needs to be generic)
225
226 // cancel irq urb first
227 usb_kill_urb(priv->irq_urb);
228
229 // free irq urb
230 usb_free_urb(priv->irq_urb);
231
232 // free the private data structure
233 kfree(priv);
234
235 return 0;
236}
237
238#endif
239
240static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
241{
242 struct gl_header *header;
243 struct gl_packet *packet;
244 struct sk_buff *gl_skb;
245 u32 size;
246
247 header = (struct gl_header *) skb->data;
248
249 // get the packet count of the received skb
250 le32_to_cpus(&header->packet_count);
251 if ((header->packet_count > GL_MAX_TRANSMIT_PACKETS)
252 || (header->packet_count < 0)) {
253 dbg("genelink: invalid received packet count %d",
254 header->packet_count);
255 return 0;
256 }
257
258 // set the current packet pointer to the first packet
259 packet = &header->packets;
260
261 // decrement the length for the packet count size 4 bytes
262 skb_pull(skb, 4);
263
264 while (header->packet_count > 1) {
265 // get the packet length
266 size = le32_to_cpu(packet->packet_length);
267
268 // this may be a broken packet
269 if (size > GL_MAX_PACKET_LEN) {
270 dbg("genelink: invalid rx length %d", size);
271 return 0;
272 }
273
274 // allocate the skb for the individual packet
275 gl_skb = alloc_skb(size, GFP_ATOMIC);
276 if (gl_skb) {
277
278 // copy the packet data to the new skb
279 memcpy(skb_put(gl_skb, size),
280 packet->packet_data, size);
281 usbnet_skb_return(dev, gl_skb);
282 }
283
284 // advance to the next packet
285 packet = (struct gl_packet *)
286 &packet->packet_data [size];
287 header->packet_count--;
288
289 // shift the data pointer to the next gl_packet
290 skb_pull(skb, size + 4);
291 }
292
293 // skip the packet length field 4 bytes
294 skb_pull(skb, 4);
295
296 if (skb->len > GL_MAX_PACKET_LEN) {
297 dbg("genelink: invalid rx length %d", skb->len);
298 return 0;
299 }
300 return 1;
301}
302
303static struct sk_buff *
304genelink_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags)
305{
306 int padlen;
307 int length = skb->len;
308 int headroom = skb_headroom(skb);
309 int tailroom = skb_tailroom(skb);
310 u32 *packet_count;
311 u32 *packet_len;
312
313 // FIXME: magic numbers, bleech
314 padlen = ((skb->len + (4 + 4*1)) % 64) ? 0 : 1;
315
316 if ((!skb_cloned(skb))
317 && ((headroom + tailroom) >= (padlen + (4 + 4*1)))) {
318 if ((headroom < (4 + 4*1)) || (tailroom < padlen)) {
319 skb->data = memmove(skb->head + (4 + 4*1),
320 skb->data, skb->len);
321 skb->tail = skb->data + skb->len;
322 }
323 } else {
324 struct sk_buff *skb2;
325 skb2 = skb_copy_expand(skb, (4 + 4*1) , padlen, flags);
326 dev_kfree_skb_any(skb);
327 skb = skb2;
328 if (!skb)
329 return NULL;
330 }
331
332 // attach the packet count to the header
333 packet_count = (u32 *) skb_push(skb, (4 + 4*1));
334 packet_len = packet_count + 1;
335
336 *packet_count = cpu_to_le32(1);
337 *packet_len = cpu_to_le32(length);
338
339 // add padding byte
340 if ((skb->len % dev->maxpacket) == 0)
341 skb_put(skb, 1);
342
343 return skb;
344}
345
346static int genelink_bind(struct usbnet *dev, struct usb_interface *intf)
347{
348 dev->hard_mtu = GL_RCV_BUF_SIZE;
349 dev->net->hard_header_len += 4;
350 dev->in = usb_rcvbulkpipe(dev->udev, dev->driver_info->in);
351 dev->out = usb_sndbulkpipe(dev->udev, dev->driver_info->out);
352 return 0;
353}
354
355static const struct driver_info genelink_info = {
356 .description = "Genesys GeneLink",
357 .flags = FLAG_FRAMING_GL | FLAG_NO_SETINT,
358 .bind = genelink_bind,
359 .rx_fixup = genelink_rx_fixup,
360 .tx_fixup = genelink_tx_fixup,
361
362 .in = 1, .out = 2,
363
364#ifdef GENELINK_ACK
365 .check_connect =genelink_check_connect,
366#endif
367};
368
369static const struct usb_device_id products [] = {
370
371{
372 USB_DEVICE(0x05e3, 0x0502), // GL620USB-A
373 .driver_info = (unsigned long) &genelink_info,
374},
375 /* NOT: USB_DEVICE(0x05e3, 0x0501), // GL620USB
376 * that's half duplex, not currently supported
377 */
378 { }, // END
379};
380MODULE_DEVICE_TABLE(usb, products);
381
382static struct usb_driver gl620a_driver = {
383 .owner = THIS_MODULE,
384 .name = "gl620a",
385 .id_table = products,
386 .probe = usbnet_probe,
387 .disconnect = usbnet_disconnect,
388 .suspend = usbnet_suspend,
389 .resume = usbnet_resume,
390};
391
392static int __init usbnet_init(void)
393{
394 return usb_register(&gl620a_driver);
395}
396module_init(usbnet_init);
397
398static void __exit usbnet_exit(void)
399{
400 usb_deregister(&gl620a_driver);
401}
402module_exit(usbnet_exit);
403
404MODULE_AUTHOR("Jiun-Jie Huang");
405MODULE_DESCRIPTION("GL620-USB-A Host-to-Host Link cables");
406MODULE_LICENSE("GPL");
407
diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c
index 7ffa99b9760f..e04b0ce3611a 100644
--- a/drivers/usb/net/kaweth.c
+++ b/drivers/usb/net/kaweth.c
@@ -787,7 +787,6 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
787 kaweth_usb_transmit_complete, 787 kaweth_usb_transmit_complete,
788 kaweth); 788 kaweth);
789 kaweth->end = 0; 789 kaweth->end = 0;
790 kaweth->tx_urb->transfer_flags |= URB_ASYNC_UNLINK;
791 790
792 if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC))) 791 if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC)))
793 { 792 {
diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c
new file mode 100644
index 000000000000..a4309c4a491b
--- /dev/null
+++ b/drivers/usb/net/net1080.c
@@ -0,0 +1,622 @@
1/*
2 * Net1080 based USB host-to-host cables
3 * Copyright (C) 2000-2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20// #define DEBUG // error path messages, extra info
21// #define VERBOSE // more; success messages
22
23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h>
28#include <linux/sched.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/ethtool.h>
33#include <linux/workqueue.h>
34#include <linux/mii.h>
35#include <linux/usb.h>
36
37#include <asm/unaligned.h>
38
39#include "usbnet.h"
40
41
42/*
43 * Netchip 1080 driver ... http://www.netchip.com
44 * (Sept 2004: End-of-life announcement has been sent.)
45 * Used in (some) LapLink cables
46 */
47
48#define frame_errors data[1]
49
50/*
51 * NetChip framing of ethernet packets, supporting additional error
52 * checks for links that may drop bulk packets from inside messages.
53 * Odd USB length == always short read for last usb packet.
54 * - nc_header
55 * - Ethernet header (14 bytes)
56 * - payload
57 * - (optional padding byte, if needed so length becomes odd)
58 * - nc_trailer
59 *
60 * This framing is to be avoided for non-NetChip devices.
61 */
62
63struct nc_header { // packed:
64 __le16 hdr_len; // sizeof nc_header (LE, all)
65 __le16 packet_len; // payload size (including ethhdr)
66 __le16 packet_id; // detects dropped packets
67#define MIN_HEADER 6
68
69 // all else is optional, and must start with:
70 // __le16 vendorId; // from usb-if
71 // __le16 productId;
72} __attribute__((__packed__));
73
74#define PAD_BYTE ((unsigned char)0xAC)
75
76struct nc_trailer {
77 __le16 packet_id;
78} __attribute__((__packed__));
79
80// packets may use FLAG_FRAMING_NC and optional pad
81#define FRAMED_SIZE(mtu) (sizeof (struct nc_header) \
82 + sizeof (struct ethhdr) \
83 + (mtu) \
84 + 1 \
85 + sizeof (struct nc_trailer))
86
87#define MIN_FRAMED FRAMED_SIZE(0)
88
89/* packets _could_ be up to 64KB... */
90#define NC_MAX_PACKET 32767
91
92
93/*
94 * Zero means no timeout; else, how long a 64 byte bulk packet may be queued
95 * before the hardware drops it. If that's done, the driver will need to
96 * frame network packets to guard against the dropped USB packets. The win32
97 * driver sets this for both sides of the link.
98 */
99#define NC_READ_TTL_MS ((u8)255) // ms
100
101/*
102 * We ignore most registers and EEPROM contents.
103 */
104#define REG_USBCTL ((u8)0x04)
105#define REG_TTL ((u8)0x10)
106#define REG_STATUS ((u8)0x11)
107
108/*
109 * Vendor specific requests to read/write data
110 */
111#define REQUEST_REGISTER ((u8)0x10)
112#define REQUEST_EEPROM ((u8)0x11)
113
114static int
115nc_vendor_read(struct usbnet *dev, u8 req, u8 regnum, u16 *retval_ptr)
116{
117 int status = usb_control_msg(dev->udev,
118 usb_rcvctrlpipe(dev->udev, 0),
119 req,
120 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
121 0, regnum,
122 retval_ptr, sizeof *retval_ptr,
123 USB_CTRL_GET_TIMEOUT);
124 if (status > 0)
125 status = 0;
126 if (!status)
127 le16_to_cpus(retval_ptr);
128 return status;
129}
130
131static inline int
132nc_register_read(struct usbnet *dev, u8 regnum, u16 *retval_ptr)
133{
134 return nc_vendor_read(dev, REQUEST_REGISTER, regnum, retval_ptr);
135}
136
137// no retval ... can become async, usable in_interrupt()
138static void
139nc_vendor_write(struct usbnet *dev, u8 req, u8 regnum, u16 value)
140{
141 usb_control_msg(dev->udev,
142 usb_sndctrlpipe(dev->udev, 0),
143 req,
144 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
145 value, regnum,
146 NULL, 0, // data is in setup packet
147 USB_CTRL_SET_TIMEOUT);
148}
149
150static inline void
151nc_register_write(struct usbnet *dev, u8 regnum, u16 value)
152{
153 nc_vendor_write(dev, REQUEST_REGISTER, regnum, value);
154}
155
156
157#if 0
158static void nc_dump_registers(struct usbnet *dev)
159{
160 u8 reg;
161 u16 *vp = kmalloc(sizeof (u16));
162
163 if (!vp) {
164 dbg("no memory?");
165 return;
166 }
167
168 dbg("%s registers:", dev->net->name);
169 for (reg = 0; reg < 0x20; reg++) {
170 int retval;
171
172 // reading some registers is trouble
173 if (reg >= 0x08 && reg <= 0xf)
174 continue;
175 if (reg >= 0x12 && reg <= 0x1e)
176 continue;
177
178 retval = nc_register_read(dev, reg, vp);
179 if (retval < 0)
180 dbg("%s reg [0x%x] ==> error %d",
181 dev->net->name, reg, retval);
182 else
183 dbg("%s reg [0x%x] = 0x%x",
184 dev->net->name, reg, *vp);
185 }
186 kfree(vp);
187}
188#endif
189
190
191/*-------------------------------------------------------------------------*/
192
193/*
194 * Control register
195 */
196
197#define USBCTL_WRITABLE_MASK 0x1f0f
198// bits 15-13 reserved, r/o
199#define USBCTL_ENABLE_LANG (1 << 12)
200#define USBCTL_ENABLE_MFGR (1 << 11)
201#define USBCTL_ENABLE_PROD (1 << 10)
202#define USBCTL_ENABLE_SERIAL (1 << 9)
203#define USBCTL_ENABLE_DEFAULTS (1 << 8)
204// bits 7-4 reserved, r/o
205#define USBCTL_FLUSH_OTHER (1 << 3)
206#define USBCTL_FLUSH_THIS (1 << 2)
207#define USBCTL_DISCONN_OTHER (1 << 1)
208#define USBCTL_DISCONN_THIS (1 << 0)
209
210static inline void nc_dump_usbctl(struct usbnet *dev, u16 usbctl)
211{
212 if (!netif_msg_link(dev))
213 return;
214 devdbg(dev, "net1080 %s-%s usbctl 0x%x:%s%s%s%s%s;"
215 " this%s%s;"
216 " other%s%s; r/o 0x%x",
217 dev->udev->bus->bus_name, dev->udev->devpath,
218 usbctl,
219 (usbctl & USBCTL_ENABLE_LANG) ? " lang" : "",
220 (usbctl & USBCTL_ENABLE_MFGR) ? " mfgr" : "",
221 (usbctl & USBCTL_ENABLE_PROD) ? " prod" : "",
222 (usbctl & USBCTL_ENABLE_SERIAL) ? " serial" : "",
223 (usbctl & USBCTL_ENABLE_DEFAULTS) ? " defaults" : "",
224
225 (usbctl & USBCTL_FLUSH_OTHER) ? " FLUSH" : "",
226 (usbctl & USBCTL_DISCONN_OTHER) ? " DIS" : "",
227 (usbctl & USBCTL_FLUSH_THIS) ? " FLUSH" : "",
228 (usbctl & USBCTL_DISCONN_THIS) ? " DIS" : "",
229 usbctl & ~USBCTL_WRITABLE_MASK
230 );
231}
232
233/*-------------------------------------------------------------------------*/
234
235/*
236 * Status register
237 */
238
239#define STATUS_PORT_A (1 << 15)
240
241#define STATUS_CONN_OTHER (1 << 14)
242#define STATUS_SUSPEND_OTHER (1 << 13)
243#define STATUS_MAILBOX_OTHER (1 << 12)
244#define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03)
245
246#define STATUS_CONN_THIS (1 << 6)
247#define STATUS_SUSPEND_THIS (1 << 5)
248#define STATUS_MAILBOX_THIS (1 << 4)
249#define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03)
250
251#define STATUS_UNSPEC_MASK 0x0c8c
252#define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK))
253
254
255static inline void nc_dump_status(struct usbnet *dev, u16 status)
256{
257 if (!netif_msg_link(dev))
258 return;
259 devdbg(dev, "net1080 %s-%s status 0x%x:"
260 " this (%c) PKT=%d%s%s%s;"
261 " other PKT=%d%s%s%s; unspec 0x%x",
262 dev->udev->bus->bus_name, dev->udev->devpath,
263 status,
264
265 // XXX the packet counts don't seem right
266 // (1 at reset, not 0); maybe UNSPEC too
267
268 (status & STATUS_PORT_A) ? 'A' : 'B',
269 STATUS_PACKETS_THIS(status),
270 (status & STATUS_CONN_THIS) ? " CON" : "",
271 (status & STATUS_SUSPEND_THIS) ? " SUS" : "",
272 (status & STATUS_MAILBOX_THIS) ? " MBOX" : "",
273
274 STATUS_PACKETS_OTHER(status),
275 (status & STATUS_CONN_OTHER) ? " CON" : "",
276 (status & STATUS_SUSPEND_OTHER) ? " SUS" : "",
277 (status & STATUS_MAILBOX_OTHER) ? " MBOX" : "",
278
279 status & STATUS_UNSPEC_MASK
280 );
281}
282
283/*-------------------------------------------------------------------------*/
284
285/*
286 * TTL register
287 */
288
289#define TTL_THIS(ttl) (0x00ff & ttl)
290#define TTL_OTHER(ttl) (0x00ff & (ttl >> 8))
291#define MK_TTL(this,other) ((u16)(((other)<<8)|(0x00ff&(this))))
292
293static inline void nc_dump_ttl(struct usbnet *dev, u16 ttl)
294{
295 if (netif_msg_link(dev))
296 devdbg(dev, "net1080 %s-%s ttl 0x%x this = %d, other = %d",
297 dev->udev->bus->bus_name, dev->udev->devpath,
298 ttl, TTL_THIS(ttl), TTL_OTHER(ttl));
299}
300
301/*-------------------------------------------------------------------------*/
302
303static int net1080_reset(struct usbnet *dev)
304{
305 u16 usbctl, status, ttl;
306 u16 *vp = kmalloc(sizeof (u16), GFP_KERNEL);
307 int retval;
308
309 if (!vp)
310 return -ENOMEM;
311
312 // nc_dump_registers(dev);
313
314 if ((retval = nc_register_read(dev, REG_STATUS, vp)) < 0) {
315 dbg("can't read %s-%s status: %d",
316 dev->udev->bus->bus_name, dev->udev->devpath, retval);
317 goto done;
318 }
319 status = *vp;
320 nc_dump_status(dev, status);
321
322 if ((retval = nc_register_read(dev, REG_USBCTL, vp)) < 0) {
323 dbg("can't read USBCTL, %d", retval);
324 goto done;
325 }
326 usbctl = *vp;
327 nc_dump_usbctl(dev, usbctl);
328
329 nc_register_write(dev, REG_USBCTL,
330 USBCTL_FLUSH_THIS | USBCTL_FLUSH_OTHER);
331
332 if ((retval = nc_register_read(dev, REG_TTL, vp)) < 0) {
333 dbg("can't read TTL, %d", retval);
334 goto done;
335 }
336 ttl = *vp;
337 // nc_dump_ttl(dev, ttl);
338
339 nc_register_write(dev, REG_TTL,
340 MK_TTL(NC_READ_TTL_MS, TTL_OTHER(ttl)) );
341 dbg("%s: assigned TTL, %d ms", dev->net->name, NC_READ_TTL_MS);
342
343 if (netif_msg_link(dev))
344 devinfo(dev, "port %c, peer %sconnected",
345 (status & STATUS_PORT_A) ? 'A' : 'B',
346 (status & STATUS_CONN_OTHER) ? "" : "dis"
347 );
348 retval = 0;
349
350done:
351 kfree(vp);
352 return retval;
353}
354
355static int net1080_check_connect(struct usbnet *dev)
356{
357 int retval;
358 u16 status;
359 u16 *vp = kmalloc(sizeof (u16), GFP_KERNEL);
360
361 if (!vp)
362 return -ENOMEM;
363 retval = nc_register_read(dev, REG_STATUS, vp);
364 status = *vp;
365 kfree(vp);
366 if (retval != 0) {
367 dbg("%s net1080_check_conn read - %d", dev->net->name, retval);
368 return retval;
369 }
370 if ((status & STATUS_CONN_OTHER) != STATUS_CONN_OTHER)
371 return -ENOLINK;
372 return 0;
373}
374
375static void nc_flush_complete(struct urb *urb, struct pt_regs *regs)
376{
377 kfree(urb->context);
378 usb_free_urb(urb);
379}
380
381static void nc_ensure_sync(struct usbnet *dev)
382{
383 dev->frame_errors++;
384 if (dev->frame_errors > 5) {
385 struct urb *urb;
386 struct usb_ctrlrequest *req;
387 int status;
388
389 /* Send a flush */
390 urb = usb_alloc_urb(0, SLAB_ATOMIC);
391 if (!urb)
392 return;
393
394 req = kmalloc(sizeof *req, GFP_ATOMIC);
395 if (!req) {
396 usb_free_urb(urb);
397 return;
398 }
399
400 req->bRequestType = USB_DIR_OUT
401 | USB_TYPE_VENDOR
402 | USB_RECIP_DEVICE;
403 req->bRequest = REQUEST_REGISTER;
404 req->wValue = cpu_to_le16(USBCTL_FLUSH_THIS
405 | USBCTL_FLUSH_OTHER);
406 req->wIndex = cpu_to_le16(REG_USBCTL);
407 req->wLength = cpu_to_le16(0);
408
409 /* queue an async control request, we don't need
410 * to do anything when it finishes except clean up.
411 */
412 usb_fill_control_urb(urb, dev->udev,
413 usb_sndctrlpipe(dev->udev, 0),
414 (unsigned char *) req,
415 NULL, 0,
416 nc_flush_complete, req);
417 status = usb_submit_urb(urb, GFP_ATOMIC);
418 if (status) {
419 kfree(req);
420 usb_free_urb(urb);
421 return;
422 }
423
424 if (netif_msg_rx_err(dev))
425 devdbg(dev, "flush net1080; too many framing errors");
426 dev->frame_errors = 0;
427 }
428}
429
430static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
431{
432 struct nc_header *header;
433 struct nc_trailer *trailer;
434 u16 hdr_len, packet_len;
435
436 if (!(skb->len & 0x01)) {
437#ifdef DEBUG
438 struct net_device *net = dev->net;
439 dbg("rx framesize %d range %d..%d mtu %d", skb->len,
440 net->hard_header_len, dev->hard_mtu, net->mtu);
441#endif
442 dev->stats.rx_frame_errors++;
443 nc_ensure_sync(dev);
444 return 0;
445 }
446
447 header = (struct nc_header *) skb->data;
448 hdr_len = le16_to_cpup(&header->hdr_len);
449 packet_len = le16_to_cpup(&header->packet_len);
450 if (FRAMED_SIZE(packet_len) > NC_MAX_PACKET) {
451 dev->stats.rx_frame_errors++;
452 dbg("packet too big, %d", packet_len);
453 nc_ensure_sync(dev);
454 return 0;
455 } else if (hdr_len < MIN_HEADER) {
456 dev->stats.rx_frame_errors++;
457 dbg("header too short, %d", hdr_len);
458 nc_ensure_sync(dev);
459 return 0;
460 } else if (hdr_len > MIN_HEADER) {
461 // out of band data for us?
462 dbg("header OOB, %d bytes", hdr_len - MIN_HEADER);
463 nc_ensure_sync(dev);
464 // switch (vendor/product ids) { ... }
465 }
466 skb_pull(skb, hdr_len);
467
468 trailer = (struct nc_trailer *)
469 (skb->data + skb->len - sizeof *trailer);
470 skb_trim(skb, skb->len - sizeof *trailer);
471
472 if ((packet_len & 0x01) == 0) {
473 if (skb->data [packet_len] != PAD_BYTE) {
474 dev->stats.rx_frame_errors++;
475 dbg("bad pad");
476 return 0;
477 }
478 skb_trim(skb, skb->len - 1);
479 }
480 if (skb->len != packet_len) {
481 dev->stats.rx_frame_errors++;
482 dbg("bad packet len %d (expected %d)",
483 skb->len, packet_len);
484 nc_ensure_sync(dev);
485 return 0;
486 }
487 if (header->packet_id != get_unaligned(&trailer->packet_id)) {
488 dev->stats.rx_fifo_errors++;
489 dbg("(2+ dropped) rx packet_id mismatch 0x%x 0x%x",
490 le16_to_cpu(header->packet_id),
491 le16_to_cpu(trailer->packet_id));
492 return 0;
493 }
494#if 0
495 devdbg(dev, "frame <rx h %d p %d id %d", header->hdr_len,
496 header->packet_len, header->packet_id);
497#endif
498 dev->frame_errors = 0;
499 return 1;
500}
501
502static struct sk_buff *
503net1080_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags)
504{
505 int padlen;
506 struct sk_buff *skb2;
507 struct nc_header *header = NULL;
508 struct nc_trailer *trailer = NULL;
509 int len = skb->len;
510
511 padlen = ((len + sizeof (struct nc_header)
512 + sizeof (struct nc_trailer)) & 0x01) ? 0 : 1;
513 if (!skb_cloned(skb)) {
514 int headroom = skb_headroom(skb);
515 int tailroom = skb_tailroom(skb);
516
517 if ((padlen + sizeof (struct nc_trailer)) <= tailroom
518 && sizeof (struct nc_header) <= headroom)
519 /* There's enough head and tail room */
520 goto encapsulate;
521
522 if ((sizeof (struct nc_header) + padlen
523 + sizeof (struct nc_trailer)) <
524 (headroom + tailroom)) {
525 /* There's enough total room, so just readjust */
526 skb->data = memmove(skb->head
527 + sizeof (struct nc_header),
528 skb->data, skb->len);
529 skb->tail = skb->data + len;
530 goto encapsulate;
531 }
532 }
533
534 /* Create a new skb to use with the correct size */
535 skb2 = skb_copy_expand(skb,
536 sizeof (struct nc_header),
537 sizeof (struct nc_trailer) + padlen,
538 flags);
539 dev_kfree_skb_any(skb);
540 if (!skb2)
541 return skb2;
542 skb = skb2;
543
544encapsulate:
545 /* header first */
546 header = (struct nc_header *) skb_push(skb, sizeof *header);
547 header->hdr_len = cpu_to_le16(sizeof (*header));
548 header->packet_len = cpu_to_le16(len);
549 header->packet_id = cpu_to_le16((u16)dev->xid++);
550
551 /* maybe pad; then trailer */
552 if (!((skb->len + sizeof *trailer) & 0x01))
553 *skb_put(skb, 1) = PAD_BYTE;
554 trailer = (struct nc_trailer *) skb_put(skb, sizeof *trailer);
555 put_unaligned(header->packet_id, &trailer->packet_id);
556#if 0
557 devdbg(dev, "frame >tx h %d p %d id %d",
558 header->hdr_len, header->packet_len,
559 header->packet_id);
560#endif
561 return skb;
562}
563
564static int net1080_bind(struct usbnet *dev, struct usb_interface *intf)
565{
566 unsigned extra = sizeof (struct nc_header)
567 + 1
568 + sizeof (struct nc_trailer);
569
570 dev->net->hard_header_len += extra;
571 dev->rx_urb_size = dev->net->hard_header_len + dev->net->mtu;
572 dev->hard_mtu = NC_MAX_PACKET;
573 return usbnet_get_endpoints (dev, intf);
574}
575
576static const struct driver_info net1080_info = {
577 .description = "NetChip TurboCONNECT",
578 .flags = FLAG_FRAMING_NC,
579 .bind = net1080_bind,
580 .reset = net1080_reset,
581 .check_connect = net1080_check_connect,
582 .rx_fixup = net1080_rx_fixup,
583 .tx_fixup = net1080_tx_fixup,
584};
585
586static const struct usb_device_id products [] = {
587{
588 USB_DEVICE(0x0525, 0x1080), // NetChip ref design
589 .driver_info = (unsigned long) &net1080_info,
590}, {
591 USB_DEVICE(0x06D0, 0x0622), // Laplink Gold
592 .driver_info = (unsigned long) &net1080_info,
593},
594 { }, // END
595};
596MODULE_DEVICE_TABLE(usb, products);
597
598static struct usb_driver net1080_driver = {
599 .owner = THIS_MODULE,
600 .name = "net1080",
601 .id_table = products,
602 .probe = usbnet_probe,
603 .disconnect = usbnet_disconnect,
604 .suspend = usbnet_suspend,
605 .resume = usbnet_resume,
606};
607
608static int __init net1080_init(void)
609{
610 return usb_register(&net1080_driver);
611}
612module_init(net1080_init);
613
614static void __exit net1080_exit(void)
615{
616 usb_deregister(&net1080_driver);
617}
618module_exit(net1080_exit);
619
620MODULE_AUTHOR("David Brownell");
621MODULE_DESCRIPTION("NetChip 1080 based USB Host-to-Host Links");
622MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
index fcd6d3ccef44..7484d34780fc 100644
--- a/drivers/usb/net/pegasus.c
+++ b/drivers/usb/net/pegasus.c
@@ -825,7 +825,6 @@ static void pegasus_tx_timeout(struct net_device *net)
825 pegasus_t *pegasus = netdev_priv(net); 825 pegasus_t *pegasus = netdev_priv(net);
826 if (netif_msg_timer(pegasus)) 826 if (netif_msg_timer(pegasus))
827 printk(KERN_WARNING "%s: tx timeout\n", net->name); 827 printk(KERN_WARNING "%s: tx timeout\n", net->name);
828 pegasus->tx_urb->transfer_flags |= URB_ASYNC_UNLINK;
829 usb_unlink_urb(pegasus->tx_urb); 828 usb_unlink_urb(pegasus->tx_urb);
830 pegasus->stats.tx_errors++; 829 pegasus->stats.tx_errors++;
831} 830}
diff --git a/drivers/usb/net/plusb.c b/drivers/usb/net/plusb.c
new file mode 100644
index 000000000000..74c2b3581c76
--- /dev/null
+++ b/drivers/usb/net/plusb.c
@@ -0,0 +1,156 @@
1/*
2 * PL-2301/2302 USB host-to-host link cables
3 * Copyright (C) 2000-2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20// #define DEBUG // error path messages, extra info
21// #define VERBOSE // more; success messages
22
23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h>
28#include <linux/sched.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/ethtool.h>
33#include <linux/workqueue.h>
34#include <linux/mii.h>
35#include <linux/usb.h>
36
37#include "usbnet.h"
38
39
40/*
41 * Prolific PL-2301/PL-2302 driver ... http://www.prolifictech.com
42 *
43 * The protocol and handshaking used here should be bug-compatible
44 * with the Linux 2.2 "plusb" driver, by Deti Fliegl.
45 *
46 * HEADS UP: this handshaking isn't all that robust. This driver
47 * gets confused easily if you unplug one end of the cable then
48 * try to connect it again; you'll need to restart both ends. The
49 * "naplink" software (used by some PlayStation/2 deveopers) does
50 * the handshaking much better! Also, sometimes this hardware
51 * seems to get wedged under load. Prolific docs are weak, and
52 * don't identify differences between PL2301 and PL2302, much less
53 * anything to explain the different PL2302 versions observed.
54 */
55
56/*
57 * Bits 0-4 can be used for software handshaking; they're set from
58 * one end, cleared from the other, "read" with the interrupt byte.
59 */
60#define PL_S_EN (1<<7) /* (feature only) suspend enable */
61/* reserved bit -- rx ready (6) ? */
62#define PL_TX_READY (1<<5) /* (interrupt only) transmit ready */
63#define PL_RESET_OUT (1<<4) /* reset output pipe */
64#define PL_RESET_IN (1<<3) /* reset input pipe */
65#define PL_TX_C (1<<2) /* transmission complete */
66#define PL_TX_REQ (1<<1) /* transmission received */
67#define PL_PEER_E (1<<0) /* peer exists */
68
69static inline int
70pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index)
71{
72 return usb_control_msg(dev->udev,
73 usb_rcvctrlpipe(dev->udev, 0),
74 req,
75 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
76 val, index,
77 NULL, 0,
78 USB_CTRL_GET_TIMEOUT);
79}
80
81static inline int
82pl_clear_QuickLink_features(struct usbnet *dev, int val)
83{
84 return pl_vendor_req(dev, 1, (u8) val, 0);
85}
86
87static inline int
88pl_set_QuickLink_features(struct usbnet *dev, int val)
89{
90 return pl_vendor_req(dev, 3, (u8) val, 0);
91}
92
93static int pl_reset(struct usbnet *dev)
94{
95 /* some units seem to need this reset, others reject it utterly.
96 * FIXME be more like "naplink" or windows drivers.
97 */
98 (void) pl_set_QuickLink_features(dev,
99 PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E);
100 return 0;
101}
102
103static const struct driver_info prolific_info = {
104 .description = "Prolific PL-2301/PL-2302",
105 .flags = FLAG_NO_SETINT,
106 /* some PL-2302 versions seem to fail usb_set_interface() */
107 .reset = pl_reset,
108};
109
110
111/*-------------------------------------------------------------------------*/
112
113/*
114 * Proilific's name won't normally be on the cables, and
115 * may not be on the device.
116 */
117
118static const struct usb_device_id products [] = {
119
120{
121 USB_DEVICE(0x067b, 0x0000), // PL-2301
122 .driver_info = (unsigned long) &prolific_info,
123}, {
124 USB_DEVICE(0x067b, 0x0001), // PL-2302
125 .driver_info = (unsigned long) &prolific_info,
126},
127
128 { }, // END
129};
130MODULE_DEVICE_TABLE(usb, products);
131
132static struct usb_driver plusb_driver = {
133 .owner = THIS_MODULE,
134 .name = "plusb",
135 .id_table = products,
136 .probe = usbnet_probe,
137 .disconnect = usbnet_disconnect,
138 .suspend = usbnet_suspend,
139 .resume = usbnet_resume,
140};
141
142static int __init plusb_init(void)
143{
144 return usb_register(&plusb_driver);
145}
146module_init(plusb_init);
147
148static void __exit plusb_exit(void)
149{
150 usb_deregister(&plusb_driver);
151}
152module_exit(plusb_exit);
153
154MODULE_AUTHOR("David Brownell");
155MODULE_DESCRIPTION("Prolific PL-2301/2302 USB Host to Host Link Driver");
156MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c
new file mode 100644
index 000000000000..2ed2e5fb7778
--- /dev/null
+++ b/drivers/usb/net/rndis_host.c
@@ -0,0 +1,615 @@
1/*
2 * Host Side support for RNDIS Networking Links
3 * Copyright (C) 2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20// #define DEBUG // error path messages, extra info
21// #define VERBOSE // more; success messages
22
23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h>
28#include <linux/sched.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/etherdevice.h>
32#include <linux/ethtool.h>
33#include <linux/workqueue.h>
34#include <linux/mii.h>
35#include <linux/usb.h>
36#include <linux/usb_cdc.h>
37
38#include "usbnet.h"
39
40
41/*
42 * RNDIS is NDIS remoted over USB. It's a MSFT variant of CDC ACM ... of
43 * course ACM was intended for modems, not Ethernet links! USB's standard
44 * for Ethernet links is "CDC Ethernet", which is significantly simpler.
45 */
46
47/*
48 * CONTROL uses CDC "encapsulated commands" with funky notifications.
49 * - control-out: SEND_ENCAPSULATED
50 * - interrupt-in: RESPONSE_AVAILABLE
51 * - control-in: GET_ENCAPSULATED
52 *
53 * We'll try to ignore the RESPONSE_AVAILABLE notifications.
54 */
55struct rndis_msg_hdr {
56 __le32 msg_type; /* RNDIS_MSG_* */
57 __le32 msg_len;
58 // followed by data that varies between messages
59 __le32 request_id;
60 __le32 status;
61 // ... and more
62} __attribute__ ((packed));
63
64/* RNDIS defines this (absurdly huge) control timeout */
65#define RNDIS_CONTROL_TIMEOUT_MS (10 * 1000)
66
67
68#define ccpu2 __constant_cpu_to_le32
69
70#define RNDIS_MSG_COMPLETION ccpu2(0x80000000)
71
72/* codes for "msg_type" field of rndis messages;
73 * only the data channel uses packet messages (maybe batched);
74 * everything else goes on the control channel.
75 */
76#define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */
77#define RNDIS_MSG_INIT ccpu2(0x00000002)
78#define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION)
79#define RNDIS_MSG_HALT ccpu2(0x00000003)
80#define RNDIS_MSG_QUERY ccpu2(0x00000004)
81#define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION)
82#define RNDIS_MSG_SET ccpu2(0x00000005)
83#define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION)
84#define RNDIS_MSG_RESET ccpu2(0x00000006)
85#define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION)
86#define RNDIS_MSG_INDICATE ccpu2(0x00000007)
87#define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008)
88#define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION)
89
90/* codes for "status" field of completion messages */
91#define RNDIS_STATUS_SUCCESS ccpu2(0x00000000)
92#define RNDIS_STATUS_FAILURE ccpu2(0xc0000001)
93#define RNDIS_STATUS_INVALID_DATA ccpu2(0xc0010015)
94#define RNDIS_STATUS_NOT_SUPPORTED ccpu2(0xc00000bb)
95#define RNDIS_STATUS_MEDIA_CONNECT ccpu2(0x4001000b)
96#define RNDIS_STATUS_MEDIA_DISCONNECT ccpu2(0x4001000c)
97
98
99struct rndis_data_hdr {
100 __le32 msg_type; /* RNDIS_MSG_PACKET */
101 __le32 msg_len; // rndis_data_hdr + data_len + pad
102 __le32 data_offset; // 36 -- right after header
103 __le32 data_len; // ... real packet size
104
105 __le32 oob_data_offset; // zero
106 __le32 oob_data_len; // zero
107 __le32 num_oob; // zero
108 __le32 packet_data_offset; // zero
109
110 __le32 packet_data_len; // zero
111 __le32 vc_handle; // zero
112 __le32 reserved; // zero
113} __attribute__ ((packed));
114
115struct rndis_init { /* OUT */
116 // header and:
117 __le32 msg_type; /* RNDIS_MSG_INIT */
118 __le32 msg_len; // 24
119 __le32 request_id;
120 __le32 major_version; // of rndis (1.0)
121 __le32 minor_version;
122 __le32 max_transfer_size;
123} __attribute__ ((packed));
124
125struct rndis_init_c { /* IN */
126 // header and:
127 __le32 msg_type; /* RNDIS_MSG_INIT_C */
128 __le32 msg_len;
129 __le32 request_id;
130 __le32 status;
131 __le32 major_version; // of rndis (1.0)
132 __le32 minor_version;
133 __le32 device_flags;
134 __le32 medium; // zero == 802.3
135 __le32 max_packets_per_message;
136 __le32 max_transfer_size;
137 __le32 packet_alignment; // max 7; (1<<n) bytes
138 __le32 af_list_offset; // zero
139 __le32 af_list_size; // zero
140} __attribute__ ((packed));
141
142struct rndis_halt { /* OUT (no reply) */
143 // header and:
144 __le32 msg_type; /* RNDIS_MSG_HALT */
145 __le32 msg_len;
146 __le32 request_id;
147} __attribute__ ((packed));
148
149struct rndis_query { /* OUT */
150 // header and:
151 __le32 msg_type; /* RNDIS_MSG_QUERY */
152 __le32 msg_len;
153 __le32 request_id;
154 __le32 oid;
155 __le32 len;
156 __le32 offset;
157/*?*/ __le32 handle; // zero
158} __attribute__ ((packed));
159
160struct rndis_query_c { /* IN */
161 // header and:
162 __le32 msg_type; /* RNDIS_MSG_QUERY_C */
163 __le32 msg_len;
164 __le32 request_id;
165 __le32 status;
166 __le32 len;
167 __le32 offset;
168} __attribute__ ((packed));
169
170struct rndis_set { /* OUT */
171 // header and:
172 __le32 msg_type; /* RNDIS_MSG_SET */
173 __le32 msg_len;
174 __le32 request_id;
175 __le32 oid;
176 __le32 len;
177 __le32 offset;
178/*?*/ __le32 handle; // zero
179} __attribute__ ((packed));
180
181struct rndis_set_c { /* IN */
182 // header and:
183 __le32 msg_type; /* RNDIS_MSG_SET_C */
184 __le32 msg_len;
185 __le32 request_id;
186 __le32 status;
187} __attribute__ ((packed));
188
189struct rndis_reset { /* IN */
190 // header and:
191 __le32 msg_type; /* RNDIS_MSG_RESET */
192 __le32 msg_len;
193 __le32 reserved;
194} __attribute__ ((packed));
195
196struct rndis_reset_c { /* OUT */
197 // header and:
198 __le32 msg_type; /* RNDIS_MSG_RESET_C */
199 __le32 msg_len;
200 __le32 status;
201 __le32 addressing_lost;
202} __attribute__ ((packed));
203
204struct rndis_indicate { /* IN (unrequested) */
205 // header and:
206 __le32 msg_type; /* RNDIS_MSG_INDICATE */
207 __le32 msg_len;
208 __le32 status;
209 __le32 length;
210 __le32 offset;
211/**/ __le32 diag_status;
212 __le32 error_offset;
213/**/ __le32 message;
214} __attribute__ ((packed));
215
216struct rndis_keepalive { /* OUT (optionally IN) */
217 // header and:
218 __le32 msg_type; /* RNDIS_MSG_KEEPALIVE */
219 __le32 msg_len;
220 __le32 request_id;
221} __attribute__ ((packed));
222
223struct rndis_keepalive_c { /* IN (optionally OUT) */
224 // header and:
225 __le32 msg_type; /* RNDIS_MSG_KEEPALIVE_C */
226 __le32 msg_len;
227 __le32 request_id;
228 __le32 status;
229} __attribute__ ((packed));
230
231/* NOTE: about 30 OIDs are "mandatory" for peripherals to support ... and
232 * there are gobs more that may optionally be supported. We'll avoid as much
233 * of that mess as possible.
234 */
235#define OID_802_3_PERMANENT_ADDRESS ccpu2(0x01010101)
236#define OID_GEN_CURRENT_PACKET_FILTER ccpu2(0x0001010e)
237
238/*
239 * RNDIS notifications from device: command completion; "reverse"
240 * keepalives; etc
241 */
242static void rndis_status(struct usbnet *dev, struct urb *urb)
243{
244 devdbg(dev, "rndis status urb, len %d stat %d",
245 urb->actual_length, urb->status);
246 // FIXME for keepalives, respond immediately (asynchronously)
247 // if not an RNDIS status, do like cdc_status(dev,urb) does
248}
249
250/*
251 * RPC done RNDIS-style. Caller guarantees:
252 * - message is properly byteswapped
253 * - there's no other request pending
254 * - buf can hold up to 1KB response (required by RNDIS spec)
255 * On return, the first few entries are already byteswapped.
256 *
257 * Call context is likely probe(), before interface name is known,
258 * which is why we won't try to use it in the diagnostics.
259 */
260static int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
261{
262 struct cdc_state *info = (void *) &dev->data;
263 int retval;
264 unsigned count;
265 __le32 rsp;
266 u32 xid = 0, msg_len, request_id;
267
268 /* REVISIT when this gets called from contexts other than probe() or
269 * disconnect(): either serialize, or dispatch responses on xid
270 */
271
272 /* Issue the request; don't bother byteswapping our xid */
273 if (likely(buf->msg_type != RNDIS_MSG_HALT
274 && buf->msg_type != RNDIS_MSG_RESET)) {
275 xid = dev->xid++;
276 if (!xid)
277 xid = dev->xid++;
278 buf->request_id = (__force __le32) xid;
279 }
280 retval = usb_control_msg(dev->udev,
281 usb_sndctrlpipe(dev->udev, 0),
282 USB_CDC_SEND_ENCAPSULATED_COMMAND,
283 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
284 0, info->u->bMasterInterface0,
285 buf, le32_to_cpu(buf->msg_len),
286 RNDIS_CONTROL_TIMEOUT_MS);
287 if (unlikely(retval < 0 || xid == 0))
288 return retval;
289
290 // FIXME Seems like some devices discard responses when
291 // we time out and cancel our "get response" requests...
292 // so, this is fragile. Probably need to poll for status.
293
294 /* ignore status endpoint, just poll the control channel;
295 * the request probably completed immediately
296 */
297 rsp = buf->msg_type | RNDIS_MSG_COMPLETION;
298 for (count = 0; count < 10; count++) {
299 memset(buf, 0, 1024);
300 retval = usb_control_msg(dev->udev,
301 usb_rcvctrlpipe(dev->udev, 0),
302 USB_CDC_GET_ENCAPSULATED_RESPONSE,
303 USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
304 0, info->u->bMasterInterface0,
305 buf, 1024,
306 RNDIS_CONTROL_TIMEOUT_MS);
307 if (likely(retval >= 8)) {
308 msg_len = le32_to_cpu(buf->msg_len);
309 request_id = (__force u32) buf->request_id;
310 if (likely(buf->msg_type == rsp)) {
311 if (likely(request_id == xid)) {
312 if (unlikely(rsp == RNDIS_MSG_RESET_C))
313 return 0;
314 if (likely(RNDIS_STATUS_SUCCESS
315 == buf->status))
316 return 0;
317 dev_dbg(&info->control->dev,
318 "rndis reply status %08x\n",
319 le32_to_cpu(buf->status));
320 return -EL3RST;
321 }
322 dev_dbg(&info->control->dev,
323 "rndis reply id %d expected %d\n",
324 request_id, xid);
325 /* then likely retry */
326 } else switch (buf->msg_type) {
327 case RNDIS_MSG_INDICATE: { /* fault */
328 // struct rndis_indicate *msg = (void *)buf;
329 dev_info(&info->control->dev,
330 "rndis fault indication\n");
331 }
332 break;
333 case RNDIS_MSG_KEEPALIVE: { /* ping */
334 struct rndis_keepalive_c *msg = (void *)buf;
335
336 msg->msg_type = RNDIS_MSG_KEEPALIVE_C;
337 msg->msg_len = ccpu2(sizeof *msg);
338 msg->status = RNDIS_STATUS_SUCCESS;
339 retval = usb_control_msg(dev->udev,
340 usb_sndctrlpipe(dev->udev, 0),
341 USB_CDC_SEND_ENCAPSULATED_COMMAND,
342 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
343 0, info->u->bMasterInterface0,
344 msg, sizeof *msg,
345 RNDIS_CONTROL_TIMEOUT_MS);
346 if (unlikely(retval < 0))
347 dev_dbg(&info->control->dev,
348 "rndis keepalive err %d\n",
349 retval);
350 }
351 break;
352 default:
353 dev_dbg(&info->control->dev,
354 "unexpected rndis msg %08x len %d\n",
355 le32_to_cpu(buf->msg_type), msg_len);
356 }
357 } else {
358 /* device probably issued a protocol stall; ignore */
359 dev_dbg(&info->control->dev,
360 "rndis response error, code %d\n", retval);
361 }
362 msleep(2);
363 }
364 dev_dbg(&info->control->dev, "rndis response timeout\n");
365 return -ETIMEDOUT;
366}
367
368static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
369{
370 int retval;
371 struct net_device *net = dev->net;
372 union {
373 void *buf;
374 struct rndis_msg_hdr *header;
375 struct rndis_init *init;
376 struct rndis_init_c *init_c;
377 struct rndis_query *get;
378 struct rndis_query_c *get_c;
379 struct rndis_set *set;
380 struct rndis_set_c *set_c;
381 } u;
382 u32 tmp;
383
384 /* we can't rely on i/o from stack working, or stack allocation */
385 u.buf = kmalloc(1024, GFP_KERNEL);
386 if (!u.buf)
387 return -ENOMEM;
388 retval = usbnet_generic_cdc_bind(dev, intf);
389 if (retval < 0)
390 goto done;
391
392 net->hard_header_len += sizeof (struct rndis_data_hdr);
393
394 /* initialize; max transfer is 16KB at full speed */
395 u.init->msg_type = RNDIS_MSG_INIT;
396 u.init->msg_len = ccpu2(sizeof *u.init);
397 u.init->major_version = ccpu2(1);
398 u.init->minor_version = ccpu2(0);
399 u.init->max_transfer_size = ccpu2(net->mtu + net->hard_header_len);
400
401 retval = rndis_command(dev, u.header);
402 if (unlikely(retval < 0)) {
403 /* it might not even be an RNDIS device!! */
404 dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
405fail:
406 usb_driver_release_interface(driver_of(intf),
407 ((struct cdc_state *)&(dev->data))->data);
408 goto done;
409 }
410 dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size);
411 /* REVISIT: peripheral "alignment" request is ignored ... */
412 dev_dbg(&intf->dev, "hard mtu %u, align %d\n", dev->hard_mtu,
413 1 << le32_to_cpu(u.init_c->packet_alignment));
414
415 /* get designated host ethernet address */
416 memset(u.get, 0, sizeof *u.get);
417 u.get->msg_type = RNDIS_MSG_QUERY;
418 u.get->msg_len = ccpu2(sizeof *u.get);
419 u.get->oid = OID_802_3_PERMANENT_ADDRESS;
420
421 retval = rndis_command(dev, u.header);
422 if (unlikely(retval < 0)) {
423 dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval);
424 goto fail;
425 }
426 tmp = le32_to_cpu(u.get_c->offset);
427 if (unlikely((tmp + 8) > (1024 - ETH_ALEN)
428 || u.get_c->len != ccpu2(ETH_ALEN))) {
429 dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n",
430 tmp, le32_to_cpu(u.get_c->len));
431 retval = -EDOM;
432 goto fail;
433 }
434 memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN);
435
436 /* set a nonzero filter to enable data transfers */
437 memset(u.set, 0, sizeof *u.set);
438 u.set->msg_type = RNDIS_MSG_SET;
439 u.set->msg_len = ccpu2(4 + sizeof *u.set);
440 u.set->oid = OID_GEN_CURRENT_PACKET_FILTER;
441 u.set->len = ccpu2(4);
442 u.set->offset = ccpu2((sizeof *u.set) - 8);
443 *(__le32 *)(u.buf + sizeof *u.set) = ccpu2(DEFAULT_FILTER);
444
445 retval = rndis_command(dev, u.header);
446 if (unlikely(retval < 0)) {
447 dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
448 goto fail;
449 }
450
451 retval = 0;
452done:
453 kfree(u.buf);
454 return retval;
455}
456
457static void rndis_unbind(struct usbnet *dev, struct usb_interface *intf)
458{
459 struct rndis_halt *halt;
460
461 /* try to clear any rndis state/activity (no i/o from stack!) */
462 halt = kcalloc(1, sizeof *halt, SLAB_KERNEL);
463 if (halt) {
464 halt->msg_type = RNDIS_MSG_HALT;
465 halt->msg_len = ccpu2(sizeof *halt);
466 (void) rndis_command(dev, (void *)halt);
467 kfree(halt);
468 }
469
470 return usbnet_cdc_unbind(dev, intf);
471}
472
473/*
474 * DATA -- host must not write zlps
475 */
476static int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
477{
478 /* peripheral may have batched packets to us... */
479 while (likely(skb->len)) {
480 struct rndis_data_hdr *hdr = (void *)skb->data;
481 struct sk_buff *skb2;
482 u32 msg_len, data_offset, data_len;
483
484 msg_len = le32_to_cpu(hdr->msg_len);
485 data_offset = le32_to_cpu(hdr->data_offset);
486 data_len = le32_to_cpu(hdr->data_len);
487
488 /* don't choke if we see oob, per-packet data, etc */
489 if (unlikely(hdr->msg_type != RNDIS_MSG_PACKET
490 || skb->len < msg_len
491 || (data_offset + data_len + 8) > msg_len)) {
492 dev->stats.rx_frame_errors++;
493 devdbg(dev, "bad rndis message %d/%d/%d/%d, len %d",
494 le32_to_cpu(hdr->msg_type),
495 msg_len, data_offset, data_len, skb->len);
496 return 0;
497 }
498 skb_pull(skb, 8 + data_offset);
499
500 /* at most one packet left? */
501 if (likely((data_len - skb->len) <= sizeof *hdr)) {
502 skb_trim(skb, data_len);
503 break;
504 }
505
506 /* try to return all the packets in the batch */
507 skb2 = skb_clone(skb, GFP_ATOMIC);
508 if (unlikely(!skb2))
509 break;
510 skb_pull(skb, msg_len - sizeof *hdr);
511 skb_trim(skb2, data_len);
512 usbnet_skb_return(dev, skb2);
513 }
514
515 /* caller will usbnet_skb_return the remaining packet */
516 return 1;
517}
518
519static struct sk_buff *
520rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags)
521{
522 struct rndis_data_hdr *hdr;
523 struct sk_buff *skb2;
524 unsigned len = skb->len;
525
526 if (likely(!skb_cloned(skb))) {
527 int room = skb_headroom(skb);
528
529 /* enough head room as-is? */
530 if (unlikely((sizeof *hdr) <= room))
531 goto fill;
532
533 /* enough room, but needs to be readjusted? */
534 room += skb_tailroom(skb);
535 if (likely((sizeof *hdr) <= room)) {
536 skb->data = memmove(skb->head + sizeof *hdr,
537 skb->data, len);
538 skb->tail = skb->data + len;
539 goto fill;
540 }
541 }
542
543 /* create a new skb, with the correct size (and tailpad) */
544 skb2 = skb_copy_expand(skb, sizeof *hdr, 1, flags);
545 dev_kfree_skb_any(skb);
546 if (unlikely(!skb2))
547 return skb2;
548 skb = skb2;
549
550 /* fill out the RNDIS header. we won't bother trying to batch
551 * packets; Linux minimizes wasted bandwidth through tx queues.
552 */
553fill:
554 hdr = (void *) __skb_push(skb, sizeof *hdr);
555 memset(hdr, 0, sizeof *hdr);
556 hdr->msg_type = RNDIS_MSG_PACKET;
557 hdr->msg_len = cpu_to_le32(skb->len);
558 hdr->data_offset = ccpu2(sizeof(*hdr) - 8);
559 hdr->data_len = cpu_to_le32(len);
560
561 /* FIXME make the last packet always be short ... */
562 return skb;
563}
564
565
566static const struct driver_info rndis_info = {
567 .description = "RNDIS device",
568 .flags = FLAG_ETHER | FLAG_FRAMING_RN,
569 .bind = rndis_bind,
570 .unbind = rndis_unbind,
571 .status = rndis_status,
572 .rx_fixup = rndis_rx_fixup,
573 .tx_fixup = rndis_tx_fixup,
574};
575
576#undef ccpu2
577
578
579/*-------------------------------------------------------------------------*/
580
581static const struct usb_device_id products [] = {
582{
583 /* RNDIS is MSFT's un-official variant of CDC ACM */
584 USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff),
585 .driver_info = (unsigned long) &rndis_info,
586},
587 { }, // END
588};
589MODULE_DEVICE_TABLE(usb, products);
590
591static struct usb_driver rndis_driver = {
592 .owner = THIS_MODULE,
593 .name = "rndis_host",
594 .id_table = products,
595 .probe = usbnet_probe,
596 .disconnect = usbnet_disconnect,
597 .suspend = usbnet_suspend,
598 .resume = usbnet_resume,
599};
600
601static int __init rndis_init(void)
602{
603 return usb_register(&rndis_driver);
604}
605module_init(rndis_init);
606
607static void __exit rndis_exit(void)
608{
609 usb_deregister(&rndis_driver);
610}
611module_exit(rndis_exit);
612
613MODULE_AUTHOR("David Brownell");
614MODULE_DESCRIPTION("USB Host side RNDIS driver");
615MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c
index 59ab40ebb394..c3d4e3589e30 100644
--- a/drivers/usb/net/rtl8150.c
+++ b/drivers/usb/net/rtl8150.c
@@ -653,7 +653,6 @@ static void rtl8150_tx_timeout(struct net_device *netdev)
653{ 653{
654 rtl8150_t *dev = netdev_priv(netdev); 654 rtl8150_t *dev = netdev_priv(netdev);
655 warn("%s: Tx timeout.", netdev->name); 655 warn("%s: Tx timeout.", netdev->name);
656 dev->tx_urb->transfer_flags |= URB_ASYNC_UNLINK;
657 usb_unlink_urb(dev->tx_urb); 656 usb_unlink_urb(dev->tx_urb);
658 dev->stats.tx_errors++; 657 dev->stats.tx_errors++;
659} 658}
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
index a2f67245f6da..6c460918d54f 100644
--- a/drivers/usb/net/usbnet.c
+++ b/drivers/usb/net/usbnet.c
@@ -1,10 +1,7 @@
1/* 1/*
2 * USB Networking Links 2 * USB Network driver infrastructure
3 * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net> 3 * Copyright (C) 2000-2005 by David Brownell
4 * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz>
5 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 4 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
6 * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net>
7 * Copyright (c) 2002-2003 TiVo Inc.
8 * 5 *
9 * This program is free software; you can redistribute it and/or modify 6 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 7 * it under the terms of the GNU General Public License as published by
@@ -23,95 +20,15 @@
23 20
24/* 21/*
25 * This is a generic "USB networking" framework that works with several 22 * This is a generic "USB networking" framework that works with several
26 * kinds of full and high speed networking devices: 23 * kinds of full and high speed networking devices: host-to-host cables,
27 * 24 * smart usb peripherals, and actual Ethernet adapters.
28 * + USB host-to-host "network cables", used for IP-over-USB links. 25 *
29 * These are often used for Laplink style connectivity products. 26 * These devices usually differ in terms of control protocols (if they
30 * - AnchorChip 2720 27 * even have one!) and sometimes they define new framing to wrap or batch
31 * - Belkin, eTEK (interops with Win32 drivers) 28 * Ethernet packets. Otherwise, they talk to USB pretty much the same,
32 * - GeneSys GL620USB-A 29 * so interface (un)binding, endpoint I/O queues, fault handling, and other
33 * - NetChip 1080 (interoperates with NetChip Win32 drivers) 30 * issues can usefully be addressed by this framework.
34 * - Prolific PL-2301/2302 (replaces "plusb" driver) 31 */
35 * - KC Technology KC2190
36 *
37 * + Smart USB devices can support such links directly, using Internet
38 * standard protocols instead of proprietary host-to-device links.
39 * - Linux PDAs like iPaq, Yopy, and Zaurus
40 * - The BLOB boot loader (for diskless booting)
41 * - Linux "gadgets", perhaps using PXA-2xx or Net2280 controllers
42 * - Devices using EPSON's sample USB firmware
43 * - CDC-Ethernet class devices, such as many cable modems
44 *
45 * + Adapters to networks such as Ethernet.
46 * - AX8817X based USB 2.0 products
47 *
48 * Links to these devices can be bridged using Linux Ethernet bridging.
49 * With minor exceptions, these all use similar USB framing for network
50 * traffic, but need different protocols for control traffic.
51 *
52 * USB devices can implement their side of this protocol at the cost
53 * of two bulk endpoints; it's not restricted to "cable" applications.
54 * See the SA1110, Zaurus, or EPSON device/client support in this driver;
55 * slave/target drivers such as "usb-eth" (on most SA-1100 PDAs) or
56 * "g_ether" (in the Linux "gadget" framework) implement that behavior
57 * within devices.
58 *
59 *
60 * CHANGELOG:
61 *
62 * 13-sep-2000 experimental, new
63 * 10-oct-2000 usb_device_id table created.
64 * 28-oct-2000 misc fixes; mostly, discard more TTL-mangled rx packets.
65 * 01-nov-2000 usb_device_id table and probing api update by
66 * Adam J. Richter <adam@yggdrasil.com>.
67 * 18-dec-2000 (db) tx watchdog, "net1080" renaming to "usbnet", device_info
68 * and prolific support, isolate net1080-specific bits, cleanup.
69 * fix unlink_urbs oops in D3 PM resume code path.
70 *
71 * 02-feb-2001 (db) fix tx skb sharing, packet length, match_flags, ...
72 * 08-feb-2001 stubbed in "linuxdev", maybe the SA-1100 folk can use it;
73 * AnchorChips 2720 support (from spec) for testing;
74 * fix bit-ordering problem with ethernet multicast addr
75 * 19-feb-2001 Support for clearing halt conditions. SA1100 UDC support
76 * updates. Oleg Drokin (green@iXcelerator.com)
77 * 25-mar-2001 More SA-1100 updates, including workaround for ip problem
78 * expecting cleared skb->cb and framing change to match latest
79 * handhelds.org version (Oleg). Enable device IDs from the
80 * Win32 Belkin driver; other cleanups (db).
81 * 16-jul-2001 Bugfixes for uhci oops-on-unplug, Belkin support, various
82 * cleanups for problems not yet seen in the field. (db)
83 * 17-oct-2001 Handle "Advance USBNET" product, like Belkin/eTEK devices,
84 * from Ioannis Mavroukakis <i.mavroukakis@btinternet.com>;
85 * rx unlinks somehow weren't async; minor cleanup.
86 * 03-nov-2001 Merged GeneSys driver; original code from Jiun-Jie Huang
87 * <huangjj@genesyslogic.com.tw>, updated by Stanislav Brabec
88 * <utx@penguin.cz>. Made framing options (NetChip/GeneSys)
89 * tie mostly to (sub)driver info. Workaround some PL-2302
90 * chips that seem to reject SET_INTERFACE requests.
91 *
92 * 06-apr-2002 Added ethtool support, based on a patch from Brad Hards.
93 * Level of diagnostics is more configurable; they use device
94 * location (usb_device->devpath) instead of address (2.5).
95 * For tx_fixup, memflags can't be NOIO.
96 * 07-may-2002 Generalize/cleanup keventd support, handling rx stalls (mostly
97 * for USB 2.0 TTs) and memory shortages (potential) too. (db)
98 * Use "locally assigned" IEEE802 address space. (Brad Hards)
99 * 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db).
100 * 14-dec-2002 Remove Zaurus-private crc32 code (Pavel); 2.5 oops fix,
101 * cleanups and stubbed PXA-250 support (db), fix for framing
102 * issues on Z, net1080, and gl620a (Toby Milne)
103 *
104 * 31-mar-2003 Use endpoint descriptors: high speed support, simpler sa1100
105 * vs pxa25x, and CDC Ethernet. Throttle down log floods on
106 * disconnect; other cleanups. (db) Flush net1080 fifos
107 * after several sequential framing errors. (Johannes Erdfelt)
108 * 22-aug-2003 AX8817X support (Dave Hollis).
109 * 14-jun-2004 Trivial patch for AX8817X based Buffalo LUA-U2-KTX in Japan
110 * (Neil Bortnak)
111 * 03-nov-2004 Trivial patch for KC2190 (KC-190) chip. (Jonathan McDowell)
112 *
113 * 01-feb-2005 AX88772 support (Phil Chang & Dave Hollis)
114 *-------------------------------------------------------------------------*/
115 32
116// #define DEBUG // error path messages, extra info 33// #define DEBUG // error path messages, extra info
117// #define VERBOSE // more; success messages 34// #define VERBOSE // more; success messages
@@ -121,24 +38,18 @@
121# define DEBUG 38# define DEBUG
122#endif 39#endif
123#include <linux/module.h> 40#include <linux/module.h>
124#include <linux/kmod.h>
125#include <linux/sched.h> 41#include <linux/sched.h>
126#include <linux/init.h> 42#include <linux/init.h>
127#include <linux/netdevice.h> 43#include <linux/netdevice.h>
128#include <linux/etherdevice.h> 44#include <linux/etherdevice.h>
129#include <linux/random.h>
130#include <linux/ethtool.h> 45#include <linux/ethtool.h>
131#include <linux/workqueue.h> 46#include <linux/workqueue.h>
132#include <linux/mii.h> 47#include <linux/mii.h>
133#include <asm/uaccess.h>
134#include <asm/unaligned.h>
135#include <linux/usb.h> 48#include <linux/usb.h>
136#include <asm/io.h>
137#include <asm/scatterlist.h>
138#include <linux/mm.h>
139#include <linux/dma-mapping.h>
140 49
141#define DRIVER_VERSION "03-Nov-2004" 50#include "usbnet.h"
51
52#define DRIVER_VERSION "22-Aug-2005"
142 53
143 54
144/*-------------------------------------------------------------------------*/ 55/*-------------------------------------------------------------------------*/
@@ -149,15 +60,14 @@
149 * One maximum size Ethernet packet takes twenty four of them. 60 * One maximum size Ethernet packet takes twenty four of them.
150 * For high speed, each frame comfortably fits almost 36 max size 61 * For high speed, each frame comfortably fits almost 36 max size
151 * Ethernet packets (so queues should be bigger). 62 * Ethernet packets (so queues should be bigger).
63 *
64 * REVISIT qlens should be members of 'struct usbnet'; the goal is to
65 * let the USB host controller be busy for 5msec or more before an irq
66 * is required, under load. Jumbograms change the equation.
152 */ 67 */
153#define RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) 68#define RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4)
154#define TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) 69#define TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4)
155 70
156// packets are always ethernet inside
157// ... except they can be bigger (limit of 64K with NetChip framing)
158#define MIN_PACKET sizeof(struct ethhdr)
159#define MAX_PACKET 32768
160
161// reawaken network queue this soon after stopping; else watchdog barks 71// reawaken network queue this soon after stopping; else watchdog barks
162#define TX_TIMEOUT_JIFFIES (5*HZ) 72#define TX_TIMEOUT_JIFFIES (5*HZ)
163 73
@@ -165,9 +75,6 @@
165// us (it polls at HZ/4 usually) before we report too many false errors. 75// us (it polls at HZ/4 usually) before we report too many false errors.
166#define THROTTLE_JIFFIES (HZ/8) 76#define THROTTLE_JIFFIES (HZ/8)
167 77
168// for vendor-specific control operations
169#define CONTROL_TIMEOUT_MS 500
170
171// between wakeups 78// between wakeups
172#define UNLINK_TIMEOUT_MS 3 79#define UNLINK_TIMEOUT_MS 3
173 80
@@ -176,109 +83,6 @@
176// randomly generated ethernet address 83// randomly generated ethernet address
177static u8 node_id [ETH_ALEN]; 84static u8 node_id [ETH_ALEN];
178 85
179// state we keep for each device we handle
180struct usbnet {
181 // housekeeping
182 struct usb_device *udev;
183 struct driver_info *driver_info;
184 wait_queue_head_t *wait;
185
186 // i/o info: pipes etc
187 unsigned in, out;
188 struct usb_host_endpoint *status;
189 unsigned maxpacket;
190 struct timer_list delay;
191
192 // protocol/interface state
193 struct net_device *net;
194 struct net_device_stats stats;
195 int msg_enable;
196 unsigned long data [5];
197
198 struct mii_if_info mii;
199
200 // various kinds of pending driver work
201 struct sk_buff_head rxq;
202 struct sk_buff_head txq;
203 struct sk_buff_head done;
204 struct urb *interrupt;
205 struct tasklet_struct bh;
206
207 struct work_struct kevent;
208 unsigned long flags;
209# define EVENT_TX_HALT 0
210# define EVENT_RX_HALT 1
211# define EVENT_RX_MEMORY 2
212# define EVENT_STS_SPLIT 3
213# define EVENT_LINK_RESET 4
214};
215
216// device-specific info used by the driver
217struct driver_info {
218 char *description;
219
220 int flags;
221/* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */
222#define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */
223#define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */
224#define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */
225#define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */
226
227#define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */
228#define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */
229
230#define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */
231
232 /* init device ... can sleep, or cause probe() failure */
233 int (*bind)(struct usbnet *, struct usb_interface *);
234
235 /* cleanup device ... can sleep, but can't fail */
236 void (*unbind)(struct usbnet *, struct usb_interface *);
237
238 /* reset device ... can sleep */
239 int (*reset)(struct usbnet *);
240
241 /* see if peer is connected ... can sleep */
242 int (*check_connect)(struct usbnet *);
243
244 /* for status polling */
245 void (*status)(struct usbnet *, struct urb *);
246
247 /* link reset handling, called from defer_kevent */
248 int (*link_reset)(struct usbnet *);
249
250 /* fixup rx packet (strip framing) */
251 int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb);
252
253 /* fixup tx packet (add framing) */
254 struct sk_buff *(*tx_fixup)(struct usbnet *dev,
255 struct sk_buff *skb, int flags);
256
257 // FIXME -- also an interrupt mechanism
258 // useful for at least PL2301/2302 and GL620USB-A
259 // and CDC use them to report 'is it connected' changes
260
261 /* for new devices, use the descriptor-reading code instead */
262 int in; /* rx endpoint */
263 int out; /* tx endpoint */
264
265 unsigned long data; /* Misc driver specific data */
266};
267
268// we record the state for each of our queued skbs
269enum skb_state {
270 illegal = 0,
271 tx_start, tx_done,
272 rx_start, rx_done, rx_cleanup
273};
274
275struct skb_data { // skb->cb is one of these
276 struct urb *urb;
277 struct usbnet *dev;
278 enum skb_state state;
279 size_t length;
280};
281
282static const char driver_name [] = "usbnet"; 86static const char driver_name [] = "usbnet";
283 87
284/* use ethtool to change the level for any given device */ 88/* use ethtool to change the level for any given device */
@@ -286,39 +90,10 @@ static int msg_level = -1;
286module_param (msg_level, int, 0); 90module_param (msg_level, int, 0);
287MODULE_PARM_DESC (msg_level, "Override default message level"); 91MODULE_PARM_DESC (msg_level, "Override default message level");
288 92
289
290#ifdef DEBUG
291#define devdbg(usbnet, fmt, arg...) \
292 printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
293#else
294#define devdbg(usbnet, fmt, arg...) do {} while(0)
295#endif
296
297#define deverr(usbnet, fmt, arg...) \
298 printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
299#define devwarn(usbnet, fmt, arg...) \
300 printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
301
302#define devinfo(usbnet, fmt, arg...) \
303 printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \
304
305/*-------------------------------------------------------------------------*/ 93/*-------------------------------------------------------------------------*/
306 94
307static void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *);
308static u32 usbnet_get_link (struct net_device *);
309static u32 usbnet_get_msglevel (struct net_device *);
310static void usbnet_set_msglevel (struct net_device *, u32);
311static void defer_kevent (struct usbnet *, int);
312
313/* mostly for PDA style devices, which are always connected if present */
314static int always_connected (struct usbnet *dev)
315{
316 return 0;
317}
318
319/* handles CDC Ethernet and many other network "bulk data" interfaces */ 95/* handles CDC Ethernet and many other network "bulk data" interfaces */
320static int 96int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf)
321get_endpoints (struct usbnet *dev, struct usb_interface *intf)
322{ 97{
323 int tmp; 98 int tmp;
324 struct usb_host_interface *alt = NULL; 99 struct usb_host_interface *alt = NULL;
@@ -382,6 +157,7 @@ get_endpoints (struct usbnet *dev, struct usb_interface *intf)
382 dev->status = status; 157 dev->status = status;
383 return 0; 158 return 0;
384} 159}
160EXPORT_SYMBOL_GPL(usbnet_get_endpoints);
385 161
386static void intr_complete (struct urb *urb, struct pt_regs *regs); 162static void intr_complete (struct urb *urb, struct pt_regs *regs);
387 163
@@ -421,7 +197,11 @@ static int init_status (struct usbnet *dev, struct usb_interface *intf)
421 return 0; 197 return 0;
422} 198}
423 199
424static void skb_return (struct usbnet *dev, struct sk_buff *skb) 200/* Passes this packet up the stack, updating its accounting.
201 * Some link protocols batch packets, so their rx_fixup paths
202 * can return clones as well as just modify the original skb.
203 */
204void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)
425{ 205{
426 int status; 206 int status;
427 207
@@ -438,2425 +218,7 @@ static void skb_return (struct usbnet *dev, struct sk_buff *skb)
438 if (status != NET_RX_SUCCESS && netif_msg_rx_err (dev)) 218 if (status != NET_RX_SUCCESS && netif_msg_rx_err (dev))
439 devdbg (dev, "netif_rx status %d", status); 219 devdbg (dev, "netif_rx status %d", status);
440} 220}
441 221EXPORT_SYMBOL_GPL(usbnet_skb_return);
442
443#ifdef CONFIG_USB_ALI_M5632
444#define HAVE_HARDWARE
445
446/*-------------------------------------------------------------------------
447 *
448 * ALi M5632 driver ... does high speed
449 *
450 *-------------------------------------------------------------------------*/
451
452static const struct driver_info ali_m5632_info = {
453 .description = "ALi M5632",
454};
455
456
457#endif
458
459
460#ifdef CONFIG_USB_AN2720
461#define HAVE_HARDWARE
462
463/*-------------------------------------------------------------------------
464 *
465 * AnchorChips 2720 driver ... http://www.cypress.com
466 *
467 * This doesn't seem to have a way to detect whether the peer is
468 * connected, or need any reset handshaking. It's got pretty big
469 * internal buffers (handles most of a frame's worth of data).
470 * Chip data sheets don't describe any vendor control messages.
471 *
472 *-------------------------------------------------------------------------*/
473
474static const struct driver_info an2720_info = {
475 .description = "AnchorChips/Cypress 2720",
476 // no reset available!
477 // no check_connect available!
478
479 .in = 2, .out = 2, // direction distinguishes these
480};
481
482#endif /* CONFIG_USB_AN2720 */
483
484
485#ifdef CONFIG_USB_AX8817X
486/* ASIX AX8817X based USB 2.0 Ethernet Devices */
487
488#define HAVE_HARDWARE
489#define NEED_MII
490
491#include <linux/crc32.h>
492
493#define AX_CMD_SET_SW_MII 0x06
494#define AX_CMD_READ_MII_REG 0x07
495#define AX_CMD_WRITE_MII_REG 0x08
496#define AX_CMD_SET_HW_MII 0x0a
497#define AX_CMD_READ_EEPROM 0x0b
498#define AX_CMD_WRITE_EEPROM 0x0c
499#define AX_CMD_WRITE_ENABLE 0x0d
500#define AX_CMD_WRITE_DISABLE 0x0e
501#define AX_CMD_WRITE_RX_CTL 0x10
502#define AX_CMD_READ_IPG012 0x11
503#define AX_CMD_WRITE_IPG0 0x12
504#define AX_CMD_WRITE_IPG1 0x13
505#define AX_CMD_WRITE_IPG2 0x14
506#define AX_CMD_WRITE_MULTI_FILTER 0x16
507#define AX_CMD_READ_NODE_ID 0x17
508#define AX_CMD_READ_PHY_ID 0x19
509#define AX_CMD_READ_MEDIUM_STATUS 0x1a
510#define AX_CMD_WRITE_MEDIUM_MODE 0x1b
511#define AX_CMD_READ_MONITOR_MODE 0x1c
512#define AX_CMD_WRITE_MONITOR_MODE 0x1d
513#define AX_CMD_WRITE_GPIOS 0x1f
514#define AX_CMD_SW_RESET 0x20
515#define AX_CMD_SW_PHY_STATUS 0x21
516#define AX_CMD_SW_PHY_SELECT 0x22
517#define AX88772_CMD_READ_NODE_ID 0x13
518
519#define AX_MONITOR_MODE 0x01
520#define AX_MONITOR_LINK 0x02
521#define AX_MONITOR_MAGIC 0x04
522#define AX_MONITOR_HSFS 0x10
523
524/* AX88172 Medium Status Register values */
525#define AX_MEDIUM_FULL_DUPLEX 0x02
526#define AX_MEDIUM_TX_ABORT_ALLOW 0x04
527#define AX_MEDIUM_FLOW_CONTROL_EN 0x10
528
529#define AX_MCAST_FILTER_SIZE 8
530#define AX_MAX_MCAST 64
531
532#define AX_EEPROM_LEN 0x40
533
534#define AX_SWRESET_CLEAR 0x00
535#define AX_SWRESET_RR 0x01
536#define AX_SWRESET_RT 0x02
537#define AX_SWRESET_PRTE 0x04
538#define AX_SWRESET_PRL 0x08
539#define AX_SWRESET_BZ 0x10
540#define AX_SWRESET_IPRL 0x20
541#define AX_SWRESET_IPPD 0x40
542
543#define AX88772_IPG0_DEFAULT 0x15
544#define AX88772_IPG1_DEFAULT 0x0c
545#define AX88772_IPG2_DEFAULT 0x12
546
547#define AX88772_MEDIUM_FULL_DUPLEX 0x0002
548#define AX88772_MEDIUM_RESERVED 0x0004
549#define AX88772_MEDIUM_RX_FC_ENABLE 0x0010
550#define AX88772_MEDIUM_TX_FC_ENABLE 0x0020
551#define AX88772_MEDIUM_PAUSE_FORMAT 0x0080
552#define AX88772_MEDIUM_RX_ENABLE 0x0100
553#define AX88772_MEDIUM_100MB 0x0200
554#define AX88772_MEDIUM_DEFAULT \
555 (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \
556 AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \
557 AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE )
558
559#define AX_EEPROM_MAGIC 0xdeadbeef
560
561/* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */
562struct ax8817x_data {
563 u8 multi_filter[AX_MCAST_FILTER_SIZE];
564};
565
566struct ax88172_int_data {
567 u16 res1;
568 u8 link;
569 u16 res2;
570 u8 status;
571 u16 res3;
572} __attribute__ ((packed));
573
574static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
575 u16 size, void *data)
576{
577 return usb_control_msg(
578 dev->udev,
579 usb_rcvctrlpipe(dev->udev, 0),
580 cmd,
581 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
582 value,
583 index,
584 data,
585 size,
586 CONTROL_TIMEOUT_MS);
587}
588
589static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
590 u16 size, void *data)
591{
592 return usb_control_msg(
593 dev->udev,
594 usb_sndctrlpipe(dev->udev, 0),
595 cmd,
596 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
597 value,
598 index,
599 data,
600 size,
601 CONTROL_TIMEOUT_MS);
602}
603
604static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs)
605{
606 struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
607
608 if (urb->status < 0)
609 printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d",
610 urb->status);
611
612 kfree(req);
613 usb_free_urb(urb);
614}
615
616static void ax8817x_status(struct usbnet *dev, struct urb *urb)
617{
618 struct ax88172_int_data *event;
619 int link;
620
621 if (urb->actual_length < 8)
622 return;
623
624 event = urb->transfer_buffer;
625 link = event->link & 0x01;
626 if (netif_carrier_ok(dev->net) != link) {
627 if (link) {
628 netif_carrier_on(dev->net);
629 defer_kevent (dev, EVENT_LINK_RESET );
630 } else
631 netif_carrier_off(dev->net);
632 devdbg(dev, "ax8817x - Link Status is: %d", link);
633 }
634}
635
636static void ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
637 u16 size, void *data)
638{
639 struct usb_ctrlrequest *req;
640 int status;
641 struct urb *urb;
642
643 if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) {
644 devdbg(dev, "Error allocating URB in write_cmd_async!");
645 return;
646 }
647
648 if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) {
649 deverr(dev, "Failed to allocate memory for control request");
650 usb_free_urb(urb);
651 return;
652 }
653
654 req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE;
655 req->bRequest = cmd;
656 req->wValue = cpu_to_le16(value);
657 req->wIndex = cpu_to_le16(index);
658 req->wLength = cpu_to_le16(size);
659
660 usb_fill_control_urb(urb, dev->udev,
661 usb_sndctrlpipe(dev->udev, 0),
662 (void *)req, data, size,
663 ax8817x_async_cmd_callback, req);
664
665 if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
666 deverr(dev, "Error submitting the control message: status=%d", status);
667 kfree(req);
668 usb_free_urb(urb);
669 }
670}
671
672static void ax8817x_set_multicast(struct net_device *net)
673{
674 struct usbnet *dev = netdev_priv(net);
675 struct ax8817x_data *data = (struct ax8817x_data *)&dev->data;
676 u8 rx_ctl = 0x8c;
677
678 if (net->flags & IFF_PROMISC) {
679 rx_ctl |= 0x01;
680 } else if (net->flags & IFF_ALLMULTI
681 || net->mc_count > AX_MAX_MCAST) {
682 rx_ctl |= 0x02;
683 } else if (net->mc_count == 0) {
684 /* just broadcast and directed */
685 } else {
686 /* We use the 20 byte dev->data
687 * for our 8 byte filter buffer
688 * to avoid allocating memory that
689 * is tricky to free later */
690 struct dev_mc_list *mc_list = net->mc_list;
691 u32 crc_bits;
692 int i;
693
694 memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE);
695
696 /* Build the multicast hash filter. */
697 for (i = 0; i < net->mc_count; i++) {
698 crc_bits =
699 ether_crc(ETH_ALEN,
700 mc_list->dmi_addr) >> 26;
701 data->multi_filter[crc_bits >> 3] |=
702 1 << (crc_bits & 7);
703 mc_list = mc_list->next;
704 }
705
706 ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0,
707 AX_MCAST_FILTER_SIZE, data->multi_filter);
708
709 rx_ctl |= 0x10;
710 }
711
712 ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);
713}
714
715static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc)
716{
717 struct usbnet *dev = netdev_priv(netdev);
718 u16 res;
719 u8 buf[1];
720
721 ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf);
722 ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res);
723 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf);
724
725 return res & 0xffff;
726}
727
728static void ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
729{
730 struct usbnet *dev = netdev_priv(netdev);
731 u16 res = val;
732 u8 buf[1];
733
734 ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf);
735 ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res);
736 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf);
737}
738
739static int ax88172_link_reset(struct usbnet *dev)
740{
741 u16 lpa;
742 u8 mode;
743
744 mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN;
745 lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA);
746 if (lpa & LPA_DUPLEX)
747 mode |= AX_MEDIUM_FULL_DUPLEX;
748 ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
749
750 return 0;
751}
752
753static void ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
754{
755 struct usbnet *dev = netdev_priv(net);
756 u8 opt;
757
758 if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) {
759 wolinfo->supported = 0;
760 wolinfo->wolopts = 0;
761 return;
762 }
763 wolinfo->supported = WAKE_PHY | WAKE_MAGIC;
764 wolinfo->wolopts = 0;
765 if (opt & AX_MONITOR_MODE) {
766 if (opt & AX_MONITOR_LINK)
767 wolinfo->wolopts |= WAKE_PHY;
768 if (opt & AX_MONITOR_MAGIC)
769 wolinfo->wolopts |= WAKE_MAGIC;
770 }
771}
772
773static int ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
774{
775 struct usbnet *dev = netdev_priv(net);
776 u8 opt = 0;
777 u8 buf[1];
778
779 if (wolinfo->wolopts & WAKE_PHY)
780 opt |= AX_MONITOR_LINK;
781 if (wolinfo->wolopts & WAKE_MAGIC)
782 opt |= AX_MONITOR_MAGIC;
783 if (opt != 0)
784 opt |= AX_MONITOR_MODE;
785
786 if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE,
787 opt, 0, 0, &buf) < 0)
788 return -EINVAL;
789
790 return 0;
791}
792
793static int ax8817x_get_eeprom_len(struct net_device *net)
794{
795 return AX_EEPROM_LEN;
796}
797
798static int ax8817x_get_eeprom(struct net_device *net,
799 struct ethtool_eeprom *eeprom, u8 *data)
800{
801 struct usbnet *dev = netdev_priv(net);
802 u16 *ebuf = (u16 *)data;
803 int i;
804
805 /* Crude hack to ensure that we don't overwrite memory
806 * if an odd length is supplied
807 */
808 if (eeprom->len % 2)
809 return -EINVAL;
810
811 eeprom->magic = AX_EEPROM_MAGIC;
812
813 /* ax8817x returns 2 bytes from eeprom on read */
814 for (i=0; i < eeprom->len / 2; i++) {
815 if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM,
816 eeprom->offset + i, 0, 2, &ebuf[i]) < 0)
817 return -EINVAL;
818 }
819 return 0;
820}
821
822static void ax8817x_get_drvinfo (struct net_device *net,
823 struct ethtool_drvinfo *info)
824{
825 /* Inherit standard device info */
826 usbnet_get_drvinfo(net, info);
827 info->eedump_len = 0x3e;
828}
829
830static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd)
831{
832 struct usbnet *dev = netdev_priv(net);
833
834 return mii_ethtool_gset(&dev->mii,cmd);
835}
836
837static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd)
838{
839 struct usbnet *dev = netdev_priv(net);
840
841 return mii_ethtool_sset(&dev->mii,cmd);
842}
843
844/* We need to override some ethtool_ops so we require our
845 own structure so we don't interfere with other usbnet
846 devices that may be connected at the same time. */
847static struct ethtool_ops ax8817x_ethtool_ops = {
848 .get_drvinfo = ax8817x_get_drvinfo,
849 .get_link = ethtool_op_get_link,
850 .get_msglevel = usbnet_get_msglevel,
851 .set_msglevel = usbnet_set_msglevel,
852 .get_wol = ax8817x_get_wol,
853 .set_wol = ax8817x_set_wol,
854 .get_eeprom_len = ax8817x_get_eeprom_len,
855 .get_eeprom = ax8817x_get_eeprom,
856 .get_settings = ax8817x_get_settings,
857 .set_settings = ax8817x_set_settings,
858};
859
860static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf)
861{
862 int ret = 0;
863 void *buf;
864 int i;
865 unsigned long gpio_bits = dev->driver_info->data;
866
867 get_endpoints(dev,intf);
868
869 buf = kmalloc(ETH_ALEN, GFP_KERNEL);
870 if(!buf) {
871 ret = -ENOMEM;
872 goto out1;
873 }
874
875 /* Toggle the GPIOs in a manufacturer/model specific way */
876 for (i = 2; i >= 0; i--) {
877 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
878 (gpio_bits >> (i * 8)) & 0xff, 0, 0,
879 buf)) < 0)
880 goto out2;
881 msleep(5);
882 }
883
884 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x80, 0, 0, buf)) < 0) {
885 dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret);
886 goto out2;
887 }
888
889 /* Get the MAC address */
890 memset(buf, 0, ETH_ALEN);
891 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) {
892 dbg("read AX_CMD_READ_NODE_ID failed: %d", ret);
893 goto out2;
894 }
895 memcpy(dev->net->dev_addr, buf, ETH_ALEN);
896
897 /* Get the PHY id */
898 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) {
899 dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret);
900 goto out2;
901 } else if (ret < 2) {
902 /* this should always return 2 bytes */
903 dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", ret);
904 ret = -EIO;
905 goto out2;
906 }
907
908 /* Initialize MII structure */
909 dev->mii.dev = dev->net;
910 dev->mii.mdio_read = ax8817x_mdio_read;
911 dev->mii.mdio_write = ax8817x_mdio_write;
912 dev->mii.phy_id_mask = 0x3f;
913 dev->mii.reg_num_mask = 0x1f;
914 dev->mii.phy_id = *((u8 *)buf + 1);
915
916 dev->net->set_multicast_list = ax8817x_set_multicast;
917 dev->net->ethtool_ops = &ax8817x_ethtool_ops;
918
919 ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
920 ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
921 ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
922 mii_nway_restart(&dev->mii);
923
924 return 0;
925out2:
926 kfree(buf);
927out1:
928 return ret;
929}
930
931static struct ethtool_ops ax88772_ethtool_ops = {
932 .get_drvinfo = ax8817x_get_drvinfo,
933 .get_link = ethtool_op_get_link,
934 .get_msglevel = usbnet_get_msglevel,
935 .set_msglevel = usbnet_set_msglevel,
936 .get_wol = ax8817x_get_wol,
937 .set_wol = ax8817x_set_wol,
938 .get_eeprom_len = ax8817x_get_eeprom_len,
939 .get_eeprom = ax8817x_get_eeprom,
940 .get_settings = ax8817x_get_settings,
941 .set_settings = ax8817x_set_settings,
942};
943
944static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
945{
946 int ret;
947 void *buf;
948
949 get_endpoints(dev,intf);
950
951 buf = kmalloc(6, GFP_KERNEL);
952 if(!buf) {
953 dbg ("Cannot allocate memory for buffer");
954 ret = -ENOMEM;
955 goto out1;
956 }
957
958 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS,
959 0x00B0, 0, 0, buf)) < 0)
960 goto out2;
961
962 msleep(5);
963 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, 0x0001, 0, 0, buf)) < 0) {
964 dbg("Select PHY #1 failed: %d", ret);
965 goto out2;
966 }
967
968 if ((ret =
969 ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, 0, 0, buf)) < 0) {
970 dbg("Failed to power down internal PHY: %d", ret);
971 goto out2;
972 }
973
974 msleep(150);
975 if ((ret =
976 ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, 0, 0, buf)) < 0) {
977 dbg("Failed to perform software reset: %d", ret);
978 goto out2;
979 }
980
981 msleep(150);
982 if ((ret =
983 ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) {
984 dbg("Failed to set Internal/External PHY reset control: %d", ret);
985 goto out2;
986 }
987
988 msleep(150);
989 if ((ret =
990 ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0000, 0, 0,
991 buf)) < 0) {
992 dbg("Failed to reset RX_CTL: %d", ret);
993 goto out2;
994 }
995
996 /* Get the MAC address */
997 memset(buf, 0, ETH_ALEN);
998 if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf)) < 0) {
999 dbg("Failed to read MAC address: %d", ret);
1000 goto out2;
1001 }
1002 memcpy(dev->net->dev_addr, buf, ETH_ALEN);
1003
1004 if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, buf)) < 0) {
1005 dbg("Enabling software MII failed: %d", ret);
1006 goto out2;
1007 }
1008
1009 if (((ret =
1010 ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, 0x0010, 2, 2, buf)) < 0)
1011 || (*((u16 *)buf) != 0x003b)) {
1012 dbg("Read PHY register 2 must be 0x3b00: %d", ret);
1013 goto out2;
1014 }
1015
1016 /* Initialize MII structure */
1017 dev->mii.dev = dev->net;
1018 dev->mii.mdio_read = ax8817x_mdio_read;
1019 dev->mii.mdio_write = ax8817x_mdio_write;
1020 dev->mii.phy_id_mask = 0xff;
1021 dev->mii.reg_num_mask = 0xff;
1022
1023 /* Get the PHY id */
1024 if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) {
1025 dbg("Error reading PHY ID: %02x", ret);
1026 goto out2;
1027 } else if (ret < 2) {
1028 /* this should always return 2 bytes */
1029 dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x",
1030 ret);
1031 ret = -EIO;
1032 goto out2;
1033 }
1034 dev->mii.phy_id = *((u8 *)buf + 1);
1035
1036 if ((ret =
1037 ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, 0, 0, buf)) < 0) {
1038 dbg("Set external PHY reset pin level: %d", ret);
1039 goto out2;
1040 }
1041 msleep(150);
1042 if ((ret =
1043 ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) {
1044 dbg("Set Internal/External PHY reset control: %d", ret);
1045 goto out2;
1046 }
1047 msleep(150);
1048
1049
1050 dev->net->set_multicast_list = ax8817x_set_multicast;
1051 dev->net->ethtool_ops = &ax88772_ethtool_ops;
1052
1053 ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
1054 ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
1055 ADVERTISE_ALL | ADVERTISE_CSMA);
1056 mii_nway_restart(&dev->mii);
1057
1058 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) {
1059 dbg("Write medium mode register: %d", ret);
1060 goto out2;
1061 }
1062
1063 if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,AX88772_IPG2_DEFAULT, 0, buf)) < 0) {
1064 dbg("Write IPG,IPG1,IPG2 failed: %d", ret);
1065 goto out2;
1066 }
1067 if ((ret =
1068 ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) {
1069 dbg("Failed to set hardware MII: %02x", ret);
1070 goto out2;
1071 }
1072
1073 /* Set RX_CTL to default values with 2k buffer, and enable cactus */
1074 if ((ret =
1075 ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0,
1076 buf)) < 0) {
1077 dbg("Reset RX_CTL failed: %d", ret);
1078 goto out2;
1079 }
1080
1081 kfree(buf);
1082
1083 return 0;
1084
1085out2:
1086 kfree(buf);
1087out1:
1088 return ret;
1089}
1090
1091static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
1092{
1093 u32 *header;
1094 char *packet;
1095 struct sk_buff *ax_skb;
1096 u16 size;
1097
1098 header = (u32 *) skb->data;
1099 le32_to_cpus(header);
1100 packet = (char *)(header + 1);
1101
1102 skb_pull(skb, 4);
1103
1104 while (skb->len > 0) {
1105 if ((short)(*header & 0x0000ffff) !=
1106 ~((short)((*header & 0xffff0000) >> 16))) {
1107 devdbg(dev,"header length data is error");
1108 }
1109 /* get the packet length */
1110 size = (u16) (*header & 0x0000ffff);
1111
1112 if ((skb->len) - ((size + 1) & 0xfffe) == 0)
1113 return 2;
1114 if (size > ETH_FRAME_LEN) {
1115 devdbg(dev,"invalid rx length %d", size);
1116 return 0;
1117 }
1118 ax_skb = skb_clone(skb, GFP_ATOMIC);
1119 if (ax_skb) {
1120 ax_skb->len = size;
1121 ax_skb->data = packet;
1122 ax_skb->tail = packet + size;
1123 skb_return(dev, ax_skb);
1124 } else {
1125 return 0;
1126 }
1127
1128 skb_pull(skb, (size + 1) & 0xfffe);
1129
1130 if (skb->len == 0)
1131 break;
1132
1133 header = (u32 *) skb->data;
1134 le32_to_cpus(header);
1135 packet = (char *)(header + 1);
1136 skb_pull(skb, 4);
1137 }
1138
1139 if (skb->len < 0) {
1140 devdbg(dev,"invalid rx length %d", skb->len);
1141 return 0;
1142 }
1143 return 1;
1144}
1145
1146static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
1147 int flags)
1148{
1149 int padlen;
1150 int headroom = skb_headroom(skb);
1151 int tailroom = skb_tailroom(skb);
1152 u32 *packet_len;
1153 u32 *padbytes_ptr;
1154
1155 padlen = ((skb->len + 4) % 512) ? 0 : 4;
1156
1157 if ((!skb_cloned(skb))
1158 && ((headroom + tailroom) >= (4 + padlen))) {
1159 if ((headroom < 4) || (tailroom < padlen)) {
1160 skb->data = memmove(skb->head + 4, skb->data, skb->len);
1161 skb->tail = skb->data + skb->len;
1162 }
1163 } else {
1164 struct sk_buff *skb2;
1165 skb2 = skb_copy_expand(skb, 4, padlen, flags);
1166 dev_kfree_skb_any(skb);
1167 skb = skb2;
1168 if (!skb)
1169 return NULL;
1170 }
1171
1172 packet_len = (u32 *) skb_push(skb, 4);
1173
1174 packet_len = (u32 *) skb->data;
1175 *packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4);
1176
1177 if ((skb->len % 512) == 0) {
1178 padbytes_ptr = (u32 *) skb->tail;
1179 *padbytes_ptr = 0xffff0000;
1180 skb_put(skb, padlen);
1181 }
1182 return skb;
1183}
1184
1185static int ax88772_link_reset(struct usbnet *dev)
1186{
1187 u16 lpa;
1188 u16 mode;
1189
1190 mode = AX88772_MEDIUM_DEFAULT;
1191 lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA);
1192
1193 if ((lpa & LPA_DUPLEX) == 0)
1194 mode &= ~AX88772_MEDIUM_FULL_DUPLEX;
1195 if ((lpa & LPA_100) == 0)
1196 mode &= ~AX88772_MEDIUM_100MB;
1197 ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
1198
1199 return 0;
1200}
1201
1202static const struct driver_info ax8817x_info = {
1203 .description = "ASIX AX8817x USB 2.0 Ethernet",
1204 .bind = ax8817x_bind,
1205 .status = ax8817x_status,
1206 .link_reset = ax88172_link_reset,
1207 .reset = ax88172_link_reset,
1208 .flags = FLAG_ETHER,
1209 .data = 0x00130103,
1210};
1211
1212static const struct driver_info dlink_dub_e100_info = {
1213 .description = "DLink DUB-E100 USB Ethernet",
1214 .bind = ax8817x_bind,
1215 .status = ax8817x_status,
1216 .link_reset = ax88172_link_reset,
1217 .reset = ax88172_link_reset,
1218 .flags = FLAG_ETHER,
1219 .data = 0x009f9d9f,
1220};
1221
1222static const struct driver_info netgear_fa120_info = {
1223 .description = "Netgear FA-120 USB Ethernet",
1224 .bind = ax8817x_bind,
1225 .status = ax8817x_status,
1226 .link_reset = ax88172_link_reset,
1227 .reset = ax88172_link_reset,
1228 .flags = FLAG_ETHER,
1229 .data = 0x00130103,
1230};
1231
1232static const struct driver_info hawking_uf200_info = {
1233 .description = "Hawking UF200 USB Ethernet",
1234 .bind = ax8817x_bind,
1235 .status = ax8817x_status,
1236 .link_reset = ax88172_link_reset,
1237 .reset = ax88172_link_reset,
1238 .flags = FLAG_ETHER,
1239 .data = 0x001f1d1f,
1240};
1241
1242static const struct driver_info ax88772_info = {
1243 .description = "ASIX AX88772 USB 2.0 Ethernet",
1244 .bind = ax88772_bind,
1245 .status = ax8817x_status,
1246 .link_reset = ax88772_link_reset,
1247 .reset = ax88772_link_reset,
1248 .flags = FLAG_ETHER | FLAG_FRAMING_AX,
1249 .rx_fixup = ax88772_rx_fixup,
1250 .tx_fixup = ax88772_tx_fixup,
1251 .data = 0x00130103,
1252};
1253
1254#endif /* CONFIG_USB_AX8817X */
1255
1256
1257
1258#ifdef CONFIG_USB_BELKIN
1259#define HAVE_HARDWARE
1260
1261/*-------------------------------------------------------------------------
1262 *
1263 * Belkin F5U104 ... two NetChip 2280 devices + Atmel microcontroller
1264 *
1265 * ... also two eTEK designs, including one sold as "Advance USBNET"
1266 *
1267 *-------------------------------------------------------------------------*/
1268
1269static const struct driver_info belkin_info = {
1270 .description = "Belkin, eTEK, or compatible",
1271};
1272
1273#endif /* CONFIG_USB_BELKIN */
1274
1275
1276
1277/*-------------------------------------------------------------------------
1278 *
1279 * Communications Device Class declarations.
1280 * Used by CDC Ethernet, and some CDC variants
1281 *
1282 *-------------------------------------------------------------------------*/
1283
1284#ifdef CONFIG_USB_CDCETHER
1285#define NEED_GENERIC_CDC
1286#endif
1287
1288#ifdef CONFIG_USB_ZAURUS
1289/* Ethernet variant uses funky framing, broken ethernet addressing */
1290#define NEED_GENERIC_CDC
1291#endif
1292
1293#ifdef CONFIG_USB_RNDIS
1294/* ACM variant uses even funkier framing, complex control RPC scheme */
1295#define NEED_GENERIC_CDC
1296#endif
1297
1298
1299#ifdef NEED_GENERIC_CDC
1300
1301#include <linux/usb_cdc.h>
1302
1303struct cdc_state {
1304 struct usb_cdc_header_desc *header;
1305 struct usb_cdc_union_desc *u;
1306 struct usb_cdc_ether_desc *ether;
1307 struct usb_interface *control;
1308 struct usb_interface *data;
1309};
1310
1311static struct usb_driver usbnet_driver;
1312
1313/*
1314 * probes control interface, claims data interface, collects the bulk
1315 * endpoints, activates data interface (if needed), maybe sets MTU.
1316 * all pure cdc, except for certain firmware workarounds.
1317 */
1318static int generic_cdc_bind (struct usbnet *dev, struct usb_interface *intf)
1319{
1320 u8 *buf = intf->cur_altsetting->extra;
1321 int len = intf->cur_altsetting->extralen;
1322 struct usb_interface_descriptor *d;
1323 struct cdc_state *info = (void *) &dev->data;
1324 int status;
1325 int rndis;
1326
1327 if (sizeof dev->data < sizeof *info)
1328 return -EDOM;
1329
1330 /* expect strict spec conformance for the descriptors, but
1331 * cope with firmware which stores them in the wrong place
1332 */
1333 if (len == 0 && dev->udev->actconfig->extralen) {
1334 /* Motorola SB4100 (and others: Brad Hards says it's
1335 * from a Broadcom design) put CDC descriptors here
1336 */
1337 buf = dev->udev->actconfig->extra;
1338 len = dev->udev->actconfig->extralen;
1339 if (len)
1340 dev_dbg (&intf->dev,
1341 "CDC descriptors on config\n");
1342 }
1343
1344 /* this assumes that if there's a non-RNDIS vendor variant
1345 * of cdc-acm, it'll fail RNDIS requests cleanly.
1346 */
1347 rndis = (intf->cur_altsetting->desc.bInterfaceProtocol == 0xff);
1348
1349 memset (info, 0, sizeof *info);
1350 info->control = intf;
1351 while (len > 3) {
1352 if (buf [1] != USB_DT_CS_INTERFACE)
1353 goto next_desc;
1354
1355 /* use bDescriptorSubType to identify the CDC descriptors.
1356 * We expect devices with CDC header and union descriptors.
1357 * For CDC Ethernet we need the ethernet descriptor.
1358 * For RNDIS, ignore two (pointless) CDC modem descriptors
1359 * in favor of a complicated OID-based RPC scheme doing what
1360 * CDC Ethernet achieves with a simple descriptor.
1361 */
1362 switch (buf [2]) {
1363 case USB_CDC_HEADER_TYPE:
1364 if (info->header) {
1365 dev_dbg (&intf->dev, "extra CDC header\n");
1366 goto bad_desc;
1367 }
1368 info->header = (void *) buf;
1369 if (info->header->bLength != sizeof *info->header) {
1370 dev_dbg (&intf->dev, "CDC header len %u\n",
1371 info->header->bLength);
1372 goto bad_desc;
1373 }
1374 break;
1375 case USB_CDC_UNION_TYPE:
1376 if (info->u) {
1377 dev_dbg (&intf->dev, "extra CDC union\n");
1378 goto bad_desc;
1379 }
1380 info->u = (void *) buf;
1381 if (info->u->bLength != sizeof *info->u) {
1382 dev_dbg (&intf->dev, "CDC union len %u\n",
1383 info->u->bLength);
1384 goto bad_desc;
1385 }
1386
1387 /* we need a master/control interface (what we're
1388 * probed with) and a slave/data interface; union
1389 * descriptors sort this all out.
1390 */
1391 info->control = usb_ifnum_to_if(dev->udev,
1392 info->u->bMasterInterface0);
1393 info->data = usb_ifnum_to_if(dev->udev,
1394 info->u->bSlaveInterface0);
1395 if (!info->control || !info->data) {
1396 dev_dbg (&intf->dev,
1397 "master #%u/%p slave #%u/%p\n",
1398 info->u->bMasterInterface0,
1399 info->control,
1400 info->u->bSlaveInterface0,
1401 info->data);
1402 goto bad_desc;
1403 }
1404 if (info->control != intf) {
1405 dev_dbg (&intf->dev, "bogus CDC Union\n");
1406 /* Ambit USB Cable Modem (and maybe others)
1407 * interchanges master and slave interface.
1408 */
1409 if (info->data == intf) {
1410 info->data = info->control;
1411 info->control = intf;
1412 } else
1413 goto bad_desc;
1414 }
1415
1416 /* a data interface altsetting does the real i/o */
1417 d = &info->data->cur_altsetting->desc;
1418 if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
1419 dev_dbg (&intf->dev, "slave class %u\n",
1420 d->bInterfaceClass);
1421 goto bad_desc;
1422 }
1423 break;
1424 case USB_CDC_ETHERNET_TYPE:
1425 if (info->ether) {
1426 dev_dbg (&intf->dev, "extra CDC ether\n");
1427 goto bad_desc;
1428 }
1429 info->ether = (void *) buf;
1430 if (info->ether->bLength != sizeof *info->ether) {
1431 dev_dbg (&intf->dev, "CDC ether len %u\n",
1432 info->ether->bLength);
1433 goto bad_desc;
1434 }
1435 dev->net->mtu = le16_to_cpup (
1436 &info->ether->wMaxSegmentSize)
1437 - ETH_HLEN;
1438 /* because of Zaurus, we may be ignoring the host
1439 * side link address we were given.
1440 */
1441 break;
1442 }
1443next_desc:
1444 len -= buf [0]; /* bLength */
1445 buf += buf [0];
1446 }
1447
1448 if (!info->header || !info->u || (!rndis && !info->ether)) {
1449 dev_dbg (&intf->dev, "missing cdc %s%s%sdescriptor\n",
1450 info->header ? "" : "header ",
1451 info->u ? "" : "union ",
1452 info->ether ? "" : "ether ");
1453 goto bad_desc;
1454 }
1455
1456 /* claim data interface and set it up ... with side effects.
1457 * network traffic can't flow until an altsetting is enabled.
1458 */
1459 status = usb_driver_claim_interface (&usbnet_driver, info->data, dev);
1460 if (status < 0)
1461 return status;
1462 status = get_endpoints (dev, info->data);
1463 if (status < 0) {
1464 /* ensure immediate exit from usbnet_disconnect */
1465 usb_set_intfdata(info->data, NULL);
1466 usb_driver_release_interface (&usbnet_driver, info->data);
1467 return status;
1468 }
1469
1470 /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
1471 dev->status = NULL;
1472 if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
1473 struct usb_endpoint_descriptor *desc;
1474
1475 dev->status = &info->control->cur_altsetting->endpoint [0];
1476 desc = &dev->status->desc;
1477 if (desc->bmAttributes != USB_ENDPOINT_XFER_INT
1478 || !(desc->bEndpointAddress & USB_DIR_IN)
1479 || (le16_to_cpu(desc->wMaxPacketSize)
1480 < sizeof (struct usb_cdc_notification))
1481 || !desc->bInterval) {
1482 dev_dbg (&intf->dev, "bad notification endpoint\n");
1483 dev->status = NULL;
1484 }
1485 }
1486 if (rndis && !dev->status) {
1487 dev_dbg (&intf->dev, "missing RNDIS status endpoint\n");
1488 usb_set_intfdata(info->data, NULL);
1489 usb_driver_release_interface (&usbnet_driver, info->data);
1490 return -ENODEV;
1491 }
1492 return 0;
1493
1494bad_desc:
1495 dev_info (&dev->udev->dev, "bad CDC descriptors\n");
1496 return -ENODEV;
1497}
1498
1499static void cdc_unbind (struct usbnet *dev, struct usb_interface *intf)
1500{
1501 struct cdc_state *info = (void *) &dev->data;
1502
1503 /* disconnect master --> disconnect slave */
1504 if (intf == info->control && info->data) {
1505 /* ensure immediate exit from usbnet_disconnect */
1506 usb_set_intfdata(info->data, NULL);
1507 usb_driver_release_interface (&usbnet_driver, info->data);
1508 info->data = NULL;
1509 }
1510
1511 /* and vice versa (just in case) */
1512 else if (intf == info->data && info->control) {
1513 /* ensure immediate exit from usbnet_disconnect */
1514 usb_set_intfdata(info->control, NULL);
1515 usb_driver_release_interface (&usbnet_driver, info->control);
1516 info->control = NULL;
1517 }
1518}
1519
1520#endif /* NEED_GENERIC_CDC */
1521
1522
1523#ifdef CONFIG_USB_CDCETHER
1524#define HAVE_HARDWARE
1525
1526/*-------------------------------------------------------------------------
1527 *
1528 * Communications Device Class, Ethernet Control model
1529 *
1530 * Takes two interfaces. The DATA interface is inactive till an altsetting
1531 * is selected. Configuration data includes class descriptors.
1532 *
1533 * This should interop with whatever the 2.4 "CDCEther.c" driver
1534 * (by Brad Hards) talked with.
1535 *
1536 *-------------------------------------------------------------------------*/
1537
1538#include <linux/ctype.h>
1539
1540
1541static void dumpspeed (struct usbnet *dev, __le32 *speeds)
1542{
1543 if (netif_msg_timer (dev))
1544 devinfo (dev, "link speeds: %u kbps up, %u kbps down",
1545 __le32_to_cpu(speeds[0]) / 1000,
1546 __le32_to_cpu(speeds[1]) / 1000);
1547}
1548
1549static void cdc_status (struct usbnet *dev, struct urb *urb)
1550{
1551 struct usb_cdc_notification *event;
1552
1553 if (urb->actual_length < sizeof *event)
1554 return;
1555
1556 /* SPEED_CHANGE can get split into two 8-byte packets */
1557 if (test_and_clear_bit (EVENT_STS_SPLIT, &dev->flags)) {
1558 dumpspeed (dev, (__le32 *) urb->transfer_buffer);
1559 return;
1560 }
1561
1562 event = urb->transfer_buffer;
1563 switch (event->bNotificationType) {
1564 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
1565 if (netif_msg_timer (dev))
1566 devdbg (dev, "CDC: carrier %s",
1567 event->wValue ? "on" : "off");
1568 if (event->wValue)
1569 netif_carrier_on(dev->net);
1570 else
1571 netif_carrier_off(dev->net);
1572 break;
1573 case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
1574 if (netif_msg_timer (dev))
1575 devdbg (dev, "CDC: speed change (len %d)",
1576 urb->actual_length);
1577 if (urb->actual_length != (sizeof *event + 8))
1578 set_bit (EVENT_STS_SPLIT, &dev->flags);
1579 else
1580 dumpspeed (dev, (__le32 *) &event[1]);
1581 break;
1582 // case USB_CDC_NOTIFY_RESPONSE_AVAILABLE: /* RNDIS; or unsolicited */
1583 default:
1584 deverr (dev, "CDC: unexpected notification %02x!",
1585 event->bNotificationType);
1586 break;
1587 }
1588}
1589
1590static u8 nibble (unsigned char c)
1591{
1592 if (likely (isdigit (c)))
1593 return c - '0';
1594 c = toupper (c);
1595 if (likely (isxdigit (c)))
1596 return 10 + c - 'A';
1597 return 0;
1598}
1599
1600static inline int
1601get_ethernet_addr (struct usbnet *dev, struct usb_cdc_ether_desc *e)
1602{
1603 int tmp, i;
1604 unsigned char buf [13];
1605
1606 tmp = usb_string (dev->udev, e->iMACAddress, buf, sizeof buf);
1607 if (tmp != 12) {
1608 dev_dbg (&dev->udev->dev,
1609 "bad MAC string %d fetch, %d\n", e->iMACAddress, tmp);
1610 if (tmp >= 0)
1611 tmp = -EINVAL;
1612 return tmp;
1613 }
1614 for (i = tmp = 0; i < 6; i++, tmp += 2)
1615 dev->net->dev_addr [i] =
1616 (nibble (buf [tmp]) << 4) + nibble (buf [tmp + 1]);
1617 return 0;
1618}
1619
1620static int cdc_bind (struct usbnet *dev, struct usb_interface *intf)
1621{
1622 int status;
1623 struct cdc_state *info = (void *) &dev->data;
1624
1625 status = generic_cdc_bind (dev, intf);
1626 if (status < 0)
1627 return status;
1628
1629 status = get_ethernet_addr (dev, info->ether);
1630 if (status < 0) {
1631 usb_set_intfdata(info->data, NULL);
1632 usb_driver_release_interface (&usbnet_driver, info->data);
1633 return status;
1634 }
1635
1636 /* FIXME cdc-ether has some multicast code too, though it complains
1637 * in routine cases. info->ether describes the multicast support.
1638 */
1639 return 0;
1640}
1641
1642static const struct driver_info cdc_info = {
1643 .description = "CDC Ethernet Device",
1644 .flags = FLAG_ETHER,
1645 // .check_connect = cdc_check_connect,
1646 .bind = cdc_bind,
1647 .unbind = cdc_unbind,
1648 .status = cdc_status,
1649};
1650
1651#endif /* CONFIG_USB_CDCETHER */
1652
1653
1654
1655#ifdef CONFIG_USB_EPSON2888
1656#define HAVE_HARDWARE
1657
1658/*-------------------------------------------------------------------------
1659 *
1660 * EPSON USB clients
1661 *
1662 * This is the same idea as Linux PDAs (below) except the firmware in the
1663 * device might not be Tux-powered. Epson provides reference firmware that
1664 * implements this interface. Product developers can reuse or modify that
1665 * code, such as by using their own product and vendor codes.
1666 *
1667 * Support was from Juro Bystricky <bystricky.juro@erd.epson.com>
1668 *
1669 *-------------------------------------------------------------------------*/
1670
1671static const struct driver_info epson2888_info = {
1672 .description = "Epson USB Device",
1673 .check_connect = always_connected,
1674
1675 .in = 4, .out = 3,
1676};
1677
1678#endif /* CONFIG_USB_EPSON2888 */
1679
1680
1681#ifdef CONFIG_USB_GENESYS
1682#define HAVE_HARDWARE
1683
1684/*-------------------------------------------------------------------------
1685 *
1686 * GeneSys GL620USB-A (www.genesyslogic.com.tw)
1687 *
1688 * ... should partially interop with the Win32 driver for this hardware
1689 * The GeneSys docs imply there's some NDIS issue motivating this framing.
1690 *
1691 * Some info from GeneSys:
1692 * - GL620USB-A is full duplex; GL620USB is only half duplex for bulk.
1693 * (Some cables, like the BAFO-100c, use the half duplex version.)
1694 * - For the full duplex model, the low bit of the version code says
1695 * which side is which ("left/right").
1696 * - For the half duplex type, a control/interrupt handshake settles
1697 * the transfer direction. (That's disabled here, partially coded.)
1698 * A control URB would block until other side writes an interrupt.
1699 *
1700 * Original code from Jiun-Jie Huang <huangjj@genesyslogic.com.tw>
1701 * and merged into "usbnet" by Stanislav Brabec <utx@penguin.cz>.
1702 *
1703 *-------------------------------------------------------------------------*/
1704
1705// control msg write command
1706#define GENELINK_CONNECT_WRITE 0xF0
1707// interrupt pipe index
1708#define GENELINK_INTERRUPT_PIPE 0x03
1709// interrupt read buffer size
1710#define INTERRUPT_BUFSIZE 0x08
1711// interrupt pipe interval value
1712#define GENELINK_INTERRUPT_INTERVAL 0x10
1713// max transmit packet number per transmit
1714#define GL_MAX_TRANSMIT_PACKETS 32
1715// max packet length
1716#define GL_MAX_PACKET_LEN 1514
1717// max receive buffer size
1718#define GL_RCV_BUF_SIZE \
1719 (((GL_MAX_PACKET_LEN + 4) * GL_MAX_TRANSMIT_PACKETS) + 4)
1720
1721struct gl_packet {
1722 u32 packet_length;
1723 char packet_data [1];
1724};
1725
1726struct gl_header {
1727 u32 packet_count;
1728 struct gl_packet packets;
1729};
1730
1731#ifdef GENELINK_ACK
1732
1733// FIXME: this code is incomplete, not debugged; it doesn't
1734// handle interrupts correctly. interrupts should be generic
1735// code like all other device I/O, anyway.
1736
1737struct gl_priv {
1738 struct urb *irq_urb;
1739 char irq_buf [INTERRUPT_BUFSIZE];
1740};
1741
1742static inline int gl_control_write (struct usbnet *dev, u8 request, u16 value)
1743{
1744 int retval;
1745
1746 retval = usb_control_msg (dev->udev,
1747 usb_sndctrlpipe (dev->udev, 0),
1748 request,
1749 USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
1750 value,
1751 0, // index
1752 0, // data buffer
1753 0, // size
1754 CONTROL_TIMEOUT_MS);
1755 return retval;
1756}
1757
1758static void gl_interrupt_complete (struct urb *urb, struct pt_regs *regs)
1759{
1760 int status = urb->status;
1761
1762 switch (status) {
1763 case 0:
1764 /* success */
1765 break;
1766 case -ECONNRESET:
1767 case -ENOENT:
1768 case -ESHUTDOWN:
1769 /* this urb is terminated, clean up */
1770 dbg("%s - urb shutting down with status: %d",
1771 __FUNCTION__, status);
1772 return;
1773 default:
1774 dbg("%s - nonzero urb status received: %d",
1775 __FUNCTION__, urb->status);
1776 }
1777
1778 status = usb_submit_urb (urb, GFP_ATOMIC);
1779 if (status)
1780 err ("%s - usb_submit_urb failed with result %d",
1781 __FUNCTION__, status);
1782}
1783
1784static int gl_interrupt_read (struct usbnet *dev)
1785{
1786 struct gl_priv *priv = dev->priv_data;
1787 int retval;
1788
1789 // issue usb interrupt read
1790 if (priv && priv->irq_urb) {
1791 // submit urb
1792 if ((retval = usb_submit_urb (priv->irq_urb, GFP_KERNEL)) != 0)
1793 dbg ("gl_interrupt_read: submit fail - %X...", retval);
1794 else
1795 dbg ("gl_interrupt_read: submit success...");
1796 }
1797
1798 return 0;
1799}
1800
1801// check whether another side is connected
1802static int genelink_check_connect (struct usbnet *dev)
1803{
1804 int retval;
1805
1806 dbg ("genelink_check_connect...");
1807
1808 // detect whether another side is connected
1809 if ((retval = gl_control_write (dev, GENELINK_CONNECT_WRITE, 0)) != 0) {
1810 dbg ("%s: genelink_check_connect write fail - %X",
1811 dev->net->name, retval);
1812 return retval;
1813 }
1814
1815 // usb interrupt read to ack another side
1816 if ((retval = gl_interrupt_read (dev)) != 0) {
1817 dbg ("%s: genelink_check_connect read fail - %X",
1818 dev->net->name, retval);
1819 return retval;
1820 }
1821
1822 dbg ("%s: genelink_check_connect read success", dev->net->name);
1823 return 0;
1824}
1825
1826// allocate and initialize the private data for genelink
1827static int genelink_init (struct usbnet *dev)
1828{
1829 struct gl_priv *priv;
1830
1831 // allocate the private data structure
1832 if ((priv = kmalloc (sizeof *priv, GFP_KERNEL)) == 0) {
1833 dbg ("%s: cannot allocate private data per device",
1834 dev->net->name);
1835 return -ENOMEM;
1836 }
1837
1838 // allocate irq urb
1839 if ((priv->irq_urb = usb_alloc_urb (0, GFP_KERNEL)) == 0) {
1840 dbg ("%s: cannot allocate private irq urb per device",
1841 dev->net->name);
1842 kfree (priv);
1843 return -ENOMEM;
1844 }
1845
1846 // fill irq urb
1847 usb_fill_int_urb (priv->irq_urb, dev->udev,
1848 usb_rcvintpipe (dev->udev, GENELINK_INTERRUPT_PIPE),
1849 priv->irq_buf, INTERRUPT_BUFSIZE,
1850 gl_interrupt_complete, 0,
1851 GENELINK_INTERRUPT_INTERVAL);
1852
1853 // set private data pointer
1854 dev->priv_data = priv;
1855
1856 return 0;
1857}
1858
1859// release the private data
1860static int genelink_free (struct usbnet *dev)
1861{
1862 struct gl_priv *priv = dev->priv_data;
1863
1864 if (!priv)
1865 return 0;
1866
1867// FIXME: can't cancel here; it's synchronous, and
1868// should have happened earlier in any case (interrupt
1869// handling needs to be generic)
1870
1871 // cancel irq urb first
1872 usb_kill_urb (priv->irq_urb);
1873
1874 // free irq urb
1875 usb_free_urb (priv->irq_urb);
1876
1877 // free the private data structure
1878 kfree (priv);
1879
1880 return 0;
1881}
1882
1883#endif
1884
1885static int genelink_rx_fixup (struct usbnet *dev, struct sk_buff *skb)
1886{
1887 struct gl_header *header;
1888 struct gl_packet *packet;
1889 struct sk_buff *gl_skb;
1890 u32 size;
1891
1892 header = (struct gl_header *) skb->data;
1893
1894 // get the packet count of the received skb
1895 le32_to_cpus (&header->packet_count);
1896 if ((header->packet_count > GL_MAX_TRANSMIT_PACKETS)
1897 || (header->packet_count < 0)) {
1898 dbg ("genelink: invalid received packet count %d",
1899 header->packet_count);
1900 return 0;
1901 }
1902
1903 // set the current packet pointer to the first packet
1904 packet = &header->packets;
1905
1906 // decrement the length for the packet count size 4 bytes
1907 skb_pull (skb, 4);
1908
1909 while (header->packet_count > 1) {
1910 // get the packet length
1911 size = packet->packet_length;
1912
1913 // this may be a broken packet
1914 if (size > GL_MAX_PACKET_LEN) {
1915 dbg ("genelink: invalid rx length %d", size);
1916 return 0;
1917 }
1918
1919 // allocate the skb for the individual packet
1920 gl_skb = alloc_skb (size, GFP_ATOMIC);
1921 if (gl_skb) {
1922
1923 // copy the packet data to the new skb
1924 memcpy(skb_put(gl_skb, size), packet->packet_data, size);
1925 skb_return (dev, gl_skb);
1926 }
1927
1928 // advance to the next packet
1929 packet = (struct gl_packet *)
1930 &packet->packet_data [size];
1931 header->packet_count--;
1932
1933 // shift the data pointer to the next gl_packet
1934 skb_pull (skb, size + 4);
1935 }
1936
1937 // skip the packet length field 4 bytes
1938 skb_pull (skb, 4);
1939
1940 if (skb->len > GL_MAX_PACKET_LEN) {
1941 dbg ("genelink: invalid rx length %d", skb->len);
1942 return 0;
1943 }
1944 return 1;
1945}
1946
1947static struct sk_buff *
1948genelink_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
1949{
1950 int padlen;
1951 int length = skb->len;
1952 int headroom = skb_headroom (skb);
1953 int tailroom = skb_tailroom (skb);
1954 u32 *packet_count;
1955 u32 *packet_len;
1956
1957 // FIXME: magic numbers, bleech
1958 padlen = ((skb->len + (4 + 4*1)) % 64) ? 0 : 1;
1959
1960 if ((!skb_cloned (skb))
1961 && ((headroom + tailroom) >= (padlen + (4 + 4*1)))) {
1962 if ((headroom < (4 + 4*1)) || (tailroom < padlen)) {
1963 skb->data = memmove (skb->head + (4 + 4*1),
1964 skb->data, skb->len);
1965 skb->tail = skb->data + skb->len;
1966 }
1967 } else {
1968 struct sk_buff *skb2;
1969 skb2 = skb_copy_expand (skb, (4 + 4*1) , padlen, flags);
1970 dev_kfree_skb_any (skb);
1971 skb = skb2;
1972 if (!skb)
1973 return NULL;
1974 }
1975
1976 // attach the packet count to the header
1977 packet_count = (u32 *) skb_push (skb, (4 + 4*1));
1978 packet_len = packet_count + 1;
1979
1980 // FIXME little endian?
1981 *packet_count = 1;
1982 *packet_len = length;
1983
1984 // add padding byte
1985 if ((skb->len % dev->maxpacket) == 0)
1986 skb_put (skb, 1);
1987
1988 return skb;
1989}
1990
1991static const struct driver_info genelink_info = {
1992 .description = "Genesys GeneLink",
1993 .flags = FLAG_FRAMING_GL | FLAG_NO_SETINT,
1994 .rx_fixup = genelink_rx_fixup,
1995 .tx_fixup = genelink_tx_fixup,
1996
1997 .in = 1, .out = 2,
1998
1999#ifdef GENELINK_ACK
2000 .check_connect =genelink_check_connect,
2001#endif
2002};
2003
2004#endif /* CONFIG_USB_GENESYS */
2005
2006
2007
2008#ifdef CONFIG_USB_NET1080
2009#define HAVE_HARDWARE
2010
2011/*-------------------------------------------------------------------------
2012 *
2013 * Netchip 1080 driver ... http://www.netchip.com
2014 * Used in LapLink cables
2015 *
2016 *-------------------------------------------------------------------------*/
2017
2018#define dev_packet_id data[0]
2019#define frame_errors data[1]
2020
2021/*
2022 * NetChip framing of ethernet packets, supporting additional error
2023 * checks for links that may drop bulk packets from inside messages.
2024 * Odd USB length == always short read for last usb packet.
2025 * - nc_header
2026 * - Ethernet header (14 bytes)
2027 * - payload
2028 * - (optional padding byte, if needed so length becomes odd)
2029 * - nc_trailer
2030 *
2031 * This framing is to be avoided for non-NetChip devices.
2032 */
2033
2034struct nc_header { // packed:
2035 __le16 hdr_len; // sizeof nc_header (LE, all)
2036 __le16 packet_len; // payload size (including ethhdr)
2037 __le16 packet_id; // detects dropped packets
2038#define MIN_HEADER 6
2039
2040 // all else is optional, and must start with:
2041 // u16 vendorId; // from usb-if
2042 // u16 productId;
2043} __attribute__((__packed__));
2044
2045#define PAD_BYTE ((unsigned char)0xAC)
2046
2047struct nc_trailer {
2048 __le16 packet_id;
2049} __attribute__((__packed__));
2050
2051// packets may use FLAG_FRAMING_NC and optional pad
2052#define FRAMED_SIZE(mtu) (sizeof (struct nc_header) \
2053 + sizeof (struct ethhdr) \
2054 + (mtu) \
2055 + 1 \
2056 + sizeof (struct nc_trailer))
2057
2058#define MIN_FRAMED FRAMED_SIZE(0)
2059
2060
2061/*
2062 * Zero means no timeout; else, how long a 64 byte bulk packet may be queued
2063 * before the hardware drops it. If that's done, the driver will need to
2064 * frame network packets to guard against the dropped USB packets. The win32
2065 * driver sets this for both sides of the link.
2066 */
2067#define NC_READ_TTL_MS ((u8)255) // ms
2068
2069/*
2070 * We ignore most registers and EEPROM contents.
2071 */
2072#define REG_USBCTL ((u8)0x04)
2073#define REG_TTL ((u8)0x10)
2074#define REG_STATUS ((u8)0x11)
2075
2076/*
2077 * Vendor specific requests to read/write data
2078 */
2079#define REQUEST_REGISTER ((u8)0x10)
2080#define REQUEST_EEPROM ((u8)0x11)
2081
2082static int
2083nc_vendor_read (struct usbnet *dev, u8 req, u8 regnum, u16 *retval_ptr)
2084{
2085 int status = usb_control_msg (dev->udev,
2086 usb_rcvctrlpipe (dev->udev, 0),
2087 req,
2088 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2089 0, regnum,
2090 retval_ptr, sizeof *retval_ptr,
2091 CONTROL_TIMEOUT_MS);
2092 if (status > 0)
2093 status = 0;
2094 if (!status)
2095 le16_to_cpus (retval_ptr);
2096 return status;
2097}
2098
2099static inline int
2100nc_register_read (struct usbnet *dev, u8 regnum, u16 *retval_ptr)
2101{
2102 return nc_vendor_read (dev, REQUEST_REGISTER, regnum, retval_ptr);
2103}
2104
2105// no retval ... can become async, usable in_interrupt()
2106static void
2107nc_vendor_write (struct usbnet *dev, u8 req, u8 regnum, u16 value)
2108{
2109 usb_control_msg (dev->udev,
2110 usb_sndctrlpipe (dev->udev, 0),
2111 req,
2112 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2113 value, regnum,
2114 NULL, 0, // data is in setup packet
2115 CONTROL_TIMEOUT_MS);
2116}
2117
2118static inline void
2119nc_register_write (struct usbnet *dev, u8 regnum, u16 value)
2120{
2121 nc_vendor_write (dev, REQUEST_REGISTER, regnum, value);
2122}
2123
2124
2125#if 0
2126static void nc_dump_registers (struct usbnet *dev)
2127{
2128 u8 reg;
2129 u16 *vp = kmalloc (sizeof (u16));
2130
2131 if (!vp) {
2132 dbg ("no memory?");
2133 return;
2134 }
2135
2136 dbg ("%s registers:", dev->net->name);
2137 for (reg = 0; reg < 0x20; reg++) {
2138 int retval;
2139
2140 // reading some registers is trouble
2141 if (reg >= 0x08 && reg <= 0xf)
2142 continue;
2143 if (reg >= 0x12 && reg <= 0x1e)
2144 continue;
2145
2146 retval = nc_register_read (dev, reg, vp);
2147 if (retval < 0)
2148 dbg ("%s reg [0x%x] ==> error %d",
2149 dev->net->name, reg, retval);
2150 else
2151 dbg ("%s reg [0x%x] = 0x%x",
2152 dev->net->name, reg, *vp);
2153 }
2154 kfree (vp);
2155}
2156#endif
2157
2158
2159/*-------------------------------------------------------------------------*/
2160
2161/*
2162 * Control register
2163 */
2164
2165#define USBCTL_WRITABLE_MASK 0x1f0f
2166// bits 15-13 reserved, r/o
2167#define USBCTL_ENABLE_LANG (1 << 12)
2168#define USBCTL_ENABLE_MFGR (1 << 11)
2169#define USBCTL_ENABLE_PROD (1 << 10)
2170#define USBCTL_ENABLE_SERIAL (1 << 9)
2171#define USBCTL_ENABLE_DEFAULTS (1 << 8)
2172// bits 7-4 reserved, r/o
2173#define USBCTL_FLUSH_OTHER (1 << 3)
2174#define USBCTL_FLUSH_THIS (1 << 2)
2175#define USBCTL_DISCONN_OTHER (1 << 1)
2176#define USBCTL_DISCONN_THIS (1 << 0)
2177
2178static inline void nc_dump_usbctl (struct usbnet *dev, u16 usbctl)
2179{
2180 if (!netif_msg_link (dev))
2181 return;
2182 devdbg (dev, "net1080 %s-%s usbctl 0x%x:%s%s%s%s%s;"
2183 " this%s%s;"
2184 " other%s%s; r/o 0x%x",
2185 dev->udev->bus->bus_name, dev->udev->devpath,
2186 usbctl,
2187 (usbctl & USBCTL_ENABLE_LANG) ? " lang" : "",
2188 (usbctl & USBCTL_ENABLE_MFGR) ? " mfgr" : "",
2189 (usbctl & USBCTL_ENABLE_PROD) ? " prod" : "",
2190 (usbctl & USBCTL_ENABLE_SERIAL) ? " serial" : "",
2191 (usbctl & USBCTL_ENABLE_DEFAULTS) ? " defaults" : "",
2192
2193 (usbctl & USBCTL_FLUSH_OTHER) ? " FLUSH" : "",
2194 (usbctl & USBCTL_DISCONN_OTHER) ? " DIS" : "",
2195 (usbctl & USBCTL_FLUSH_THIS) ? " FLUSH" : "",
2196 (usbctl & USBCTL_DISCONN_THIS) ? " DIS" : "",
2197 usbctl & ~USBCTL_WRITABLE_MASK
2198 );
2199}
2200
2201/*-------------------------------------------------------------------------*/
2202
2203/*
2204 * Status register
2205 */
2206
2207#define STATUS_PORT_A (1 << 15)
2208
2209#define STATUS_CONN_OTHER (1 << 14)
2210#define STATUS_SUSPEND_OTHER (1 << 13)
2211#define STATUS_MAILBOX_OTHER (1 << 12)
2212#define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03)
2213
2214#define STATUS_CONN_THIS (1 << 6)
2215#define STATUS_SUSPEND_THIS (1 << 5)
2216#define STATUS_MAILBOX_THIS (1 << 4)
2217#define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03)
2218
2219#define STATUS_UNSPEC_MASK 0x0c8c
2220#define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK))
2221
2222
2223static inline void nc_dump_status (struct usbnet *dev, u16 status)
2224{
2225 if (!netif_msg_link (dev))
2226 return;
2227 devdbg (dev, "net1080 %s-%s status 0x%x:"
2228 " this (%c) PKT=%d%s%s%s;"
2229 " other PKT=%d%s%s%s; unspec 0x%x",
2230 dev->udev->bus->bus_name, dev->udev->devpath,
2231 status,
2232
2233 // XXX the packet counts don't seem right
2234 // (1 at reset, not 0); maybe UNSPEC too
2235
2236 (status & STATUS_PORT_A) ? 'A' : 'B',
2237 STATUS_PACKETS_THIS (status),
2238 (status & STATUS_CONN_THIS) ? " CON" : "",
2239 (status & STATUS_SUSPEND_THIS) ? " SUS" : "",
2240 (status & STATUS_MAILBOX_THIS) ? " MBOX" : "",
2241
2242 STATUS_PACKETS_OTHER (status),
2243 (status & STATUS_CONN_OTHER) ? " CON" : "",
2244 (status & STATUS_SUSPEND_OTHER) ? " SUS" : "",
2245 (status & STATUS_MAILBOX_OTHER) ? " MBOX" : "",
2246
2247 status & STATUS_UNSPEC_MASK
2248 );
2249}
2250
2251/*-------------------------------------------------------------------------*/
2252
2253/*
2254 * TTL register
2255 */
2256
2257#define TTL_THIS(ttl) (0x00ff & ttl)
2258#define TTL_OTHER(ttl) (0x00ff & (ttl >> 8))
2259#define MK_TTL(this,other) ((u16)(((other)<<8)|(0x00ff&(this))))
2260
2261static inline void nc_dump_ttl (struct usbnet *dev, u16 ttl)
2262{
2263 if (netif_msg_link (dev))
2264 devdbg (dev, "net1080 %s-%s ttl 0x%x this = %d, other = %d",
2265 dev->udev->bus->bus_name, dev->udev->devpath,
2266 ttl, TTL_THIS (ttl), TTL_OTHER (ttl));
2267}
2268
2269/*-------------------------------------------------------------------------*/
2270
2271static int net1080_reset (struct usbnet *dev)
2272{
2273 u16 usbctl, status, ttl;
2274 u16 *vp = kmalloc (sizeof (u16), GFP_KERNEL);
2275 int retval;
2276
2277 if (!vp)
2278 return -ENOMEM;
2279
2280 // nc_dump_registers (dev);
2281
2282 if ((retval = nc_register_read (dev, REG_STATUS, vp)) < 0) {
2283 dbg ("can't read %s-%s status: %d",
2284 dev->udev->bus->bus_name, dev->udev->devpath, retval);
2285 goto done;
2286 }
2287 status = *vp;
2288 nc_dump_status (dev, status);
2289
2290 if ((retval = nc_register_read (dev, REG_USBCTL, vp)) < 0) {
2291 dbg ("can't read USBCTL, %d", retval);
2292 goto done;
2293 }
2294 usbctl = *vp;
2295 nc_dump_usbctl (dev, usbctl);
2296
2297 nc_register_write (dev, REG_USBCTL,
2298 USBCTL_FLUSH_THIS | USBCTL_FLUSH_OTHER);
2299
2300 if ((retval = nc_register_read (dev, REG_TTL, vp)) < 0) {
2301 dbg ("can't read TTL, %d", retval);
2302 goto done;
2303 }
2304 ttl = *vp;
2305 // nc_dump_ttl (dev, ttl);
2306
2307 nc_register_write (dev, REG_TTL,
2308 MK_TTL (NC_READ_TTL_MS, TTL_OTHER (ttl)) );
2309 dbg ("%s: assigned TTL, %d ms", dev->net->name, NC_READ_TTL_MS);
2310
2311 if (netif_msg_link (dev))
2312 devinfo (dev, "port %c, peer %sconnected",
2313 (status & STATUS_PORT_A) ? 'A' : 'B',
2314 (status & STATUS_CONN_OTHER) ? "" : "dis"
2315 );
2316 retval = 0;
2317
2318done:
2319 kfree (vp);
2320 return retval;
2321}
2322
2323static int net1080_check_connect (struct usbnet *dev)
2324{
2325 int retval;
2326 u16 status;
2327 u16 *vp = kmalloc (sizeof (u16), GFP_KERNEL);
2328
2329 if (!vp)
2330 return -ENOMEM;
2331 retval = nc_register_read (dev, REG_STATUS, vp);
2332 status = *vp;
2333 kfree (vp);
2334 if (retval != 0) {
2335 dbg ("%s net1080_check_conn read - %d", dev->net->name, retval);
2336 return retval;
2337 }
2338 if ((status & STATUS_CONN_OTHER) != STATUS_CONN_OTHER)
2339 return -ENOLINK;
2340 return 0;
2341}
2342
2343static void nc_flush_complete (struct urb *urb, struct pt_regs *regs)
2344{
2345 kfree (urb->context);
2346 usb_free_urb(urb);
2347}
2348
2349static void nc_ensure_sync (struct usbnet *dev)
2350{
2351 dev->frame_errors++;
2352 if (dev->frame_errors > 5) {
2353 struct urb *urb;
2354 struct usb_ctrlrequest *req;
2355 int status;
2356
2357 /* Send a flush */
2358 urb = usb_alloc_urb (0, SLAB_ATOMIC);
2359 if (!urb)
2360 return;
2361
2362 req = kmalloc (sizeof *req, GFP_ATOMIC);
2363 if (!req) {
2364 usb_free_urb (urb);
2365 return;
2366 }
2367
2368 req->bRequestType = USB_DIR_OUT
2369 | USB_TYPE_VENDOR
2370 | USB_RECIP_DEVICE;
2371 req->bRequest = REQUEST_REGISTER;
2372 req->wValue = cpu_to_le16 (USBCTL_FLUSH_THIS
2373 | USBCTL_FLUSH_OTHER);
2374 req->wIndex = cpu_to_le16 (REG_USBCTL);
2375 req->wLength = cpu_to_le16 (0);
2376
2377 /* queue an async control request, we don't need
2378 * to do anything when it finishes except clean up.
2379 */
2380 usb_fill_control_urb (urb, dev->udev,
2381 usb_sndctrlpipe (dev->udev, 0),
2382 (unsigned char *) req,
2383 NULL, 0,
2384 nc_flush_complete, req);
2385 status = usb_submit_urb (urb, GFP_ATOMIC);
2386 if (status) {
2387 kfree (req);
2388 usb_free_urb (urb);
2389 return;
2390 }
2391
2392 if (netif_msg_rx_err (dev))
2393 devdbg (dev, "flush net1080; too many framing errors");
2394 dev->frame_errors = 0;
2395 }
2396}
2397
2398static int net1080_rx_fixup (struct usbnet *dev, struct sk_buff *skb)
2399{
2400 struct nc_header *header;
2401 struct nc_trailer *trailer;
2402 u16 hdr_len, packet_len;
2403
2404 if (!(skb->len & 0x01)
2405 || MIN_FRAMED > skb->len
2406 || skb->len > FRAMED_SIZE (dev->net->mtu)) {
2407 dev->stats.rx_frame_errors++;
2408 dbg ("rx framesize %d range %d..%d mtu %d", skb->len,
2409 (int)MIN_FRAMED, (int)FRAMED_SIZE (dev->net->mtu),
2410 dev->net->mtu);
2411 nc_ensure_sync (dev);
2412 return 0;
2413 }
2414
2415 header = (struct nc_header *) skb->data;
2416 hdr_len = le16_to_cpup (&header->hdr_len);
2417 packet_len = le16_to_cpup (&header->packet_len);
2418 if (FRAMED_SIZE (packet_len) > MAX_PACKET) {
2419 dev->stats.rx_frame_errors++;
2420 dbg ("packet too big, %d", packet_len);
2421 nc_ensure_sync (dev);
2422 return 0;
2423 } else if (hdr_len < MIN_HEADER) {
2424 dev->stats.rx_frame_errors++;
2425 dbg ("header too short, %d", hdr_len);
2426 nc_ensure_sync (dev);
2427 return 0;
2428 } else if (hdr_len > MIN_HEADER) {
2429 // out of band data for us?
2430 dbg ("header OOB, %d bytes", hdr_len - MIN_HEADER);
2431 nc_ensure_sync (dev);
2432 // switch (vendor/product ids) { ... }
2433 }
2434 skb_pull (skb, hdr_len);
2435
2436 trailer = (struct nc_trailer *)
2437 (skb->data + skb->len - sizeof *trailer);
2438 skb_trim (skb, skb->len - sizeof *trailer);
2439
2440 if ((packet_len & 0x01) == 0) {
2441 if (skb->data [packet_len] != PAD_BYTE) {
2442 dev->stats.rx_frame_errors++;
2443 dbg ("bad pad");
2444 return 0;
2445 }
2446 skb_trim (skb, skb->len - 1);
2447 }
2448 if (skb->len != packet_len) {
2449 dev->stats.rx_frame_errors++;
2450 dbg ("bad packet len %d (expected %d)",
2451 skb->len, packet_len);
2452 nc_ensure_sync (dev);
2453 return 0;
2454 }
2455 if (header->packet_id != get_unaligned (&trailer->packet_id)) {
2456 dev->stats.rx_fifo_errors++;
2457 dbg ("(2+ dropped) rx packet_id mismatch 0x%x 0x%x",
2458 le16_to_cpu (header->packet_id),
2459 le16_to_cpu (trailer->packet_id));
2460 return 0;
2461 }
2462#if 0
2463 devdbg (dev, "frame <rx h %d p %d id %d", header->hdr_len,
2464 header->packet_len, header->packet_id);
2465#endif
2466 dev->frame_errors = 0;
2467 return 1;
2468}
2469
2470static struct sk_buff *
2471net1080_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
2472{
2473 int padlen;
2474 struct sk_buff *skb2;
2475
2476 padlen = ((skb->len + sizeof (struct nc_header)
2477 + sizeof (struct nc_trailer)) & 0x01) ? 0 : 1;
2478 if (!skb_cloned (skb)) {
2479 int headroom = skb_headroom (skb);
2480 int tailroom = skb_tailroom (skb);
2481
2482 if ((padlen + sizeof (struct nc_trailer)) <= tailroom
2483 && sizeof (struct nc_header) <= headroom)
2484 /* There's enough head and tail room */
2485 return skb;
2486
2487 if ((sizeof (struct nc_header) + padlen
2488 + sizeof (struct nc_trailer)) <
2489 (headroom + tailroom)) {
2490 /* There's enough total room, so just readjust */
2491 skb->data = memmove (skb->head
2492 + sizeof (struct nc_header),
2493 skb->data, skb->len);
2494 skb->tail = skb->data + skb->len;
2495 return skb;
2496 }
2497 }
2498
2499 /* Create a new skb to use with the correct size */
2500 skb2 = skb_copy_expand (skb,
2501 sizeof (struct nc_header),
2502 sizeof (struct nc_trailer) + padlen,
2503 flags);
2504 dev_kfree_skb_any (skb);
2505 return skb2;
2506}
2507
2508static const struct driver_info net1080_info = {
2509 .description = "NetChip TurboCONNECT",
2510 .flags = FLAG_FRAMING_NC,
2511 .reset = net1080_reset,
2512 .check_connect =net1080_check_connect,
2513 .rx_fixup = net1080_rx_fixup,
2514 .tx_fixup = net1080_tx_fixup,
2515};
2516
2517#endif /* CONFIG_USB_NET1080 */
2518
2519
2520
2521#ifdef CONFIG_USB_PL2301
2522#define HAVE_HARDWARE
2523
2524/*-------------------------------------------------------------------------
2525 *
2526 * Prolific PL-2301/PL-2302 driver ... http://www.prolifictech.com
2527 *
2528 * The protocol and handshaking used here should be bug-compatible
2529 * with the Linux 2.2 "plusb" driver, by Deti Fliegl.
2530 *
2531 *-------------------------------------------------------------------------*/
2532
2533/*
2534 * Bits 0-4 can be used for software handshaking; they're set from
2535 * one end, cleared from the other, "read" with the interrupt byte.
2536 */
2537#define PL_S_EN (1<<7) /* (feature only) suspend enable */
2538/* reserved bit -- rx ready (6) ? */
2539#define PL_TX_READY (1<<5) /* (interrupt only) transmit ready */
2540#define PL_RESET_OUT (1<<4) /* reset output pipe */
2541#define PL_RESET_IN (1<<3) /* reset input pipe */
2542#define PL_TX_C (1<<2) /* transmission complete */
2543#define PL_TX_REQ (1<<1) /* transmission received */
2544#define PL_PEER_E (1<<0) /* peer exists */
2545
2546static inline int
2547pl_vendor_req (struct usbnet *dev, u8 req, u8 val, u8 index)
2548{
2549 return usb_control_msg (dev->udev,
2550 usb_rcvctrlpipe (dev->udev, 0),
2551 req,
2552 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
2553 val, index,
2554 NULL, 0,
2555 CONTROL_TIMEOUT_MS);
2556}
2557
2558static inline int
2559pl_clear_QuickLink_features (struct usbnet *dev, int val)
2560{
2561 return pl_vendor_req (dev, 1, (u8) val, 0);
2562}
2563
2564static inline int
2565pl_set_QuickLink_features (struct usbnet *dev, int val)
2566{
2567 return pl_vendor_req (dev, 3, (u8) val, 0);
2568}
2569
2570/*-------------------------------------------------------------------------*/
2571
2572static int pl_reset (struct usbnet *dev)
2573{
2574 /* some units seem to need this reset, others reject it utterly.
2575 * FIXME be more like "naplink" or windows drivers.
2576 */
2577 (void) pl_set_QuickLink_features (dev,
2578 PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E);
2579 return 0;
2580}
2581
2582static const struct driver_info prolific_info = {
2583 .description = "Prolific PL-2301/PL-2302",
2584 .flags = FLAG_NO_SETINT,
2585 /* some PL-2302 versions seem to fail usb_set_interface() */
2586 .reset = pl_reset,
2587};
2588
2589#endif /* CONFIG_USB_PL2301 */
2590
2591
2592#ifdef CONFIG_USB_KC2190
2593#define HAVE_HARDWARE
2594static const struct driver_info kc2190_info = {
2595 .description = "KC Technology KC-190",
2596};
2597#endif /* CONFIG_USB_KC2190 */
2598
2599
2600#ifdef CONFIG_USB_ARMLINUX
2601#define HAVE_HARDWARE
2602
2603/*-------------------------------------------------------------------------
2604 *
2605 * Intel's SA-1100 chip integrates basic USB support, and is used
2606 * in PDAs like some iPaqs, the Yopy, some Zaurus models, and more.
2607 * When they run Linux, arch/arm/mach-sa1100/usb-eth.c may be used to
2608 * network using minimal USB framing data.
2609 *
2610 * This describes the driver currently in standard ARM Linux kernels.
2611 * The Zaurus uses a different driver (see later).
2612 *
2613 * PXA25x and PXA210 use XScale cores (ARM v5TE) with better USB support
2614 * and different USB endpoint numbering than the SA1100 devices. The
2615 * mach-pxa/usb-eth.c driver re-uses the device ids from mach-sa1100
2616 * so we rely on the endpoint descriptors.
2617 *
2618 *-------------------------------------------------------------------------*/
2619
2620static const struct driver_info linuxdev_info = {
2621 .description = "Linux Device",
2622 .check_connect = always_connected,
2623};
2624
2625static const struct driver_info yopy_info = {
2626 .description = "Yopy",
2627 .check_connect = always_connected,
2628};
2629
2630static const struct driver_info blob_info = {
2631 .description = "Boot Loader OBject",
2632 .check_connect = always_connected,
2633};
2634
2635#endif /* CONFIG_USB_ARMLINUX */
2636
2637
2638#ifdef CONFIG_USB_ZAURUS
2639#define HAVE_HARDWARE
2640
2641#include <linux/crc32.h>
2642
2643/*-------------------------------------------------------------------------
2644 *
2645 * Zaurus is also a SA-1110 based PDA, but one using a different driver
2646 * (and framing) for its USB slave/gadget controller than the case above.
2647 *
2648 * For the current version of that driver, the main way that framing is
2649 * nonstandard (also from perspective of the CDC ethernet model!) is a
2650 * crc32, added to help detect when some sa1100 usb-to-memory DMA errata
2651 * haven't been fully worked around. Also, all Zaurii use the same
2652 * default Ethernet address.
2653 *
2654 * PXA based models use the same framing, and also can't implement
2655 * set_interface properly.
2656 *
2657 * All known Zaurii lie about their standards conformance. Most lie by
2658 * saying they support CDC Ethernet. Some lie and say they support CDC
2659 * MDLM (as if for access to cell phone modems). Someone, please beat
2660 * on Sharp (and other such vendors) for a while with a cluestick.
2661 *
2662 *-------------------------------------------------------------------------*/
2663
2664static struct sk_buff *
2665zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags)
2666{
2667 int padlen;
2668 struct sk_buff *skb2;
2669
2670 padlen = 2;
2671 if (!skb_cloned (skb)) {
2672 int tailroom = skb_tailroom (skb);
2673 if ((padlen + 4) <= tailroom)
2674 goto done;
2675 }
2676 skb2 = skb_copy_expand (skb, 0, 4 + padlen, flags);
2677 dev_kfree_skb_any (skb);
2678 skb = skb2;
2679 if (skb) {
2680 u32 fcs;
2681done:
2682 fcs = crc32_le (~0, skb->data, skb->len);
2683 fcs = ~fcs;
2684
2685 *skb_put (skb, 1) = fcs & 0xff;
2686 *skb_put (skb, 1) = (fcs>> 8) & 0xff;
2687 *skb_put (skb, 1) = (fcs>>16) & 0xff;
2688 *skb_put (skb, 1) = (fcs>>24) & 0xff;
2689 }
2690 return skb;
2691}
2692
2693static const struct driver_info zaurus_sl5x00_info = {
2694 .description = "Sharp Zaurus SL-5x00",
2695 .flags = FLAG_FRAMING_Z,
2696 .check_connect = always_connected,
2697 .bind = generic_cdc_bind,
2698 .unbind = cdc_unbind,
2699 .tx_fixup = zaurus_tx_fixup,
2700};
2701#define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info)
2702
2703static const struct driver_info zaurus_pxa_info = {
2704 .description = "Sharp Zaurus, PXA-2xx based",
2705 .flags = FLAG_FRAMING_Z,
2706 .check_connect = always_connected,
2707 .bind = generic_cdc_bind,
2708 .unbind = cdc_unbind,
2709 .tx_fixup = zaurus_tx_fixup,
2710};
2711#define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info)
2712
2713static const struct driver_info olympus_mxl_info = {
2714 .description = "Olympus R1000",
2715 .flags = FLAG_FRAMING_Z,
2716 .check_connect = always_connected,
2717 .bind = generic_cdc_bind,
2718 .unbind = cdc_unbind,
2719 .tx_fixup = zaurus_tx_fixup,
2720};
2721#define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info)
2722
2723
2724/* Some more recent products using Lineo/Belcarra code will wrongly claim
2725 * CDC MDLM conformance. They aren't conformant: data endpoints live
2726 * in the control interface, there's no data interface, and it's not used
2727 * to talk to a cell phone radio. But at least we can detect these two
2728 * pseudo-classes, rather than growing this product list with entries for
2729 * each new nonconformant product (sigh).
2730 */
2731static const u8 safe_guid[16] = {
2732 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
2733 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
2734};
2735static const u8 blan_guid[16] = {
2736 0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70,
2737 0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37,
2738};
2739
2740static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf)
2741{
2742 u8 *buf = intf->cur_altsetting->extra;
2743 int len = intf->cur_altsetting->extralen;
2744 struct usb_cdc_mdlm_desc *desc = NULL;
2745 struct usb_cdc_mdlm_detail_desc *detail = NULL;
2746
2747 while (len > 3) {
2748 if (buf [1] != USB_DT_CS_INTERFACE)
2749 goto next_desc;
2750
2751 /* use bDescriptorSubType, and just verify that we get a
2752 * "BLAN" (or "SAFE") descriptor.
2753 */
2754 switch (buf [2]) {
2755 case USB_CDC_MDLM_TYPE:
2756 if (desc) {
2757 dev_dbg (&intf->dev, "extra MDLM\n");
2758 goto bad_desc;
2759 }
2760 desc = (void *) buf;
2761 if (desc->bLength != sizeof *desc) {
2762 dev_dbg (&intf->dev, "MDLM len %u\n",
2763 desc->bLength);
2764 goto bad_desc;
2765 }
2766 /* expect bcdVersion 1.0, ignore */
2767 if (memcmp(&desc->bGUID, blan_guid, 16)
2768 && memcmp(&desc->bGUID, safe_guid, 16) ) {
2769 /* hey, this one might _really_ be MDLM! */
2770 dev_dbg (&intf->dev, "MDLM guid\n");
2771 goto bad_desc;
2772 }
2773 break;
2774 case USB_CDC_MDLM_DETAIL_TYPE:
2775 if (detail) {
2776 dev_dbg (&intf->dev, "extra MDLM detail\n");
2777 goto bad_desc;
2778 }
2779 detail = (void *) buf;
2780 switch (detail->bGuidDescriptorType) {
2781 case 0: /* "SAFE" */
2782 if (detail->bLength != (sizeof *detail + 2))
2783 goto bad_detail;
2784 break;
2785 case 1: /* "BLAN" */
2786 if (detail->bLength != (sizeof *detail + 3))
2787 goto bad_detail;
2788 break;
2789 default:
2790 goto bad_detail;
2791 }
2792
2793 /* assuming we either noticed BLAN already, or will
2794 * find it soon, there are some data bytes here:
2795 * - bmNetworkCapabilities (unused)
2796 * - bmDataCapabilities (bits, see below)
2797 * - bPad (ignored, for PADAFTER -- BLAN-only)
2798 * bits are:
2799 * - 0x01 -- Zaurus framing (add CRC)
2800 * - 0x02 -- PADBEFORE (CRC includes some padding)
2801 * - 0x04 -- PADAFTER (some padding after CRC)
2802 * - 0x08 -- "fermat" packet mangling (for hw bugs)
2803 * the PADBEFORE appears not to matter; we interop
2804 * with devices that use it and those that don't.
2805 */
2806 if ((detail->bDetailData[1] & ~02) != 0x01) {
2807 /* bmDataCapabilites == 0 would be fine too,
2808 * but framing is minidriver-coupled for now.
2809 */
2810bad_detail:
2811 dev_dbg (&intf->dev,
2812 "bad MDLM detail, %d %d %d\n",
2813 detail->bLength,
2814 detail->bDetailData[0],
2815 detail->bDetailData[2]);
2816 goto bad_desc;
2817 }
2818 break;
2819 }
2820next_desc:
2821 len -= buf [0]; /* bLength */
2822 buf += buf [0];
2823 }
2824
2825 if (!desc || !detail) {
2826 dev_dbg (&intf->dev, "missing cdc mdlm %s%sdescriptor\n",
2827 desc ? "" : "func ",
2828 detail ? "" : "detail ");
2829 goto bad_desc;
2830 }
2831
2832 /* There's probably a CDC Ethernet descriptor there, but we can't
2833 * rely on the Ethernet address it provides since not all vendors
2834 * bother to make it unique. Likewise there's no point in tracking
2835 * of the CDC event notifications.
2836 */
2837 return get_endpoints (dev, intf);
2838
2839bad_desc:
2840 dev_info (&dev->udev->dev, "unsupported MDLM descriptors\n");
2841 return -ENODEV;
2842}
2843
2844static const struct driver_info bogus_mdlm_info = {
2845 .description = "pseudo-MDLM (BLAN) device",
2846 .flags = FLAG_FRAMING_Z,
2847 .check_connect = always_connected,
2848 .tx_fixup = zaurus_tx_fixup,
2849 .bind = blan_mdlm_bind,
2850};
2851
2852#else
2853
2854/* blacklist all those devices */
2855#define ZAURUS_STRONGARM_INFO 0
2856#define ZAURUS_PXA_INFO 0
2857#define OLYMPUS_MXL_INFO 0
2858
2859#endif
2860 222
2861 223
2862/*------------------------------------------------------------------------- 224/*-------------------------------------------------------------------------
@@ -2868,22 +230,12 @@ static const struct driver_info bogus_mdlm_info = {
2868static int usbnet_change_mtu (struct net_device *net, int new_mtu) 230static int usbnet_change_mtu (struct net_device *net, int new_mtu)
2869{ 231{
2870 struct usbnet *dev = netdev_priv(net); 232 struct usbnet *dev = netdev_priv(net);
233 int ll_mtu = new_mtu + net->hard_header_len;
2871 234
2872 if (new_mtu <= MIN_PACKET || new_mtu > MAX_PACKET) 235 if (new_mtu <= 0 || ll_mtu > dev->hard_mtu)
2873 return -EINVAL; 236 return -EINVAL;
2874#ifdef CONFIG_USB_NET1080
2875 if (((dev->driver_info->flags) & FLAG_FRAMING_NC)) {
2876 if (FRAMED_SIZE (new_mtu) > MAX_PACKET)
2877 return -EINVAL;
2878 }
2879#endif
2880#ifdef CONFIG_USB_GENESYS
2881 if (((dev->driver_info->flags) & FLAG_FRAMING_GL)
2882 && new_mtu > GL_MAX_PACKET_LEN)
2883 return -EINVAL;
2884#endif
2885 // no second zero-length packet read wanted after mtu-sized packets 237 // no second zero-length packet read wanted after mtu-sized packets
2886 if (((new_mtu + sizeof (struct ethhdr)) % dev->maxpacket) == 0) 238 if ((ll_mtu % dev->maxpacket) == 0)
2887 return -EDOM; 239 return -EDOM;
2888 net->mtu = new_mtu; 240 net->mtu = new_mtu;
2889 return 0; 241 return 0;
@@ -2922,7 +274,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea
2922 * NOTE: annoying asymmetry: if it's active, schedule_work() fails, 274 * NOTE: annoying asymmetry: if it's active, schedule_work() fails,
2923 * but tasklet_schedule() doesn't. hope the failure is rare. 275 * but tasklet_schedule() doesn't. hope the failure is rare.
2924 */ 276 */
2925static void defer_kevent (struct usbnet *dev, int work) 277void usbnet_defer_kevent (struct usbnet *dev, int work)
2926{ 278{
2927 set_bit (work, &dev->flags); 279 set_bit (work, &dev->flags);
2928 if (!schedule_work (&dev->kevent)) 280 if (!schedule_work (&dev->kevent))
@@ -2930,50 +282,24 @@ static void defer_kevent (struct usbnet *dev, int work)
2930 else 282 else
2931 devdbg (dev, "kevent %d scheduled", work); 283 devdbg (dev, "kevent %d scheduled", work);
2932} 284}
285EXPORT_SYMBOL_GPL(usbnet_defer_kevent);
2933 286
2934/*-------------------------------------------------------------------------*/ 287/*-------------------------------------------------------------------------*/
2935 288
2936static void rx_complete (struct urb *urb, struct pt_regs *regs); 289static void rx_complete (struct urb *urb, struct pt_regs *regs);
2937 290
2938static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) 291static void rx_submit (struct usbnet *dev, struct urb *urb, unsigned flags)
2939{ 292{
2940 struct sk_buff *skb; 293 struct sk_buff *skb;
2941 struct skb_data *entry; 294 struct skb_data *entry;
2942 int retval = 0; 295 int retval = 0;
2943 unsigned long lockflags; 296 unsigned long lockflags;
2944 size_t size; 297 size_t size = dev->rx_urb_size;
2945
2946#ifdef CONFIG_USB_NET1080
2947 if (dev->driver_info->flags & FLAG_FRAMING_NC)
2948 size = FRAMED_SIZE (dev->net->mtu);
2949 else
2950#endif
2951#ifdef CONFIG_USB_GENESYS
2952 if (dev->driver_info->flags & FLAG_FRAMING_GL)
2953 size = GL_RCV_BUF_SIZE;
2954 else
2955#endif
2956#ifdef CONFIG_USB_ZAURUS
2957 if (dev->driver_info->flags & FLAG_FRAMING_Z)
2958 size = 6 + (sizeof (struct ethhdr) + dev->net->mtu);
2959 else
2960#endif
2961#ifdef CONFIG_USB_RNDIS
2962 if (dev->driver_info->flags & FLAG_FRAMING_RN)
2963 size = RNDIS_MAX_TRANSFER;
2964 else
2965#endif
2966#ifdef CONFIG_USB_AX8817X
2967 if (dev->driver_info->flags & FLAG_FRAMING_AX)
2968 size = 2048;
2969 else
2970#endif
2971 size = (sizeof (struct ethhdr) + dev->net->mtu);
2972 298
2973 if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { 299 if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) {
2974 if (netif_msg_rx_err (dev)) 300 if (netif_msg_rx_err (dev))
2975 devdbg (dev, "no rx skb"); 301 devdbg (dev, "no rx skb");
2976 defer_kevent (dev, EVENT_RX_MEMORY); 302 usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
2977 usb_free_urb (urb); 303 usb_free_urb (urb);
2978 return; 304 return;
2979 } 305 }
@@ -2987,7 +313,6 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags)
2987 313
2988 usb_fill_bulk_urb (urb, dev->udev, dev->in, 314 usb_fill_bulk_urb (urb, dev->udev, dev->in,
2989 skb->data, size, rx_complete, skb); 315 skb->data, size, rx_complete, skb);
2990 urb->transfer_flags |= URB_ASYNC_UNLINK;
2991 316
2992 spin_lock_irqsave (&dev->rxq.lock, lockflags); 317 spin_lock_irqsave (&dev->rxq.lock, lockflags);
2993 318
@@ -2996,10 +321,10 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags)
2996 && !test_bit (EVENT_RX_HALT, &dev->flags)) { 321 && !test_bit (EVENT_RX_HALT, &dev->flags)) {
2997 switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){ 322 switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){
2998 case -EPIPE: 323 case -EPIPE:
2999 defer_kevent (dev, EVENT_RX_HALT); 324 usbnet_defer_kevent (dev, EVENT_RX_HALT);
3000 break; 325 break;
3001 case -ENOMEM: 326 case -ENOMEM:
3002 defer_kevent (dev, EVENT_RX_MEMORY); 327 usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
3003 break; 328 break;
3004 case -ENODEV: 329 case -ENODEV:
3005 if (netif_msg_ifdown (dev)) 330 if (netif_msg_ifdown (dev))
@@ -3037,7 +362,7 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)
3037 // else network stack removes extra byte if we forced a short packet 362 // else network stack removes extra byte if we forced a short packet
3038 363
3039 if (skb->len) 364 if (skb->len)
3040 skb_return (dev, skb); 365 usbnet_skb_return (dev, skb);
3041 else { 366 else {
3042 if (netif_msg_rx_err (dev)) 367 if (netif_msg_rx_err (dev))
3043 devdbg (dev, "drop"); 368 devdbg (dev, "drop");
@@ -3063,7 +388,7 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs)
3063 switch (urb_status) { 388 switch (urb_status) {
3064 // success 389 // success
3065 case 0: 390 case 0:
3066 if (MIN_PACKET > skb->len || skb->len > MAX_PACKET) { 391 if (skb->len < dev->net->hard_header_len) {
3067 entry->state = rx_cleanup; 392 entry->state = rx_cleanup;
3068 dev->stats.rx_errors++; 393 dev->stats.rx_errors++;
3069 dev->stats.rx_length_errors++; 394 dev->stats.rx_length_errors++;
@@ -3078,7 +403,7 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs)
3078 // storm, recovering as needed. 403 // storm, recovering as needed.
3079 case -EPIPE: 404 case -EPIPE:
3080 dev->stats.rx_errors++; 405 dev->stats.rx_errors++;
3081 defer_kevent (dev, EVENT_RX_HALT); 406 usbnet_defer_kevent (dev, EVENT_RX_HALT);
3082 // FALLTHROUGH 407 // FALLTHROUGH
3083 408
3084 // software-driven interface shutdown 409 // software-driven interface shutdown
@@ -3320,55 +645,58 @@ done:
3320 645
3321/*-------------------------------------------------------------------------*/ 646/*-------------------------------------------------------------------------*/
3322 647
3323static void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) 648/* ethtool methods; minidrivers may need to add some more, but
649 * they'll probably want to use this base set.
650 */
651
652void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info)
3324{ 653{
3325 struct usbnet *dev = netdev_priv(net); 654 struct usbnet *dev = netdev_priv(net);
3326 655
656 /* REVISIT don't always return "usbnet" */
3327 strncpy (info->driver, driver_name, sizeof info->driver); 657 strncpy (info->driver, driver_name, sizeof info->driver);
3328 strncpy (info->version, DRIVER_VERSION, sizeof info->version); 658 strncpy (info->version, DRIVER_VERSION, sizeof info->version);
3329 strncpy (info->fw_version, dev->driver_info->description, 659 strncpy (info->fw_version, dev->driver_info->description,
3330 sizeof info->fw_version); 660 sizeof info->fw_version);
3331 usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); 661 usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info);
3332} 662}
663EXPORT_SYMBOL_GPL(usbnet_get_drvinfo);
3333 664
3334static u32 usbnet_get_link (struct net_device *net) 665static u32 usbnet_get_link (struct net_device *net)
3335{ 666{
3336 struct usbnet *dev = netdev_priv(net); 667 struct usbnet *dev = netdev_priv(net);
3337 668
3338 /* If a check_connect is defined, return it's results */ 669 /* If a check_connect is defined, return its result */
3339 if (dev->driver_info->check_connect) 670 if (dev->driver_info->check_connect)
3340 return dev->driver_info->check_connect (dev) == 0; 671 return dev->driver_info->check_connect (dev) == 0;
3341 672
3342 /* Otherwise, we're up to avoid breaking scripts */ 673 /* Otherwise, say we're up (to avoid breaking scripts) */
3343 return 1; 674 return 1;
3344} 675}
3345 676
3346static u32 usbnet_get_msglevel (struct net_device *net) 677u32 usbnet_get_msglevel (struct net_device *net)
3347{ 678{
3348 struct usbnet *dev = netdev_priv(net); 679 struct usbnet *dev = netdev_priv(net);
3349 680
3350 return dev->msg_enable; 681 return dev->msg_enable;
3351} 682}
683EXPORT_SYMBOL_GPL(usbnet_get_msglevel);
3352 684
3353static void usbnet_set_msglevel (struct net_device *net, u32 level) 685void usbnet_set_msglevel (struct net_device *net, u32 level)
3354{ 686{
3355 struct usbnet *dev = netdev_priv(net); 687 struct usbnet *dev = netdev_priv(net);
3356 688
3357 dev->msg_enable = level; 689 dev->msg_enable = level;
3358} 690}
691EXPORT_SYMBOL_GPL(usbnet_set_msglevel);
3359 692
3360static int usbnet_ioctl (struct net_device *net, struct ifreq *rq, int cmd) 693/* drivers may override default ethtool_ops in their bind() routine */
3361{ 694static struct ethtool_ops usbnet_ethtool_ops = {
3362#ifdef NEED_MII 695 .get_drvinfo = usbnet_get_drvinfo,
3363 { 696 .get_link = usbnet_get_link,
3364 struct usbnet *dev = netdev_priv(net); 697 .get_msglevel = usbnet_get_msglevel,
3365 698 .set_msglevel = usbnet_set_msglevel,
3366 if (dev->mii.mdio_read != NULL && dev->mii.mdio_write != NULL) 699};
3367 return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
3368 }
3369#endif
3370 return -EOPNOTSUPP;
3371}
3372 700
3373/*-------------------------------------------------------------------------*/ 701/*-------------------------------------------------------------------------*/
3374 702
@@ -3387,19 +715,24 @@ kevent (void *data)
3387 if (test_bit (EVENT_TX_HALT, &dev->flags)) { 715 if (test_bit (EVENT_TX_HALT, &dev->flags)) {
3388 unlink_urbs (dev, &dev->txq); 716 unlink_urbs (dev, &dev->txq);
3389 status = usb_clear_halt (dev->udev, dev->out); 717 status = usb_clear_halt (dev->udev, dev->out);
3390 if (status < 0 && status != -EPIPE) { 718 if (status < 0
719 && status != -EPIPE
720 && status != -ESHUTDOWN) {
3391 if (netif_msg_tx_err (dev)) 721 if (netif_msg_tx_err (dev))
3392 deverr (dev, "can't clear tx halt, status %d", 722 deverr (dev, "can't clear tx halt, status %d",
3393 status); 723 status);
3394 } else { 724 } else {
3395 clear_bit (EVENT_TX_HALT, &dev->flags); 725 clear_bit (EVENT_TX_HALT, &dev->flags);
3396 netif_wake_queue (dev->net); 726 if (status != -ESHUTDOWN)
727 netif_wake_queue (dev->net);
3397 } 728 }
3398 } 729 }
3399 if (test_bit (EVENT_RX_HALT, &dev->flags)) { 730 if (test_bit (EVENT_RX_HALT, &dev->flags)) {
3400 unlink_urbs (dev, &dev->rxq); 731 unlink_urbs (dev, &dev->rxq);
3401 status = usb_clear_halt (dev->udev, dev->in); 732 status = usb_clear_halt (dev->udev, dev->in);
3402 if (status < 0 && status != -EPIPE) { 733 if (status < 0
734 && status != -EPIPE
735 && status != -ESHUTDOWN) {
3403 if (netif_msg_rx_err (dev)) 736 if (netif_msg_rx_err (dev))
3404 deverr (dev, "can't clear rx halt, status %d", 737 deverr (dev, "can't clear rx halt, status %d",
3405 status); 738 status);
@@ -3458,7 +791,7 @@ static void tx_complete (struct urb *urb, struct pt_regs *regs)
3458 791
3459 switch (urb->status) { 792 switch (urb->status) {
3460 case -EPIPE: 793 case -EPIPE:
3461 defer_kevent (dev, EVENT_TX_HALT); 794 usbnet_defer_kevent (dev, EVENT_TX_HALT);
3462 break; 795 break;
3463 796
3464 /* software-driven interface shutdown */ 797 /* software-driven interface shutdown */
@@ -3515,10 +848,6 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
3515 struct skb_data *entry; 848 struct skb_data *entry;
3516 struct driver_info *info = dev->driver_info; 849 struct driver_info *info = dev->driver_info;
3517 unsigned long flags; 850 unsigned long flags;
3518#ifdef CONFIG_USB_NET1080
3519 struct nc_header *header = NULL;
3520 struct nc_trailer *trailer = NULL;
3521#endif /* CONFIG_USB_NET1080 */
3522 851
3523 // some devices want funky USB-level framing, for 852 // some devices want funky USB-level framing, for
3524 // win32 driver (usually) and/or hardware quirks 853 // win32 driver (usually) and/or hardware quirks
@@ -3544,24 +873,8 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
3544 entry->state = tx_start; 873 entry->state = tx_start;
3545 entry->length = length; 874 entry->length = length;
3546 875
3547 // FIXME: reorganize a bit, so that fixup() fills out NetChip
3548 // framing too. (Packet ID update needs the spinlock...)
3549 // [ BETTER: we already own net->xmit_lock, that's enough ]
3550
3551#ifdef CONFIG_USB_NET1080
3552 if (info->flags & FLAG_FRAMING_NC) {
3553 header = (struct nc_header *) skb_push (skb, sizeof *header);
3554 header->hdr_len = cpu_to_le16 (sizeof (*header));
3555 header->packet_len = cpu_to_le16 (length);
3556 if (!((skb->len + sizeof *trailer) & 0x01))
3557 *skb_put (skb, 1) = PAD_BYTE;
3558 trailer = (struct nc_trailer *) skb_put (skb, sizeof *trailer);
3559 }
3560#endif /* CONFIG_USB_NET1080 */
3561
3562 usb_fill_bulk_urb (urb, dev->udev, dev->out, 876 usb_fill_bulk_urb (urb, dev->udev, dev->out,
3563 skb->data, skb->len, tx_complete, skb); 877 skb->data, skb->len, tx_complete, skb);
3564 urb->transfer_flags |= URB_ASYNC_UNLINK;
3565 878
3566 /* don't assume the hardware handles USB_ZERO_PACKET 879 /* don't assume the hardware handles USB_ZERO_PACKET
3567 * NOTE: strictly conforming cdc-ether devices should expect 880 * NOTE: strictly conforming cdc-ether devices should expect
@@ -3574,22 +887,10 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
3574 887
3575 spin_lock_irqsave (&dev->txq.lock, flags); 888 spin_lock_irqsave (&dev->txq.lock, flags);
3576 889
3577#ifdef CONFIG_USB_NET1080
3578 if (info->flags & FLAG_FRAMING_NC) {
3579 header->packet_id = cpu_to_le16 ((u16)dev->dev_packet_id++);
3580 put_unaligned (header->packet_id, &trailer->packet_id);
3581#if 0
3582 devdbg (dev, "frame >tx h %d p %d id %d",
3583 header->hdr_len, header->packet_len,
3584 header->packet_id);
3585#endif
3586 }
3587#endif /* CONFIG_USB_NET1080 */
3588
3589 switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) { 890 switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) {
3590 case -EPIPE: 891 case -EPIPE:
3591 netif_stop_queue (net); 892 netif_stop_queue (net);
3592 defer_kevent (dev, EVENT_TX_HALT); 893 usbnet_defer_kevent (dev, EVENT_TX_HALT);
3593 break; 894 break;
3594 default: 895 default:
3595 if (netif_msg_tx_err (dev)) 896 if (netif_msg_tx_err (dev))
@@ -3692,7 +993,7 @@ static void usbnet_bh (unsigned long param)
3692 993
3693// precondition: never called in_interrupt 994// precondition: never called in_interrupt
3694 995
3695static void usbnet_disconnect (struct usb_interface *intf) 996void usbnet_disconnect (struct usb_interface *intf)
3696{ 997{
3697 struct usbnet *dev; 998 struct usbnet *dev;
3698 struct usb_device *xdev; 999 struct usb_device *xdev;
@@ -3706,7 +1007,8 @@ static void usbnet_disconnect (struct usb_interface *intf)
3706 xdev = interface_to_usbdev (intf); 1007 xdev = interface_to_usbdev (intf);
3707 1008
3708 if (netif_msg_probe (dev)) 1009 if (netif_msg_probe (dev))
3709 devinfo (dev, "unregister usbnet usb-%s-%s, %s", 1010 devinfo (dev, "unregister '%s' usb-%s-%s, %s",
1011 intf->dev.driver->name,
3710 xdev->bus->bus_name, xdev->devpath, 1012 xdev->bus->bus_name, xdev->devpath,
3711 dev->driver_info->description); 1013 dev->driver_info->description);
3712 1014
@@ -3722,15 +1024,14 @@ static void usbnet_disconnect (struct usb_interface *intf)
3722 free_netdev(net); 1024 free_netdev(net);
3723 usb_put_dev (xdev); 1025 usb_put_dev (xdev);
3724} 1026}
1027EXPORT_SYMBOL_GPL(usbnet_disconnect);
3725 1028
3726 1029
3727/*-------------------------------------------------------------------------*/ 1030/*-------------------------------------------------------------------------*/
3728 1031
3729static struct ethtool_ops usbnet_ethtool_ops;
3730
3731// precondition: never called in_interrupt 1032// precondition: never called in_interrupt
3732 1033
3733static int 1034int
3734usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) 1035usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3735{ 1036{
3736 struct usbnet *dev; 1037 struct usbnet *dev;
@@ -3779,6 +1080,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3779 strcpy (net->name, "usb%d"); 1080 strcpy (net->name, "usb%d");
3780 memcpy (net->dev_addr, node_id, sizeof node_id); 1081 memcpy (net->dev_addr, node_id, sizeof node_id);
3781 1082
1083 /* rx and tx sides can use different message sizes;
1084 * bind() should set rx_urb_size in that case.
1085 */
1086 dev->hard_mtu = net->mtu + net->hard_header_len;
3782#if 0 1087#if 0
3783// dma_supported() is deeply broken on almost all architectures 1088// dma_supported() is deeply broken on almost all architectures
3784 // possible with some EHCI controllers 1089 // possible with some EHCI controllers
@@ -3793,7 +1098,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3793 net->stop = usbnet_stop; 1098 net->stop = usbnet_stop;
3794 net->watchdog_timeo = TX_TIMEOUT_JIFFIES; 1099 net->watchdog_timeo = TX_TIMEOUT_JIFFIES;
3795 net->tx_timeout = usbnet_tx_timeout; 1100 net->tx_timeout = usbnet_tx_timeout;
3796 net->do_ioctl = usbnet_ioctl;
3797 net->ethtool_ops = &usbnet_ethtool_ops; 1101 net->ethtool_ops = &usbnet_ethtool_ops;
3798 1102
3799 // allow device-specific bind/init procedures 1103 // allow device-specific bind/init procedures
@@ -3806,8 +1110,12 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3806 if ((dev->driver_info->flags & FLAG_ETHER) != 0 1110 if ((dev->driver_info->flags & FLAG_ETHER) != 0
3807 && (net->dev_addr [0] & 0x02) == 0) 1111 && (net->dev_addr [0] & 0x02) == 0)
3808 strcpy (net->name, "eth%d"); 1112 strcpy (net->name, "eth%d");
3809 } else if (!info->in || info->out) 1113
3810 status = get_endpoints (dev, udev); 1114 /* maybe the remote can't receive an Ethernet MTU */
1115 if (net->mtu > (dev->hard_mtu - net->hard_header_len))
1116 net->mtu = dev->hard_mtu - net->hard_header_len;
1117 } else if (!info->in || !info->out)
1118 status = usbnet_get_endpoints (dev, udev);
3811 else { 1119 else {
3812 dev->in = usb_rcvbulkpipe (xdev, info->in); 1120 dev->in = usb_rcvbulkpipe (xdev, info->in);
3813 dev->out = usb_sndbulkpipe (xdev, info->out); 1121 dev->out = usb_sndbulkpipe (xdev, info->out);
@@ -3819,12 +1127,13 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3819 status = 0; 1127 status = 0;
3820 1128
3821 } 1129 }
3822
3823 if (status == 0 && dev->status) 1130 if (status == 0 && dev->status)
3824 status = init_status (dev, udev); 1131 status = init_status (dev, udev);
3825 if (status < 0) 1132 if (status < 0)
3826 goto out1; 1133 goto out1;
3827 1134
1135 if (!dev->rx_urb_size)
1136 dev->rx_urb_size = dev->hard_mtu;
3828 dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); 1137 dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
3829 1138
3830 SET_NETDEV_DEV(net, &udev->dev); 1139 SET_NETDEV_DEV(net, &udev->dev);
@@ -3832,8 +1141,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
3832 if (status) 1141 if (status)
3833 goto out3; 1142 goto out3;
3834 if (netif_msg_probe (dev)) 1143 if (netif_msg_probe (dev))
3835 devinfo (dev, "register usbnet at usb-%s-%s, %s, " 1144 devinfo (dev, "register '%s' at usb-%s-%s, %s, "
3836 "%02x:%02x:%02x:%02x:%02x:%02x", 1145 "%02x:%02x:%02x:%02x:%02x:%02x",
1146 udev->dev.driver->name,
3837 xdev->bus->bus_name, xdev->devpath, 1147 xdev->bus->bus_name, xdev->devpath,
3838 dev->driver_info->description, 1148 dev->driver_info->description,
3839 net->dev_addr [0], net->dev_addr [1], 1149 net->dev_addr [0], net->dev_addr [1],
@@ -3857,12 +1167,15 @@ out:
3857 usb_put_dev(xdev); 1167 usb_put_dev(xdev);
3858 return status; 1168 return status;
3859} 1169}
1170EXPORT_SYMBOL_GPL(usbnet_probe);
3860 1171
3861/*-------------------------------------------------------------------------*/ 1172/*-------------------------------------------------------------------------*/
3862 1173
3863#ifdef CONFIG_PM 1174/* FIXME these suspend/resume methods assume non-CDC style
1175 * devices, with only one interface.
1176 */
3864 1177
3865static int usbnet_suspend (struct usb_interface *intf, pm_message_t message) 1178int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
3866{ 1179{
3867 struct usbnet *dev = usb_get_intfdata(intf); 1180 struct usbnet *dev = usb_get_intfdata(intf);
3868 1181
@@ -3875,8 +1188,9 @@ static int usbnet_suspend (struct usb_interface *intf, pm_message_t message)
3875 intf->dev.power.power_state = PMSG_SUSPEND; 1188 intf->dev.power.power_state = PMSG_SUSPEND;
3876 return 0; 1189 return 0;
3877} 1190}
1191EXPORT_SYMBOL_GPL(usbnet_suspend);
3878 1192
3879static int usbnet_resume (struct usb_interface *intf) 1193int usbnet_resume (struct usb_interface *intf)
3880{ 1194{
3881 struct usbnet *dev = usb_get_intfdata(intf); 1195 struct usbnet *dev = usb_get_intfdata(intf);
3882 1196
@@ -3885,357 +1199,27 @@ static int usbnet_resume (struct usb_interface *intf)
3885 tasklet_schedule (&dev->bh); 1199 tasklet_schedule (&dev->bh);
3886 return 0; 1200 return 0;
3887} 1201}
1202EXPORT_SYMBOL_GPL(usbnet_resume);
3888 1203
3889#else /* !CONFIG_PM */
3890
3891#define usbnet_suspend NULL
3892#define usbnet_resume NULL
3893
3894#endif /* CONFIG_PM */
3895
3896/*-------------------------------------------------------------------------*/
3897
3898#ifndef HAVE_HARDWARE
3899#error You need to configure some hardware for this driver
3900#endif
3901
3902/*
3903 * chip vendor names won't normally be on the cables, and
3904 * may not be on the device.
3905 */
3906
3907static const struct usb_device_id products [] = {
3908
3909#ifdef CONFIG_USB_ALI_M5632
3910{
3911 USB_DEVICE (0x0402, 0x5632), // ALi defaults
3912 .driver_info = (unsigned long) &ali_m5632_info,
3913},
3914#endif
3915
3916#ifdef CONFIG_USB_AN2720
3917{
3918 USB_DEVICE (0x0547, 0x2720), // AnchorChips defaults
3919 .driver_info = (unsigned long) &an2720_info,
3920}, {
3921 USB_DEVICE (0x0547, 0x2727), // Xircom PGUNET
3922 .driver_info = (unsigned long) &an2720_info,
3923},
3924#endif
3925
3926#ifdef CONFIG_USB_BELKIN
3927{
3928 USB_DEVICE (0x050d, 0x0004), // Belkin
3929 .driver_info = (unsigned long) &belkin_info,
3930}, {
3931 USB_DEVICE (0x056c, 0x8100), // eTEK
3932 .driver_info = (unsigned long) &belkin_info,
3933}, {
3934 USB_DEVICE (0x0525, 0x9901), // Advance USBNET (eTEK)
3935 .driver_info = (unsigned long) &belkin_info,
3936},
3937#endif
3938
3939#ifdef CONFIG_USB_AX8817X
3940{
3941 // Linksys USB200M
3942 USB_DEVICE (0x077b, 0x2226),
3943 .driver_info = (unsigned long) &ax8817x_info,
3944}, {
3945 // Netgear FA120
3946 USB_DEVICE (0x0846, 0x1040),
3947 .driver_info = (unsigned long) &netgear_fa120_info,
3948}, {
3949 // DLink DUB-E100
3950 USB_DEVICE (0x2001, 0x1a00),
3951 .driver_info = (unsigned long) &dlink_dub_e100_info,
3952}, {
3953 // Intellinet, ST Lab USB Ethernet
3954 USB_DEVICE (0x0b95, 0x1720),
3955 .driver_info = (unsigned long) &ax8817x_info,
3956}, {
3957 // Hawking UF200, TrendNet TU2-ET100
3958 USB_DEVICE (0x07b8, 0x420a),
3959 .driver_info = (unsigned long) &hawking_uf200_info,
3960}, {
3961 // Billionton Systems, USB2AR
3962 USB_DEVICE (0x08dd, 0x90ff),
3963 .driver_info = (unsigned long) &ax8817x_info,
3964}, {
3965 // ATEN UC210T
3966 USB_DEVICE (0x0557, 0x2009),
3967 .driver_info = (unsigned long) &ax8817x_info,
3968}, {
3969 // Buffalo LUA-U2-KTX
3970 USB_DEVICE (0x0411, 0x003d),
3971 .driver_info = (unsigned long) &ax8817x_info,
3972}, {
3973 // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter"
3974 USB_DEVICE (0x6189, 0x182d),
3975 .driver_info = (unsigned long) &ax8817x_info,
3976}, {
3977 // corega FEther USB2-TX
3978 USB_DEVICE (0x07aa, 0x0017),
3979 .driver_info = (unsigned long) &ax8817x_info,
3980}, {
3981 // Surecom EP-1427X-2
3982 USB_DEVICE (0x1189, 0x0893),
3983 .driver_info = (unsigned long) &ax8817x_info,
3984}, {
3985 // goodway corp usb gwusb2e
3986 USB_DEVICE (0x1631, 0x6200),
3987 .driver_info = (unsigned long) &ax8817x_info,
3988}, {
3989 // ASIX AX88772 10/100
3990 USB_DEVICE (0x0b95, 0x7720),
3991 .driver_info = (unsigned long) &ax88772_info,
3992},
3993#endif
3994
3995#ifdef CONFIG_USB_EPSON2888
3996{
3997 USB_DEVICE (0x0525, 0x2888), // EPSON USB client
3998 .driver_info = (unsigned long) &epson2888_info,
3999},
4000#endif
4001
4002#ifdef CONFIG_USB_GENESYS
4003{
4004 USB_DEVICE (0x05e3, 0x0502), // GL620USB-A
4005 .driver_info = (unsigned long) &genelink_info,
4006},
4007 /* NOT: USB_DEVICE (0x05e3, 0x0501), // GL620USB
4008 * that's half duplex, not currently supported
4009 */
4010#endif
4011
4012#ifdef CONFIG_USB_NET1080
4013{
4014 USB_DEVICE (0x0525, 0x1080), // NetChip ref design
4015 .driver_info = (unsigned long) &net1080_info,
4016}, {
4017 USB_DEVICE (0x06D0, 0x0622), // Laplink Gold
4018 .driver_info = (unsigned long) &net1080_info,
4019},
4020#endif
4021
4022#ifdef CONFIG_USB_PL2301
4023{
4024 USB_DEVICE (0x067b, 0x0000), // PL-2301
4025 .driver_info = (unsigned long) &prolific_info,
4026}, {
4027 USB_DEVICE (0x067b, 0x0001), // PL-2302
4028 .driver_info = (unsigned long) &prolific_info,
4029},
4030#endif
4031
4032#ifdef CONFIG_USB_KC2190
4033{
4034 USB_DEVICE (0x050f, 0x0190), // KC-190
4035 .driver_info = (unsigned long) &kc2190_info,
4036},
4037#endif
4038
4039#ifdef CONFIG_USB_RNDIS
4040{
4041 /* RNDIS is MSFT's un-official variant of CDC ACM */
4042 USB_INTERFACE_INFO (USB_CLASS_COMM, 2 /* ACM */, 0x0ff),
4043 .driver_info = (unsigned long) &rndis_info,
4044},
4045#endif
4046
4047#ifdef CONFIG_USB_ARMLINUX
4048/*
4049 * SA-1100 using standard ARM Linux kernels, or compatible.
4050 * Often used when talking to Linux PDAs (iPaq, Yopy, etc).
4051 * The sa-1100 "usb-eth" driver handles the basic framing.
4052 *
4053 * PXA25x or PXA210 ... these use a "usb-eth" driver much like
4054 * the sa1100 one, but hardware uses different endpoint numbers.
4055 *
4056 * Or the Linux "Ethernet" gadget on hardware that can't talk
4057 * CDC Ethernet (e.g., no altsettings), in either of two modes:
4058 * - acting just like the old "usb-eth" firmware, though
4059 * the implementation is different
4060 * - supporting RNDIS as the first/default configuration for
4061 * MS-Windows interop; Linux needs to use the other config
4062 */
4063{
4064 // 1183 = 0x049F, both used as hex values?
4065 // Compaq "Itsy" vendor/product id
4066 USB_DEVICE (0x049F, 0x505A), // usb-eth, or compatible
4067 .driver_info = (unsigned long) &linuxdev_info,
4068}, {
4069 USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy"
4070 .driver_info = (unsigned long) &yopy_info,
4071}, {
4072 USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader
4073 .driver_info = (unsigned long) &blob_info,
4074}, {
4075 // Linux Ethernet/RNDIS gadget on pxa210/25x/26x
4076 // e.g. Gumstix, current OpenZaurus, ...
4077 USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203),
4078 .driver_info = (unsigned long) &linuxdev_info,
4079},
4080#endif
4081
4082#if defined(CONFIG_USB_ZAURUS) || defined(CONFIG_USB_CDCETHER)
4083/*
4084 * SA-1100 based Sharp Zaurus ("collie"), or compatible.
4085 * Same idea as above, but different framing.
4086 *
4087 * PXA-2xx based models are also lying-about-cdc.
4088 * Some models don't even tell the same lies ...
4089 *
4090 * NOTE: OpenZaurus versions with 2.6 kernels won't use these entries,
4091 * unlike the older ones with 2.4 "embedix" kernels.
4092 *
4093 * NOTE: These entries do double-duty, serving as blacklist entries
4094 * whenever Zaurus support isn't enabled, but CDC Ethernet is.
4095 */
4096#define ZAURUS_MASTER_INTERFACE \
4097 .bInterfaceClass = USB_CLASS_COMM, \
4098 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
4099 .bInterfaceProtocol = USB_CDC_PROTO_NONE
4100{
4101 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4102 | USB_DEVICE_ID_MATCH_DEVICE,
4103 .idVendor = 0x04DD,
4104 .idProduct = 0x8004,
4105 ZAURUS_MASTER_INTERFACE,
4106 .driver_info = ZAURUS_STRONGARM_INFO,
4107}, {
4108 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4109 | USB_DEVICE_ID_MATCH_DEVICE,
4110 .idVendor = 0x04DD,
4111 .idProduct = 0x8005, /* A-300 */
4112 ZAURUS_MASTER_INTERFACE,
4113 .driver_info = ZAURUS_PXA_INFO,
4114}, {
4115 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4116 | USB_DEVICE_ID_MATCH_DEVICE,
4117 .idVendor = 0x04DD,
4118 .idProduct = 0x8006, /* B-500/SL-5600 */
4119 ZAURUS_MASTER_INTERFACE,
4120 .driver_info = ZAURUS_PXA_INFO,
4121}, {
4122 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4123 | USB_DEVICE_ID_MATCH_DEVICE,
4124 .idVendor = 0x04DD,
4125 .idProduct = 0x8007, /* C-700 */
4126 ZAURUS_MASTER_INTERFACE,
4127 .driver_info = ZAURUS_PXA_INFO,
4128}, {
4129 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4130 | USB_DEVICE_ID_MATCH_DEVICE,
4131 .idVendor = 0x04DD,
4132 .idProduct = 0x9031, /* C-750 C-760 */
4133 ZAURUS_MASTER_INTERFACE,
4134 .driver_info = ZAURUS_PXA_INFO,
4135}, {
4136 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4137 | USB_DEVICE_ID_MATCH_DEVICE,
4138 .idVendor = 0x04DD,
4139 .idProduct = 0x9032, /* SL-6000 */
4140 ZAURUS_MASTER_INTERFACE,
4141 .driver_info = ZAURUS_PXA_INFO,
4142}, {
4143 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4144 | USB_DEVICE_ID_MATCH_DEVICE,
4145 .idVendor = 0x04DD,
4146 /* reported with some C860 units */
4147 .idProduct = 0x9050, /* C-860 */
4148 ZAURUS_MASTER_INTERFACE,
4149 .driver_info = ZAURUS_PXA_INFO,
4150},
4151
4152#ifdef CONFIG_USB_ZAURUS
4153 /* At least some (reports vary) PXA units have very different lies
4154 * about their standards support: they claim to be cell phones with
4155 * direct access to their radios. (They don't conform to CDC MDLM.)
4156 */
4157{
4158 USB_INTERFACE_INFO (USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
4159 USB_CDC_PROTO_NONE),
4160 .driver_info = (unsigned long) &bogus_mdlm_info,
4161},
4162#endif
4163
4164/* Olympus has some models with a Zaurus-compatible option.
4165 * R-1000 uses a FreeScale i.MXL cpu (ARMv4T)
4166 */
4167{
4168 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
4169 | USB_DEVICE_ID_MATCH_DEVICE,
4170 .idVendor = 0x07B4,
4171 .idProduct = 0x0F02, /* R-1000 */
4172 ZAURUS_MASTER_INTERFACE,
4173 .driver_info = OLYMPUS_MXL_INFO,
4174},
4175#endif
4176
4177#ifdef CONFIG_USB_CDCETHER
4178{
4179 /* CDC Ether uses two interfaces, not necessarily consecutive.
4180 * We match the main interface, ignoring the optional device
4181 * class so we could handle devices that aren't exclusively
4182 * CDC ether.
4183 *
4184 * NOTE: this match must come AFTER entries working around
4185 * bugs/quirks in a given product (like Zaurus, above).
4186 */
4187 USB_INTERFACE_INFO (USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
4188 USB_CDC_PROTO_NONE),
4189 .driver_info = (unsigned long) &cdc_info,
4190},
4191#endif
4192
4193 { }, // END
4194};
4195MODULE_DEVICE_TABLE (usb, products);
4196
4197static struct usb_driver usbnet_driver = {
4198 .owner = THIS_MODULE,
4199 .name = driver_name,
4200 .id_table = products,
4201 .probe = usbnet_probe,
4202 .disconnect = usbnet_disconnect,
4203 .suspend = usbnet_suspend,
4204 .resume = usbnet_resume,
4205};
4206
4207/* Default ethtool_ops assigned. Devices can override in their bind() routine */
4208static struct ethtool_ops usbnet_ethtool_ops = {
4209 .get_drvinfo = usbnet_get_drvinfo,
4210 .get_link = usbnet_get_link,
4211 .get_msglevel = usbnet_get_msglevel,
4212 .set_msglevel = usbnet_set_msglevel,
4213};
4214 1204
4215/*-------------------------------------------------------------------------*/ 1205/*-------------------------------------------------------------------------*/
4216 1206
4217static int __init usbnet_init (void) 1207static int __init usbnet_init(void)
4218{ 1208{
4219 // compiler should optimize these out 1209 /* compiler should optimize this out */
4220 BUG_ON (sizeof (((struct sk_buff *)0)->cb) 1210 BUG_ON (sizeof (((struct sk_buff *)0)->cb)
4221 < sizeof (struct skb_data)); 1211 < sizeof (struct skb_data));
4222#ifdef CONFIG_USB_CDCETHER
4223 BUG_ON ((sizeof (((struct usbnet *)0)->data)
4224 < sizeof (struct cdc_state)));
4225#endif
4226 1212
4227 random_ether_addr(node_id); 1213 random_ether_addr(node_id);
4228 1214 return 0;
4229 return usb_register(&usbnet_driver);
4230} 1215}
4231module_init (usbnet_init); 1216module_init(usbnet_init);
4232 1217
4233static void __exit usbnet_exit (void) 1218static void __exit usbnet_exit(void)
4234{ 1219{
4235 usb_deregister (&usbnet_driver);
4236} 1220}
4237module_exit (usbnet_exit); 1221module_exit(usbnet_exit);
4238 1222
4239MODULE_AUTHOR ("David Brownell <dbrownell@users.sourceforge.net>"); 1223MODULE_AUTHOR("David Brownell");
4240MODULE_DESCRIPTION ("USB Host-to-Host Link Drivers (numerous vendors)"); 1224MODULE_DESCRIPTION("USB network driver framework");
4241MODULE_LICENSE ("GPL"); 1225MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/usbnet.h b/drivers/usb/net/usbnet.h
new file mode 100644
index 000000000000..7aa0abd1a9bd
--- /dev/null
+++ b/drivers/usb/net/usbnet.h
@@ -0,0 +1,193 @@
1/*
2 * USB Networking Link Interface
3 *
4 * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net>
5 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22
23#ifndef __USBNET_H
24#define __USBNET_H
25
26
27/* interface from usbnet core to each USB networking link we handle */
28struct usbnet {
29 /* housekeeping */
30 struct usb_device *udev;
31 struct driver_info *driver_info;
32 wait_queue_head_t *wait;
33
34 /* i/o info: pipes etc */
35 unsigned in, out;
36 struct usb_host_endpoint *status;
37 unsigned maxpacket;
38 struct timer_list delay;
39
40 /* protocol/interface state */
41 struct net_device *net;
42 struct net_device_stats stats;
43 int msg_enable;
44 unsigned long data [5];
45 u32 xid;
46 u32 hard_mtu; /* count any extra framing */
47 size_t rx_urb_size; /* size for rx urbs */
48 struct mii_if_info mii;
49
50 /* various kinds of pending driver work */
51 struct sk_buff_head rxq;
52 struct sk_buff_head txq;
53 struct sk_buff_head done;
54 struct urb *interrupt;
55 struct tasklet_struct bh;
56
57 struct work_struct kevent;
58 unsigned long flags;
59# define EVENT_TX_HALT 0
60# define EVENT_RX_HALT 1
61# define EVENT_RX_MEMORY 2
62# define EVENT_STS_SPLIT 3
63# define EVENT_LINK_RESET 4
64};
65
66static inline struct usb_driver *driver_of(struct usb_interface *intf)
67{
68 return to_usb_driver(intf->dev.driver);
69}
70
71/* interface from the device/framing level "minidriver" to core */
72struct driver_info {
73 char *description;
74
75 int flags;
76/* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */
77#define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */
78#define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */
79#define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */
80#define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */
81
82#define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */
83#define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */
84
85#define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */
86
87 /* init device ... can sleep, or cause probe() failure */
88 int (*bind)(struct usbnet *, struct usb_interface *);
89
90 /* cleanup device ... can sleep, but can't fail */
91 void (*unbind)(struct usbnet *, struct usb_interface *);
92
93 /* reset device ... can sleep */
94 int (*reset)(struct usbnet *);
95
96 /* see if peer is connected ... can sleep */
97 int (*check_connect)(struct usbnet *);
98
99 /* for status polling */
100 void (*status)(struct usbnet *, struct urb *);
101
102 /* link reset handling, called from defer_kevent */
103 int (*link_reset)(struct usbnet *);
104
105 /* fixup rx packet (strip framing) */
106 int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb);
107
108 /* fixup tx packet (add framing) */
109 struct sk_buff *(*tx_fixup)(struct usbnet *dev,
110 struct sk_buff *skb, unsigned flags);
111
112 /* for new devices, use the descriptor-reading code instead */
113 int in; /* rx endpoint */
114 int out; /* tx endpoint */
115
116 unsigned long data; /* Misc driver specific data */
117};
118
119/* Minidrivers are just drivers using the "usbnet" core as a powerful
120 * network-specific subroutine library ... that happens to do pretty
121 * much everything except custom framing and chip-specific stuff.
122 */
123extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *);
124extern int usbnet_suspend (struct usb_interface *, pm_message_t );
125extern int usbnet_resume (struct usb_interface *);
126extern void usbnet_disconnect(struct usb_interface *);
127
128
129/* Drivers that reuse some of the standard USB CDC infrastructure
130 * (notably, using multiple interfaces according to the the CDC
131 * union descriptor) get some helper code.
132 */
133struct cdc_state {
134 struct usb_cdc_header_desc *header;
135 struct usb_cdc_union_desc *u;
136 struct usb_cdc_ether_desc *ether;
137 struct usb_interface *control;
138 struct usb_interface *data;
139};
140
141extern int usbnet_generic_cdc_bind (struct usbnet *, struct usb_interface *);
142extern void usbnet_cdc_unbind (struct usbnet *, struct usb_interface *);
143
144/* CDC and RNDIS support the same host-chosen packet filters for IN transfers */
145#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \
146 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \
147 |USB_CDC_PACKET_TYPE_PROMISCUOUS \
148 |USB_CDC_PACKET_TYPE_DIRECTED)
149
150
151/* we record the state for each of our queued skbs */
152enum skb_state {
153 illegal = 0,
154 tx_start, tx_done,
155 rx_start, rx_done, rx_cleanup
156};
157
158struct skb_data { /* skb->cb is one of these */
159 struct urb *urb;
160 struct usbnet *dev;
161 enum skb_state state;
162 size_t length;
163};
164
165
166extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *);
167extern void usbnet_defer_kevent (struct usbnet *, int);
168extern void usbnet_skb_return (struct usbnet *, struct sk_buff *);
169
170extern u32 usbnet_get_msglevel (struct net_device *);
171extern void usbnet_set_msglevel (struct net_device *, u32);
172extern void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *);
173
174/* messaging support includes the interface name, so it must not be
175 * used before it has one ... notably, in minidriver bind() calls.
176 */
177#ifdef DEBUG
178#define devdbg(usbnet, fmt, arg...) \
179 printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
180#else
181#define devdbg(usbnet, fmt, arg...) do {} while(0)
182#endif
183
184#define deverr(usbnet, fmt, arg...) \
185 printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
186#define devwarn(usbnet, fmt, arg...) \
187 printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
188
189#define devinfo(usbnet, fmt, arg...) \
190 printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \
191
192
193#endif /* __USBNET_H */
diff --git a/drivers/usb/net/zaurus.c b/drivers/usb/net/zaurus.c
new file mode 100644
index 000000000000..ee3b892aeabc
--- /dev/null
+++ b/drivers/usb/net/zaurus.c
@@ -0,0 +1,386 @@
1/*
2 * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz>
3 * Copyright (C) 2002-2005 by David Brownell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20// #define DEBUG // error path messages, extra info
21// #define VERBOSE // more; success messages
22
23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h>
28#include <linux/sched.h>
29#include <linux/init.h>
30#include <linux/netdevice.h>
31#include <linux/ethtool.h>
32#include <linux/workqueue.h>
33#include <linux/mii.h>
34#include <linux/crc32.h>
35#include <linux/usb.h>
36#include <linux/usb_cdc.h>
37
38#include "usbnet.h"
39
40
41/*
42 * All known Zaurii lie about their standards conformance. At least
43 * the earliest SA-1100 models lie by saying they support CDC Ethernet.
44 * Some later models (especially PXA-25x and PXA-27x based ones) lie
45 * and say they support CDC MDLM (for access to cell phone modems).
46 *
47 * There are non-Zaurus products that use these same protocols too.
48 *
49 * The annoying thing is that at the same time Sharp was developing
50 * that annoying standards-breaking software, the Linux community had
51 * a simple "CDC Subset" working reliably on the same SA-1100 hardware.
52 * That is, the same functionality but not violating standards.
53 *
54 * The CDC Ethernet nonconformance points are troublesome to hosts
55 * with a true CDC Ethernet implementation:
56 * - Framing appends a CRC, which the spec says drivers "must not" do;
57 * - Transfers data in altsetting zero, instead of altsetting 1;
58 * - All these peripherals use the same ethernet address.
59 *
60 * The CDC MDLM nonconformance is less immediately troublesome, since all
61 * MDLM implementations are quasi-proprietary anyway.
62 */
63
64static struct sk_buff *
65zaurus_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags)
66{
67 int padlen;
68 struct sk_buff *skb2;
69
70 padlen = 2;
71 if (!skb_cloned(skb)) {
72 int tailroom = skb_tailroom(skb);
73 if ((padlen + 4) <= tailroom)
74 goto done;
75 }
76 skb2 = skb_copy_expand(skb, 0, 4 + padlen, flags);
77 dev_kfree_skb_any(skb);
78 skb = skb2;
79 if (skb) {
80 u32 fcs;
81done:
82 fcs = crc32_le(~0, skb->data, skb->len);
83 fcs = ~fcs;
84
85 *skb_put (skb, 1) = fcs & 0xff;
86 *skb_put (skb, 1) = (fcs>> 8) & 0xff;
87 *skb_put (skb, 1) = (fcs>>16) & 0xff;
88 *skb_put (skb, 1) = (fcs>>24) & 0xff;
89 }
90 return skb;
91}
92
93static int zaurus_bind(struct usbnet *dev, struct usb_interface *intf)
94{
95 /* Belcarra's funky framing has other options; mostly
96 * TRAILERS (!) with 4 bytes CRC, and maybe 2 pad bytes.
97 */
98 dev->net->hard_header_len += 6;
99 dev->rx_urb_size = dev->net->hard_header_len + dev->net->mtu;
100 return usbnet_generic_cdc_bind(dev, intf);
101}
102
103/* PDA style devices are always connected if present */
104static int always_connected (struct usbnet *dev)
105{
106 return 0;
107}
108
109static const struct driver_info zaurus_sl5x00_info = {
110 .description = "Sharp Zaurus SL-5x00",
111 .flags = FLAG_FRAMING_Z,
112 .check_connect = always_connected,
113 .bind = zaurus_bind,
114 .unbind = usbnet_cdc_unbind,
115 .tx_fixup = zaurus_tx_fixup,
116};
117#define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info)
118
119static const struct driver_info zaurus_pxa_info = {
120 .description = "Sharp Zaurus, PXA-2xx based",
121 .flags = FLAG_FRAMING_Z,
122 .check_connect = always_connected,
123 .bind = zaurus_bind,
124 .unbind = usbnet_cdc_unbind,
125 .tx_fixup = zaurus_tx_fixup,
126};
127#define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info)
128
129static const struct driver_info olympus_mxl_info = {
130 .description = "Olympus R1000",
131 .flags = FLAG_FRAMING_Z,
132 .check_connect = always_connected,
133 .bind = zaurus_bind,
134 .unbind = usbnet_cdc_unbind,
135 .tx_fixup = zaurus_tx_fixup,
136};
137#define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info)
138
139
140/* Some more recent products using Lineo/Belcarra code will wrongly claim
141 * CDC MDLM conformance. They aren't conformant: data endpoints live
142 * in the control interface, there's no data interface, and it's not used
143 * to talk to a cell phone radio. But at least we can detect these two
144 * pseudo-classes, rather than growing this product list with entries for
145 * each new nonconformant product (sigh).
146 */
147static const u8 safe_guid[16] = {
148 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
149 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
150};
151static const u8 blan_guid[16] = {
152 0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70,
153 0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37,
154};
155
156static int blan_mdlm_bind(struct usbnet *dev, struct usb_interface *intf)
157{
158 u8 *buf = intf->cur_altsetting->extra;
159 int len = intf->cur_altsetting->extralen;
160 struct usb_cdc_mdlm_desc *desc = NULL;
161 struct usb_cdc_mdlm_detail_desc *detail = NULL;
162
163 while (len > 3) {
164 if (buf [1] != USB_DT_CS_INTERFACE)
165 goto next_desc;
166
167 /* use bDescriptorSubType, and just verify that we get a
168 * "BLAN" (or "SAFE") descriptor.
169 */
170 switch (buf [2]) {
171 case USB_CDC_MDLM_TYPE:
172 if (desc) {
173 dev_dbg(&intf->dev, "extra MDLM\n");
174 goto bad_desc;
175 }
176 desc = (void *) buf;
177 if (desc->bLength != sizeof *desc) {
178 dev_dbg(&intf->dev, "MDLM len %u\n",
179 desc->bLength);
180 goto bad_desc;
181 }
182 /* expect bcdVersion 1.0, ignore */
183 if (memcmp(&desc->bGUID, blan_guid, 16)
184 && memcmp(&desc->bGUID, safe_guid, 16) ) {
185 /* hey, this one might _really_ be MDLM! */
186 dev_dbg(&intf->dev, "MDLM guid\n");
187 goto bad_desc;
188 }
189 break;
190 case USB_CDC_MDLM_DETAIL_TYPE:
191 if (detail) {
192 dev_dbg(&intf->dev, "extra MDLM detail\n");
193 goto bad_desc;
194 }
195 detail = (void *) buf;
196 switch (detail->bGuidDescriptorType) {
197 case 0: /* "SAFE" */
198 if (detail->bLength != (sizeof *detail + 2))
199 goto bad_detail;
200 break;
201 case 1: /* "BLAN" */
202 if (detail->bLength != (sizeof *detail + 3))
203 goto bad_detail;
204 break;
205 default:
206 goto bad_detail;
207 }
208
209 /* assuming we either noticed BLAN already, or will
210 * find it soon, there are some data bytes here:
211 * - bmNetworkCapabilities (unused)
212 * - bmDataCapabilities (bits, see below)
213 * - bPad (ignored, for PADAFTER -- BLAN-only)
214 * bits are:
215 * - 0x01 -- Zaurus framing (add CRC)
216 * - 0x02 -- PADBEFORE (CRC includes some padding)
217 * - 0x04 -- PADAFTER (some padding after CRC)
218 * - 0x08 -- "fermat" packet mangling (for hw bugs)
219 * the PADBEFORE appears not to matter; we interop
220 * with devices that use it and those that don't.
221 */
222 if ((detail->bDetailData[1] & ~0x02) != 0x01) {
223 /* bmDataCapabilites == 0 would be fine too,
224 * but framing is minidriver-coupled for now.
225 */
226bad_detail:
227 dev_dbg(&intf->dev,
228 "bad MDLM detail, %d %d %d\n",
229 detail->bLength,
230 detail->bDetailData[0],
231 detail->bDetailData[2]);
232 goto bad_desc;
233 }
234 break;
235 }
236next_desc:
237 len -= buf [0]; /* bLength */
238 buf += buf [0];
239 }
240
241 if (!desc || !detail) {
242 dev_dbg(&intf->dev, "missing cdc mdlm %s%sdescriptor\n",
243 desc ? "" : "func ",
244 detail ? "" : "detail ");
245 goto bad_desc;
246 }
247
248 /* There's probably a CDC Ethernet descriptor there, but we can't
249 * rely on the Ethernet address it provides since not all vendors
250 * bother to make it unique. Likewise there's no point in tracking
251 * of the CDC event notifications.
252 */
253 return usbnet_get_endpoints(dev, intf);
254
255bad_desc:
256 dev_info(&dev->udev->dev, "unsupported MDLM descriptors\n");
257 return -ENODEV;
258}
259
260static const struct driver_info bogus_mdlm_info = {
261 .description = "pseudo-MDLM (BLAN) device",
262 .flags = FLAG_FRAMING_Z,
263 .check_connect = always_connected,
264 .tx_fixup = zaurus_tx_fixup,
265 .bind = blan_mdlm_bind,
266};
267
268static const struct usb_device_id products [] = {
269#define ZAURUS_MASTER_INTERFACE \
270 .bInterfaceClass = USB_CLASS_COMM, \
271 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
272 .bInterfaceProtocol = USB_CDC_PROTO_NONE
273
274/* SA-1100 based Sharp Zaurus ("collie"), or compatible. */
275{
276 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
277 | USB_DEVICE_ID_MATCH_DEVICE,
278 .idVendor = 0x04DD,
279 .idProduct = 0x8004,
280 ZAURUS_MASTER_INTERFACE,
281 .driver_info = ZAURUS_STRONGARM_INFO,
282},
283
284/* PXA-2xx based models are also lying-about-cdc. If you add any
285 * more devices that claim to be CDC Ethernet, make sure they get
286 * added to the blacklist in cdc_ether too.
287 *
288 * NOTE: OpenZaurus versions with 2.6 kernels won't use these entries,
289 * unlike the older ones with 2.4 "embedix" kernels.
290 */
291{
292 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
293 | USB_DEVICE_ID_MATCH_DEVICE,
294 .idVendor = 0x04DD,
295 .idProduct = 0x8005, /* A-300 */
296 ZAURUS_MASTER_INTERFACE,
297 .driver_info = ZAURUS_PXA_INFO,
298}, {
299 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
300 | USB_DEVICE_ID_MATCH_DEVICE,
301 .idVendor = 0x04DD,
302 .idProduct = 0x8006, /* B-500/SL-5600 */
303 ZAURUS_MASTER_INTERFACE,
304 .driver_info = ZAURUS_PXA_INFO,
305}, {
306 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
307 | USB_DEVICE_ID_MATCH_DEVICE,
308 .idVendor = 0x04DD,
309 .idProduct = 0x8007, /* C-700 */
310 ZAURUS_MASTER_INTERFACE,
311 .driver_info = ZAURUS_PXA_INFO,
312}, {
313 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
314 | USB_DEVICE_ID_MATCH_DEVICE,
315 .idVendor = 0x04DD,
316 .idProduct = 0x9031, /* C-750 C-760 */
317 ZAURUS_MASTER_INTERFACE,
318 .driver_info = ZAURUS_PXA_INFO,
319}, {
320 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
321 | USB_DEVICE_ID_MATCH_DEVICE,
322 .idVendor = 0x04DD,
323 .idProduct = 0x9032, /* SL-6000 */
324 ZAURUS_MASTER_INTERFACE,
325 .driver_info = ZAURUS_PXA_INFO,
326}, {
327 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
328 | USB_DEVICE_ID_MATCH_DEVICE,
329 .idVendor = 0x04DD,
330 /* reported with some C860 units */
331 .idProduct = 0x9050, /* C-860 */
332 ZAURUS_MASTER_INTERFACE,
333 .driver_info = ZAURUS_PXA_INFO,
334},
335
336
337/* At least some of the newest PXA units have very different lies about
338 * their standards support: they claim to be cell phones offering
339 * direct access to their radios! (No, they don't conform to CDC MDLM.)
340 */
341{
342 USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
343 USB_CDC_PROTO_NONE),
344 .driver_info = (unsigned long) &bogus_mdlm_info,
345},
346
347/* Olympus has some models with a Zaurus-compatible option.
348 * R-1000 uses a FreeScale i.MXL cpu (ARMv4T)
349 */
350{
351 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
352 | USB_DEVICE_ID_MATCH_DEVICE,
353 .idVendor = 0x07B4,
354 .idProduct = 0x0F02, /* R-1000 */
355 ZAURUS_MASTER_INTERFACE,
356 .driver_info = OLYMPUS_MXL_INFO,
357},
358 { }, // END
359};
360MODULE_DEVICE_TABLE(usb, products);
361
362static struct usb_driver zaurus_driver = {
363 .owner = THIS_MODULE,
364 .name = "zaurus",
365 .id_table = products,
366 .probe = usbnet_probe,
367 .disconnect = usbnet_disconnect,
368 .suspend = usbnet_suspend,
369 .resume = usbnet_resume,
370};
371
372static int __init zaurus_init(void)
373{
374 return usb_register(&zaurus_driver);
375}
376module_init(zaurus_init);
377
378static void __exit zaurus_exit(void)
379{
380 usb_deregister(&zaurus_driver);
381}
382module_exit(zaurus_exit);
383
384MODULE_AUTHOR("Pavel Machek, David Brownell");
385MODULE_DESCRIPTION("Sharp Zaurus PDA, and compatible products");
386MODULE_LICENSE("GPL");
diff --git a/drivers/usb/net/zd1201.c b/drivers/usb/net/zd1201.c
index fc013978837e..c4e479ee926a 100644
--- a/drivers/usb/net/zd1201.c
+++ b/drivers/usb/net/zd1201.c
@@ -847,7 +847,6 @@ static void zd1201_tx_timeout(struct net_device *dev)
847 return; 847 return;
848 dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n", 848 dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n",
849 dev->name); 849 dev->name);
850 zd->tx_urb->transfer_flags |= URB_ASYNC_UNLINK;
851 usb_unlink_urb(zd->tx_urb); 850 usb_unlink_urb(zd->tx_urb);
852 zd->stats.tx_errors++; 851 zd->stats.tx_errors++;
853 /* Restart the timeout to quiet the watchdog: */ 852 /* Restart the timeout to quiet the watchdog: */
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index 012e63e05806..05c44ae3ed32 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -453,8 +453,8 @@ static int generic_startup (struct usb_serial *serial)
453 priv->cbr_mask = B300; 453 priv->cbr_mask = B300;
454 usb_set_serial_port_data(serial->port[0], priv); 454 usb_set_serial_port_data(serial->port[0], priv);
455 455
456 return (0); 456 return 0;
457} 457}
458 458
459 459
460static int cypress_earthmate_startup (struct usb_serial *serial) 460static int cypress_earthmate_startup (struct usb_serial *serial)
@@ -464,14 +464,15 @@ static int cypress_earthmate_startup (struct usb_serial *serial)
464 dbg("%s", __FUNCTION__); 464 dbg("%s", __FUNCTION__);
465 465
466 if (generic_startup(serial)) { 466 if (generic_startup(serial)) {
467 dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number); 467 dbg("%s - Failed setting up port %d", __FUNCTION__,
468 serial->port[0]->number);
468 return 1; 469 return 1;
469 } 470 }
470 471
471 priv = usb_get_serial_port_data(serial->port[0]); 472 priv = usb_get_serial_port_data(serial->port[0]);
472 priv->chiptype = CT_EARTHMATE; 473 priv->chiptype = CT_EARTHMATE;
473 474
474 return (0); 475 return 0;
475} /* cypress_earthmate_startup */ 476} /* cypress_earthmate_startup */
476 477
477 478
@@ -482,14 +483,15 @@ static int cypress_hidcom_startup (struct usb_serial *serial)
482 dbg("%s", __FUNCTION__); 483 dbg("%s", __FUNCTION__);
483 484
484 if (generic_startup(serial)) { 485 if (generic_startup(serial)) {
485 dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number); 486 dbg("%s - Failed setting up port %d", __FUNCTION__,
487 serial->port[0]->number);
486 return 1; 488 return 1;
487 } 489 }
488 490
489 priv = usb_get_serial_port_data(serial->port[0]); 491 priv = usb_get_serial_port_data(serial->port[0]);
490 priv->chiptype = CT_CYPHIDCOM; 492 priv->chiptype = CT_CYPHIDCOM;
491 493
492 return (0); 494 return 0;
493} /* cypress_hidcom_startup */ 495} /* cypress_hidcom_startup */
494 496
495 497
@@ -909,7 +911,8 @@ static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsi
909} /* cypress_ioctl */ 911} /* cypress_ioctl */
910 912
911 913
912static void cypress_set_termios (struct usb_serial_port *port, struct termios *old_termios) 914static void cypress_set_termios (struct usb_serial_port *port,
915 struct termios *old_termios)
913{ 916{
914 struct cypress_private *priv = usb_get_serial_port_data(port); 917 struct cypress_private *priv = usb_get_serial_port_data(port);
915 struct tty_struct *tty; 918 struct tty_struct *tty;
@@ -918,7 +921,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
918 unsigned long flags; 921 unsigned long flags;
919 __u8 oldlines; 922 __u8 oldlines;
920 int linechange = 0; 923 int linechange = 0;
921 924
922 dbg("%s - port %d", __FUNCTION__, port->number); 925 dbg("%s - port %d", __FUNCTION__, port->number);
923 926
924 tty = port->tty; 927 tty = port->tty;
@@ -931,10 +934,12 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
931 if (!priv->termios_initialized) { 934 if (!priv->termios_initialized) {
932 if (priv->chiptype == CT_EARTHMATE) { 935 if (priv->chiptype == CT_EARTHMATE) {
933 *(tty->termios) = tty_std_termios; 936 *(tty->termios) = tty_std_termios;
934 tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | CLOCAL; 937 tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL |
938 CLOCAL;
935 } else if (priv->chiptype == CT_CYPHIDCOM) { 939 } else if (priv->chiptype == CT_CYPHIDCOM) {
936 *(tty->termios) = tty_std_termios; 940 *(tty->termios) = tty_std_termios;
937 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; 941 tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
942 CLOCAL;
938 } 943 }
939 priv->termios_initialized = 1; 944 priv->termios_initialized = 1;
940 } 945 }
@@ -946,12 +951,15 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
946 /* check if there are new settings */ 951 /* check if there are new settings */
947 if (old_termios) { 952 if (old_termios) {
948 if ((cflag != old_termios->c_cflag) || 953 if ((cflag != old_termios->c_cflag) ||
949 (RELEVANT_IFLAG(iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) { 954 (RELEVANT_IFLAG(iflag) !=
950 dbg("%s - attempting to set new termios settings", __FUNCTION__); 955 RELEVANT_IFLAG(old_termios->c_iflag))) {
951 /* should make a copy of this in case something goes wrong in the function, we can restore it */ 956 dbg("%s - attempting to set new termios settings",
957 __FUNCTION__);
958 /* should make a copy of this in case something goes
959 * wrong in the function, we can restore it */
952 spin_lock_irqsave(&priv->lock, flags); 960 spin_lock_irqsave(&priv->lock, flags);
953 priv->tmp_termios = *(tty->termios); 961 priv->tmp_termios = *(tty->termios);
954 spin_unlock_irqrestore(&priv->lock, flags); 962 spin_unlock_irqrestore(&priv->lock, flags);
955 } else { 963 } else {
956 dbg("%s - nothing to do, exiting", __FUNCTION__); 964 dbg("%s - nothing to do, exiting", __FUNCTION__);
957 return; 965 return;
@@ -962,21 +970,34 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
962 /* set number of data bits, parity, stop bits */ 970 /* set number of data bits, parity, stop bits */
963 /* when parity is disabled the parity type bit is ignored */ 971 /* when parity is disabled the parity type bit is ignored */
964 972
965 stop_bits = cflag & CSTOPB ? 1 : 0; /* 1 means 2 stop bits, 0 means 1 stop bit */ 973 /* 1 means 2 stop bits, 0 means 1 stop bit */
966 974 stop_bits = cflag & CSTOPB ? 1 : 0;
975
967 if (cflag & PARENB) { 976 if (cflag & PARENB) {
968 parity_enable = 1; 977 parity_enable = 1;
969 parity_type = cflag & PARODD ? 1 : 0; /* 1 means odd parity, 0 means even parity */ 978 /* 1 means odd parity, 0 means even parity */
979 parity_type = cflag & PARODD ? 1 : 0;
970 } else 980 } else
971 parity_enable = parity_type = 0; 981 parity_enable = parity_type = 0;
972 982
973 if (cflag & CSIZE) { 983 if (cflag & CSIZE) {
974 switch (cflag & CSIZE) { 984 switch (cflag & CSIZE) {
975 case CS5: data_bits = 0; break; 985 case CS5:
976 case CS6: data_bits = 1; break; 986 data_bits = 0;
977 case CS7: data_bits = 2; break; 987 break;
978 case CS8: data_bits = 3; break; 988 case CS6:
979 default: err("%s - CSIZE was set, but not CS5-CS8", __FUNCTION__); data_bits = 3; 989 data_bits = 1;
990 break;
991 case CS7:
992 data_bits = 2;
993 break;
994 case CS8:
995 data_bits = 3;
996 break;
997 default:
998 err("%s - CSIZE was set, but not CS5-CS8",
999 __FUNCTION__);
1000 data_bits = 3;
980 } 1001 }
981 } else 1002 } else
982 data_bits = 3; 1003 data_bits = 3;
@@ -991,63 +1012,85 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
991 } else { 1012 } else {
992 baud_mask = (cflag & CBAUD); 1013 baud_mask = (cflag & CBAUD);
993 switch(baud_mask) { 1014 switch(baud_mask) {
994 case B300: dbg("%s - setting baud 300bps", __FUNCTION__); break; 1015 case B300:
995 case B600: dbg("%s - setting baud 600bps", __FUNCTION__); break; 1016 dbg("%s - setting baud 300bps", __FUNCTION__);
996 case B1200: dbg("%s - setting baud 1200bps", __FUNCTION__); break; 1017 break;
997 case B2400: dbg("%s - setting baud 2400bps", __FUNCTION__); break; 1018 case B600:
998 case B4800: dbg("%s - setting baud 4800bps", __FUNCTION__); break; 1019 dbg("%s - setting baud 600bps", __FUNCTION__);
999 case B9600: dbg("%s - setting baud 9600bps", __FUNCTION__); break; 1020 break;
1000 case B19200: dbg("%s - setting baud 19200bps", __FUNCTION__); break; 1021 case B1200:
1001 case B38400: dbg("%s - setting baud 38400bps", __FUNCTION__); break; 1022 dbg("%s - setting baud 1200bps", __FUNCTION__);
1002 case B57600: dbg("%s - setting baud 57600bps", __FUNCTION__); break; 1023 break;
1003 case B115200: dbg("%s - setting baud 115200bps", __FUNCTION__); break; 1024 case B2400:
1004 default: dbg("%s - unknown masked baud rate", __FUNCTION__); 1025 dbg("%s - setting baud 2400bps", __FUNCTION__);
1026 break;
1027 case B4800:
1028 dbg("%s - setting baud 4800bps", __FUNCTION__);
1029 break;
1030 case B9600:
1031 dbg("%s - setting baud 9600bps", __FUNCTION__);
1032 break;
1033 case B19200:
1034 dbg("%s - setting baud 19200bps", __FUNCTION__);
1035 break;
1036 case B38400:
1037 dbg("%s - setting baud 38400bps", __FUNCTION__);
1038 break;
1039 case B57600:
1040 dbg("%s - setting baud 57600bps", __FUNCTION__);
1041 break;
1042 case B115200:
1043 dbg("%s - setting baud 115200bps", __FUNCTION__);
1044 break;
1045 default:
1046 dbg("%s - unknown masked baud rate", __FUNCTION__);
1005 } 1047 }
1006 priv->line_control = (CONTROL_DTR | CONTROL_RTS); 1048 priv->line_control = (CONTROL_DTR | CONTROL_RTS);
1007 } 1049 }
1008 spin_unlock_irqrestore(&priv->lock, flags); 1050 spin_unlock_irqrestore(&priv->lock, flags);
1009
1010 dbg("%s - sending %d stop_bits, %d parity_enable, %d parity_type, %d data_bits (+5)", __FUNCTION__,
1011 stop_bits, parity_enable, parity_type, data_bits);
1012 1051
1013 cypress_serial_control(port, baud_mask, data_bits, stop_bits, parity_enable, 1052 dbg("%s - sending %d stop_bits, %d parity_enable, %d parity_type, "
1014 parity_type, 0, CYPRESS_SET_CONFIG); 1053 "%d data_bits (+5)", __FUNCTION__, stop_bits,
1054 parity_enable, parity_type, data_bits);
1055
1056 cypress_serial_control(port, baud_mask, data_bits, stop_bits,
1057 parity_enable, parity_type, 0, CYPRESS_SET_CONFIG);
1015 1058
1016 /* we perform a CYPRESS_GET_CONFIG so that the current settings are filled into the private structure 1059 /* we perform a CYPRESS_GET_CONFIG so that the current settings are
1017 * this should confirm that all is working if it returns what we just set */ 1060 * filled into the private structure this should confirm that all is
1061 * working if it returns what we just set */
1018 cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG); 1062 cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG);
1019 1063
1020 /* Here we can define custom tty settings for devices 1064 /* Here we can define custom tty settings for devices; the main tty
1021 * 1065 * termios flag base comes from empeg.c */
1022 * the main tty termios flag base comes from empeg.c
1023 */
1024 1066
1025 spin_lock_irqsave(&priv->lock, flags); 1067 spin_lock_irqsave(&priv->lock, flags);
1026 if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) { 1068 if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) {
1027 1069 dbg("Using custom termios settings for a baud rate of "
1028 dbg("Using custom termios settings for a baud rate of 4800bps."); 1070 "4800bps.");
1029 /* define custom termios settings for NMEA protocol */ 1071 /* define custom termios settings for NMEA protocol */
1030 1072
1031 tty->termios->c_iflag /* input modes - */ 1073 tty->termios->c_iflag /* input modes - */
1032 &= ~(IGNBRK /* disable ignore break */ 1074 &= ~(IGNBRK /* disable ignore break */
1033 | BRKINT /* disable break causes interrupt */ 1075 | BRKINT /* disable break causes interrupt */
1034 | PARMRK /* disable mark parity errors */ 1076 | PARMRK /* disable mark parity errors */
1035 | ISTRIP /* disable clear high bit of input characters */ 1077 | ISTRIP /* disable clear high bit of input char */
1036 | INLCR /* disable translate NL to CR */ 1078 | INLCR /* disable translate NL to CR */
1037 | IGNCR /* disable ignore CR */ 1079 | IGNCR /* disable ignore CR */
1038 | ICRNL /* disable translate CR to NL */ 1080 | ICRNL /* disable translate CR to NL */
1039 | IXON); /* disable enable XON/XOFF flow control */ 1081 | IXON); /* disable enable XON/XOFF flow control */
1040 1082
1041 tty->termios->c_oflag /* output modes */ 1083 tty->termios->c_oflag /* output modes */
1042 &= ~OPOST; /* disable postprocess output characters */ 1084 &= ~OPOST; /* disable postprocess output char */
1043
1044 tty->termios->c_lflag /* line discipline modes */
1045 &= ~(ECHO /* disable echo input characters */
1046 | ECHONL /* disable echo new line */
1047 | ICANON /* disable erase, kill, werase, and rprnt special characters */
1048 | ISIG /* disable interrupt, quit, and suspend special characters */
1049 | IEXTEN); /* disable non-POSIX special characters */
1050 1085
1086 tty->termios->c_lflag /* line discipline modes */
1087 &= ~(ECHO /* disable echo input characters */
1088 | ECHONL /* disable echo new line */
1089 | ICANON /* disable erase, kill, werase, and rprnt
1090 special characters */
1091 | ISIG /* disable interrupt, quit, and suspend
1092 special characters */
1093 | IEXTEN); /* disable non-POSIX special characters */
1051 } /* CT_CYPHIDCOM: Application should handle this for device */ 1094 } /* CT_CYPHIDCOM: Application should handle this for device */
1052 1095
1053 linechange = (priv->line_control != oldlines); 1096 linechange = (priv->line_control != oldlines);
@@ -1060,7 +1103,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
1060 } 1103 }
1061} /* cypress_set_termios */ 1104} /* cypress_set_termios */
1062 1105
1063 1106
1064/* returns amount of data still left in soft buffer */ 1107/* returns amount of data still left in soft buffer */
1065static int cypress_chars_in_buffer(struct usb_serial_port *port) 1108static int cypress_chars_in_buffer(struct usb_serial_port *port)
1066{ 1109{
@@ -1088,7 +1131,7 @@ static void cypress_throttle (struct usb_serial_port *port)
1088 1131
1089 spin_lock_irqsave(&priv->lock, flags); 1132 spin_lock_irqsave(&priv->lock, flags);
1090 priv->rx_flags = THROTTLED; 1133 priv->rx_flags = THROTTLED;
1091 spin_unlock_irqrestore(&priv->lock, flags); 1134 spin_unlock_irqrestore(&priv->lock, flags);
1092} 1135}
1093 1136
1094 1137
@@ -1110,7 +1153,8 @@ static void cypress_unthrottle (struct usb_serial_port *port)
1110 1153
1111 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1154 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1112 if (result) 1155 if (result)
1113 dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result); 1156 dev_err(&port->dev, "%s - failed submitting read urb, "
1157 "error %d\n", __FUNCTION__, result);
1114 } 1158 }
1115} 1159}
1116 1160
@@ -1122,7 +1166,7 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1122 struct tty_struct *tty; 1166 struct tty_struct *tty;
1123 unsigned char *data = urb->transfer_buffer; 1167 unsigned char *data = urb->transfer_buffer;
1124 unsigned long flags; 1168 unsigned long flags;
1125 char tty_flag = TTY_NORMAL; 1169 char tty_flag = TTY_NORMAL;
1126 int havedata = 0; 1170 int havedata = 0;
1127 int bytes = 0; 1171 int bytes = 0;
1128 int result; 1172 int result;
@@ -1131,7 +1175,8 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1131 dbg("%s - port %d", __FUNCTION__, port->number); 1175 dbg("%s - port %d", __FUNCTION__, port->number);
1132 1176
1133 if (urb->status) { 1177 if (urb->status) {
1134 dbg("%s - nonzero read status received: %d", __FUNCTION__, urb->status); 1178 dbg("%s - nonzero read status received: %d", __FUNCTION__,
1179 urb->status);
1135 return; 1180 return;
1136 } 1181 }
1137 1182
@@ -1155,51 +1200,55 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1155 case 32: 1200 case 32:
1156 /* This is for the CY7C64013... */ 1201 /* This is for the CY7C64013... */
1157 priv->current_status = data[0] & 0xF8; 1202 priv->current_status = data[0] & 0xF8;
1158 bytes = data[1]+2; 1203 bytes = data[1] + 2;
1159 i=2; 1204 i = 2;
1160 if (bytes > 2) 1205 if (bytes > 2)
1161 havedata = 1; 1206 havedata = 1;
1162 break; 1207 break;
1163 case 8: 1208 case 8:
1164 /* This is for the CY7C63743... */ 1209 /* This is for the CY7C63743... */
1165 priv->current_status = data[0] & 0xF8; 1210 priv->current_status = data[0] & 0xF8;
1166 bytes = (data[0] & 0x07)+1; 1211 bytes = (data[0] & 0x07) + 1;
1167 i=1; 1212 i = 1;
1168 if (bytes > 1) 1213 if (bytes > 1)
1169 havedata = 1; 1214 havedata = 1;
1170 break; 1215 break;
1171 default: 1216 default:
1172 dbg("%s - wrong packet size - received %d bytes", __FUNCTION__, urb->actual_length); 1217 dbg("%s - wrong packet size - received %d bytes",
1218 __FUNCTION__, urb->actual_length);
1173 spin_unlock_irqrestore(&priv->lock, flags); 1219 spin_unlock_irqrestore(&priv->lock, flags);
1174 goto continue_read; 1220 goto continue_read;
1175 } 1221 }
1176 spin_unlock_irqrestore(&priv->lock, flags); 1222 spin_unlock_irqrestore(&priv->lock, flags);
1177 1223
1178 usb_serial_debug_data (debug, &port->dev, __FUNCTION__, urb->actual_length, data); 1224 usb_serial_debug_data (debug, &port->dev, __FUNCTION__,
1225 urb->actual_length, data);
1179 1226
1180 spin_lock_irqsave(&priv->lock, flags); 1227 spin_lock_irqsave(&priv->lock, flags);
1181 /* check to see if status has changed */ 1228 /* check to see if status has changed */
1182 if (priv != NULL) { 1229 if (priv != NULL) {
1183 if (priv->current_status != priv->prev_status) { 1230 if (priv->current_status != priv->prev_status) {
1184 priv->diff_status |= priv->current_status ^ priv->prev_status; 1231 priv->diff_status |= priv->current_status ^
1232 priv->prev_status;
1185 wake_up_interruptible(&priv->delta_msr_wait); 1233 wake_up_interruptible(&priv->delta_msr_wait);
1186 priv->prev_status = priv->current_status; 1234 priv->prev_status = priv->current_status;
1187 } 1235 }
1188 } 1236 }
1189 spin_unlock_irqrestore(&priv->lock, flags); 1237 spin_unlock_irqrestore(&priv->lock, flags);
1190 1238
1191 /* hangup, as defined in acm.c... this might be a bad place for it though */ 1239 /* hangup, as defined in acm.c... this might be a bad place for it
1192 if (tty && !(tty->termios->c_cflag & CLOCAL) && !(priv->current_status & UART_CD)) { 1240 * though */
1241 if (tty && !(tty->termios->c_cflag & CLOCAL) &&
1242 !(priv->current_status & UART_CD)) {
1193 dbg("%s - calling hangup", __FUNCTION__); 1243 dbg("%s - calling hangup", __FUNCTION__);
1194 tty_hangup(tty); 1244 tty_hangup(tty);
1195 goto continue_read; 1245 goto continue_read;
1196 } 1246 }
1197 1247
1198 /* There is one error bit... I'm assuming it is a parity error indicator 1248 /* There is one error bit... I'm assuming it is a parity error
1199 * as the generic firmware will set this bit to 1 if a parity error occurs. 1249 * indicator as the generic firmware will set this bit to 1 if a
1200 * I can not find reference to any other error events. 1250 * parity error occurs.
1201 * 1251 * I can not find reference to any other error events. */
1202 */
1203 spin_lock_irqsave(&priv->lock, flags); 1252 spin_lock_irqsave(&priv->lock, flags);
1204 if (priv->current_status & CYP_ERROR) { 1253 if (priv->current_status & CYP_ERROR) {
1205 spin_unlock_irqrestore(&priv->lock, flags); 1254 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1211,7 +1260,8 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1211 /* process read if there is data other than line status */ 1260 /* process read if there is data other than line status */
1212 if (tty && (bytes > i)) { 1261 if (tty && (bytes > i)) {
1213 for (; i < bytes ; ++i) { 1262 for (; i < bytes ; ++i) {
1214 dbg("pushing byte number %d - %d - %c",i,data[i],data[i]); 1263 dbg("pushing byte number %d - %d - %c", i, data[i],
1264 data[i]);
1215 if(tty->flip.count >= TTY_FLIPBUF_SIZE) { 1265 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
1216 tty_flip_buffer_push(tty); 1266 tty_flip_buffer_push(tty);
1217 } 1267 }
@@ -1221,25 +1271,28 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
1221 } 1271 }
1222 1272
1223 spin_lock_irqsave(&priv->lock, flags); 1273 spin_lock_irqsave(&priv->lock, flags);
1224 priv->bytes_in += bytes; /* control and status byte(s) are also counted */ 1274 /* control and status byte(s) are also counted */
1275 priv->bytes_in += bytes;
1225 spin_unlock_irqrestore(&priv->lock, flags); 1276 spin_unlock_irqrestore(&priv->lock, flags);
1226 1277
1227continue_read: 1278continue_read:
1228 1279
1229 /* Continue trying to always read... unless the port has closed. */ 1280 /* Continue trying to always read... unless the port has closed. */
1230 1281
1231 if (port->open_count > 0) { 1282 if (port->open_count > 0) {
1232 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, 1283 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
1233 usb_rcvintpipe(port->serial->dev, port->interrupt_in_endpointAddress), 1284 usb_rcvintpipe(port->serial->dev,
1234 port->interrupt_in_urb->transfer_buffer, 1285 port->interrupt_in_endpointAddress),
1235 port->interrupt_in_urb->transfer_buffer_length, 1286 port->interrupt_in_urb->transfer_buffer,
1236 cypress_read_int_callback, port, 1287 port->interrupt_in_urb->transfer_buffer_length,
1237 interval); 1288 cypress_read_int_callback, port, interval);
1238 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1289 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1239 if (result) 1290 if (result)
1240 dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); 1291 dev_err(&urb->dev->dev, "%s - failed resubmitting "
1292 "read urb, error %d\n", __FUNCTION__,
1293 result);
1241 } 1294 }
1242 1295
1243 return; 1296 return;
1244} /* cypress_read_int_callback */ 1297} /* cypress_read_int_callback */
1245 1298
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index d1964a0c4168..0a6e8b474b1f 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -269,6 +269,8 @@
269#define DRIVER_DESC "USB FTDI Serial Converters Driver" 269#define DRIVER_DESC "USB FTDI Serial Converters Driver"
270 270
271static int debug; 271static int debug;
272static __u16 vendor = FTDI_VID;
273static __u16 product;
272 274
273/* struct ftdi_sio_quirk is used by devices requiring special attention. */ 275/* struct ftdi_sio_quirk is used by devices requiring special attention. */
274struct ftdi_sio_quirk { 276struct ftdi_sio_quirk {
@@ -407,6 +409,34 @@ static struct usb_device_id id_table_combined [] = {
407 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) }, 409 { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) },
408 { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, 410 { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
409 { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, 411 { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) },
412 { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) },
413 { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) },
414 /*
415 * These will probably use user-space drivers. Uncomment them if
416 * you need them or use the user-specified vendor/product module
417 * parameters (see ftdi_sio.h for the numbers). Make a fuss if
418 * you think the driver should recognize any of them by default.
419 */
420 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) }, */
421 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) }, */
422 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) }, */
423 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) }, */
424 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) }, */
425 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) }, */
426 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) }, */
427 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) }, */
428 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) }, */
429 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) }, */
430 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, */
431 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) }, */
432 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) }, */
433 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) }, */
434 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) }, */
435 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) }, */
436 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, */
437 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, */
438 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, */
439 /* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, */
410 { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, 440 { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) },
411 { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, 441 { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) },
412 { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, 442 { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) },
@@ -418,6 +448,7 @@ static struct usb_device_id id_table_combined [] = {
418 { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) }, 448 { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) },
419 { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) }, 449 { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
420 { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) }, 450 { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
451 { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) },
421 { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) }, 452 { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
422 { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, 453 { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
423 { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, 454 { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
@@ -427,12 +458,21 @@ static struct usb_device_id id_table_combined [] = {
427 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID) }, 458 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID) },
428 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, 459 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
429 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, 460 { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
461 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) },
462 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) },
463 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) },
464 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) },
465 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) },
466 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
467 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
468 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
430 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, 469 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
431 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, 470 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
432 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) }, 471 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) },
433 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) }, 472 { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) },
434 { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, 473 { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
435 { } /* Terminating entry */ 474 { }, /* Optional parameter entry */
475 { } /* Terminating entry */
436}; 476};
437 477
438MODULE_DEVICE_TABLE (usb, id_table_combined); 478MODULE_DEVICE_TABLE (usb, id_table_combined);
@@ -2030,6 +2070,15 @@ static int __init ftdi_init (void)
2030 int retval; 2070 int retval;
2031 2071
2032 dbg("%s", __FUNCTION__); 2072 dbg("%s", __FUNCTION__);
2073 if (vendor > 0 && product > 0) {
2074 /* Add user specified VID/PID to reserved element of table. */
2075 int i;
2076 for (i = 0; id_table_combined[i].idVendor; i++)
2077 ;
2078 id_table_combined[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
2079 id_table_combined[i].idVendor = vendor;
2080 id_table_combined[i].idProduct = product;
2081 }
2033 retval = usb_serial_register(&ftdi_sio_device); 2082 retval = usb_serial_register(&ftdi_sio_device);
2034 if (retval) 2083 if (retval)
2035 goto failed_sio_register; 2084 goto failed_sio_register;
@@ -2066,4 +2115,9 @@ MODULE_LICENSE("GPL");
2066 2115
2067module_param(debug, bool, S_IRUGO | S_IWUSR); 2116module_param(debug, bool, S_IRUGO | S_IWUSR);
2068MODULE_PARM_DESC(debug, "Debug enabled or not"); 2117MODULE_PARM_DESC(debug, "Debug enabled or not");
2118module_param(vendor, ushort, 0);
2119MODULE_PARM_DESC(vendor, "User specified vendor ID (default="
2120 __MODULE_STRING(FTDI_VID)")");
2121module_param(product, ushort, 0);
2122MODULE_PARM_DESC(vendor, "User specified product ID");
2069 2123
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
index 9f4342093e8b..2c35d74cc6d6 100644
--- a/drivers/usb/serial/ftdi_sio.h
+++ b/drivers/usb/serial/ftdi_sio.h
@@ -142,10 +142,43 @@
142/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ 142/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
143#define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ 143#define FTDI_USB_UIRT_PID 0xF850 /* Product Id */
144 144
145/* ELV USB Module UO100 (PID sent by Stefan Frings) */ 145/*
146#define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */ 146 * ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
147/* ELV USB Module UM100 (PID sent by Arnim Laeuger) */ 147 * All of these devices use FTDI's vendor ID (0x0403).
148#define FTDI_ELV_UM100_PID 0xFB5A /* Product Id */ 148 *
149 * The previously included PID for the UO 100 module was incorrect.
150 * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58).
151 *
152 * Armin Laeuger originally sent the PID for the UM 100 module.
153 */
154#define FTDI_ELV_UR100_PID 0xFB58 /* USB-RS232-Umsetzer (UR 100) */
155#define FTDI_ELV_UM100_PID 0xFB5A /* USB-Modul UM 100 */
156#define FTDI_ELV_UO100_PID 0xFB5B /* USB-Modul UO 100 */
157#define FTDI_ELV_ALC8500_PID 0xF06E /* ALC 8500 Expert */
158/* Additional ELV PIDs that default to using the FTDI D2XX drivers on
159 * MS Windows, rather than the FTDI Virtual Com Port drivers.
160 * Maybe these will be easier to use with the libftdi/libusb user-space
161 * drivers, or possibly the Comedi drivers in some cases. */
162#define FTDI_ELV_CLI7000_PID 0xFB59 /* Computer-Light-Interface (CLI 7000) */
163#define FTDI_ELV_PPS7330_PID 0xFB5C /* Processor-Power-Supply (PPS 7330) */
164#define FTDI_ELV_TFM100_PID 0xFB5D /* Temperartur-Feuchte Messgeraet (TFM 100) */
165#define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkurh (UDF 77) */
166#define FTDI_ELV_UIO88_PID 0xFB5F /* USB-I/O Interface (UIO 88) */
167#define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */
168#define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */
169#define FTDI_ELV_USI2_PID 0xF06A /* USB-Schrittmotoren-Interface (USI 2) */
170#define FTDI_ELV_T1100_PID 0xF06B /* Thermometer (T 1100) */
171#define FTDI_ELV_PCD200_PID 0xF06C /* PC-Datenlogger (PCD 200) */
172#define FTDI_ELV_ULA200_PID 0xF06D /* USB-LCD-Ansteuerung (ULA 200) */
173#define FTDI_ELV_FHZ1000PC_PID 0xF06F /* FHZ 1000 PC */
174#define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */
175#define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */
176#define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */
177#define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */
178#define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */
179#define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */
180#define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */
181#define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */
149 182
150/* 183/*
151 * Definitions for ID TECH (www.idt-net.com) devices 184 * Definitions for ID TECH (www.idt-net.com) devices
@@ -222,6 +255,7 @@
222 */ 255 */
223#define FALCOM_VID 0x0F94 /* Vendor Id */ 256#define FALCOM_VID 0x0F94 /* Vendor Id */
224#define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */ 257#define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */
258#define FALCOM_SAMBA_PID 0x0005 /* Falcom Samba USB GPRS modem */
225 259
226/* 260/*
227 * SUUNTO product ids 261 * SUUNTO product ids
@@ -277,6 +311,18 @@
277#define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */ 311#define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */
278 312
279/* 313/*
314 * Xsens Technologies BV products (http://www.xsens.com).
315 */
316#define XSENS_CONVERTER_0_PID 0xD388
317#define XSENS_CONVERTER_1_PID 0xD389
318#define XSENS_CONVERTER_2_PID 0xD38A
319#define XSENS_CONVERTER_3_PID 0xD38B
320#define XSENS_CONVERTER_4_PID 0xD38C
321#define XSENS_CONVERTER_5_PID 0xD38D
322#define XSENS_CONVERTER_6_PID 0xD38E
323#define XSENS_CONVERTER_7_PID 0xD38F
324
325/*
280 * Evolution Robotics products (http://www.evolution.com/). 326 * Evolution Robotics products (http://www.evolution.com/).
281 * Submitted by Shawn M. Lavelle. 327 * Submitted by Shawn M. Lavelle.
282 */ 328 */
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index fb0926292228..3b958e60f5e8 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -383,11 +383,8 @@ static int keyspan_write(struct usb_serial_port *port,
383 dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip); 383 dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip);
384 384
385 if (this_urb->status == -EINPROGRESS) { 385 if (this_urb->status == -EINPROGRESS) {
386 if (this_urb->transfer_flags & URB_ASYNC_UNLINK)
387 break;
388 if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ)) 386 if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ))
389 break; 387 break;
390 this_urb->transfer_flags |= URB_ASYNC_UNLINK;
391 usb_unlink_urb(this_urb); 388 usb_unlink_urb(this_urb);
392 break; 389 break;
393 } 390 }
@@ -402,7 +399,6 @@ static int keyspan_write(struct usb_serial_port *port,
402 /* send the data out the bulk port */ 399 /* send the data out the bulk port */
403 this_urb->transfer_buffer_length = todo + dataOffset; 400 this_urb->transfer_buffer_length = todo + dataOffset;
404 401
405 this_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
406 this_urb->dev = port->serial->dev; 402 this_urb->dev = port->serial->dev;
407 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { 403 if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
408 dbg("usb_submit_urb(write bulk) failed (%d)", err); 404 dbg("usb_submit_urb(write bulk) failed (%d)", err);
@@ -1119,10 +1115,8 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp)
1119 1115
1120static inline void stop_urb(struct urb *urb) 1116static inline void stop_urb(struct urb *urb)
1121{ 1117{
1122 if (urb && urb->status == -EINPROGRESS) { 1118 if (urb && urb->status == -EINPROGRESS)
1123 urb->transfer_flags &= ~URB_ASYNC_UNLINK;
1124 usb_kill_urb(urb); 1119 usb_kill_urb(urb);
1125 }
1126} 1120}
1127 1121
1128static void keyspan_close(struct usb_serial_port *port, struct file *filp) 1122static void keyspan_close(struct usb_serial_port *port, struct file *filp)
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
index e9256408757f..92d0f925d053 100644
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -45,29 +45,29 @@
45#include "usb-serial.h" 45#include "usb-serial.h"
46 46
47/* Function prototypes */ 47/* Function prototypes */
48static int option_open (struct usb_serial_port *port, struct file *filp); 48static int option_open(struct usb_serial_port *port, struct file *filp);
49static void option_close (struct usb_serial_port *port, struct file *filp); 49static void option_close(struct usb_serial_port *port, struct file *filp);
50static int option_startup (struct usb_serial *serial); 50static int option_startup(struct usb_serial *serial);
51static void option_shutdown (struct usb_serial *serial); 51static void option_shutdown(struct usb_serial *serial);
52static void option_rx_throttle (struct usb_serial_port *port); 52static void option_rx_throttle(struct usb_serial_port *port);
53static void option_rx_unthrottle (struct usb_serial_port *port); 53static void option_rx_unthrottle(struct usb_serial_port *port);
54static int option_write_room (struct usb_serial_port *port); 54static int option_write_room(struct usb_serial_port *port);
55 55
56static void option_instat_callback(struct urb *urb, struct pt_regs *regs); 56static void option_instat_callback(struct urb *urb, struct pt_regs *regs);
57 57
58static int option_write (struct usb_serial_port *port, 58static int option_write(struct usb_serial_port *port,
59 const unsigned char *buf, int count); 59 const unsigned char *buf, int count);
60 60
61static int option_chars_in_buffer (struct usb_serial_port *port); 61static int option_chars_in_buffer(struct usb_serial_port *port);
62static int option_ioctl (struct usb_serial_port *port, struct file *file, 62static int option_ioctl(struct usb_serial_port *port, struct file *file,
63 unsigned int cmd, unsigned long arg); 63 unsigned int cmd, unsigned long arg);
64static void option_set_termios (struct usb_serial_port *port, 64static void option_set_termios(struct usb_serial_port *port,
65 struct termios *old); 65 struct termios *old);
66static void option_break_ctl (struct usb_serial_port *port, int break_state); 66static void option_break_ctl(struct usb_serial_port *port, int break_state);
67static int option_tiocmget (struct usb_serial_port *port, struct file *file); 67static int option_tiocmget(struct usb_serial_port *port, struct file *file);
68static int option_tiocmset (struct usb_serial_port *port, struct file *file, 68static int option_tiocmset(struct usb_serial_port *port, struct file *file,
69 unsigned int set, unsigned int clear); 69 unsigned int set, unsigned int clear);
70static int option_send_setup (struct usb_serial_port *port); 70static int option_send_setup(struct usb_serial_port *port);
71 71
72/* Vendor and product IDs */ 72/* Vendor and product IDs */
73#define OPTION_VENDOR_ID 0x0AF0 73#define OPTION_VENDOR_ID 0x0AF0
@@ -76,7 +76,6 @@ static int option_send_setup (struct usb_serial_port *port);
76#define OPTION_PRODUCT_FUSION 0x6000 76#define OPTION_PRODUCT_FUSION 0x6000
77#define OPTION_PRODUCT_FUSION2 0x6300 77#define OPTION_PRODUCT_FUSION2 0x6300
78 78
79
80static struct usb_device_id option_ids[] = { 79static struct usb_device_id option_ids[] = {
81 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, 80 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
82 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, 81 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
@@ -129,7 +128,6 @@ static int debug;
129#define debug 0 128#define debug 0
130#endif 129#endif
131 130
132
133/* per port private data */ 131/* per port private data */
134 132
135#define N_IN_URB 4 133#define N_IN_URB 4
@@ -156,10 +154,8 @@ struct option_port_private {
156 unsigned long tx_start_time[N_OUT_URB]; 154 unsigned long tx_start_time[N_OUT_URB];
157}; 155};
158 156
159
160/* Functions used by new usb-serial code. */ 157/* Functions used by new usb-serial code. */
161static int __init 158static int __init option_init(void)
162option_init (void)
163{ 159{
164 int retval; 160 int retval;
165 retval = usb_serial_register(&option_3port_device); 161 retval = usb_serial_register(&option_3port_device);
@@ -179,8 +175,7 @@ failed_3port_device_register:
179 return retval; 175 return retval;
180} 176}
181 177
182static void __exit 178static void __exit option_exit(void)
183option_exit (void)
184{ 179{
185 usb_deregister (&option_driver); 180 usb_deregister (&option_driver);
186 usb_serial_deregister (&option_3port_device); 181 usb_serial_deregister (&option_3port_device);
@@ -189,39 +184,31 @@ option_exit (void)
189module_init(option_init); 184module_init(option_init);
190module_exit(option_exit); 185module_exit(option_exit);
191 186
192static void 187static void option_rx_throttle(struct usb_serial_port *port)
193option_rx_throttle (struct usb_serial_port *port)
194{ 188{
195 dbg("%s", __FUNCTION__); 189 dbg("%s", __FUNCTION__);
196} 190}
197 191
198 192static void option_rx_unthrottle(struct usb_serial_port *port)
199static void
200option_rx_unthrottle (struct usb_serial_port *port)
201{ 193{
202 dbg("%s", __FUNCTION__); 194 dbg("%s", __FUNCTION__);
203} 195}
204 196
205 197static void option_break_ctl(struct usb_serial_port *port, int break_state)
206static void
207option_break_ctl (struct usb_serial_port *port, int break_state)
208{ 198{
209 /* Unfortunately, I don't know how to send a break */ 199 /* Unfortunately, I don't know how to send a break */
210 dbg("%s", __FUNCTION__); 200 dbg("%s", __FUNCTION__);
211} 201}
212 202
213 203static void option_set_termios(struct usb_serial_port *port,
214static void 204 struct termios *old_termios)
215option_set_termios (struct usb_serial_port *port,
216 struct termios *old_termios)
217{ 205{
218 dbg("%s", __FUNCTION__); 206 dbg("%s", __FUNCTION__);
219 207
220 option_send_setup(port); 208 option_send_setup(port);
221} 209}
222 210
223static int 211static int option_tiocmget(struct usb_serial_port *port, struct file *file)
224option_tiocmget (struct usb_serial_port *port, struct file *file)
225{ 212{
226 unsigned int value; 213 unsigned int value;
227 struct option_port_private *portdata; 214 struct option_port_private *portdata;
@@ -238,9 +225,8 @@ option_tiocmget (struct usb_serial_port *port, struct file *file)
238 return value; 225 return value;
239} 226}
240 227
241static int 228static int option_tiocmset(struct usb_serial_port *port, struct file *file,
242option_tiocmset (struct usb_serial_port *port, struct file *file, 229 unsigned int set, unsigned int clear)
243 unsigned int set, unsigned int clear)
244{ 230{
245 struct option_port_private *portdata; 231 struct option_port_private *portdata;
246 232
@@ -258,17 +244,15 @@ option_tiocmset (struct usb_serial_port *port, struct file *file,
258 return option_send_setup(port); 244 return option_send_setup(port);
259} 245}
260 246
261static int 247static int option_ioctl(struct usb_serial_port *port, struct file *file,
262option_ioctl (struct usb_serial_port *port, struct file *file, 248 unsigned int cmd, unsigned long arg)
263 unsigned int cmd, unsigned long arg)
264{ 249{
265 return -ENOIOCTLCMD; 250 return -ENOIOCTLCMD;
266} 251}
267 252
268/* Write */ 253/* Write */
269static int 254static int option_write(struct usb_serial_port *port,
270option_write (struct usb_serial_port *port, 255 const unsigned char *buf, int count)
271 const unsigned char *buf, int count)
272{ 256{
273 struct option_port_private *portdata; 257 struct option_port_private *portdata;
274 int i; 258 int i;
@@ -289,28 +273,29 @@ option_write (struct usb_serial_port *port,
289 273
290 this_urb = portdata->out_urbs[i]; 274 this_urb = portdata->out_urbs[i];
291 if (this_urb->status == -EINPROGRESS) { 275 if (this_urb->status == -EINPROGRESS) {
292 if (this_urb->transfer_flags & URB_ASYNC_UNLINK) 276 if (time_before(jiffies,
293 continue; 277 portdata->tx_start_time[i] + 10 * HZ))
294 if (time_before(jiffies, portdata->tx_start_time[i] + 10 * HZ))
295 continue; 278 continue;
296 this_urb->transfer_flags |= URB_ASYNC_UNLINK;
297 usb_unlink_urb(this_urb); 279 usb_unlink_urb(this_urb);
298 continue; 280 continue;
299 } 281 }
300 if (this_urb->status != 0) 282 if (this_urb->status != 0)
301 dbg("usb_write %p failed (err=%d)", this_urb, this_urb->status); 283 dbg("usb_write %p failed (err=%d)",
284 this_urb, this_urb->status);
302 285
303 dbg("%s: endpoint %d buf %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), i); 286 dbg("%s: endpoint %d buf %d", __FUNCTION__,
287 usb_pipeendpoint(this_urb->pipe), i);
304 288
305 /* send the data */ 289 /* send the data */
306 memcpy (this_urb->transfer_buffer, buf, todo); 290 memcpy (this_urb->transfer_buffer, buf, todo);
307 this_urb->transfer_buffer_length = todo; 291 this_urb->transfer_buffer_length = todo;
308 292
309 this_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
310 this_urb->dev = port->serial->dev; 293 this_urb->dev = port->serial->dev;
311 err = usb_submit_urb(this_urb, GFP_ATOMIC); 294 err = usb_submit_urb(this_urb, GFP_ATOMIC);
312 if (err) { 295 if (err) {
313 dbg("usb_submit_urb %p (write bulk) failed (%d, has %d)", this_urb, err, this_urb->status); 296 dbg("usb_submit_urb %p (write bulk) failed "
297 "(%d, has %d)", this_urb,
298 err, this_urb->status);
314 continue; 299 continue;
315 } 300 }
316 portdata->tx_start_time[i] = jiffies; 301 portdata->tx_start_time[i] = jiffies;
@@ -323,8 +308,7 @@ option_write (struct usb_serial_port *port,
323 return count; 308 return count;
324} 309}
325 310
326static void 311static void option_indat_callback(struct urb *urb, struct pt_regs *regs)
327option_indat_callback (struct urb *urb, struct pt_regs *regs)
328{ 312{
329 int i, err; 313 int i, err;
330 int endpoint; 314 int endpoint;
@@ -357,14 +341,14 @@ option_indat_callback (struct urb *urb, struct pt_regs *regs)
357 if (port->open_count && urb->status != -ESHUTDOWN) { 341 if (port->open_count && urb->status != -ESHUTDOWN) {
358 err = usb_submit_urb(urb, GFP_ATOMIC); 342 err = usb_submit_urb(urb, GFP_ATOMIC);
359 if (err) 343 if (err)
360 printk(KERN_ERR "%s: resubmit read urb failed. (%d)", __FUNCTION__, err); 344 printk(KERN_ERR "%s: resubmit read urb failed. "
345 "(%d)", __FUNCTION__, err);
361 } 346 }
362 } 347 }
363 return; 348 return;
364} 349}
365 350
366static void 351static void option_outdat_callback(struct urb *urb, struct pt_regs *regs)
367option_outdat_callback (struct urb *urb, struct pt_regs *regs)
368{ 352{
369 struct usb_serial_port *port; 353 struct usb_serial_port *port;
370 354
@@ -376,8 +360,7 @@ option_outdat_callback (struct urb *urb, struct pt_regs *regs)
376 schedule_work(&port->work); 360 schedule_work(&port->work);
377} 361}
378 362
379static void 363static void option_instat_callback(struct urb *urb, struct pt_regs *regs)
380option_instat_callback (struct urb *urb, struct pt_regs *regs)
381{ 364{
382 int err; 365 int err;
383 struct usb_serial_port *port = (struct usb_serial_port *) urb->context; 366 struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
@@ -395,10 +378,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs)
395 dbg("%s: NULL req_pkt\n", __FUNCTION__); 378 dbg("%s: NULL req_pkt\n", __FUNCTION__);
396 return; 379 return;
397 } 380 }
398 if ((req_pkt->bRequestType == 0xA1) && (req_pkt->bRequest == 0x20)) { 381 if ((req_pkt->bRequestType == 0xA1) &&
382 (req_pkt->bRequest == 0x20)) {
399 int old_dcd_state; 383 int old_dcd_state;
400 unsigned char signals = *((unsigned char *) 384 unsigned char signals = *((unsigned char *)
401 urb->transfer_buffer + sizeof(struct usb_ctrlrequest)); 385 urb->transfer_buffer +
386 sizeof(struct usb_ctrlrequest));
402 387
403 dbg("%s: signal x%x", __FUNCTION__, signals); 388 dbg("%s: signal x%x", __FUNCTION__, signals);
404 389
@@ -408,12 +393,13 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs)
408 portdata->dsr_state = ((signals & 0x02) ? 1 : 0); 393 portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
409 portdata->ri_state = ((signals & 0x08) ? 1 : 0); 394 portdata->ri_state = ((signals & 0x08) ? 1 : 0);
410 395
411 if (port->tty && !C_CLOCAL(port->tty) 396 if (port->tty && !C_CLOCAL(port->tty) &&
412 && old_dcd_state && !portdata->dcd_state) { 397 old_dcd_state && !portdata->dcd_state)
413 tty_hangup(port->tty); 398 tty_hangup(port->tty);
414 } 399 } else {
415 } else 400 dbg("%s: type %x req %x", __FUNCTION__,
416 dbg("%s: type %x req %x", __FUNCTION__, req_pkt->bRequestType,req_pkt->bRequest); 401 req_pkt->bRequestType,req_pkt->bRequest);
402 }
417 } else 403 } else
418 dbg("%s: error %d", __FUNCTION__, urb->status); 404 dbg("%s: error %d", __FUNCTION__, urb->status);
419 405
@@ -422,13 +408,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs)
422 urb->dev = serial->dev; 408 urb->dev = serial->dev;
423 err = usb_submit_urb(urb, GFP_ATOMIC); 409 err = usb_submit_urb(urb, GFP_ATOMIC);
424 if (err) 410 if (err)
425 dbg("%s: resubmit intr urb failed. (%d)", __FUNCTION__, err); 411 dbg("%s: resubmit intr urb failed. (%d)",
412 __FUNCTION__, err);
426 } 413 }
427} 414}
428 415
429 416static int option_write_room(struct usb_serial_port *port)
430static int
431option_write_room (struct usb_serial_port *port)
432{ 417{
433 struct option_port_private *portdata; 418 struct option_port_private *portdata;
434 int i; 419 int i;
@@ -447,9 +432,7 @@ option_write_room (struct usb_serial_port *port)
447 return data_len; 432 return data_len;
448} 433}
449 434
450 435static int option_chars_in_buffer(struct usb_serial_port *port)
451static int
452option_chars_in_buffer (struct usb_serial_port *port)
453{ 436{
454 struct option_port_private *portdata; 437 struct option_port_private *portdata;
455 int i; 438 int i;
@@ -467,9 +450,7 @@ option_chars_in_buffer (struct usb_serial_port *port)
467 return data_len; 450 return data_len;
468} 451}
469 452
470 453static int option_open(struct usb_serial_port *port, struct file *filp)
471static int
472option_open (struct usb_serial_port *port, struct file *filp)
473{ 454{
474 struct option_port_private *portdata; 455 struct option_port_private *portdata;
475 struct usb_serial *serial = port->serial; 456 struct usb_serial *serial = port->serial;
@@ -490,17 +471,21 @@ option_open (struct usb_serial_port *port, struct file *filp)
490 if (! urb) 471 if (! urb)
491 continue; 472 continue;
492 if (urb->dev != serial->dev) { 473 if (urb->dev != serial->dev) {
493 dbg("%s: dev %p != %p", __FUNCTION__, urb->dev, serial->dev); 474 dbg("%s: dev %p != %p", __FUNCTION__,
475 urb->dev, serial->dev);
494 continue; 476 continue;
495 } 477 }
496 478
497 /* make sure endpoint data toggle is synchronized with the device */ 479 /*
498 480 * make sure endpoint data toggle is synchronized with the
481 * device
482 */
499 usb_clear_halt(urb->dev, urb->pipe); 483 usb_clear_halt(urb->dev, urb->pipe);
500 484
501 err = usb_submit_urb(urb, GFP_KERNEL); 485 err = usb_submit_urb(urb, GFP_KERNEL);
502 if (err) { 486 if (err) {
503 dbg("%s: submit urb %d failed (%d) %d", __FUNCTION__, i, err, 487 dbg("%s: submit urb %d failed (%d) %d",
488 __FUNCTION__, i, err,
504 urb->transfer_buffer_length); 489 urb->transfer_buffer_length);
505 } 490 }
506 } 491 }
@@ -511,7 +496,8 @@ option_open (struct usb_serial_port *port, struct file *filp)
511 if (! urb) 496 if (! urb)
512 continue; 497 continue;
513 urb->dev = serial->dev; 498 urb->dev = serial->dev;
514 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ 499 /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
500 usb_pipeout(urb->pipe), 0); */
515 } 501 }
516 502
517 port->tty->low_latency = 1; 503 port->tty->low_latency = 1;
@@ -521,17 +507,13 @@ option_open (struct usb_serial_port *port, struct file *filp)
521 return (0); 507 return (0);
522} 508}
523 509
524static inline void 510static inline void stop_urb(struct urb *urb)
525stop_urb (struct urb *urb)
526{ 511{
527 if (urb && urb->status == -EINPROGRESS) { 512 if (urb && urb->status == -EINPROGRESS)
528 urb->transfer_flags &= ~URB_ASYNC_UNLINK;
529 usb_kill_urb(urb); 513 usb_kill_urb(urb);
530 }
531} 514}
532 515
533static void 516static void option_close(struct usb_serial_port *port, struct file *filp)
534option_close (struct usb_serial_port *port, struct file *filp)
535{ 517{
536 int i; 518 int i;
537 struct usb_serial *serial = port->serial; 519 struct usb_serial *serial = port->serial;
@@ -555,12 +537,10 @@ option_close (struct usb_serial_port *port, struct file *filp)
555 port->tty = NULL; 537 port->tty = NULL;
556} 538}
557 539
558
559/* Helper functions used by option_setup_urbs */ 540/* Helper functions used by option_setup_urbs */
560static struct urb * 541static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
561option_setup_urb (struct usb_serial *serial, int endpoint, 542 int dir, void *ctx, char *buf, int len,
562 int dir, void *ctx, char *buf, int len, 543 void (*callback)(struct urb *, struct pt_regs *regs))
563 void (*callback)(struct urb *, struct pt_regs *regs))
564{ 544{
565 struct urb *urb; 545 struct urb *urb;
566 546
@@ -582,8 +562,7 @@ option_setup_urb (struct usb_serial *serial, int endpoint,
582} 562}
583 563
584/* Setup urbs */ 564/* Setup urbs */
585static void 565static void option_setup_urbs(struct usb_serial *serial)
586option_setup_urbs (struct usb_serial *serial)
587{ 566{
588 int j; 567 int j;
589 struct usb_serial_port *port; 568 struct usb_serial_port *port;
@@ -609,9 +588,7 @@ option_setup_urbs (struct usb_serial *serial)
609 } 588 }
610} 589}
611 590
612 591static int option_send_setup(struct usb_serial_port *port)
613static int
614option_send_setup (struct usb_serial_port *port)
615{ 592{
616 struct usb_serial *serial = port->serial; 593 struct usb_serial *serial = port->serial;
617 struct option_port_private *portdata; 594 struct option_port_private *portdata;
@@ -627,16 +604,15 @@ option_send_setup (struct usb_serial_port *port)
627 if (portdata->rts_state) 604 if (portdata->rts_state)
628 val |= 0x02; 605 val |= 0x02;
629 606
630 return usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 607 return usb_control_msg(serial->dev,
631 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); 608 usb_rcvctrlpipe(serial->dev, 0),
609 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
632 } 610 }
633 611
634 return 0; 612 return 0;
635} 613}
636 614
637 615static int option_startup(struct usb_serial *serial)
638static int
639option_startup (struct usb_serial *serial)
640{ 616{
641 int i, err; 617 int i, err;
642 struct usb_serial_port *port; 618 struct usb_serial_port *port;
@@ -647,9 +623,10 @@ option_startup (struct usb_serial *serial)
647 /* Now setup per port private data */ 623 /* Now setup per port private data */
648 for (i = 0; i < serial->num_ports; i++) { 624 for (i = 0; i < serial->num_ports; i++) {
649 port = serial->port[i]; 625 port = serial->port[i];
650 portdata = kmalloc(sizeof(struct option_port_private), GFP_KERNEL); 626 portdata = kmalloc(sizeof(*portdata), GFP_KERNEL);
651 if (!portdata) { 627 if (!portdata) {
652 dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i); 628 dbg("%s: kmalloc for option_port_private (%d) failed!.",
629 __FUNCTION__, i);
653 return (1); 630 return (1);
654 } 631 }
655 memset(portdata, 0, sizeof(struct option_port_private)); 632 memset(portdata, 0, sizeof(struct option_port_private));
@@ -660,7 +637,8 @@ option_startup (struct usb_serial *serial)
660 continue; 637 continue;
661 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 638 err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
662 if (err) 639 if (err)
663 dbg("%s: submit irq_in urb failed %d", __FUNCTION__, err); 640 dbg("%s: submit irq_in urb failed %d",
641 __FUNCTION__, err);
664 } 642 }
665 643
666 option_setup_urbs(serial); 644 option_setup_urbs(serial);
@@ -668,8 +646,7 @@ option_startup (struct usb_serial *serial)
668 return (0); 646 return (0);
669} 647}
670 648
671static void 649static void option_shutdown(struct usb_serial *serial)
672option_shutdown (struct usb_serial *serial)
673{ 650{
674 int i, j; 651 int i, j;
675 struct usb_serial_port *port; 652 struct usb_serial_port *port;
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 7eab5d4cf3a8..461474176cfb 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -538,8 +538,10 @@ static int pl2303_open (struct usb_serial_port *port, struct file *filp)
538 538
539 dbg("%s - port %d", __FUNCTION__, port->number); 539 dbg("%s - port %d", __FUNCTION__, port->number);
540 540
541 usb_clear_halt(serial->dev, port->write_urb->pipe); 541 if (priv->type != HX) {
542 usb_clear_halt(serial->dev, port->read_urb->pipe); 542 usb_clear_halt(serial->dev, port->write_urb->pipe);
543 usb_clear_halt(serial->dev, port->read_urb->pipe);
544 }
543 545
544 buf = kmalloc(10, GFP_KERNEL); 546 buf = kmalloc(10, GFP_KERNEL);
545 if (buf==NULL) 547 if (buf==NULL)
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 0267b26dde18..e77fbdfc782d 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -531,7 +531,7 @@ bailout_kref_put:
531 531
532static void serial_close(struct tty_struct *tty, struct file * filp) 532static void serial_close(struct tty_struct *tty, struct file * filp)
533{ 533{
534 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 534 struct usb_serial_port *port = tty->driver_data;
535 535
536 if (!port) 536 if (!port)
537 return; 537 return;
@@ -561,7 +561,7 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
561 561
562static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) 562static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count)
563{ 563{
564 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 564 struct usb_serial_port *port = tty->driver_data;
565 int retval = -EINVAL; 565 int retval = -EINVAL;
566 566
567 dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); 567 dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);
@@ -580,7 +580,7 @@ exit:
580 580
581static int serial_write_room (struct tty_struct *tty) 581static int serial_write_room (struct tty_struct *tty)
582{ 582{
583 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 583 struct usb_serial_port *port = tty->driver_data;
584 int retval = -EINVAL; 584 int retval = -EINVAL;
585 585
586 dbg("%s - port %d", __FUNCTION__, port->number); 586 dbg("%s - port %d", __FUNCTION__, port->number);
@@ -599,7 +599,7 @@ exit:
599 599
600static int serial_chars_in_buffer (struct tty_struct *tty) 600static int serial_chars_in_buffer (struct tty_struct *tty)
601{ 601{
602 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 602 struct usb_serial_port *port = tty->driver_data;
603 int retval = -EINVAL; 603 int retval = -EINVAL;
604 604
605 dbg("%s = port %d", __FUNCTION__, port->number); 605 dbg("%s = port %d", __FUNCTION__, port->number);
@@ -618,7 +618,7 @@ exit:
618 618
619static void serial_throttle (struct tty_struct * tty) 619static void serial_throttle (struct tty_struct * tty)
620{ 620{
621 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 621 struct usb_serial_port *port = tty->driver_data;
622 622
623 dbg("%s - port %d", __FUNCTION__, port->number); 623 dbg("%s - port %d", __FUNCTION__, port->number);
624 624
@@ -634,7 +634,7 @@ static void serial_throttle (struct tty_struct * tty)
634 634
635static void serial_unthrottle (struct tty_struct * tty) 635static void serial_unthrottle (struct tty_struct * tty)
636{ 636{
637 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 637 struct usb_serial_port *port = tty->driver_data;
638 638
639 dbg("%s - port %d", __FUNCTION__, port->number); 639 dbg("%s - port %d", __FUNCTION__, port->number);
640 640
@@ -650,7 +650,7 @@ static void serial_unthrottle (struct tty_struct * tty)
650 650
651static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) 651static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg)
652{ 652{
653 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 653 struct usb_serial_port *port = tty->driver_data;
654 int retval = -ENODEV; 654 int retval = -ENODEV;
655 655
656 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd); 656 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
@@ -672,7 +672,7 @@ exit:
672 672
673static void serial_set_termios (struct tty_struct *tty, struct termios * old) 673static void serial_set_termios (struct tty_struct *tty, struct termios * old)
674{ 674{
675 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 675 struct usb_serial_port *port = tty->driver_data;
676 676
677 dbg("%s - port %d", __FUNCTION__, port->number); 677 dbg("%s - port %d", __FUNCTION__, port->number);
678 678
@@ -688,7 +688,7 @@ static void serial_set_termios (struct tty_struct *tty, struct termios * old)
688 688
689static void serial_break (struct tty_struct *tty, int break_state) 689static void serial_break (struct tty_struct *tty, int break_state)
690{ 690{
691 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 691 struct usb_serial_port *port = tty->driver_data;
692 692
693 dbg("%s - port %d", __FUNCTION__, port->number); 693 dbg("%s - port %d", __FUNCTION__, port->number);
694 694
@@ -749,7 +749,7 @@ done:
749 749
750static int serial_tiocmget (struct tty_struct *tty, struct file *file) 750static int serial_tiocmget (struct tty_struct *tty, struct file *file)
751{ 751{
752 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 752 struct usb_serial_port *port = tty->driver_data;
753 753
754 dbg("%s - port %d", __FUNCTION__, port->number); 754 dbg("%s - port %d", __FUNCTION__, port->number);
755 755
@@ -768,7 +768,7 @@ exit:
768static int serial_tiocmset (struct tty_struct *tty, struct file *file, 768static int serial_tiocmset (struct tty_struct *tty, struct file *file,
769 unsigned int set, unsigned int clear) 769 unsigned int set, unsigned int clear)
770{ 770{
771 struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; 771 struct usb_serial_port *port = tty->driver_data;
772 772
773 dbg("%s - port %d", __FUNCTION__, port->number); 773 dbg("%s - port %d", __FUNCTION__, port->number);
774 774
@@ -786,7 +786,7 @@ exit:
786 786
787void usb_serial_port_softint(void *private) 787void usb_serial_port_softint(void *private)
788{ 788{
789 struct usb_serial_port *port = (struct usb_serial_port *)private; 789 struct usb_serial_port *port = private;
790 struct tty_struct *tty; 790 struct tty_struct *tty;
791 791
792 dbg("%s - port %d", __FUNCTION__, port->number); 792 dbg("%s - port %d", __FUNCTION__, port->number);
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
index f1f1c0608c22..bb9819cc8826 100644
--- a/drivers/usb/storage/Kconfig
+++ b/drivers/usb/storage/Kconfig
@@ -111,3 +111,15 @@ config USB_STORAGE_JUMPSHOT
111 Say Y here to include additional code to support the Lexar Jumpshot 111 Say Y here to include additional code to support the Lexar Jumpshot
112 USB CompactFlash reader. 112 USB CompactFlash reader.
113 113
114
115config USB_STORAGE_ONETOUCH
116 bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)"
117 depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL
118 help
119 Say Y here to include additional code to support the Maxtor OneTouch
120 USB hard drive's onetouch button.
121
122 This code registers the button on the front of Maxtor OneTouch USB
123 hard drive's as an input device. An action can be associated with
124 this input in any keybinding software. (e.g. gnome's keyboard short-
125 cuts)
diff --git a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile
index 56652ccc2881..44ab8f9978fe 100644
--- a/drivers/usb/storage/Makefile
+++ b/drivers/usb/storage/Makefile
@@ -18,6 +18,7 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM) += dpcm.o
18usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200) += isd200.o 18usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200) += isd200.o
19usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB) += datafab.o 19usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB) += datafab.o
20usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o 20usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o
21usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o
21 22
22usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ 23usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \
23 initializers.o $(usb-storage-obj-y) 24 initializers.o $(usb-storage-obj-y)
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c
new file mode 100644
index 000000000000..2c9402dc702b
--- /dev/null
+++ b/drivers/usb/storage/onetouch.c
@@ -0,0 +1,210 @@
1/*
2 * Support for the Maxtor OneTouch USB hard drive's button
3 *
4 * Current development and maintenance by:
5 * Copyright (c) 2005 Nick Sillik <n.sillik@temple.edu>
6 *
7 * Initial work by:
8 * Copyright (c) 2003 Erik Thyren <erth7411@student.uu.se>
9 *
10 * Based on usbmouse.c (Vojtech Pavlik) and xpad.c (Marko Friedemann)
11 *
12 */
13
14/*
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 *
29 */
30
31#include <linux/config.h>
32#include <linux/kernel.h>
33#include <linux/input.h>
34#include <linux/init.h>
35#include <linux/slab.h>
36#include <linux/module.h>
37#include <linux/usb.h>
38#include <linux/usb_ch9.h>
39#include <linux/usb_input.h>
40#include "usb.h"
41#include "onetouch.h"
42#include "debug.h"
43
44void onetouch_release_input(void *onetouch_);
45
46struct usb_onetouch {
47 char name[128];
48 char phys[64];
49 struct input_dev dev; /* input device interface */
50 struct usb_device *udev; /* usb device */
51
52 struct urb *irq; /* urb for interrupt in report */
53 unsigned char *data; /* input data */
54 dma_addr_t data_dma;
55};
56
57static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs)
58{
59 struct usb_onetouch *onetouch = urb->context;
60 signed char *data = onetouch->data;
61 struct input_dev *dev = &onetouch->dev;
62 int status;
63
64 switch (urb->status) {
65 case 0: /* success */
66 break;
67 case -ECONNRESET: /* unlink */
68 case -ENOENT:
69 case -ESHUTDOWN:
70 return;
71 /* -EPIPE: should clear the halt */
72 default: /* error */
73 goto resubmit;
74 }
75
76 input_regs(dev, regs);
77
78 input_report_key(&onetouch->dev, ONETOUCH_BUTTON,
79 data[0] & 0x02);
80
81 input_sync(dev);
82resubmit:
83 status = usb_submit_urb (urb, SLAB_ATOMIC);
84 if (status)
85 err ("can't resubmit intr, %s-%s/input0, status %d",
86 onetouch->udev->bus->bus_name,
87 onetouch->udev->devpath, status);
88}
89
90static int usb_onetouch_open(struct input_dev *dev)
91{
92 struct usb_onetouch *onetouch = dev->private;
93
94 onetouch->irq->dev = onetouch->udev;
95 if (usb_submit_urb(onetouch->irq, GFP_KERNEL)) {
96 err("usb_submit_urb failed");
97 return -EIO;
98 }
99
100 return 0;
101}
102
103static void usb_onetouch_close(struct input_dev *dev)
104{
105 struct usb_onetouch *onetouch = dev->private;
106
107 usb_kill_urb(onetouch->irq);
108}
109
110int onetouch_connect_input(struct us_data *ss)
111{
112 struct usb_device *udev = ss->pusb_dev;
113 struct usb_host_interface *interface;
114 struct usb_endpoint_descriptor *endpoint;
115 struct usb_onetouch *onetouch;
116 int pipe, maxp;
117 char path[64];
118
119 interface = ss->pusb_intf->cur_altsetting;
120
121 if (interface->desc.bNumEndpoints != 3)
122 return -ENODEV;
123
124 endpoint = &interface->endpoint[2].desc;
125 if(!(endpoint->bEndpointAddress & USB_DIR_IN))
126 return -ENODEV;
127 if((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
128 != USB_ENDPOINT_XFER_INT)
129 return -ENODEV;
130
131 pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
132 maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
133
134 if (!(onetouch = kcalloc(1, sizeof(struct usb_onetouch), GFP_KERNEL)))
135 return -ENOMEM;
136
137 onetouch->data = usb_buffer_alloc(udev, ONETOUCH_PKT_LEN,
138 SLAB_ATOMIC, &onetouch->data_dma);
139 if (!onetouch->data){
140 kfree(onetouch);
141 return -ENOMEM;
142 }
143
144 onetouch->irq = usb_alloc_urb(0, GFP_KERNEL);
145 if (!onetouch->irq){
146 kfree(onetouch);
147 usb_buffer_free(udev, ONETOUCH_PKT_LEN,
148 onetouch->data, onetouch->data_dma);
149 return -ENODEV;
150 }
151
152
153 onetouch->udev = udev;
154
155 set_bit(EV_KEY, onetouch->dev.evbit);
156 set_bit(ONETOUCH_BUTTON, onetouch->dev.keybit);
157 clear_bit(0, onetouch->dev.keybit);
158
159 onetouch->dev.private = onetouch;
160 onetouch->dev.open = usb_onetouch_open;
161 onetouch->dev.close = usb_onetouch_close;
162
163 usb_make_path(udev, path, sizeof(path));
164 sprintf(onetouch->phys, "%s/input0", path);
165
166 onetouch->dev.name = onetouch->name;
167 onetouch->dev.phys = onetouch->phys;
168
169 usb_to_input_id(udev, &onetouch->dev.id);
170
171 onetouch->dev.dev = &udev->dev;
172
173 if (udev->manufacturer)
174 strcat(onetouch->name, udev->manufacturer);
175 if (udev->product)
176 sprintf(onetouch->name, "%s %s", onetouch->name,
177 udev->product);
178 if (!strlen(onetouch->name))
179 sprintf(onetouch->name, "Maxtor Onetouch %04x:%04x",
180 onetouch->dev.id.vendor, onetouch->dev.id.product);
181
182 usb_fill_int_urb(onetouch->irq, udev, pipe, onetouch->data,
183 (maxp > 8 ? 8 : maxp),
184 usb_onetouch_irq, onetouch, endpoint->bInterval);
185 onetouch->irq->transfer_dma = onetouch->data_dma;
186 onetouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
187
188 ss->extra_destructor = onetouch_release_input;
189 ss->extra = onetouch;
190
191 input_register_device(&onetouch->dev);
192 printk(KERN_INFO "usb-input: %s on %s\n", onetouch->dev.name, path);
193
194 return 0;
195}
196
197void onetouch_release_input(void *onetouch_)
198{
199 struct usb_onetouch *onetouch = (struct usb_onetouch *) onetouch_;
200
201 if (onetouch) {
202 usb_kill_urb(onetouch->irq);
203 input_unregister_device(&onetouch->dev);
204 usb_free_urb(onetouch->irq);
205 usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN,
206 onetouch->data, onetouch->data_dma);
207 printk(KERN_INFO "usb-input: deregistering %s\n",
208 onetouch->dev.name);
209 }
210}
diff --git a/drivers/usb/storage/onetouch.h b/drivers/usb/storage/onetouch.h
new file mode 100644
index 000000000000..41c7aa8f0446
--- /dev/null
+++ b/drivers/usb/storage/onetouch.h
@@ -0,0 +1,9 @@
1#ifndef _ONETOUCH_H_
2#define _ONETOUCH_H_
3
4#define ONETOUCH_PKT_LEN 0x02
5#define ONETOUCH_BUTTON KEY_PROG1
6
7int onetouch_connect_input(struct us_data *ss);
8
9#endif
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index af294bb68c35..d34dc9f417f0 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -156,6 +156,14 @@ static int slave_configure(struct scsi_device *sdev)
156 if (us->flags & US_FL_FIX_CAPACITY) 156 if (us->flags & US_FL_FIX_CAPACITY)
157 sdev->fix_capacity = 1; 157 sdev->fix_capacity = 1;
158 158
159 /* Some devices report a SCSI revision level above 2 but are
160 * unable to handle the REPORT LUNS command (for which
161 * support is mandatory at level 3). Since we already have
162 * a Get-Max-LUN request, we won't lose much by setting the
163 * revision level down to 2. The only devices that would be
164 * affected are those with sparse LUNs. */
165 sdev->scsi_level = SCSI_2;
166
159 /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable 167 /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable
160 * Hardware Error) when any low-level error occurs, 168 * Hardware Error) when any low-level error occurs,
161 * recoverable or not. Setting this flag tells the SCSI 169 * recoverable or not. Setting this flag tells the SCSI
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index f3b60288696c..356342c6e7a2 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -839,34 +839,31 @@ static int usbat_identify_device(struct us_data *us,
839 rc = usbat_device_reset(us); 839 rc = usbat_device_reset(us);
840 if (rc != USB_STOR_TRANSPORT_GOOD) 840 if (rc != USB_STOR_TRANSPORT_GOOD)
841 return rc; 841 return rc;
842 msleep(25);
842 843
843 /* 844 /*
844 * By examining the device signature after a reset, we can identify 845 * In attempt to distinguish between HP CDRW's and Flash readers, we now
845 * whether the device supports the ATAPI packet interface. 846 * execute the IDENTIFY PACKET DEVICE command. On ATA devices (i.e. flash
846 * The flash-devices do not support this, whereas the HP CDRW's obviously 847 * readers), this command should fail with error. On ATAPI devices (i.e.
847 * do. 848 * CDROM drives), it should succeed.
848 *
849 * This method is not ideal, but works because no other devices have been
850 * produced based on the USBAT/USBAT02.
851 *
852 * Section 9.1 of the ATAPI-4 spec states (amongst other things) that
853 * after a device reset, a Cylinder low of 0x14 indicates that the device
854 * does support packet commands.
855 */ 849 */
856 rc = usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, &status); 850 rc = usbat_write(us, USBAT_ATA, USBAT_ATA_CMD, 0xA1);
857 if (rc != USB_STOR_XFER_GOOD) 851 if (rc != USB_STOR_XFER_GOOD)
858 return USB_STOR_TRANSPORT_ERROR; 852 return USB_STOR_TRANSPORT_ERROR;
859 853
860 US_DEBUGP("usbat_identify_device: Cylinder low is %02X\n", status); 854 rc = usbat_get_status(us, &status);
855 if (rc != USB_STOR_XFER_GOOD)
856 return USB_STOR_TRANSPORT_ERROR;
861 857
862 if (status == 0x14) { 858 // Check for error bit
859 if (status & 0x01) {
860 // Device is a CompactFlash reader/writer
861 US_DEBUGP("usbat_identify_device: Detected Flash reader/writer\n");
862 info->devicetype = USBAT_DEV_FLASH;
863 } else {
863 // Device is HP 8200 864 // Device is HP 8200
864 US_DEBUGP("usbat_identify_device: Detected HP8200 CDRW\n"); 865 US_DEBUGP("usbat_identify_device: Detected HP8200 CDRW\n");
865 info->devicetype = USBAT_DEV_HP8200; 866 info->devicetype = USBAT_DEV_HP8200;
866 } else {
867 // Device is a CompactFlash reader/writer
868 US_DEBUGP("usbat_identify_device: Detected Flash reader/writer\n");
869 info->devicetype = USBAT_DEV_FLASH;
870 } 867 }
871 868
872 return USB_STOR_TRANSPORT_GOOD; 869 return USB_STOR_TRANSPORT_GOOD;
@@ -1239,16 +1236,10 @@ static int usbat_select_and_test_registers(struct us_data *us)
1239{ 1236{
1240 int selector; 1237 int selector;
1241 unsigned char *status = us->iobuf; 1238 unsigned char *status = us->iobuf;
1242 unsigned char max_selector = 0xB0;
1243 if (usbat_get_device_type(us) == USBAT_DEV_FLASH)
1244 max_selector = 0xA0;
1245 1239
1246 // try device = master, then device = slave. 1240 // try device = master, then device = slave.
1247 1241 for (selector = 0xA0; selector <= 0xB0; selector += 0x10) {
1248 for (selector = 0xA0; selector <= max_selector; selector += 0x10) { 1242 if (usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) !=
1249
1250 if (usbat_get_device_type(us) == USBAT_DEV_HP8200 &&
1251 usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) !=
1252 USB_STOR_XFER_GOOD) 1243 USB_STOR_XFER_GOOD)
1253 return USB_STOR_TRANSPORT_ERROR; 1244 return USB_STOR_TRANSPORT_ERROR;
1254 1245
@@ -1334,60 +1325,30 @@ int init_usbat(struct us_data *us)
1334 1325
1335 US_DEBUGP("INIT 3\n"); 1326 US_DEBUGP("INIT 3\n");
1336 1327
1337 // At this point, we need to detect which device we are using
1338 if (usbat_set_transport(us, info))
1339 return USB_STOR_TRANSPORT_ERROR;
1340
1341 US_DEBUGP("INIT 4\n");
1342
1343 if (usbat_get_device_type(us) == USBAT_DEV_HP8200) {
1344 msleep(250);
1345
1346 // Write 0x80 to ISA port 0x3F
1347 rc = usbat_write(us, USBAT_ISA, 0x3F, 0x80);
1348 if (rc != USB_STOR_XFER_GOOD)
1349 return USB_STOR_TRANSPORT_ERROR;
1350
1351 US_DEBUGP("INIT 5\n");
1352
1353 // Read ISA port 0x27
1354 rc = usbat_read(us, USBAT_ISA, 0x27, status);
1355 if (rc != USB_STOR_XFER_GOOD)
1356 return USB_STOR_TRANSPORT_ERROR;
1357
1358 US_DEBUGP("INIT 6\n");
1359
1360 rc = usbat_read_user_io(us, status);
1361 if (rc != USB_STOR_XFER_GOOD)
1362 return USB_STOR_TRANSPORT_ERROR;
1363
1364 US_DEBUGP("INIT 7\n");
1365 }
1366
1367 rc = usbat_select_and_test_registers(us); 1328 rc = usbat_select_and_test_registers(us);
1368 if (rc != USB_STOR_TRANSPORT_GOOD) 1329 if (rc != USB_STOR_TRANSPORT_GOOD)
1369 return rc; 1330 return rc;
1370 1331
1371 US_DEBUGP("INIT 8\n"); 1332 US_DEBUGP("INIT 4\n");
1372 1333
1373 rc = usbat_read_user_io(us, status); 1334 rc = usbat_read_user_io(us, status);
1374 if (rc != USB_STOR_XFER_GOOD) 1335 if (rc != USB_STOR_XFER_GOOD)
1375 return USB_STOR_TRANSPORT_ERROR; 1336 return USB_STOR_TRANSPORT_ERROR;
1376 1337
1377 US_DEBUGP("INIT 9\n"); 1338 US_DEBUGP("INIT 5\n");
1378 1339
1379 // Enable peripheral control signals and card detect 1340 // Enable peripheral control signals and card detect
1380 rc = usbat_device_enable_cdt(us); 1341 rc = usbat_device_enable_cdt(us);
1381 if (rc != USB_STOR_TRANSPORT_GOOD) 1342 if (rc != USB_STOR_TRANSPORT_GOOD)
1382 return rc; 1343 return rc;
1383 1344
1384 US_DEBUGP("INIT 10\n"); 1345 US_DEBUGP("INIT 6\n");
1385 1346
1386 rc = usbat_read_user_io(us, status); 1347 rc = usbat_read_user_io(us, status);
1387 if (rc != USB_STOR_XFER_GOOD) 1348 if (rc != USB_STOR_XFER_GOOD)
1388 return USB_STOR_TRANSPORT_ERROR; 1349 return USB_STOR_TRANSPORT_ERROR;
1389 1350
1390 US_DEBUGP("INIT 11\n"); 1351 US_DEBUGP("INIT 7\n");
1391 1352
1392 msleep(1400); 1353 msleep(1400);
1393 1354
@@ -1395,13 +1356,19 @@ int init_usbat(struct us_data *us)
1395 if (rc != USB_STOR_XFER_GOOD) 1356 if (rc != USB_STOR_XFER_GOOD)
1396 return USB_STOR_TRANSPORT_ERROR; 1357 return USB_STOR_TRANSPORT_ERROR;
1397 1358
1398 US_DEBUGP("INIT 12\n"); 1359 US_DEBUGP("INIT 8\n");
1399 1360
1400 rc = usbat_select_and_test_registers(us); 1361 rc = usbat_select_and_test_registers(us);
1401 if (rc != USB_STOR_TRANSPORT_GOOD) 1362 if (rc != USB_STOR_TRANSPORT_GOOD)
1402 return rc; 1363 return rc;
1403 1364
1404 US_DEBUGP("INIT 13\n"); 1365 US_DEBUGP("INIT 9\n");
1366
1367 // At this point, we need to detect which device we are using
1368 if (usbat_set_transport(us, info))
1369 return USB_STOR_TRANSPORT_ERROR;
1370
1371 US_DEBUGP("INIT 10\n");
1405 1372
1406 if (usbat_get_device_type(us) == USBAT_DEV_FLASH) { 1373 if (usbat_get_device_type(us) == USBAT_DEV_FLASH) {
1407 subcountH = 0x02; 1374 subcountH = 0x02;
@@ -1412,7 +1379,7 @@ int init_usbat(struct us_data *us)
1412 if (rc != USB_STOR_XFER_GOOD) 1379 if (rc != USB_STOR_XFER_GOOD)
1413 return USB_STOR_TRANSPORT_ERROR; 1380 return USB_STOR_TRANSPORT_ERROR;
1414 1381
1415 US_DEBUGP("INIT 14\n"); 1382 US_DEBUGP("INIT 11\n");
1416 1383
1417 return USB_STOR_TRANSPORT_GOOD; 1384 return USB_STOR_TRANSPORT_GOOD;
1418} 1385}
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index e6b1c6cf07f2..c1ba5301ebfc 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -96,8 +96,8 @@
96 * or before the URB_ACTIVE bit was set. If so, it's essential to cancel 96 * or before the URB_ACTIVE bit was set. If so, it's essential to cancel
97 * the URB if it hasn't been cancelled already (i.e., if the URB_ACTIVE bit 97 * the URB if it hasn't been cancelled already (i.e., if the URB_ACTIVE bit
98 * is still set). Either way, the function must then wait for the URB to 98 * is still set). Either way, the function must then wait for the URB to
99 * finish. Note that because the URB_ASYNC_UNLINK flag is set, the URB can 99 * finish. Note that the URB can still be in progress even after a call to
100 * still be in progress even after a call to usb_unlink_urb() returns. 100 * usb_unlink_urb() returns.
101 * 101 *
102 * The idea is that (1) once the ABORTING or DISCONNECTING bit is set, 102 * The idea is that (1) once the ABORTING or DISCONNECTING bit is set,
103 * either the stop_transport() function or the submitting function 103 * either the stop_transport() function or the submitting function
@@ -158,8 +158,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout)
158 * hasn't been mapped for DMA. Yes, this is clunky, but it's 158 * hasn't been mapped for DMA. Yes, this is clunky, but it's
159 * easier than always having the caller tell us whether the 159 * easier than always having the caller tell us whether the
160 * transfer buffer has already been mapped. */ 160 * transfer buffer has already been mapped. */
161 us->current_urb->transfer_flags = 161 us->current_urb->transfer_flags = URB_NO_SETUP_DMA_MAP;
162 URB_ASYNC_UNLINK | URB_NO_SETUP_DMA_MAP;
163 if (us->current_urb->transfer_buffer == us->iobuf) 162 if (us->current_urb->transfer_buffer == us->iobuf)
164 us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 163 us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
165 us->current_urb->transfer_dma = us->iobuf_dma; 164 us->current_urb->transfer_dma = us->iobuf_dma;
@@ -611,7 +610,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
611 unsigned char old_sc_data_direction; 610 unsigned char old_sc_data_direction;
612 unsigned char old_cmd_len; 611 unsigned char old_cmd_len;
613 unsigned char old_cmnd[MAX_COMMAND_SIZE]; 612 unsigned char old_cmnd[MAX_COMMAND_SIZE];
614 unsigned long old_serial_number;
615 int old_resid; 613 int old_resid;
616 614
617 US_DEBUGP("Issuing auto-REQUEST_SENSE\n"); 615 US_DEBUGP("Issuing auto-REQUEST_SENSE\n");
@@ -648,10 +646,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
648 old_sg = srb->use_sg; 646 old_sg = srb->use_sg;
649 srb->use_sg = 0; 647 srb->use_sg = 0;
650 648
651 /* change the serial number -- toggle the high bit*/
652 old_serial_number = srb->serial_number;
653 srb->serial_number ^= 0x80000000;
654
655 /* issue the auto-sense command */ 649 /* issue the auto-sense command */
656 old_resid = srb->resid; 650 old_resid = srb->resid;
657 srb->resid = 0; 651 srb->resid = 0;
@@ -662,7 +656,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
662 srb->request_buffer = old_request_buffer; 656 srb->request_buffer = old_request_buffer;
663 srb->request_bufflen = old_request_bufflen; 657 srb->request_bufflen = old_request_bufflen;
664 srb->use_sg = old_sg; 658 srb->use_sg = old_sg;
665 srb->serial_number = old_serial_number;
666 srb->sc_data_direction = old_sc_data_direction; 659 srb->sc_data_direction = old_sc_data_direction;
667 srb->cmd_len = old_cmd_len; 660 srb->cmd_len = old_cmd_len;
668 memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE); 661 memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE);
@@ -985,7 +978,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
985 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); 978 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
986 bcb->DataTransferLength = cpu_to_le32(transfer_length); 979 bcb->DataTransferLength = cpu_to_le32(transfer_length);
987 bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; 980 bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0;
988 bcb->Tag = srb->serial_number; 981 bcb->Tag = ++us->tag;
989 bcb->Lun = srb->device->lun; 982 bcb->Lun = srb->device->lun;
990 if (us->flags & US_FL_SCM_MULT_TARG) 983 if (us->flags & US_FL_SCM_MULT_TARG)
991 bcb->Lun |= srb->device->id << 4; 984 bcb->Lun |= srb->device->id << 4;
@@ -1074,7 +1067,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us)
1074 US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", 1067 US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
1075 le32_to_cpu(bcs->Signature), bcs->Tag, 1068 le32_to_cpu(bcs->Signature), bcs->Tag,
1076 residue, bcs->Status); 1069 residue, bcs->Status);
1077 if (bcs->Tag != srb->serial_number || bcs->Status > US_BULK_STAT_PHASE) { 1070 if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) {
1078 US_DEBUGP("Bulk logical error\n"); 1071 US_DEBUGP("Bulk logical error\n");
1079 return USB_STOR_TRANSPORT_ERROR; 1072 return USB_STOR_TRANSPORT_ERROR;
1080 } 1073 }
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index bd0ab3039bdd..ad0cfd7a782f 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -79,6 +79,13 @@ UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001,
79 US_SC_8070, US_PR_SCM_ATAPI, init_usbat, 0), 79 US_SC_8070, US_PR_SCM_ATAPI, init_usbat, 0),
80#endif 80#endif
81 81
82/* Patch submitted by Mihnea-Costin Grigore <mihnea@zulu.ro> */
83UNUSUAL_DEV( 0x040d, 0x6205, 0x0003, 0x0003,
84 "VIA Technologies Inc.",
85 "USB 2.0 Card Reader",
86 US_SC_DEVICE, US_PR_DEVICE, NULL,
87 US_FL_IGNORE_RESIDUE ),
88
82/* Deduced by Jonathan Woithe <jwoithe@physics.adelaide.edu.au> 89/* Deduced by Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
83 * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message 90 * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message
84 * always fails and confuses drive. 91 * always fails and confuses drive.
@@ -929,6 +936,18 @@ UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff,
929 US_FL_SINGLE_LUN ), 936 US_FL_SINGLE_LUN ),
930#endif 937#endif
931 938
939/* Submitted by: Nick Sillik <n.sillik@temple.edu>
940 * Needed for OneTouch extension to usb-storage
941 *
942 */
943#ifdef CONFIG_USB_STORAGE_ONETOUCH
944 UNUSUAL_DEV( 0x0d49, 0x7010, 0x0000, 0x9999,
945 "Maxtor",
946 "OneTouch External Harddrive",
947 US_SC_DEVICE, US_PR_DEVICE, onetouch_connect_input,
948 0),
949#endif
950
932/* Submitted by Joris Struyve <joris@struyve.be> */ 951/* Submitted by Joris Struyve <joris@struyve.be> */
933UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, 952UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff,
934 "Medion", 953 "Medion",
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index 77e7fc258aa2..cb4c770baf32 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -90,7 +90,9 @@
90#ifdef CONFIG_USB_STORAGE_JUMPSHOT 90#ifdef CONFIG_USB_STORAGE_JUMPSHOT
91#include "jumpshot.h" 91#include "jumpshot.h"
92#endif 92#endif
93 93#ifdef CONFIG_USB_STORAGE_ONETOUCH
94#include "onetouch.h"
95#endif
94 96
95/* Some informational data */ 97/* Some informational data */
96MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>"); 98MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>");
@@ -786,6 +788,7 @@ static void usb_stor_release_resources(struct us_data *us)
786 * any more commands. 788 * any more commands.
787 */ 789 */
788 US_DEBUGP("-- sending exit command to thread\n"); 790 US_DEBUGP("-- sending exit command to thread\n");
791 set_bit(US_FLIDX_DISCONNECTING, &us->flags);
789 up(&us->sema); 792 up(&us->sema);
790 793
791 /* Call the destructor routine, if it exists */ 794 /* Call the destructor routine, if it exists */
@@ -816,6 +819,49 @@ static void dissociate_dev(struct us_data *us)
816 usb_set_intfdata(us->pusb_intf, NULL); 819 usb_set_intfdata(us->pusb_intf, NULL);
817} 820}
818 821
822/* First stage of disconnect processing: stop all commands and remove
823 * the host */
824static void quiesce_and_remove_host(struct us_data *us)
825{
826 /* Prevent new USB transfers, stop the current command, and
827 * interrupt a SCSI-scan or device-reset delay */
828 set_bit(US_FLIDX_DISCONNECTING, &us->flags);
829 usb_stor_stop_transport(us);
830 wake_up(&us->delay_wait);
831
832 /* It doesn't matter if the SCSI-scanning thread is still running.
833 * The thread will exit when it sees the DISCONNECTING flag. */
834
835 /* Wait for the current command to finish, then remove the host */
836 down(&us->dev_semaphore);
837 up(&us->dev_semaphore);
838
839 /* queuecommand won't accept any new commands and the control
840 * thread won't execute a previously-queued command. If there
841 * is such a command pending, complete it with an error. */
842 if (us->srb) {
843 us->srb->result = DID_NO_CONNECT << 16;
844 scsi_lock(us_to_host(us));
845 us->srb->scsi_done(us->srb);
846 us->srb = NULL;
847 scsi_unlock(us_to_host(us));
848 }
849
850 /* Now we own no commands so it's safe to remove the SCSI host */
851 scsi_remove_host(us_to_host(us));
852}
853
854/* Second stage of disconnect processing: deallocate all resources */
855static void release_everything(struct us_data *us)
856{
857 usb_stor_release_resources(us);
858 dissociate_dev(us);
859
860 /* Drop our reference to the host; the SCSI core will free it
861 * (and "us" along with it) when the refcount becomes 0. */
862 scsi_host_put(us_to_host(us));
863}
864
819/* Thread to carry out delayed SCSI-device scanning */ 865/* Thread to carry out delayed SCSI-device scanning */
820static int usb_stor_scan_thread(void * __us) 866static int usb_stor_scan_thread(void * __us)
821{ 867{
@@ -956,7 +1002,7 @@ static int storage_probe(struct usb_interface *intf,
956 if (result < 0) { 1002 if (result < 0) {
957 printk(KERN_WARNING USB_STORAGE 1003 printk(KERN_WARNING USB_STORAGE
958 "Unable to start the device-scanning thread\n"); 1004 "Unable to start the device-scanning thread\n");
959 scsi_remove_host(host); 1005 quiesce_and_remove_host(us);
960 goto BadDevice; 1006 goto BadDevice;
961 } 1007 }
962 atomic_inc(&total_threads); 1008 atomic_inc(&total_threads);
@@ -969,10 +1015,7 @@ static int storage_probe(struct usb_interface *intf,
969 /* We come here if there are any problems */ 1015 /* We come here if there are any problems */
970BadDevice: 1016BadDevice:
971 US_DEBUGP("storage_probe() failed\n"); 1017 US_DEBUGP("storage_probe() failed\n");
972 set_bit(US_FLIDX_DISCONNECTING, &us->flags); 1018 release_everything(us);
973 usb_stor_release_resources(us);
974 dissociate_dev(us);
975 scsi_host_put(host);
976 return result; 1019 return result;
977} 1020}
978 1021
@@ -982,28 +1025,8 @@ static void storage_disconnect(struct usb_interface *intf)
982 struct us_data *us = usb_get_intfdata(intf); 1025 struct us_data *us = usb_get_intfdata(intf);
983 1026
984 US_DEBUGP("storage_disconnect() called\n"); 1027 US_DEBUGP("storage_disconnect() called\n");
985 1028 quiesce_and_remove_host(us);
986 /* Prevent new USB transfers, stop the current command, and 1029 release_everything(us);
987 * interrupt a SCSI-scan or device-reset delay */
988 set_bit(US_FLIDX_DISCONNECTING, &us->flags);
989 usb_stor_stop_transport(us);
990 wake_up(&us->delay_wait);
991
992 /* It doesn't matter if the SCSI-scanning thread is still running.
993 * The thread will exit when it sees the DISCONNECTING flag. */
994
995 /* Wait for the current command to finish, then remove the host */
996 down(&us->dev_semaphore);
997 up(&us->dev_semaphore);
998 scsi_remove_host(us_to_host(us));
999
1000 /* Wait for everything to become idle and release all our resources */
1001 usb_stor_release_resources(us);
1002 dissociate_dev(us);
1003
1004 /* Drop our reference to the host; the SCSI core will free it
1005 * (and "us" along with it) when the refcount becomes 0. */
1006 scsi_host_put(us_to_host(us));
1007} 1030}
1008 1031
1009/*********************************************************************** 1032/***********************************************************************
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
index 625b7aa98074..a195adae57b6 100644
--- a/drivers/usb/storage/usb.h
+++ b/drivers/usb/storage/usb.h
@@ -158,6 +158,7 @@ struct us_data {
158 158
159 /* SCSI interfaces */ 159 /* SCSI interfaces */
160 struct scsi_cmnd *srb; /* current srb */ 160 struct scsi_cmnd *srb; /* current srb */
161 unsigned int tag; /* current dCBWTag */
161 162
162 /* thread information */ 163 /* thread information */
163 int pid; /* control thread */ 164 int pid; /* control thread */
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
index 52b16850a54e..30f80c23f934 100644
--- a/drivers/video/nvidia/nvidia.c
+++ b/drivers/video/nvidia/nvidia.c
@@ -1473,10 +1473,6 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
1473 par->Chipset = (pd->vendor << 16) | pd->device; 1473 par->Chipset = (pd->vendor << 16) | pd->device;
1474 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset); 1474 printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset);
1475 1475
1476#ifdef CONFIG_PCI_NAMES
1477 printk(KERN_INFO PFX "%s\n", pd->pretty_name);
1478#endif
1479
1480 if (par->Architecture == 0) { 1476 if (par->Architecture == 0) {
1481 printk(KERN_ERR PFX "unknown NV_ARCH\n"); 1477 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1482 goto err_out_free_base0; 1478 goto err_out_free_base0;
diff --git a/drivers/video/offb.c b/drivers/video/offb.c
index 42a6591e863f..611922c0b22f 100644
--- a/drivers/video/offb.c
+++ b/drivers/video/offb.c
@@ -363,7 +363,7 @@ static void __init offb_init_nodriver(struct device_node *dp)
363 address = (u_long) dp->addrs[i].address; 363 address = (u_long) dp->addrs[i].address;
364 364
365#ifdef CONFIG_PPC64 365#ifdef CONFIG_PPC64
366 address += dp->phb->pci_mem_offset; 366 address += ((struct pci_dn *)dp->data)->phb->pci_mem_offset;
367#endif 367#endif
368 368
369 /* kludge for valkyrie */ 369 /* kludge for valkyrie */
diff --git a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c
index ae297e222681..3e9f96e9237d 100644
--- a/drivers/video/riva/fbdev.c
+++ b/drivers/video/riva/fbdev.c
@@ -1936,10 +1936,6 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
1936 default_par->Chipset = (pd->vendor << 16) | pd->device; 1936 default_par->Chipset = (pd->vendor << 16) | pd->device;
1937 printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset); 1937 printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset);
1938 1938
1939#ifdef CONFIG_PCI_NAMES
1940 printk(KERN_INFO PFX "%s\n", pd->pretty_name);
1941#endif
1942
1943 if(default_par->riva.Architecture == 0) { 1939 if(default_par->riva.Architecture == 0) {
1944 printk(KERN_ERR PFX "unknown NV_ARCH\n"); 1940 printk(KERN_ERR PFX "unknown NV_ARCH\n");
1945 ret=-ENODEV; 1941 ret=-ENODEV;
diff --git a/fs/bio.c b/fs/bio.c
index a7d4fd3a3299..83a349574567 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -683,7 +683,7 @@ struct bio *bio_map_user(request_queue_t *q, struct block_device *bdev,
683{ 683{
684 struct sg_iovec iov; 684 struct sg_iovec iov;
685 685
686 iov.iov_base = (__user void *)uaddr; 686 iov.iov_base = (void __user *)uaddr;
687 iov.iov_len = len; 687 iov.iov_len = len;
688 688
689 return bio_map_user_iov(q, bdev, &iov, 1, write_to_vm); 689 return bio_map_user_iov(q, bdev, &iov, 1, write_to_vm);
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog
index 9eecc9939dfe..e4fd6134244d 100644
--- a/fs/ntfs/ChangeLog
+++ b/fs/ntfs/ChangeLog
@@ -22,6 +22,76 @@ ToDo/Notes:
22 - Enable the code for setting the NT4 compatibility flag when we start 22 - Enable the code for setting the NT4 compatibility flag when we start
23 making NTFS 1.2 specific modifications. 23 making NTFS 1.2 specific modifications.
24 24
252.1.24 - Lots of bug fixes and support more clean journal states.
26
27 - Support journals ($LogFile) which have been modified by chkdsk. This
28 means users can boot into Windows after we marked the volume dirty.
29 The Windows boot will run chkdsk and then reboot. The user can then
30 immediately boot into Linux rather than having to do a full Windows
31 boot first before rebooting into Linux and we will recognize such a
32 journal and empty it as it is clean by definition.
33 - Support journals ($LogFile) with only one restart page as well as
34 journals with two different restart pages. We sanity check both and
35 either use the only sane one or the more recent one of the two in the
36 case that both are valid.
37 - Modify fs/ntfs/malloc.h::ntfs_malloc_nofs() to do the kmalloc() based
38 allocations with __GFP_HIGHMEM, analogous to how the vmalloc() based
39 allocations are done.
40 - Add fs/ntfs/malloc.h::ntfs_malloc_nofs_nofail() which is analogous to
41 ntfs_malloc_nofs() but it performs allocations with __GFP_NOFAIL and
42 hence cannot fail.
43 - Use ntfs_malloc_nofs_nofail() in the two critical regions in
44 fs/ntfs/runlist.c::ntfs_runlists_merge(). This means we no longer
45 need to panic() if the allocation fails as it now cannot fail.
46 - Fix two nasty runlist merging bugs that had gone unnoticed so far.
47 Thanks to Stefano Picerno for the bug report.
48 - Remove two bogus BUG_ON()s from fs/ntfs/mft.c.
49 - Fix handling of valid but empty mapping pairs array in
50 fs/ntfs/runlist.c::ntfs_mapping_pairs_decompress().
51 - Report unrepresentable inodes during ntfs_readdir() as KERN_WARNING
52 messages and include the inode number. Thanks to Yura Pakhuchiy for
53 pointing this out.
54 - Change ntfs_rl_truncate_nolock() to throw away the runlist if the new
55 length is zero.
56 - Add runlist.[hc]::ntfs_rl_punch_nolock() which punches a caller
57 specified hole into a runlist.
58 - Fix a bug in fs/ntfs/index.c::ntfs_index_lookup(). When the returned
59 index entry is in the index root, we forgot to set the @ir pointer in
60 the index context. Thanks to Yura Pakhuchiy for finding this bug.
61 - Remove bogus setting of PageError in ntfs_read_compressed_block().
62 - Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize().
63 - Fix a bug in ntfs_map_runlist_nolock() where we forgot to protect
64 access to the allocated size in the ntfs inode with the size lock.
65 - Fix ntfs_attr_vcn_to_lcn_nolock() and ntfs_attr_find_vcn_nolock() to
66 return LCN_ENOENT when there is no runlist and the allocated size is
67 zero.
68 - Fix load_attribute_list() to handle the case of a NULL runlist.
69 - Fix handling of sparse attributes in ntfs_attr_make_non_resident().
70 - Add BUG() checks to ntfs_attr_make_non_resident() and ntfs_attr_set()
71 to ensure that these functions are never called for compressed or
72 encrypted attributes.
73 - Fix cluster (de)allocators to work when the runlist is NULL and more
74 importantly to take a locked runlist rather than them locking it
75 which leads to lock reversal.
76 - Truncate {a,c,m}time to the ntfs supported time granularity when
77 updating the times in the inode in ntfs_setattr().
78 - Fixup handling of sparse, compressed, and encrypted attributes in
79 fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode(),
80 fs/ntfs/aops.c::ntfs_{read,write}page().
81 - Make ntfs_write_block() not instantiate sparse blocks if they contain
82 only zeroes.
83 - Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
84 lock protection over the buffer submission for i/o which allows the
85 removal of the get_bh()/put_bh() pairs for each buffer.
86 - Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
87 where a concurrent truncate has truncated the runlist under our feet.
88 - Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
89 - In fs/ntfs/aops.c::ntfs_end_buffer_async_read(), use a bit spin lock
90 in the first buffer head instead of a driver global spin lock to
91 improve scalability.
92 - Minor fix to error handling and error message display in
93 fs/ntfs/aops.c::ntfs_prepare_nonresident_write().
94
252.1.23 - Implement extension of resident files and make writing safe as well as 952.1.23 - Implement extension of resident files and make writing safe as well as
26 many bug fixes, cleanups, and enhancements... 96 many bug fixes, cleanups, and enhancements...
27 97
diff --git a/fs/ntfs/Makefile b/fs/ntfs/Makefile
index f083f27d8b69..894b2b876d35 100644
--- a/fs/ntfs/Makefile
+++ b/fs/ntfs/Makefile
@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \
6 index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ 6 index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \
7 unistr.o upcase.o 7 unistr.o upcase.o
8 8
9EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.23\" 9EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.24\"
10 10
11ifeq ($(CONFIG_NTFS_DEBUG),y) 11ifeq ($(CONFIG_NTFS_DEBUG),y)
12EXTRA_CFLAGS += -DDEBUG 12EXTRA_CFLAGS += -DDEBUG
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
index 78adad7a988d..545236414d59 100644
--- a/fs/ntfs/aops.c
+++ b/fs/ntfs/aops.c
@@ -55,9 +55,8 @@
55 */ 55 */
56static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) 56static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
57{ 57{
58 static DEFINE_SPINLOCK(page_uptodate_lock);
59 unsigned long flags; 58 unsigned long flags;
60 struct buffer_head *tmp; 59 struct buffer_head *first, *tmp;
61 struct page *page; 60 struct page *page;
62 ntfs_inode *ni; 61 ntfs_inode *ni;
63 int page_uptodate = 1; 62 int page_uptodate = 1;
@@ -89,11 +88,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
89 } 88 }
90 } else { 89 } else {
91 clear_buffer_uptodate(bh); 90 clear_buffer_uptodate(bh);
91 SetPageError(page);
92 ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.", 92 ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.",
93 (unsigned long long)bh->b_blocknr); 93 (unsigned long long)bh->b_blocknr);
94 SetPageError(page);
95 } 94 }
96 spin_lock_irqsave(&page_uptodate_lock, flags); 95 first = page_buffers(page);
96 local_irq_save(flags);
97 bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
97 clear_buffer_async_read(bh); 98 clear_buffer_async_read(bh);
98 unlock_buffer(bh); 99 unlock_buffer(bh);
99 tmp = bh; 100 tmp = bh;
@@ -108,7 +109,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
108 } 109 }
109 tmp = tmp->b_this_page; 110 tmp = tmp->b_this_page;
110 } while (tmp != bh); 111 } while (tmp != bh);
111 spin_unlock_irqrestore(&page_uptodate_lock, flags); 112 bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
113 local_irq_restore(flags);
112 /* 114 /*
113 * If none of the buffers had errors then we can set the page uptodate, 115 * If none of the buffers had errors then we can set the page uptodate,
114 * but we first have to perform the post read mst fixups, if the 116 * but we first have to perform the post read mst fixups, if the
@@ -141,7 +143,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
141 unlock_page(page); 143 unlock_page(page);
142 return; 144 return;
143still_busy: 145still_busy:
144 spin_unlock_irqrestore(&page_uptodate_lock, flags); 146 bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
147 local_irq_restore(flags);
145 return; 148 return;
146} 149}
147 150
@@ -185,13 +188,15 @@ static int ntfs_read_block(struct page *page)
185 blocksize_bits = VFS_I(ni)->i_blkbits; 188 blocksize_bits = VFS_I(ni)->i_blkbits;
186 blocksize = 1 << blocksize_bits; 189 blocksize = 1 << blocksize_bits;
187 190
188 if (!page_has_buffers(page)) 191 if (!page_has_buffers(page)) {
189 create_empty_buffers(page, blocksize, 0); 192 create_empty_buffers(page, blocksize, 0);
190 bh = head = page_buffers(page); 193 if (unlikely(!page_has_buffers(page))) {
191 if (unlikely(!bh)) { 194 unlock_page(page);
192 unlock_page(page); 195 return -ENOMEM;
193 return -ENOMEM; 196 }
194 } 197 }
198 bh = head = page_buffers(page);
199 BUG_ON(!bh);
195 200
196 iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits); 201 iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits);
197 read_lock_irqsave(&ni->size_lock, flags); 202 read_lock_irqsave(&ni->size_lock, flags);
@@ -204,6 +209,7 @@ static int ntfs_read_block(struct page *page)
204 nr = i = 0; 209 nr = i = 0;
205 do { 210 do {
206 u8 *kaddr; 211 u8 *kaddr;
212 int err;
207 213
208 if (unlikely(buffer_uptodate(bh))) 214 if (unlikely(buffer_uptodate(bh)))
209 continue; 215 continue;
@@ -211,6 +217,7 @@ static int ntfs_read_block(struct page *page)
211 arr[nr++] = bh; 217 arr[nr++] = bh;
212 continue; 218 continue;
213 } 219 }
220 err = 0;
214 bh->b_bdev = vol->sb->s_bdev; 221 bh->b_bdev = vol->sb->s_bdev;
215 /* Is the block within the allowed limits? */ 222 /* Is the block within the allowed limits? */
216 if (iblock < lblock) { 223 if (iblock < lblock) {
@@ -252,7 +259,6 @@ lock_retry_remap:
252 goto handle_hole; 259 goto handle_hole;
253 /* If first try and runlist unmapped, map and retry. */ 260 /* If first try and runlist unmapped, map and retry. */
254 if (!is_retry && lcn == LCN_RL_NOT_MAPPED) { 261 if (!is_retry && lcn == LCN_RL_NOT_MAPPED) {
255 int err;
256 is_retry = TRUE; 262 is_retry = TRUE;
257 /* 263 /*
258 * Attempt to map runlist, dropping lock for 264 * Attempt to map runlist, dropping lock for
@@ -263,20 +269,30 @@ lock_retry_remap:
263 if (likely(!err)) 269 if (likely(!err))
264 goto lock_retry_remap; 270 goto lock_retry_remap;
265 rl = NULL; 271 rl = NULL;
266 lcn = err;
267 } else if (!rl) 272 } else if (!rl)
268 up_read(&ni->runlist.lock); 273 up_read(&ni->runlist.lock);
274 /*
275 * If buffer is outside the runlist, treat it as a
276 * hole. This can happen due to concurrent truncate
277 * for example.
278 */
279 if (err == -ENOENT || lcn == LCN_ENOENT) {
280 err = 0;
281 goto handle_hole;
282 }
269 /* Hard error, zero out region. */ 283 /* Hard error, zero out region. */
284 if (!err)
285 err = -EIO;
270 bh->b_blocknr = -1; 286 bh->b_blocknr = -1;
271 SetPageError(page); 287 SetPageError(page);
272 ntfs_error(vol->sb, "Failed to read from inode 0x%lx, " 288 ntfs_error(vol->sb, "Failed to read from inode 0x%lx, "
273 "attribute type 0x%x, vcn 0x%llx, " 289 "attribute type 0x%x, vcn 0x%llx, "
274 "offset 0x%x because its location on " 290 "offset 0x%x because its location on "
275 "disk could not be determined%s " 291 "disk could not be determined%s "
276 "(error code %lli).", ni->mft_no, 292 "(error code %i).", ni->mft_no,
277 ni->type, (unsigned long long)vcn, 293 ni->type, (unsigned long long)vcn,
278 vcn_ofs, is_retry ? " even after " 294 vcn_ofs, is_retry ? " even after "
279 "retrying" : "", (long long)lcn); 295 "retrying" : "", err);
280 } 296 }
281 /* 297 /*
282 * Either iblock was outside lblock limits or 298 * Either iblock was outside lblock limits or
@@ -289,9 +305,10 @@ handle_hole:
289handle_zblock: 305handle_zblock:
290 kaddr = kmap_atomic(page, KM_USER0); 306 kaddr = kmap_atomic(page, KM_USER0);
291 memset(kaddr + i * blocksize, 0, blocksize); 307 memset(kaddr + i * blocksize, 0, blocksize);
292 flush_dcache_page(page);
293 kunmap_atomic(kaddr, KM_USER0); 308 kunmap_atomic(kaddr, KM_USER0);
294 set_buffer_uptodate(bh); 309 flush_dcache_page(page);
310 if (likely(!err))
311 set_buffer_uptodate(bh);
295 } while (i++, iblock++, (bh = bh->b_this_page) != head); 312 } while (i++, iblock++, (bh = bh->b_this_page) != head);
296 313
297 /* Release the lock if we took it. */ 314 /* Release the lock if we took it. */
@@ -367,31 +384,38 @@ retry_readpage:
367 return 0; 384 return 0;
368 } 385 }
369 ni = NTFS_I(page->mapping->host); 386 ni = NTFS_I(page->mapping->host);
370 387 /*
388 * Only $DATA attributes can be encrypted and only unnamed $DATA
389 * attributes can be compressed. Index root can have the flags set but
390 * this means to create compressed/encrypted files, not that the
391 * attribute is compressed/encrypted.
392 */
393 if (ni->type != AT_INDEX_ROOT) {
394 /* If attribute is encrypted, deny access, just like NT4. */
395 if (NInoEncrypted(ni)) {
396 BUG_ON(ni->type != AT_DATA);
397 err = -EACCES;
398 goto err_out;
399 }
400 /* Compressed data streams are handled in compress.c. */
401 if (NInoNonResident(ni) && NInoCompressed(ni)) {
402 BUG_ON(ni->type != AT_DATA);
403 BUG_ON(ni->name_len);
404 return ntfs_read_compressed_block(page);
405 }
406 }
371 /* NInoNonResident() == NInoIndexAllocPresent() */ 407 /* NInoNonResident() == NInoIndexAllocPresent() */
372 if (NInoNonResident(ni)) { 408 if (NInoNonResident(ni)) {
373 /* 409 /* Normal, non-resident data stream. */
374 * Only unnamed $DATA attributes can be compressed or
375 * encrypted.
376 */
377 if (ni->type == AT_DATA && !ni->name_len) {
378 /* If file is encrypted, deny access, just like NT4. */
379 if (NInoEncrypted(ni)) {
380 err = -EACCES;
381 goto err_out;
382 }
383 /* Compressed data streams are handled in compress.c. */
384 if (NInoCompressed(ni))
385 return ntfs_read_compressed_block(page);
386 }
387 /* Normal data stream. */
388 return ntfs_read_block(page); 410 return ntfs_read_block(page);
389 } 411 }
390 /* 412 /*
391 * Attribute is resident, implying it is not compressed or encrypted. 413 * Attribute is resident, implying it is not compressed or encrypted.
392 * This also means the attribute is smaller than an mft record and 414 * This also means the attribute is smaller than an mft record and
393 * hence smaller than a page, so can simply zero out any pages with 415 * hence smaller than a page, so can simply zero out any pages with
394 * index above 0. 416 * index above 0. Note the attribute can actually be marked compressed
417 * but if it is resident the actual data is not compressed so we are
418 * ok to ignore the compressed flag here.
395 */ 419 */
396 if (unlikely(page->index > 0)) { 420 if (unlikely(page->index > 0)) {
397 kaddr = kmap_atomic(page, KM_USER0); 421 kaddr = kmap_atomic(page, KM_USER0);
@@ -511,19 +535,21 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc)
511 BUG_ON(!PageUptodate(page)); 535 BUG_ON(!PageUptodate(page));
512 create_empty_buffers(page, blocksize, 536 create_empty_buffers(page, blocksize,
513 (1 << BH_Uptodate) | (1 << BH_Dirty)); 537 (1 << BH_Uptodate) | (1 << BH_Dirty));
538 if (unlikely(!page_has_buffers(page))) {
539 ntfs_warning(vol->sb, "Error allocating page "
540 "buffers. Redirtying page so we try "
541 "again later.");
542 /*
543 * Put the page back on mapping->dirty_pages, but leave
544 * its buffers' dirty state as-is.
545 */
546 redirty_page_for_writepage(wbc, page);
547 unlock_page(page);
548 return 0;
549 }
514 } 550 }
515 bh = head = page_buffers(page); 551 bh = head = page_buffers(page);
516 if (unlikely(!bh)) { 552 BUG_ON(!bh);
517 ntfs_warning(vol->sb, "Error allocating page buffers. "
518 "Redirtying page so we try again later.");
519 /*
520 * Put the page back on mapping->dirty_pages, but leave its
521 * buffer's dirty state as-is.
522 */
523 redirty_page_for_writepage(wbc, page);
524 unlock_page(page);
525 return 0;
526 }
527 553
528 /* NOTE: Different naming scheme to ntfs_read_block()! */ 554 /* NOTE: Different naming scheme to ntfs_read_block()! */
529 555
@@ -670,6 +696,27 @@ lock_retry_remap:
670 } 696 }
671 /* It is a hole, need to instantiate it. */ 697 /* It is a hole, need to instantiate it. */
672 if (lcn == LCN_HOLE) { 698 if (lcn == LCN_HOLE) {
699 u8 *kaddr;
700 unsigned long *bpos, *bend;
701
702 /* Check if the buffer is zero. */
703 kaddr = kmap_atomic(page, KM_USER0);
704 bpos = (unsigned long *)(kaddr + bh_offset(bh));
705 bend = (unsigned long *)((u8*)bpos + blocksize);
706 do {
707 if (unlikely(*bpos))
708 break;
709 } while (likely(++bpos < bend));
710 kunmap_atomic(kaddr, KM_USER0);
711 if (bpos == bend) {
712 /*
713 * Buffer is zero and sparse, no need to write
714 * it.
715 */
716 bh->b_blocknr = -1;
717 clear_buffer_dirty(bh);
718 continue;
719 }
673 // TODO: Instantiate the hole. 720 // TODO: Instantiate the hole.
674 // clear_buffer_new(bh); 721 // clear_buffer_new(bh);
675 // unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); 722 // unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr);
@@ -690,20 +737,37 @@ lock_retry_remap:
690 if (likely(!err)) 737 if (likely(!err))
691 goto lock_retry_remap; 738 goto lock_retry_remap;
692 rl = NULL; 739 rl = NULL;
693 lcn = err;
694 } else if (!rl) 740 } else if (!rl)
695 up_read(&ni->runlist.lock); 741 up_read(&ni->runlist.lock);
742 /*
743 * If buffer is outside the runlist, truncate has cut it out
744 * of the runlist. Just clean and clear the buffer and set it
745 * uptodate so it can get discarded by the VM.
746 */
747 if (err == -ENOENT || lcn == LCN_ENOENT) {
748 u8 *kaddr;
749
750 bh->b_blocknr = -1;
751 clear_buffer_dirty(bh);
752 kaddr = kmap_atomic(page, KM_USER0);
753 memset(kaddr + bh_offset(bh), 0, blocksize);
754 kunmap_atomic(kaddr, KM_USER0);
755 flush_dcache_page(page);
756 set_buffer_uptodate(bh);
757 err = 0;
758 continue;
759 }
696 /* Failed to map the buffer, even after retrying. */ 760 /* Failed to map the buffer, even after retrying. */
761 if (!err)
762 err = -EIO;
697 bh->b_blocknr = -1; 763 bh->b_blocknr = -1;
698 ntfs_error(vol->sb, "Failed to write to inode 0x%lx, " 764 ntfs_error(vol->sb, "Failed to write to inode 0x%lx, "
699 "attribute type 0x%x, vcn 0x%llx, offset 0x%x " 765 "attribute type 0x%x, vcn 0x%llx, offset 0x%x "
700 "because its location on disk could not be " 766 "because its location on disk could not be "
701 "determined%s (error code %lli).", ni->mft_no, 767 "determined%s (error code %i).", ni->mft_no,
702 ni->type, (unsigned long long)vcn, 768 ni->type, (unsigned long long)vcn,
703 vcn_ofs, is_retry ? " even after " 769 vcn_ofs, is_retry ? " even after "
704 "retrying" : "", (long long)lcn); 770 "retrying" : "", err);
705 if (!err)
706 err = -EIO;
707 break; 771 break;
708 } while (block++, (bh = bh->b_this_page) != head); 772 } while (block++, (bh = bh->b_this_page) != head);
709 773
@@ -714,7 +778,7 @@ lock_retry_remap:
714 /* For the error case, need to reset bh to the beginning. */ 778 /* For the error case, need to reset bh to the beginning. */
715 bh = head; 779 bh = head;
716 780
717 /* Just an optimization, so ->readpage() isn't called later. */ 781 /* Just an optimization, so ->readpage() is not called later. */
718 if (unlikely(!PageUptodate(page))) { 782 if (unlikely(!PageUptodate(page))) {
719 int uptodate = 1; 783 int uptodate = 1;
720 do { 784 do {
@@ -730,7 +794,6 @@ lock_retry_remap:
730 794
731 /* Setup all mapped, dirty buffers for async write i/o. */ 795 /* Setup all mapped, dirty buffers for async write i/o. */
732 do { 796 do {
733 get_bh(bh);
734 if (buffer_mapped(bh) && buffer_dirty(bh)) { 797 if (buffer_mapped(bh) && buffer_dirty(bh)) {
735 lock_buffer(bh); 798 lock_buffer(bh);
736 if (test_clear_buffer_dirty(bh)) { 799 if (test_clear_buffer_dirty(bh)) {
@@ -768,14 +831,8 @@ lock_retry_remap:
768 831
769 BUG_ON(PageWriteback(page)); 832 BUG_ON(PageWriteback(page));
770 set_page_writeback(page); /* Keeps try_to_free_buffers() away. */ 833 set_page_writeback(page); /* Keeps try_to_free_buffers() away. */
771 unlock_page(page);
772 834
773 /* 835 /* Submit the prepared buffers for i/o. */
774 * Submit the prepared buffers for i/o. Note the page is unlocked,
775 * and the async write i/o completion handler can end_page_writeback()
776 * at any time after the *first* submit_bh(). So the buffers can then
777 * disappear...
778 */
779 need_end_writeback = TRUE; 836 need_end_writeback = TRUE;
780 do { 837 do {
781 struct buffer_head *next = bh->b_this_page; 838 struct buffer_head *next = bh->b_this_page;
@@ -783,9 +840,9 @@ lock_retry_remap:
783 submit_bh(WRITE, bh); 840 submit_bh(WRITE, bh);
784 need_end_writeback = FALSE; 841 need_end_writeback = FALSE;
785 } 842 }
786 put_bh(bh);
787 bh = next; 843 bh = next;
788 } while (bh != head); 844 } while (bh != head);
845 unlock_page(page);
789 846
790 /* If no i/o was started, need to end_page_writeback(). */ 847 /* If no i/o was started, need to end_page_writeback(). */
791 if (unlikely(need_end_writeback)) 848 if (unlikely(need_end_writeback))
@@ -860,7 +917,6 @@ static int ntfs_write_mst_block(struct page *page,
860 sync = (wbc->sync_mode == WB_SYNC_ALL); 917 sync = (wbc->sync_mode == WB_SYNC_ALL);
861 918
862 /* Make sure we have mapped buffers. */ 919 /* Make sure we have mapped buffers. */
863 BUG_ON(!page_has_buffers(page));
864 bh = head = page_buffers(page); 920 bh = head = page_buffers(page);
865 BUG_ON(!bh); 921 BUG_ON(!bh);
866 922
@@ -1280,38 +1336,42 @@ retry_writepage:
1280 ntfs_debug("Write outside i_size - truncated?"); 1336 ntfs_debug("Write outside i_size - truncated?");
1281 return 0; 1337 return 0;
1282 } 1338 }
1339 /*
1340 * Only $DATA attributes can be encrypted and only unnamed $DATA
1341 * attributes can be compressed. Index root can have the flags set but
1342 * this means to create compressed/encrypted files, not that the
1343 * attribute is compressed/encrypted.
1344 */
1345 if (ni->type != AT_INDEX_ROOT) {
1346 /* If file is encrypted, deny access, just like NT4. */
1347 if (NInoEncrypted(ni)) {
1348 unlock_page(page);
1349 BUG_ON(ni->type != AT_DATA);
1350 ntfs_debug("Denying write access to encrypted "
1351 "file.");
1352 return -EACCES;
1353 }
1354 /* Compressed data streams are handled in compress.c. */
1355 if (NInoNonResident(ni) && NInoCompressed(ni)) {
1356 BUG_ON(ni->type != AT_DATA);
1357 BUG_ON(ni->name_len);
1358 // TODO: Implement and replace this with
1359 // return ntfs_write_compressed_block(page);
1360 unlock_page(page);
1361 ntfs_error(vi->i_sb, "Writing to compressed files is "
1362 "not supported yet. Sorry.");
1363 return -EOPNOTSUPP;
1364 }
1365 // TODO: Implement and remove this check.
1366 if (NInoNonResident(ni) && NInoSparse(ni)) {
1367 unlock_page(page);
1368 ntfs_error(vi->i_sb, "Writing to sparse files is not "
1369 "supported yet. Sorry.");
1370 return -EOPNOTSUPP;
1371 }
1372 }
1283 /* NInoNonResident() == NInoIndexAllocPresent() */ 1373 /* NInoNonResident() == NInoIndexAllocPresent() */
1284 if (NInoNonResident(ni)) { 1374 if (NInoNonResident(ni)) {
1285 /*
1286 * Only unnamed $DATA attributes can be compressed, encrypted,
1287 * and/or sparse.
1288 */
1289 if (ni->type == AT_DATA && !ni->name_len) {
1290 /* If file is encrypted, deny access, just like NT4. */
1291 if (NInoEncrypted(ni)) {
1292 unlock_page(page);
1293 ntfs_debug("Denying write access to encrypted "
1294 "file.");
1295 return -EACCES;
1296 }
1297 /* Compressed data streams are handled in compress.c. */
1298 if (NInoCompressed(ni)) {
1299 // TODO: Implement and replace this check with
1300 // return ntfs_write_compressed_block(page);
1301 unlock_page(page);
1302 ntfs_error(vi->i_sb, "Writing to compressed "
1303 "files is not supported yet. "
1304 "Sorry.");
1305 return -EOPNOTSUPP;
1306 }
1307 // TODO: Implement and remove this check.
1308 if (NInoSparse(ni)) {
1309 unlock_page(page);
1310 ntfs_error(vi->i_sb, "Writing to sparse files "
1311 "is not supported yet. Sorry.");
1312 return -EOPNOTSUPP;
1313 }
1314 }
1315 /* We have to zero every time due to mmap-at-end-of-file. */ 1375 /* We have to zero every time due to mmap-at-end-of-file. */
1316 if (page->index >= (i_size >> PAGE_CACHE_SHIFT)) { 1376 if (page->index >= (i_size >> PAGE_CACHE_SHIFT)) {
1317 /* The page straddles i_size. */ 1377 /* The page straddles i_size. */
@@ -1324,14 +1384,16 @@ retry_writepage:
1324 /* Handle mst protected attributes. */ 1384 /* Handle mst protected attributes. */
1325 if (NInoMstProtected(ni)) 1385 if (NInoMstProtected(ni))
1326 return ntfs_write_mst_block(page, wbc); 1386 return ntfs_write_mst_block(page, wbc);
1327 /* Normal data stream. */ 1387 /* Normal, non-resident data stream. */
1328 return ntfs_write_block(page, wbc); 1388 return ntfs_write_block(page, wbc);
1329 } 1389 }
1330 /* 1390 /*
1331 * Attribute is resident, implying it is not compressed, encrypted, 1391 * Attribute is resident, implying it is not compressed, encrypted, or
1332 * sparse, or mst protected. This also means the attribute is smaller 1392 * mst protected. This also means the attribute is smaller than an mft
1333 * than an mft record and hence smaller than a page, so can simply 1393 * record and hence smaller than a page, so can simply return error on
1334 * return error on any pages with index above 0. 1394 * any pages with index above 0. Note the attribute can actually be
1395 * marked compressed but if it is resident the actual data is not
1396 * compressed so we are ok to ignore the compressed flag here.
1335 */ 1397 */
1336 BUG_ON(page_has_buffers(page)); 1398 BUG_ON(page_has_buffers(page));
1337 BUG_ON(!PageUptodate(page)); 1399 BUG_ON(!PageUptodate(page));
@@ -1380,30 +1442,14 @@ retry_writepage:
1380 BUG_ON(PageWriteback(page)); 1442 BUG_ON(PageWriteback(page));
1381 set_page_writeback(page); 1443 set_page_writeback(page);
1382 unlock_page(page); 1444 unlock_page(page);
1383
1384 /* 1445 /*
1385 * Here, we don't need to zero the out of bounds area everytime because 1446 * Here, we do not need to zero the out of bounds area everytime
1386 * the below memcpy() already takes care of the mmap-at-end-of-file 1447 * because the below memcpy() already takes care of the
1387 * requirements. If the file is converted to a non-resident one, then 1448 * mmap-at-end-of-file requirements. If the file is converted to a
1388 * the code path use is switched to the non-resident one where the 1449 * non-resident one, then the code path use is switched to the
1389 * zeroing happens on each ntfs_writepage() invocation. 1450 * non-resident one where the zeroing happens on each ntfs_writepage()
1390 * 1451 * invocation.
1391 * The above also applies nicely when i_size is decreased.
1392 *
1393 * When i_size is increased, the memory between the old and new i_size
1394 * _must_ be zeroed (or overwritten with new data). Otherwise we will
1395 * expose data to userspace/disk which should never have been exposed.
1396 *
1397 * FIXME: Ensure that i_size increases do the zeroing/overwriting and
1398 * if we cannot guarantee that, then enable the zeroing below. If the
1399 * zeroing below is enabled, we MUST move the unlock_page() from above
1400 * to after the kunmap_atomic(), i.e. just before the
1401 * end_page_writeback().
1402 * UPDATE: ntfs_prepare/commit_write() do the zeroing on i_size
1403 * increases for resident attributes so those are ok.
1404 * TODO: ntfs_truncate(), others?
1405 */ 1452 */
1406
1407 attr_len = le32_to_cpu(ctx->attr->data.resident.value_length); 1453 attr_len = le32_to_cpu(ctx->attr->data.resident.value_length);
1408 i_size = i_size_read(vi); 1454 i_size = i_size_read(vi);
1409 if (unlikely(attr_len > i_size)) { 1455 if (unlikely(attr_len > i_size)) {
@@ -1681,27 +1727,25 @@ lock_retry_remap:
1681 if (likely(!err)) 1727 if (likely(!err))
1682 goto lock_retry_remap; 1728 goto lock_retry_remap;
1683 rl = NULL; 1729 rl = NULL;
1684 lcn = err;
1685 } else if (!rl) 1730 } else if (!rl)
1686 up_read(&ni->runlist.lock); 1731 up_read(&ni->runlist.lock);
1687 /* 1732 /*
1688 * Failed to map the buffer, even after 1733 * Failed to map the buffer, even after
1689 * retrying. 1734 * retrying.
1690 */ 1735 */
1736 if (!err)
1737 err = -EIO;
1691 bh->b_blocknr = -1; 1738 bh->b_blocknr = -1;
1692 ntfs_error(vol->sb, "Failed to write to inode " 1739 ntfs_error(vol->sb, "Failed to write to inode "
1693 "0x%lx, attribute type 0x%x, " 1740 "0x%lx, attribute type 0x%x, "
1694 "vcn 0x%llx, offset 0x%x " 1741 "vcn 0x%llx, offset 0x%x "
1695 "because its location on disk " 1742 "because its location on disk "
1696 "could not be determined%s " 1743 "could not be determined%s "
1697 "(error code %lli).", 1744 "(error code %i).",
1698 ni->mft_no, ni->type, 1745 ni->mft_no, ni->type,
1699 (unsigned long long)vcn, 1746 (unsigned long long)vcn,
1700 vcn_ofs, is_retry ? " even " 1747 vcn_ofs, is_retry ? " even "
1701 "after retrying" : "", 1748 "after retrying" : "", err);
1702 (long long)lcn);
1703 if (!err)
1704 err = -EIO;
1705 goto err_out; 1749 goto err_out;
1706 } 1750 }
1707 /* We now have a successful remap, i.e. lcn >= 0. */ 1751 /* We now have a successful remap, i.e. lcn >= 0. */
@@ -2357,6 +2401,7 @@ void mark_ntfs_record_dirty(struct page *page, const unsigned int ofs) {
2357 buffers_to_free = bh; 2401 buffers_to_free = bh;
2358 } 2402 }
2359 bh = head = page_buffers(page); 2403 bh = head = page_buffers(page);
2404 BUG_ON(!bh);
2360 do { 2405 do {
2361 bh_ofs = bh_offset(bh); 2406 bh_ofs = bh_offset(bh);
2362 if (bh_ofs + bh_size <= ofs) 2407 if (bh_ofs + bh_size <= ofs)
diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c
index cd0f9e740b14..3f9a4ff42ee5 100644
--- a/fs/ntfs/attrib.c
+++ b/fs/ntfs/attrib.c
@@ -43,6 +43,9 @@
43 * which is not an error as such. This is -ENOENT. It means that @vcn is out 43 * which is not an error as such. This is -ENOENT. It means that @vcn is out
44 * of bounds of the runlist. 44 * of bounds of the runlist.
45 * 45 *
46 * Note the runlist can be NULL after this function returns if @vcn is zero and
47 * the attribute has zero allocated size, i.e. there simply is no runlist.
48 *
46 * Locking: - The runlist must be locked for writing. 49 * Locking: - The runlist must be locked for writing.
47 * - This function modifies the runlist. 50 * - This function modifies the runlist.
48 */ 51 */
@@ -54,6 +57,7 @@ int ntfs_map_runlist_nolock(ntfs_inode *ni, VCN vcn)
54 ATTR_RECORD *a; 57 ATTR_RECORD *a;
55 ntfs_attr_search_ctx *ctx; 58 ntfs_attr_search_ctx *ctx;
56 runlist_element *rl; 59 runlist_element *rl;
60 unsigned long flags;
57 int err = 0; 61 int err = 0;
58 62
59 ntfs_debug("Mapping runlist part containing vcn 0x%llx.", 63 ntfs_debug("Mapping runlist part containing vcn 0x%llx.",
@@ -85,8 +89,11 @@ int ntfs_map_runlist_nolock(ntfs_inode *ni, VCN vcn)
85 * ntfs_mapping_pairs_decompress() fails. 89 * ntfs_mapping_pairs_decompress() fails.
86 */ 90 */
87 end_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn) + 1; 91 end_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn) + 1;
88 if (unlikely(!a->data.non_resident.lowest_vcn && end_vcn <= 1)) 92 if (unlikely(!a->data.non_resident.lowest_vcn && end_vcn <= 1)) {
93 read_lock_irqsave(&ni->size_lock, flags);
89 end_vcn = ni->allocated_size >> ni->vol->cluster_size_bits; 94 end_vcn = ni->allocated_size >> ni->vol->cluster_size_bits;
95 read_unlock_irqrestore(&ni->size_lock, flags);
96 }
90 if (unlikely(vcn >= end_vcn)) { 97 if (unlikely(vcn >= end_vcn)) {
91 err = -ENOENT; 98 err = -ENOENT;
92 goto err_out; 99 goto err_out;
@@ -165,6 +172,7 @@ LCN ntfs_attr_vcn_to_lcn_nolock(ntfs_inode *ni, const VCN vcn,
165 const BOOL write_locked) 172 const BOOL write_locked)
166{ 173{
167 LCN lcn; 174 LCN lcn;
175 unsigned long flags;
168 BOOL is_retry = FALSE; 176 BOOL is_retry = FALSE;
169 177
170 ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, %s_locked.", 178 ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, %s_locked.",
@@ -173,6 +181,14 @@ LCN ntfs_attr_vcn_to_lcn_nolock(ntfs_inode *ni, const VCN vcn,
173 BUG_ON(!ni); 181 BUG_ON(!ni);
174 BUG_ON(!NInoNonResident(ni)); 182 BUG_ON(!NInoNonResident(ni));
175 BUG_ON(vcn < 0); 183 BUG_ON(vcn < 0);
184 if (!ni->runlist.rl) {
185 read_lock_irqsave(&ni->size_lock, flags);
186 if (!ni->allocated_size) {
187 read_unlock_irqrestore(&ni->size_lock, flags);
188 return LCN_ENOENT;
189 }
190 read_unlock_irqrestore(&ni->size_lock, flags);
191 }
176retry_remap: 192retry_remap:
177 /* Convert vcn to lcn. If that fails map the runlist and retry once. */ 193 /* Convert vcn to lcn. If that fails map the runlist and retry once. */
178 lcn = ntfs_rl_vcn_to_lcn(ni->runlist.rl, vcn); 194 lcn = ntfs_rl_vcn_to_lcn(ni->runlist.rl, vcn);
@@ -255,6 +271,7 @@ retry_remap:
255runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, 271runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn,
256 const BOOL write_locked) 272 const BOOL write_locked)
257{ 273{
274 unsigned long flags;
258 runlist_element *rl; 275 runlist_element *rl;
259 int err = 0; 276 int err = 0;
260 BOOL is_retry = FALSE; 277 BOOL is_retry = FALSE;
@@ -265,6 +282,14 @@ runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn,
265 BUG_ON(!ni); 282 BUG_ON(!ni);
266 BUG_ON(!NInoNonResident(ni)); 283 BUG_ON(!NInoNonResident(ni));
267 BUG_ON(vcn < 0); 284 BUG_ON(vcn < 0);
285 if (!ni->runlist.rl) {
286 read_lock_irqsave(&ni->size_lock, flags);
287 if (!ni->allocated_size) {
288 read_unlock_irqrestore(&ni->size_lock, flags);
289 return ERR_PTR(-ENOENT);
290 }
291 read_unlock_irqrestore(&ni->size_lock, flags);
292 }
268retry_remap: 293retry_remap:
269 rl = ni->runlist.rl; 294 rl = ni->runlist.rl;
270 if (likely(rl && vcn >= rl[0].vcn)) { 295 if (likely(rl && vcn >= rl[0].vcn)) {
@@ -528,6 +553,11 @@ int load_attribute_list(ntfs_volume *vol, runlist *runlist, u8 *al_start,
528 block_size_bits = sb->s_blocksize_bits; 553 block_size_bits = sb->s_blocksize_bits;
529 down_read(&runlist->lock); 554 down_read(&runlist->lock);
530 rl = runlist->rl; 555 rl = runlist->rl;
556 if (!rl) {
557 ntfs_error(sb, "Cannot read attribute list since runlist is "
558 "missing.");
559 goto err_out;
560 }
531 /* Read all clusters specified by the runlist one run at a time. */ 561 /* Read all clusters specified by the runlist one run at a time. */
532 while (rl->length) { 562 while (rl->length) {
533 lcn = ntfs_rl_vcn_to_lcn(rl, rl->vcn); 563 lcn = ntfs_rl_vcn_to_lcn(rl, rl->vcn);
@@ -1247,6 +1277,46 @@ int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size)
1247} 1277}
1248 1278
1249/** 1279/**
1280 * ntfs_resident_attr_value_resize - resize the value of a resident attribute
1281 * @m: mft record containing attribute record
1282 * @a: attribute record whose value to resize
1283 * @new_size: new size in bytes to which to resize the attribute value of @a
1284 *
1285 * Resize the value of the attribute @a in the mft record @m to @new_size bytes.
1286 * If the value is made bigger, the newly allocated space is cleared.
1287 *
1288 * Return 0 on success and -errno on error. The following error codes are
1289 * defined:
1290 * -ENOSPC - Not enough space in the mft record @m to perform the resize.
1291 *
1292 * Note: On error, no modifications have been performed whatsoever.
1293 *
1294 * Warning: If you make a record smaller without having copied all the data you
1295 * are interested in the data may be overwritten.
1296 */
1297int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a,
1298 const u32 new_size)
1299{
1300 u32 old_size;
1301
1302 /* Resize the resident part of the attribute record. */
1303 if (ntfs_attr_record_resize(m, a,
1304 le16_to_cpu(a->data.resident.value_offset) + new_size))
1305 return -ENOSPC;
1306 /*
1307 * The resize succeeded! If we made the attribute value bigger, clear
1308 * the area between the old size and @new_size.
1309 */
1310 old_size = le32_to_cpu(a->data.resident.value_length);
1311 if (new_size > old_size)
1312 memset((u8*)a + le16_to_cpu(a->data.resident.value_offset) +
1313 old_size, 0, new_size - old_size);
1314 /* Finally update the length of the attribute value. */
1315 a->data.resident.value_length = cpu_to_le32(new_size);
1316 return 0;
1317}
1318
1319/**
1250 * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute 1320 * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute
1251 * @ni: ntfs inode describing the attribute to convert 1321 * @ni: ntfs inode describing the attribute to convert
1252 * 1322 *
@@ -1302,6 +1372,12 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
1302 return err; 1372 return err;
1303 } 1373 }
1304 /* 1374 /*
1375 * FIXME: Compressed and encrypted attributes are not supported when
1376 * writing and we should never have gotten here for them.
1377 */
1378 BUG_ON(NInoCompressed(ni));
1379 BUG_ON(NInoEncrypted(ni));
1380 /*
1305 * The size needs to be aligned to a cluster boundary for allocation 1381 * The size needs to be aligned to a cluster boundary for allocation
1306 * purposes. 1382 * purposes.
1307 */ 1383 */
@@ -1377,10 +1453,15 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
1377 BUG_ON(a->non_resident); 1453 BUG_ON(a->non_resident);
1378 /* 1454 /*
1379 * Calculate new offsets for the name and the mapping pairs array. 1455 * Calculate new offsets for the name and the mapping pairs array.
1380 * We assume the attribute is not compressed or sparse.
1381 */ 1456 */
1382 name_ofs = (offsetof(ATTR_REC, 1457 if (NInoSparse(ni) || NInoCompressed(ni))
1383 data.non_resident.compressed_size) + 7) & ~7; 1458 name_ofs = (offsetof(ATTR_REC,
1459 data.non_resident.compressed_size) +
1460 sizeof(a->data.non_resident.compressed_size) +
1461 7) & ~7;
1462 else
1463 name_ofs = (offsetof(ATTR_REC,
1464 data.non_resident.compressed_size) + 7) & ~7;
1384 mp_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7; 1465 mp_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7;
1385 /* 1466 /*
1386 * Determine the size of the resident part of the now non-resident 1467 * Determine the size of the resident part of the now non-resident
@@ -1419,24 +1500,23 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
1419 memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset), 1500 memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset),
1420 a->name_length * sizeof(ntfschar)); 1501 a->name_length * sizeof(ntfschar));
1421 a->name_offset = cpu_to_le16(name_ofs); 1502 a->name_offset = cpu_to_le16(name_ofs);
1422 /*
1423 * FIXME: For now just clear all of these as we do not support them
1424 * when writing.
1425 */
1426 a->flags &= cpu_to_le16(0xffff & ~le16_to_cpu(ATTR_IS_SPARSE |
1427 ATTR_IS_ENCRYPTED | ATTR_COMPRESSION_MASK));
1428 /* Setup the fields specific to non-resident attributes. */ 1503 /* Setup the fields specific to non-resident attributes. */
1429 a->data.non_resident.lowest_vcn = 0; 1504 a->data.non_resident.lowest_vcn = 0;
1430 a->data.non_resident.highest_vcn = cpu_to_sle64((new_size - 1) >> 1505 a->data.non_resident.highest_vcn = cpu_to_sle64((new_size - 1) >>
1431 vol->cluster_size_bits); 1506 vol->cluster_size_bits);
1432 a->data.non_resident.mapping_pairs_offset = cpu_to_le16(mp_ofs); 1507 a->data.non_resident.mapping_pairs_offset = cpu_to_le16(mp_ofs);
1433 a->data.non_resident.compression_unit = 0;
1434 memset(&a->data.non_resident.reserved, 0, 1508 memset(&a->data.non_resident.reserved, 0,
1435 sizeof(a->data.non_resident.reserved)); 1509 sizeof(a->data.non_resident.reserved));
1436 a->data.non_resident.allocated_size = cpu_to_sle64(new_size); 1510 a->data.non_resident.allocated_size = cpu_to_sle64(new_size);
1437 a->data.non_resident.data_size = 1511 a->data.non_resident.data_size =
1438 a->data.non_resident.initialized_size = 1512 a->data.non_resident.initialized_size =
1439 cpu_to_sle64(attr_size); 1513 cpu_to_sle64(attr_size);
1514 if (NInoSparse(ni) || NInoCompressed(ni)) {
1515 a->data.non_resident.compression_unit = 4;
1516 a->data.non_resident.compressed_size =
1517 a->data.non_resident.allocated_size;
1518 } else
1519 a->data.non_resident.compression_unit = 0;
1440 /* Generate the mapping pairs array into the attribute record. */ 1520 /* Generate the mapping pairs array into the attribute record. */
1441 err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs, 1521 err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs,
1442 arec_size - mp_ofs, rl, 0, -1, NULL); 1522 arec_size - mp_ofs, rl, 0, -1, NULL);
@@ -1446,16 +1526,19 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni)
1446 goto undo_err_out; 1526 goto undo_err_out;
1447 } 1527 }
1448 /* Setup the in-memory attribute structure to be non-resident. */ 1528 /* Setup the in-memory attribute structure to be non-resident. */
1449 /*
1450 * FIXME: For now just clear all of these as we do not support them
1451 * when writing.
1452 */
1453 NInoClearSparse(ni);
1454 NInoClearEncrypted(ni);
1455 NInoClearCompressed(ni);
1456 ni->runlist.rl = rl; 1529 ni->runlist.rl = rl;
1457 write_lock_irqsave(&ni->size_lock, flags); 1530 write_lock_irqsave(&ni->size_lock, flags);
1458 ni->allocated_size = new_size; 1531 ni->allocated_size = new_size;
1532 if (NInoSparse(ni) || NInoCompressed(ni)) {
1533 ni->itype.compressed.size = ni->allocated_size;
1534 ni->itype.compressed.block_size = 1U <<
1535 (a->data.non_resident.compression_unit +
1536 vol->cluster_size_bits);
1537 ni->itype.compressed.block_size_bits =
1538 ffs(ni->itype.compressed.block_size) - 1;
1539 ni->itype.compressed.block_clusters = 1U <<
1540 a->data.non_resident.compression_unit;
1541 }
1459 write_unlock_irqrestore(&ni->size_lock, flags); 1542 write_unlock_irqrestore(&ni->size_lock, flags);
1460 /* 1543 /*
1461 * This needs to be last since the address space operations ->readpage 1544 * This needs to be last since the address space operations ->readpage
@@ -1603,6 +1686,12 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val)
1603 BUG_ON(cnt < 0); 1686 BUG_ON(cnt < 0);
1604 if (!cnt) 1687 if (!cnt)
1605 goto done; 1688 goto done;
1689 /*
1690 * FIXME: Compressed and encrypted attributes are not supported when
1691 * writing and we should never have gotten here for them.
1692 */
1693 BUG_ON(NInoCompressed(ni));
1694 BUG_ON(NInoEncrypted(ni));
1606 mapping = VFS_I(ni)->i_mapping; 1695 mapping = VFS_I(ni)->i_mapping;
1607 /* Work out the starting index and page offset. */ 1696 /* Work out the starting index and page offset. */
1608 idx = ofs >> PAGE_CACHE_SHIFT; 1697 idx = ofs >> PAGE_CACHE_SHIFT;
diff --git a/fs/ntfs/attrib.h b/fs/ntfs/attrib.h
index 0e4ac6d3c0e7..0618ed6fd7b3 100644
--- a/fs/ntfs/attrib.h
+++ b/fs/ntfs/attrib.h
@@ -99,6 +99,8 @@ extern int ntfs_attr_can_be_resident(const ntfs_volume *vol,
99 const ATTR_TYPE type); 99 const ATTR_TYPE type);
100 100
101extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size); 101extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size);
102extern int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a,
103 const u32 new_size);
102 104
103extern int ntfs_attr_make_non_resident(ntfs_inode *ni); 105extern int ntfs_attr_make_non_resident(ntfs_inode *ni);
104 106
diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c
index 6d265cfd49aa..25d24106f893 100644
--- a/fs/ntfs/compress.c
+++ b/fs/ntfs/compress.c
@@ -539,7 +539,6 @@ int ntfs_read_compressed_block(struct page *page)
539 if (unlikely(!pages || !bhs)) { 539 if (unlikely(!pages || !bhs)) {
540 kfree(bhs); 540 kfree(bhs);
541 kfree(pages); 541 kfree(pages);
542 SetPageError(page);
543 unlock_page(page); 542 unlock_page(page);
544 ntfs_error(vol->sb, "Failed to allocate internal buffers."); 543 ntfs_error(vol->sb, "Failed to allocate internal buffers.");
545 return -ENOMEM; 544 return -ENOMEM;
@@ -871,9 +870,6 @@ lock_retry_remap:
871 for (; prev_cur_page < cur_page; prev_cur_page++) { 870 for (; prev_cur_page < cur_page; prev_cur_page++) {
872 page = pages[prev_cur_page]; 871 page = pages[prev_cur_page];
873 if (page) { 872 if (page) {
874 if (prev_cur_page == xpage &&
875 !xpage_done)
876 SetPageError(page);
877 flush_dcache_page(page); 873 flush_dcache_page(page);
878 kunmap(page); 874 kunmap(page);
879 unlock_page(page); 875 unlock_page(page);
@@ -904,8 +900,6 @@ lock_retry_remap:
904 "Terminating them with extreme " 900 "Terminating them with extreme "
905 "prejudice. Inode 0x%lx, page index " 901 "prejudice. Inode 0x%lx, page index "
906 "0x%lx.", ni->mft_no, page->index); 902 "0x%lx.", ni->mft_no, page->index);
907 if (cur_page == xpage && !xpage_done)
908 SetPageError(page);
909 flush_dcache_page(page); 903 flush_dcache_page(page);
910 kunmap(page); 904 kunmap(page);
911 unlock_page(page); 905 unlock_page(page);
@@ -953,8 +947,6 @@ err_out:
953 for (i = cur_page; i < max_page; i++) { 947 for (i = cur_page; i < max_page; i++) {
954 page = pages[i]; 948 page = pages[i];
955 if (page) { 949 if (page) {
956 if (i == xpage && !xpage_done)
957 SetPageError(page);
958 flush_dcache_page(page); 950 flush_dcache_page(page);
959 kunmap(page); 951 kunmap(page);
960 unlock_page(page); 952 unlock_page(page);
diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c
index 46779471c542..795c3d1930f5 100644
--- a/fs/ntfs/dir.c
+++ b/fs/ntfs/dir.c
@@ -1051,7 +1051,8 @@ static inline int ntfs_filldir(ntfs_volume *vol, loff_t fpos,
1051 ie->key.file_name.file_name_length, &name, 1051 ie->key.file_name.file_name_length, &name,
1052 NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1); 1052 NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1);
1053 if (name_len <= 0) { 1053 if (name_len <= 0) {
1054 ntfs_debug("Skipping unrepresentable file."); 1054 ntfs_warning(vol->sb, "Skipping unrepresentable inode 0x%llx.",
1055 (long long)MREF_LE(ie->data.dir.indexed_file));
1055 return 0; 1056 return 0;
1056 } 1057 }
1057 if (ie->key.file_name.file_attributes & 1058 if (ie->key.file_name.file_attributes &
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index e0f530ce6b99..be9fd1dd423d 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. 2 * file.c - NTFS kernel file operations. Part of the Linux-NTFS project.
3 * 3 *
4 * Copyright (c) 2001-2004 Anton Altaparmakov 4 * Copyright (c) 2001-2005 Anton Altaparmakov
5 * 5 *
6 * This program/include file is free software; you can redistribute it and/or 6 * This program/include file is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as published 7 * modify it under the terms of the GNU General Public License as published
@@ -94,6 +94,11 @@ static int ntfs_file_fsync(struct file *filp, struct dentry *dentry,
94 if (!datasync || !NInoNonResident(NTFS_I(vi))) 94 if (!datasync || !NInoNonResident(NTFS_I(vi)))
95 ret = ntfs_write_inode(vi, 1); 95 ret = ntfs_write_inode(vi, 1);
96 write_inode_now(vi, !datasync); 96 write_inode_now(vi, !datasync);
97 /*
98 * NOTE: If we were to use mapping->private_list (see ext2 and
99 * fs/buffer.c) for dirty blocks then we could optimize the below to be
100 * sync_mapping_buffers(vi->i_mapping).
101 */
97 err = sync_blockdev(vi->i_sb->s_bdev); 102 err = sync_blockdev(vi->i_sb->s_bdev);
98 if (unlikely(err && !ret)) 103 if (unlikely(err && !ret))
99 ret = err; 104 ret = err;
diff --git a/fs/ntfs/index.c b/fs/ntfs/index.c
index 11fd5307d780..8f2d5727546f 100644
--- a/fs/ntfs/index.c
+++ b/fs/ntfs/index.c
@@ -205,6 +205,7 @@ int ntfs_index_lookup(const void *key, const int key_len,
205 &ie->key, key_len)) { 205 &ie->key, key_len)) {
206ir_done: 206ir_done:
207 ictx->is_in_root = TRUE; 207 ictx->is_in_root = TRUE;
208 ictx->ir = ir;
208 ictx->actx = actx; 209 ictx->actx = actx;
209 ictx->base_ni = base_ni; 210 ictx->base_ni = base_ni;
210 ictx->ia = NULL; 211 ictx->ia = NULL;
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
index 886214a77f90..dc4bbe3acf5c 100644
--- a/fs/ntfs/inode.c
+++ b/fs/ntfs/inode.c
@@ -1013,41 +1013,50 @@ skip_large_dir_stuff:
1013 } 1013 }
1014 a = ctx->attr; 1014 a = ctx->attr;
1015 /* Setup the state. */ 1015 /* Setup the state. */
1016 if (a->non_resident) { 1016 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1017 NInoSetNonResident(ni); 1017 if (a->flags & ATTR_COMPRESSION_MASK) {
1018 if (a->flags & (ATTR_COMPRESSION_MASK | 1018 NInoSetCompressed(ni);
1019 ATTR_IS_SPARSE)) { 1019 if (vol->cluster_size > 4096) {
1020 if (a->flags & ATTR_COMPRESSION_MASK) { 1020 ntfs_error(vi->i_sb, "Found "
1021 NInoSetCompressed(ni);
1022 if (vol->cluster_size > 4096) {
1023 ntfs_error(vi->i_sb, "Found "
1024 "compressed data but " 1021 "compressed data but "
1025 "compression is " 1022 "compression is "
1026 "disabled due to " 1023 "disabled due to "
1027 "cluster size (%i) > " 1024 "cluster size (%i) > "
1028 "4kiB.", 1025 "4kiB.",
1029 vol->cluster_size); 1026 vol->cluster_size);
1030 goto unm_err_out; 1027 goto unm_err_out;
1031 } 1028 }
1032 if ((a->flags & ATTR_COMPRESSION_MASK) 1029 if ((a->flags & ATTR_COMPRESSION_MASK)
1033 != ATTR_IS_COMPRESSED) { 1030 != ATTR_IS_COMPRESSED) {
1034 ntfs_error(vi->i_sb, "Found " 1031 ntfs_error(vi->i_sb, "Found unknown "
1035 "unknown compression " 1032 "compression method "
1036 "method or corrupt " 1033 "or corrupt file.");
1037 "file."); 1034 goto unm_err_out;
1038 goto unm_err_out;
1039 }
1040 } 1035 }
1041 if (a->flags & ATTR_IS_SPARSE) 1036 }
1042 NInoSetSparse(ni); 1037 if (a->flags & ATTR_IS_SPARSE)
1038 NInoSetSparse(ni);
1039 }
1040 if (a->flags & ATTR_IS_ENCRYPTED) {
1041 if (NInoCompressed(ni)) {
1042 ntfs_error(vi->i_sb, "Found encrypted and "
1043 "compressed data.");
1044 goto unm_err_out;
1045 }
1046 NInoSetEncrypted(ni);
1047 }
1048 if (a->non_resident) {
1049 NInoSetNonResident(ni);
1050 if (NInoCompressed(ni) || NInoSparse(ni)) {
1043 if (a->data.non_resident.compression_unit != 1051 if (a->data.non_resident.compression_unit !=
1044 4) { 1052 4) {
1045 ntfs_error(vi->i_sb, "Found " 1053 ntfs_error(vi->i_sb, "Found "
1046 "nonstandard compression unit " 1054 "nonstandard "
1047 "(%u instead of 4). Cannot " 1055 "compression unit (%u "
1048 "handle this.", 1056 "instead of 4). "
1049 a->data.non_resident. 1057 "Cannot handle this.",
1050 compression_unit); 1058 a->data.non_resident.
1059 compression_unit);
1051 err = -EOPNOTSUPP; 1060 err = -EOPNOTSUPP;
1052 goto unm_err_out; 1061 goto unm_err_out;
1053 } 1062 }
@@ -1065,14 +1074,6 @@ skip_large_dir_stuff:
1065 a->data.non_resident. 1074 a->data.non_resident.
1066 compressed_size); 1075 compressed_size);
1067 } 1076 }
1068 if (a->flags & ATTR_IS_ENCRYPTED) {
1069 if (a->flags & ATTR_COMPRESSION_MASK) {
1070 ntfs_error(vi->i_sb, "Found encrypted "
1071 "and compressed data.");
1072 goto unm_err_out;
1073 }
1074 NInoSetEncrypted(ni);
1075 }
1076 if (a->data.non_resident.lowest_vcn) { 1077 if (a->data.non_resident.lowest_vcn) {
1077 ntfs_error(vi->i_sb, "First extent of $DATA " 1078 ntfs_error(vi->i_sb, "First extent of $DATA "
1078 "attribute has non zero " 1079 "attribute has non zero "
@@ -1212,6 +1213,75 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1212 if (unlikely(err)) 1213 if (unlikely(err))
1213 goto unm_err_out; 1214 goto unm_err_out;
1214 a = ctx->attr; 1215 a = ctx->attr;
1216 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) {
1217 if (a->flags & ATTR_COMPRESSION_MASK) {
1218 NInoSetCompressed(ni);
1219 if ((ni->type != AT_DATA) || (ni->type == AT_DATA &&
1220 ni->name_len)) {
1221 ntfs_error(vi->i_sb, "Found compressed "
1222 "non-data or named data "
1223 "attribute. Please report "
1224 "you saw this message to "
1225 "linux-ntfs-dev@lists."
1226 "sourceforge.net");
1227 goto unm_err_out;
1228 }
1229 if (vol->cluster_size > 4096) {
1230 ntfs_error(vi->i_sb, "Found compressed "
1231 "attribute but compression is "
1232 "disabled due to cluster size "
1233 "(%i) > 4kiB.",
1234 vol->cluster_size);
1235 goto unm_err_out;
1236 }
1237 if ((a->flags & ATTR_COMPRESSION_MASK) !=
1238 ATTR_IS_COMPRESSED) {
1239 ntfs_error(vi->i_sb, "Found unknown "
1240 "compression method.");
1241 goto unm_err_out;
1242 }
1243 }
1244 /*
1245 * The encryption flag set in an index root just means to
1246 * compress all files.
1247 */
1248 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1249 ntfs_error(vi->i_sb, "Found mst protected attribute "
1250 "but the attribute is %s. Please "
1251 "report you saw this message to "
1252 "linux-ntfs-dev@lists.sourceforge.net",
1253 NInoCompressed(ni) ? "compressed" :
1254 "sparse");
1255 goto unm_err_out;
1256 }
1257 if (a->flags & ATTR_IS_SPARSE)
1258 NInoSetSparse(ni);
1259 }
1260 if (a->flags & ATTR_IS_ENCRYPTED) {
1261 if (NInoCompressed(ni)) {
1262 ntfs_error(vi->i_sb, "Found encrypted and compressed "
1263 "data.");
1264 goto unm_err_out;
1265 }
1266 /*
1267 * The encryption flag set in an index root just means to
1268 * encrypt all files.
1269 */
1270 if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) {
1271 ntfs_error(vi->i_sb, "Found mst protected attribute "
1272 "but the attribute is encrypted. "
1273 "Please report you saw this message "
1274 "to linux-ntfs-dev@lists.sourceforge."
1275 "net");
1276 goto unm_err_out;
1277 }
1278 if (ni->type != AT_DATA) {
1279 ntfs_error(vi->i_sb, "Found encrypted non-data "
1280 "attribute.");
1281 goto unm_err_out;
1282 }
1283 NInoSetEncrypted(ni);
1284 }
1215 if (!a->non_resident) { 1285 if (!a->non_resident) {
1216 /* Ensure the attribute name is placed before the value. */ 1286 /* Ensure the attribute name is placed before the value. */
1217 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >= 1287 if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >=
@@ -1220,11 +1290,10 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1220 "the attribute value."); 1290 "the attribute value.");
1221 goto unm_err_out; 1291 goto unm_err_out;
1222 } 1292 }
1223 if (NInoMstProtected(ni) || a->flags) { 1293 if (NInoMstProtected(ni)) {
1224 ntfs_error(vi->i_sb, "Found mst protected attribute " 1294 ntfs_error(vi->i_sb, "Found mst protected attribute "
1225 "or attribute with non-zero flags but " 1295 "but the attribute is resident. "
1226 "the attribute is resident. Please " 1296 "Please report you saw this message to "
1227 "report you saw this message to "
1228 "linux-ntfs-dev@lists.sourceforge.net"); 1297 "linux-ntfs-dev@lists.sourceforge.net");
1229 goto unm_err_out; 1298 goto unm_err_out;
1230 } 1299 }
@@ -1250,50 +1319,8 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1250 "the mapping pairs array."); 1319 "the mapping pairs array.");
1251 goto unm_err_out; 1320 goto unm_err_out;
1252 } 1321 }
1253 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) { 1322 if ((NInoCompressed(ni) || NInoSparse(ni)) &&
1254 if (a->flags & ATTR_COMPRESSION_MASK) { 1323 ni->type != AT_INDEX_ROOT) {
1255 NInoSetCompressed(ni);
1256 if ((ni->type != AT_DATA) || (ni->type ==
1257 AT_DATA && ni->name_len)) {
1258 ntfs_error(vi->i_sb, "Found compressed "
1259 "non-data or named "
1260 "data attribute. "
1261 "Please report you "
1262 "saw this message to "
1263 "linux-ntfs-dev@lists."
1264 "sourceforge.net");
1265 goto unm_err_out;
1266 }
1267 if (vol->cluster_size > 4096) {
1268 ntfs_error(vi->i_sb, "Found compressed "
1269 "attribute but "
1270 "compression is "
1271 "disabled due to "
1272 "cluster size (%i) > "
1273 "4kiB.",
1274 vol->cluster_size);
1275 goto unm_err_out;
1276 }
1277 if ((a->flags & ATTR_COMPRESSION_MASK) !=
1278 ATTR_IS_COMPRESSED) {
1279 ntfs_error(vi->i_sb, "Found unknown "
1280 "compression method.");
1281 goto unm_err_out;
1282 }
1283 }
1284 if (NInoMstProtected(ni)) {
1285 ntfs_error(vi->i_sb, "Found mst protected "
1286 "attribute but the attribute "
1287 "is %s. Please report you "
1288 "saw this message to "
1289 "linux-ntfs-dev@lists."
1290 "sourceforge.net",
1291 NInoCompressed(ni) ?
1292 "compressed" : "sparse");
1293 goto unm_err_out;
1294 }
1295 if (a->flags & ATTR_IS_SPARSE)
1296 NInoSetSparse(ni);
1297 if (a->data.non_resident.compression_unit != 4) { 1324 if (a->data.non_resident.compression_unit != 4) {
1298 ntfs_error(vi->i_sb, "Found nonstandard " 1325 ntfs_error(vi->i_sb, "Found nonstandard "
1299 "compression unit (%u instead " 1326 "compression unit (%u instead "
@@ -1313,23 +1340,6 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1313 ni->itype.compressed.size = sle64_to_cpu( 1340 ni->itype.compressed.size = sle64_to_cpu(
1314 a->data.non_resident.compressed_size); 1341 a->data.non_resident.compressed_size);
1315 } 1342 }
1316 if (a->flags & ATTR_IS_ENCRYPTED) {
1317 if (a->flags & ATTR_COMPRESSION_MASK) {
1318 ntfs_error(vi->i_sb, "Found encrypted and "
1319 "compressed data.");
1320 goto unm_err_out;
1321 }
1322 if (NInoMstProtected(ni)) {
1323 ntfs_error(vi->i_sb, "Found mst protected "
1324 "attribute but the attribute "
1325 "is encrypted. Please report "
1326 "you saw this message to "
1327 "linux-ntfs-dev@lists."
1328 "sourceforge.net");
1329 goto unm_err_out;
1330 }
1331 NInoSetEncrypted(ni);
1332 }
1333 if (a->data.non_resident.lowest_vcn) { 1343 if (a->data.non_resident.lowest_vcn) {
1334 ntfs_error(vi->i_sb, "First extent of attribute has " 1344 ntfs_error(vi->i_sb, "First extent of attribute has "
1335 "non-zero lowest_vcn."); 1345 "non-zero lowest_vcn.");
@@ -1348,12 +1358,12 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi)
1348 vi->i_mapping->a_ops = &ntfs_mst_aops; 1358 vi->i_mapping->a_ops = &ntfs_mst_aops;
1349 else 1359 else
1350 vi->i_mapping->a_ops = &ntfs_aops; 1360 vi->i_mapping->a_ops = &ntfs_aops;
1351 if (NInoCompressed(ni) || NInoSparse(ni)) 1361 if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT)
1352 vi->i_blocks = ni->itype.compressed.size >> 9; 1362 vi->i_blocks = ni->itype.compressed.size >> 9;
1353 else 1363 else
1354 vi->i_blocks = ni->allocated_size >> 9; 1364 vi->i_blocks = ni->allocated_size >> 9;
1355 /* 1365 /*
1356 * Make sure the base inode doesn't go away and attach it to the 1366 * Make sure the base inode does not go away and attach it to the
1357 * attribute inode. 1367 * attribute inode.
1358 */ 1368 */
1359 igrab(base_vi); 1369 igrab(base_vi);
@@ -1480,7 +1490,10 @@ static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi)
1480 "after the attribute value."); 1490 "after the attribute value.");
1481 goto unm_err_out; 1491 goto unm_err_out;
1482 } 1492 }
1483 /* Compressed/encrypted/sparse index root is not allowed. */ 1493 /*
1494 * Compressed/encrypted/sparse index root is not allowed, except for
1495 * directories of course but those are not dealt with here.
1496 */
1484 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED | 1497 if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED |
1485 ATTR_IS_SPARSE)) { 1498 ATTR_IS_SPARSE)) {
1486 ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index " 1499 ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index "
@@ -2430,16 +2443,18 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
2430 * We skipped the truncate but must still update 2443 * We skipped the truncate but must still update
2431 * timestamps. 2444 * timestamps.
2432 */ 2445 */
2433 ia_valid |= ATTR_MTIME|ATTR_CTIME; 2446 ia_valid |= ATTR_MTIME | ATTR_CTIME;
2434 } 2447 }
2435 } 2448 }
2436
2437 if (ia_valid & ATTR_ATIME) 2449 if (ia_valid & ATTR_ATIME)
2438 vi->i_atime = attr->ia_atime; 2450 vi->i_atime = timespec_trunc(attr->ia_atime,
2451 vi->i_sb->s_time_gran);
2439 if (ia_valid & ATTR_MTIME) 2452 if (ia_valid & ATTR_MTIME)
2440 vi->i_mtime = attr->ia_mtime; 2453 vi->i_mtime = timespec_trunc(attr->ia_mtime,
2454 vi->i_sb->s_time_gran);
2441 if (ia_valid & ATTR_CTIME) 2455 if (ia_valid & ATTR_CTIME)
2442 vi->i_ctime = attr->ia_ctime; 2456 vi->i_ctime = timespec_trunc(attr->ia_ctime,
2457 vi->i_sb->s_time_gran);
2443 mark_inode_dirty(vi); 2458 mark_inode_dirty(vi);
2444out: 2459out:
2445 return err; 2460 return err;
diff --git a/fs/ntfs/lcnalloc.c b/fs/ntfs/lcnalloc.c
index a4bc07616e5d..7b5934290685 100644
--- a/fs/ntfs/lcnalloc.c
+++ b/fs/ntfs/lcnalloc.c
@@ -54,6 +54,8 @@ int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol,
54 int ret = 0; 54 int ret = 0;
55 55
56 ntfs_debug("Entering."); 56 ntfs_debug("Entering.");
57 if (!rl)
58 return 0;
57 for (; rl->length; rl++) { 59 for (; rl->length; rl++) {
58 int err; 60 int err;
59 61
@@ -163,17 +165,9 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn,
163 BUG_ON(zone < FIRST_ZONE); 165 BUG_ON(zone < FIRST_ZONE);
164 BUG_ON(zone > LAST_ZONE); 166 BUG_ON(zone > LAST_ZONE);
165 167
166 /* Return empty runlist if @count == 0 */ 168 /* Return NULL if @count is zero. */
167 // FIXME: Do we want to just return NULL instead? (AIA) 169 if (!count)
168 if (!count) { 170 return NULL;
169 rl = ntfs_malloc_nofs(PAGE_SIZE);
170 if (!rl)
171 return ERR_PTR(-ENOMEM);
172 rl[0].vcn = start_vcn;
173 rl[0].lcn = LCN_RL_NOT_MAPPED;
174 rl[0].length = 0;
175 return rl;
176 }
177 /* Take the lcnbmp lock for writing. */ 171 /* Take the lcnbmp lock for writing. */
178 down_write(&vol->lcnbmp_lock); 172 down_write(&vol->lcnbmp_lock);
179 /* 173 /*
@@ -788,7 +782,8 @@ out:
788 * @vi: vfs inode whose runlist describes the clusters to free 782 * @vi: vfs inode whose runlist describes the clusters to free
789 * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters 783 * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters
790 * @count: number of clusters to free or -1 for all clusters 784 * @count: number of clusters to free or -1 for all clusters
791 * @is_rollback: if TRUE this is a rollback operation 785 * @write_locked: true if the runlist is locked for writing
786 * @is_rollback: true if this is a rollback operation
792 * 787 *
793 * Free @count clusters starting at the cluster @start_vcn in the runlist 788 * Free @count clusters starting at the cluster @start_vcn in the runlist
794 * described by the vfs inode @vi. 789 * described by the vfs inode @vi.
@@ -806,17 +801,17 @@ out:
806 * Return the number of deallocated clusters (not counting sparse ones) on 801 * Return the number of deallocated clusters (not counting sparse ones) on
807 * success and -errno on error. 802 * success and -errno on error.
808 * 803 *
809 * Locking: - The runlist described by @vi must be unlocked on entry and is 804 * Locking: - The runlist described by @vi must be locked on entry and is
810 * unlocked on return. 805 * locked on return. Note if the runlist is locked for reading the
811 * - This function takes the runlist lock of @vi for reading and 806 * lock may be dropped and reacquired. Note the runlist may be
812 * sometimes for writing and sometimes modifies the runlist. 807 * modified when needed runlist fragments need to be mapped.
813 * - The volume lcn bitmap must be unlocked on entry and is unlocked 808 * - The volume lcn bitmap must be unlocked on entry and is unlocked
814 * on return. 809 * on return.
815 * - This function takes the volume lcn bitmap lock for writing and 810 * - This function takes the volume lcn bitmap lock for writing and
816 * modifies the bitmap contents. 811 * modifies the bitmap contents.
817 */ 812 */
818s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, 813s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count,
819 const BOOL is_rollback) 814 const BOOL write_locked, const BOOL is_rollback)
820{ 815{
821 s64 delta, to_free, total_freed, real_freed; 816 s64 delta, to_free, total_freed, real_freed;
822 ntfs_inode *ni; 817 ntfs_inode *ni;
@@ -848,8 +843,7 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count,
848 843
849 total_freed = real_freed = 0; 844 total_freed = real_freed = 0;
850 845
851 down_read(&ni->runlist.lock); 846 rl = ntfs_attr_find_vcn_nolock(ni, start_vcn, write_locked);
852 rl = ntfs_attr_find_vcn_nolock(ni, start_vcn, FALSE);
853 if (IS_ERR(rl)) { 847 if (IS_ERR(rl)) {
854 if (!is_rollback) 848 if (!is_rollback)
855 ntfs_error(vol->sb, "Failed to find first runlist " 849 ntfs_error(vol->sb, "Failed to find first runlist "
@@ -903,7 +897,7 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count,
903 897
904 /* Attempt to map runlist. */ 898 /* Attempt to map runlist. */
905 vcn = rl->vcn; 899 vcn = rl->vcn;
906 rl = ntfs_attr_find_vcn_nolock(ni, vcn, FALSE); 900 rl = ntfs_attr_find_vcn_nolock(ni, vcn, write_locked);
907 if (IS_ERR(rl)) { 901 if (IS_ERR(rl)) {
908 err = PTR_ERR(rl); 902 err = PTR_ERR(rl);
909 if (!is_rollback) 903 if (!is_rollback)
@@ -950,7 +944,6 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count,
950 /* Update the total done clusters. */ 944 /* Update the total done clusters. */
951 total_freed += to_free; 945 total_freed += to_free;
952 } 946 }
953 up_read(&ni->runlist.lock);
954 if (likely(!is_rollback)) 947 if (likely(!is_rollback))
955 up_write(&vol->lcnbmp_lock); 948 up_write(&vol->lcnbmp_lock);
956 949
@@ -960,7 +953,6 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count,
960 ntfs_debug("Done."); 953 ntfs_debug("Done.");
961 return real_freed; 954 return real_freed;
962err_out: 955err_out:
963 up_read(&ni->runlist.lock);
964 if (is_rollback) 956 if (is_rollback)
965 return err; 957 return err;
966 /* If no real clusters were freed, no need to rollback. */ 958 /* If no real clusters were freed, no need to rollback. */
@@ -973,7 +965,8 @@ err_out:
973 * If rollback fails, set the volume errors flag, emit an error 965 * If rollback fails, set the volume errors flag, emit an error
974 * message, and return the error code. 966 * message, and return the error code.
975 */ 967 */
976 delta = __ntfs_cluster_free(vi, start_vcn, total_freed, TRUE); 968 delta = __ntfs_cluster_free(vi, start_vcn, total_freed, write_locked,
969 TRUE);
977 if (delta < 0) { 970 if (delta < 0) {
978 ntfs_error(vol->sb, "Failed to rollback (error %i). Leaving " 971 ntfs_error(vol->sb, "Failed to rollback (error %i). Leaving "
979 "inconsistent metadata! Unmount and run " 972 "inconsistent metadata! Unmount and run "
diff --git a/fs/ntfs/lcnalloc.h b/fs/ntfs/lcnalloc.h
index 4cac1c024af6..e4d7fb98d685 100644
--- a/fs/ntfs/lcnalloc.h
+++ b/fs/ntfs/lcnalloc.h
@@ -43,13 +43,14 @@ extern runlist_element *ntfs_cluster_alloc(ntfs_volume *vol,
43 const NTFS_CLUSTER_ALLOCATION_ZONES zone); 43 const NTFS_CLUSTER_ALLOCATION_ZONES zone);
44 44
45extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, 45extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn,
46 s64 count, const BOOL is_rollback); 46 s64 count, const BOOL write_locked, const BOOL is_rollback);
47 47
48/** 48/**
49 * ntfs_cluster_free - free clusters on an ntfs volume 49 * ntfs_cluster_free - free clusters on an ntfs volume
50 * @vi: vfs inode whose runlist describes the clusters to free 50 * @vi: vfs inode whose runlist describes the clusters to free
51 * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters 51 * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters
52 * @count: number of clusters to free or -1 for all clusters 52 * @count: number of clusters to free or -1 for all clusters
53 * @write_locked: true if the runlist is locked for writing
53 * 54 *
54 * Free @count clusters starting at the cluster @start_vcn in the runlist 55 * Free @count clusters starting at the cluster @start_vcn in the runlist
55 * described by the vfs inode @vi. 56 * described by the vfs inode @vi.
@@ -64,19 +65,19 @@ extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn,
64 * Return the number of deallocated clusters (not counting sparse ones) on 65 * Return the number of deallocated clusters (not counting sparse ones) on
65 * success and -errno on error. 66 * success and -errno on error.
66 * 67 *
67 * Locking: - The runlist described by @vi must be unlocked on entry and is 68 * Locking: - The runlist described by @vi must be locked on entry and is
68 * unlocked on return. 69 * locked on return. Note if the runlist is locked for reading the
69 * - This function takes the runlist lock of @vi for reading and 70 * lock may be dropped and reacquired. Note the runlist may be
70 * sometimes for writing and sometimes modifies the runlist. 71 * modified when needed runlist fragments need to be mapped.
71 * - The volume lcn bitmap must be unlocked on entry and is unlocked 72 * - The volume lcn bitmap must be unlocked on entry and is unlocked
72 * on return. 73 * on return.
73 * - This function takes the volume lcn bitmap lock for writing and 74 * - This function takes the volume lcn bitmap lock for writing and
74 * modifies the bitmap contents. 75 * modifies the bitmap contents.
75 */ 76 */
76static inline s64 ntfs_cluster_free(struct inode *vi, const VCN start_vcn, 77static inline s64 ntfs_cluster_free(struct inode *vi, const VCN start_vcn,
77 s64 count) 78 s64 count, const BOOL write_locked)
78{ 79{
79 return __ntfs_cluster_free(vi, start_vcn, count, FALSE); 80 return __ntfs_cluster_free(vi, start_vcn, count, write_locked, FALSE);
80} 81}
81 82
82extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, 83extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol,
@@ -93,8 +94,10 @@ extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol,
93 * 94 *
94 * Return 0 on success and -errno on error. 95 * Return 0 on success and -errno on error.
95 * 96 *
96 * Locking: This function takes the volume lcn bitmap lock for writing and 97 * Locking: - This function takes the volume lcn bitmap lock for writing and
97 * modifies the bitmap contents. 98 * modifies the bitmap contents.
99 * - The caller must have locked the runlist @rl for reading or
100 * writing.
98 */ 101 */
99static inline int ntfs_cluster_free_from_rl(ntfs_volume *vol, 102static inline int ntfs_cluster_free_from_rl(ntfs_volume *vol,
100 const runlist_element *rl) 103 const runlist_element *rl)
diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c
index 8edb8e20fb08..0173e95500d9 100644
--- a/fs/ntfs/logfile.c
+++ b/fs/ntfs/logfile.c
@@ -121,7 +121,7 @@ static BOOL ntfs_check_restart_page_header(struct inode *vi,
121 */ 121 */
122 if (!ntfs_is_chkd_record(rp->magic) && sle64_to_cpu(rp->chkdsk_lsn)) { 122 if (!ntfs_is_chkd_record(rp->magic) && sle64_to_cpu(rp->chkdsk_lsn)) {
123 ntfs_error(vi->i_sb, "$LogFile restart page is not modified " 123 ntfs_error(vi->i_sb, "$LogFile restart page is not modified "
124 "chkdsk but a chkdsk LSN is specified."); 124 "by chkdsk but a chkdsk LSN is specified.");
125 return FALSE; 125 return FALSE;
126 } 126 }
127 ntfs_debug("Done."); 127 ntfs_debug("Done.");
@@ -312,10 +312,12 @@ err_out:
312 * @vi: $LogFile inode to which the restart page belongs 312 * @vi: $LogFile inode to which the restart page belongs
313 * @rp: restart page to check 313 * @rp: restart page to check
314 * @pos: position in @vi at which the restart page resides 314 * @pos: position in @vi at which the restart page resides
315 * @wrp: copy of the multi sector transfer deprotected restart page 315 * @wrp: [OUT] copy of the multi sector transfer deprotected restart page
316 * @lsn: [OUT] set to the current logfile lsn on success
316 * 317 *
317 * Check the restart page @rp for consistency and return TRUE if it is 318 * Check the restart page @rp for consistency and return 0 if it is consistent
318 * consistent and FALSE otherwise. 319 * and -errno otherwise. The restart page may have been modified by chkdsk in
320 * which case its magic is CHKD instead of RSTR.
319 * 321 *
320 * This function only needs NTFS_BLOCK_SIZE bytes in @rp, i.e. it does not 322 * This function only needs NTFS_BLOCK_SIZE bytes in @rp, i.e. it does not
321 * require the full restart page. 323 * require the full restart page.
@@ -323,25 +325,33 @@ err_out:
323 * If @wrp is not NULL, on success, *@wrp will point to a buffer containing a 325 * If @wrp is not NULL, on success, *@wrp will point to a buffer containing a
324 * copy of the complete multi sector transfer deprotected page. On failure, 326 * copy of the complete multi sector transfer deprotected page. On failure,
325 * *@wrp is undefined. 327 * *@wrp is undefined.
328 *
329 * Simillarly, if @lsn is not NULL, on succes *@lsn will be set to the current
330 * logfile lsn according to this restart page. On failure, *@lsn is undefined.
331 *
332 * The following error codes are defined:
333 * -EINVAL - The restart page is inconsistent.
334 * -ENOMEM - Not enough memory to load the restart page.
335 * -EIO - Failed to reading from $LogFile.
326 */ 336 */
327static BOOL ntfs_check_and_load_restart_page(struct inode *vi, 337static int ntfs_check_and_load_restart_page(struct inode *vi,
328 RESTART_PAGE_HEADER *rp, s64 pos, RESTART_PAGE_HEADER **wrp) 338 RESTART_PAGE_HEADER *rp, s64 pos, RESTART_PAGE_HEADER **wrp,
339 LSN *lsn)
329{ 340{
330 RESTART_AREA *ra; 341 RESTART_AREA *ra;
331 RESTART_PAGE_HEADER *trp; 342 RESTART_PAGE_HEADER *trp;
332 int size; 343 int size, err;
333 BOOL ret;
334 344
335 ntfs_debug("Entering."); 345 ntfs_debug("Entering.");
336 /* Check the restart page header for consistency. */ 346 /* Check the restart page header for consistency. */
337 if (!ntfs_check_restart_page_header(vi, rp, pos)) { 347 if (!ntfs_check_restart_page_header(vi, rp, pos)) {
338 /* Error output already done inside the function. */ 348 /* Error output already done inside the function. */
339 return FALSE; 349 return -EINVAL;
340 } 350 }
341 /* Check the restart area for consistency. */ 351 /* Check the restart area for consistency. */
342 if (!ntfs_check_restart_area(vi, rp)) { 352 if (!ntfs_check_restart_area(vi, rp)) {
343 /* Error output already done inside the function. */ 353 /* Error output already done inside the function. */
344 return FALSE; 354 return -EINVAL;
345 } 355 }
346 ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); 356 ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset));
347 /* 357 /*
@@ -352,7 +362,7 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi,
352 if (!trp) { 362 if (!trp) {
353 ntfs_error(vi->i_sb, "Failed to allocate memory for $LogFile " 363 ntfs_error(vi->i_sb, "Failed to allocate memory for $LogFile "
354 "restart page buffer."); 364 "restart page buffer.");
355 return FALSE; 365 return -ENOMEM;
356 } 366 }
357 /* 367 /*
358 * Read the whole of the restart page into the buffer. If it fits 368 * Read the whole of the restart page into the buffer. If it fits
@@ -379,6 +389,9 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi,
379 if (IS_ERR(page)) { 389 if (IS_ERR(page)) {
380 ntfs_error(vi->i_sb, "Error mapping $LogFile " 390 ntfs_error(vi->i_sb, "Error mapping $LogFile "
381 "page (index %lu).", idx); 391 "page (index %lu).", idx);
392 err = PTR_ERR(page);
393 if (err != -EIO && err != -ENOMEM)
394 err = -EIO;
382 goto err_out; 395 goto err_out;
383 } 396 }
384 size = min_t(int, to_read, PAGE_CACHE_SIZE); 397 size = min_t(int, to_read, PAGE_CACHE_SIZE);
@@ -392,29 +405,57 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi,
392 /* Perform the multi sector transfer deprotection on the buffer. */ 405 /* Perform the multi sector transfer deprotection on the buffer. */
393 if (post_read_mst_fixup((NTFS_RECORD*)trp, 406 if (post_read_mst_fixup((NTFS_RECORD*)trp,
394 le32_to_cpu(rp->system_page_size))) { 407 le32_to_cpu(rp->system_page_size))) {
395 ntfs_error(vi->i_sb, "Multi sector transfer error detected in " 408 /*
396 "$LogFile restart page."); 409 * A multi sector tranfer error was detected. We only need to
397 goto err_out; 410 * abort if the restart page contents exceed the multi sector
411 * transfer fixup of the first sector.
412 */
413 if (le16_to_cpu(rp->restart_area_offset) +
414 le16_to_cpu(ra->restart_area_length) >
415 NTFS_BLOCK_SIZE - sizeof(u16)) {
416 ntfs_error(vi->i_sb, "Multi sector transfer error "
417 "detected in $LogFile restart page.");
418 err = -EINVAL;
419 goto err_out;
420 }
421 }
422 /*
423 * If the restart page is modified by chkdsk or there are no active
424 * logfile clients, the logfile is consistent. Otherwise, need to
425 * check the log client records for consistency, too.
426 */
427 err = 0;
428 if (ntfs_is_rstr_record(rp->magic) &&
429 ra->client_in_use_list != LOGFILE_NO_CLIENT) {
430 if (!ntfs_check_log_client_array(vi, trp)) {
431 err = -EINVAL;
432 goto err_out;
433 }
434 }
435 if (lsn) {
436 if (ntfs_is_rstr_record(rp->magic))
437 *lsn = sle64_to_cpu(ra->current_lsn);
438 else /* if (ntfs_is_chkd_record(rp->magic)) */
439 *lsn = sle64_to_cpu(rp->chkdsk_lsn);
398 } 440 }
399 /* Check the log client records for consistency. */
400 ret = ntfs_check_log_client_array(vi, trp);
401 if (ret && wrp)
402 *wrp = trp;
403 else
404 ntfs_free(trp);
405 ntfs_debug("Done."); 441 ntfs_debug("Done.");
406 return ret; 442 if (wrp)
443 *wrp = trp;
444 else {
407err_out: 445err_out:
408 ntfs_free(trp); 446 ntfs_free(trp);
409 return FALSE; 447 }
448 return err;
410} 449}
411 450
412/** 451/**
413 * ntfs_check_logfile - check the journal for consistency 452 * ntfs_check_logfile - check the journal for consistency
414 * @log_vi: struct inode of loaded journal $LogFile to check 453 * @log_vi: struct inode of loaded journal $LogFile to check
454 * @rp: [OUT] on success this is a copy of the current restart page
415 * 455 *
416 * Check the $LogFile journal for consistency and return TRUE if it is 456 * Check the $LogFile journal for consistency and return TRUE if it is
417 * consistent and FALSE if not. 457 * consistent and FALSE if not. On success, the current restart page is
458 * returned in *@rp. Caller must call ntfs_free(*@rp) when finished with it.
418 * 459 *
419 * At present we only check the two restart pages and ignore the log record 460 * At present we only check the two restart pages and ignore the log record
420 * pages. 461 * pages.
@@ -424,19 +465,18 @@ err_out:
424 * if the $LogFile was created on a system with a different page size to ours 465 * if the $LogFile was created on a system with a different page size to ours
425 * yet and mst deprotection would fail if our page size is smaller. 466 * yet and mst deprotection would fail if our page size is smaller.
426 */ 467 */
427BOOL ntfs_check_logfile(struct inode *log_vi) 468BOOL ntfs_check_logfile(struct inode *log_vi, RESTART_PAGE_HEADER **rp)
428{ 469{
429 s64 size, pos, rstr1_pos, rstr2_pos; 470 s64 size, pos;
471 LSN rstr1_lsn, rstr2_lsn;
430 ntfs_volume *vol = NTFS_SB(log_vi->i_sb); 472 ntfs_volume *vol = NTFS_SB(log_vi->i_sb);
431 struct address_space *mapping = log_vi->i_mapping; 473 struct address_space *mapping = log_vi->i_mapping;
432 struct page *page = NULL; 474 struct page *page = NULL;
433 u8 *kaddr = NULL; 475 u8 *kaddr = NULL;
434 RESTART_PAGE_HEADER *rstr1_ph = NULL; 476 RESTART_PAGE_HEADER *rstr1_ph = NULL;
435 RESTART_PAGE_HEADER *rstr2_ph = NULL; 477 RESTART_PAGE_HEADER *rstr2_ph = NULL;
436 int log_page_size, log_page_mask, ofs; 478 int log_page_size, log_page_mask, err;
437 BOOL logfile_is_empty = TRUE; 479 BOOL logfile_is_empty = TRUE;
438 BOOL rstr1_found = FALSE;
439 BOOL rstr2_found = FALSE;
440 u8 log_page_bits; 480 u8 log_page_bits;
441 481
442 ntfs_debug("Entering."); 482 ntfs_debug("Entering.");
@@ -491,7 +531,7 @@ BOOL ntfs_check_logfile(struct inode *log_vi)
491 if (IS_ERR(page)) { 531 if (IS_ERR(page)) {
492 ntfs_error(vol->sb, "Error mapping $LogFile " 532 ntfs_error(vol->sb, "Error mapping $LogFile "
493 "page (index %lu).", idx); 533 "page (index %lu).", idx);
494 return FALSE; 534 goto err_out;
495 } 535 }
496 } 536 }
497 kaddr = (u8*)page_address(page) + (pos & ~PAGE_CACHE_MASK); 537 kaddr = (u8*)page_address(page) + (pos & ~PAGE_CACHE_MASK);
@@ -510,99 +550,95 @@ BOOL ntfs_check_logfile(struct inode *log_vi)
510 */ 550 */
511 if (ntfs_is_rcrd_recordp((le32*)kaddr)) 551 if (ntfs_is_rcrd_recordp((le32*)kaddr))
512 break; 552 break;
513 /* 553 /* If not a (modified by chkdsk) restart page, continue. */
514 * A modified by chkdsk restart page means we cannot handle 554 if (!ntfs_is_rstr_recordp((le32*)kaddr) &&
515 * this log file. 555 !ntfs_is_chkd_recordp((le32*)kaddr)) {
516 */
517 if (ntfs_is_chkd_recordp((le32*)kaddr)) {
518 ntfs_error(vol->sb, "$LogFile has been modified by "
519 "chkdsk. Mount this volume in "
520 "Windows.");
521 goto err_out;
522 }
523 /* If not a restart page, continue. */
524 if (!ntfs_is_rstr_recordp((le32*)kaddr)) {
525 /* Skip to the minimum page size for the next one. */
526 if (!pos) 556 if (!pos)
527 pos = NTFS_BLOCK_SIZE >> 1; 557 pos = NTFS_BLOCK_SIZE >> 1;
528 continue; 558 continue;
529 } 559 }
530 /* We now know we have a restart page. */
531 if (!pos) {
532 rstr1_found = TRUE;
533 rstr1_pos = pos;
534 } else {
535 if (rstr2_found) {
536 ntfs_error(vol->sb, "Found more than two "
537 "restart pages in $LogFile.");
538 goto err_out;
539 }
540 rstr2_found = TRUE;
541 rstr2_pos = pos;
542 }
543 /* 560 /*
544 * Check the restart page for consistency and get a copy of the 561 * Check the (modified by chkdsk) restart page for consistency
545 * complete multi sector transfer deprotected restart page. 562 * and get a copy of the complete multi sector transfer
563 * deprotected restart page.
546 */ 564 */
547 if (!ntfs_check_and_load_restart_page(log_vi, 565 err = ntfs_check_and_load_restart_page(log_vi,
548 (RESTART_PAGE_HEADER*)kaddr, pos, 566 (RESTART_PAGE_HEADER*)kaddr, pos,
549 !pos ? &rstr1_ph : &rstr2_ph)) { 567 !rstr1_ph ? &rstr1_ph : &rstr2_ph,
550 /* Error output already done inside the function. */ 568 !rstr1_ph ? &rstr1_lsn : &rstr2_lsn);
551 goto err_out; 569 if (!err) {
570 /*
571 * If we have now found the first (modified by chkdsk)
572 * restart page, continue looking for the second one.
573 */
574 if (!pos) {
575 pos = NTFS_BLOCK_SIZE >> 1;
576 continue;
577 }
578 /*
579 * We have now found the second (modified by chkdsk)
580 * restart page, so we can stop looking.
581 */
582 break;
552 } 583 }
553 /* 584 /*
554 * We have a valid restart page. The next one must be after 585 * Error output already done inside the function. Note, we do
555 * a whole system page size as specified by the valid restart 586 * not abort if the restart page was invalid as we might still
556 * page. 587 * find a valid one further in the file.
557 */ 588 */
589 if (err != -EINVAL) {
590 ntfs_unmap_page(page);
591 goto err_out;
592 }
593 /* Continue looking. */
558 if (!pos) 594 if (!pos)
559 pos = le32_to_cpu(rstr1_ph->system_page_size) >> 1; 595 pos = NTFS_BLOCK_SIZE >> 1;
560 } 596 }
561 if (page) { 597 if (page)
562 ntfs_unmap_page(page); 598 ntfs_unmap_page(page);
563 page = NULL;
564 }
565 if (logfile_is_empty) { 599 if (logfile_is_empty) {
566 NVolSetLogFileEmpty(vol); 600 NVolSetLogFileEmpty(vol);
567is_empty: 601is_empty:
568 ntfs_debug("Done. ($LogFile is empty.)"); 602 ntfs_debug("Done. ($LogFile is empty.)");
569 return TRUE; 603 return TRUE;
570 } 604 }
571 if (!rstr1_found || !rstr2_found) { 605 if (!rstr1_ph) {
572 ntfs_error(vol->sb, "Did not find two restart pages in " 606 BUG_ON(rstr2_ph);
573 "$LogFile."); 607 ntfs_error(vol->sb, "Did not find any restart pages in "
574 goto err_out; 608 "$LogFile and it was not empty.");
609 return FALSE;
610 }
611 /* If both restart pages were found, use the more recent one. */
612 if (rstr2_ph) {
613 /*
614 * If the second restart area is more recent, switch to it.
615 * Otherwise just throw it away.
616 */
617 if (rstr2_lsn > rstr1_lsn) {
618 ntfs_free(rstr1_ph);
619 rstr1_ph = rstr2_ph;
620 /* rstr1_lsn = rstr2_lsn; */
621 } else
622 ntfs_free(rstr2_ph);
623 rstr2_ph = NULL;
575 } 624 }
576 /*
577 * The two restart areas must be identical except for the update
578 * sequence number.
579 */
580 ofs = le16_to_cpu(rstr1_ph->usa_ofs);
581 if (memcmp(rstr1_ph, rstr2_ph, ofs) || (ofs += sizeof(u16),
582 memcmp((u8*)rstr1_ph + ofs, (u8*)rstr2_ph + ofs,
583 le32_to_cpu(rstr1_ph->system_page_size) - ofs))) {
584 ntfs_error(vol->sb, "The two restart pages in $LogFile do not "
585 "match.");
586 goto err_out;
587 }
588 ntfs_free(rstr1_ph);
589 ntfs_free(rstr2_ph);
590 /* All consistency checks passed. */ 625 /* All consistency checks passed. */
626 if (rp)
627 *rp = rstr1_ph;
628 else
629 ntfs_free(rstr1_ph);
591 ntfs_debug("Done."); 630 ntfs_debug("Done.");
592 return TRUE; 631 return TRUE;
593err_out: 632err_out:
594 if (page)
595 ntfs_unmap_page(page);
596 if (rstr1_ph) 633 if (rstr1_ph)
597 ntfs_free(rstr1_ph); 634 ntfs_free(rstr1_ph);
598 if (rstr2_ph)
599 ntfs_free(rstr2_ph);
600 return FALSE; 635 return FALSE;
601} 636}
602 637
603/** 638/**
604 * ntfs_is_logfile_clean - check in the journal if the volume is clean 639 * ntfs_is_logfile_clean - check in the journal if the volume is clean
605 * @log_vi: struct inode of loaded journal $LogFile to check 640 * @log_vi: struct inode of loaded journal $LogFile to check
641 * @rp: copy of the current restart page
606 * 642 *
607 * Analyze the $LogFile journal and return TRUE if it indicates the volume was 643 * Analyze the $LogFile journal and return TRUE if it indicates the volume was
608 * shutdown cleanly and FALSE if not. 644 * shutdown cleanly and FALSE if not.
@@ -619,11 +655,9 @@ err_out:
619 * is empty this function requires that NVolLogFileEmpty() is true otherwise an 655 * is empty this function requires that NVolLogFileEmpty() is true otherwise an
620 * empty volume will be reported as dirty. 656 * empty volume will be reported as dirty.
621 */ 657 */
622BOOL ntfs_is_logfile_clean(struct inode *log_vi) 658BOOL ntfs_is_logfile_clean(struct inode *log_vi, const RESTART_PAGE_HEADER *rp)
623{ 659{
624 ntfs_volume *vol = NTFS_SB(log_vi->i_sb); 660 ntfs_volume *vol = NTFS_SB(log_vi->i_sb);
625 struct page *page;
626 RESTART_PAGE_HEADER *rp;
627 RESTART_AREA *ra; 661 RESTART_AREA *ra;
628 662
629 ntfs_debug("Entering."); 663 ntfs_debug("Entering.");
@@ -632,24 +666,15 @@ BOOL ntfs_is_logfile_clean(struct inode *log_vi)
632 ntfs_debug("Done. ($LogFile is empty.)"); 666 ntfs_debug("Done. ($LogFile is empty.)");
633 return TRUE; 667 return TRUE;
634 } 668 }
635 /* 669 BUG_ON(!rp);
636 * Read the first restart page. It will be possibly incomplete and 670 if (!ntfs_is_rstr_record(rp->magic) &&
637 * will not be multi sector transfer deprotected but we only need the 671 !ntfs_is_chkd_record(rp->magic)) {
638 * first NTFS_BLOCK_SIZE bytes so it does not matter. 672 ntfs_error(vol->sb, "Restart page buffer is invalid. This is "
639 */ 673 "probably a bug in that the $LogFile should "
640 page = ntfs_map_page(log_vi->i_mapping, 0); 674 "have been consistency checked before calling "
641 if (IS_ERR(page)) { 675 "this function.");
642 ntfs_error(vol->sb, "Error mapping $LogFile page (index 0).");
643 return FALSE; 676 return FALSE;
644 } 677 }
645 rp = (RESTART_PAGE_HEADER*)page_address(page);
646 if (!ntfs_is_rstr_record(rp->magic)) {
647 ntfs_error(vol->sb, "No restart page found at offset zero in "
648 "$LogFile. This is probably a bug in that "
649 "the $LogFile should have been consistency "
650 "checked before calling this function.");
651 goto err_out;
652 }
653 ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); 678 ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset));
654 /* 679 /*
655 * If the $LogFile has active clients, i.e. it is open, and we do not 680 * If the $LogFile has active clients, i.e. it is open, and we do not
@@ -659,15 +684,11 @@ BOOL ntfs_is_logfile_clean(struct inode *log_vi)
659 if (ra->client_in_use_list != LOGFILE_NO_CLIENT && 684 if (ra->client_in_use_list != LOGFILE_NO_CLIENT &&
660 !(ra->flags & RESTART_VOLUME_IS_CLEAN)) { 685 !(ra->flags & RESTART_VOLUME_IS_CLEAN)) {
661 ntfs_debug("Done. $LogFile indicates a dirty shutdown."); 686 ntfs_debug("Done. $LogFile indicates a dirty shutdown.");
662 goto err_out; 687 return FALSE;
663 } 688 }
664 ntfs_unmap_page(page);
665 /* $LogFile indicates a clean shutdown. */ 689 /* $LogFile indicates a clean shutdown. */
666 ntfs_debug("Done. $LogFile indicates a clean shutdown."); 690 ntfs_debug("Done. $LogFile indicates a clean shutdown.");
667 return TRUE; 691 return TRUE;
668err_out:
669 ntfs_unmap_page(page);
670 return FALSE;
671} 692}
672 693
673/** 694/**
diff --git a/fs/ntfs/logfile.h b/fs/ntfs/logfile.h
index 4ee4378de061..42388f95ea6d 100644
--- a/fs/ntfs/logfile.h
+++ b/fs/ntfs/logfile.h
@@ -2,7 +2,7 @@
2 * logfile.h - Defines for NTFS kernel journal ($LogFile) handling. Part of 2 * logfile.h - Defines for NTFS kernel journal ($LogFile) handling. Part of
3 * the Linux-NTFS project. 3 * the Linux-NTFS project.
4 * 4 *
5 * Copyright (c) 2000-2004 Anton Altaparmakov 5 * Copyright (c) 2000-2005 Anton Altaparmakov
6 * 6 *
7 * This program/include file is free software; you can redistribute it and/or 7 * This program/include file is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as published 8 * modify it under the terms of the GNU General Public License as published
@@ -296,9 +296,11 @@ typedef struct {
296/* sizeof() = 160 (0xa0) bytes */ 296/* sizeof() = 160 (0xa0) bytes */
297} __attribute__ ((__packed__)) LOG_CLIENT_RECORD; 297} __attribute__ ((__packed__)) LOG_CLIENT_RECORD;
298 298
299extern BOOL ntfs_check_logfile(struct inode *log_vi); 299extern BOOL ntfs_check_logfile(struct inode *log_vi,
300 RESTART_PAGE_HEADER **rp);
300 301
301extern BOOL ntfs_is_logfile_clean(struct inode *log_vi); 302extern BOOL ntfs_is_logfile_clean(struct inode *log_vi,
303 const RESTART_PAGE_HEADER *rp);
302 304
303extern BOOL ntfs_empty_logfile(struct inode *log_vi); 305extern BOOL ntfs_empty_logfile(struct inode *log_vi);
304 306
diff --git a/fs/ntfs/malloc.h b/fs/ntfs/malloc.h
index fac5944df6d8..9994e019a3cf 100644
--- a/fs/ntfs/malloc.h
+++ b/fs/ntfs/malloc.h
@@ -27,27 +27,63 @@
27#include <linux/highmem.h> 27#include <linux/highmem.h>
28 28
29/** 29/**
30 * ntfs_malloc_nofs - allocate memory in multiples of pages 30 * __ntfs_malloc - allocate memory in multiples of pages
31 * @size number of bytes to allocate 31 * @size: number of bytes to allocate
32 * @gfp_mask: extra flags for the allocator
33 *
34 * Internal function. You probably want ntfs_malloc_nofs()...
32 * 35 *
33 * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and 36 * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
34 * returns a pointer to the allocated memory. 37 * returns a pointer to the allocated memory.
35 * 38 *
36 * If there was insufficient memory to complete the request, return NULL. 39 * If there was insufficient memory to complete the request, return NULL.
40 * Depending on @gfp_mask the allocation may be guaranteed to succeed.
37 */ 41 */
38static inline void *ntfs_malloc_nofs(unsigned long size) 42static inline void *__ntfs_malloc(unsigned long size,
43 unsigned int __nocast gfp_mask)
39{ 44{
40 if (likely(size <= PAGE_SIZE)) { 45 if (likely(size <= PAGE_SIZE)) {
41 BUG_ON(!size); 46 BUG_ON(!size);
42 /* kmalloc() has per-CPU caches so is faster for now. */ 47 /* kmalloc() has per-CPU caches so is faster for now. */
43 return kmalloc(PAGE_SIZE, GFP_NOFS); 48 return kmalloc(PAGE_SIZE, gfp_mask);
44 /* return (void *)__get_free_page(GFP_NOFS | __GFP_HIGHMEM); */ 49 /* return (void *)__get_free_page(gfp_mask); */
45 } 50 }
46 if (likely(size >> PAGE_SHIFT < num_physpages)) 51 if (likely(size >> PAGE_SHIFT < num_physpages))
47 return __vmalloc(size, GFP_NOFS | __GFP_HIGHMEM, PAGE_KERNEL); 52 return __vmalloc(size, gfp_mask, PAGE_KERNEL);
48 return NULL; 53 return NULL;
49} 54}
50 55
56/**
57 * ntfs_malloc_nofs - allocate memory in multiples of pages
58 * @size: number of bytes to allocate
59 *
60 * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
61 * returns a pointer to the allocated memory.
62 *
63 * If there was insufficient memory to complete the request, return NULL.
64 */
65static inline void *ntfs_malloc_nofs(unsigned long size)
66{
67 return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM);
68}
69
70/**
71 * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages
72 * @size: number of bytes to allocate
73 *
74 * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
75 * returns a pointer to the allocated memory.
76 *
77 * This function guarantees that the allocation will succeed. It will sleep
78 * for as long as it takes to complete the allocation.
79 *
80 * If there was insufficient memory to complete the request, return NULL.
81 */
82static inline void *ntfs_malloc_nofs_nofail(unsigned long size)
83{
84 return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL);
85}
86
51static inline void ntfs_free(void *addr) 87static inline void ntfs_free(void *addr)
52{ 88{
53 if (likely(((unsigned long)addr < VMALLOC_START) || 89 if (likely(((unsigned long)addr < VMALLOC_START) ||
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c
index 317f7c679fd3..2c32b84385a8 100644
--- a/fs/ntfs/mft.c
+++ b/fs/ntfs/mft.c
@@ -511,7 +511,6 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no,
511 } while (bh); 511 } while (bh);
512 tail->b_this_page = head; 512 tail->b_this_page = head;
513 attach_page_buffers(page, head); 513 attach_page_buffers(page, head);
514 BUG_ON(!page_has_buffers(page));
515 } 514 }
516 bh = head = page_buffers(page); 515 bh = head = page_buffers(page);
517 BUG_ON(!bh); 516 BUG_ON(!bh);
@@ -692,7 +691,6 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync)
692 */ 691 */
693 if (!NInoTestClearDirty(ni)) 692 if (!NInoTestClearDirty(ni))
694 goto done; 693 goto done;
695 BUG_ON(!page_has_buffers(page));
696 bh = head = page_buffers(page); 694 bh = head = page_buffers(page);
697 BUG_ON(!bh); 695 BUG_ON(!bh);
698 rl = NULL; 696 rl = NULL;
@@ -1955,7 +1953,7 @@ restore_undo_alloc:
1955 a = ctx->attr; 1953 a = ctx->attr;
1956 a->data.non_resident.highest_vcn = cpu_to_sle64(old_last_vcn - 1); 1954 a->data.non_resident.highest_vcn = cpu_to_sle64(old_last_vcn - 1);
1957undo_alloc: 1955undo_alloc:
1958 if (ntfs_cluster_free(vol->mft_ino, old_last_vcn, -1) < 0) { 1956 if (ntfs_cluster_free(vol->mft_ino, old_last_vcn, -1, TRUE) < 0) {
1959 ntfs_error(vol->sb, "Failed to free clusters from mft data " 1957 ntfs_error(vol->sb, "Failed to free clusters from mft data "
1960 "attribute.%s", es); 1958 "attribute.%s", es);
1961 NVolSetErrors(vol); 1959 NVolSetErrors(vol);
diff --git a/fs/ntfs/runlist.c b/fs/ntfs/runlist.c
index 758855b0414e..f5b2ac929081 100644
--- a/fs/ntfs/runlist.c
+++ b/fs/ntfs/runlist.c
@@ -35,7 +35,7 @@ static inline void ntfs_rl_mm(runlist_element *base, int dst, int src,
35 int size) 35 int size)
36{ 36{
37 if (likely((dst != src) && (size > 0))) 37 if (likely((dst != src) && (size > 0)))
38 memmove(base + dst, base + src, size * sizeof (*base)); 38 memmove(base + dst, base + src, size * sizeof(*base));
39} 39}
40 40
41/** 41/**
@@ -95,6 +95,51 @@ static inline runlist_element *ntfs_rl_realloc(runlist_element *rl,
95} 95}
96 96
97/** 97/**
98 * ntfs_rl_realloc_nofail - Reallocate memory for runlists
99 * @rl: original runlist
100 * @old_size: number of runlist elements in the original runlist @rl
101 * @new_size: number of runlist elements we need space for
102 *
103 * As the runlists grow, more memory will be required. To prevent the
104 * kernel having to allocate and reallocate large numbers of small bits of
105 * memory, this function returns an entire page of memory.
106 *
107 * This function guarantees that the allocation will succeed. It will sleep
108 * for as long as it takes to complete the allocation.
109 *
110 * It is up to the caller to serialize access to the runlist @rl.
111 *
112 * N.B. If the new allocation doesn't require a different number of pages in
113 * memory, the function will return the original pointer.
114 *
115 * On success, return a pointer to the newly allocated, or recycled, memory.
116 * On error, return -errno. The following error codes are defined:
117 * -ENOMEM - Not enough memory to allocate runlist array.
118 * -EINVAL - Invalid parameters were passed in.
119 */
120static inline runlist_element *ntfs_rl_realloc_nofail(runlist_element *rl,
121 int old_size, int new_size)
122{
123 runlist_element *new_rl;
124
125 old_size = PAGE_ALIGN(old_size * sizeof(*rl));
126 new_size = PAGE_ALIGN(new_size * sizeof(*rl));
127 if (old_size == new_size)
128 return rl;
129
130 new_rl = ntfs_malloc_nofs_nofail(new_size);
131 BUG_ON(!new_rl);
132
133 if (likely(rl != NULL)) {
134 if (unlikely(old_size > new_size))
135 old_size = new_size;
136 memcpy(new_rl, rl, old_size);
137 ntfs_free(rl);
138 }
139 return new_rl;
140}
141
142/**
98 * ntfs_are_rl_mergeable - test if two runlists can be joined together 143 * ntfs_are_rl_mergeable - test if two runlists can be joined together
99 * @dst: original runlist 144 * @dst: original runlist
100 * @src: new runlist to test for mergeability with @dst 145 * @src: new runlist to test for mergeability with @dst
@@ -497,6 +542,7 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
497 /* Scan to the end of the source runlist. */ 542 /* Scan to the end of the source runlist. */
498 for (dend = 0; likely(drl[dend].length); dend++) 543 for (dend = 0; likely(drl[dend].length); dend++)
499 ; 544 ;
545 dend++;
500 drl = ntfs_rl_realloc(drl, dend, dend + 1); 546 drl = ntfs_rl_realloc(drl, dend, dend + 1);
501 if (IS_ERR(drl)) 547 if (IS_ERR(drl))
502 return drl; 548 return drl;
@@ -566,8 +612,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
566 ((drl[dins].vcn + drl[dins].length) <= /* End of hole */ 612 ((drl[dins].vcn + drl[dins].length) <= /* End of hole */
567 (srl[send - 1].vcn + srl[send - 1].length))); 613 (srl[send - 1].vcn + srl[send - 1].length)));
568 614
569 /* Or we'll lose an end marker */ 615 /* Or we will lose an end marker. */
570 if (start && finish && (drl[dins].length == 0)) 616 if (finish && !drl[dins].length)
571 ss++; 617 ss++;
572 if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn)) 618 if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn))
573 finish = FALSE; 619 finish = FALSE;
@@ -621,11 +667,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
621 if (drl[ds].lcn != LCN_RL_NOT_MAPPED) { 667 if (drl[ds].lcn != LCN_RL_NOT_MAPPED) {
622 /* Add an unmapped runlist element. */ 668 /* Add an unmapped runlist element. */
623 if (!slots) { 669 if (!slots) {
624 /* FIXME/TODO: We need to have the 670 drl = ntfs_rl_realloc_nofail(drl, ds,
625 * extra memory already! (AIA) */ 671 ds + 2);
626 drl = ntfs_rl_realloc(drl, ds, ds + 2);
627 if (!drl)
628 goto critical_error;
629 slots = 2; 672 slots = 2;
630 } 673 }
631 ds++; 674 ds++;
@@ -640,13 +683,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
640 drl[ds].length = marker_vcn - drl[ds].vcn; 683 drl[ds].length = marker_vcn - drl[ds].vcn;
641 /* Finally add the ENOENT terminator. */ 684 /* Finally add the ENOENT terminator. */
642 ds++; 685 ds++;
643 if (!slots) { 686 if (!slots)
644 /* FIXME/TODO: We need to have the extra 687 drl = ntfs_rl_realloc_nofail(drl, ds, ds + 1);
645 * memory already! (AIA) */
646 drl = ntfs_rl_realloc(drl, ds, ds + 1);
647 if (!drl)
648 goto critical_error;
649 }
650 drl[ds].vcn = marker_vcn; 688 drl[ds].vcn = marker_vcn;
651 drl[ds].lcn = LCN_ENOENT; 689 drl[ds].lcn = LCN_ENOENT;
652 drl[ds].length = (s64)0; 690 drl[ds].length = (s64)0;
@@ -659,11 +697,6 @@ finished:
659 ntfs_debug("Merged runlist:"); 697 ntfs_debug("Merged runlist:");
660 ntfs_debug_dump_runlist(drl); 698 ntfs_debug_dump_runlist(drl);
661 return drl; 699 return drl;
662
663critical_error:
664 /* Critical error! We cannot afford to fail here. */
665 ntfs_error(NULL, "Critical error! Not enough memory.");
666 panic("NTFS: Cannot continue.");
667} 700}
668 701
669/** 702/**
@@ -727,6 +760,9 @@ runlist_element *ntfs_mapping_pairs_decompress(const ntfs_volume *vol,
727 ntfs_error(vol->sb, "Corrupt attribute."); 760 ntfs_error(vol->sb, "Corrupt attribute.");
728 return ERR_PTR(-EIO); 761 return ERR_PTR(-EIO);
729 } 762 }
763 /* If the mapping pairs array is valid but empty, nothing to do. */
764 if (!vcn && !*buf)
765 return old_rl;
730 /* Current position in runlist array. */ 766 /* Current position in runlist array. */
731 rlpos = 0; 767 rlpos = 0;
732 /* Allocate first page and set current runlist size to one page. */ 768 /* Allocate first page and set current runlist size to one page. */
@@ -1419,6 +1455,7 @@ err_out:
1419 1455
1420/** 1456/**
1421 * ntfs_rl_truncate_nolock - truncate a runlist starting at a specified vcn 1457 * ntfs_rl_truncate_nolock - truncate a runlist starting at a specified vcn
1458 * @vol: ntfs volume (needed for error output)
1422 * @runlist: runlist to truncate 1459 * @runlist: runlist to truncate
1423 * @new_length: the new length of the runlist in VCNs 1460 * @new_length: the new length of the runlist in VCNs
1424 * 1461 *
@@ -1426,12 +1463,16 @@ err_out:
1426 * holding the runlist elements to a length of @new_length VCNs. 1463 * holding the runlist elements to a length of @new_length VCNs.
1427 * 1464 *
1428 * If @new_length lies within the runlist, the runlist elements with VCNs of 1465 * If @new_length lies within the runlist, the runlist elements with VCNs of
1429 * @new_length and above are discarded. 1466 * @new_length and above are discarded. As a special case if @new_length is
1467 * zero, the runlist is discarded and set to NULL.
1430 * 1468 *
1431 * If @new_length lies beyond the runlist, a sparse runlist element is added to 1469 * If @new_length lies beyond the runlist, a sparse runlist element is added to
1432 * the end of the runlist @runlist or if the last runlist element is a sparse 1470 * the end of the runlist @runlist or if the last runlist element is a sparse
1433 * one already, this is extended. 1471 * one already, this is extended.
1434 * 1472 *
1473 * Note, no checking is done for unmapped runlist elements. It is assumed that
1474 * the caller has mapped any elements that need to be mapped already.
1475 *
1435 * Return 0 on success and -errno on error. 1476 * Return 0 on success and -errno on error.
1436 * 1477 *
1437 * Locking: The caller must hold @runlist->lock for writing. 1478 * Locking: The caller must hold @runlist->lock for writing.
@@ -1446,6 +1487,13 @@ int ntfs_rl_truncate_nolock(const ntfs_volume *vol, runlist *const runlist,
1446 BUG_ON(!runlist); 1487 BUG_ON(!runlist);
1447 BUG_ON(new_length < 0); 1488 BUG_ON(new_length < 0);
1448 rl = runlist->rl; 1489 rl = runlist->rl;
1490 if (!new_length) {
1491 ntfs_debug("Freeing runlist.");
1492 runlist->rl = NULL;
1493 if (rl)
1494 ntfs_free(rl);
1495 return 0;
1496 }
1449 if (unlikely(!rl)) { 1497 if (unlikely(!rl)) {
1450 /* 1498 /*
1451 * Create a runlist consisting of a sparse runlist element of 1499 * Create a runlist consisting of a sparse runlist element of
@@ -1553,4 +1601,288 @@ int ntfs_rl_truncate_nolock(const ntfs_volume *vol, runlist *const runlist,
1553 return 0; 1601 return 0;
1554} 1602}
1555 1603
1604/**
1605 * ntfs_rl_punch_nolock - punch a hole into a runlist
1606 * @vol: ntfs volume (needed for error output)
1607 * @runlist: runlist to punch a hole into
1608 * @start: starting VCN of the hole to be created
1609 * @length: size of the hole to be created in units of clusters
1610 *
1611 * Punch a hole into the runlist @runlist starting at VCN @start and of size
1612 * @length clusters.
1613 *
1614 * Return 0 on success and -errno on error, in which case @runlist has not been
1615 * modified.
1616 *
1617 * If @start and/or @start + @length are outside the runlist return error code
1618 * -ENOENT.
1619 *
1620 * If the runlist contains unmapped or error elements between @start and @start
1621 * + @length return error code -EINVAL.
1622 *
1623 * Locking: The caller must hold @runlist->lock for writing.
1624 */
1625int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist,
1626 const VCN start, const s64 length)
1627{
1628 const VCN end = start + length;
1629 s64 delta;
1630 runlist_element *rl, *rl_end, *rl_real_end, *trl;
1631 int old_size;
1632 BOOL lcn_fixup = FALSE;
1633
1634 ntfs_debug("Entering for start 0x%llx, length 0x%llx.",
1635 (long long)start, (long long)length);
1636 BUG_ON(!runlist);
1637 BUG_ON(start < 0);
1638 BUG_ON(length < 0);
1639 BUG_ON(end < 0);
1640 rl = runlist->rl;
1641 if (unlikely(!rl)) {
1642 if (likely(!start && !length))
1643 return 0;
1644 return -ENOENT;
1645 }
1646 /* Find @start in the runlist. */
1647 while (likely(rl->length && start >= rl[1].vcn))
1648 rl++;
1649 rl_end = rl;
1650 /* Find @end in the runlist. */
1651 while (likely(rl_end->length && end >= rl_end[1].vcn)) {
1652 /* Verify there are no unmapped or error elements. */
1653 if (unlikely(rl_end->lcn < LCN_HOLE))
1654 return -EINVAL;
1655 rl_end++;
1656 }
1657 /* Check the last element. */
1658 if (unlikely(rl_end->length && rl_end->lcn < LCN_HOLE))
1659 return -EINVAL;
1660 /* This covers @start being out of bounds, too. */
1661 if (!rl_end->length && end > rl_end->vcn)
1662 return -ENOENT;
1663 if (!length)
1664 return 0;
1665 if (!rl->length)
1666 return -ENOENT;
1667 rl_real_end = rl_end;
1668 /* Determine the runlist size. */
1669 while (likely(rl_real_end->length))
1670 rl_real_end++;
1671 old_size = rl_real_end - runlist->rl + 1;
1672 /* If @start is in a hole simply extend the hole. */
1673 if (rl->lcn == LCN_HOLE) {
1674 /*
1675 * If both @start and @end are in the same sparse run, we are
1676 * done.
1677 */
1678 if (end <= rl[1].vcn) {
1679 ntfs_debug("Done (requested hole is already sparse).");
1680 return 0;
1681 }
1682extend_hole:
1683 /* Extend the hole. */
1684 rl->length = end - rl->vcn;
1685 /* If @end is in a hole, merge it with the current one. */
1686 if (rl_end->lcn == LCN_HOLE) {
1687 rl_end++;
1688 rl->length = rl_end->vcn - rl->vcn;
1689 }
1690 /* We have done the hole. Now deal with the remaining tail. */
1691 rl++;
1692 /* Cut out all runlist elements up to @end. */
1693 if (rl < rl_end)
1694 memmove(rl, rl_end, (rl_real_end - rl_end + 1) *
1695 sizeof(*rl));
1696 /* Adjust the beginning of the tail if necessary. */
1697 if (end > rl->vcn) {
1698 s64 delta = end - rl->vcn;
1699 rl->vcn = end;
1700 rl->length -= delta;
1701 /* Only adjust the lcn if it is real. */
1702 if (rl->lcn >= 0)
1703 rl->lcn += delta;
1704 }
1705shrink_allocation:
1706 /* Reallocate memory if the allocation changed. */
1707 if (rl < rl_end) {
1708 rl = ntfs_rl_realloc(runlist->rl, old_size,
1709 old_size - (rl_end - rl));
1710 if (IS_ERR(rl))
1711 ntfs_warning(vol->sb, "Failed to shrink "
1712 "runlist buffer. This just "
1713 "wastes a bit of memory "
1714 "temporarily so we ignore it "
1715 "and return success.");
1716 else
1717 runlist->rl = rl;
1718 }
1719 ntfs_debug("Done (extend hole).");
1720 return 0;
1721 }
1722 /*
1723 * If @start is at the beginning of a run things are easier as there is
1724 * no need to split the first run.
1725 */
1726 if (start == rl->vcn) {
1727 /*
1728 * @start is at the beginning of a run.
1729 *
1730 * If the previous run is sparse, extend its hole.
1731 *
1732 * If @end is not in the same run, switch the run to be sparse
1733 * and extend the newly created hole.
1734 *
1735 * Thus both of these cases reduce the problem to the above
1736 * case of "@start is in a hole".
1737 */
1738 if (rl > runlist->rl && (rl - 1)->lcn == LCN_HOLE) {
1739 rl--;
1740 goto extend_hole;
1741 }
1742 if (end >= rl[1].vcn) {
1743 rl->lcn = LCN_HOLE;
1744 goto extend_hole;
1745 }
1746 /*
1747 * The final case is when @end is in the same run as @start.
1748 * For this need to split the run into two. One run for the
1749 * sparse region between the beginning of the old run, i.e.
1750 * @start, and @end and one for the remaining non-sparse
1751 * region, i.e. between @end and the end of the old run.
1752 */
1753 trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1);
1754 if (IS_ERR(trl))
1755 goto enomem_out;
1756 old_size++;
1757 if (runlist->rl != trl) {
1758 rl = trl + (rl - runlist->rl);
1759 rl_end = trl + (rl_end - runlist->rl);
1760 rl_real_end = trl + (rl_real_end - runlist->rl);
1761 runlist->rl = trl;
1762 }
1763split_end:
1764 /* Shift all the runs up by one. */
1765 memmove(rl + 1, rl, (rl_real_end - rl + 1) * sizeof(*rl));
1766 /* Finally, setup the two split runs. */
1767 rl->lcn = LCN_HOLE;
1768 rl->length = length;
1769 rl++;
1770 rl->vcn += length;
1771 /* Only adjust the lcn if it is real. */
1772 if (rl->lcn >= 0 || lcn_fixup)
1773 rl->lcn += length;
1774 rl->length -= length;
1775 ntfs_debug("Done (split one).");
1776 return 0;
1777 }
1778 /*
1779 * @start is neither in a hole nor at the beginning of a run.
1780 *
1781 * If @end is in a hole, things are easier as simply truncating the run
1782 * @start is in to end at @start - 1, deleting all runs after that up
1783 * to @end, and finally extending the beginning of the run @end is in
1784 * to be @start is all that is needed.
1785 */
1786 if (rl_end->lcn == LCN_HOLE) {
1787 /* Truncate the run containing @start. */
1788 rl->length = start - rl->vcn;
1789 rl++;
1790 /* Cut out all runlist elements up to @end. */
1791 if (rl < rl_end)
1792 memmove(rl, rl_end, (rl_real_end - rl_end + 1) *
1793 sizeof(*rl));
1794 /* Extend the beginning of the run @end is in to be @start. */
1795 rl->vcn = start;
1796 rl->length = rl[1].vcn - start;
1797 goto shrink_allocation;
1798 }
1799 /*
1800 * If @end is not in a hole there are still two cases to distinguish.
1801 * Either @end is or is not in the same run as @start.
1802 *
1803 * The second case is easier as it can be reduced to an already solved
1804 * problem by truncating the run @start is in to end at @start - 1.
1805 * Then, if @end is in the next run need to split the run into a sparse
1806 * run followed by a non-sparse run (already covered above) and if @end
1807 * is not in the next run switching it to be sparse, again reduces the
1808 * problem to the already covered case of "@start is in a hole".
1809 */
1810 if (end >= rl[1].vcn) {
1811 /*
1812 * If @end is not in the next run, reduce the problem to the
1813 * case of "@start is in a hole".
1814 */
1815 if (rl[1].length && end >= rl[2].vcn) {
1816 /* Truncate the run containing @start. */
1817 rl->length = start - rl->vcn;
1818 rl++;
1819 rl->vcn = start;
1820 rl->lcn = LCN_HOLE;
1821 goto extend_hole;
1822 }
1823 trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1);
1824 if (IS_ERR(trl))
1825 goto enomem_out;
1826 old_size++;
1827 if (runlist->rl != trl) {
1828 rl = trl + (rl - runlist->rl);
1829 rl_end = trl + (rl_end - runlist->rl);
1830 rl_real_end = trl + (rl_real_end - runlist->rl);
1831 runlist->rl = trl;
1832 }
1833 /* Truncate the run containing @start. */
1834 rl->length = start - rl->vcn;
1835 rl++;
1836 /*
1837 * @end is in the next run, reduce the problem to the case
1838 * where "@start is at the beginning of a run and @end is in
1839 * the same run as @start".
1840 */
1841 delta = rl->vcn - start;
1842 rl->vcn = start;
1843 if (rl->lcn >= 0) {
1844 rl->lcn -= delta;
1845 /* Need this in case the lcn just became negative. */
1846 lcn_fixup = TRUE;
1847 }
1848 rl->length += delta;
1849 goto split_end;
1850 }
1851 /*
1852 * The first case from above, i.e. @end is in the same run as @start.
1853 * We need to split the run into three. One run for the non-sparse
1854 * region between the beginning of the old run and @start, one for the
1855 * sparse region between @start and @end, and one for the remaining
1856 * non-sparse region, i.e. between @end and the end of the old run.
1857 */
1858 trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 2);
1859 if (IS_ERR(trl))
1860 goto enomem_out;
1861 old_size += 2;
1862 if (runlist->rl != trl) {
1863 rl = trl + (rl - runlist->rl);
1864 rl_end = trl + (rl_end - runlist->rl);
1865 rl_real_end = trl + (rl_real_end - runlist->rl);
1866 runlist->rl = trl;
1867 }
1868 /* Shift all the runs up by two. */
1869 memmove(rl + 2, rl, (rl_real_end - rl + 1) * sizeof(*rl));
1870 /* Finally, setup the three split runs. */
1871 rl->length = start - rl->vcn;
1872 rl++;
1873 rl->vcn = start;
1874 rl->lcn = LCN_HOLE;
1875 rl->length = length;
1876 rl++;
1877 delta = end - rl->vcn;
1878 rl->vcn = end;
1879 rl->lcn += delta;
1880 rl->length -= delta;
1881 ntfs_debug("Done (split both).");
1882 return 0;
1883enomem_out:
1884 ntfs_error(vol->sb, "Not enough memory to extend runlist buffer.");
1885 return -ENOMEM;
1886}
1887
1556#endif /* NTFS_RW */ 1888#endif /* NTFS_RW */
diff --git a/fs/ntfs/runlist.h b/fs/ntfs/runlist.h
index aa0ee6540e7c..47728fbb610b 100644
--- a/fs/ntfs/runlist.h
+++ b/fs/ntfs/runlist.h
@@ -94,6 +94,9 @@ extern int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst,
94extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol, 94extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol,
95 runlist *const runlist, const s64 new_length); 95 runlist *const runlist, const s64 new_length);
96 96
97int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist,
98 const VCN start, const s64 length);
99
97#endif /* NTFS_RW */ 100#endif /* NTFS_RW */
98 101
99#endif /* _LINUX_NTFS_RUNLIST_H */ 102#endif /* _LINUX_NTFS_RUNLIST_H */
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c
index 41aa8eb6755b..b2b392961268 100644
--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -1133,7 +1133,8 @@ mft_unmap_out:
1133 * 1133 *
1134 * Return TRUE on success or FALSE on error. 1134 * Return TRUE on success or FALSE on error.
1135 */ 1135 */
1136static BOOL load_and_check_logfile(ntfs_volume *vol) 1136static BOOL load_and_check_logfile(ntfs_volume *vol,
1137 RESTART_PAGE_HEADER **rp)
1137{ 1138{
1138 struct inode *tmp_ino; 1139 struct inode *tmp_ino;
1139 1140
@@ -1145,7 +1146,7 @@ static BOOL load_and_check_logfile(ntfs_volume *vol)
1145 /* Caller will display error message. */ 1146 /* Caller will display error message. */
1146 return FALSE; 1147 return FALSE;
1147 } 1148 }
1148 if (!ntfs_check_logfile(tmp_ino)) { 1149 if (!ntfs_check_logfile(tmp_ino, rp)) {
1149 iput(tmp_ino); 1150 iput(tmp_ino);
1150 /* ntfs_check_logfile() will have displayed error output. */ 1151 /* ntfs_check_logfile() will have displayed error output. */
1151 return FALSE; 1152 return FALSE;
@@ -1689,6 +1690,7 @@ static BOOL load_system_files(ntfs_volume *vol)
1689 VOLUME_INFORMATION *vi; 1690 VOLUME_INFORMATION *vi;
1690 ntfs_attr_search_ctx *ctx; 1691 ntfs_attr_search_ctx *ctx;
1691#ifdef NTFS_RW 1692#ifdef NTFS_RW
1693 RESTART_PAGE_HEADER *rp;
1692 int err; 1694 int err;
1693#endif /* NTFS_RW */ 1695#endif /* NTFS_RW */
1694 1696
@@ -1841,8 +1843,9 @@ get_ctx_vol_failed:
1841 * Get the inode for the logfile, check it and determine if the volume 1843 * Get the inode for the logfile, check it and determine if the volume
1842 * was shutdown cleanly. 1844 * was shutdown cleanly.
1843 */ 1845 */
1844 if (!load_and_check_logfile(vol) || 1846 rp = NULL;
1845 !ntfs_is_logfile_clean(vol->logfile_ino)) { 1847 if (!load_and_check_logfile(vol, &rp) ||
1848 !ntfs_is_logfile_clean(vol->logfile_ino, rp)) {
1846 static const char *es1a = "Failed to load $LogFile"; 1849 static const char *es1a = "Failed to load $LogFile";
1847 static const char *es1b = "$LogFile is not clean"; 1850 static const char *es1b = "$LogFile is not clean";
1848 static const char *es2 = ". Mount in Windows."; 1851 static const char *es2 = ". Mount in Windows.";
@@ -1857,6 +1860,10 @@ get_ctx_vol_failed:
1857 "continue nor on_errors=" 1860 "continue nor on_errors="
1858 "remount-ro was specified%s", 1861 "remount-ro was specified%s",
1859 es1, es2); 1862 es1, es2);
1863 if (vol->logfile_ino) {
1864 BUG_ON(!rp);
1865 ntfs_free(rp);
1866 }
1860 goto iput_logfile_err_out; 1867 goto iput_logfile_err_out;
1861 } 1868 }
1862 sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME; 1869 sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME;
@@ -1867,6 +1874,7 @@ get_ctx_vol_failed:
1867 /* This will prevent a read-write remount. */ 1874 /* This will prevent a read-write remount. */
1868 NVolSetErrors(vol); 1875 NVolSetErrors(vol);
1869 } 1876 }
1877 ntfs_free(rp);
1870#endif /* NTFS_RW */ 1878#endif /* NTFS_RW */
1871 /* Get the root directory inode so we can do path lookups. */ 1879 /* Get the root directory inode so we can do path lookups. */
1872 vol->root_ino = ntfs_iget(sb, FILE_root); 1880 vol->root_ino = ntfs_iget(sb, FILE_root);
diff --git a/fs/ntfs/unistr.c b/fs/ntfs/unistr.c
index 19c42e231b44..a389a5a16c84 100644
--- a/fs/ntfs/unistr.c
+++ b/fs/ntfs/unistr.c
@@ -372,7 +372,8 @@ retry: wc = nls->uni2char(le16_to_cpu(ins[i]), ns + o,
372 return -EINVAL; 372 return -EINVAL;
373conversion_err: 373conversion_err:
374 ntfs_error(vol->sb, "Unicode name contains characters that cannot be " 374 ntfs_error(vol->sb, "Unicode name contains characters that cannot be "
375 "converted to character set %s.", nls->charset); 375 "converted to character set %s. You might want to "
376 "try to use the mount option nls=utf8.", nls->charset);
376 if (ns != *outs) 377 if (ns != *outs)
377 kfree(ns); 378 kfree(ns);
378 if (wc != -ENAMETOOLONG) 379 if (wc != -ENAMETOOLONG)
diff --git a/fs/xfs/Makefile-linux-2.6 b/fs/xfs/Makefile-linux-2.6
index 8e18ff157247..d8c87fa21ad1 100644
--- a/fs/xfs/Makefile-linux-2.6
+++ b/fs/xfs/Makefile-linux-2.6
@@ -1,5 +1,5 @@
1# 1#
2# Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. 2# Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved.
3# 3#
4# This program is free software; you can redistribute it and/or modify it 4# This program is free software; you can redistribute it and/or modify it
5# under the terms of version 2 of the GNU General Public License as 5# under the terms of version 2 of the GNU General Public License as
@@ -55,7 +55,18 @@ ifeq ($(CONFIG_XFS_TRACE),y)
55endif 55endif
56 56
57obj-$(CONFIG_XFS_FS) += xfs.o 57obj-$(CONFIG_XFS_FS) += xfs.o
58xfs-$(CONFIG_XFS_QUOTA) += quota/ 58
59xfs-$(CONFIG_XFS_QUOTA) += $(addprefix quota/, \
60 xfs_dquot.o \
61 xfs_dquot_item.o \
62 xfs_trans_dquot.o \
63 xfs_qm_syscalls.o \
64 xfs_qm_bhv.o \
65 xfs_qm.o)
66
67ifeq ($(CONFIG_XFS_QUOTA),y)
68xfs-$(CONFIG_PROC_FS) += quota/xfs_qm_stats.o
69endif
59 70
60xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o 71xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o
61xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o 72xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o
diff --git a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h
index f681e675b823..4e115f368d5f 100644
--- a/include/asm-alpha/pci.h
+++ b/include/asm-alpha/pci.h
@@ -254,6 +254,19 @@ extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *,
254extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 254extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
255 struct pci_bus_region *region); 255 struct pci_bus_region *region);
256 256
257static inline struct resource *
258pcibios_select_root(struct pci_dev *pdev, struct resource *res)
259{
260 struct resource *root = NULL;
261
262 if (res->flags & IORESOURCE_IO)
263 root = &ioport_resource;
264 if (res->flags & IORESOURCE_MEM)
265 root = &iomem_resource;
266
267 return root;
268}
269
257#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index 270#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
258 271
259static inline int pci_proc_domain(struct pci_bus *bus) 272static inline int pci_proc_domain(struct pci_bus *bus)
diff --git a/include/asm-arm/arch-pxa/hardware.h b/include/asm-arm/arch-pxa/hardware.h
index 72b04d846a23..cf35721cfa45 100644
--- a/include/asm-arm/arch-pxa/hardware.h
+++ b/include/asm-arm/arch-pxa/hardware.h
@@ -44,24 +44,12 @@
44 44
45#ifndef __ASSEMBLY__ 45#ifndef __ASSEMBLY__
46 46
47#if 0 47# define __REG(x) (*((volatile unsigned long *)io_p2v(x)))
48# define __REG(x) (*((volatile u32 *)io_p2v(x)))
49#else
50/*
51 * This __REG() version gives the same results as the one above, except
52 * that we are fooling gcc somehow so it generates far better and smaller
53 * assembly code for access to contigous registers. It's a shame that gcc
54 * doesn't guess this by itself.
55 */
56#include <asm/types.h>
57typedef struct { volatile u32 offset[4096]; } __regbase;
58# define __REGP(x) ((__regbase *)((x)&~4095))->offset[((x)&4095)>>2]
59# define __REG(x) __REGP(io_p2v(x))
60#endif
61 48
62/* With indexed regs we don't want to feed the index through io_p2v() 49/* With indexed regs we don't want to feed the index through io_p2v()
63 especially if it is a variable, otherwise horrible code will result. */ 50 especially if it is a variable, otherwise horrible code will result. */
64# define __REG2(x,y) (*(volatile u32 *)((u32)&__REG(x) + (y))) 51# define __REG2(x,y) \
52 (*(volatile unsigned long *)((unsigned long)&__REG(x) + (y)))
65 53
66# define __PREG(x) (io_v2p((u32)&(x))) 54# define __PREG(x) (io_v2p((u32)&(x)))
67 55
diff --git a/include/asm-arm/arch-pxa/i2c.h b/include/asm-arm/arch-pxa/i2c.h
new file mode 100644
index 000000000000..46ec2243974a
--- /dev/null
+++ b/include/asm-arm/arch-pxa/i2c.h
@@ -0,0 +1,70 @@
1/*
2 * i2c_pxa.h
3 *
4 * Copyright (C) 2002 Intrinsyc Software Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11#ifndef _I2C_PXA_H_
12#define _I2C_PXA_H_
13
14#if 0
15#define DEF_TIMEOUT 3
16#else
17/* need a longer timeout if we're dealing with the fact we may well be
18 * looking at a multi-master environment
19*/
20#define DEF_TIMEOUT 32
21#endif
22
23#define BUS_ERROR (-EREMOTEIO)
24#define XFER_NAKED (-ECONNREFUSED)
25#define I2C_RETRY (-2000) /* an error has occurred retry transmit */
26
27/* ICR initialize bit values
28*
29* 15. FM 0 (100 Khz operation)
30* 14. UR 0 (No unit reset)
31* 13. SADIE 0 (Disables the unit from interrupting on slave addresses
32* matching its slave address)
33* 12. ALDIE 0 (Disables the unit from interrupt when it loses arbitration
34* in master mode)
35* 11. SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode)
36* 10. BEIE 1 (Enable interrupts from detected bus errors, no ACK sent)
37* 9. IRFIE 1 (Enable interrupts from full buffer received)
38* 8. ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty)
39* 7. GCD 1 (Disables i2c unit response to general call messages as a slave)
40* 6. IUE 0 (Disable unit until we change settings)
41* 5. SCLE 1 (Enables the i2c clock output for master mode (drives SCL)
42* 4. MA 0 (Only send stop with the ICR stop bit)
43* 3. TB 0 (We are not transmitting a byte initially)
44* 2. ACKNAK 0 (Send an ACK after the unit receives a byte)
45* 1. STOP 0 (Do not send a STOP)
46* 0. START 0 (Do not send a START)
47*
48*/
49#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE)
50
51/* I2C status register init values
52 *
53 * 10. BED 1 (Clear bus error detected)
54 * 9. SAD 1 (Clear slave address detected)
55 * 7. IRF 1 (Clear IDBR Receive Full)
56 * 6. ITE 1 (Clear IDBR Transmit Empty)
57 * 5. ALD 1 (Clear Arbitration Loss Detected)
58 * 4. SSD 1 (Clear Slave Stop Detected)
59 */
60#define I2C_ISR_INIT 0x7FF /* status register init */
61
62struct i2c_slave_client;
63
64struct i2c_pxa_platform_data {
65 unsigned int slave_addr;
66 struct i2c_slave_client *slave;
67};
68
69extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info);
70#endif
diff --git a/include/asm-arm/arch-pxa/mmc.h b/include/asm-arm/arch-pxa/mmc.h
index 9718063a2119..88c17dd02ed2 100644
--- a/include/asm-arm/arch-pxa/mmc.h
+++ b/include/asm-arm/arch-pxa/mmc.h
@@ -9,6 +9,7 @@ struct mmc_host;
9 9
10struct pxamci_platform_data { 10struct pxamci_platform_data {
11 unsigned int ocr_mask; /* available voltages */ 11 unsigned int ocr_mask; /* available voltages */
12 unsigned long detect_delay; /* delay in jiffies before detecting cards after interrupt */
12 int (*init)(struct device *, irqreturn_t (*)(int, void *, struct pt_regs *), void *); 13 int (*init)(struct device *, irqreturn_t (*)(int, void *, struct pt_regs *), void *);
13 int (*get_ro)(struct device *); 14 int (*get_ro)(struct device *);
14 void (*setpower)(struct device *, unsigned int); 15 void (*setpower)(struct device *, unsigned int);
diff --git a/include/asm-arm/arch-sa1100/hardware.h b/include/asm-arm/arch-sa1100/hardware.h
index 10c62db34362..19c3b1e186bb 100644
--- a/include/asm-arm/arch-sa1100/hardware.h
+++ b/include/asm-arm/arch-sa1100/hardware.h
@@ -49,23 +49,9 @@
49 ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) 49 ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START )
50 50
51#ifndef __ASSEMBLY__ 51#ifndef __ASSEMBLY__
52#include <asm/types.h>
53 52
54#if 0 53# define __REG(x) (*((volatile unsigned long *)io_p2v(x)))
55# define __REG(x) (*((volatile u32 *)io_p2v(x))) 54# define __PREG(x) (io_v2p((unsigned long)&(x)))
56#else
57/*
58 * This __REG() version gives the same results as the one above, except
59 * that we are fooling gcc somehow so it generates far better and smaller
60 * assembly code for access to contigous registers. It's a shame that gcc
61 * doesn't guess this by itself.
62 */
63typedef struct { volatile u32 offset[4096]; } __regbase;
64# define __REGP(x) ((__regbase *)((x)&~4095))->offset[((x)&4095)>>2]
65# define __REG(x) __REGP(io_p2v(x))
66#endif
67
68# define __PREG(x) (io_v2p((u32)&(x)))
69 55
70#else 56#else
71 57
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h
index 035cdcff43d2..e81baff4f54b 100644
--- a/include/asm-arm/cacheflush.h
+++ b/include/asm-arm/cacheflush.h
@@ -256,7 +256,7 @@ extern void dmac_flush_range(unsigned long, unsigned long);
256 * Convert calls to our calling convention. 256 * Convert calls to our calling convention.
257 */ 257 */
258#define flush_cache_all() __cpuc_flush_kern_all() 258#define flush_cache_all() __cpuc_flush_kern_all()
259 259#ifndef CONFIG_CPU_CACHE_VIPT
260static inline void flush_cache_mm(struct mm_struct *mm) 260static inline void flush_cache_mm(struct mm_struct *mm)
261{ 261{
262 if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) 262 if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask))
@@ -279,6 +279,11 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l
279 __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); 279 __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags);
280 } 280 }
281} 281}
282#else
283extern void flush_cache_mm(struct mm_struct *mm);
284extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
285extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn);
286#endif
282 287
283/* 288/*
284 * flush_cache_user_range is used when we want to ensure that the 289 * flush_cache_user_range is used when we want to ensure that the
diff --git a/include/asm-arm/pci.h b/include/asm-arm/pci.h
index 38ea5899a580..ead3ced38cb8 100644
--- a/include/asm-arm/pci.h
+++ b/include/asm-arm/pci.h
@@ -64,6 +64,19 @@ extern void
64pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 64pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
65 struct pci_bus_region *region); 65 struct pci_bus_region *region);
66 66
67static inline struct resource *
68pcibios_select_root(struct pci_dev *pdev, struct resource *res)
69{
70 struct resource *root = NULL;
71
72 if (res->flags & IORESOURCE_IO)
73 root = &ioport_resource;
74 if (res->flags & IORESOURCE_MEM)
75 root = &iomem_resource;
76
77 return root;
78}
79
67static inline void pcibios_add_platform_entries(struct pci_dev *dev) 80static inline void pcibios_add_platform_entries(struct pci_dev *dev)
68{ 81{
69} 82}
diff --git a/include/asm-generic/pci.h b/include/asm-generic/pci.h
index ee1d8b5d8168..c36a77d3bf44 100644
--- a/include/asm-generic/pci.h
+++ b/include/asm-generic/pci.h
@@ -30,6 +30,19 @@ pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
30 res->end = region->end; 30 res->end = region->end;
31} 31}
32 32
33static inline struct resource *
34pcibios_select_root(struct pci_dev *pdev, struct resource *res)
35{
36 struct resource *root = NULL;
37
38 if (res->flags & IORESOURCE_IO)
39 root = &ioport_resource;
40 if (res->flags & IORESOURCE_MEM)
41 root = &iomem_resource;
42
43 return root;
44}
45
33#define pcibios_scan_all_fns(a, b) 0 46#define pcibios_scan_all_fns(a, b) 0
34 47
35#ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ 48#ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ
diff --git a/include/asm-ia64/iosapic.h b/include/asm-ia64/iosapic.h
index a429fe225b07..20f98f1751a1 100644
--- a/include/asm-ia64/iosapic.h
+++ b/include/asm-ia64/iosapic.h
@@ -80,12 +80,9 @@ extern int iosapic_remove (unsigned int gsi_base);
80#endif /* CONFIG_HOTPLUG */ 80#endif /* CONFIG_HOTPLUG */
81extern int gsi_to_vector (unsigned int gsi); 81extern int gsi_to_vector (unsigned int gsi);
82extern int gsi_to_irq (unsigned int gsi); 82extern int gsi_to_irq (unsigned int gsi);
83extern void iosapic_enable_intr (unsigned int vector);
84extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, 83extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
85 unsigned long trigger); 84 unsigned long trigger);
86#ifdef CONFIG_ACPI_DEALLOCATE_IRQ
87extern void iosapic_unregister_intr (unsigned int irq); 85extern void iosapic_unregister_intr (unsigned int irq);
88#endif
89extern void __init iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, 86extern void __init iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
90 unsigned long polarity, 87 unsigned long polarity,
91 unsigned long trigger); 88 unsigned long trigger);
@@ -97,7 +94,6 @@ extern int __init iosapic_register_platform_intr (u32 int_type,
97 unsigned long trigger); 94 unsigned long trigger);
98extern unsigned int iosapic_version (char __iomem *addr); 95extern unsigned int iosapic_version (char __iomem *addr);
99 96
100extern void iosapic_pci_fixup (int);
101#ifdef CONFIG_NUMA 97#ifdef CONFIG_NUMA
102extern void __devinit map_iosapic_to_node (unsigned int, int); 98extern void __devinit map_iosapic_to_node (unsigned int, int);
103#endif 99#endif
diff --git a/include/asm-ia64/irq.h b/include/asm-ia64/irq.h
index cd984d08fd15..dbe86c0bbce5 100644
--- a/include/asm-ia64/irq.h
+++ b/include/asm-ia64/irq.h
@@ -35,8 +35,4 @@ extern void disable_irq_nosync (unsigned int);
35extern void enable_irq (unsigned int); 35extern void enable_irq (unsigned int);
36extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); 36extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
37 37
38struct irqaction;
39struct pt_regs;
40int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
41
42#endif /* _ASM_IA64_IRQ_H */ 38#endif /* _ASM_IA64_IRQ_H */
diff --git a/include/asm-ia64/pci.h b/include/asm-ia64/pci.h
index dba9f220be71..ef616fd4cb1b 100644
--- a/include/asm-ia64/pci.h
+++ b/include/asm-ia64/pci.h
@@ -156,6 +156,19 @@ extern void pcibios_resource_to_bus(struct pci_dev *dev,
156extern void pcibios_bus_to_resource(struct pci_dev *dev, 156extern void pcibios_bus_to_resource(struct pci_dev *dev,
157 struct resource *res, struct pci_bus_region *region); 157 struct resource *res, struct pci_bus_region *region);
158 158
159static inline struct resource *
160pcibios_select_root(struct pci_dev *pdev, struct resource *res)
161{
162 struct resource *root = NULL;
163
164 if (res->flags & IORESOURCE_IO)
165 root = &ioport_resource;
166 if (res->flags & IORESOURCE_MEM)
167 root = &iomem_resource;
168
169 return root;
170}
171
159#define pcibios_scan_all_fns(a, b) 0 172#define pcibios_scan_all_fns(a, b) 0
160 173
161#endif /* _ASM_IA64_PCI_H */ 174#endif /* _ASM_IA64_PCI_H */
diff --git a/include/asm-m68knommu/coldfire.h b/include/asm-m68knommu/coldfire.h
index 16f32cc80c40..1df3f666a28e 100644
--- a/include/asm-m68knommu/coldfire.h
+++ b/include/asm-m68knommu/coldfire.h
@@ -22,7 +22,7 @@
22#define MCF_MBAR2 0x80000000 22#define MCF_MBAR2 0x80000000
23#define MCF_IPSBAR 0x40000000 23#define MCF_IPSBAR 0x40000000
24 24
25#if defined(CONFIG_M527x) || defined(CONFIG_M528x) 25#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x)
26#undef MCF_MBAR 26#undef MCF_MBAR
27#define MCF_MBAR MCF_IPSBAR 27#define MCF_MBAR MCF_IPSBAR
28#endif 28#endif
@@ -54,6 +54,8 @@
54#define MCF_CLK 54000000 54#define MCF_CLK 54000000
55#elif defined(CONFIG_CLOCK_60MHz) 55#elif defined(CONFIG_CLOCK_60MHz)
56#define MCF_CLK 60000000 56#define MCF_CLK 60000000
57#elif defined(CONFIG_CLOCK_62_5MHz)
58#define MCF_CLK 62500000
57#elif defined(CONFIG_CLOCK_64MHz) 59#elif defined(CONFIG_CLOCK_64MHz)
58#define MCF_CLK 64000000 60#define MCF_CLK 64000000
59#elif defined(CONFIG_CLOCK_66MHz) 61#elif defined(CONFIG_CLOCK_66MHz)
@@ -76,7 +78,7 @@
76 * One some ColdFire family members the bus clock (used by internal 78 * One some ColdFire family members the bus clock (used by internal
77 * peripherals) is not the same as the CPU clock. 79 * peripherals) is not the same as the CPU clock.
78 */ 80 */
79#if defined(CONFIG_M5249) || defined(CONFIG_M527x) 81#if defined(CONFIG_M523x) || defined(CONFIG_M5249) || defined(CONFIG_M527x)
80#define MCF_BUSCLK (MCF_CLK / 2) 82#define MCF_BUSCLK (MCF_CLK / 2)
81#else 83#else
82#define MCF_BUSCLK MCF_CLK 84#define MCF_BUSCLK MCF_CLK
diff --git a/include/asm-m68knommu/m523xsim.h b/include/asm-m68knommu/m523xsim.h
new file mode 100644
index 000000000000..926cfb805df7
--- /dev/null
+++ b/include/asm-m68knommu/m523xsim.h
@@ -0,0 +1,46 @@
1/****************************************************************************/
2
3/*
4 * m523xsim.h -- ColdFire 523x System Integration Module support.
5 *
6 * (C) Copyright 2003-2005, Greg Ungerer <gerg@snapgear.com>
7 */
8
9/****************************************************************************/
10#ifndef m523xsim_h
11#define m523xsim_h
12/****************************************************************************/
13
14#include <linux/config.h>
15
16/*
17 * Define the 523x SIM register set addresses.
18 */
19#define MCFICM_INTC0 0x0c00 /* Base for Interrupt Ctrl 0 */
20#define MCFICM_INTC1 0x0d00 /* Base for Interrupt Ctrl 0 */
21#define MCFINTC_IPRH 0x00 /* Interrupt pending 32-63 */
22#define MCFINTC_IPRL 0x04 /* Interrupt pending 1-31 */
23#define MCFINTC_IMRH 0x08 /* Interrupt mask 32-63 */
24#define MCFINTC_IMRL 0x0c /* Interrupt mask 1-31 */
25#define MCFINTC_INTFRCH 0x10 /* Interrupt force 32-63 */
26#define MCFINTC_INTFRCL 0x14 /* Interrupt force 1-31 */
27#define MCFINTC_IRLR 0x18 /* */
28#define MCFINTC_IACKL 0x19 /* */
29#define MCFINTC_ICR0 0x40 /* Base ICR register */
30
31#define MCFINT_VECBASE 64 /* Vector base number */
32#define MCFINT_UART0 13 /* Interrupt number for UART0 */
33#define MCFINT_PIT1 36 /* Interrupt number for PIT1 */
34#define MCFINT_QSPI 18 /* Interrupt number for QSPI */
35
36/*
37 * SDRAM configuration registers.
38 */
39#define MCFSIM_DCR 0x44 /* SDRAM control */
40#define MCFSIM_DACR0 0x48 /* SDRAM base address 0 */
41#define MCFSIM_DMR0 0x4c /* SDRAM address mask 0 */
42#define MCFSIM_DACR1 0x50 /* SDRAM base address 1 */
43#define MCFSIM_DMR1 0x54 /* SDRAM address mask 1 */
44
45/****************************************************************************/
46#endif /* m523xsim_h */
diff --git a/include/asm-m68knommu/mcfsim.h b/include/asm-m68knommu/mcfsim.h
index 522e513c2bc6..b0c7736f7a99 100644
--- a/include/asm-m68knommu/mcfsim.h
+++ b/include/asm-m68knommu/mcfsim.h
@@ -15,13 +15,15 @@
15#include <linux/config.h> 15#include <linux/config.h>
16 16
17/* 17/*
18 * Include 5204, 5206/e, 5249, 5270/5271, 5272, 5280/5282, 5307 or 18 * Include 5204, 5206/e, 5235, 5249, 5270/5271, 5272, 5280/5282,
19 * 5407 specific addresses. 19 * 5307 or 5407 specific addresses.
20 */ 20 */
21#if defined(CONFIG_M5204) 21#if defined(CONFIG_M5204)
22#include <asm/m5204sim.h> 22#include <asm/m5204sim.h>
23#elif defined(CONFIG_M5206) || defined(CONFIG_M5206e) 23#elif defined(CONFIG_M5206) || defined(CONFIG_M5206e)
24#include <asm/m5206sim.h> 24#include <asm/m5206sim.h>
25#elif defined(CONFIG_M523x)
26#include <asm/m523xsim.h>
25#elif defined(CONFIG_M5249) 27#elif defined(CONFIG_M5249)
26#include <asm/m5249sim.h> 28#include <asm/m5249sim.h>
27#elif defined(CONFIG_M527x) 29#elif defined(CONFIG_M527x)
diff --git a/include/asm-m68knommu/mcfuart.h b/include/asm-m68knommu/mcfuart.h
index 54d4a85f4fdf..9c1210613bc7 100644
--- a/include/asm-m68knommu/mcfuart.h
+++ b/include/asm-m68knommu/mcfuart.h
@@ -29,7 +29,7 @@
29#define MCFUART_BASE1 0x140 /* Base address of UART1 */ 29#define MCFUART_BASE1 0x140 /* Base address of UART1 */
30#define MCFUART_BASE2 0x180 /* Base address of UART2 */ 30#define MCFUART_BASE2 0x180 /* Base address of UART2 */
31#endif 31#endif
32#elif defined(CONFIG_M527x) || defined(CONFIG_M528x) 32#elif defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x)
33#define MCFUART_BASE1 0x200 /* Base address of UART1 */ 33#define MCFUART_BASE1 0x200 /* Base address of UART1 */
34#define MCFUART_BASE2 0x240 /* Base address of UART2 */ 34#define MCFUART_BASE2 0x240 /* Base address of UART2 */
35#define MCFUART_BASE3 0x280 /* Base address of UART3 */ 35#define MCFUART_BASE3 0x280 /* Base address of UART3 */
diff --git a/include/asm-parisc/pci.h b/include/asm-parisc/pci.h
index 98d79a3d54fa..d0b761f690b5 100644
--- a/include/asm-parisc/pci.h
+++ b/include/asm-parisc/pci.h
@@ -257,6 +257,19 @@ extern void
257pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 257pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
258 struct pci_bus_region *region); 258 struct pci_bus_region *region);
259 259
260static inline struct resource *
261pcibios_select_root(struct pci_dev *pdev, struct resource *res)
262{
263 struct resource *root = NULL;
264
265 if (res->flags & IORESOURCE_IO)
266 root = &ioport_resource;
267 if (res->flags & IORESOURCE_MEM)
268 root = &iomem_resource;
269
270 return root;
271}
272
260static inline void pcibios_add_platform_entries(struct pci_dev *dev) 273static inline void pcibios_add_platform_entries(struct pci_dev *dev)
261{ 274{
262} 275}
diff --git a/include/asm-powerpc/8253pit.h b/include/asm-powerpc/8253pit.h
index 862708a749b0..b70d6e53b303 100644
--- a/include/asm-powerpc/8253pit.h
+++ b/include/asm-powerpc/8253pit.h
@@ -1,10 +1,10 @@
1#ifndef _ASM_POWERPC_8253PIT_H
2#define _ASM_POWERPC_8253PIT_H
3
1/* 4/*
2 * 8253/8254 Programmable Interval Timer 5 * 8253/8254 Programmable Interval Timer
3 */ 6 */
4 7
5#ifndef _8253PIT_H
6#define _8253PIT_H
7
8#define PIT_TICK_RATE 1193182UL 8#define PIT_TICK_RATE 1193182UL
9 9
10#endif 10#endif /* _ASM_POWERPC_8253PIT_H */
diff --git a/include/asm-powerpc/agp.h b/include/asm-powerpc/agp.h
index ca9e423307f4..885b4631a6cf 100644
--- a/include/asm-powerpc/agp.h
+++ b/include/asm-powerpc/agp.h
@@ -1,10 +1,8 @@
1#ifndef AGP_H 1#ifndef _ASM_POWERPC_AGP_H
2#define AGP_H 1 2#define _ASM_POWERPC_AGP_H
3 3
4#include <asm/io.h> 4#include <asm/io.h>
5 5
6/* nothing much needed here */
7
8#define map_page_into_agp(page) 6#define map_page_into_agp(page)
9#define unmap_page_from_agp(page) 7#define unmap_page_from_agp(page)
10#define flush_agp_mappings() 8#define flush_agp_mappings()
@@ -20,4 +18,4 @@
20#define free_gatt_pages(table, order) \ 18#define free_gatt_pages(table, order) \
21 free_pages((unsigned long)(table), (order)) 19 free_pages((unsigned long)(table), (order))
22 20
23#endif 21#endif /* _ASM_POWERPC_AGP_H */
diff --git a/include/asm-powerpc/bugs.h b/include/asm-powerpc/bugs.h
index 310187d0e33a..42fdb73e3068 100644
--- a/include/asm-powerpc/bugs.h
+++ b/include/asm-powerpc/bugs.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_BUGS_H 1#ifndef _ASM_POWERPC_BUGS_H
2#define _POWERPC_BUGS_H 2#define _ASM_POWERPC_BUGS_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -13,6 +13,6 @@
13 * architecture-dependent bugs. 13 * architecture-dependent bugs.
14 */ 14 */
15 15
16extern void check_bugs(void); 16static inline void check_bugs(void) { }
17 17
18#endif /* _POWERPC_BUGS_H */ 18#endif /* _ASM_POWERPC_BUGS_H */
diff --git a/include/asm-powerpc/errno.h b/include/asm-powerpc/errno.h
index 19f20bd41ae6..8c145fd17d86 100644
--- a/include/asm-powerpc/errno.h
+++ b/include/asm-powerpc/errno.h
@@ -1,5 +1,5 @@
1#ifndef _PPC_ERRNO_H 1#ifndef _ASM_POWERPC_ERRNO_H
2#define _PPC_ERRNO_H 2#define _ASM_POWERPC_ERRNO_H
3 3
4#include <asm-generic/errno.h> 4#include <asm-generic/errno.h>
5 5
@@ -8,4 +8,4 @@
8 8
9#define _LAST_ERRNO 516 9#define _LAST_ERRNO 516
10 10
11#endif 11#endif /* _ASM_POWERPC_ERRNO_H */
diff --git a/include/asm-powerpc/ioctl.h b/include/asm-powerpc/ioctl.h
index 93c6acfdd0fd..8eb99848c402 100644
--- a/include/asm-powerpc/ioctl.h
+++ b/include/asm-powerpc/ioctl.h
@@ -1,5 +1,5 @@
1#ifndef _PPC_IOCTL_H 1#ifndef _ASM_POWERPC_IOCTL_H
2#define _PPC_IOCTL_H 2#define _ASM_POWERPC_IOCTL_H
3 3
4 4
5/* 5/*
@@ -66,4 +66,4 @@ extern unsigned int __invalid_size_argument_for_IOC;
66#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) 66#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
67#define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 67#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
68 68
69#endif 69#endif /* _ASM_POWERPC_IOCTL_H */
diff --git a/include/asm-powerpc/ioctls.h b/include/asm-powerpc/ioctls.h
index f5b7f2b055e7..5b94ff489b8b 100644
--- a/include/asm-powerpc/ioctls.h
+++ b/include/asm-powerpc/ioctls.h
@@ -1,5 +1,5 @@
1#ifndef _ASM_PPC_IOCTLS_H 1#ifndef _ASM_POWERPC_IOCTLS_H
2#define _ASM_PPC_IOCTLS_H 2#define _ASM_POWERPC_IOCTLS_H
3 3
4#include <asm/ioctl.h> 4#include <asm/ioctl.h>
5 5
@@ -104,4 +104,4 @@
104#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ 104#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */
105#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ 105#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */
106 106
107#endif /* _ASM_PPC_IOCTLS_H */ 107#endif /* _ASM_POWERPC_IOCTLS_H */
diff --git a/include/asm-powerpc/linkage.h b/include/asm-powerpc/linkage.h
index 291c2d01c44f..e1c4ac1cc4ba 100644
--- a/include/asm-powerpc/linkage.h
+++ b/include/asm-powerpc/linkage.h
@@ -1,6 +1,6 @@
1#ifndef __ASM_LINKAGE_H 1#ifndef _ASM_POWERPC_LINKAGE_H
2#define __ASM_LINKAGE_H 2#define _ASM_POWERPC_LINKAGE_H
3 3
4/* Nothing to see here... */ 4/* Nothing to see here... */
5 5
6#endif 6#endif /* _ASM_POWERPC_LINKAGE_H */
diff --git a/include/asm-powerpc/mc146818rtc.h b/include/asm-powerpc/mc146818rtc.h
index a5619a2a1393..f2741c8b59a1 100644
--- a/include/asm-powerpc/mc146818rtc.h
+++ b/include/asm-powerpc/mc146818rtc.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_MC146818RTC_H 1#ifndef _ASM_POWERPC_MC146818RTC_H
2#define _POWERPC_MC146818RTC_H 2#define _ASM_POWERPC_MC146818RTC_H
3 3
4/* 4/*
5 * Machine dependent access functions for RTC registers. 5 * Machine dependent access functions for RTC registers.
@@ -33,4 +33,4 @@ outb_p((val),RTC_PORT(1)); \
33}) 33})
34 34
35#endif /* __KERNEL__ */ 35#endif /* __KERNEL__ */
36#endif /* _POWERPC_MC146818RTC_H */ 36#endif /* _ASM_POWERPC_MC146818RTC_H */
diff --git a/include/asm-powerpc/mman.h b/include/asm-powerpc/mman.h
index f2d55988d749..f5e5342fcac5 100644
--- a/include/asm-powerpc/mman.h
+++ b/include/asm-powerpc/mman.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_MMAN_H 1#ifndef _ASM_POWERPC_MMAN_H
2#define _POWERPC_MMAN_H 2#define _ASM_POWERPC_MMAN_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -49,4 +49,4 @@
49#define MAP_ANON MAP_ANONYMOUS 49#define MAP_ANON MAP_ANONYMOUS
50#define MAP_FILE 0 50#define MAP_FILE 0
51 51
52#endif /* _POWERPC_MMAN_H */ 52#endif /* _ASM_POWERPC_MMAN_H */
diff --git a/include/asm-powerpc/module.h b/include/asm-powerpc/module.h
index 4438f4fd6524..7ecd05e03051 100644
--- a/include/asm-powerpc/module.h
+++ b/include/asm-powerpc/module.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_MODULE_H 1#ifndef _ASM_POWERPC_MODULE_H
2#define _POWERPC_MODULE_H 2#define _ASM_POWERPC_MODULE_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -74,4 +74,4 @@ struct exception_table_entry;
74void sort_ex_table(struct exception_table_entry *start, 74void sort_ex_table(struct exception_table_entry *start,
75 struct exception_table_entry *finish); 75 struct exception_table_entry *finish);
76 76
77#endif /* _POWERPC_MODULE_H */ 77#endif /* _ASM_POWERPC_MODULE_H */
diff --git a/include/asm-ppc/msgbuf.h b/include/asm-powerpc/msgbuf.h
index 1053452a9376..dd76743c7537 100644
--- a/include/asm-ppc/msgbuf.h
+++ b/include/asm-powerpc/msgbuf.h
@@ -1,17 +1,25 @@
1#ifndef _PPC_MSGBUF_H 1#ifndef _ASM_POWERPC_MSGBUF_H
2#define _PPC_MSGBUF_H 2#define _ASM_POWERPC_MSGBUF_H
3 3
4/* 4/*
5 * The msqid64_ds structure for the PPC architecture. 5 * The msqid64_ds structure for the PowerPC architecture.
6 * Note extra padding because this structure is passed back and forth
7 * between kernel and user space.
6 */ 8 */
7 9
8struct msqid64_ds { 10struct msqid64_ds {
9 struct ipc64_perm msg_perm; 11 struct ipc64_perm msg_perm;
12#ifndef __powerpc64__
10 unsigned int __unused1; 13 unsigned int __unused1;
14#endif
11 __kernel_time_t msg_stime; /* last msgsnd time */ 15 __kernel_time_t msg_stime; /* last msgsnd time */
16#ifndef __powerpc64__
12 unsigned int __unused2; 17 unsigned int __unused2;
18#endif
13 __kernel_time_t msg_rtime; /* last msgrcv time */ 19 __kernel_time_t msg_rtime; /* last msgrcv time */
20#ifndef __powerpc64__
14 unsigned int __unused3; 21 unsigned int __unused3;
22#endif
15 __kernel_time_t msg_ctime; /* last change time */ 23 __kernel_time_t msg_ctime; /* last change time */
16 unsigned long msg_cbytes; /* current number of bytes on queue */ 24 unsigned long msg_cbytes; /* current number of bytes on queue */
17 unsigned long msg_qnum; /* number of messages in queue */ 25 unsigned long msg_qnum; /* number of messages in queue */
@@ -22,4 +30,4 @@ struct msqid64_ds {
22 unsigned long __unused5; 30 unsigned long __unused5;
23}; 31};
24 32
25#endif /* _PPC_MSGBUF_H */ 33#endif /* _ASM_POWERPC_MSGBUF_H */
diff --git a/include/asm-powerpc/namei.h b/include/asm-powerpc/namei.h
index 29c9ec832133..657443474a6a 100644
--- a/include/asm-powerpc/namei.h
+++ b/include/asm-powerpc/namei.h
@@ -1,14 +1,14 @@
1#ifndef _ASM_POWERPC_NAMEI_H
2#define _ASM_POWERPC_NAMEI_H
3
4#ifdef __KERNEL__
5
1/* 6/*
2 * include/asm-ppc/namei.h
3 * Adapted from include/asm-alpha/namei.h 7 * Adapted from include/asm-alpha/namei.h
4 * 8 *
5 * Included from fs/namei.c 9 * Included from fs/namei.c
6 */ 10 */
7 11
8#ifdef __KERNEL__
9#ifndef __PPC_NAMEI_H
10#define __PPC_NAMEI_H
11
12/* This dummy routine maybe changed to something useful 12/* This dummy routine maybe changed to something useful
13 * for /usr/gnemul/ emulation stuff. 13 * for /usr/gnemul/ emulation stuff.
14 * Look at asm-sparc/namei.h for details. 14 * Look at asm-sparc/namei.h for details.
@@ -16,5 +16,5 @@
16 16
17#define __emul_prefix() NULL 17#define __emul_prefix() NULL
18 18
19#endif /* __PPC_NAMEI_H */ 19#endif /* __KERNEL__ */
20#endif /* __KERNEL__ */ 20#endif /* _ASM_POWERPC_NAMEI_H */
diff --git a/include/asm-ppc/param.h b/include/asm-powerpc/param.h
index 6198b1657a45..bdc724f70884 100644
--- a/include/asm-ppc/param.h
+++ b/include/asm-powerpc/param.h
@@ -1,10 +1,10 @@
1#ifndef _ASM_PPC_PARAM_H 1#ifndef _ASM_POWERPC_PARAM_H
2#define _ASM_PPC_PARAM_H 2#define _ASM_POWERPC_PARAM_H
3 3
4#include <linux/config.h> 4#include <linux/config.h>
5 5
6#ifdef __KERNEL__ 6#ifdef __KERNEL__
7#define HZ CONFIG_HZ /* internal timer frequency */ 7#define HZ CONFIG_HZ /* internal kernel timer frequency */
8#define USER_HZ 100 /* for user interfaces in "ticks" */ 8#define USER_HZ 100 /* for user interfaces in "ticks" */
9#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */ 9#define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */
10#endif /* __KERNEL__ */ 10#endif /* __KERNEL__ */
@@ -21,4 +21,4 @@
21 21
22#define MAXHOSTNAMELEN 64 /* max length of hostname */ 22#define MAXHOSTNAMELEN 64 /* max length of hostname */
23 23
24#endif 24#endif /* _ASM_POWERPC_PARAM_H */
diff --git a/include/asm-powerpc/poll.h b/include/asm-powerpc/poll.h
index be5024913c62..edd2054da86b 100644
--- a/include/asm-powerpc/poll.h
+++ b/include/asm-powerpc/poll.h
@@ -1,5 +1,5 @@
1#ifndef __PPC_POLL_H 1#ifndef _ASM_POWERPC_POLL_H
2#define __PPC_POLL_H 2#define _ASM_POWERPC_POLL_H
3 3
4#define POLLIN 0x0001 4#define POLLIN 0x0001
5#define POLLPRI 0x0002 5#define POLLPRI 0x0002
@@ -20,4 +20,4 @@ struct pollfd {
20 short revents; 20 short revents;
21}; 21};
22 22
23#endif 23#endif /* _ASM_POWERPC_POLL_H */
diff --git a/include/asm-powerpc/sembuf.h b/include/asm-powerpc/sembuf.h
index c98fc18fe805..99a41938ae3d 100644
--- a/include/asm-powerpc/sembuf.h
+++ b/include/asm-powerpc/sembuf.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_SEMBUF_H 1#ifndef _ASM_POWERPC_SEMBUF_H
2#define _POWERPC_SEMBUF_H 2#define _ASM_POWERPC_SEMBUF_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -33,4 +33,4 @@ struct semid64_ds {
33 unsigned long __unused4; 33 unsigned long __unused4;
34}; 34};
35 35
36#endif /* _POWERPC_SEMBUF_H */ 36#endif /* _ASM_POWERPC_SEMBUF_H */
diff --git a/include/asm-powerpc/setup.h b/include/asm-powerpc/setup.h
new file mode 100644
index 000000000000..3d9740aae018
--- /dev/null
+++ b/include/asm-powerpc/setup.h
@@ -0,0 +1,9 @@
1#ifndef _ASM_POWERPC_SETUP_H
2#define _ASM_POWERPC_SETUP_H
3
4#ifdef __KERNEL__
5
6#define COMMAND_LINE_SIZE 512
7
8#endif /* __KERNEL__ */
9#endif /* _ASM_POWERPC_SETUP_H */
diff --git a/include/asm-powerpc/shmbuf.h b/include/asm-powerpc/shmbuf.h
index 29632db3b178..8efa39698b6c 100644
--- a/include/asm-powerpc/shmbuf.h
+++ b/include/asm-powerpc/shmbuf.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_SHMBUF_H 1#ifndef _ASM_POWERPC_SHMBUF_H
2#define _POWERPC_SHMBUF_H 2#define _ASM_POWERPC_SHMBUF_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -21,19 +21,19 @@
21 21
22struct shmid64_ds { 22struct shmid64_ds {
23 struct ipc64_perm shm_perm; /* operation perms */ 23 struct ipc64_perm shm_perm; /* operation perms */
24#ifndef __power64__ 24#ifndef __powerpc64__
25 unsigned long __unused1; 25 unsigned long __unused1;
26#endif 26#endif
27 __kernel_time_t shm_atime; /* last attach time */ 27 __kernel_time_t shm_atime; /* last attach time */
28#ifndef __power64__ 28#ifndef __powerpc64__
29 unsigned long __unused2; 29 unsigned long __unused2;
30#endif 30#endif
31 __kernel_time_t shm_dtime; /* last detach time */ 31 __kernel_time_t shm_dtime; /* last detach time */
32#ifndef __power64__ 32#ifndef __powerpc64__
33 unsigned long __unused3; 33 unsigned long __unused3;
34#endif 34#endif
35 __kernel_time_t shm_ctime; /* last change time */ 35 __kernel_time_t shm_ctime; /* last change time */
36#ifndef __power64__ 36#ifndef __powerpc64__
37 unsigned long __unused4; 37 unsigned long __unused4;
38#endif 38#endif
39 size_t shm_segsz; /* size of segment (bytes) */ 39 size_t shm_segsz; /* size of segment (bytes) */
@@ -56,4 +56,4 @@ struct shminfo64 {
56 unsigned long __unused4; 56 unsigned long __unused4;
57}; 57};
58 58
59#endif /* _POWERPC_SHMBUF_H */ 59#endif /* _ASM_POWERPC_SHMBUF_H */
diff --git a/include/asm-powerpc/shmparam.h b/include/asm-powerpc/shmparam.h
index d6250602ae64..5cda42a6d39e 100644
--- a/include/asm-powerpc/shmparam.h
+++ b/include/asm-powerpc/shmparam.h
@@ -1,6 +1,6 @@
1#ifndef _PPC_SHMPARAM_H 1#ifndef _ASM_POWERPC_SHMPARAM_H
2#define _PPC_SHMPARAM_H 2#define _ASM_POWERPC_SHMPARAM_H
3 3
4#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ 4#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */
5 5
6#endif /* _PPC_SHMPARAM_H */ 6#endif /* _ASM_POWERPC_SHMPARAM_H */
diff --git a/include/asm-powerpc/siginfo.h b/include/asm-powerpc/siginfo.h
index ae70b8010b19..538ea8ef509b 100644
--- a/include/asm-powerpc/siginfo.h
+++ b/include/asm-powerpc/siginfo.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_SIGINFO_H 1#ifndef _ASM_POWERPC_SIGINFO_H
2#define _POWERPC_SIGINFO_H 2#define _ASM_POWERPC_SIGINFO_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -15,4 +15,4 @@
15 15
16#include <asm-generic/siginfo.h> 16#include <asm-generic/siginfo.h>
17 17
18#endif /* _POWERPC_SIGINFO_H */ 18#endif /* _ASM_POWERPC_SIGINFO_H */
diff --git a/include/asm-powerpc/socket.h b/include/asm-powerpc/socket.h
index 51a0cf5ee9f0..e4b8177d4acc 100644
--- a/include/asm-powerpc/socket.h
+++ b/include/asm-powerpc/socket.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_SOCKET_H 1#ifndef _ASM_POWERPC_SOCKET_H
2#define _POWERPC_SOCKET_H 2#define _ASM_POWERPC_SOCKET_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -56,4 +56,4 @@
56 56
57#define SO_PEERSEC 31 57#define SO_PEERSEC 31
58 58
59#endif /* _POWERPC_SOCKET_H */ 59#endif /* _ASM_POWERPC_SOCKET_H */
diff --git a/include/asm-powerpc/sockios.h b/include/asm-powerpc/sockios.h
index ef7ff664167e..590078d8ed28 100644
--- a/include/asm-powerpc/sockios.h
+++ b/include/asm-powerpc/sockios.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_SOCKIOS_H 1#ifndef _ASM_POWERPC_SOCKIOS_H
2#define _POWERPC_SOCKIOS_H 2#define _ASM_POWERPC_SOCKIOS_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -16,4 +16,4 @@
16#define SIOCATMARK 0x8905 16#define SIOCATMARK 0x8905
17#define SIOCGSTAMP 0x8906 /* Get stamp */ 17#define SIOCGSTAMP 0x8906 /* Get stamp */
18 18
19#endif /* _POWERPC_SOCKIOS_H */ 19#endif /* _ASM_POWERPC_SOCKIOS_H */
diff --git a/include/asm-powerpc/string.h b/include/asm-powerpc/string.h
index 225575997392..8606a696c088 100644
--- a/include/asm-powerpc/string.h
+++ b/include/asm-powerpc/string.h
@@ -1,5 +1,5 @@
1#ifndef _PPC_STRING_H_ 1#ifndef _ASM_POWERPC_STRING_H
2#define _PPC_STRING_H_ 2#define _ASM_POWERPC_STRING_H
3 3
4#ifdef __KERNEL__ 4#ifdef __KERNEL__
5 5
@@ -29,4 +29,4 @@ extern void * memchr(const void *,int,__kernel_size_t);
29 29
30#endif /* __KERNEL__ */ 30#endif /* __KERNEL__ */
31 31
32#endif 32#endif /* _ASM_POWERPC_STRING_H */
diff --git a/include/asm-powerpc/termbits.h b/include/asm-powerpc/termbits.h
index 2c5bf85a8c3c..ebf6055481dc 100644
--- a/include/asm-powerpc/termbits.h
+++ b/include/asm-powerpc/termbits.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_TERMBITS_H 1#ifndef _ASM_POWERPC_TERMBITS_H
2#define _POWERPC_TERMBITS_H 2#define _ASM_POWERPC_TERMBITS_H
3 3
4/* 4/*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -188,4 +188,4 @@ struct termios {
188#define TCSADRAIN 1 188#define TCSADRAIN 1
189#define TCSAFLUSH 2 189#define TCSAFLUSH 2
190 190
191#endif /* _POWERPC_TERMBITS_H */ 191#endif /* _ASM_POWERPC_TERMBITS_H */
diff --git a/include/asm-powerpc/termios.h b/include/asm-powerpc/termios.h
index 237533bb0e9f..c5b8e5358f83 100644
--- a/include/asm-powerpc/termios.h
+++ b/include/asm-powerpc/termios.h
@@ -1,5 +1,5 @@
1#ifndef _POWERPC_TERMIOS_H 1#ifndef _ASM_POWERPC_TERMIOS_H
2#define _POWERPC_TERMIOS_H 2#define _ASM_POWERPC_TERMIOS_H
3 3
4/* 4/*
5 * Liberally adapted from alpha/termios.h. In particular, the c_cc[] 5 * Liberally adapted from alpha/termios.h. In particular, the c_cc[]
@@ -233,4 +233,4 @@ struct termio {
233 233
234#endif /* __KERNEL__ */ 234#endif /* __KERNEL__ */
235 235
236#endif /* _POWERPC_TERMIOS_H */ 236#endif /* _ASM_POWERPC_TERMIOS_H */
diff --git a/include/asm-ppc/timex.h b/include/asm-powerpc/timex.h
index cffc8712077c..51c5b316be55 100644
--- a/include/asm-ppc/timex.h
+++ b/include/asm-powerpc/timex.h
@@ -1,11 +1,11 @@
1#ifndef _ASM_POWERPC_TIMEX_H
2#define _ASM_POWERPC_TIMEX_H
3
4#ifdef __KERNEL__
5
1/* 6/*
2 * include/asm-ppc/timex.h 7 * PowerPC architecture timex specifications
3 *
4 * ppc architecture timex specifications
5 */ 8 */
6#ifdef __KERNEL__
7#ifndef _ASMppc_TIMEX_H
8#define _ASMppc_TIMEX_H
9 9
10#include <linux/config.h> 10#include <linux/config.h>
11#include <asm/cputable.h> 11#include <asm/cputable.h>
@@ -14,14 +14,21 @@
14 14
15typedef unsigned long cycles_t; 15typedef unsigned long cycles_t;
16 16
17/*
18 * For the "cycle" counter we use the timebase lower half.
19 * Currently only used on SMP.
20 */
21
22static inline cycles_t get_cycles(void) 17static inline cycles_t get_cycles(void)
23{ 18{
24 cycles_t ret = 0; 19 cycles_t ret;
20
21#ifdef __powerpc64__
22
23 __asm__ __volatile__("mftb %0" : "=r" (ret) : );
24
25#else
26 /*
27 * For the "cycle" counter we use the timebase lower half.
28 * Currently only used on SMP.
29 */
30
31 ret = 0;
25 32
26 __asm__ __volatile__( 33 __asm__ __volatile__(
27 "98: mftb %0\n" 34 "98: mftb %0\n"
@@ -33,8 +40,10 @@ static inline cycles_t get_cycles(void)
33 " .long 99b\n" 40 " .long 99b\n"
34 ".previous" 41 ".previous"
35 : "=r" (ret) : "i" (CPU_FTR_601)); 42 : "=r" (ret) : "i" (CPU_FTR_601));
43#endif
44
36 return ret; 45 return ret;
37} 46}
38 47
39#endif 48#endif /* __KERNEL__ */
40#endif /* __KERNEL__ */ 49#endif /* _ASM_POWERPC_TIMEX_H */
diff --git a/include/asm-ppc64/topology.h b/include/asm-powerpc/topology.h
index 1e9b19073230..2512e3836bf4 100644
--- a/include/asm-ppc64/topology.h
+++ b/include/asm-powerpc/topology.h
@@ -1,11 +1,12 @@
1#ifndef _ASM_PPC64_TOPOLOGY_H 1#ifndef _ASM_POWERPC_TOPOLOGY_H
2#define _ASM_PPC64_TOPOLOGY_H 2#define _ASM_POWERPC_TOPOLOGY_H
3 3
4#include <linux/config.h> 4#include <linux/config.h>
5#include <asm/mmzone.h>
6 5
7#ifdef CONFIG_NUMA 6#ifdef CONFIG_NUMA
8 7
8#include <asm/mmzone.h>
9
9static inline int cpu_to_node(int cpu) 10static inline int cpu_to_node(int cpu)
10{ 11{
11 int node; 12 int node;
@@ -66,4 +67,4 @@ static inline int node_to_first_cpu(int node)
66 67
67#endif /* CONFIG_NUMA */ 68#endif /* CONFIG_NUMA */
68 69
69#endif /* _ASM_PPC64_TOPOLOGY_H */ 70#endif /* _ASM_POWERPC_TOPOLOGY_H */
diff --git a/include/asm-powerpc/unaligned.h b/include/asm-powerpc/unaligned.h
index 45520d9b85d1..6c95dfa2652f 100644
--- a/include/asm-powerpc/unaligned.h
+++ b/include/asm-powerpc/unaligned.h
@@ -1,6 +1,7 @@
1#ifndef _ASM_POWERPC_UNALIGNED_H
2#define _ASM_POWERPC_UNALIGNED_H
3
1#ifdef __KERNEL__ 4#ifdef __KERNEL__
2#ifndef __PPC_UNALIGNED_H
3#define __PPC_UNALIGNED_H
4 5
5/* 6/*
6 * The PowerPC can do unaligned accesses itself in big endian mode. 7 * The PowerPC can do unaligned accesses itself in big endian mode.
@@ -14,5 +15,5 @@
14 15
15#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) )) 16#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) ))
16 17
17#endif 18#endif /* __KERNEL__ */
18#endif /* __KERNEL__ */ 19#endif /* _ASM_POWERPC_UNALIGNED_H */
diff --git a/include/asm-ppc/user.h b/include/asm-powerpc/user.h
index d662b2151370..e59ade4b3dfb 100644
--- a/include/asm-ppc/user.h
+++ b/include/asm-powerpc/user.h
@@ -1,13 +1,14 @@
1#ifdef __KERNEL__ 1#ifndef _ASM_POWERPC_USER_H
2#ifndef _PPC_USER_H 2#define _ASM_POWERPC_USER_H
3#define _PPC_USER_H
4 3
5/* Adapted from <asm-alpha/user.h> */ 4#ifdef __KERNEL__
6 5
7#include <linux/ptrace.h> 6#include <asm/ptrace.h>
8#include <asm/page.h> 7#include <asm/page.h>
9 8
10/* 9/*
10 * Adapted from <asm-alpha/user.h>
11 *
11 * Core file format: The core file is written in such a way that gdb 12 * Core file format: The core file is written in such a way that gdb
12 * can understand it and provide useful information to the user (under 13 * can understand it and provide useful information to the user (under
13 * linux we use the `trad-core' bfd, NOT the osf-core). The file contents 14 * linux we use the `trad-core' bfd, NOT the osf-core). The file contents
@@ -50,5 +51,5 @@ struct user {
50#define HOST_DATA_START_ADDR (u.start_data) 51#define HOST_DATA_START_ADDR (u.start_data)
51#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) 52#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
52 53
53#endif /* _PPC_USER_H */ 54#endif /* __KERNEL__ */
54#endif /* __KERNEL__ */ 55#endif /* _ASM_POWERPC_USER_H */
diff --git a/include/asm-ppc/pci.h b/include/asm-ppc/pci.h
index a811e440c978..9dd06cd40096 100644
--- a/include/asm-ppc/pci.h
+++ b/include/asm-ppc/pci.h
@@ -109,6 +109,19 @@ extern void
109pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 109pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
110 struct pci_bus_region *region); 110 struct pci_bus_region *region);
111 111
112static inline struct resource *
113pcibios_select_root(struct pci_dev *pdev, struct resource *res)
114{
115 struct resource *root = NULL;
116
117 if (res->flags & IORESOURCE_IO)
118 root = &ioport_resource;
119 if (res->flags & IORESOURCE_MEM)
120 root = &iomem_resource;
121
122 return root;
123}
124
112extern void pcibios_add_platform_entries(struct pci_dev *dev); 125extern void pcibios_add_platform_entries(struct pci_dev *dev);
113 126
114struct file; 127struct file;
diff --git a/include/asm-ppc/setup.h b/include/asm-ppc/setup.h
deleted file mode 100644
index d2d19ee103df..000000000000
--- a/include/asm-ppc/setup.h
+++ /dev/null
@@ -1,14 +0,0 @@
1#ifdef __KERNEL__
2#ifndef _PPC_SETUP_H
3#define _PPC_SETUP_H
4
5#define m68k_num_memory num_memory
6#define m68k_memory memory
7
8#include <asm-m68k/setup.h>
9/* We have a bigger command line buffer. */
10#undef COMMAND_LINE_SIZE
11#define COMMAND_LINE_SIZE 512
12
13#endif /* _PPC_SETUP_H */
14#endif /* __KERNEL__ */
diff --git a/include/asm-ppc/topology.h b/include/asm-ppc/topology.h
deleted file mode 100644
index 6a029bbba6e1..000000000000
--- a/include/asm-ppc/topology.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef _ASM_PPC_TOPOLOGY_H
2#define _ASM_PPC_TOPOLOGY_H
3
4#include <asm-generic/topology.h>
5
6#endif /* _ASM_PPC_TOPOLOGY_H */
diff --git a/include/asm-ppc64/eeh.h b/include/asm-ppc64/eeh.h
index 94298b106a4b..40c8eb57493e 100644
--- a/include/asm-ppc64/eeh.h
+++ b/include/asm-ppc64/eeh.h
@@ -219,23 +219,24 @@ static inline void eeh_raw_writeq(u64 val, volatile void __iomem *addr)
219static inline void eeh_memset_io(volatile void __iomem *addr, int c, 219static inline void eeh_memset_io(volatile void __iomem *addr, int c,
220 unsigned long n) 220 unsigned long n)
221{ 221{
222 void *p = (void __force *)addr;
222 u32 lc = c; 223 u32 lc = c;
223 lc |= lc << 8; 224 lc |= lc << 8;
224 lc |= lc << 16; 225 lc |= lc << 16;
225 226
226 while(n && !EEH_CHECK_ALIGN(addr, 4)) { 227 while(n && !EEH_CHECK_ALIGN(p, 4)) {
227 *((volatile u8 *)addr) = c; 228 *((volatile u8 *)p) = c;
228 addr = (void *)((unsigned long)addr + 1); 229 p++;
229 n--; 230 n--;
230 } 231 }
231 while(n >= 4) { 232 while(n >= 4) {
232 *((volatile u32 *)addr) = lc; 233 *((volatile u32 *)p) = lc;
233 addr = (void *)((unsigned long)addr + 4); 234 p += 4;
234 n -= 4; 235 n -= 4;
235 } 236 }
236 while(n) { 237 while(n) {
237 *((volatile u8 *)addr) = c; 238 *((volatile u8 *)p) = c;
238 addr = (void *)((unsigned long)addr + 1); 239 p++;
239 n--; 240 n--;
240 } 241 }
241 __asm__ __volatile__ ("sync" : : : "memory"); 242 __asm__ __volatile__ ("sync" : : : "memory");
@@ -250,22 +251,22 @@ static inline void eeh_memcpy_fromio(void *dest, const volatile void __iomem *sr
250 while(n && (!EEH_CHECK_ALIGN(vsrc, 4) || !EEH_CHECK_ALIGN(dest, 4))) { 251 while(n && (!EEH_CHECK_ALIGN(vsrc, 4) || !EEH_CHECK_ALIGN(dest, 4))) {
251 *((u8 *)dest) = *((volatile u8 *)vsrc); 252 *((u8 *)dest) = *((volatile u8 *)vsrc);
252 __asm__ __volatile__ ("eieio" : : : "memory"); 253 __asm__ __volatile__ ("eieio" : : : "memory");
253 vsrc = (void *)((unsigned long)vsrc + 1); 254 vsrc++;
254 dest = (void *)((unsigned long)dest + 1); 255 dest++;
255 n--; 256 n--;
256 } 257 }
257 while(n > 4) { 258 while(n > 4) {
258 *((u32 *)dest) = *((volatile u32 *)vsrc); 259 *((u32 *)dest) = *((volatile u32 *)vsrc);
259 __asm__ __volatile__ ("eieio" : : : "memory"); 260 __asm__ __volatile__ ("eieio" : : : "memory");
260 vsrc = (void *)((unsigned long)vsrc + 4); 261 vsrc += 4;
261 dest = (void *)((unsigned long)dest + 4); 262 dest += 4;
262 n -= 4; 263 n -= 4;
263 } 264 }
264 while(n) { 265 while(n) {
265 *((u8 *)dest) = *((volatile u8 *)vsrc); 266 *((u8 *)dest) = *((volatile u8 *)vsrc);
266 __asm__ __volatile__ ("eieio" : : : "memory"); 267 __asm__ __volatile__ ("eieio" : : : "memory");
267 vsrc = (void *)((unsigned long)vsrc + 1); 268 vsrc++;
268 dest = (void *)((unsigned long)dest + 1); 269 dest++;
269 n--; 270 n--;
270 } 271 }
271 __asm__ __volatile__ ("sync" : : : "memory"); 272 __asm__ __volatile__ ("sync" : : : "memory");
@@ -286,20 +287,20 @@ static inline void eeh_memcpy_toio(volatile void __iomem *dest, const void *src,
286 287
287 while(n && (!EEH_CHECK_ALIGN(vdest, 4) || !EEH_CHECK_ALIGN(src, 4))) { 288 while(n && (!EEH_CHECK_ALIGN(vdest, 4) || !EEH_CHECK_ALIGN(src, 4))) {
288 *((volatile u8 *)vdest) = *((u8 *)src); 289 *((volatile u8 *)vdest) = *((u8 *)src);
289 src = (void *)((unsigned long)src + 1); 290 src++;
290 vdest = (void *)((unsigned long)vdest + 1); 291 vdest++;
291 n--; 292 n--;
292 } 293 }
293 while(n > 4) { 294 while(n > 4) {
294 *((volatile u32 *)vdest) = *((volatile u32 *)src); 295 *((volatile u32 *)vdest) = *((volatile u32 *)src);
295 src = (void *)((unsigned long)src + 4); 296 src += 4;
296 vdest = (void *)((unsigned long)vdest + 4); 297 vdest += 4;
297 n-=4; 298 n-=4;
298 } 299 }
299 while(n) { 300 while(n) {
300 *((volatile u8 *)vdest) = *((u8 *)src); 301 *((volatile u8 *)vdest) = *((u8 *)src);
301 src = (void *)((unsigned long)src + 1); 302 src++;
302 vdest = (void *)((unsigned long)vdest + 1); 303 vdest++;
303 n--; 304 n--;
304 } 305 }
305 __asm__ __volatile__ ("sync" : : : "memory"); 306 __asm__ __volatile__ ("sync" : : : "memory");
diff --git a/include/asm-ppc64/io.h b/include/asm-ppc64/io.h
index aba1dfa388ba..59c958aea4db 100644
--- a/include/asm-ppc64/io.h
+++ b/include/asm-ppc64/io.h
@@ -20,10 +20,10 @@
20 20
21#include <asm-generic/iomap.h> 21#include <asm-generic/iomap.h>
22 22
23#define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 *)(p), (a), (c)) 23#define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 __iomem *)(p), (a), (c))
24#define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 *)(p), (a), (c)) 24#define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 __iomem *)(p), (a), (c))
25#define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 *)(p), (a), (c)) 25#define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 __iomem *)(p), (a), (c))
26#define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 *)(p), (a), (c)) 26#define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 __iomem *)(p), (a), (c))
27 27
28 28
29#define SIO_CONFIG_RA 0x398 29#define SIO_CONFIG_RA 0x398
@@ -71,8 +71,8 @@ extern unsigned long io_page_mask;
71 * Neither do the standard versions now, these are just here 71 * Neither do the standard versions now, these are just here
72 * for older code. 72 * for older code.
73 */ 73 */
74#define insw_ns(port, buf, ns) _insw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) 74#define insw_ns(port, buf, ns) _insw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
75#define insl_ns(port, buf, nl) _insl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) 75#define insl_ns(port, buf, nl) _insl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
76#else 76#else
77 77
78static inline unsigned char __raw_readb(const volatile void __iomem *addr) 78static inline unsigned char __raw_readb(const volatile void __iomem *addr)
@@ -136,9 +136,9 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
136#define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns)) 136#define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns))
137#define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl)) 137#define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl))
138 138
139#define outsb(port, buf, ns) _outsb((u8 *)((port)+pci_io_base), (buf), (ns)) 139#define outsb(port, buf, ns) _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns))
140#define outsw(port, buf, ns) _outsw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) 140#define outsw(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
141#define outsl(port, buf, nl) _outsl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) 141#define outsl(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
142 142
143#endif 143#endif
144 144
@@ -147,16 +147,16 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
147#define readl_relaxed(addr) readl(addr) 147#define readl_relaxed(addr) readl(addr)
148#define readq_relaxed(addr) readq(addr) 148#define readq_relaxed(addr) readq(addr)
149 149
150extern void _insb(volatile u8 *port, void *buf, int ns); 150extern void _insb(volatile u8 __iomem *port, void *buf, int ns);
151extern void _outsb(volatile u8 *port, const void *buf, int ns); 151extern void _outsb(volatile u8 __iomem *port, const void *buf, int ns);
152extern void _insw(volatile u16 *port, void *buf, int ns); 152extern void _insw(volatile u16 __iomem *port, void *buf, int ns);
153extern void _outsw(volatile u16 *port, const void *buf, int ns); 153extern void _outsw(volatile u16 __iomem *port, const void *buf, int ns);
154extern void _insl(volatile u32 *port, void *buf, int nl); 154extern void _insl(volatile u32 __iomem *port, void *buf, int nl);
155extern void _outsl(volatile u32 *port, const void *buf, int nl); 155extern void _outsl(volatile u32 __iomem *port, const void *buf, int nl);
156extern void _insw_ns(volatile u16 *port, void *buf, int ns); 156extern void _insw_ns(volatile u16 __iomem *port, void *buf, int ns);
157extern void _outsw_ns(volatile u16 *port, const void *buf, int ns); 157extern void _outsw_ns(volatile u16 __iomem *port, const void *buf, int ns);
158extern void _insl_ns(volatile u32 *port, void *buf, int nl); 158extern void _insl_ns(volatile u32 __iomem *port, void *buf, int nl);
159extern void _outsl_ns(volatile u32 *port, const void *buf, int nl); 159extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, int nl);
160 160
161#define mmiowb() 161#define mmiowb()
162 162
@@ -176,8 +176,8 @@ extern void _outsl_ns(volatile u32 *port, const void *buf, int nl);
176 * Neither do the standard versions now, these are just here 176 * Neither do the standard versions now, these are just here
177 * for older code. 177 * for older code.
178 */ 178 */
179#define outsw_ns(port, buf, ns) _outsw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) 179#define outsw_ns(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns))
180#define outsl_ns(port, buf, nl) _outsl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) 180#define outsl_ns(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl))
181 181
182 182
183#define IO_SPACE_LIMIT ~(0UL) 183#define IO_SPACE_LIMIT ~(0UL)
diff --git a/include/asm-ppc64/msgbuf.h b/include/asm-ppc64/msgbuf.h
deleted file mode 100644
index 31c1cbf133cc..000000000000
--- a/include/asm-ppc64/msgbuf.h
+++ /dev/null
@@ -1,27 +0,0 @@
1#ifndef _PPC64_MSGBUF_H
2#define _PPC64_MSGBUF_H
3
4/*
5 * The msqid64_ds structure for the PPC architecture.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
11 */
12
13struct msqid64_ds {
14 struct ipc64_perm msg_perm;
15 __kernel_time_t msg_stime; /* last msgsnd time */
16 __kernel_time_t msg_rtime; /* last msgrcv time */
17 __kernel_time_t msg_ctime; /* last change time */
18 unsigned long msg_cbytes; /* current number of bytes on queue */
19 unsigned long msg_qnum; /* number of messages in queue */
20 unsigned long msg_qbytes; /* max number of bytes on queue */
21 __kernel_pid_t msg_lspid; /* pid of last msgsnd */
22 __kernel_pid_t msg_lrpid; /* last receive pid */
23 unsigned long __unused1;
24 unsigned long __unused2;
25};
26
27#endif /* _PPC64_MSGBUF_H */
diff --git a/include/asm-ppc64/param.h b/include/asm-ppc64/param.h
deleted file mode 100644
index 76c212d475b3..000000000000
--- a/include/asm-ppc64/param.h
+++ /dev/null
@@ -1,31 +0,0 @@
1#ifndef _ASM_PPC64_PARAM_H
2#define _ASM_PPC64_PARAM_H
3
4#include <linux/config.h>
5
6/*
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
11 */
12
13#ifdef __KERNEL__
14# define HZ CONFIG_HZ /* Internal kernel timer frequency */
15# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
16# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
17#endif
18
19#ifndef HZ
20#define HZ 100
21#endif
22
23#define EXEC_PAGESIZE 4096
24
25#ifndef NOGROUP
26#define NOGROUP (-1)
27#endif
28
29#define MAXHOSTNAMELEN 64 /* max length of hostname */
30
31#endif /* _ASM_PPC64_PARAM_H */
diff --git a/include/asm-ppc64/pci-bridge.h b/include/asm-ppc64/pci-bridge.h
index c4f9023ea5ed..6b4a5b1f695e 100644
--- a/include/asm-ppc64/pci-bridge.h
+++ b/include/asm-ppc64/pci-bridge.h
@@ -48,19 +48,52 @@ struct pci_controller {
48 unsigned long dma_window_size; 48 unsigned long dma_window_size;
49}; 49};
50 50
51/*
52 * PCI stuff, for nodes representing PCI devices, pointed to
53 * by device_node->data.
54 */
55struct pci_controller;
56struct iommu_table;
57
58struct pci_dn {
59 int busno; /* for pci devices */
60 int bussubno; /* for pci devices */
61 int devfn; /* for pci devices */
62 int eeh_mode; /* See eeh.h for possible EEH_MODEs */
63 int eeh_config_addr;
64 int eeh_capable; /* from firmware */
65 int eeh_check_count; /* # times driver ignored error */
66 int eeh_freeze_count; /* # times this device froze up. */
67 int eeh_is_bridge; /* device is pci-to-pci bridge */
68
69 int pci_ext_config_space; /* for pci devices */
70 struct pci_controller *phb; /* for pci devices */
71 struct iommu_table *iommu_table; /* for phb's or bridges */
72 struct pci_dev *pcidev; /* back-pointer to the pci device */
73 struct device_node *node; /* back-pointer to the device_node */
74 u32 config_space[16]; /* saved PCI config space */
75};
76
77/* Get the pointer to a device_node's pci_dn */
78#define PCI_DN(dn) ((struct pci_dn *) (dn)->data)
79
51struct device_node *fetch_dev_dn(struct pci_dev *dev); 80struct device_node *fetch_dev_dn(struct pci_dev *dev);
52 81
53/* Get a device_node from a pci_dev. This code must be fast except in the case 82/* Get a device_node from a pci_dev. This code must be fast except
54 * where the sysdata is incorrect and needs to be fixed up (hopefully just once) 83 * in the case where the sysdata is incorrect and needs to be fixed
84 * up (this will only happen once).
85 * In this case the sysdata will have been inherited from a PCI host
86 * bridge or a PCI-PCI bridge further up the tree, so it will point
87 * to a valid struct pci_dn, just not the one we want.
55 */ 88 */
56static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) 89static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
57{ 90{
58 struct device_node *dn = dev->sysdata; 91 struct device_node *dn = dev->sysdata;
92 struct pci_dn *pdn = dn->data;
59 93
60 if (dn->devfn == dev->devfn && dn->busno == dev->bus->number) 94 if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number)
61 return dn; /* fast path. sysdata is good */ 95 return dn; /* fast path. sysdata is good */
62 else 96 return fetch_dev_dn(dev);
63 return fetch_dev_dn(dev);
64} 97}
65 98
66static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) 99static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
@@ -83,7 +116,7 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
83 struct device_node *busdn = bus->sysdata; 116 struct device_node *busdn = bus->sysdata;
84 117
85 BUG_ON(busdn == NULL); 118 BUG_ON(busdn == NULL);
86 return busdn->phb; 119 return PCI_DN(busdn)->phb;
87} 120}
88 121
89#endif 122#endif
diff --git a/include/asm-ppc64/pci.h b/include/asm-ppc64/pci.h
index 4d057452f59b..a88bbfc26967 100644
--- a/include/asm-ppc64/pci.h
+++ b/include/asm-ppc64/pci.h
@@ -138,6 +138,19 @@ extern void
138pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 138pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
139 struct pci_bus_region *region); 139 struct pci_bus_region *region);
140 140
141static inline struct resource *
142pcibios_select_root(struct pci_dev *pdev, struct resource *res)
143{
144 struct resource *root = NULL;
145
146 if (res->flags & IORESOURCE_IO)
147 root = &ioport_resource;
148 if (res->flags & IORESOURCE_MEM)
149 root = &iomem_resource;
150
151 return root;
152}
153
141extern int 154extern int
142unmap_bus_range(struct pci_bus *bus); 155unmap_bus_range(struct pci_bus *bus);
143 156
diff --git a/include/asm-ppc64/prom.h b/include/asm-ppc64/prom.h
index dc5330b39509..c02ec1d6b909 100644
--- a/include/asm-ppc64/prom.h
+++ b/include/asm-ppc64/prom.h
@@ -116,14 +116,6 @@ struct property {
116 struct property *next; 116 struct property *next;
117}; 117};
118 118
119/* NOTE: the device_node contains PCI specific info for pci devices.
120 * This perhaps could be hung off the device_node with another struct,
121 * but for now it is directly in the node. The phb ptr is a good
122 * indication of a real PCI node. Other nodes leave these fields zeroed.
123 */
124struct pci_controller;
125struct iommu_table;
126
127struct device_node { 119struct device_node {
128 char *name; 120 char *name;
129 char *type; 121 char *type;
@@ -135,16 +127,6 @@ struct device_node {
135 struct interrupt_info *intrs; 127 struct interrupt_info *intrs;
136 char *full_name; 128 char *full_name;
137 129
138 /* PCI stuff probably doesn't belong here */
139 int busno; /* for pci devices */
140 int bussubno; /* for pci devices */
141 int devfn; /* for pci devices */
142 int eeh_mode; /* See eeh.h for possible EEH_MODEs */
143 int eeh_config_addr;
144 int pci_ext_config_space; /* for pci devices */
145 struct pci_controller *phb; /* for pci devices */
146 struct iommu_table *iommu_table; /* for phb's or bridges */
147
148 struct property *properties; 130 struct property *properties;
149 struct device_node *parent; 131 struct device_node *parent;
150 struct device_node *child; 132 struct device_node *child;
@@ -154,6 +136,7 @@ struct device_node {
154 struct proc_dir_entry *pde; /* this node's proc directory */ 136 struct proc_dir_entry *pde; /* this node's proc directory */
155 struct kref kref; 137 struct kref kref;
156 unsigned long _flags; 138 unsigned long _flags;
139 void *data;
157}; 140};
158 141
159extern struct device_node *of_chosen; 142extern struct device_node *of_chosen;
diff --git a/include/asm-ppc64/segment.h b/include/asm-ppc64/segment.h
deleted file mode 100644
index d80fb68cc79e..000000000000
--- a/include/asm-ppc64/segment.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __PPC64_SEGMENT_H
2#define __PPC64_SEGMENT_H
3
4/* Only here because we have some old header files that expect it.. */
5
6#endif /* __PPC64_SEGMENT_H */
diff --git a/include/asm-ppc64/setup.h b/include/asm-ppc64/setup.h
deleted file mode 100644
index b257b8348c73..000000000000
--- a/include/asm-ppc64/setup.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef _PPC_SETUP_H
2#define _PPC_SETUP_H
3
4#define COMMAND_LINE_SIZE 512
5
6#endif /* _PPC_SETUP_H */
diff --git a/include/asm-ppc64/timex.h b/include/asm-ppc64/timex.h
deleted file mode 100644
index 8db4da4064cd..000000000000
--- a/include/asm-ppc64/timex.h
+++ /dev/null
@@ -1,26 +0,0 @@
1/*
2 * linux/include/asm-ppc/timex.h
3 *
4 * PPC64 architecture timex specifications
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11#ifndef _ASMPPC64_TIMEX_H
12#define _ASMPPC64_TIMEX_H
13
14#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
15
16typedef unsigned long cycles_t;
17
18static inline cycles_t get_cycles(void)
19{
20 cycles_t ret;
21
22 __asm__ __volatile__("mftb %0" : "=r" (ret) : );
23 return ret;
24}
25
26#endif
diff --git a/include/asm-ppc64/user.h b/include/asm-ppc64/user.h
deleted file mode 100644
index d7d6554a421f..000000000000
--- a/include/asm-ppc64/user.h
+++ /dev/null
@@ -1,58 +0,0 @@
1#ifndef _PPC_USER_H
2#define _PPC_USER_H
3
4/* Adapted from <asm-alpha/user.h>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <asm/ptrace.h>
13#include <asm/page.h>
14
15/*
16 * Core file format: The core file is written in such a way that gdb
17 * can understand it and provide useful information to the user (under
18 * linux we use the `trad-core' bfd, NOT the osf-core). The file contents
19 * are as follows:
20 *
21 * upage: 1 page consisting of a user struct that tells gdb
22 * what is present in the file. Directly after this is a
23 * copy of the task_struct, which is currently not used by gdb,
24 * but it may come in handy at some point. All of the registers
25 * are stored as part of the upage. The upage should always be
26 * only one page long.
27 * data: The data segment follows next. We use current->end_text to
28 * current->brk to pick up all of the user variables, plus any memory
29 * that may have been sbrk'ed. No attempt is made to determine if a
30 * page is demand-zero or if a page is totally unused, we just cover
31 * the entire range. All of the addresses are rounded in such a way
32 * that an integral number of pages is written.
33 * stack: We need the stack information in order to get a meaningful
34 * backtrace. We need to write the data from usp to
35 * current->start_stack, so we round each of these in order to be able
36 * to write an integer number of pages.
37 */
38struct user {
39 struct pt_regs regs; /* entire machine state */
40 size_t u_tsize; /* text size (pages) */
41 size_t u_dsize; /* data size (pages) */
42 size_t u_ssize; /* stack size (pages) */
43 unsigned long start_code; /* text starting address */
44 unsigned long start_data; /* data starting address */
45 unsigned long start_stack; /* stack starting address */
46 long int signal; /* signal causing core dump */
47 struct regs * u_ar0; /* help gdb find registers */
48 unsigned long magic; /* identifies a core file */
49 char u_comm[32]; /* user command name */
50};
51
52#define NBPG PAGE_SIZE
53#define UPAGES 1
54#define HOST_TEXT_START_ADDR (u.start_code)
55#define HOST_DATA_START_ADDR (u.start_data)
56#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
57
58#endif /* _PPC_USER_H */
diff --git a/include/asm-sparc64/pci.h b/include/asm-sparc64/pci.h
index a4ab0ec7143a..89bd71b1c0d8 100644
--- a/include/asm-sparc64/pci.h
+++ b/include/asm-sparc64/pci.h
@@ -269,6 +269,8 @@ extern void
269pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, 269pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
270 struct pci_bus_region *region); 270 struct pci_bus_region *region);
271 271
272extern struct resource *pcibios_select_root(struct pci_dev *, struct resource *);
273
272static inline void pcibios_add_platform_entries(struct pci_dev *dev) 274static inline void pcibios_add_platform_entries(struct pci_dev *dev)
273{ 275{
274} 276}
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h
index 5e94c05dc2fc..b5417529f6f1 100644
--- a/include/asm-sparc64/system.h
+++ b/include/asm-sparc64/system.h
@@ -28,13 +28,48 @@ enum sparc_cpu {
28#define ARCH_SUN4C_SUN4 0 28#define ARCH_SUN4C_SUN4 0
29#define ARCH_SUN4 0 29#define ARCH_SUN4 0
30 30
31extern void mb(void); 31/* These are here in an effort to more fully work around Spitfire Errata
32extern void rmb(void); 32 * #51. Essentially, if a memory barrier occurs soon after a mispredicted
33extern void wmb(void); 33 * branch, the chip can stop executing instructions until a trap occurs.
34extern void membar_storeload(void); 34 * Therefore, if interrupts are disabled, the chip can hang forever.
35extern void membar_storeload_storestore(void); 35 *
36extern void membar_storeload_loadload(void); 36 * It used to be believed that the memory barrier had to be right in the
37extern void membar_storestore_loadstore(void); 37 * delay slot, but a case has been traced recently wherein the memory barrier
38 * was one instruction after the branch delay slot and the chip still hung.
39 * The offending sequence was the following in sym_wakeup_done() of the
40 * sym53c8xx_2 driver:
41 *
42 * call sym_ccb_from_dsa, 0
43 * movge %icc, 0, %l0
44 * brz,pn %o0, .LL1303
45 * mov %o0, %l2
46 * membar #LoadLoad
47 *
48 * The branch has to be mispredicted for the bug to occur. Therefore, we put
49 * the memory barrier explicitly into a "branch always, predicted taken"
50 * delay slot to avoid the problem case.
51 */
52#define membar_safe(type) \
53do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \
54 " membar " type "\n" \
55 "1:\n" \
56 : : : "memory"); \
57} while (0)
58
59#define mb() \
60 membar_safe("#LoadLoad | #LoadStore | #StoreStore | #StoreLoad")
61#define rmb() \
62 membar_safe("#LoadLoad")
63#define wmb() \
64 membar_safe("#StoreStore")
65#define membar_storeload() \
66 membar_safe("#StoreLoad")
67#define membar_storeload_storestore() \
68 membar_safe("#StoreLoad | #StoreStore")
69#define membar_storeload_loadload() \
70 membar_safe("#StoreLoad | #LoadLoad")
71#define membar_storestore_loadstore() \
72 membar_safe("#StoreStore | #LoadStore")
38 73
39#endif 74#endif
40 75
diff --git a/include/linux/i2c-pxa.h b/include/linux/i2c-pxa.h
new file mode 100644
index 000000000000..5f3eaf802223
--- /dev/null
+++ b/include/linux/i2c-pxa.h
@@ -0,0 +1,48 @@
1#ifndef _LINUX_I2C_ALGO_PXA_H
2#define _LINUX_I2C_ALGO_PXA_H
3
4struct i2c_eeprom_emu_watcher {
5 void (*write)(void *, unsigned int addr, unsigned char newval);
6};
7
8struct i2c_eeprom_emu_watch {
9 struct list_head node;
10 unsigned int start;
11 unsigned int end;
12 struct i2c_eeprom_emu_watcher *ops;
13 void *data;
14};
15
16#define I2C_EEPROM_EMU_SIZE (256)
17
18struct i2c_eeprom_emu {
19 unsigned int size;
20 unsigned int ptr;
21 unsigned int seen_start;
22 struct list_head watch;
23
24 unsigned char bytes[I2C_EEPROM_EMU_SIZE];
25};
26
27typedef enum i2c_slave_event_e {
28 I2C_SLAVE_EVENT_START_READ,
29 I2C_SLAVE_EVENT_START_WRITE,
30 I2C_SLAVE_EVENT_STOP
31} i2c_slave_event_t;
32
33struct i2c_slave_client {
34 void *data;
35 void (*event)(void *ptr, i2c_slave_event_t event);
36 int (*read) (void *ptr);
37 void (*write)(void *ptr, unsigned int val);
38};
39
40extern int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *, void *data,
41 unsigned int addr, unsigned int size,
42 struct i2c_eeprom_emu_watcher *);
43
44extern void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *, void *data, struct i2c_eeprom_emu_watcher *watcher);
45
46extern struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void);
47
48#endif /* _LINUX_I2C_ALGO_PXA_H */
diff --git a/include/linux/in6.h b/include/linux/in6.h
index dcf5720ffcbb..bd32b79d6295 100644
--- a/include/linux/in6.h
+++ b/include/linux/in6.h
@@ -148,13 +148,13 @@ struct in6_flowlabel_req
148 */ 148 */
149 149
150#define IPV6_ADDRFORM 1 150#define IPV6_ADDRFORM 1
151#define IPV6_PKTINFO 2 151#define IPV6_2292PKTINFO 2
152#define IPV6_HOPOPTS 3 152#define IPV6_2292HOPOPTS 3
153#define IPV6_DSTOPTS 4 153#define IPV6_2292DSTOPTS 4
154#define IPV6_RTHDR 5 154#define IPV6_2292RTHDR 5
155#define IPV6_PKTOPTIONS 6 155#define IPV6_2292PKTOPTIONS 6
156#define IPV6_CHECKSUM 7 156#define IPV6_CHECKSUM 7
157#define IPV6_HOPLIMIT 8 157#define IPV6_2292HOPLIMIT 8
158#define IPV6_NEXTHOP 9 158#define IPV6_NEXTHOP 9
159#define IPV6_AUTHHDR 10 /* obsolete */ 159#define IPV6_AUTHHDR 10 /* obsolete */
160#define IPV6_FLOWINFO 11 160#define IPV6_FLOWINFO 11
@@ -198,4 +198,28 @@ struct in6_flowlabel_req
198 * MCAST_MSFILTER 48 198 * MCAST_MSFILTER 48
199 */ 199 */
200 200
201/* RFC3542 advanced socket options (50-67) */
202#define IPV6_RECVPKTINFO 50
203#define IPV6_PKTINFO 51
204#if 0
205#define IPV6_RECVPATHMTU 52
206#define IPV6_PATHMTU 53
207#define IPV6_DONTFRAG 54
208#define IPV6_USE_MIN_MTU 55
209#endif
210#define IPV6_RECVHOPOPTS 56
211#define IPV6_HOPOPTS 57
212#if 0
213#define IPV6_RECVRTHDRDSTOPTS 58 /* Unused, see net/ipv6/datagram.c */
214#endif
215#define IPV6_RTHDRDSTOPTS 59
216#define IPV6_RECVRTHDR 60
217#define IPV6_RTHDR 61
218#define IPV6_RECVDSTOPTS 62
219#define IPV6_DSTOPTS 63
220#define IPV6_RECVHOPLIMIT 64
221#define IPV6_HOPLIMIT 65
222#define IPV6_RECVTCLASS 66
223#define IPV6_TCLASS 67
224
201#endif 225#endif
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 3c7dbc6a0a70..6c5f7b39a4b0 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -189,6 +189,7 @@ struct inet6_skb_parm {
189 __u16 dst0; 189 __u16 dst0;
190 __u16 srcrt; 190 __u16 srcrt;
191 __u16 dst1; 191 __u16 dst1;
192 __u16 lastopt;
192}; 193};
193 194
194#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) 195#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))
@@ -234,14 +235,20 @@ struct ipv6_pinfo {
234 /* pktoption flags */ 235 /* pktoption flags */
235 union { 236 union {
236 struct { 237 struct {
237 __u8 srcrt:2, 238 __u16 srcrt:2,
239 osrcrt:2,
238 rxinfo:1, 240 rxinfo:1,
241 rxoinfo:1,
239 rxhlim:1, 242 rxhlim:1,
243 rxohlim:1,
240 hopopts:1, 244 hopopts:1,
245 ohopopts:1,
241 dstopts:1, 246 dstopts:1,
242 rxflow:1; 247 odstopts:1,
248 rxflow:1,
249 rxtclass:1;
243 } bits; 250 } bits;
244 __u8 all; 251 __u16 all;
245 } rxopt; 252 } rxopt;
246 253
247 /* sockopt flags */ 254 /* sockopt flags */
@@ -250,6 +257,7 @@ struct ipv6_pinfo {
250 sndflow:1, 257 sndflow:1,
251 pmtudisc:2, 258 pmtudisc:2,
252 ipv6only:1; 259 ipv6only:1;
260 __u8 tclass;
253 261
254 __u32 dst_cookie; 262 __u32 dst_cookie;
255 263
@@ -263,6 +271,7 @@ struct ipv6_pinfo {
263 struct ipv6_txoptions *opt; 271 struct ipv6_txoptions *opt;
264 struct rt6_info *rt; 272 struct rt6_info *rt;
265 int hop_limit; 273 int hop_limit;
274 int tclass;
266 } cork; 275 } cork;
267}; 276};
268 277
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h
index 94a46f38c532..58385ee1c0ac 100644
--- a/include/linux/mempolicy.h
+++ b/include/linux/mempolicy.h
@@ -155,6 +155,7 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
155 155
156extern void numa_default_policy(void); 156extern void numa_default_policy(void);
157extern void numa_policy_init(void); 157extern void numa_policy_init(void);
158extern struct mempolicy default_policy;
158 159
159#else 160#else
160 161
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 6014160d9c06..c1f021eddffa 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -109,6 +109,8 @@ struct mmc_host {
109 struct mmc_card *card_selected; /* the selected MMC card */ 109 struct mmc_card *card_selected; /* the selected MMC card */
110 110
111 struct work_struct detect; 111 struct work_struct detect;
112
113 unsigned long private[0] ____cacheline_aligned;
112}; 114};
113 115
114extern struct mmc_host *mmc_alloc_host(int extra, struct device *); 116extern struct mmc_host *mmc_alloc_host(int extra, struct device *);
@@ -116,14 +118,18 @@ extern int mmc_add_host(struct mmc_host *);
116extern void mmc_remove_host(struct mmc_host *); 118extern void mmc_remove_host(struct mmc_host *);
117extern void mmc_free_host(struct mmc_host *); 119extern void mmc_free_host(struct mmc_host *);
118 120
119#define mmc_priv(x) ((void *)((x) + 1)) 121static inline void *mmc_priv(struct mmc_host *host)
122{
123 return (void *)host->private;
124}
125
120#define mmc_dev(x) ((x)->dev) 126#define mmc_dev(x) ((x)->dev)
121#define mmc_hostname(x) ((x)->class_dev.class_id) 127#define mmc_hostname(x) ((x)->class_dev.class_id)
122 128
123extern int mmc_suspend_host(struct mmc_host *, pm_message_t); 129extern int mmc_suspend_host(struct mmc_host *, pm_message_t);
124extern int mmc_resume_host(struct mmc_host *); 130extern int mmc_resume_host(struct mmc_host *);
125 131
126extern void mmc_detect_change(struct mmc_host *); 132extern void mmc_detect_change(struct mmc_host *, unsigned long delay);
127extern void mmc_request_done(struct mmc_host *, struct mmc_request *); 133extern void mmc_request_done(struct mmc_host *, struct mmc_request *);
128 134
129#endif 135#endif
diff --git a/include/linux/pci.h b/include/linux/pci.h
index bc4c40000c0d..6caaba0af469 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -19,436 +19,10 @@
19 19
20#include <linux/mod_devicetable.h> 20#include <linux/mod_devicetable.h>
21 21
22/* 22/* Include the pci register defines */
23 * Under PCI, each device has 256 bytes of configuration address space, 23#include <linux/pci_regs.h>
24 * of which the first 64 bytes are standardized as follows:
25 */
26#define PCI_VENDOR_ID 0x00 /* 16 bits */
27#define PCI_DEVICE_ID 0x02 /* 16 bits */
28#define PCI_COMMAND 0x04 /* 16 bits */
29#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */
30#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */
31#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
32#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */
33#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */
34#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */
35#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */
36#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
37#define PCI_COMMAND_SERR 0x100 /* Enable SERR */
38#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
39#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
40
41#define PCI_STATUS 0x06 /* 16 bits */
42#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */
43#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */
44#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */
45#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */
46#define PCI_STATUS_PARITY 0x100 /* Detected parity error */
47#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */
48#define PCI_STATUS_DEVSEL_FAST 0x000
49#define PCI_STATUS_DEVSEL_MEDIUM 0x200
50#define PCI_STATUS_DEVSEL_SLOW 0x400
51#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */
52#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */
53#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */
54#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */
55#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */
56
57#define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8
58 revision */
59#define PCI_REVISION_ID 0x08 /* Revision ID */
60#define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */
61#define PCI_CLASS_DEVICE 0x0a /* Device class */
62
63#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */
64#define PCI_LATENCY_TIMER 0x0d /* 8 bits */
65#define PCI_HEADER_TYPE 0x0e /* 8 bits */
66#define PCI_HEADER_TYPE_NORMAL 0
67#define PCI_HEADER_TYPE_BRIDGE 1
68#define PCI_HEADER_TYPE_CARDBUS 2
69
70#define PCI_BIST 0x0f /* 8 bits */
71#define PCI_BIST_CODE_MASK 0x0f /* Return result */
72#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */
73#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */
74
75/*
76 * Base addresses specify locations in memory or I/O space.
77 * Decoded size can be determined by writing a value of
78 * 0xffffffff to the register, and reading it back. Only
79 * 1 bits are decoded.
80 */
81#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */
82#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */
83#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */
84#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */
85#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */
86#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */
87#define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */
88#define PCI_BASE_ADDRESS_SPACE_IO 0x01
89#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00
90#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06
91#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */
92#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */
93#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
94#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */
95#define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL)
96#define PCI_BASE_ADDRESS_IO_MASK (~0x03UL)
97/* bit 1 is reserved if address_space = 1 */
98
99/* Header type 0 (normal devices) */
100#define PCI_CARDBUS_CIS 0x28
101#define PCI_SUBSYSTEM_VENDOR_ID 0x2c
102#define PCI_SUBSYSTEM_ID 0x2e
103#define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */
104#define PCI_ROM_ADDRESS_ENABLE 0x01
105#define PCI_ROM_ADDRESS_MASK (~0x7ffUL)
106
107#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */
108
109/* 0x35-0x3b are reserved */
110#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */
111#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */
112#define PCI_MIN_GNT 0x3e /* 8 bits */
113#define PCI_MAX_LAT 0x3f /* 8 bits */
114
115/* Header type 1 (PCI-to-PCI bridges) */
116#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */
117#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
118#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */
119#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */
120#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */
121#define PCI_IO_LIMIT 0x1d
122#define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */
123#define PCI_IO_RANGE_TYPE_16 0x00
124#define PCI_IO_RANGE_TYPE_32 0x01
125#define PCI_IO_RANGE_MASK (~0x0fUL)
126#define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */
127#define PCI_MEMORY_BASE 0x20 /* Memory range behind */
128#define PCI_MEMORY_LIMIT 0x22
129#define PCI_MEMORY_RANGE_TYPE_MASK 0x0fUL
130#define PCI_MEMORY_RANGE_MASK (~0x0fUL)
131#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */
132#define PCI_PREF_MEMORY_LIMIT 0x26
133#define PCI_PREF_RANGE_TYPE_MASK 0x0fUL
134#define PCI_PREF_RANGE_TYPE_32 0x00
135#define PCI_PREF_RANGE_TYPE_64 0x01
136#define PCI_PREF_RANGE_MASK (~0x0fUL)
137#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */
138#define PCI_PREF_LIMIT_UPPER32 0x2c
139#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */
140#define PCI_IO_LIMIT_UPPER16 0x32
141/* 0x34 same as for htype 0 */
142/* 0x35-0x3b is reserved */
143#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */
144/* 0x3c-0x3d are same as for htype 0 */
145#define PCI_BRIDGE_CONTROL 0x3e
146#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */
147#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */
148#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */
149#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */
150#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */
151#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */
152#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */
153
154/* Header type 2 (CardBus bridges) */
155#define PCI_CB_CAPABILITY_LIST 0x14
156/* 0x15 reserved */
157#define PCI_CB_SEC_STATUS 0x16 /* Secondary status */
158#define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */
159#define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */
160#define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */
161#define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */
162#define PCI_CB_MEMORY_BASE_0 0x1c
163#define PCI_CB_MEMORY_LIMIT_0 0x20
164#define PCI_CB_MEMORY_BASE_1 0x24
165#define PCI_CB_MEMORY_LIMIT_1 0x28
166#define PCI_CB_IO_BASE_0 0x2c
167#define PCI_CB_IO_BASE_0_HI 0x2e
168#define PCI_CB_IO_LIMIT_0 0x30
169#define PCI_CB_IO_LIMIT_0_HI 0x32
170#define PCI_CB_IO_BASE_1 0x34
171#define PCI_CB_IO_BASE_1_HI 0x36
172#define PCI_CB_IO_LIMIT_1 0x38
173#define PCI_CB_IO_LIMIT_1_HI 0x3a
174#define PCI_CB_IO_RANGE_MASK (~0x03UL)
175/* 0x3c-0x3d are same as for htype 0 */
176#define PCI_CB_BRIDGE_CONTROL 0x3e
177#define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */
178#define PCI_CB_BRIDGE_CTL_SERR 0x02
179#define PCI_CB_BRIDGE_CTL_ISA 0x04
180#define PCI_CB_BRIDGE_CTL_VGA 0x08
181#define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20
182#define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */
183#define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */
184#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */
185#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200
186#define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400
187#define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40
188#define PCI_CB_SUBSYSTEM_ID 0x42
189#define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */
190/* 0x48-0x7f reserved */
191
192/* Capability lists */
193
194#define PCI_CAP_LIST_ID 0 /* Capability ID */
195#define PCI_CAP_ID_PM 0x01 /* Power Management */
196#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */
197#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */
198#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */
199#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */
200#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */
201#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */
202#define PCI_CAP_ID_SHPC 0x0C /* PCI Standard Hot-Plug Controller */
203#define PCI_CAP_ID_EXP 0x10 /* PCI Express */
204#define PCI_CAP_ID_MSIX 0x11 /* MSI-X */
205#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */
206#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */
207#define PCI_CAP_SIZEOF 4
208
209/* Power Management Registers */
210
211#define PCI_PM_PMC 2 /* PM Capabilities Register */
212#define PCI_PM_CAP_VER_MASK 0x0007 /* Version */
213#define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */
214#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */
215#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */
216#define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */
217#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */
218#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */
219#define PCI_PM_CAP_PME 0x0800 /* PME pin supported */
220#define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */
221#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */
222#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */
223#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */
224#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */
225#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
226#define PCI_PM_CTRL 4 /* PM control and status register */
227#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */
228#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */
229#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */
230#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */
231#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */
232#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */
233#define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */
234#define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */
235#define PCI_PM_DATA_REGISTER 7 /* (??) */
236#define PCI_PM_SIZEOF 8
237
238/* AGP registers */
239
240#define PCI_AGP_VERSION 2 /* BCD version number */
241#define PCI_AGP_RFU 3 /* Rest of capability flags */
242#define PCI_AGP_STATUS 4 /* Status register */
243#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */
244#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */
245#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */
246#define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */
247#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */
248#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */
249#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */
250#define PCI_AGP_COMMAND 8 /* Control register */
251#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */
252#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */
253#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */
254#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */
255#define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */
256#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */
257#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate */
258#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */
259#define PCI_AGP_SIZEOF 12
260
261/* Vital Product Data */
262
263#define PCI_VPD_ADDR 2 /* Address to access (15 bits!) */
264#define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */
265#define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */
266#define PCI_VPD_DATA 4 /* 32-bits of data returned here */
267
268/* Slot Identification */
269
270#define PCI_SID_ESR 2 /* Expansion Slot Register */
271#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */
272#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */
273#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */
274
275/* Message Signalled Interrupts registers */
276
277#define PCI_MSI_FLAGS 2 /* Various flags */
278#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */
279#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */
280#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */
281#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */
282#define PCI_MSI_FLAGS_MASKBIT 0x100 /* 64-bit mask bits allowed */
283#define PCI_MSI_RFU 3 /* Rest of capability flags */
284#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */
285#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
286#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */
287#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
288#define PCI_MSI_MASK_BIT 16 /* Mask bits register */
289
290/* CompactPCI Hotswap Register */
291
292#define PCI_CHSWP_CSR 2 /* Control and Status Register */
293#define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */
294#define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */
295#define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */
296#define PCI_CHSWP_LOO 0x08 /* LED On / Off */
297#define PCI_CHSWP_PI 0x30 /* Programming Interface */
298#define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */
299#define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */
300
301/* PCI-X registers */
302
303#define PCI_X_CMD 2 /* Modes & Features */
304#define PCI_X_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */
305#define PCI_X_CMD_ERO 0x0002 /* Enable Relaxed Ordering */
306#define PCI_X_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */
307#define PCI_X_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */
308#define PCI_X_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */
309#define PCI_X_STATUS 4 /* PCI-X capabilities */
310#define PCI_X_STATUS_DEVFN 0x000000ff /* A copy of devfn */
311#define PCI_X_STATUS_BUS 0x0000ff00 /* A copy of bus nr */
312#define PCI_X_STATUS_64BIT 0x00010000 /* 64-bit device */
313#define PCI_X_STATUS_133MHZ 0x00020000 /* 133 MHz capable */
314#define PCI_X_STATUS_SPL_DISC 0x00040000 /* Split Completion Discarded */
315#define PCI_X_STATUS_UNX_SPL 0x00080000 /* Unexpected Split Completion */
316#define PCI_X_STATUS_COMPLEX 0x00100000 /* Device Complexity */
317#define PCI_X_STATUS_MAX_READ 0x00600000 /* Designed Max Memory Read Count */
318#define PCI_X_STATUS_MAX_SPLIT 0x03800000 /* Designed Max Outstanding Split Transactions */
319#define PCI_X_STATUS_MAX_CUM 0x1c000000 /* Designed Max Cumulative Read Size */
320#define PCI_X_STATUS_SPL_ERR 0x20000000 /* Rcvd Split Completion Error Msg */
321#define PCI_X_STATUS_266MHZ 0x40000000 /* 266 MHz capable */
322#define PCI_X_STATUS_533MHZ 0x80000000 /* 533 MHz capable */
323
324/* PCI Express capability registers */
325
326#define PCI_EXP_FLAGS 2 /* Capabilities register */
327#define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */
328#define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */
329#define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */
330#define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */
331#define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */
332#define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */
333#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */
334#define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */
335#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */
336#define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */
337#define PCI_EXP_DEVCAP 4 /* Device capabilities */
338#define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */
339#define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */
340#define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */
341#define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */
342#define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */
343#define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */
344#define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */
345#define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */
346#define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */
347#define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */
348#define PCI_EXP_DEVCTL 8 /* Device Control */
349#define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */
350#define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */
351#define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */
352#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */
353#define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */
354#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */
355#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */
356#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */
357#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */
358#define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */
359#define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */
360#define PCI_EXP_DEVSTA 10 /* Device Status */
361#define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */
362#define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */
363#define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */
364#define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */
365#define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */
366#define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */
367#define PCI_EXP_LNKCAP 12 /* Link Capabilities */
368#define PCI_EXP_LNKCTL 16 /* Link Control */
369#define PCI_EXP_LNKSTA 18 /* Link Status */
370#define PCI_EXP_SLTCAP 20 /* Slot Capabilities */
371#define PCI_EXP_SLTCTL 24 /* Slot Control */
372#define PCI_EXP_SLTSTA 26 /* Slot Status */
373#define PCI_EXP_RTCTL 28 /* Root Control */
374#define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */
375#define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */
376#define PCI_EXP_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */
377#define PCI_EXP_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */
378#define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */
379#define PCI_EXP_RTCAP 30 /* Root Capabilities */
380#define PCI_EXP_RTSTA 32 /* Root Status */
381
382/* Extended Capabilities (PCI-X 2.0 and Express) */
383#define PCI_EXT_CAP_ID(header) (header & 0x0000ffff)
384#define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf)
385#define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc)
386
387#define PCI_EXT_CAP_ID_ERR 1
388#define PCI_EXT_CAP_ID_VC 2
389#define PCI_EXT_CAP_ID_DSN 3
390#define PCI_EXT_CAP_ID_PWR 4
391
392/* Advanced Error Reporting */
393#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */
394#define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */
395#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */
396#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */
397#define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */
398#define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */
399#define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */
400#define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */
401#define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */
402#define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */
403#define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */
404#define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */
405#define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */
406 /* Same bits as above */
407#define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */
408 /* Same bits as above */
409#define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */
410#define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */
411#define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */
412#define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */
413#define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */
414#define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */
415#define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */
416 /* Same bits as above */
417#define PCI_ERR_CAP 24 /* Advanced Error Capabilities */
418#define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */
419#define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */
420#define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */
421#define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */
422#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */
423#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */
424#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */
425#define PCI_ERR_ROOT_STATUS 48
426#define PCI_ERR_ROOT_COR_SRC 52
427#define PCI_ERR_ROOT_SRC 54
428
429/* Virtual Channel */
430#define PCI_VC_PORT_REG1 4
431#define PCI_VC_PORT_REG2 8
432#define PCI_VC_PORT_CTRL 12
433#define PCI_VC_PORT_STATUS 14
434#define PCI_VC_RES_CAP 16
435#define PCI_VC_RES_CTRL 20
436#define PCI_VC_RES_STATUS 26
437
438/* Power Budgeting */
439#define PCI_PWR_DSR 4 /* Data Select Register */
440#define PCI_PWR_DATA 8 /* Data Register */
441#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */
442#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */
443#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */
444#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */
445#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */
446#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */
447#define PCI_PWR_CAP 12 /* Capability */
448#define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */
449 24
450/* Include the ID list */ 25/* Include the ID list */
451
452#include <linux/pci_ids.h> 26#include <linux/pci_ids.h>
453 27
454/* 28/*
@@ -496,11 +70,12 @@ enum pci_mmap_state {
496 70
497typedef int __bitwise pci_power_t; 71typedef int __bitwise pci_power_t;
498 72
499#define PCI_D0 ((pci_power_t __force) 0) 73#define PCI_D0 ((pci_power_t __force) 0)
500#define PCI_D1 ((pci_power_t __force) 1) 74#define PCI_D1 ((pci_power_t __force) 1)
501#define PCI_D2 ((pci_power_t __force) 2) 75#define PCI_D2 ((pci_power_t __force) 2)
502#define PCI_D3hot ((pci_power_t __force) 3) 76#define PCI_D3hot ((pci_power_t __force) 3)
503#define PCI_D3cold ((pci_power_t __force) 4) 77#define PCI_D3cold ((pci_power_t __force) 4)
78#define PCI_UNKNOWN ((pci_power_t __force) 5)
504#define PCI_POWER_ERROR ((pci_power_t __force) -1) 79#define PCI_POWER_ERROR ((pci_power_t __force) -1)
505 80
506/* 81/*
@@ -562,11 +137,6 @@ struct pci_dev {
562 struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ 137 struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */
563 int rom_attr_enabled; /* has display of the rom attribute been enabled? */ 138 int rom_attr_enabled; /* has display of the rom attribute been enabled? */
564 struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ 139 struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
565#ifdef CONFIG_PCI_NAMES
566#define PCI_NAME_SIZE 255
567#define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */
568 char pretty_name[PCI_NAME_SIZE]; /* pretty name for users to see */
569#endif
570}; 140};
571 141
572#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list) 142#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list)
@@ -582,15 +152,15 @@ struct pci_dev {
582 * 7-10 bridges: address space assigned to buses behind the bridge 152 * 7-10 bridges: address space assigned to buses behind the bridge
583 */ 153 */
584 154
585#define PCI_ROM_RESOURCE 6 155#define PCI_ROM_RESOURCE 6
586#define PCI_BRIDGE_RESOURCES 7 156#define PCI_BRIDGE_RESOURCES 7
587#define PCI_NUM_RESOURCES 11 157#define PCI_NUM_RESOURCES 11
588 158
589#ifndef PCI_BUS_NUM_RESOURCES 159#ifndef PCI_BUS_NUM_RESOURCES
590#define PCI_BUS_NUM_RESOURCES 8 160#define PCI_BUS_NUM_RESOURCES 8
591#endif 161#endif
592 162
593#define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */ 163#define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */
594 164
595struct pci_bus { 165struct pci_bus {
596 struct list_head node; /* node in list of buses */ 166 struct list_head node; /* node in list of buses */
@@ -699,7 +269,7 @@ struct pci_driver {
699 * @dev_class_mask: the class mask for this device 269 * @dev_class_mask: the class mask for this device
700 * 270 *
701 * This macro is used to create a struct pci_device_id that matches a 271 * This macro is used to create a struct pci_device_id that matches a
702 * specific PCI class. The vendor, device, subvendor, and subdevice 272 * specific PCI class. The vendor, device, subvendor, and subdevice
703 * fields will be set to PCI_ANY_ID. 273 * fields will be set to PCI_ANY_ID.
704 */ 274 */
705#define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \ 275#define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \
@@ -707,7 +277,7 @@ struct pci_driver {
707 .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ 277 .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \
708 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID 278 .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
709 279
710/* 280/*
711 * pci_module_init is obsolete, this stays here till we fix up all usages of it 281 * pci_module_init is obsolete, this stays here till we fix up all usages of it
712 * in the tree. 282 * in the tree.
713 */ 283 */
@@ -749,8 +319,6 @@ int pci_scan_slot(struct pci_bus *bus, int devfn);
749struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn); 319struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn);
750unsigned int pci_scan_child_bus(struct pci_bus *bus); 320unsigned int pci_scan_child_bus(struct pci_bus *bus);
751void pci_bus_add_device(struct pci_dev *dev); 321void pci_bus_add_device(struct pci_dev *dev);
752void pci_name_device(struct pci_dev *dev);
753char *pci_class_name(u32 class);
754void pci_read_bridge_bases(struct pci_bus *child); 322void pci_read_bridge_bases(struct pci_bus *child);
755struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); 323struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res);
756int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); 324int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);
@@ -815,9 +383,12 @@ void pci_set_master(struct pci_dev *dev);
815#define HAVE_PCI_SET_MWI 383#define HAVE_PCI_SET_MWI
816int pci_set_mwi(struct pci_dev *dev); 384int pci_set_mwi(struct pci_dev *dev);
817void pci_clear_mwi(struct pci_dev *dev); 385void pci_clear_mwi(struct pci_dev *dev);
386void pci_intx(struct pci_dev *dev, int enable);
818int pci_set_dma_mask(struct pci_dev *dev, u64 mask); 387int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
819int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); 388int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
389void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
820int pci_assign_resource(struct pci_dev *dev, int i); 390int pci_assign_resource(struct pci_dev *dev, int i);
391void pci_restore_bars(struct pci_dev *dev);
821 392
822/* ROM control related routines */ 393/* ROM control related routines */
823void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size); 394void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size);
@@ -865,6 +436,9 @@ const struct pci_device_id *pci_match_device(struct pci_driver *drv, struct pci_
865const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, struct pci_dev *dev); 436const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, struct pci_dev *dev);
866int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass); 437int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass);
867 438
439void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *),
440 void *userdata);
441
868/* kmem_cache style wrapper around pci_alloc_consistent() */ 442/* kmem_cache style wrapper around pci_alloc_consistent() */
869 443
870#include <linux/dmapool.h> 444#include <linux/dmapool.h>
@@ -912,18 +486,26 @@ extern void pci_disable_msix(struct pci_dev *dev);
912extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); 486extern void msi_remove_pci_irq_vectors(struct pci_dev *dev);
913#endif 487#endif
914 488
915#endif /* CONFIG_PCI */ 489/*
916 490 * PCI domain support. Sometimes called PCI segment (eg by ACPI),
917/* Include architecture-dependent settings and functions */ 491 * a PCI domain is defined to be a set of PCI busses which share
492 * configuration space.
493 */
494#ifndef CONFIG_PCI_DOMAINS
495static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
496static inline int pci_proc_domain(struct pci_bus *bus)
497{
498 return 0;
499}
500#endif
918 501
919#include <asm/pci.h> 502#else /* CONFIG_PCI is not enabled */
920 503
921/* 504/*
922 * If the system does not have PCI, clearly these return errors. Define 505 * If the system does not have PCI, clearly these return errors. Define
923 * these as simple inline functions to avoid hair in drivers. 506 * these as simple inline functions to avoid hair in drivers.
924 */ 507 */
925 508
926#ifndef CONFIG_PCI
927#define _PCI_NOP(o,s,t) \ 509#define _PCI_NOP(o,s,t) \
928 static inline int pci_##o##_config_##s (struct pci_dev *dev, int where, t val) \ 510 static inline int pci_##o##_config_##s (struct pci_dev *dev, int where, t val) \
929 { return PCIBIOS_FUNC_NOT_SUPPORTED; } 511 { return PCIBIOS_FUNC_NOT_SUPPORTED; }
@@ -974,21 +556,11 @@ static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int en
974 556
975#define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0) 557#define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0)
976 558
977#else 559#endif /* CONFIG_PCI */
978 560
979/* 561/* Include architecture-dependent settings and functions */
980 * PCI domain support. Sometimes called PCI segment (eg by ACPI), 562
981 * a PCI domain is defined to be a set of PCI busses which share 563#include <asm/pci.h>
982 * configuration space.
983 */
984#ifndef CONFIG_PCI_DOMAINS
985static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
986static inline int pci_proc_domain(struct pci_bus *bus)
987{
988 return 0;
989}
990#endif
991#endif /* !CONFIG_PCI */
992 564
993/* these helpers provide future and backwards compatibility 565/* these helpers provide future and backwards compatibility
994 * for accessing popular PCI BAR info */ 566 * for accessing popular PCI BAR info */
@@ -1025,13 +597,6 @@ static inline char *pci_name(struct pci_dev *pdev)
1025 return pdev->dev.bus_id; 597 return pdev->dev.bus_id;
1026} 598}
1027 599
1028/* Some archs want to see the pretty pci name, so use this macro */
1029#ifdef CONFIG_PCI_NAMES
1030#define pci_pretty_name(dev) ((dev)->pretty_name)
1031#else
1032#define pci_pretty_name(dev) ""
1033#endif
1034
1035 600
1036/* Some archs don't want to expose struct resource to userland as-is 601/* Some archs don't want to expose struct resource to userland as-is
1037 * in sysfs and /proc 602 * in sysfs and /proc
@@ -1067,7 +632,7 @@ enum pci_fixup_pass {
1067 632
1068/* Anonymous variables would be nice... */ 633/* Anonymous variables would be nice... */
1069#define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, hook) \ 634#define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, hook) \
1070 static struct pci_fixup __pci_fixup_##name __attribute_used__ \ 635 static const struct pci_fixup __pci_fixup_##name __attribute_used__ \
1071 __attribute__((__section__(#section))) = { vendor, device, hook }; 636 __attribute__((__section__(#section))) = { vendor, device, hook };
1072#define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook) \ 637#define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook) \
1073 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \ 638 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h
new file mode 100644
index 000000000000..e2a089b051ed
--- /dev/null
+++ b/include/linux/pci_regs.h
@@ -0,0 +1,448 @@
1/*
2 * pci_regs.h
3 *
4 * PCI standard defines
5 * Copyright 1994, Drew Eckhardt
6 * Copyright 1997--1999 Martin Mares <mj@ucw.cz>
7 *
8 * For more information, please consult the following manuals (look at
9 * http://www.pcisig.com/ for how to get them):
10 *
11 * PCI BIOS Specification
12 * PCI Local Bus Specification
13 * PCI to PCI Bridge Specification
14 * PCI System Design Guide
15 */
16
17#ifndef LINUX_PCI_REGS_H
18#define LINUX_PCI_REGS_H
19
20/*
21 * Under PCI, each device has 256 bytes of configuration address space,
22 * of which the first 64 bytes are standardized as follows:
23 */
24#define PCI_VENDOR_ID 0x00 /* 16 bits */
25#define PCI_DEVICE_ID 0x02 /* 16 bits */
26#define PCI_COMMAND 0x04 /* 16 bits */
27#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */
28#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */
29#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */
30#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */
31#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */
32#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */
33#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */
34#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */
35#define PCI_COMMAND_SERR 0x100 /* Enable SERR */
36#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */
37#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */
38
39#define PCI_STATUS 0x06 /* 16 bits */
40#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */
41#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */
42#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */
43#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */
44#define PCI_STATUS_PARITY 0x100 /* Detected parity error */
45#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */
46#define PCI_STATUS_DEVSEL_FAST 0x000
47#define PCI_STATUS_DEVSEL_MEDIUM 0x200
48#define PCI_STATUS_DEVSEL_SLOW 0x400
49#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */
50#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */
51#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */
52#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */
53#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */
54
55#define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 revision */
56#define PCI_REVISION_ID 0x08 /* Revision ID */
57#define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */
58#define PCI_CLASS_DEVICE 0x0a /* Device class */
59
60#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */
61#define PCI_LATENCY_TIMER 0x0d /* 8 bits */
62#define PCI_HEADER_TYPE 0x0e /* 8 bits */
63#define PCI_HEADER_TYPE_NORMAL 0
64#define PCI_HEADER_TYPE_BRIDGE 1
65#define PCI_HEADER_TYPE_CARDBUS 2
66
67#define PCI_BIST 0x0f /* 8 bits */
68#define PCI_BIST_CODE_MASK 0x0f /* Return result */
69#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */
70#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */
71
72/*
73 * Base addresses specify locations in memory or I/O space.
74 * Decoded size can be determined by writing a value of
75 * 0xffffffff to the register, and reading it back. Only
76 * 1 bits are decoded.
77 */
78#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */
79#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */
80#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */
81#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */
82#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */
83#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */
84#define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */
85#define PCI_BASE_ADDRESS_SPACE_IO 0x01
86#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00
87#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06
88#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */
89#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */
90#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
91#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */
92#define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL)
93#define PCI_BASE_ADDRESS_IO_MASK (~0x03UL)
94/* bit 1 is reserved if address_space = 1 */
95
96/* Header type 0 (normal devices) */
97#define PCI_CARDBUS_CIS 0x28
98#define PCI_SUBSYSTEM_VENDOR_ID 0x2c
99#define PCI_SUBSYSTEM_ID 0x2e
100#define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */
101#define PCI_ROM_ADDRESS_ENABLE 0x01
102#define PCI_ROM_ADDRESS_MASK (~0x7ffUL)
103
104#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */
105
106/* 0x35-0x3b are reserved */
107#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */
108#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */
109#define PCI_MIN_GNT 0x3e /* 8 bits */
110#define PCI_MAX_LAT 0x3f /* 8 bits */
111
112/* Header type 1 (PCI-to-PCI bridges) */
113#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */
114#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
115#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */
116#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */
117#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */
118#define PCI_IO_LIMIT 0x1d
119#define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */
120#define PCI_IO_RANGE_TYPE_16 0x00
121#define PCI_IO_RANGE_TYPE_32 0x01
122#define PCI_IO_RANGE_MASK (~0x0fUL)
123#define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */
124#define PCI_MEMORY_BASE 0x20 /* Memory range behind */
125#define PCI_MEMORY_LIMIT 0x22
126#define PCI_MEMORY_RANGE_TYPE_MASK 0x0fUL
127#define PCI_MEMORY_RANGE_MASK (~0x0fUL)
128#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */
129#define PCI_PREF_MEMORY_LIMIT 0x26
130#define PCI_PREF_RANGE_TYPE_MASK 0x0fUL
131#define PCI_PREF_RANGE_TYPE_32 0x00
132#define PCI_PREF_RANGE_TYPE_64 0x01
133#define PCI_PREF_RANGE_MASK (~0x0fUL)
134#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */
135#define PCI_PREF_LIMIT_UPPER32 0x2c
136#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */
137#define PCI_IO_LIMIT_UPPER16 0x32
138/* 0x34 same as for htype 0 */
139/* 0x35-0x3b is reserved */
140#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */
141/* 0x3c-0x3d are same as for htype 0 */
142#define PCI_BRIDGE_CONTROL 0x3e
143#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */
144#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */
145#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */
146#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */
147#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */
148#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */
149#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */
150
151/* Header type 2 (CardBus bridges) */
152#define PCI_CB_CAPABILITY_LIST 0x14
153/* 0x15 reserved */
154#define PCI_CB_SEC_STATUS 0x16 /* Secondary status */
155#define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */
156#define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */
157#define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */
158#define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */
159#define PCI_CB_MEMORY_BASE_0 0x1c
160#define PCI_CB_MEMORY_LIMIT_0 0x20
161#define PCI_CB_MEMORY_BASE_1 0x24
162#define PCI_CB_MEMORY_LIMIT_1 0x28
163#define PCI_CB_IO_BASE_0 0x2c
164#define PCI_CB_IO_BASE_0_HI 0x2e
165#define PCI_CB_IO_LIMIT_0 0x30
166#define PCI_CB_IO_LIMIT_0_HI 0x32
167#define PCI_CB_IO_BASE_1 0x34
168#define PCI_CB_IO_BASE_1_HI 0x36
169#define PCI_CB_IO_LIMIT_1 0x38
170#define PCI_CB_IO_LIMIT_1_HI 0x3a
171#define PCI_CB_IO_RANGE_MASK (~0x03UL)
172/* 0x3c-0x3d are same as for htype 0 */
173#define PCI_CB_BRIDGE_CONTROL 0x3e
174#define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */
175#define PCI_CB_BRIDGE_CTL_SERR 0x02
176#define PCI_CB_BRIDGE_CTL_ISA 0x04
177#define PCI_CB_BRIDGE_CTL_VGA 0x08
178#define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20
179#define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */
180#define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */
181#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */
182#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200
183#define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400
184#define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40
185#define PCI_CB_SUBSYSTEM_ID 0x42
186#define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */
187/* 0x48-0x7f reserved */
188
189/* Capability lists */
190
191#define PCI_CAP_LIST_ID 0 /* Capability ID */
192#define PCI_CAP_ID_PM 0x01 /* Power Management */
193#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */
194#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */
195#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */
196#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */
197#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */
198#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */
199#define PCI_CAP_ID_SHPC 0x0C /* PCI Standard Hot-Plug Controller */
200#define PCI_CAP_ID_EXP 0x10 /* PCI Express */
201#define PCI_CAP_ID_MSIX 0x11 /* MSI-X */
202#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */
203#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */
204#define PCI_CAP_SIZEOF 4
205
206/* Power Management Registers */
207
208#define PCI_PM_PMC 2 /* PM Capabilities Register */
209#define PCI_PM_CAP_VER_MASK 0x0007 /* Version */
210#define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */
211#define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */
212#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */
213#define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */
214#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */
215#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */
216#define PCI_PM_CAP_PME 0x0800 /* PME pin supported */
217#define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */
218#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */
219#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */
220#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */
221#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */
222#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
223#define PCI_PM_CTRL 4 /* PM control and status register */
224#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */
225#define PCI_PM_CTRL_NO_SOFT_RESET 0x0004 /* No reset for D3hot->D0 */
226#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */
227#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */
228#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */
229#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */
230#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */
231#define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */
232#define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */
233#define PCI_PM_DATA_REGISTER 7 /* (??) */
234#define PCI_PM_SIZEOF 8
235
236/* AGP registers */
237
238#define PCI_AGP_VERSION 2 /* BCD version number */
239#define PCI_AGP_RFU 3 /* Rest of capability flags */
240#define PCI_AGP_STATUS 4 /* Status register */
241#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */
242#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */
243#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */
244#define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */
245#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */
246#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */
247#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */
248#define PCI_AGP_COMMAND 8 /* Control register */
249#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */
250#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */
251#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */
252#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */
253#define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */
254#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */
255#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate */
256#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */
257#define PCI_AGP_SIZEOF 12
258
259/* Vital Product Data */
260
261#define PCI_VPD_ADDR 2 /* Address to access (15 bits!) */
262#define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */
263#define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */
264#define PCI_VPD_DATA 4 /* 32-bits of data returned here */
265
266/* Slot Identification */
267
268#define PCI_SID_ESR 2 /* Expansion Slot Register */
269#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */
270#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */
271#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */
272
273/* Message Signalled Interrupts registers */
274
275#define PCI_MSI_FLAGS 2 /* Various flags */
276#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */
277#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */
278#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */
279#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */
280#define PCI_MSI_FLAGS_MASKBIT 0x100 /* 64-bit mask bits allowed */
281#define PCI_MSI_RFU 3 /* Rest of capability flags */
282#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */
283#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
284#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */
285#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */
286#define PCI_MSI_MASK_BIT 16 /* Mask bits register */
287
288/* CompactPCI Hotswap Register */
289
290#define PCI_CHSWP_CSR 2 /* Control and Status Register */
291#define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */
292#define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */
293#define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */
294#define PCI_CHSWP_LOO 0x08 /* LED On / Off */
295#define PCI_CHSWP_PI 0x30 /* Programming Interface */
296#define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */
297#define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */
298
299/* PCI-X registers */
300
301#define PCI_X_CMD 2 /* Modes & Features */
302#define PCI_X_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */
303#define PCI_X_CMD_ERO 0x0002 /* Enable Relaxed Ordering */
304#define PCI_X_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */
305#define PCI_X_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */
306#define PCI_X_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */
307#define PCI_X_STATUS 4 /* PCI-X capabilities */
308#define PCI_X_STATUS_DEVFN 0x000000ff /* A copy of devfn */
309#define PCI_X_STATUS_BUS 0x0000ff00 /* A copy of bus nr */
310#define PCI_X_STATUS_64BIT 0x00010000 /* 64-bit device */
311#define PCI_X_STATUS_133MHZ 0x00020000 /* 133 MHz capable */
312#define PCI_X_STATUS_SPL_DISC 0x00040000 /* Split Completion Discarded */
313#define PCI_X_STATUS_UNX_SPL 0x00080000 /* Unexpected Split Completion */
314#define PCI_X_STATUS_COMPLEX 0x00100000 /* Device Complexity */
315#define PCI_X_STATUS_MAX_READ 0x00600000 /* Designed Max Memory Read Count */
316#define PCI_X_STATUS_MAX_SPLIT 0x03800000 /* Designed Max Outstanding Split Transactions */
317#define PCI_X_STATUS_MAX_CUM 0x1c000000 /* Designed Max Cumulative Read Size */
318#define PCI_X_STATUS_SPL_ERR 0x20000000 /* Rcvd Split Completion Error Msg */
319#define PCI_X_STATUS_266MHZ 0x40000000 /* 266 MHz capable */
320#define PCI_X_STATUS_533MHZ 0x80000000 /* 533 MHz capable */
321
322/* PCI Express capability registers */
323
324#define PCI_EXP_FLAGS 2 /* Capabilities register */
325#define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */
326#define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */
327#define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */
328#define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */
329#define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */
330#define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */
331#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */
332#define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */
333#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */
334#define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */
335#define PCI_EXP_DEVCAP 4 /* Device capabilities */
336#define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */
337#define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */
338#define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */
339#define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */
340#define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */
341#define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */
342#define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */
343#define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */
344#define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */
345#define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */
346#define PCI_EXP_DEVCTL 8 /* Device Control */
347#define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */
348#define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */
349#define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */
350#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */
351#define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */
352#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */
353#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */
354#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */
355#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */
356#define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */
357#define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */
358#define PCI_EXP_DEVSTA 10 /* Device Status */
359#define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */
360#define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */
361#define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */
362#define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */
363#define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */
364#define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */
365#define PCI_EXP_LNKCAP 12 /* Link Capabilities */
366#define PCI_EXP_LNKCTL 16 /* Link Control */
367#define PCI_EXP_LNKSTA 18 /* Link Status */
368#define PCI_EXP_SLTCAP 20 /* Slot Capabilities */
369#define PCI_EXP_SLTCTL 24 /* Slot Control */
370#define PCI_EXP_SLTSTA 26 /* Slot Status */
371#define PCI_EXP_RTCTL 28 /* Root Control */
372#define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */
373#define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */
374#define PCI_EXP_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */
375#define PCI_EXP_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */
376#define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */
377#define PCI_EXP_RTCAP 30 /* Root Capabilities */
378#define PCI_EXP_RTSTA 32 /* Root Status */
379
380/* Extended Capabilities (PCI-X 2.0 and Express) */
381#define PCI_EXT_CAP_ID(header) (header & 0x0000ffff)
382#define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf)
383#define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc)
384
385#define PCI_EXT_CAP_ID_ERR 1
386#define PCI_EXT_CAP_ID_VC 2
387#define PCI_EXT_CAP_ID_DSN 3
388#define PCI_EXT_CAP_ID_PWR 4
389
390/* Advanced Error Reporting */
391#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */
392#define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */
393#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */
394#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */
395#define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */
396#define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */
397#define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */
398#define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */
399#define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */
400#define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */
401#define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */
402#define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */
403#define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */
404 /* Same bits as above */
405#define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */
406 /* Same bits as above */
407#define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */
408#define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */
409#define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */
410#define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */
411#define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */
412#define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */
413#define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */
414 /* Same bits as above */
415#define PCI_ERR_CAP 24 /* Advanced Error Capabilities */
416#define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */
417#define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */
418#define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */
419#define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */
420#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */
421#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */
422#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */
423#define PCI_ERR_ROOT_STATUS 48
424#define PCI_ERR_ROOT_COR_SRC 52
425#define PCI_ERR_ROOT_SRC 54
426
427/* Virtual Channel */
428#define PCI_VC_PORT_REG1 4
429#define PCI_VC_PORT_REG2 8
430#define PCI_VC_PORT_CTRL 12
431#define PCI_VC_PORT_STATUS 14
432#define PCI_VC_RES_CAP 16
433#define PCI_VC_RES_CTRL 20
434#define PCI_VC_RES_STATUS 26
435
436/* Power Budgeting */
437#define PCI_PWR_DSR 4 /* Data Select Register */
438#define PCI_PWR_DATA 8 /* Data Register */
439#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */
440#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */
441#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */
442#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */
443#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */
444#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */
445#define PCI_PWR_CAP 12 /* Capability */
446#define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */
447
448#endif /* LINUX_PCI_REGS_H */
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index d8a023d804d4..317a979b24de 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -30,6 +30,21 @@ struct plat_serial8250_port {
30}; 30};
31 31
32/* 32/*
33 * Allocate 8250 platform device IDs. Nothing is implied by
34 * the numbering here, except for the legacy entry being -1.
35 */
36enum {
37 PLAT8250_DEV_LEGACY = -1,
38 PLAT8250_DEV_PLATFORM,
39 PLAT8250_DEV_PLATFORM1,
40 PLAT8250_DEV_FOURPORT,
41 PLAT8250_DEV_ACCENT,
42 PLAT8250_DEV_BOCA,
43 PLAT8250_DEV_HUB6,
44 PLAT8250_DEV_MCA,
45};
46
47/*
33 * This should be used by drivers which want to register 48 * This should be used by drivers which want to register
34 * their own 8250 ports without registering their own 49 * their own 8250 ports without registering their own
35 * platform device. Using these will make your driver 50 * platform device. Using these will make your driver
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 9b12fe731612..27db8da43aa4 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -401,6 +401,9 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch,
401#endif 401#endif
402 return 0; 402 return 0;
403} 403}
404#ifndef SUPPORT_SYSRQ
405#define uart_handle_sysrq_char(port,ch,regs) uart_handle_sysrq_char(port, 0, NULL)
406#endif
404 407
405/* 408/*
406 * We do the SysRQ and SAK checking like this... 409 * We do the SysRQ and SAK checking like this...
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index da7da9c0ed1b..2741c0c55e83 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1167,7 +1167,7 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb,
1167 1167
1168static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) 1168static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len)
1169{ 1169{
1170 if (len >= skb->len) 1170 if (likely(len >= skb->len))
1171 return 0; 1171 return 0;
1172 if (skb->ip_summed == CHECKSUM_HW) 1172 if (skb->ip_summed == CHECKSUM_HW)
1173 skb->ip_summed = CHECKSUM_NONE; 1173 skb->ip_summed = CHECKSUM_NONE;
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 724637792996..4dbe580f9335 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -5,6 +5,7 @@
5#include <linux/usb_ch9.h> 5#include <linux/usb_ch9.h>
6 6
7#define USB_MAJOR 180 7#define USB_MAJOR 180
8#define USB_DEVICE_MAJOR 189
8 9
9 10
10#ifdef __KERNEL__ 11#ifdef __KERNEL__
@@ -349,6 +350,7 @@ struct usb_device {
349 char *manufacturer; 350 char *manufacturer;
350 char *serial; /* static strings from the device */ 351 char *serial; /* static strings from the device */
351 struct list_head filelist; 352 struct list_head filelist;
353 struct class_device *class_dev;
352 struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ 354 struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */
353 355
354 /* 356 /*
@@ -614,7 +616,6 @@ extern int usb_disabled(void);
614#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ 616#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */
615#define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ 617#define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */
616#define URB_NO_SETUP_DMA_MAP 0x0008 /* urb->setup_dma valid on submit */ 618#define URB_NO_SETUP_DMA_MAP 0x0008 /* urb->setup_dma valid on submit */
617#define URB_ASYNC_UNLINK 0x0010 /* usb_unlink_urb() returns asap */
618#define URB_NO_FSBR 0x0020 /* UHCI-specific */ 619#define URB_NO_FSBR 0x0020 /* UHCI-specific */
619#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ 620#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */
620#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */ 621#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */
@@ -722,13 +723,7 @@ typedef void (*usb_complete_t)(struct urb *, struct pt_regs *);
722 * Initialization: 723 * Initialization:
723 * 724 *
724 * All URBs submitted must initialize the dev, pipe, transfer_flags (may be 725 * All URBs submitted must initialize the dev, pipe, transfer_flags (may be
725 * zero), and complete fields. 726 * zero), and complete fields. All URBs must also initialize
726 * The URB_ASYNC_UNLINK transfer flag affects later invocations of
727 * the usb_unlink_urb() routine. Note: Failure to set URB_ASYNC_UNLINK
728 * with usb_unlink_urb() is deprecated. For synchronous unlinks use
729 * usb_kill_urb() instead.
730 *
731 * All URBs must also initialize
732 * transfer_buffer and transfer_buffer_length. They may provide the 727 * transfer_buffer and transfer_buffer_length. They may provide the
733 * URB_SHORT_NOT_OK transfer flag, indicating that short reads are 728 * URB_SHORT_NOT_OK transfer flag, indicating that short reads are
734 * to be treated as errors; that flag is invalid for write requests. 729 * to be treated as errors; that flag is invalid for write requests.
diff --git a/include/linux/usb_isp116x.h b/include/linux/usb_isp116x.h
index 5f5a9d9bd6c2..436dd8a2b64a 100644
--- a/include/linux/usb_isp116x.h
+++ b/include/linux/usb_isp116x.h
@@ -7,36 +7,18 @@
7struct isp116x_platform_data { 7struct isp116x_platform_data {
8 /* Enable internal resistors on downstream ports */ 8 /* Enable internal resistors on downstream ports */
9 unsigned sel15Kres:1; 9 unsigned sel15Kres:1;
10 /* Chip's internal clock won't be stopped in suspended state. 10 /* On-chip overcurrent detection */
11 Setting/unsetting this bit takes effect only if
12 'remote_wakeup_enable' below is not set. */
13 unsigned clknotstop:1;
14 /* On-chip overcurrent protection */
15 unsigned oc_enable:1; 11 unsigned oc_enable:1;
16 /* INT output polarity */ 12 /* INT output polarity */
17 unsigned int_act_high:1; 13 unsigned int_act_high:1;
18 /* INT edge or level triggered */ 14 /* INT edge or level triggered */
19 unsigned int_edge_triggered:1; 15 unsigned int_edge_triggered:1;
20 /* WAKEUP pin connected - NOT SUPPORTED */ 16 /* Enable wakeup by devices on usb bus (e.g. wakeup
21 /* unsigned remote_wakeup_connected:1; */ 17 by attachment/detachment or by device activity
22 /* Wakeup by devices on usb bus enabled */ 18 such as moving a mouse). When chosen, this option
19 prevents stopping internal clock, increasing
20 thereby power consumption in suspended state. */
23 unsigned remote_wakeup_enable:1; 21 unsigned remote_wakeup_enable:1;
24 /* Switch or not to switch (keep always powered) */
25 unsigned no_power_switching:1;
26 /* Ganged port power switching (0) or individual port
27 power switching (1) */
28 unsigned power_switching_mode:1;
29 /* Given port_power, msec/2 after power on till power good */
30 u8 potpg;
31 /* Hardware reset set/clear. If implemented, this function must:
32 if set == 0, deassert chip's HW reset pin
33 otherwise, assert chip's HW reset pin */
34 void (*reset) (struct device * dev, int set);
35 /* Hardware clock start/stop. If implemented, this function must:
36 if start == 0, stop the external clock
37 otherwise, start the external clock
38 */
39 void (*clock) (struct device * dev, int start);
40 /* Inter-io delay (ns). The chip is picky about access timings; it 22 /* Inter-io delay (ns). The chip is picky about access timings; it
41 expects at least: 23 expects at least:
42 150ns delay between consecutive accesses to DATA_REG, 24 150ns delay between consecutive accesses to DATA_REG,
diff --git a/include/net/ax25.h b/include/net/ax25.h
index 364b046e9f47..227d3378decd 100644
--- a/include/net/ax25.h
+++ b/include/net/ax25.h
@@ -258,7 +258,7 @@ extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
258/* ax25_addr.c */ 258/* ax25_addr.c */
259extern ax25_address null_ax25_address; 259extern ax25_address null_ax25_address;
260extern char *ax2asc(char *buf, ax25_address *); 260extern char *ax2asc(char *buf, ax25_address *);
261extern ax25_address *asc2ax(char *); 261extern void asc2ax(ax25_address *addr, char *callsign);
262extern int ax25cmp(ax25_address *, ax25_address *); 262extern int ax25cmp(ax25_address *, ax25_address *);
263extern int ax25digicmp(ax25_digi *, ax25_digi *); 263extern int ax25digicmp(ax25_digi *, ax25_digi *);
264extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *); 264extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *);
diff --git a/include/net/compat.h b/include/net/compat.h
index 482eb820f13a..290bab46d457 100644
--- a/include/net/compat.h
+++ b/include/net/compat.h
@@ -33,7 +33,8 @@ extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsi
33extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned); 33extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned);
34extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *); 34extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *);
35extern int put_cmsg_compat(struct msghdr*, int, int, int, void *); 35extern int put_cmsg_compat(struct msghdr*, int, int, int, void *);
36extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, 36
37 int); 37struct sock;
38extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, int);
38 39
39#endif /* NET_COMPAT_H */ 40#endif /* NET_COMPAT_H */
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 3203eaff4bd4..65ec86678a08 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -233,6 +233,10 @@ extern int ip6_ra_control(struct sock *sk, int sel,
233extern int ipv6_parse_hopopts(struct sk_buff *skb, int); 233extern int ipv6_parse_hopopts(struct sk_buff *skb, int);
234 234
235extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); 235extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt);
236extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
237 int newtype,
238 struct ipv6_opt_hdr __user *newopt,
239 int newoptlen);
236 240
237extern int ip6_frag_nqueues; 241extern int ip6_frag_nqueues;
238extern atomic_t ip6_frag_mem; 242extern atomic_t ip6_frag_mem;
@@ -373,6 +377,7 @@ extern int ip6_append_data(struct sock *sk,
373 int length, 377 int length,
374 int transhdrlen, 378 int transhdrlen,
375 int hlimit, 379 int hlimit,
380 int tclass,
376 struct ipv6_txoptions *opt, 381 struct ipv6_txoptions *opt,
377 struct flowi *fl, 382 struct flowi *fl,
378 struct rt6_info *rt, 383 struct rt6_info *rt,
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h
index 8b075ab7a26c..4e86f2de6638 100644
--- a/include/net/transp_v6.h
+++ b/include/net/transp_v6.h
@@ -37,7 +37,7 @@ extern int datagram_recv_ctl(struct sock *sk,
37extern int datagram_send_ctl(struct msghdr *msg, 37extern int datagram_send_ctl(struct msghdr *msg,
38 struct flowi *fl, 38 struct flowi *fl,
39 struct ipv6_txoptions *opt, 39 struct ipv6_txoptions *opt,
40 int *hlimit); 40 int *hlimit, int *tclass);
41 41
42#define LOOPBACK4_IPV6 __constant_htonl(0x7f000006) 42#define LOOPBACK4_IPV6 __constant_htonl(0x7f000006)
43 43
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 13492d66b7c8..afa06e184d88 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -88,7 +88,7 @@ static kmem_cache_t *sn_cache;
88 policied. */ 88 policied. */
89static int policy_zone; 89static int policy_zone;
90 90
91static struct mempolicy default_policy = { 91struct mempolicy default_policy = {
92 .refcnt = ATOMIC_INIT(1), /* never free it */ 92 .refcnt = ATOMIC_INIT(1), /* never free it */
93 .policy = MPOL_DEFAULT, 93 .policy = MPOL_DEFAULT,
94}; 94};
diff --git a/net/ax25/ax25_addr.c b/net/ax25/ax25_addr.c
index dca179daf415..0164a155b8c4 100644
--- a/net/ax25/ax25_addr.c
+++ b/net/ax25/ax25_addr.c
@@ -67,37 +67,34 @@ char *ax2asc(char *buf, ax25_address *a)
67/* 67/*
68 * ascii -> ax25 conversion 68 * ascii -> ax25 conversion
69 */ 69 */
70ax25_address *asc2ax(char *callsign) 70void asc2ax(ax25_address *addr, char *callsign)
71{ 71{
72 static ax25_address addr;
73 char *s; 72 char *s;
74 int n; 73 int n;
75 74
76 for (s = callsign, n = 0; n < 6; n++) { 75 for (s = callsign, n = 0; n < 6; n++) {
77 if (*s != '\0' && *s != '-') 76 if (*s != '\0' && *s != '-')
78 addr.ax25_call[n] = *s++; 77 addr->ax25_call[n] = *s++;
79 else 78 else
80 addr.ax25_call[n] = ' '; 79 addr->ax25_call[n] = ' ';
81 addr.ax25_call[n] <<= 1; 80 addr->ax25_call[n] <<= 1;
82 addr.ax25_call[n] &= 0xFE; 81 addr->ax25_call[n] &= 0xFE;
83 } 82 }
84 83
85 if (*s++ == '\0') { 84 if (*s++ == '\0') {
86 addr.ax25_call[6] = 0x00; 85 addr->ax25_call[6] = 0x00;
87 return &addr; 86 return;
88 } 87 }
89 88
90 addr.ax25_call[6] = *s++ - '0'; 89 addr->ax25_call[6] = *s++ - '0';
91 90
92 if (*s != '\0') { 91 if (*s != '\0') {
93 addr.ax25_call[6] *= 10; 92 addr->ax25_call[6] *= 10;
94 addr.ax25_call[6] += *s++ - '0'; 93 addr->ax25_call[6] += *s++ - '0';
95 } 94 }
96 95
97 addr.ax25_call[6] <<= 1; 96 addr->ax25_call[6] <<= 1;
98 addr.ax25_call[6] &= 0x1E; 97 addr->ax25_call[6] &= 0x1E;
99
100 return &addr;
101} 98}
102 99
103/* 100/*
diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig
index 58ed4319e693..91b16fbf91f0 100644
--- a/net/ieee80211/Kconfig
+++ b/net/ieee80211/Kconfig
@@ -1,6 +1,5 @@
1config IEEE80211 1config IEEE80211
2 tristate "Generic IEEE 802.11 Networking Stack" 2 tristate "Generic IEEE 802.11 Networking Stack"
3 select NET_RADIO
4 ---help--- 3 ---help---
5 This option enables the hardware independent IEEE 802.11 4 This option enables the hardware independent IEEE 802.11
6 networking stack. 5 networking stack.
diff --git a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
index 2b5cf9c51309..bb7246683b74 100644
--- a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
+++ b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c
@@ -104,12 +104,28 @@ out:
104static struct ip_conntrack_helper helper = { 104static struct ip_conntrack_helper helper = {
105 .name = "netbios-ns", 105 .name = "netbios-ns",
106 .tuple = { 106 .tuple = {
107 .src.u.udp.port = __constant_htons(137), 107 .src = {
108 .dst.protonum = IPPROTO_UDP, 108 .u = {
109 .udp = {
110 .port = __constant_htons(137),
111 }
112 }
113 },
114 .dst = {
115 .protonum = IPPROTO_UDP,
116 },
109 }, 117 },
110 .mask = { 118 .mask = {
111 .src.u.udp.port = 0xFFFF, 119 .src = {
112 .dst.protonum = 0xFF, 120 .u = {
121 .udp = {
122 .port = 0xFFFF,
123 }
124 }
125 },
126 .dst = {
127 .protonum = 0xFF,
128 },
113 }, 129 },
114 .max_expected = 1, 130 .max_expected = 1,
115 .me = THIS_MODULE, 131 .me = THIS_MODULE,
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c
index f115a84a4ac6..f057025a719e 100644
--- a/net/ipv4/netfilter/ipt_REJECT.c
+++ b/net/ipv4/netfilter/ipt_REJECT.c
@@ -92,10 +92,7 @@ static inline struct rtable *route_reverse(struct sk_buff *skb,
92 fl.fl_ip_sport = tcph->dest; 92 fl.fl_ip_sport = tcph->dest;
93 fl.fl_ip_dport = tcph->source; 93 fl.fl_ip_dport = tcph->source;
94 94
95 if (xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0)) { 95 xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0);
96 dst_release(&rt->u.dst);
97 rt = NULL;
98 }
99 96
100 return rt; 97 return rt;
101} 98}
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 8c0b14e3beec..8549f26e2495 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1760,6 +1760,7 @@ static inline int __mkroute_input(struct sk_buff *skb,
1760 goto cleanup; 1760 goto cleanup;
1761 } 1761 }
1762 1762
1763 atomic_set(&rth->u.dst.__refcnt, 1);
1763 rth->u.dst.flags= DST_HOST; 1764 rth->u.dst.flags= DST_HOST;
1764#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED 1765#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
1765 if (res->fi->fib_nhs > 1) 1766 if (res->fi->fib_nhs > 1)
@@ -1820,7 +1821,6 @@ static inline int ip_mkroute_input_def(struct sk_buff *skb,
1820 err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth); 1821 err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth);
1821 if (err) 1822 if (err)
1822 return err; 1823 return err;
1823 atomic_set(&rth->u.dst.__refcnt, 1);
1824 1824
1825 /* put it into the cache */ 1825 /* put it into the cache */
1826 hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); 1826 hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos);
@@ -1834,8 +1834,8 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
1834 u32 daddr, u32 saddr, u32 tos) 1834 u32 daddr, u32 saddr, u32 tos)
1835{ 1835{
1836#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED 1836#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
1837 struct rtable* rth = NULL; 1837 struct rtable* rth = NULL, *rtres;
1838 unsigned char hop, hopcount, lasthop; 1838 unsigned char hop, hopcount;
1839 int err = -EINVAL; 1839 int err = -EINVAL;
1840 unsigned int hash; 1840 unsigned int hash;
1841 1841
@@ -1844,8 +1844,6 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
1844 else 1844 else
1845 hopcount = 1; 1845 hopcount = 1;
1846 1846
1847 lasthop = hopcount - 1;
1848
1849 /* distinguish between multipath and singlepath */ 1847 /* distinguish between multipath and singlepath */
1850 if (hopcount < 2) 1848 if (hopcount < 2)
1851 return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, 1849 return ip_mkroute_input_def(skb, res, fl, in_dev, daddr,
@@ -1855,6 +1853,10 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
1855 for (hop = 0; hop < hopcount; hop++) { 1853 for (hop = 0; hop < hopcount; hop++) {
1856 res->nh_sel = hop; 1854 res->nh_sel = hop;
1857 1855
1856 /* put reference to previous result */
1857 if (hop)
1858 ip_rt_put(rtres);
1859
1858 /* create a routing cache entry */ 1860 /* create a routing cache entry */
1859 err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, 1861 err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos,
1860 &rth); 1862 &rth);
@@ -1863,7 +1865,7 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
1863 1865
1864 /* put it into the cache */ 1866 /* put it into the cache */
1865 hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); 1867 hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos);
1866 err = rt_intern_hash(hash, rth, (struct rtable**)&skb->dst); 1868 err = rt_intern_hash(hash, rth, &rtres);
1867 if (err) 1869 if (err)
1868 return err; 1870 return err;
1869 1871
@@ -1873,13 +1875,8 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
1873 FIB_RES_NETMASK(*res), 1875 FIB_RES_NETMASK(*res),
1874 res->prefixlen, 1876 res->prefixlen,
1875 &FIB_RES_NH(*res)); 1877 &FIB_RES_NH(*res));
1876
1877 /* only for the last hop the reference count is handled
1878 * outside
1879 */
1880 if (hop == lasthop)
1881 atomic_set(&(skb->dst->__refcnt), 1);
1882 } 1878 }
1879 skb->dst = &rtres->u.dst;
1883 return err; 1880 return err;
1884#else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */ 1881#else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
1885 return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos); 1882 return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos);
@@ -2208,6 +2205,7 @@ static inline int __mkroute_output(struct rtable **result,
2208 goto cleanup; 2205 goto cleanup;
2209 } 2206 }
2210 2207
2208 atomic_set(&rth->u.dst.__refcnt, 1);
2211 rth->u.dst.flags= DST_HOST; 2209 rth->u.dst.flags= DST_HOST;
2212#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED 2210#ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
2213 if (res->fi) { 2211 if (res->fi) {
@@ -2290,8 +2288,6 @@ static inline int ip_mkroute_output_def(struct rtable **rp,
2290 if (err == 0) { 2288 if (err == 0) {
2291 u32 tos = RT_FL_TOS(oldflp); 2289 u32 tos = RT_FL_TOS(oldflp);
2292 2290
2293 atomic_set(&rth->u.dst.__refcnt, 1);
2294
2295 hash = rt_hash_code(oldflp->fl4_dst, 2291 hash = rt_hash_code(oldflp->fl4_dst,
2296 oldflp->fl4_src ^ (oldflp->oif << 5), tos); 2292 oldflp->fl4_src ^ (oldflp->oif << 5), tos);
2297 err = rt_intern_hash(hash, rth, rp); 2293 err = rt_intern_hash(hash, rth, rp);
@@ -2326,6 +2322,10 @@ static inline int ip_mkroute_output(struct rtable** rp,
2326 dev2nexthop = FIB_RES_DEV(*res); 2322 dev2nexthop = FIB_RES_DEV(*res);
2327 dev_hold(dev2nexthop); 2323 dev_hold(dev2nexthop);
2328 2324
2325 /* put reference to previous result */
2326 if (hop)
2327 ip_rt_put(*rp);
2328
2329 err = __mkroute_output(&rth, res, fl, oldflp, 2329 err = __mkroute_output(&rth, res, fl, oldflp,
2330 dev2nexthop, flags); 2330 dev2nexthop, flags);
2331 2331
@@ -2350,7 +2350,6 @@ static inline int ip_mkroute_output(struct rtable** rp,
2350 if (err != 0) 2350 if (err != 0)
2351 return err; 2351 return err;
2352 } 2352 }
2353 atomic_set(&(*rp)->u.dst.__refcnt, 1);
2354 return err; 2353 return err;
2355 } else { 2354 } else {
2356 return ip_mkroute_output_def(rp, res, fl, oldflp, dev_out, 2355 return ip_mkroute_output_def(rp, res, fl, oldflp, dev_out,
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 6094db5e11be..15e1134da1b2 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -499,7 +499,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
499 /* If this packet has been sent out already, we must 499 /* If this packet has been sent out already, we must
500 * adjust the various packet counters. 500 * adjust the various packet counters.
501 */ 501 */
502 if (after(tp->snd_nxt, TCP_SKB_CB(buff)->end_seq)) { 502 if (!before(tp->snd_nxt, TCP_SKB_CB(buff)->end_seq)) {
503 int diff = old_factor - tcp_skb_pcount(skb) - 503 int diff = old_factor - tcp_skb_pcount(skb) -
504 tcp_skb_pcount(buff); 504 tcp_skb_pcount(buff);
505 505
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index e5beca7de86c..e0bd1013cb0d 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1141,7 +1141,7 @@ int udp_rcv(struct sk_buff *skb)
1141 if (ulen > len || ulen < sizeof(*uh)) 1141 if (ulen > len || ulen < sizeof(*uh))
1142 goto short_packet; 1142 goto short_packet;
1143 1143
1144 if (pskb_trim(skb, ulen)) 1144 if (pskb_trim_rcsum(skb, ulen))
1145 goto short_packet; 1145 goto short_packet;
1146 1146
1147 if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0) 1147 if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0)
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index 01468fab3d3d..cc518405b3e1 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -175,10 +175,8 @@ ipv4_connected:
175 if (final_p) 175 if (final_p)
176 ipv6_addr_copy(&fl.fl6_dst, final_p); 176 ipv6_addr_copy(&fl.fl6_dst, final_p);
177 177
178 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { 178 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
179 dst_release(dst);
180 goto out; 179 goto out;
181 }
182 180
183 /* source address lookup done in ip6_dst_lookup */ 181 /* source address lookup done in ip6_dst_lookup */
184 182
@@ -390,32 +388,101 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
390 put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); 388 put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim);
391 } 389 }
392 390
391 if (np->rxopt.bits.rxtclass) {
392 int tclass = (ntohl(*(u32 *)skb->nh.ipv6h) >> 20) & 0xff;
393 put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
394 }
395
393 if (np->rxopt.bits.rxflow && (*(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK)) { 396 if (np->rxopt.bits.rxflow && (*(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK)) {
394 u32 flowinfo = *(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK; 397 u32 flowinfo = *(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK;
395 put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo); 398 put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
396 } 399 }
400
401 /* HbH is allowed only once */
397 if (np->rxopt.bits.hopopts && opt->hop) { 402 if (np->rxopt.bits.hopopts && opt->hop) {
398 u8 *ptr = skb->nh.raw + opt->hop; 403 u8 *ptr = skb->nh.raw + opt->hop;
399 put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr); 404 put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
400 } 405 }
401 if (np->rxopt.bits.dstopts && opt->dst0) { 406
407 if (opt->lastopt &&
408 (np->rxopt.bits.dstopts || np->rxopt.bits.srcrt)) {
409 /*
410 * Silly enough, but we need to reparse in order to
411 * report extension headers (except for HbH)
412 * in order.
413 *
414 * Also note that IPV6_RECVRTHDRDSTOPTS is NOT
415 * (and WILL NOT be) defined because
416 * IPV6_RECVDSTOPTS is more generic. --yoshfuji
417 */
418 unsigned int off = sizeof(struct ipv6hdr);
419 u8 nexthdr = skb->nh.ipv6h->nexthdr;
420
421 while (off <= opt->lastopt) {
422 unsigned len;
423 u8 *ptr = skb->nh.raw + off;
424
425 switch(nexthdr) {
426 case IPPROTO_DSTOPTS:
427 nexthdr = ptr[0];
428 len = (ptr[1] + 1) << 3;
429 if (np->rxopt.bits.dstopts)
430 put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, len, ptr);
431 break;
432 case IPPROTO_ROUTING:
433 nexthdr = ptr[0];
434 len = (ptr[1] + 1) << 3;
435 if (np->rxopt.bits.srcrt)
436 put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, len, ptr);
437 break;
438 case IPPROTO_AH:
439 nexthdr = ptr[0];
440 len = (ptr[1] + 1) << 2;
441 break;
442 default:
443 nexthdr = ptr[0];
444 len = (ptr[1] + 1) << 3;
445 break;
446 }
447
448 off += len;
449 }
450 }
451
452 /* socket options in old style */
453 if (np->rxopt.bits.rxoinfo) {
454 struct in6_pktinfo src_info;
455
456 src_info.ipi6_ifindex = opt->iif;
457 ipv6_addr_copy(&src_info.ipi6_addr, &skb->nh.ipv6h->daddr);
458 put_cmsg(msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info);
459 }
460 if (np->rxopt.bits.rxohlim) {
461 int hlim = skb->nh.ipv6h->hop_limit;
462 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
463 }
464 if (np->rxopt.bits.ohopopts && opt->hop) {
465 u8 *ptr = skb->nh.raw + opt->hop;
466 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
467 }
468 if (np->rxopt.bits.odstopts && opt->dst0) {
402 u8 *ptr = skb->nh.raw + opt->dst0; 469 u8 *ptr = skb->nh.raw + opt->dst0;
403 put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, (ptr[1]+1)<<3, ptr); 470 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
404 } 471 }
405 if (np->rxopt.bits.srcrt && opt->srcrt) { 472 if (np->rxopt.bits.osrcrt && opt->srcrt) {
406 struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(skb->nh.raw + opt->srcrt); 473 struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(skb->nh.raw + opt->srcrt);
407 put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, (rthdr->hdrlen+1) << 3, rthdr); 474 put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr);
408 } 475 }
409 if (np->rxopt.bits.dstopts && opt->dst1) { 476 if (np->rxopt.bits.odstopts && opt->dst1) {
410 u8 *ptr = skb->nh.raw + opt->dst1; 477 u8 *ptr = skb->nh.raw + opt->dst1;
411 put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, (ptr[1]+1)<<3, ptr); 478 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
412 } 479 }
413 return 0; 480 return 0;
414} 481}
415 482
416int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, 483int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
417 struct ipv6_txoptions *opt, 484 struct ipv6_txoptions *opt,
418 int *hlimit) 485 int *hlimit, int *tclass)
419{ 486{
420 struct in6_pktinfo *src_info; 487 struct in6_pktinfo *src_info;
421 struct cmsghdr *cmsg; 488 struct cmsghdr *cmsg;
@@ -438,6 +505,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
438 505
439 switch (cmsg->cmsg_type) { 506 switch (cmsg->cmsg_type) {
440 case IPV6_PKTINFO: 507 case IPV6_PKTINFO:
508 case IPV6_2292PKTINFO:
441 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) { 509 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
442 err = -EINVAL; 510 err = -EINVAL;
443 goto exit_f; 511 goto exit_f;
@@ -492,6 +560,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
492 fl->fl6_flowlabel = IPV6_FLOWINFO_MASK & *(u32 *)CMSG_DATA(cmsg); 560 fl->fl6_flowlabel = IPV6_FLOWINFO_MASK & *(u32 *)CMSG_DATA(cmsg);
493 break; 561 break;
494 562
563 case IPV6_2292HOPOPTS:
495 case IPV6_HOPOPTS: 564 case IPV6_HOPOPTS:
496 if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { 565 if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
497 err = -EINVAL; 566 err = -EINVAL;
@@ -512,7 +581,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
512 opt->hopopt = hdr; 581 opt->hopopt = hdr;
513 break; 582 break;
514 583
515 case IPV6_DSTOPTS: 584 case IPV6_2292DSTOPTS:
516 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { 585 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
517 err = -EINVAL; 586 err = -EINVAL;
518 goto exit_f; 587 goto exit_f;
@@ -536,6 +605,33 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
536 opt->dst1opt = hdr; 605 opt->dst1opt = hdr;
537 break; 606 break;
538 607
608 case IPV6_DSTOPTS:
609 case IPV6_RTHDRDSTOPTS:
610 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
611 err = -EINVAL;
612 goto exit_f;
613 }
614
615 hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg);
616 len = ((hdr->hdrlen + 1) << 3);
617 if (cmsg->cmsg_len < CMSG_LEN(len)) {
618 err = -EINVAL;
619 goto exit_f;
620 }
621 if (!capable(CAP_NET_RAW)) {
622 err = -EPERM;
623 goto exit_f;
624 }
625 if (cmsg->cmsg_type == IPV6_DSTOPTS) {
626 opt->opt_flen += len;
627 opt->dst1opt = hdr;
628 } else {
629 opt->opt_nflen += len;
630 opt->dst0opt = hdr;
631 }
632 break;
633
634 case IPV6_2292RTHDR:
539 case IPV6_RTHDR: 635 case IPV6_RTHDR:
540 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) { 636 if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
541 err = -EINVAL; 637 err = -EINVAL;
@@ -568,7 +664,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
568 opt->opt_nflen += len; 664 opt->opt_nflen += len;
569 opt->srcrt = rthdr; 665 opt->srcrt = rthdr;
570 666
571 if (opt->dst1opt) { 667 if (cmsg->cmsg_type == IPV6_2292RTHDR && opt->dst1opt) {
572 int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3); 668 int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3);
573 669
574 opt->opt_nflen += dsthdrlen; 670 opt->opt_nflen += dsthdrlen;
@@ -579,6 +675,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
579 675
580 break; 676 break;
581 677
678 case IPV6_2292HOPLIMIT:
582 case IPV6_HOPLIMIT: 679 case IPV6_HOPLIMIT:
583 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { 680 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) {
584 err = -EINVAL; 681 err = -EINVAL;
@@ -588,6 +685,24 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
588 *hlimit = *(int *)CMSG_DATA(cmsg); 685 *hlimit = *(int *)CMSG_DATA(cmsg);
589 break; 686 break;
590 687
688 case IPV6_TCLASS:
689 {
690 int tc;
691
692 err = -EINVAL;
693 if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) {
694 goto exit_f;
695 }
696
697 tc = *(int *)CMSG_DATA(cmsg);
698 if (tc < 0 || tc > 0xff)
699 goto exit_f;
700
701 err = 0;
702 *tclass = tc;
703
704 break;
705 }
591 default: 706 default:
592 LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n", 707 LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n",
593 cmsg->cmsg_type); 708 cmsg->cmsg_type);
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 5be6da2584ee..47122728212a 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -164,6 +164,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
164 return -1; 164 return -1;
165 } 165 }
166 166
167 opt->lastopt = skb->h.raw - skb->nh.raw;
167 opt->dst1 = skb->h.raw - skb->nh.raw; 168 opt->dst1 = skb->h.raw - skb->nh.raw;
168 169
169 if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { 170 if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) {
@@ -243,6 +244,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
243 244
244looped_back: 245looped_back:
245 if (hdr->segments_left == 0) { 246 if (hdr->segments_left == 0) {
247 opt->lastopt = skb->h.raw - skb->nh.raw;
246 opt->srcrt = skb->h.raw - skb->nh.raw; 248 opt->srcrt = skb->h.raw - skb->nh.raw;
247 skb->h.raw += (hdr->hdrlen + 1) << 3; 249 skb->h.raw += (hdr->hdrlen + 1) << 3;
248 opt->dst0 = opt->dst1; 250 opt->dst0 = opt->dst1;
@@ -459,11 +461,10 @@ static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff)
459 IP6_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS); 461 IP6_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS);
460 goto drop; 462 goto drop;
461 } 463 }
462 if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { 464
463 __pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr)); 465 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr)))
464 if (skb->ip_summed == CHECKSUM_HW) 466 goto drop;
465 skb->ip_summed = CHECKSUM_NONE; 467
466 }
467 return 1; 468 return 1;
468 469
469drop: 470drop:
@@ -539,10 +540,15 @@ void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
539 u8 *proto, 540 u8 *proto,
540 struct in6_addr **daddr) 541 struct in6_addr **daddr)
541{ 542{
542 if (opt->srcrt) 543 if (opt->srcrt) {
543 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr); 544 ipv6_push_rthdr(skb, proto, opt->srcrt, daddr);
544 if (opt->dst0opt) 545 /*
545 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); 546 * IPV6_RTHDRDSTOPTS is ignored
547 * unless IPV6_RTHDR is set (RFC3542).
548 */
549 if (opt->dst0opt)
550 ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt);
551 }
546 if (opt->hopopt) 552 if (opt->hopopt)
547 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); 553 ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt);
548} 554}
@@ -573,3 +579,97 @@ ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt)
573 } 579 }
574 return opt2; 580 return opt2;
575} 581}
582
583static int ipv6_renew_option(void *ohdr,
584 struct ipv6_opt_hdr __user *newopt, int newoptlen,
585 int inherit,
586 struct ipv6_opt_hdr **hdr,
587 char **p)
588{
589 if (inherit) {
590 if (ohdr) {
591 memcpy(*p, ohdr, ipv6_optlen((struct ipv6_opt_hdr *)ohdr));
592 *hdr = (struct ipv6_opt_hdr *)*p;
593 *p += CMSG_ALIGN(ipv6_optlen(*(struct ipv6_opt_hdr **)hdr));
594 }
595 } else {
596 if (newopt) {
597 if (copy_from_user(*p, newopt, newoptlen))
598 return -EFAULT;
599 *hdr = (struct ipv6_opt_hdr *)*p;
600 if (ipv6_optlen(*(struct ipv6_opt_hdr **)hdr) > newoptlen)
601 return -EINVAL;
602 *p += CMSG_ALIGN(newoptlen);
603 }
604 }
605 return 0;
606}
607
608struct ipv6_txoptions *
609ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
610 int newtype,
611 struct ipv6_opt_hdr __user *newopt, int newoptlen)
612{
613 int tot_len = 0;
614 char *p;
615 struct ipv6_txoptions *opt2;
616 int err;
617
618 if (newtype != IPV6_HOPOPTS && opt->hopopt)
619 tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt));
620 if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt)
621 tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt));
622 if (newtype != IPV6_RTHDR && opt->srcrt)
623 tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt));
624 if (newtype != IPV6_DSTOPTS && opt->dst1opt)
625 tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt));
626 if (newopt && newoptlen)
627 tot_len += CMSG_ALIGN(newoptlen);
628
629 if (!tot_len)
630 return NULL;
631
632 opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC);
633 if (!opt2)
634 return ERR_PTR(-ENOBUFS);
635
636 memset(opt2, 0, tot_len);
637
638 opt2->tot_len = tot_len;
639 p = (char *)(opt2 + 1);
640
641 err = ipv6_renew_option(opt->hopopt, newopt, newoptlen,
642 newtype != IPV6_HOPOPTS,
643 &opt2->hopopt, &p);
644 if (err)
645 goto out;
646
647 err = ipv6_renew_option(opt->dst0opt, newopt, newoptlen,
648 newtype != IPV6_RTHDRDSTOPTS,
649 &opt2->dst0opt, &p);
650 if (err)
651 goto out;
652
653 err = ipv6_renew_option(opt->srcrt, newopt, newoptlen,
654 newtype != IPV6_RTHDR,
655 (struct ipv6_opt_hdr **)opt2->srcrt, &p);
656 if (err)
657 goto out;
658
659 err = ipv6_renew_option(opt->dst1opt, newopt, newoptlen,
660 newtype != IPV6_DSTOPTS,
661 &opt2->dst1opt, &p);
662 if (err)
663 goto out;
664
665 opt2->opt_nflen = (opt2->hopopt ? ipv6_optlen(opt2->hopopt) : 0) +
666 (opt2->dst0opt ? ipv6_optlen(opt2->dst0opt) : 0) +
667 (opt2->srcrt ? ipv6_optlen(opt2->srcrt) : 0);
668 opt2->opt_flen = (opt2->dst1opt ? ipv6_optlen(opt2->dst1opt) : 0);
669
670 return opt2;
671out:
672 sock_kfree_s(sk, p, tot_len);
673 return ERR_PTR(err);
674}
675
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index fa8f1bb0aa52..b7185fb3377c 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -287,7 +287,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
287 int iif = 0; 287 int iif = 0;
288 int addr_type = 0; 288 int addr_type = 0;
289 int len; 289 int len;
290 int hlimit; 290 int hlimit, tclass;
291 int err = 0; 291 int err = 0;
292 292
293 if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail) 293 if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail)
@@ -374,7 +374,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
374 if (err) 374 if (err)
375 goto out; 375 goto out;
376 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) 376 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
377 goto out_dst_release; 377 goto out;
378 378
379 if (ipv6_addr_is_multicast(&fl.fl6_dst)) 379 if (ipv6_addr_is_multicast(&fl.fl6_dst))
380 hlimit = np->mcast_hops; 380 hlimit = np->mcast_hops;
@@ -385,6 +385,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
385 if (hlimit < 0) 385 if (hlimit < 0)
386 hlimit = ipv6_get_hoplimit(dst->dev); 386 hlimit = ipv6_get_hoplimit(dst->dev);
387 387
388 tclass = np->cork.tclass;
389 if (tclass < 0)
390 tclass = 0;
391
388 msg.skb = skb; 392 msg.skb = skb;
389 msg.offset = skb->nh.raw - skb->data; 393 msg.offset = skb->nh.raw - skb->data;
390 394
@@ -400,7 +404,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
400 err = ip6_append_data(sk, icmpv6_getfrag, &msg, 404 err = ip6_append_data(sk, icmpv6_getfrag, &msg,
401 len + sizeof(struct icmp6hdr), 405 len + sizeof(struct icmp6hdr),
402 sizeof(struct icmp6hdr), 406 sizeof(struct icmp6hdr),
403 hlimit, NULL, &fl, (struct rt6_info*)dst, 407 hlimit, tclass, NULL, &fl, (struct rt6_info*)dst,
404 MSG_DONTWAIT); 408 MSG_DONTWAIT);
405 if (err) { 409 if (err) {
406 ip6_flush_pending_frames(sk); 410 ip6_flush_pending_frames(sk);
@@ -434,6 +438,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
434 struct dst_entry *dst; 438 struct dst_entry *dst;
435 int err = 0; 439 int err = 0;
436 int hlimit; 440 int hlimit;
441 int tclass;
437 442
438 saddr = &skb->nh.ipv6h->daddr; 443 saddr = &skb->nh.ipv6h->daddr;
439 444
@@ -464,7 +469,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
464 if (err) 469 if (err)
465 goto out; 470 goto out;
466 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) 471 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
467 goto out_dst_release; 472 goto out;
468 473
469 if (ipv6_addr_is_multicast(&fl.fl6_dst)) 474 if (ipv6_addr_is_multicast(&fl.fl6_dst))
470 hlimit = np->mcast_hops; 475 hlimit = np->mcast_hops;
@@ -475,13 +480,17 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
475 if (hlimit < 0) 480 if (hlimit < 0)
476 hlimit = ipv6_get_hoplimit(dst->dev); 481 hlimit = ipv6_get_hoplimit(dst->dev);
477 482
483 tclass = np->cork.tclass;
484 if (tclass < 0)
485 tclass = 0;
486
478 idev = in6_dev_get(skb->dev); 487 idev = in6_dev_get(skb->dev);
479 488
480 msg.skb = skb; 489 msg.skb = skb;
481 msg.offset = 0; 490 msg.offset = 0;
482 491
483 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), 492 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr),
484 sizeof(struct icmp6hdr), hlimit, NULL, &fl, 493 sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl,
485 (struct rt6_info*)dst, MSG_DONTWAIT); 494 (struct rt6_info*)dst, MSG_DONTWAIT);
486 495
487 if (err) { 496 if (err) {
@@ -496,7 +505,6 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
496out_put: 505out_put:
497 if (likely(idev != NULL)) 506 if (likely(idev != NULL))
498 in6_dev_put(idev); 507 in6_dev_put(idev);
499out_dst_release:
500 dst_release(dst); 508 dst_release(dst);
501out: 509out:
502 icmpv6_xmit_unlock(); 510 icmpv6_xmit_unlock();
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index b6c73da5ff35..a7db762de14a 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -225,16 +225,20 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
225 struct ip6_flowlabel * fl, 225 struct ip6_flowlabel * fl,
226 struct ipv6_txoptions * fopt) 226 struct ipv6_txoptions * fopt)
227{ 227{
228 struct ipv6_txoptions * fl_opt = fl->opt; 228 struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL;
229 229
230 if (fopt == NULL || fopt->opt_flen == 0) 230 if (fopt == NULL || fopt->opt_flen == 0) {
231 return fl_opt; 231 if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt)
232 return fl_opt;
233 }
232 234
233 if (fl_opt != NULL) { 235 if (fl_opt != NULL) {
234 opt_space->hopopt = fl_opt->hopopt; 236 opt_space->hopopt = fl_opt->hopopt;
235 opt_space->dst0opt = fl_opt->dst0opt; 237 opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL;
236 opt_space->srcrt = fl_opt->srcrt; 238 opt_space->srcrt = fl_opt->srcrt;
237 opt_space->opt_nflen = fl_opt->opt_nflen; 239 opt_space->opt_nflen = fl_opt->opt_nflen;
240 if (fl_opt->dst0opt && !fl_opt->srcrt)
241 opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt);
238 } else { 242 } else {
239 if (fopt->opt_nflen == 0) 243 if (fopt->opt_nflen == 0)
240 return fopt; 244 return fopt;
@@ -310,7 +314,7 @@ fl_create(struct in6_flowlabel_req *freq, char __user *optval, int optlen, int *
310 msg.msg_control = (void*)(fl->opt+1); 314 msg.msg_control = (void*)(fl->opt+1);
311 flowi.oif = 0; 315 flowi.oif = 0;
312 316
313 err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk); 317 err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk, &junk);
314 if (err) 318 if (err)
315 goto done; 319 goto done;
316 err = -EINVAL; 320 err = -EINVAL;
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 01ef94f7c7f1..2f589f24c093 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -166,7 +166,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
166 struct ipv6hdr *hdr; 166 struct ipv6hdr *hdr;
167 u8 proto = fl->proto; 167 u8 proto = fl->proto;
168 int seg_len = skb->len; 168 int seg_len = skb->len;
169 int hlimit; 169 int hlimit, tclass;
170 u32 mtu; 170 u32 mtu;
171 171
172 if (opt) { 172 if (opt) {
@@ -202,7 +202,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
202 * Fill in the IPv6 header 202 * Fill in the IPv6 header
203 */ 203 */
204 204
205 *(u32*)hdr = htonl(0x60000000) | fl->fl6_flowlabel;
206 hlimit = -1; 205 hlimit = -1;
207 if (np) 206 if (np)
208 hlimit = np->hop_limit; 207 hlimit = np->hop_limit;
@@ -211,6 +210,14 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
211 if (hlimit < 0) 210 if (hlimit < 0)
212 hlimit = ipv6_get_hoplimit(dst->dev); 211 hlimit = ipv6_get_hoplimit(dst->dev);
213 212
213 tclass = -1;
214 if (np)
215 tclass = np->tclass;
216 if (tclass < 0)
217 tclass = 0;
218
219 *(u32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl->fl6_flowlabel;
220
214 hdr->payload_len = htons(seg_len); 221 hdr->payload_len = htons(seg_len);
215 hdr->nexthdr = proto; 222 hdr->nexthdr = proto;
216 hdr->hop_limit = hlimit; 223 hdr->hop_limit = hlimit;
@@ -762,10 +769,11 @@ out_err_release:
762 return err; 769 return err;
763} 770}
764 771
765int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), 772int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
766 void *from, int length, int transhdrlen, 773 int offset, int len, int odd, struct sk_buff *skb),
767 int hlimit, struct ipv6_txoptions *opt, struct flowi *fl, struct rt6_info *rt, 774 void *from, int length, int transhdrlen,
768 unsigned int flags) 775 int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi *fl,
776 struct rt6_info *rt, unsigned int flags)
769{ 777{
770 struct inet_sock *inet = inet_sk(sk); 778 struct inet_sock *inet = inet_sk(sk);
771 struct ipv6_pinfo *np = inet6_sk(sk); 779 struct ipv6_pinfo *np = inet6_sk(sk);
@@ -803,6 +811,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offse
803 np->cork.rt = rt; 811 np->cork.rt = rt;
804 inet->cork.fl = *fl; 812 inet->cork.fl = *fl;
805 np->cork.hop_limit = hlimit; 813 np->cork.hop_limit = hlimit;
814 np->cork.tclass = tclass;
806 inet->cork.fragsize = mtu = dst_mtu(rt->u.dst.path); 815 inet->cork.fragsize = mtu = dst_mtu(rt->u.dst.path);
807 if (dst_allfrag(rt->u.dst.path)) 816 if (dst_allfrag(rt->u.dst.path))
808 inet->cork.flags |= IPCORK_ALLFRAG; 817 inet->cork.flags |= IPCORK_ALLFRAG;
@@ -1084,7 +1093,8 @@ int ip6_push_pending_frames(struct sock *sk)
1084 1093
1085 skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr)); 1094 skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr));
1086 1095
1087 *(u32*)hdr = fl->fl6_flowlabel | htonl(0x60000000); 1096 *(u32*)hdr = fl->fl6_flowlabel |
1097 htonl(0x60000000 | ((int)np->cork.tclass << 20));
1088 1098
1089 if (skb->len <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) 1099 if (skb->len <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN)
1090 hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); 1100 hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 09613729404c..cf94372d1af3 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -673,11 +673,12 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
673 673
674 if ((dst = ip6_tnl_dst_check(t)) != NULL) 674 if ((dst = ip6_tnl_dst_check(t)) != NULL)
675 dst_hold(dst); 675 dst_hold(dst);
676 else 676 else {
677 dst = ip6_route_output(NULL, &fl); 677 dst = ip6_route_output(NULL, &fl);
678 678
679 if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0) < 0) 679 if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0) < 0)
680 goto tx_err_link_failure; 680 goto tx_err_link_failure;
681 }
681 682
682 tdev = dst->dev; 683 tdev = dst->dev;
683 684
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
index 76466af8331e..8567873d0dd8 100644
--- a/net/ipv6/ipv6_sockglue.c
+++ b/net/ipv6/ipv6_sockglue.c
@@ -210,39 +210,139 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
210 retv = 0; 210 retv = 0;
211 break; 211 break;
212 212
213 case IPV6_PKTINFO: 213 case IPV6_RECVPKTINFO:
214 np->rxopt.bits.rxinfo = valbool; 214 np->rxopt.bits.rxinfo = valbool;
215 retv = 0; 215 retv = 0;
216 break; 216 break;
217
218 case IPV6_2292PKTINFO:
219 np->rxopt.bits.rxoinfo = valbool;
220 retv = 0;
221 break;
217 222
218 case IPV6_HOPLIMIT: 223 case IPV6_RECVHOPLIMIT:
219 np->rxopt.bits.rxhlim = valbool; 224 np->rxopt.bits.rxhlim = valbool;
220 retv = 0; 225 retv = 0;
221 break; 226 break;
222 227
223 case IPV6_RTHDR: 228 case IPV6_2292HOPLIMIT:
229 np->rxopt.bits.rxohlim = valbool;
230 retv = 0;
231 break;
232
233 case IPV6_RECVRTHDR:
224 if (val < 0 || val > 2) 234 if (val < 0 || val > 2)
225 goto e_inval; 235 goto e_inval;
226 np->rxopt.bits.srcrt = val; 236 np->rxopt.bits.srcrt = val;
227 retv = 0; 237 retv = 0;
228 break; 238 break;
229 239
230 case IPV6_HOPOPTS: 240 case IPV6_2292RTHDR:
241 if (val < 0 || val > 2)
242 goto e_inval;
243 np->rxopt.bits.osrcrt = val;
244 retv = 0;
245 break;
246
247 case IPV6_RECVHOPOPTS:
231 np->rxopt.bits.hopopts = valbool; 248 np->rxopt.bits.hopopts = valbool;
232 retv = 0; 249 retv = 0;
233 break; 250 break;
234 251
235 case IPV6_DSTOPTS: 252 case IPV6_2292HOPOPTS:
253 np->rxopt.bits.ohopopts = valbool;
254 retv = 0;
255 break;
256
257 case IPV6_RECVDSTOPTS:
236 np->rxopt.bits.dstopts = valbool; 258 np->rxopt.bits.dstopts = valbool;
237 retv = 0; 259 retv = 0;
238 break; 260 break;
239 261
262 case IPV6_2292DSTOPTS:
263 np->rxopt.bits.odstopts = valbool;
264 retv = 0;
265 break;
266
267 case IPV6_TCLASS:
268 if (val < 0 || val > 0xff)
269 goto e_inval;
270 np->tclass = val;
271 retv = 0;
272 break;
273
274 case IPV6_RECVTCLASS:
275 np->rxopt.bits.rxtclass = valbool;
276 retv = 0;
277 break;
278
240 case IPV6_FLOWINFO: 279 case IPV6_FLOWINFO:
241 np->rxopt.bits.rxflow = valbool; 280 np->rxopt.bits.rxflow = valbool;
242 retv = 0; 281 retv = 0;
243 break; 282 break;
244 283
245 case IPV6_PKTOPTIONS: 284 case IPV6_HOPOPTS:
285 case IPV6_RTHDRDSTOPTS:
286 case IPV6_RTHDR:
287 case IPV6_DSTOPTS:
288 {
289 struct ipv6_txoptions *opt;
290 if (optlen == 0)
291 optval = 0;
292
293 /* hop-by-hop / destination options are privileged option */
294 retv = -EPERM;
295 if (optname != IPV6_RTHDR && !capable(CAP_NET_RAW))
296 break;
297
298 retv = -EINVAL;
299 if (optlen & 0x7 || optlen > 8 * 255)
300 break;
301
302 opt = ipv6_renew_options(sk, np->opt, optname,
303 (struct ipv6_opt_hdr __user *)optval,
304 optlen);
305 if (IS_ERR(opt)) {
306 retv = PTR_ERR(opt);
307 break;
308 }
309
310 /* routing header option needs extra check */
311 if (optname == IPV6_RTHDR && opt->srcrt) {
312 struct ipv6_rt_hdr *rthdr = opt->srcrt;
313 if (rthdr->type)
314 goto sticky_done;
315 if ((rthdr->hdrlen & 1) ||
316 (rthdr->hdrlen >> 1) != rthdr->segments_left)
317 goto sticky_done;
318 }
319
320 retv = 0;
321 if (sk->sk_type == SOCK_STREAM) {
322 if (opt) {
323 struct tcp_sock *tp = tcp_sk(sk);
324 if (!((1 << sk->sk_state) &
325 (TCPF_LISTEN | TCPF_CLOSE))
326 && inet_sk(sk)->daddr != LOOPBACK4_IPV6) {
327 tp->ext_header_len = opt->opt_flen + opt->opt_nflen;
328 tcp_sync_mss(sk, tp->pmtu_cookie);
329 }
330 }
331 opt = xchg(&np->opt, opt);
332 sk_dst_reset(sk);
333 } else {
334 write_lock(&sk->sk_dst_lock);
335 opt = xchg(&np->opt, opt);
336 write_unlock(&sk->sk_dst_lock);
337 sk_dst_reset(sk);
338 }
339sticky_done:
340 if (opt)
341 sock_kfree_s(sk, opt, opt->tot_len);
342 break;
343 }
344
345 case IPV6_2292PKTOPTIONS:
246 { 346 {
247 struct ipv6_txoptions *opt = NULL; 347 struct ipv6_txoptions *opt = NULL;
248 struct msghdr msg; 348 struct msghdr msg;
@@ -276,7 +376,7 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname,
276 msg.msg_controllen = optlen; 376 msg.msg_controllen = optlen;
277 msg.msg_control = (void*)(opt+1); 377 msg.msg_control = (void*)(opt+1);
278 378
279 retv = datagram_send_ctl(&msg, &fl, opt, &junk); 379 retv = datagram_send_ctl(&msg, &fl, opt, &junk, &junk);
280 if (retv) 380 if (retv)
281 goto done; 381 goto done;
282update: 382update:
@@ -529,6 +629,17 @@ e_inval:
529 return -EINVAL; 629 return -EINVAL;
530} 630}
531 631
632int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr,
633 char __user *optval, int len)
634{
635 if (!hdr)
636 return 0;
637 len = min_t(int, len, ipv6_optlen(hdr));
638 if (copy_to_user(optval, hdr, ipv6_optlen(hdr)))
639 return -EFAULT;
640 return len;
641}
642
532int ipv6_getsockopt(struct sock *sk, int level, int optname, 643int ipv6_getsockopt(struct sock *sk, int level, int optname,
533 char __user *optval, int __user *optlen) 644 char __user *optval, int __user *optlen)
534{ 645{
@@ -567,7 +678,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
567 return err; 678 return err;
568 } 679 }
569 680
570 case IPV6_PKTOPTIONS: 681 case IPV6_2292PKTOPTIONS:
571 { 682 {
572 struct msghdr msg; 683 struct msghdr msg;
573 struct sk_buff *skb; 684 struct sk_buff *skb;
@@ -601,6 +712,16 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
601 int hlim = np->mcast_hops; 712 int hlim = np->mcast_hops;
602 put_cmsg(&msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); 713 put_cmsg(&msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim);
603 } 714 }
715 if (np->rxopt.bits.rxoinfo) {
716 struct in6_pktinfo src_info;
717 src_info.ipi6_ifindex = np->mcast_oif;
718 ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr);
719 put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info);
720 }
721 if (np->rxopt.bits.rxohlim) {
722 int hlim = np->mcast_hops;
723 put_cmsg(&msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
724 }
604 } 725 }
605 len -= msg.msg_controllen; 726 len -= msg.msg_controllen;
606 return put_user(len, optlen); 727 return put_user(len, optlen);
@@ -625,26 +746,67 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
625 val = np->ipv6only; 746 val = np->ipv6only;
626 break; 747 break;
627 748
628 case IPV6_PKTINFO: 749 case IPV6_RECVPKTINFO:
629 val = np->rxopt.bits.rxinfo; 750 val = np->rxopt.bits.rxinfo;
630 break; 751 break;
631 752
632 case IPV6_HOPLIMIT: 753 case IPV6_2292PKTINFO:
754 val = np->rxopt.bits.rxoinfo;
755 break;
756
757 case IPV6_RECVHOPLIMIT:
633 val = np->rxopt.bits.rxhlim; 758 val = np->rxopt.bits.rxhlim;
634 break; 759 break;
635 760
636 case IPV6_RTHDR: 761 case IPV6_2292HOPLIMIT:
762 val = np->rxopt.bits.rxohlim;
763 break;
764
765 case IPV6_RECVRTHDR:
637 val = np->rxopt.bits.srcrt; 766 val = np->rxopt.bits.srcrt;
638 break; 767 break;
639 768
769 case IPV6_2292RTHDR:
770 val = np->rxopt.bits.osrcrt;
771 break;
772
640 case IPV6_HOPOPTS: 773 case IPV6_HOPOPTS:
774 case IPV6_RTHDRDSTOPTS:
775 case IPV6_RTHDR:
776 case IPV6_DSTOPTS:
777 {
778
779 lock_sock(sk);
780 len = ipv6_getsockopt_sticky(sk, np->opt->hopopt,
781 optval, len);
782 release_sock(sk);
783 return put_user(len, optlen);
784 }
785
786 case IPV6_RECVHOPOPTS:
641 val = np->rxopt.bits.hopopts; 787 val = np->rxopt.bits.hopopts;
642 break; 788 break;
643 789
644 case IPV6_DSTOPTS: 790 case IPV6_2292HOPOPTS:
791 val = np->rxopt.bits.ohopopts;
792 break;
793
794 case IPV6_RECVDSTOPTS:
645 val = np->rxopt.bits.dstopts; 795 val = np->rxopt.bits.dstopts;
646 break; 796 break;
647 797
798 case IPV6_2292DSTOPTS:
799 val = np->rxopt.bits.odstopts;
800 break;
801
802 case IPV6_TCLASS:
803 val = np->tclass;
804 break;
805
806 case IPV6_RECVTCLASS:
807 val = np->rxopt.bits.rxtclass;
808 break;
809
648 case IPV6_FLOWINFO: 810 case IPV6_FLOWINFO:
649 val = np->rxopt.bits.rxflow; 811 val = np->rxopt.bits.rxflow;
650 break; 812 break;
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index a7eae30f4554..555a31347eda 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -447,10 +447,8 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
447 return; 447 return;
448 448
449 err = xfrm_lookup(&dst, &fl, NULL, 0); 449 err = xfrm_lookup(&dst, &fl, NULL, 0);
450 if (err < 0) { 450 if (err < 0)
451 dst_release(dst);
452 return; 451 return;
453 }
454 452
455 if (inc_opt) { 453 if (inc_opt) {
456 if (dev->addr_len) 454 if (dev->addr_len)
@@ -539,10 +537,8 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
539 return; 537 return;
540 538
541 err = xfrm_lookup(&dst, &fl, NULL, 0); 539 err = xfrm_lookup(&dst, &fl, NULL, 0);
542 if (err < 0) { 540 if (err < 0)
543 dst_release(dst);
544 return; 541 return;
545 }
546 542
547 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); 543 len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
548 send_llinfo = dev->addr_len && !ipv6_addr_any(saddr); 544 send_llinfo = dev->addr_len && !ipv6_addr_any(saddr);
@@ -616,10 +612,8 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
616 return; 612 return;
617 613
618 err = xfrm_lookup(&dst, &fl, NULL, 0); 614 err = xfrm_lookup(&dst, &fl, NULL, 0);
619 if (err < 0) { 615 if (err < 0)
620 dst_release(dst);
621 return; 616 return;
622 }
623 617
624 len = sizeof(struct icmp6hdr); 618 len = sizeof(struct icmp6hdr);
625 if (dev->addr_len) 619 if (dev->addr_len)
@@ -1353,10 +1347,8 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1353 return; 1347 return;
1354 1348
1355 err = xfrm_lookup(&dst, &fl, NULL, 0); 1349 err = xfrm_lookup(&dst, &fl, NULL, 0);
1356 if (err) { 1350 if (err)
1357 dst_release(dst);
1358 return; 1351 return;
1359 }
1360 1352
1361 rt = (struct rt6_info *) dst; 1353 rt = (struct rt6_info *) dst;
1362 1354
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c
index 14316c3ebde4..b03e87adca93 100644
--- a/net/ipv6/netfilter/ip6t_REJECT.c
+++ b/net/ipv6/netfilter/ip6t_REJECT.c
@@ -100,11 +100,8 @@ static void send_reset(struct sk_buff *oldskb)
100 dst = ip6_route_output(NULL, &fl); 100 dst = ip6_route_output(NULL, &fl);
101 if (dst == NULL) 101 if (dst == NULL)
102 return; 102 return;
103 if (dst->error || 103 if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0))
104 xfrm_lookup(&dst, &fl, NULL, 0)) {
105 dst_release(dst);
106 return; 104 return;
107 }
108 105
109 hh_len = (dst->dev->hard_header_len + 15)&~15; 106 hh_len = (dst->dev->hard_header_len + 15)&~15;
110 nskb = alloc_skb(hh_len + 15 + dst->header_len + sizeof(struct ipv6hdr) 107 nskb = alloc_skb(hh_len + 15 + dst->header_len + sizeof(struct ipv6hdr)
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index ed3a76b30fd9..5aa3691c578d 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -655,6 +655,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
655 struct flowi fl; 655 struct flowi fl;
656 int addr_len = msg->msg_namelen; 656 int addr_len = msg->msg_namelen;
657 int hlimit = -1; 657 int hlimit = -1;
658 int tclass = -1;
658 u16 proto; 659 u16 proto;
659 int err; 660 int err;
660 661
@@ -740,7 +741,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
740 memset(opt, 0, sizeof(struct ipv6_txoptions)); 741 memset(opt, 0, sizeof(struct ipv6_txoptions));
741 opt->tot_len = sizeof(struct ipv6_txoptions); 742 opt->tot_len = sizeof(struct ipv6_txoptions);
742 743
743 err = datagram_send_ctl(msg, &fl, opt, &hlimit); 744 err = datagram_send_ctl(msg, &fl, opt, &hlimit, &tclass);
744 if (err < 0) { 745 if (err < 0) {
745 fl6_sock_release(flowlabel); 746 fl6_sock_release(flowlabel);
746 return err; 747 return err;
@@ -755,8 +756,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
755 } 756 }
756 if (opt == NULL) 757 if (opt == NULL)
757 opt = np->opt; 758 opt = np->opt;
758 if (flowlabel) 759 opt = fl6_merge_options(&opt_space, flowlabel, opt);
759 opt = fl6_merge_options(&opt_space, flowlabel, opt);
760 760
761 fl.proto = proto; 761 fl.proto = proto;
762 rawv6_probe_proto_opt(&fl, msg); 762 rawv6_probe_proto_opt(&fl, msg);
@@ -782,10 +782,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
782 if (final_p) 782 if (final_p)
783 ipv6_addr_copy(&fl.fl6_dst, final_p); 783 ipv6_addr_copy(&fl.fl6_dst, final_p);
784 784
785 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { 785 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
786 dst_release(dst);
787 goto out; 786 goto out;
788 }
789 787
790 if (hlimit < 0) { 788 if (hlimit < 0) {
791 if (ipv6_addr_is_multicast(&fl.fl6_dst)) 789 if (ipv6_addr_is_multicast(&fl.fl6_dst))
@@ -798,6 +796,12 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
798 hlimit = ipv6_get_hoplimit(dst->dev); 796 hlimit = ipv6_get_hoplimit(dst->dev);
799 } 797 }
800 798
799 if (tclass < 0) {
800 tclass = np->cork.tclass;
801 if (tclass < 0)
802 tclass = 0;
803 }
804
801 if (msg->msg_flags&MSG_CONFIRM) 805 if (msg->msg_flags&MSG_CONFIRM)
802 goto do_confirm; 806 goto do_confirm;
803 807
@@ -806,8 +810,9 @@ back_from_confirm:
806 err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags); 810 err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags);
807 } else { 811 } else {
808 lock_sock(sk); 812 lock_sock(sk);
809 err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, len, 0, 813 err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov,
810 hlimit, opt, &fl, (struct rt6_info*)dst, msg->msg_flags); 814 len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst,
815 msg->msg_flags);
811 816
812 if (err) 817 if (err)
813 ip6_flush_pending_frames(sk); 818 ip6_flush_pending_frames(sk);
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index 9d9e04344c77..e4fe9ee484dd 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -479,12 +479,9 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
479 /* Point into the IP datagram 'data' part. */ 479 /* Point into the IP datagram 'data' part. */
480 if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) 480 if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data))
481 goto err; 481 goto err;
482 if (end-offset < skb->len) { 482
483 if (pskb_trim(skb, end - offset)) 483 if (pskb_trim_rcsum(skb, end - offset))
484 goto err; 484 goto err;
485 if (skb->ip_summed != CHECKSUM_UNNECESSARY)
486 skb->ip_summed = CHECKSUM_NONE;
487 }
488 485
489 /* Find out which fragments are in front and at the back of us 486 /* Find out which fragments are in front and at the back of us
490 * in the chain of fragments so far. We must know where to put 487 * in the chain of fragments so far. We must know where to put
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 794734f1d230..80643e6b346b 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -632,10 +632,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
632 if (final_p) 632 if (final_p)
633 ipv6_addr_copy(&fl.fl6_dst, final_p); 633 ipv6_addr_copy(&fl.fl6_dst, final_p);
634 634
635 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { 635 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
636 dst_release(dst);
637 goto failure; 636 goto failure;
638 }
639 637
640 if (saddr == NULL) { 638 if (saddr == NULL) {
641 saddr = &fl.fl6_src; 639 saddr = &fl.fl6_src;
@@ -849,7 +847,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
849 if (dst == NULL) { 847 if (dst == NULL) {
850 opt = np->opt; 848 opt = np->opt;
851 if (opt == NULL && 849 if (opt == NULL &&
852 np->rxopt.bits.srcrt == 2 && 850 np->rxopt.bits.osrcrt == 2 &&
853 treq->pktopts) { 851 treq->pktopts) {
854 struct sk_buff *pktopts = treq->pktopts; 852 struct sk_buff *pktopts = treq->pktopts;
855 struct inet6_skb_parm *rxopt = IP6CB(pktopts); 853 struct inet6_skb_parm *rxopt = IP6CB(pktopts);
@@ -888,7 +886,6 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
888 } 886 }
889 887
890done: 888done:
891 dst_release(dst);
892 if (opt && opt != np->opt) 889 if (opt && opt != np->opt)
893 sock_kfree_s(sk, opt, opt->tot_len); 890 sock_kfree_s(sk, opt, opt->tot_len);
894 return err; 891 return err;
@@ -915,11 +912,10 @@ static int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
915 struct inet6_skb_parm *opt = IP6CB(skb); 912 struct inet6_skb_parm *opt = IP6CB(skb);
916 913
917 if (np->rxopt.all) { 914 if (np->rxopt.all) {
918 if ((opt->hop && np->rxopt.bits.hopopts) || 915 if ((opt->hop && (np->rxopt.bits.hopopts || np->rxopt.bits.ohopopts)) ||
919 ((IPV6_FLOWINFO_MASK&*(u32*)skb->nh.raw) && 916 ((IPV6_FLOWINFO_MASK & *(u32*)skb->nh.raw) && np->rxopt.bits.rxflow) ||
920 np->rxopt.bits.rxflow) || 917 (opt->srcrt && (np->rxopt.bits.srcrt || np->rxopt.bits.osrcrt)) ||
921 (opt->srcrt && np->rxopt.bits.srcrt) || 918 ((opt->dst1 || opt->dst0) && (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts)))
922 ((opt->dst1 || opt->dst0) && np->rxopt.bits.dstopts))
923 return 1; 919 return 1;
924 } 920 }
925 return 0; 921 return 0;
@@ -1001,10 +997,8 @@ static void tcp_v6_send_reset(struct sk_buff *skb)
1001 /* sk = NULL, but it is safe for now. RST socket required. */ 997 /* sk = NULL, but it is safe for now. RST socket required. */
1002 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { 998 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
1003 999
1004 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { 1000 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0)
1005 dst_release(buff->dst);
1006 return; 1001 return;
1007 }
1008 1002
1009 ip6_xmit(NULL, buff, &fl, NULL, 0); 1003 ip6_xmit(NULL, buff, &fl, NULL, 0);
1010 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); 1004 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
@@ -1068,10 +1062,8 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32
1068 fl.fl_ip_sport = t1->source; 1062 fl.fl_ip_sport = t1->source;
1069 1063
1070 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { 1064 if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) {
1071 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { 1065 if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0)
1072 dst_release(buff->dst);
1073 return; 1066 return;
1074 }
1075 ip6_xmit(NULL, buff, &fl, NULL, 0); 1067 ip6_xmit(NULL, buff, &fl, NULL, 0);
1076 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); 1068 TCP_INC_STATS_BH(TCP_MIB_OUTSEGS);
1077 return; 1069 return;
@@ -1190,8 +1182,8 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
1190 TCP_ECN_create_request(req, skb->h.th); 1182 TCP_ECN_create_request(req, skb->h.th);
1191 treq->pktopts = NULL; 1183 treq->pktopts = NULL;
1192 if (ipv6_opt_accepted(sk, skb) || 1184 if (ipv6_opt_accepted(sk, skb) ||
1193 np->rxopt.bits.rxinfo || 1185 np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo ||
1194 np->rxopt.bits.rxhlim) { 1186 np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) {
1195 atomic_inc(&skb->users); 1187 atomic_inc(&skb->users);
1196 treq->pktopts = skb; 1188 treq->pktopts = skb;
1197 } 1189 }
@@ -1288,7 +1280,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1288 if (sk_acceptq_is_full(sk)) 1280 if (sk_acceptq_is_full(sk))
1289 goto out_overflow; 1281 goto out_overflow;
1290 1282
1291 if (np->rxopt.bits.srcrt == 2 && 1283 if (np->rxopt.bits.osrcrt == 2 &&
1292 opt == NULL && treq->pktopts) { 1284 opt == NULL && treq->pktopts) {
1293 struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); 1285 struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts);
1294 if (rxopt->srcrt) 1286 if (rxopt->srcrt)
@@ -1544,9 +1536,9 @@ ipv6_pktoptions:
1544 tp = tcp_sk(sk); 1536 tp = tcp_sk(sk);
1545 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt && 1537 if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt &&
1546 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) { 1538 !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) {
1547 if (np->rxopt.bits.rxinfo) 1539 if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo)
1548 np->mcast_oif = inet6_iif(opt_skb); 1540 np->mcast_oif = inet6_iif(opt_skb);
1549 if (np->rxopt.bits.rxhlim) 1541 if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim)
1550 np->mcast_hops = opt_skb->nh.ipv6h->hop_limit; 1542 np->mcast_hops = opt_skb->nh.ipv6h->hop_limit;
1551 if (ipv6_opt_accepted(sk, opt_skb)) { 1543 if (ipv6_opt_accepted(sk, opt_skb)) {
1552 skb_set_owner_r(opt_skb, sk); 1544 skb_set_owner_r(opt_skb, sk);
@@ -1734,7 +1726,6 @@ static int tcp_v6_rebuild_header(struct sock *sk)
1734 1726
1735 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { 1727 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
1736 sk->sk_err_soft = -err; 1728 sk->sk_err_soft = -err;
1737 dst_release(dst);
1738 return err; 1729 return err;
1739 } 1730 }
1740 1731
@@ -1787,7 +1778,6 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok)
1787 1778
1788 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { 1779 if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) {
1789 sk->sk_route_caps = 0; 1780 sk->sk_route_caps = 0;
1790 dst_release(dst);
1791 return err; 1781 return err;
1792 } 1782 }
1793 1783
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 390d750449ce..69b146843a20 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -483,7 +483,7 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
483 } 483 }
484 484
485 if (ulen < skb->len) { 485 if (ulen < skb->len) {
486 if (__pskb_trim(skb, ulen)) 486 if (pskb_trim_rcsum(skb, ulen))
487 goto discard; 487 goto discard;
488 saddr = &skb->nh.ipv6h->saddr; 488 saddr = &skb->nh.ipv6h->saddr;
489 daddr = &skb->nh.ipv6h->daddr; 489 daddr = &skb->nh.ipv6h->daddr;
@@ -637,6 +637,7 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
637 int addr_len = msg->msg_namelen; 637 int addr_len = msg->msg_namelen;
638 int ulen = len; 638 int ulen = len;
639 int hlimit = -1; 639 int hlimit = -1;
640 int tclass = -1;
640 int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; 641 int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
641 int err; 642 int err;
642 643
@@ -758,7 +759,7 @@ do_udp_sendmsg:
758 memset(opt, 0, sizeof(struct ipv6_txoptions)); 759 memset(opt, 0, sizeof(struct ipv6_txoptions));
759 opt->tot_len = sizeof(*opt); 760 opt->tot_len = sizeof(*opt);
760 761
761 err = datagram_send_ctl(msg, fl, opt, &hlimit); 762 err = datagram_send_ctl(msg, fl, opt, &hlimit, &tclass);
762 if (err < 0) { 763 if (err < 0) {
763 fl6_sock_release(flowlabel); 764 fl6_sock_release(flowlabel);
764 return err; 765 return err;
@@ -773,8 +774,7 @@ do_udp_sendmsg:
773 } 774 }
774 if (opt == NULL) 775 if (opt == NULL)
775 opt = np->opt; 776 opt = np->opt;
776 if (flowlabel) 777 opt = fl6_merge_options(&opt_space, flowlabel, opt);
777 opt = fl6_merge_options(&opt_space, flowlabel, opt);
778 778
779 fl->proto = IPPROTO_UDP; 779 fl->proto = IPPROTO_UDP;
780 ipv6_addr_copy(&fl->fl6_dst, daddr); 780 ipv6_addr_copy(&fl->fl6_dst, daddr);
@@ -799,10 +799,8 @@ do_udp_sendmsg:
799 if (final_p) 799 if (final_p)
800 ipv6_addr_copy(&fl->fl6_dst, final_p); 800 ipv6_addr_copy(&fl->fl6_dst, final_p);
801 801
802 if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) { 802 if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0)
803 dst_release(dst);
804 goto out; 803 goto out;
805 }
806 804
807 if (hlimit < 0) { 805 if (hlimit < 0) {
808 if (ipv6_addr_is_multicast(&fl->fl6_dst)) 806 if (ipv6_addr_is_multicast(&fl->fl6_dst))
@@ -815,6 +813,12 @@ do_udp_sendmsg:
815 hlimit = ipv6_get_hoplimit(dst->dev); 813 hlimit = ipv6_get_hoplimit(dst->dev);
816 } 814 }
817 815
816 if (tclass < 0) {
817 tclass = np->tclass;
818 if (tclass < 0)
819 tclass = 0;
820 }
821
818 if (msg->msg_flags&MSG_CONFIRM) 822 if (msg->msg_flags&MSG_CONFIRM)
819 goto do_confirm; 823 goto do_confirm;
820back_from_confirm: 824back_from_confirm:
@@ -834,9 +838,10 @@ back_from_confirm:
834 838
835do_append_data: 839do_append_data:
836 up->len += ulen; 840 up->len += ulen;
837 err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen, sizeof(struct udphdr), 841 err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen,
838 hlimit, opt, fl, (struct rt6_info*)dst, 842 sizeof(struct udphdr), hlimit, tclass, opt, fl,
839 corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); 843 (struct rt6_info*)dst,
844 corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
840 if (err) 845 if (err)
841 udp_v6_flush_pending_frames(sk); 846 udp_v6_flush_pending_frames(sk);
842 else if (!corkreq) 847 else if (!corkreq)
diff --git a/net/rose/rose_subr.c b/net/rose/rose_subr.c
index 02891ce2db37..36a77944622b 100644
--- a/net/rose/rose_subr.c
+++ b/net/rose/rose_subr.c
@@ -337,13 +337,13 @@ static int rose_parse_ccitt(unsigned char *p, struct rose_facilities_struct *fac
337 memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN); 337 memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN);
338 memcpy(callsign, p + 12, l - 10); 338 memcpy(callsign, p + 12, l - 10);
339 callsign[l - 10] = '\0'; 339 callsign[l - 10] = '\0';
340 facilities->source_call = *asc2ax(callsign); 340 asc2ax(&facilities->source_call, callsign);
341 } 341 }
342 if (*p == FAC_CCITT_SRC_NSAP) { 342 if (*p == FAC_CCITT_SRC_NSAP) {
343 memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN); 343 memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN);
344 memcpy(callsign, p + 12, l - 10); 344 memcpy(callsign, p + 12, l - 10);
345 callsign[l - 10] = '\0'; 345 callsign[l - 10] = '\0';
346 facilities->dest_call = *asc2ax(callsign); 346 asc2ax(&facilities->dest_call, callsign);
347 } 347 }
348 p += l + 2; 348 p += l + 2;
349 n += l + 2; 349 n += l + 2;
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 83c8135e1764..fda737d77edc 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -765,8 +765,8 @@ restart:
765 switch (policy->action) { 765 switch (policy->action) {
766 case XFRM_POLICY_BLOCK: 766 case XFRM_POLICY_BLOCK:
767 /* Prohibit the flow */ 767 /* Prohibit the flow */
768 xfrm_pol_put(policy); 768 err = -EPERM;
769 return -EPERM; 769 goto error;
770 770
771 case XFRM_POLICY_ALLOW: 771 case XFRM_POLICY_ALLOW:
772 if (policy->xfrm_nr == 0) { 772 if (policy->xfrm_nr == 0) {
@@ -782,8 +782,8 @@ restart:
782 */ 782 */
783 dst = xfrm_find_bundle(fl, policy, family); 783 dst = xfrm_find_bundle(fl, policy, family);
784 if (IS_ERR(dst)) { 784 if (IS_ERR(dst)) {
785 xfrm_pol_put(policy); 785 err = PTR_ERR(dst);
786 return PTR_ERR(dst); 786 goto error;
787 } 787 }
788 788
789 if (dst) 789 if (dst)
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 5aa5fe651a8a..bfbec5876659 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -735,10 +735,9 @@ static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep)
735 if (test_bit(i, &subs->active_mask)) { 735 if (test_bit(i, &subs->active_mask)) {
736 if (! test_and_set_bit(i, &subs->unlink_mask)) { 736 if (! test_and_set_bit(i, &subs->unlink_mask)) {
737 struct urb *u = subs->dataurb[i].urb; 737 struct urb *u = subs->dataurb[i].urb;
738 if (async) { 738 if (async)
739 u->transfer_flags |= URB_ASYNC_UNLINK;
740 usb_unlink_urb(u); 739 usb_unlink_urb(u);
741 } else 740 else
742 usb_kill_urb(u); 741 usb_kill_urb(u);
743 } 742 }
744 } 743 }
@@ -748,10 +747,9 @@ static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep)
748 if (test_bit(i+16, &subs->active_mask)) { 747 if (test_bit(i+16, &subs->active_mask)) {
749 if (! test_and_set_bit(i+16, &subs->unlink_mask)) { 748 if (! test_and_set_bit(i+16, &subs->unlink_mask)) {
750 struct urb *u = subs->syncurb[i].urb; 749 struct urb *u = subs->syncurb[i].urb;
751 if (async) { 750 if (async)
752 u->transfer_flags |= URB_ASYNC_UNLINK;
753 usb_unlink_urb(u); 751 usb_unlink_urb(u);
754 } else 752 else
755 usb_kill_urb(u); 753 usb_kill_urb(u);
756 } 754 }
757 } 755 }