]> git.hungrycats.org Git - linux/commitdiff
[PATCH] IEEE-1394/Firewire update
authorBen Collins <bcollins@debian.org>
Sun, 15 Dec 2002 08:27:06 +0000 (00:27 -0800)
committerBen Collins <bcollins@debian.org>
Sun, 15 Dec 2002 08:27:06 +0000 (00:27 -0800)
This covers a lot of ground in the Linux1394 SVN tree.  I haven't had
time to keep in sync with you in a more granular way, so here's a
bohemoth patch.  However, consider it well tested.

34 files changed:
drivers/ieee1394/Kconfig
drivers/ieee1394/Makefile
drivers/ieee1394/amdtp.c
drivers/ieee1394/cmp.c
drivers/ieee1394/csr.c
drivers/ieee1394/csr.h
drivers/ieee1394/dma.c [new file with mode: 0644]
drivers/ieee1394/dma.h [new file with mode: 0644]
drivers/ieee1394/dv1394-private.h
drivers/ieee1394/dv1394.c
drivers/ieee1394/eth1394.c
drivers/ieee1394/highlevel.c
drivers/ieee1394/hosts.c
drivers/ieee1394/hosts.h
drivers/ieee1394/ieee1394.h
drivers/ieee1394/ieee1394_core.c
drivers/ieee1394/ieee1394_core.h
drivers/ieee1394/ieee1394_transactions.c
drivers/ieee1394/ieee1394_transactions.h
drivers/ieee1394/ieee1394_types.h
drivers/ieee1394/iso.c [new file with mode: 0644]
drivers/ieee1394/iso.h [new file with mode: 0644]
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.h
drivers/ieee1394/ohci1394.c
drivers/ieee1394/ohci1394.h
drivers/ieee1394/oui.db [new file with mode: 0644]
drivers/ieee1394/oui2c.sh [new file with mode: 0644]
drivers/ieee1394/pcilynx.c
drivers/ieee1394/raw1394.c
drivers/ieee1394/raw1394.h
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.h
drivers/ieee1394/video1394.c

index 16849c8bf91686e1ab21dffa323620c5232985cf..dfe07c89e43985fd6d0fe783d1ccdfa3fae9c104 100644 (file)
@@ -5,7 +5,7 @@ menu "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
 
 config IEEE1394
        tristate "IEEE 1394 (FireWire) support (EXPERIMENTAL)"
-       ---help---
+       help
          IEEE 1394 describes a high performance serial bus, which is also
          known as FireWire(tm) or i.Link(tm) and is used for connecting all
          sorts of devices (most notably digital video cameras) to your
@@ -20,6 +20,36 @@ config IEEE1394
          say M here and read <file:Documentation/modules.txt>.  The module
          will be called ieee1394.o.
 
+comment "Subsystem Options"
+       depends on IEEE1394
+
+config IEEE1394_VERBOSEDEBUG
+       bool "Excessive debugging output"
+       depends on IEEE1394
+       help
+         If you say Y here, you will get very verbose debugging logs from
+         the subsystem which includes a dump of the header of every sent
+         and received packet.  This can amount to a high amount of data
+         collected in a very short time which is usually also saved to
+         disk by the system logging daemons.
+
+         Say Y if you really want or need the debugging output, everyone
+         else says N.
+
+config IEEE1394_OUI_DB
+       bool "OUI Database built-in"
+       depends on IEEE1394
+       help
+         If you say Y here, then an OUI list (vendor unique ID's) will be
+         compiled into the ieee1394 module. This doesn't really do much
+         accept being able to display the vendor of a hardware node. The
+         downside is that it adds about 300k to the size of the module,
+         or kernel (depending on whether you compile ieee1394 as a
+         module, or static in the kernel).
+
+         This option is not needed for userspace programs like gscanbus
+         to show this information.
+
 comment "Device Drivers"
        depends on IEEE1394
 
@@ -47,7 +77,7 @@ config IEEE1394_PCILYNX
 config IEEE1394_OHCI1394
        tristate "OHCI-1394 support"
        depends on IEEE1394
-       ---help---
+       help
          Enable this driver if you have an IEEE 1394 controller based on the
          OHCI-1394 specification. The current driver is only tested with OHCI
          chipsets made by Texas Instruments and NEC. Most third-party vendors
@@ -64,7 +94,7 @@ comment "Protocol Drivers"
 
 config IEEE1394_VIDEO1394
        tristate "OHCI-1394 Video support"
-       depends on IEEE1394_OHCI1394
+       depends on IEEE1394 && IEEE1394_OHCI1394
        help
          This option enables video device usage for OHCI-1394 cards.  Enable
          this option only if you have an IEEE 1394 video device connected to
@@ -72,14 +102,14 @@ config IEEE1394_VIDEO1394
 
 config IEEE1394_SBP2
        tristate "SBP-2 support (Harddisks etc.)"
-       depends on SCSI && IEEE1394
+       depends on IEEE1394 && SCSI
        help
          This option enables you to use SBP-2 devices connected to your IEEE
          1394 bus.  SBP-2 devices include harddrives and DVD devices.
 
 config IEEE1394_SBP2_PHYS_DMA
        bool "Enable Phys DMA support for SBP2 (Debug)"
-       depends on IEEE1394_SBP2
+       depends on IEEE1394 && IEEE1394_SBP2
 
 config IEEE1394_ETH1394
        tristate "Ethernet over 1394"
@@ -90,8 +120,8 @@ config IEEE1394_ETH1394
 
 config IEEE1394_DV1394
        tristate "OHCI-DV I/O support"
-       depends on IEEE1394_OHCI1394
-       ---help---
+       depends on IEEE1394 && IEEE1394_OHCI1394
+       help
          This driver allows you to transmit and receive DV (digital video)
          streams on an OHCI-1394 card using a simple frame-oriented
          interface.
@@ -131,8 +161,8 @@ config IEEE1394_CMP
 
 config IEEE1394_AMDTP
        tristate "IEC61883-6 (Audio transmission) support"
-       depends on IEEE1394_OHCI1394 && IEEE1394_CMP
-       ---help---
+       depends on IEEE1394 && IEEE1394_OHCI1394 && IEEE1394_CMP
+       help
          This option enables the Audio & Music Data Transmission Protocol
          (IEC61883-6) driver, which implements audio transmission over
          IEEE1394.
@@ -144,18 +174,4 @@ config IEEE1394_AMDTP
          say M here and read <file:Documentation/modules.txt>.  The module
          will be called amdtp.o.
 
-config IEEE1394_VERBOSEDEBUG
-       bool "Excessive debugging output"
-       depends on IEEE1394
-       help
-         If you say Y here, you will get very verbose debugging logs from the
-         subsystem which includes a dump of the header of every sent and
-         received packet.  This can amount to a high amount of data collected
-         in a very short time which is usually also saved to disk by the
-         system logging daemons.
-
-         Say Y if you really want or need the debugging output, everyone else
-         says N.
-
 endmenu
-
index 59d51d5e518ecce6cee2823e2dff4fc797cf768e..c1377122a302a3293c794c701c1ff77c623cb6e8 100644 (file)
@@ -5,7 +5,7 @@
 export-objs := ieee1394_core.o ohci1394.o cmp.o
 
 ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \
-                highlevel.o csr.o nodemgr.o
+                highlevel.o csr.o nodemgr.o oui.o dma.o iso.o
 
 obj-$(CONFIG_IEEE1394) += ieee1394.o
 obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o
@@ -18,4 +18,14 @@ obj-$(CONFIG_IEEE1394_ETH1394) += eth1394.o
 obj-$(CONFIG_IEEE1394_AMDTP) += amdtp.o
 obj-$(CONFIG_IEEE1394_CMP) += cmp.o
 
+clean-files := oui.c
+
 include $(TOPDIR)/Rules.make
+
+ifeq ($(obj),)
+obj = .
+endif
+
+$(obj)/oui.o: $(obj)/oui.c
+$(obj)/oui.c: $(obj)/oui.db $(obj)/oui2c.sh
+       $(CONFIG_SHELL) $(obj)/oui2c.sh < $(obj)/oui.db > $(obj)/oui.c
index 7da02d5061b901eb70f8d2d7b4bc884608b38724..c7863edf4b7a2c1f8971a00bcf24fbc73e7b903a 100644 (file)
@@ -688,7 +688,7 @@ static u32 get_header_bits(struct stream *s, int sub_frame, u32 sample)
                return get_iec958_header_bits(s, sub_frame, sample);
                
        case AMDTP_FORMAT_RAW:
-               return 0x40000000;
+               return 0x40;
 
        default:
                return 0;
@@ -833,8 +833,9 @@ static int stream_alloc_packet_lists(struct stream *s)
                max_nevents = fraction_ceil(&s->samples_per_cycle);
 
        max_packet_size = max_nevents * s->dimension * 4 + 8;
-       s->packet_pool = pci_pool_create("packet pool", s->host->ohci->dev,
-                                        max_packet_size, 0, 0);
+       s->packet_pool = hpsb_pci_pool_create("packet pool", s->host->ohci->dev,
+                                        max_packet_size, 0, 0 ,SLAB_KERNEL);
+
        if (s->packet_pool == NULL)
                return -1;
 
@@ -1018,9 +1019,10 @@ struct stream *stream_alloc(struct amdtp_host *host)
                return NULL;
        }
 
-       s->descriptor_pool = pci_pool_create("descriptor pool", host->ohci->dev,
+       s->descriptor_pool = hpsb_pci_pool_create("descriptor pool", host->ohci->dev,
                                             sizeof(struct descriptor_block),
-                                            16, 0);
+                                            16, 0 ,SLAB_KERNEL);
+
        if (s->descriptor_pool == NULL) {
                kfree(s->input);
                kfree(s);
@@ -1107,7 +1109,7 @@ static ssize_t amdtp_write(struct file *file, const char *buffer, size_t count,
         */
 
        for (i = 0; i < count; i += length) {
-               p = buffer_put_bytes(s->input, count, &length);
+               p = buffer_put_bytes(s->input, count - i, &length);
                copy_from_user(p, buffer + i, length);
                if (s->input->length < s->input->size)
                        continue;
@@ -1210,7 +1212,7 @@ static void amdtp_add_host(struct hpsb_host *host)
        if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME) != 0)
                return;
 
-       ah = kmalloc(sizeof *ah, SLAB_KERNEL);
+       ah = kmalloc(sizeof *ah, in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
        ah->host = host;
        ah->ohci = host->hostdata;
        INIT_LIST_HEAD(&ah->stream_list);
index 08d2e515434503d5cb1c722c297462dd988075f0..ba7f58475c7452ae0d61a97fd05a26f87b34b871 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/wait.h>
+#include <linux/interrupt.h>
 
 #include "hosts.h"
 #include "highlevel.h"
@@ -158,7 +159,7 @@ static void cmp_add_host(struct hpsb_host *host)
 {
        struct cmp_host *ch;
 
-       ch = kmalloc(sizeof *ch, SLAB_KERNEL);
+       ch = kmalloc(sizeof *ch, in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
        if (ch == NULL) {
                HPSB_ERR("Failed to allocate cmp_host");
                return;
index 7194c396d98efab7ae8838721dcf23ca73d65a4c..6cd4774c1dab7a165200f9e9bd1cc5f807251134 100644 (file)
@@ -28,7 +28,7 @@
 /* Module Parameters */
 /* this module parameter can be used to disable mapping of the FCP registers */
 MODULE_PARM(fcp,"i");
-MODULE_PARM_DESC(fcp, "FCP-registers");
+MODULE_PARM_DESC(fcp, "Map FCP registers (default = 1, disable = 0).");
 static int fcp = 1;
 
 static u16 csr_crc16(unsigned *data, int length)
@@ -54,8 +54,15 @@ static void host_reset(struct hpsb_host *host)
 
         host->csr.bus_manager_id = 0x3f;
         host->csr.bandwidth_available = 4915;
-        host->csr.channels_available_hi = ~0;
+       host->csr.channels_available_hi = 0xfffffffe;   /* pre-alloc ch 31 per 1394a-2000 */
         host->csr.channels_available_lo = ~0;
+       host->csr.broadcast_channel = 0x80000000 | 31;
+
+       if (host->is_irm) {
+               if (host->driver->hw_csr_reg) {
+                       host->driver->hw_csr_reg(host, 2, 0xfffffffe, ~0);
+               }
+       }
 
         host->csr.node_ids = host->node_id << 16;
 
@@ -95,8 +102,15 @@ static void add_host(struct hpsb_host *host)
         host->csr.bus_time              = 0;
         host->csr.bus_manager_id        = 0x3f;
         host->csr.bandwidth_available   = 4915;
-        host->csr.channels_available_hi = ~0;
+       host->csr.channels_available_hi = 0xfffffffe;   /* pre-alloc ch 31 per 1394a-2000 */
         host->csr.channels_available_lo = ~0;
+       host->csr.broadcast_channel = 0x80000000 | 31;
+
+       if (host->is_irm) {
+               if (host->driver->hw_csr_reg) {
+                       host->driver->hw_csr_reg(host, 2, 0xfffffffe, ~0);
+               }
+       }
 }
 
 int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom, 
@@ -268,6 +282,10 @@ static int read_regs(struct hpsb_host *host, int nodeid, quadlet_t *buf,
                 *(buf++) = cpu_to_be32(ret);
                 out;
 
+       case CSR_BROADCAST_CHANNEL:
+               *(buf++) = cpu_to_be32(host->csr.broadcast_channel);
+               out;
+
                 /* address gap to end - fall through to default */
         default:
                 return RCODE_ADDRESS_ERROR;
@@ -345,6 +363,12 @@ static int write_regs(struct hpsb_host *host, int nodeid, int destid,
                 /* these are not writable, only lockable */
                 return RCODE_TYPE_ERROR;
 
+       case CSR_BROADCAST_CHANNEL:
+               /* only the valid bit can be written */
+               host->csr.broadcast_channel = (host->csr.broadcast_channel & ~0x40000000)
+                        | (be32_to_cpu(*data) & 0x40000000);
+               out;
+
                 /* address gap to end - fall through */
         default:
                 return RCODE_ADDRESS_ERROR;
@@ -373,6 +397,18 @@ static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
         data = be32_to_cpu(data);
         arg = be32_to_cpu(arg);
 
+       /* Is somebody releasing the broadcast_channel on us? */
+       if (csraddr == CSR_CHANNELS_AVAILABLE_HI && (data & 0x1)) {
+               /* Note: this is may not be the right way to handle
+                * the problem, so we should look into the proper way
+                * eventually. */
+               HPSB_WARN("Node [" NODE_BUS_FMT "] wants to release "
+                         "broadcast channel 31.  Ignoring.",
+                         NODE_BUS_ARGS(nodeid));
+
+               data &= ~0x1;   /* keep broadcast channel allocated */
+       }
+
         if (host->driver->hw_csr_reg) {
                 quadlet_t old;
 
@@ -389,23 +425,84 @@ static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
         switch (csraddr) {
         case CSR_BUS_MANAGER_ID:
                 regptr = &host->csr.bus_manager_id;
+               *store = cpu_to_be32(*regptr);
+               if (*regptr == arg)
+                       *regptr = data;
                 break;
 
         case CSR_BANDWIDTH_AVAILABLE:
+        {
+                quadlet_t bandwidth;
+                quadlet_t old;
+                quadlet_t new;
+
                 regptr = &host->csr.bandwidth_available;
+                old = *regptr;
+
+                /* bandwidth available algorithm adapted from IEEE 1394a-2000 spec */
+                if (arg > 0x1fff) {
+                        *store = cpu_to_be32(old);     /* change nothing */
+                        break;
+                }
+                data &= 0x1fff;
+                if (arg >= data) {
+                        /* allocate bandwidth */
+                        bandwidth = arg - data;
+                        if (old >= bandwidth) {
+                                new = old - bandwidth;
+                                *store = cpu_to_be32(arg);
+                                *regptr = new;
+                        } else {
+                                *store = cpu_to_be32(old);
+                        }
+                } else {
+                        /* deallocate bandwidth */
+                        bandwidth = data - arg;
+                        if (old + bandwidth < 0x2000) {
+                                new = old + bandwidth;
+                                *store = cpu_to_be32(arg);
+                                *regptr = new;
+                        } else {
+                                *store = cpu_to_be32(old);
+                        }
+                }
                 break;
+        }
 
         case CSR_CHANNELS_AVAILABLE_HI:
+        {
+                /* Lock algorithm for CHANNELS_AVAILABLE as recommended by 1394a-2000 */
+                quadlet_t affected_channels = arg ^ data;
+
                 regptr = &host->csr.channels_available_hi;
+
+                if ((arg & affected_channels) == (*regptr & affected_channels)) {
+                        *regptr ^= affected_channels;
+                        *store = cpu_to_be32(arg);
+                } else {
+                        *store = cpu_to_be32(*regptr);
+                }
+
                 break;
+        }
 
         case CSR_CHANNELS_AVAILABLE_LO:
+        {
+                /* Lock algorithm for CHANNELS_AVAILABLE as recommended by 1394a-2000 */
+                quadlet_t affected_channels = arg ^ data;
+
                 regptr = &host->csr.channels_available_lo;
+
+                if ((arg & affected_channels) == (*regptr & affected_channels)) {
+                        *regptr ^= affected_channels;
+                        *store = cpu_to_be32(arg);
+                } else {
+                        *store = cpu_to_be32(*regptr);
+                }
                 break;
         }
+        }
 
-        *store = cpu_to_be32(*regptr);
-        if (*regptr == arg) *regptr = data;
         spin_unlock_irqrestore(&host->csr.lock, flags);
 
         return RCODE_COMPLETE;
@@ -420,10 +517,7 @@ static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
         case CSR_SPLIT_TIMEOUT_LO:
         case CSR_CYCLE_TIME:
         case CSR_BUS_TIME:
-        case CSR_BUS_MANAGER_ID:
-        case CSR_BANDWIDTH_AVAILABLE:
-        case CSR_CHANNELS_AVAILABLE_HI:
-        case CSR_CHANNELS_AVAILABLE_LO:
+       case CSR_BROADCAST_CHANNEL:
                 return RCODE_TYPE_ERROR;
 
         case CSR_BUSY_TIMEOUT:
@@ -433,6 +527,97 @@ static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
         }
 }
 
+static int lock64_regs(struct hpsb_host *host, int nodeid, octlet_t * store,
+                      u64 addr, octlet_t data, octlet_t arg, int extcode, u16 fl)
+{
+       int csraddr = addr - CSR_REGISTER_BASE;
+       unsigned long flags;
+
+       data = be64_to_cpu(data);
+       arg = be64_to_cpu(arg);
+
+       if (csraddr & 0x3)
+               return RCODE_TYPE_ERROR;
+
+       if (csraddr != CSR_CHANNELS_AVAILABLE
+           || extcode != EXTCODE_COMPARE_SWAP)
+               goto unsupported_lock64req;
+
+       /* Is somebody releasing the broadcast_channel on us? */
+       if (csraddr == CSR_CHANNELS_AVAILABLE_HI && (data & 0x100000000ULL)) {
+               /* Note: this is may not be the right way to handle
+                * the problem, so we should look into the proper way
+                 * eventually. */
+               HPSB_WARN("Node [" NODE_BUS_FMT "] wants to release "
+                         "broadcast channel 31.  Ignoring.",
+                         NODE_BUS_ARGS(nodeid));
+
+               data &= ~0x100000000ULL;        /* keep broadcast channel allocated */
+       }
+
+       if (host->driver->hw_csr_reg) {
+               quadlet_t data_hi, data_lo;
+               quadlet_t arg_hi, arg_lo;
+               quadlet_t old_hi, old_lo;
+
+               data_hi = data >> 32;
+               data_lo = data & 0xFFFFFFFF;
+               arg_hi = arg >> 32;
+               arg_lo = arg & 0xFFFFFFFF;
+
+               old_hi = host->driver->hw_csr_reg(host, (csraddr - CSR_BUS_MANAGER_ID) >> 2,
+                                                  data_hi, arg_hi);
+
+               old_lo = host->driver->hw_csr_reg(host, ((csraddr + 4) - CSR_BUS_MANAGER_ID) >> 2,
+                                                  data_lo, arg_lo);
+
+               *store = cpu_to_be64(((octlet_t)old_hi << 32) | old_lo);
+       } else {
+               octlet_t old;
+               octlet_t affected_channels = arg ^ data;
+
+               spin_lock_irqsave(&host->csr.lock, flags);
+
+               old = ((octlet_t)host->csr.channels_available_hi << 32) | host->csr.channels_available_lo;
+
+               if ((arg & affected_channels) == (old & affected_channels)) {
+                       host->csr.channels_available_hi ^= (affected_channels >> 32);
+                       host->csr.channels_available_lo ^= (affected_channels & 0xffffffff);
+                       *store = cpu_to_be64(arg);
+               } else {
+                       *store = cpu_to_be64(old);
+               }
+
+               spin_unlock_irqrestore(&host->csr.lock, flags);
+       }
+
+       /* Is somebody erroneously releasing the broadcast_channel on us? */
+       if (host->csr.channels_available_hi & 0x1)
+               host->csr.channels_available_hi &= ~0x1;
+
+       return RCODE_COMPLETE;
+
+ unsupported_lock64req:
+       switch (csraddr) {
+       case CSR_STATE_CLEAR:
+       case CSR_STATE_SET:
+       case CSR_RESET_START:
+       case CSR_NODE_IDS:
+       case CSR_SPLIT_TIMEOUT_HI:
+       case CSR_SPLIT_TIMEOUT_LO:
+       case CSR_CYCLE_TIME:
+       case CSR_BUS_TIME:
+       case CSR_BUS_MANAGER_ID:
+       case CSR_BROADCAST_CHANNEL:
+       case CSR_BUSY_TIMEOUT:
+       case CSR_BANDWIDTH_AVAILABLE:
+               return RCODE_TYPE_ERROR;
+
+       default:
+               return RCODE_ADDRESS_ERROR;
+       }
+}
+
 static int write_fcp(struct hpsb_host *host, int nodeid, int dest,
                     quadlet_t *data, u64 addr, unsigned int length, u16 flags)
 {
@@ -474,6 +659,7 @@ static struct hpsb_address_ops reg_ops = {
         .read = read_regs,
         .write = write_regs,
         .lock = lock_regs,
+       .lock64 = lock64_regs,
 };
 
 static struct hpsb_highlevel *hl;
index ad93097902a589ef831fd49843b76efd59ecbf93..4a2758e399a8e6c99be4c1bef250dd251ed5a5ea 100644 (file)
 #define CSR_BUSY_TIMEOUT          0x210
 #define CSR_BUS_MANAGER_ID        0x21c
 #define CSR_BANDWIDTH_AVAILABLE   0x220
+#define CSR_CHANNELS_AVAILABLE    0x224
 #define CSR_CHANNELS_AVAILABLE_HI 0x224
 #define CSR_CHANNELS_AVAILABLE_LO 0x228
+#define CSR_BROADCAST_CHANNEL     0x234
 #define CSR_CONFIG_ROM            0x400
 #define CSR_CONFIG_ROM_END        0x800
 #define CSR_FCP_COMMAND           0xB00
@@ -40,6 +42,7 @@ struct csr_control {
         quadlet_t bus_manager_id;
         quadlet_t bandwidth_available;
         quadlet_t channels_available_hi, channels_available_lo;
+       quadlet_t broadcast_channel;
 
         quadlet_t *rom;
         size_t rom_size;
diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c
new file mode 100644 (file)
index 0000000..b88a5d8
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * DMA region bookkeeping routines
+ *
+ * Copyright (C) 2002 Maas Digital LLC
+ *
+ * This code is licensed under the GPL.  See the file COPYING in the root
+ * directory of the kernel sources for details.
+ */
+
+#include <linux/module.h>
+#include <linux/vmalloc.h>
+#include <linux/slab.h>
+#include "dma.h"
+
+/* dma_prog_region */
+
+void dma_prog_region_init(struct dma_prog_region *prog)
+{
+       prog->kvirt = NULL;
+       prog->dev = NULL;
+       prog->n_pages = 0;
+       prog->bus_addr = 0;
+}
+
+int  dma_prog_region_alloc(struct dma_prog_region *prog, unsigned long n_bytes, struct pci_dev *dev)
+{
+       /* round up to page size */
+       if(n_bytes % PAGE_SIZE)
+               n_bytes += PAGE_SIZE - (n_bytes & PAGE_SIZE);
+       
+       prog->n_pages = n_bytes / PAGE_SIZE;
+
+       prog->kvirt = pci_alloc_consistent(dev, prog->n_pages * PAGE_SIZE, &prog->bus_addr);
+       if(!prog->kvirt) {
+               printk(KERN_ERR "dma_prog_region_alloc: pci_alloc_consistent() failed\n");
+               dma_prog_region_free(prog);
+               return -ENOMEM;
+       }
+
+       prog->dev = dev;
+
+       return 0;
+}
+
+void dma_prog_region_free(struct dma_prog_region *prog)
+{
+       if(prog->kvirt) {
+               pci_free_consistent(prog->dev, prog->n_pages * PAGE_SIZE, prog->kvirt, prog->bus_addr);
+       }
+       
+       prog->kvirt = NULL;
+       prog->dev = NULL;
+       prog->n_pages = 0;
+       prog->bus_addr = 0;
+}
+
+/* dma_region */
+
+void dma_region_init(struct dma_region *dma)
+{
+       dma->kvirt = NULL;
+       dma->dev = NULL;
+       dma->n_pages = 0;
+       dma->n_dma_pages = 0;
+       dma->sglist = NULL;
+}
+
+int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction)
+{
+       unsigned int i, n_pages;
+
+       /* round up to page size */
+       if(n_bytes % PAGE_SIZE)
+               n_bytes += PAGE_SIZE - (n_bytes & PAGE_SIZE);
+       
+       n_pages = n_bytes / PAGE_SIZE;
+       
+       dma->kvirt = vmalloc_32(n_pages * PAGE_SIZE);
+       if(!dma->kvirt) {
+               printk(KERN_ERR "dma_region_alloc: vmalloc_32() failed\n");
+               goto err;
+       }
+
+       dma->n_pages = n_pages;
+       
+       /* Clear the ram out, no junk to the user */
+       memset(dma->kvirt, 0, n_pages * PAGE_SIZE);
+
+       /* allocate scatter/gather list */
+       dma->sglist = kmalloc(dma->n_pages * sizeof(struct scatterlist), GFP_KERNEL);
+       if(!dma->sglist) {
+               printk(KERN_ERR "dma_region_alloc: kmalloc(sglist) failed\n");
+               goto err;
+       }
+
+       /* just to be safe - this will become unnecessary once sglist->address goes away */
+       memset(dma->sglist, 0, dma->n_pages * sizeof(struct scatterlist));
+
+       /* fill scatter/gather list with pages */
+       for(i = 0; i < dma->n_pages; i++) {
+               unsigned long va = (unsigned long) dma->kvirt + i * PAGE_SIZE;
+                       
+               dma->sglist[i].page = vmalloc_to_page((void *)va);
+               dma->sglist[i].length = PAGE_SIZE;
+       }
+
+       /* map sglist to the IOMMU */
+       dma->n_dma_pages = pci_map_sg(dev, &dma->sglist[0], dma->n_pages, direction);
+
+       if(dma->n_dma_pages == 0) {
+               printk(KERN_ERR "dma_region_alloc: pci_map_sg() failed\n");
+               goto err;
+       }
+
+       dma->dev = dev;
+       dma->direction = direction;
+       
+       return 0;
+
+err:
+       dma_region_free(dma);
+       return -ENOMEM;
+}
+
+void dma_region_free(struct dma_region *dma)
+{
+       if(dma->n_dma_pages) {
+               pci_unmap_sg(dma->dev, dma->sglist, dma->n_pages, dma->direction);
+               dma->n_dma_pages = 0;
+               dma->dev = NULL;
+       }
+
+       if(dma->sglist) {
+               kfree(dma->sglist);
+               dma->sglist = NULL;
+       }
+
+       if(dma->kvirt) {
+               vfree(dma->kvirt);
+               dma->kvirt = NULL;
+               dma->n_pages = 0;
+       }
+}
+
+/* find the scatterlist index and remaining offset corresponding to a
+   given offset from the beginning of the buffer */
+static inline int dma_region_find(struct dma_region *dma, unsigned long offset, unsigned long *rem)
+{
+       int i;
+       unsigned long off = offset;
+       
+       for(i = 0; i < dma->n_dma_pages; i++) {
+               if(off < sg_dma_len(&dma->sglist[i])) {
+                       *rem = off;
+                       return i;
+               }
+
+               off -= sg_dma_len(&dma->sglist[i]);
+       }
+       
+       panic("dma_region_find: offset %lu beyond end of DMA mapping\n", offset);
+}
+
+dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset)
+{
+       unsigned long rem;
+       
+       struct scatterlist *sg = &dma->sglist[dma_region_find(dma, offset, &rem)];
+       return sg_dma_address(sg) + rem;
+}
+
+void dma_region_sync(struct dma_region *dma, unsigned long offset, unsigned long len)
+{
+       int first, last;
+       unsigned long rem;
+
+       if(!len)
+               len = 1;
+       
+       first = dma_region_find(dma, offset, &rem);
+       last = dma_region_find(dma, offset + len - 1, &rem);
+       
+       pci_dma_sync_sg(dma->dev, &dma->sglist[first], last - first + 1, dma->direction);
+}
+
+/* nopage() handler for mmap access */
+
+static struct page*
+dma_region_pagefault(struct vm_area_struct *area, unsigned long address, int write_access)
+{
+       unsigned long offset;
+       unsigned long kernel_virt_addr;
+       struct page *ret = NOPAGE_SIGBUS;
+
+       struct dma_region *dma = (struct dma_region*) area->vm_private_data;
+
+       if(!dma->kvirt)
+               goto out;
+
+       if( (address < (unsigned long) area->vm_start) ||
+           (address > (unsigned long) area->vm_start + (PAGE_SIZE * dma->n_pages)) )
+               goto out;
+
+       offset = address - area->vm_start;
+       kernel_virt_addr = (unsigned long) dma->kvirt + offset;
+       ret = vmalloc_to_page((void*) kernel_virt_addr);
+       get_page(ret);
+out:
+       return ret;
+}
+
+static struct vm_operations_struct dma_region_vm_ops = {
+       nopage: dma_region_pagefault,
+};
+
+int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma)
+{
+       unsigned long size;
+       
+       if(!dma->kvirt)
+               return -EINVAL;
+
+       /* must be page-aligned */
+       if(vma->vm_pgoff != 0)
+               return -EINVAL;
+
+       /* check the length */
+       size = vma->vm_end - vma->vm_start;
+       if(size > (PAGE_SIZE * dma->n_pages))
+               return -EINVAL;
+
+       vma->vm_ops = &dma_region_vm_ops;
+       vma->vm_private_data = dma;
+       vma->vm_file = file;
+       vma->vm_flags |= VM_RESERVED;
+       
+       return 0;
+}
diff --git a/drivers/ieee1394/dma.h b/drivers/ieee1394/dma.h
new file mode 100644 (file)
index 0000000..38f4636
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * DMA region bookkeeping routines
+ *
+ * Copyright (C) 2002 Maas Digital LLC
+ *
+ * This code is licensed under the GPL.  See the file COPYING in the root
+ * directory of the kernel sources for details.
+ */
+
+#ifndef IEEE1394_DMA_H
+#define IEEE1394_DMA_H
+
+#include <linux/pci.h>
+#include <asm/scatterlist.h>
+
+/* struct dma_prog_region
+   
+   a small, physically-contiguous DMA buffer with random-access,
+   synchronous usage characteristics
+*/
+
+struct dma_prog_region {
+       unsigned char    *kvirt;     /* kernel virtual address */
+       struct pci_dev   *dev;       /* PCI device */
+       unsigned int      n_pages;   /* # of kernel pages */
+       dma_addr_t        bus_addr;  /* base bus address */
+};
+
+/* clear out all fields but do not allocate any memory */
+void dma_prog_region_init(struct dma_prog_region *prog);
+int  dma_prog_region_alloc(struct dma_prog_region *prog, unsigned long n_bytes, struct pci_dev *dev);
+void dma_prog_region_free(struct dma_prog_region *prog);
+
+static inline dma_addr_t dma_prog_region_offset_to_bus(struct dma_prog_region *prog, unsigned long offset)
+{
+       return prog->bus_addr + offset;
+}
+
+/* struct dma_region
+   
+   a large, non-physically-contiguous DMA buffer with streaming,
+   asynchronous usage characteristics
+*/
+
+struct dma_region {
+       unsigned char      *kvirt;       /* kernel virtual address */
+       struct pci_dev     *dev;         /* PCI device */
+       unsigned int        n_pages;     /* # of kernel pages */
+       unsigned int        n_dma_pages; /* # of IOMMU pages */
+       struct scatterlist *sglist;      /* IOMMU mapping */
+       int                 direction;   /* PCI_DMA_TODEVICE, etc */
+};
+
+/* clear out all fields but do not allocate anything */
+void dma_region_init(struct dma_region *dma);
+
+/* allocate the buffer and map it to the IOMMU */
+int  dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction);
+
+/* unmap and free the buffer */
+void dma_region_free(struct dma_region *dma);
+
+/* sync the IO bus' view of the buffer with the CPU's view */
+void dma_region_sync(struct dma_region *dma, unsigned long offset, unsigned long len);
+
+/* map the buffer into a user space process */
+int  dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma);
+
+/* macro to index into a DMA region (or dma_prog_region) */
+#define dma_region_i(_dma, _type, _index) ( ((_type*) ((_dma)->kvirt)) + (_index) )
+
+/* return the DMA bus address of the byte with the given offset
+   relative to the beginning of the dma_region */
+dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset);
+
+#endif /* IEEE1394_DMA_H */
index 7342b18e1b220b58a8f0b41ec159ed50f8fb1e06..a9bad6289475ff9588ce3aa3a3c557b18be83d40 100644 (file)
@@ -28,8 +28,7 @@
 
 #include "ieee1394.h"
 #include "ohci1394.h"
-#include <linux/pci.h>
-#include <asm/scatterlist.h>
+#include "dma.h"
 
 /* data structures private to the dv1394 driver */
 /* none of this is exposed to user-space */
@@ -167,12 +166,14 @@ static inline void fill_input_more(struct input_more *im,
 }
  
 static inline void fill_input_last(struct input_last *il,
+                                   int want_interrupt,
                                    unsigned int data_size,
                                    unsigned long data_phys_addr)
 {
        u32 temp =  3 << 28; /* INPUT_LAST */
        temp |= 8 << 24; /* s = 1, update xferStatus and resCount */
-       temp |= 3 << 20; /* enable interrupts */
+       if (want_interrupt)
+               temp |= 3 << 20; /* enable interrupts */
        temp |= 0xC << 16; /* enable branch to address */
                               /* disable wait on sync field, not used in DV :-( */
        temp |= data_size;
@@ -301,8 +302,7 @@ struct frame {
        unsigned long data; 
 
        /* Max # of packets per frame */
-       /* 320 is enough for NTSC, need to check what PAL is */
-        #define MAX_PACKETS 500
+#define MAX_PACKETS 500
 
 
        /* a PAGE_SIZE memory pool for allocating CIP headers
@@ -383,35 +383,6 @@ static void frame_delete(struct frame *f);
 /* reset f so that it can be used again */
 static void frame_reset(struct frame *f);
 
-
-/* structure for bookkeeping of a large non-physically-contiguous DMA buffer */
-
-struct dma_region {
-       unsigned int n_pages;
-       unsigned int n_dma_pages;
-       struct scatterlist *sglist;
-};
-
-/* return the DMA bus address of the byte with the given offset
-   relative to the beginning of the dma_region */
-
-static inline dma_addr_t dma_offset_to_bus(struct dma_region *dma, unsigned long offset)
-{
-       int i;
-       struct scatterlist *sg;
-       
-       for(i = 0, sg = &dma->sglist[0]; i < dma->n_dma_pages; i++, sg++) {
-               if(offset < sg_dma_len(sg)) {
-                       return sg_dma_address(sg) + offset;
-               } 
-               offset -= sg_dma_len(sg);
-       }
-       
-       printk(KERN_ERR "dv1394: dma_offset_to_bus failed for offset %lu!\n", offset);
-       return 0;
-}
-
-
 /* struct video_card contains all data associated with one instance
    of the dv1394 driver 
 */
@@ -508,9 +479,8 @@ struct video_card {
        
        /* the large, non-contiguous (rvmalloc()) ringbuffer for DV
            data, exposed to user-space via mmap() */
-       unsigned char     *user_buf;
-       unsigned long      user_buf_size;
-       struct dma_region  user_dma;
+       unsigned long      dv_buf_size;
+       struct dma_region  dv_buf;
        
        /* next byte in the ringbuffer that a write() call will fill */
        size_t write_off;
@@ -579,10 +549,8 @@ struct video_card {
 
        
        /* physically contiguous packet ringbuffer for receive */
-#define MAX_PACKET_BUFFER 30
-       struct packet *packet_buffer;
-       dma_addr_t     packet_buffer_dma;
-       unsigned long  packet_buffer_size;
+       struct dma_region packet_buf;
+       unsigned long  packet_buf_size;
        
        unsigned int current_packet;
        int first_frame;        /* received first start frame marker? */
index 2e35ca4d9a6a204226efd7574f1144d7ec2df926..3c95255acffe5be581b0a8f3a693a3fee4187114 100644 (file)
     via pci_alloc_consistent()
     
   DONE:
+  - during reception, better handling of dropped frames and continuity errors
+  - during reception, prevent DMA from bypassing the irq tasklets
+  - reduce irq rate during reception (1/250 packets).
+  - add many more internal buffers during reception with scatter/gather dma.
+  - add dbc (continuity) checking on receive, increment status.dropped_frames
+    if not continuous.
   - restart IT DMA after a bus reset
   - safely obtain and release ISO Tx channels in cooperation with OHCI driver
   - map received DIF blocks to their proper location in DV frame (ensure
@@ -91,9 +97,9 @@
 #include <linux/fs.h>
 #include <linux/poll.h>
 #include <linux/smp_lock.h>
+#include <linux/bitops.h>
 #include <asm/byteorder.h>
 #include <asm/atomic.h>
-#include <asm/bitops.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <linux/proc_fs.h>
        (will cause undeflows if your machine is too slow!)
 */
 
-#define DV1394_DEBUG_LEVEL 0
+#define DV1394_DEBUG_LEVEL 1
 
 /* for debugging use ONLY: allow more than one open() of the device */
 /* #define DV1394_ALLOW_MORE_THAN_ONE_OPEN 1 */
@@ -169,6 +175,15 @@ static spinlock_t dv1394_cards_lock = SPIN_LOCK_UNLOCKED;
 
 static struct hpsb_highlevel *hl_handle; /* = NULL; */
 
+static LIST_HEAD(dv1394_devfs);
+struct dv1394_devfs_entry {
+       struct list_head list;
+    devfs_handle_t devfs;
+       char name[32];
+       struct dv1394_devfs_entry *parent;
+};
+static spinlock_t dv1394_devfs_lock = SPIN_LOCK_UNLOCKED;
+
 /* translate from a struct file* to the corresponding struct video_card* */
 
 static inline struct video_card* file_to_video_card(struct file *file)
@@ -176,39 +191,6 @@ static inline struct video_card* file_to_video_card(struct file *file)
        return (struct video_card*) file->private_data;
 }
 
-
-/*******************************/
-/* Memory management functions */
-/*******************************/
-
-/* note: we no longer use mem_map_reserve, because it causes a memory
-   leak, and setting vma->vm_flags to VM_RESERVED should be sufficient
-   to pin the pages in memory anyway. */
-
-static void * rvmalloc(unsigned long size)
-{
-       void * mem;
-
-       mem = vmalloc_32(size);
-
-       if(mem)
-               memset(mem, 0, size); /* Clear the ram out, 
-                                        no junk to the user */
-       return mem;
-}
-
-static void rvfree(void * mem, unsigned long size)
-{
-       if (mem) {
-               vfree(mem);
-       }
-}
-
-/***********************************/
-/* END Memory management functions */
-/***********************************/
-
-
 /*** FRAME METHODS *********************************************************/
 
 static void frame_reset(struct frame *f)
@@ -437,11 +419,7 @@ static void frame_prepare(struct video_card *video, unsigned int this_frame)
                /******************************/
 
                /* first descriptor - OUTPUT_MORE_IMMEDIATE, for the controller's IT header */
-               fill_output_more_immediate( &(block->u.out.omi),
-                                           /* tag - what is this??? */ 1,
-                                           video->channel,
-                                           /* sync tag - what is this??? */ 0,
-                                           payload_size);
+               fill_output_more_immediate( &(block->u.out.omi), 1, video->channel, 0, payload_size);
 
                if(empty_packet) {
                        /* second descriptor - OUTPUT_LAST for CIP header */
@@ -492,8 +470,8 @@ static void frame_prepare(struct video_card *video, unsigned int this_frame)
                                                  PAGE_SIZE - (data_p % PAGE_SIZE),
 
                                                  /* DMA address of data_p */
-                                                 dma_offset_to_bus(&f->video->user_dma,
-                                                                   data_p - (unsigned long) f->video->user_buf));
+                                                 dma_region_offset_to_bus(&video->dv_buf,
+                                                                          data_p - (unsigned long) video->dv_buf.kvirt));
 
                                fill_output_last( &(block->u.out.u.full.u.cross.ol),
                                          
@@ -507,8 +485,8 @@ static void frame_prepare(struct video_card *video, unsigned int this_frame)
                                                  480 - (PAGE_SIZE - (data_p % PAGE_SIZE)),
 
                                                  /* DMA address of data_p + PAGE_SIZE - (data_p % PAGE_SIZE) */
-                                                 dma_offset_to_bus(&f->video->user_dma,
-                                                                   data_p + PAGE_SIZE - (data_p % PAGE_SIZE) - (unsigned long) f->video->user_buf));
+                                                 dma_region_offset_to_bus(&video->dv_buf,
+                                                                          data_p + PAGE_SIZE - (data_p % PAGE_SIZE) - (unsigned long) video->dv_buf.kvirt));
 
                                if(first_packet)
                                        f->frame_begin_timestamp = &(block->u.out.u.full.u.cross.ol.q[3]);
@@ -542,8 +520,8 @@ static void frame_prepare(struct video_card *video, unsigned int this_frame)
 
                                                  
                                                  /* DMA address of data_p */
-                                                 dma_offset_to_bus(&f->video->user_dma,
-                                                                   data_p - (unsigned long) f->video->user_buf));
+                                                 dma_region_offset_to_bus(&video->dv_buf,
+                                                                          data_p - (unsigned long) video->dv_buf.kvirt));
                                
                                if(first_packet)
                                        f->frame_begin_timestamp = &(block->u.out.u.full.u.nocross.ol.q[3]);
@@ -584,13 +562,8 @@ static void frame_prepare(struct video_card *video, unsigned int this_frame)
           to loop back up to the top */
        *(f->frame_end_branch) = cpu_to_le32(f->descriptor_pool_dma | f->first_n_descriptors);
 
-
-       /* make the latest version of the frame buffer visible to the PCI card */
-       /* could optimize this by only syncing the pages associated with this frame */
-       pci_dma_sync_sg(video->ohci->dev,
-                       &video->user_dma.sglist[0],
-                       video->user_dma.n_dma_pages,
-                       PCI_DMA_TODEVICE);
+       /* make the latest version of this frame visible to the PCI card */
+       dma_region_sync(&video->dv_buf, f->data - (unsigned long) video->dv_buf.kvirt, video->frame_size);
 
        /* lock against DMA interrupt */
        spin_lock_irqsave(&video->spinlock, irq_flags);
@@ -789,6 +762,9 @@ frame_put_packet (struct frame *f, struct packet *p)
        int dif_sequence = p->data[1] >> 4;           /* dif sequence number is in bits 4 - 7 */
        int dif_block = p->data[2];
 
+       /* sanity check */
+       if (dif_sequence > 11 || dif_block > 149) return;
+               
        switch (section_type) {
        case 0:           /* 1 Header block */
                memcpy( (void *) f->data + dif_sequence * 150 * 80, p->data, 480);
@@ -816,47 +792,64 @@ frame_put_packet (struct frame *f, struct packet *p)
 }
 
 
-static void start_dma_receive(struct video_card *video, struct frame *frame)
+static void start_dma_receive(struct video_card *video)
 {
-       /* reset iso recv control register */
-       reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, 0xFFFFFFFF);
-       wmb();
-       
-       /* clear bufferFill, set isochHeader and speed (0=100) */
-       reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x40000000);
-
-       /* match on all tags, listen on channel */
-       reg_write(video->ohci, video->ohci_IsoRcvContextMatch, 0xf0000000 | video->channel);
-       
-       /* address and first descriptor block + Z=1 */
-       reg_write(video->ohci, video->ohci_IsoRcvCommandPtr,             
-                 frame->descriptor_pool_dma | 1); /* Z=1 */
-       wmb();
+       if (video->first_run == 1) {
+               video->first_run = 0;
+               
+               /* start DMA once all of the frames are READY */
+               video->n_clear_frames = 0;
+               video->first_clear_frame = -1;
+               video->current_packet = 0;
+               video->active_frame = 0;
+               
+               /* reset iso recv control register */
+               reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, 0xFFFFFFFF);
+               wmb();
+               
+               /* clear bufferFill, set isochHeader and speed (0=100) */
+               reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x40000000);
        
-       /* run */
-       reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x8000);
-       flush_pci_write(video->ohci);
+               /* match on all tags, listen on channel */
+               reg_write(video->ohci, video->ohci_IsoRcvContextMatch, 0xf0000000 | video->channel);
+               
+               /* address and first descriptor block + Z=1 */
+               reg_write(video->ohci, video->ohci_IsoRcvCommandPtr,             
+                         video->frames[0]->descriptor_pool_dma | 1); /* Z=1 */
+               wmb();
+               
+               /* run */
+               reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x8000);
+               flush_pci_write(video->ohci);
+               
+               debug_printk("dv1394: DMA started\n");
        
-       debug_printk("dv1394: DMA started\n");
-
 #if DV1394_DEBUG_LEVEL >= 2
-       {
-               int i;
-       
-               for(i = 0; i < 1000; ++i) {
-                       mdelay(1);
-                       if(reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) {
-                               printk("DMA ACTIVE after %d msec\n", i);
-                               break;
+               {
+                       int i;
+               
+                       for(i = 0; i < 1000; ++i) {
+                               mdelay(1);
+                               if(reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) {
+                                       printk("DMA ACTIVE after %d msec\n", i);
+                                       break;
+                               }
                        }
+                       if( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
+                               printk("DEAD, event = %x\n", 
+                                          reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
+                       } else
+                               printk("RUNNING!\n");
                }
-               if( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
-                       printk("DEAD, event = %x\n", 
-                              reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
-               } else
-                       printk("RUNNING!\n");
-       }
 #endif
+       } 
+       else if( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
+               debug_printk("DEAD, event = %x\n", 
+                            reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
+
+               /* wake */
+               reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 12));
+       }
 }
 
 
@@ -864,7 +857,7 @@ static void start_dma_receive(struct video_card *video, struct frame *frame)
    receive_packets() - build the DMA program for receiving
 */
 
-static void receive_packets(struct video_card *video, struct frame *f)
+static void receive_packets(struct video_card *video)
 {
        struct DMA_descriptor_block *block = NULL;
        dma_addr_t block_dma = 0;
@@ -872,52 +865,46 @@ static void receive_packets(struct video_card *video, struct frame *f)
        dma_addr_t data_dma = 0;
        u32 *last_branch_address = NULL;
        unsigned long irq_flags;
+       int want_interrupt = 0;
+       struct frame *f = NULL;
+       int i, j;
 
        spin_lock_irqsave(&video->spinlock, irq_flags);
 
-       video->n_clear_frames = 0;
-       video->first_clear_frame = -1;
+       for (j = 0; j < video->n_frames; j++) {
 
-       for (video->current_packet = 0; video->current_packet < MAX_PACKET_BUFFER; ++video->current_packet) {
-               /* locate a descriptor block and packet from the buffer */
-               block = &(f->descriptor_pool[video->current_packet]);
-               block_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
-               
-               data = &(video->packet_buffer[video->current_packet]);
-               data_dma = ((unsigned long) data - (unsigned long) video->packet_buffer) + video->packet_buffer_dma;
-               
-               /* setup DMA descriptor block */
-               fill_input_last( &(block->u.in.il), 512, data_dma);
+               /* connect frames */
+               if (j > 0 && f != NULL && f->frame_end_branch != NULL)
+                       *(f->frame_end_branch) = cpu_to_le32(video->frames[j]->descriptor_pool_dma | 1); /* set Z=1 */
 
-               /* link descriptors */
-               last_branch_address = f->frame_end_branch;
+               f = video->frames[j];
 
-               if (last_branch_address)
-                       *(last_branch_address) = cpu_to_le32(block_dma | 1); /* set Z=1 */
-
-               f->frame_end_branch = &(block->u.in.il.q[2]);
-       }
+               for (i = 0; i < MAX_PACKETS; i++) {
+                       /* locate a descriptor block and packet from the buffer */
+                       block = &(f->descriptor_pool[i]);
+                       block_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
+                       
+                       data = ((struct packet*)video->packet_buf.kvirt) + f->frame_num * MAX_PACKETS + i;
+                       data_dma = dma_region_offset_to_bus( &video->packet_buf, 
+                                                            ((unsigned long) data - (unsigned long) video->packet_buf.kvirt) );
+                       
+                       /* setup DMA descriptor block */
+                       want_interrupt = ((i % (MAX_PACKETS/2)) == 0 || i == (MAX_PACKETS-1));
+                       fill_input_last( &(block->u.in.il), want_interrupt, 512, data_dma);
        
-       /* loop tail to head */
-       if (f->frame_end_branch)
-               *(f->frame_end_branch) = cpu_to_le32(f->descriptor_pool_dma | 1); /* set Z=1 */
+                       /* link descriptors */
+                       last_branch_address = f->frame_end_branch;
+       
+                       if (last_branch_address != NULL)
+                               *(last_branch_address) = cpu_to_le32(block_dma | 1); /* set Z=1 */
+       
+                       f->frame_end_branch = &(block->u.in.il.q[2]);
+               }
+       
+       } /* next j */
 
        spin_unlock_irqrestore(&video->spinlock, irq_flags);
 
-       if (video->first_run) {
-               /* start DMA once all of the frames are READY */
-               video->first_run = 0;
-               video->current_packet = 0;
-               video->active_frame = f->frame_num;
-               start_dma_receive(video, f);
-       } 
-       else if( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
-               debug_printk("DEAD, event = %x\n", 
-                            reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
-
-               /* wake */
-               reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 12));
-       }
 }
 
 
@@ -960,10 +947,8 @@ static int do_dv1394_init(struct video_card *video, struct dv1394_init *init)
        if(new_buf_size % PAGE_SIZE) new_buf_size += PAGE_SIZE - (new_buf_size % PAGE_SIZE);
 
        /* don't allow the user to allocate the DMA buffer more than once */
-       if( (video->user_buf) &&
-           (video->user_buf_size != new_buf_size) ) {
+       if(video->dv_buf.kvirt && video->dv_buf_size != new_buf_size)
                goto err;
-       }
        
        /* shutdown the card if it's currently active */
        /* (the card should not be reset if the parameters are screwy) */
@@ -1067,93 +1052,39 @@ static int do_dv1394_init(struct video_card *video, struct dv1394_init *init)
                }
        }
 
-       
-
-       if(video->user_buf == NULL) {
-               unsigned int i;
-               
+       if(!video->dv_buf.kvirt) {
                /* allocate the ringbuffer */
-               video->user_buf = rvmalloc(new_buf_size);
-               if(!video->user_buf) {
-                       printk(KERN_ERR "dv1394: Cannot allocate frame buffers\n");
+               retval = dma_region_alloc(&video->dv_buf, new_buf_size, video->ohci->dev, PCI_DMA_TODEVICE);
+               if(retval)
                        goto err_frames;
-               }
-               video->user_buf_size = new_buf_size;
-
-               /* allocate the sglist to hold the DMA addresses */
-               video->user_dma.n_pages = video->user_buf_size / PAGE_SIZE;
-               video->user_dma.sglist = kmalloc(video->user_dma.n_pages * sizeof(struct scatterlist), GFP_KERNEL);
-               if(!video->user_dma.sglist) {
-                       printk(KERN_ERR "dv1394: Cannot allocate sglist for user buffer\n");
-                       goto err_user_buf;
-               }
-
-               /* initialize all fields of all sglist entries to zero
-                  (new requirement due to PCI changes in 2.4.13) */
-
-               memset(video->user_dma.sglist, 0, video->user_dma.n_pages * sizeof(struct scatterlist));
+                                         
+               video->dv_buf_size = new_buf_size;
 
-               
-               /* fill the sglist with the kernel addresses of pages in the non-contiguous buffer */
-               for(i = 0; i < video->user_dma.n_pages; i++) {
-                       unsigned long va = (unsigned long) video->user_buf + i * PAGE_SIZE;
-                       
-                       video->user_dma.sglist[i].page = vmalloc_to_page((void *)va);
-                       video->user_dma.sglist[i].length = PAGE_SIZE;
-               }
-               
-               /* map the buffer in the IOMMU */
-               /* the user_data buffer only allows DMA *to* the card for transmission;
-                  incoming DV data comes through the packet_buffer first, and then is copied to user_data */
-               video->user_dma.n_dma_pages = pci_map_sg(video->ohci->dev,
-                                                        &video->user_dma.sglist[0],
-                                                        video->user_dma.n_pages,
-                                                        PCI_DMA_TODEVICE);
-               if(video->user_dma.n_dma_pages == 0) {
-                       printk(KERN_ERR "dv1394: Error mapping user buffer to the IOMMU\n");
-                       goto err_user_buf;
-               }
-               
                debug_printk("dv1394: Allocated %d frame buffers, total %u pages (%u DMA pages), %lu bytes\n", 
-                            video->n_frames, video->user_dma.n_pages,
-                            video->user_dma.n_dma_pages, video->user_buf_size);
+                            video->n_frames, video->dv_buf.n_pages,
+                            video->dv_buf.n_dma_pages, video->dv_buf_size);
        }
        
        /* set up the frame->data pointers */
        for(i = 0; i < video->n_frames; i++)
-               video->frames[i]->data = (unsigned long) video->user_buf + i * video->frame_size;
-
-       /* allocate packet buffers */
-       video->packet_buffer_size = sizeof(struct packet) * MAX_PACKET_BUFFER;
-       if (video->packet_buffer_size % PAGE_SIZE)
-               video->packet_buffer_size += PAGE_SIZE - (video->packet_buffer_size % PAGE_SIZE);
-
-       
-       video->packet_buffer = kmalloc(video->packet_buffer_size, GFP_KERNEL);
-       
-       if(!video->packet_buffer) {
-               printk(KERN_ERR "dv1394: Cannot allocate packet buffers");
-               retval = -ENOMEM;
-               goto err_user_buf;
-       }
+               video->frames[i]->data = (unsigned long) video->dv_buf.kvirt + i * video->frame_size;
 
-       /* map the packet buffer into the IOMMU */
-       video->packet_buffer_dma = pci_map_single(video->ohci->dev,
-                                                 video->packet_buffer,
-                                                 video->packet_buffer_size,
-                                                 PCI_DMA_FROMDEVICE);
-       if(!video->packet_buffer_dma) {
-               printk(KERN_ERR "dv1394: Cannot map packet buffer to IOMMU");
-               kfree(video->packet_buffer);
-               video->packet_buffer = NULL;
-               retval = -ENOMEM;
-               goto err_user_buf;
+       if(!video->packet_buf.kvirt) {
+               /* allocate packet buffer */
+               video->packet_buf_size = sizeof(struct packet) * video->n_frames * MAX_PACKETS;
+               if (video->packet_buf_size % PAGE_SIZE)
+                       video->packet_buf_size += PAGE_SIZE - (video->packet_buf_size % PAGE_SIZE);
+               
+               retval = dma_region_alloc(&video->packet_buf, video->packet_buf_size,
+                                         video->ohci->dev, PCI_DMA_FROMDEVICE);
+               if(retval)
+                       goto err_dv_buf;
+               
+               debug_printk("dv1394: Allocated %d packets in buffer, total %u pages (%u DMA pages), %lu bytes\n", 
+                                video->n_frames*MAX_PACKETS, video->packet_buf.n_pages,
+                                video->packet_buf.n_dma_pages, video->packet_buf_size);
        }
-
-       debug_printk("dv1394: Allocated %d packet buffers for receive, total %lu bytes\n", 
-                    MAX_PACKET_BUFFER, video->packet_buffer_size);
-
-
+       
        /* set up register offsets for IT context */
        /* IT DMA context registers are spaced 16 bytes apart */
        video->ohci_IsoXmitContextControlSet = OHCI1394_IsoXmitContextControlSet+16*video->ohci_it_ctx;
@@ -1177,26 +1108,9 @@ static int do_dv1394_init(struct video_card *video, struct dv1394_init *init)
        
        return 0;
 
- err_user_buf:
-       if(video->user_buf) {
-               if(video->user_dma.sglist) {
-                       if(video->user_dma.n_dma_pages > 0) {
-                               /* unmap it from the IOMMU */
-                               pci_unmap_sg(video->ohci->dev,
-                                            video->user_dma.sglist,
-                                            video->user_dma.n_pages,
-                                            PCI_DMA_TODEVICE);
-                               video->user_dma.n_dma_pages = 0;
-                       }
-                       kfree(video->user_dma.sglist);
-                       video->user_dma.sglist = NULL;
-                       video->user_dma.n_pages = 0;
-               }
-               rvfree(video->user_buf, video->user_buf_size);
-               video->user_buf = NULL;
-               video->user_buf_size = 0;
-       }
-               
+ err_dv_buf:
+       dma_region_free(&video->dv_buf);
+       
  err_frames:
        for(i = 0; i < DV1394_MAX_FRAMES; i++) {
                if(video->frames[i])
@@ -1229,7 +1143,7 @@ static int do_dv1394_init_default(struct video_card *video)
        struct dv1394_init init;
 
        init.api_version = DV1394_API_VERSION;
-       init.n_frames = 2;
+       init.n_frames = DV1394_MAX_FRAMES / 4;
        /* the following are now set via proc_fs or devfs */
        init.channel = video->channel;
        init.format = video->pal_or_ntsc;
@@ -1261,7 +1175,6 @@ static void stop_dma(struct video_card *video)
                
                video->active_frame = -1;
                video->first_run = 1;
-
                
                /* wait until DMA really stops */
                i = 0;
@@ -1292,7 +1205,7 @@ static void stop_dma(struct video_card *video)
 
 
 
-static int do_dv1394_shutdown(struct video_card *video, int free_user_buf)
+static int do_dv1394_shutdown(struct video_card *video, int free_dv_buf)
 {
        int i;
        unsigned long flags;
@@ -1333,6 +1246,16 @@ static int do_dv1394_shutdown(struct video_card *video, int free_user_buf)
        }
 
        spin_unlock_irqrestore(&video->spinlock, flags);
+
+       /* remove tasklets */
+       if(video->ohci_it_ctx != -1) {
+               ohci1394_unregister_iso_tasklet(video->ohci, &video->it_tasklet);
+               video->ohci_it_ctx = -1;
+       }
+       if(video->ohci_ir_ctx != -1) {
+               ohci1394_unregister_iso_tasklet(video->ohci, &video->ir_tasklet);
+               video->ohci_ir_ctx = -1;
+       }
        
        /* release the ISO channel */
        if(video->channel != -1) {
@@ -1360,42 +1283,20 @@ static int do_dv1394_shutdown(struct video_card *video, int free_user_buf)
        /* we can't free the DMA buffer unless it is guaranteed that
           no more user-space mappings exist */
        
-       if(free_user_buf && video->user_buf) {
-               if(video->user_dma.sglist) {
-                       if(video->user_dma.n_dma_pages > 0) {
-                               /* unmap it from the IOMMU */
-                               pci_unmap_sg(video->ohci->dev,
-                                            video->user_dma.sglist,
-                                            video->user_dma.n_pages,
-                                            PCI_DMA_TODEVICE);
-                               video->user_dma.n_dma_pages = 0;
-                       }
-                       kfree(video->user_dma.sglist);
-                       video->user_dma.sglist = NULL;
-                       video->user_dma.n_pages = 0;
-               }
-               rvfree(video->user_buf, video->user_buf_size);
-               video->user_buf = NULL;
-               video->user_buf_size = 0;
-       }
-       
-       if (video->packet_buffer) {
-               pci_unmap_single(video->ohci->dev,
-                                video->packet_buffer_dma,
-                                video->packet_buffer_size,
-                                PCI_DMA_FROMDEVICE);
-               kfree(video->packet_buffer);
-               video->packet_buffer = NULL;
-               video->packet_buffer_size = 0;
+       if(free_dv_buf) {
+               dma_region_free(&video->dv_buf);
+               video->dv_buf_size = 0;
        }
 
+       /* free packet buffer */
+       dma_region_free(&video->packet_buf);
+       video->packet_buf_size = 0;
+
        debug_printk("dv1394: shutdown complete\n");
 
        return 0;
 }
 
-
-
 /*
        **********************************
        *** MMAP() THEORY OF OPERATION ***
@@ -1418,96 +1319,28 @@ static int do_dv1394_shutdown(struct video_card *video, int free_user_buf)
        force the user to choose one buffer size and stick with
        it. This small sacrifice is worth the huge reduction in
        error-prone code in dv1394.
-
-       Note: dv1394_mmap does no page table manipulation. The page
-       table entries are created by the dv1394_nopage() handler as
-       page faults are taken by the user.
-*/
-
-static struct page * dv1394_nopage(struct vm_area_struct * area, unsigned long address, int write_access)
-{
-       unsigned long offset;
-       unsigned long kernel_virt_addr;
-       struct page *ret = NOPAGE_SIGBUS;
-
-       struct video_card *video = (struct video_card*) area->vm_private_data;
-       
-       /* guard against process-context operations and the interrupt */
-       /* (by definition page faults are taken in interrupt context) */
-       spin_lock(&video->spinlock);
-
-       if(!video->user_buf)
-               goto out;
-
-       if( (address < (unsigned long) area->vm_start) ||
-           (address > (unsigned long) area->vm_start + video->user_buf_size) )
-               goto out;
-
-       offset = address - area->vm_start;
-       kernel_virt_addr = (unsigned long) video->user_buf + offset;
-       ret = vmalloc_to_page((void *)kernel_virt_addr);
-       get_page(ret);
-
- out:
-       spin_unlock(&video->spinlock);
-       return ret;
-}
-
-static struct vm_operations_struct dv1394_vm_ops = {
-       .nopage = dv1394_nopage
-};
-
-/*
-  dv1394_mmap does no page table manipulation. The page table entries
-  are created by the dv1394_nopage() handler as page faults are taken
-  by the user.
 */
 
 int dv1394_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct video_card *video = file_to_video_card(file);
-       unsigned long size;
-       int res = -EINVAL;
+       int retval = -EINVAL;
 
        /* serialize mmap */
        down(&video->sem);
 
        if( ! video_card_initialized(video) ) {
-               res = do_dv1394_init_default(video);
-               if(res)
-                       goto err;
+               retval = do_dv1394_init_default(video);
+               if(retval)
+                       goto out;
        }
 
-       /* region must be page-aligned */
-       if(vma->vm_pgoff != 0)
-               goto err;
-       
-       /* check the size the user is trying to map */
-       size = vma->vm_end - vma->vm_start;
-       if(size > video->user_buf_size)
-               goto err;
-
-       /* 
-          we don't actually mess with the page tables here.
-          (nopage() takes care of that from the page fault handler)
-          Just set up the vma->vm_ops.
-       */
-
-        vma->vm_ops = &dv1394_vm_ops;
-       vma->vm_private_data = video;
-       vma->vm_file = file;
-
-       /* don't try to swap this out =) */
-       vma->vm_flags |= VM_RESERVED;
-
+       retval = dma_region_mmap(&video->dv_buf, file, vma);
+out:
        up(&video->sem);
-       return 0;
- err:
-       up(&video->sem);
-       return res;
+       return retval;
 }
 
-
 /*** DEVICE FILE INTERFACE *************************************************/
 
 /* no need to serialize, multiple threads OK */
@@ -1623,7 +1456,7 @@ static ssize_t dv1394_write(struct file *file, const char *buffer, size_t count,
                        continue; /* start over from 'while(count > 0)...' */
                }
 
-               if(copy_from_user(video->user_buf + video->write_off, buffer, cnt)) {
+               if(copy_from_user(video->dv_buf.kvirt + video->write_off, buffer, cnt)) {
                        if(!ret)
                                ret = -EFAULT;
                        break;
@@ -1670,7 +1503,11 @@ static ssize_t dv1394_read(struct file *file,  char *buffer, size_t count, loff_
                        up(&video->sem);
                        return ret;
                }
-               receive_packets(video, video->frames[video->first_clear_frame]);
+               video->continuity_counter = -1;
+               
+               receive_packets(video);
+               
+               start_dma_receive(video);
        }
 
        ret = 0;
@@ -1723,7 +1560,7 @@ static ssize_t dv1394_read(struct file *file,  char *buffer, size_t count, loff_
                        continue; /* start over from 'while(count > 0)...' */
                }
 
-               if(copy_to_user(buffer, video->user_buf + video->write_off, cnt)) {
+               if(copy_to_user(buffer, video->dv_buf.kvirt + video->write_off, cnt)) {
                                if(!ret)
                                        ret = -EFAULT;
                                break;
@@ -1912,14 +1749,17 @@ static int dv1394_ioctl(struct inode *inode, struct file *file,
        }
 
        case DV1394_START_RECEIVE: {
-
                if( !video_card_initialized(video) ) {
                        ret = do_dv1394_init_default(video);
                        if(ret)
                                goto out;
                }
        
-               receive_packets(video, video->frames[video->first_clear_frame]);
+               video->continuity_counter = -1;
+               
+               receive_packets(video);
+               
+               start_dma_receive(video);
 
                ret = 0;
                break;
@@ -2017,7 +1857,7 @@ static int dv1394_open(struct inode *inode, struct file *file)
                        struct video_card *p;
                        list_for_each(lh, &dv1394_cards) {
                                p = list_entry(lh, struct video_card, list);
-                               if((p->id >> 2) == ieee1394_file_to_instance(file)) {
+                               if((p->id) == ieee1394_file_to_instance(file)) {
                                        video = p;
                                        break;
                                }
@@ -2309,9 +2149,7 @@ static void it_tasklet_func(unsigned long data)
        struct video_card *video = (struct video_card*) data;
 
        spin_lock(&video->spinlock);
-       
-       irq_printk("INTERRUPT! Video = %08lx Iso event Recv: %08x Xmit: %08x\n",
-                  (unsigned long) video, isoRecvIntEvent, isoXmitIntEvent);
+
        irq_printk("ContextControl = %08x, CommandPtr = %08x\n", 
               reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
               reg_read(video->ohci, video->ohci_IsoXmitCommandPtr)
@@ -2453,82 +2291,150 @@ static void ir_tasklet_func(unsigned long data)
        int wake = 0;
        struct video_card *video = (struct video_card*) data;
 
-       if( (video->ohci_ir_ctx != -1) &&
-           (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) ) { 
+       spin_lock(&video->spinlock);
+
+       if( (video->ohci_ir_ctx != -1) 
+           && (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) ) 
+       { 
 
                int sof=0; /* start-of-frame flag */
                struct frame *f;
                u16 packet_length, packet_time;
-
-               packet_length = le16_to_cpu(video->packet_buffer[video->current_packet].data_length);
-               packet_time   = le16_to_cpu(video->packet_buffer[video->current_packet].timestamp);
-
-               irq_printk("received packet %02d, timestamp=%04x, length=%04x, sof=%02x%02x\n", video->current_packet,
-                          packet_time, packet_length, 
-                          video->packet_buffer[video->current_packet].data[0], video->packet_buffer[video->current_packet].data[1]);
-               
-               f = video->frames[video->active_frame];
-
-               /* exclude empty packet */
-               if (packet_length > 8) {
+               int i, dbc=0;
+               struct DMA_descriptor_block *block = NULL;
+               u16 xferstatus;
+
+               int next_i, prev_i;
+               struct DMA_descriptor_block *next = NULL;
+               dma_addr_t next_dma = 0;
+               struct DMA_descriptor_block *prev = NULL;
+
+               /* loop over all descriptors in all frames */
+               for (i = 0; i < video->n_frames*MAX_PACKETS; i++) {
+                       struct packet *p = dma_region_i(&video->packet_buf, struct packet, video->current_packet);
+
+                       /* make sure we are seeing the latest changes to p */
+                       dma_region_sync(&video->packet_buf,
+                                       (unsigned long) p - (unsigned long) video->packet_buf.kvirt,
+                                       sizeof(struct packet));
+                                       
+                       packet_length = le16_to_cpu(p->data_length);
+                       packet_time   = le16_to_cpu(p->timestamp);
+       
+                       irq_printk("received packet %02d, timestamp=%04x, length=%04x, sof=%02x%02x\n", video->current_packet,
+                                  packet_time, packet_length, 
+                                  p->data[0], p->data[1]);
+                       
+                       /* get the descriptor based on packet_buffer cursor */
+                       f = video->frames[video->current_packet / MAX_PACKETS];
+                       block = &(f->descriptor_pool[video->current_packet % MAX_PACKETS]);
+                       xferstatus = le16_to_cpu(block->u.in.il.q[3] >> 16);
+                       xferstatus &= 0x1F;
+
+                       /* get the current frame */
+                       f = video->frames[video->active_frame];
                
-                       /* check for start of frame */
-                       sof = (video->packet_buffer[video->current_packet].data[0] == 0x1f &&
-                               video->packet_buffer[video->current_packet].data[1] == 0x07);
-
-                       if (!video->first_frame) {
-                               if (sof) {
-                                       video->first_frame = 1;
-                               }
-
-                       } else if (sof) {
-                               /* close current frame */
-                               frame_reset(f);  /* f->state = STATE_CLEAR */
-                               video->n_clear_frames++;
-                               if (video->n_clear_frames > video->n_frames) {
-                                       video->n_clear_frames = video->n_frames;
-                                       video->dropped_frames++;
-                               }
-                               if (video->first_clear_frame == -1)
-                                       video->first_clear_frame = video->active_frame;
-
-                               /* get the next frame */
-                               video->active_frame = (video->active_frame + 1) % video->n_frames;
-                               f = video->frames[video->active_frame];
+                       /* exclude empty packet */
+                       if (packet_length > 8 && xferstatus == 0x11) {
+                               irq_printk("ir_tasklet_func: xferStatus/resCount [%d] = 0x%08x\n", i, le32_to_cpu(block->u.in.il.q[3]) );
                        
-                               irq_printk("   frame received, active_frame = %d, n_clear_frames = %d, first_clear_frame = %d\n",
-                                          video->active_frame, video->n_clear_frames, video->first_clear_frame);
-                       }
-                       if (video->first_frame) {
-                               if (sof) {
-                                       /* open next frame */
-                                       f->state = FRAME_READY;
+                               /* check for start of frame */
+                               /* DRD> Changed to check section type ([0]>>5==0) 
+                                  and dif sequence ([1]>>4==0) */
+                               sof = ( (p->data[0] >> 5) == 0 && (p->data[1] >> 4) == 0);
+       
+                               dbc = (int) (p->cip_h1 >> 24);
+                               if ( video->continuity_counter != -1 && dbc > ((video->continuity_counter + 1) % 256) )
+                               {
+                                       video->dropped_frames += video->n_clear_frames + 1;
+                                       video->first_frame = 0;
+                                       video->n_clear_frames = 0;
+                                       video->first_clear_frame = -1;
                                }
+                               video->continuity_counter = dbc;
                                
-                               /* copy to buffer */
-                               if (f->n_packets > (video->frame_size / 480)) {
-                                       printk(KERN_ERR "frame buffer overflow during receive\n");
+                               if (!video->first_frame) {
+                                       if (sof) {
+                                               video->first_frame = 1;
+                                       }
+       
+                               } else if (sof) {
+                                       /* close current frame */
+                                       frame_reset(f);  /* f->state = STATE_CLEAR */
+                                       video->n_clear_frames++;
+                                       if (video->n_clear_frames > video->n_frames) {
+                                               video->dropped_frames++;
+                                               video->n_clear_frames--;
+                                               if (video->n_clear_frames < 0)
+                                                       video->n_clear_frames = 0;
+                                               video->first_clear_frame = (video->first_clear_frame + 1) % video->n_frames;
+                                       }
+                                       if (video->first_clear_frame == -1)
+                                               video->first_clear_frame = video->active_frame;
+       
+                                       /* get the next frame */
+                                       video->active_frame = (video->active_frame + 1) % video->n_frames;
+                                       f = video->frames[video->active_frame];
+                               
+                                       irq_printk("   frame received, active_frame = %d, n_clear_frames = %d, first_clear_frame = %d\n",
+                                                  video->active_frame, video->n_clear_frames, video->first_clear_frame);
                                }
+                               if (video->first_frame) {
+                                       if (sof) {
+                                               /* open next frame */
+                                               f->state = FRAME_READY;
+                                       }
+                                       
+                                       /* copy to buffer */
+                                       if (f->n_packets > (video->frame_size / 480)) {
+                                               printk(KERN_ERR "frame buffer overflow during receive\n");
+                                       }
+                                       
+                                       frame_put_packet(f, p);
+                                       
+                               } /* first_frame */
+                       }
+                       
+                       /* stop, end of ready packets */
+                       else if (xferstatus == 0) {
+                               break;
+                       }
+        
+                       /* reset xferStatus & resCount */
+                       block->u.in.il.q[3] = cpu_to_le32(512);
+
+                       /* terminate dma chain at this (next) packet */
+                       next_i = video->current_packet;
+                       f = video->frames[next_i / MAX_PACKETS];
+                       next = &(f->descriptor_pool[next_i % MAX_PACKETS]);
+                       next_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
+                       next->u.in.il.q[0] |= 3 << 20; /* enable interrupt */
+                       next->u.in.il.q[2] = 0; /* disable branch */
+                       
+                       /* link previous to next */
+                       prev_i = (next_i == 0) ? (MAX_PACKETS * video->n_frames - 1) : (next_i - 1);
+                       f = video->frames[prev_i / MAX_PACKETS];
+                       prev = &(f->descriptor_pool[prev_i % MAX_PACKETS]);
+                       if(prev_i % (MAX_PACKETS/2)) {
+                               prev->u.in.il.q[0] &= ~(3 << 20); /* no interrupt */
+                       } else {
+                               prev->u.in.il.q[0] |= 3 << 20; /* enable interrupt */
+                       }
+                       prev->u.in.il.q[2] =  (cpu_to_le32(next_dma) | 1); /* set Z=1 */
+                       wmb();
 
-                               /* make sure we are seeing the latest changes to packet_buffer */
-                               pci_dma_sync_single(video->ohci->dev,
-                                                   video->packet_buffer_dma,
-                                                   video->packet_buffer_size,
-                                                   PCI_DMA_FROMDEVICE);
-                               
-                               frame_put_packet( f, &video->packet_buffer[video->current_packet]);
-                               
-                       } /* first_frame */
-               } /* not empty packet */
-               /* advance packet_buffer cursor */
-               video->current_packet = (video->current_packet + 1) % MAX_PACKET_BUFFER;
+                       /* wake up DMA in case it fell asleep */
+                       reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 12));
+
+                       /* advance packet_buffer cursor */
+                       video->current_packet = (video->current_packet + 1) % (MAX_PACKETS * video->n_frames);
+                       
+               } /* for all packets */
  
                wake = 1; /* why the hell not? */
-
+               
        } /* receive interrupt */
-
+       
        spin_unlock(&video->spinlock);
        
        if(wake) {
@@ -2555,40 +2461,135 @@ static struct file_operations dv1394_fops=
 
 /*** DEVFS HELPERS *********************************************************/
 
+struct dv1394_devfs_entry *
+dv1394_devfs_find( char *name)
+{
+       struct list_head *lh;
+       struct dv1394_devfs_entry *p;
+
+       spin_lock( &dv1394_devfs_lock);
+       if(!list_empty(&dv1394_devfs)) {
+               list_for_each(lh, &dv1394_devfs) {
+                       p = list_entry(lh, struct dv1394_devfs_entry, list);
+                       if(!strncmp(p->name, name, sizeof(p->name))) {
+                               goto found;
+                       }
+               }
+       }
+       p = NULL;
+       
+found:
+       spin_unlock( &dv1394_devfs_lock);
+       return p;
+}
+
 #ifdef CONFIG_DEVFS_FS
 static int dv1394_devfs_add_entry(struct video_card *video)
 {
-       char buf[64];
-       snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/%s/%s",
-               (video->id>>2),
-               (video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL"),
-               (video->mode == MODE_RECEIVE ? "in" : "out"));
+       char buf[32];
+       struct dv1394_devfs_entry *p;
+       struct dv1394_devfs_entry *parent;
 
-       video->devfs_handle = devfs_register(NULL, buf, DEVFS_FL_NONE,
+       p = kmalloc(sizeof(struct dv1394_devfs_entry), GFP_KERNEL);
+       if(!p) {
+               printk(KERN_ERR "dv1394: cannot allocate dv1394_devfs_entry\n");
+               goto err;
+       }
+       memset(p, 0, sizeof(struct dv1394_devfs_entry));
+       
+       snprintf(buf, sizeof(buf), "dv/host%d/%s", (video->id>>2),
+                                               (video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL"));
+               
+       parent = dv1394_devfs_find(buf);
+       if (parent == NULL) {
+               printk(KERN_ERR "dv1394: unable to locate parent devfs of %s\n", buf);
+               goto err_free;
+       }
+       
+       video->devfs_handle = devfs_register(
+                                                parent->devfs,
+                                            (video->mode == MODE_RECEIVE ? "in" : "out"),
+                                                DEVFS_FL_NONE,
                                             IEEE1394_MAJOR,
                                             IEEE1394_MINOR_BLOCK_DV1394*16 + video->id,
                                             S_IFCHR | S_IRUGO | S_IWUGO,
                                             &dv1394_fops,
                                             (void*) video);
-       if (video->devfs_handle == NULL) {
-               printk(KERN_ERR "dv1394: unable to create /dev/%s\n", buf);
-               return -ENOMEM;
+       p->devfs = video->devfs_handle;
+
+       if (p->devfs == NULL) {
+               printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/%s/%s\n",
+                       parent->name,
+                       (video->mode == MODE_RECEIVE ? "in" : "out"));
+               goto err_free;
        }
+       
+       spin_lock( &dv1394_devfs_lock);
+       INIT_LIST_HEAD(&p->list);
+       list_add_tail(&p->list, &dv1394_devfs);
+       spin_unlock( &dv1394_devfs_lock);
+       
        return 0;
+       
+ err_free:
+       kfree(p);
+ err:
+       return -ENOMEM;
 }
 
-static int dv1394_devfs_add_dir(char *name)
+static int
+dv1394_devfs_add_dir( char *name,
+                                       struct dv1394_devfs_entry *parent, 
+                                       struct dv1394_devfs_entry **out)
 {
-       if (!devfs_mk_dir(NULL, name, NULL)) {
-               printk(KERN_ERR "dv1394: unable to create /dev/%s\n", name);
-               return -ENOMEM;
+       struct dv1394_devfs_entry *p;
+
+       p = kmalloc(sizeof(struct dv1394_devfs_entry), GFP_KERNEL);
+       if(!p) {
+               printk(KERN_ERR "dv1394: cannot allocate dv1394_devfs_entry\n");
+               goto err;
+       }
+       memset(p, 0, sizeof(struct dv1394_devfs_entry));
+       
+       if (parent == NULL) {
+               snprintf(p->name, sizeof(p->name), "%s", name);
+               p->devfs = devfs_mk_dir(ieee1394_devfs_handle, name, NULL);
+       } else {
+               snprintf(p->name, sizeof(p->name), "%s/%s", parent->name, name);
+               p->devfs = devfs_mk_dir(parent->devfs, name, NULL);
+       }
+       if (p->devfs == NULL) {
+               printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/%s\n", p->name);
+               goto err_free;
        }
+
+       p->parent = parent;
+       if (out != NULL) *out = p;
+
+       spin_lock( &dv1394_devfs_lock);
+       INIT_LIST_HEAD(&p->list);
+       list_add_tail(&p->list, &dv1394_devfs);
+       spin_unlock( &dv1394_devfs_lock);
+
        return 0;
+       
+ err_free:
+       kfree(p);
+ err:
+       return -ENOMEM;
 }
 
-void dv1394_devfs_del(char *name)
+void dv1394_devfs_del( char *name)
 {
-       devfs_remove("ieee1394/%s", name);
+       struct dv1394_devfs_entry *p = dv1394_devfs_find(name);
+       if (p != NULL) {
+               devfs_unregister(p->devfs);
+               
+               spin_lock( &dv1394_devfs_lock);
+               list_del(&p->list);
+               spin_unlock( &dv1394_devfs_lock);
+               kfree(p);
+       }
 }
 #endif /* CONFIG_DEVFS_FS */
 
@@ -2612,6 +2613,10 @@ static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes
        /* lower 2 bits of id indicate which of four "plugs"
           per host */
        video->id = ohci->id << 2; 
+       if (format == DV1394_NTSC)
+               video->id |= mode;
+       else
+               video->id |= 2 + mode;
 
        video->ohci_it_ctx = -1;
        video->ohci_ir_ctx = -1;
@@ -2644,8 +2649,10 @@ static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes
        for(i = 0; i < DV1394_MAX_FRAMES; i++)
                video->frames[i] = NULL;
 
-       video->user_buf = NULL;
-       video->user_buf_size = 0;
+       dma_region_init(&video->dv_buf);
+       video->dv_buf_size = 0;
+       dma_region_init(&video->packet_buf);
+       video->packet_buf_size = 0;
 
        clear_bit(0, &video->open);
        spin_lock_init(&video->spinlock);
@@ -2658,10 +2665,6 @@ static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes
        list_add_tail(&video->list, &dv1394_cards);
        spin_unlock_irqrestore(&dv1394_cards_lock, flags);
        
-       if (format == DV1394_NTSC)
-               video->id |= mode;
-       else video->id |= 2 + mode;
-
 #ifdef CONFIG_DEVFS_FS
        if (dv1394_devfs_add_entry(video) < 0)
                        goto err_free;
@@ -2770,12 +2773,15 @@ static void dv1394_add_host (struct hpsb_host *host)
 #endif
 
 #ifdef CONFIG_DEVFS_FS
-       snprintf(buf, sizeof(buf), "ieee1394/dv/host%d", ohci->id);
-       dv1394_devfs_add_dir(buf);
-       snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/NTSC", ohci->id);
-       dv1394_devfs_add_dir(buf);
-       snprintf(buf, sizeof(buf), "ieee1394/dv/host%d/PAL", ohci->id);
-       dv1394_devfs_add_dir(buf);
+{
+       struct dv1394_devfs_entry *devfs_entry = dv1394_devfs_find("dv");
+       if (devfs_entry != NULL) {
+               snprintf(buf, sizeof(buf), "host%d", ohci->id);
+               dv1394_devfs_add_dir(buf, devfs_entry, &devfs_entry);
+               dv1394_devfs_add_dir("NTSC", devfs_entry, NULL);
+               dv1394_devfs_add_dir("PAL", devfs_entry, NULL);
+       }
+}
 #endif
        
        dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE);
@@ -2935,7 +2941,7 @@ static int __init dv1394_init_module(void)
        }
 
 #ifdef CONFIG_DEVFS_FS
-       if (dv1394_devfs_add_dir("ieee1394/dv") < 0) {
+       if (dv1394_devfs_add_dir("dv", NULL, NULL) < 0) {
                printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/dv\n");
                ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394);
                return -ENOMEM;
index 395d3f74d1c0f50b343b6cf689d9e6927af3c1b8..898d94f636208885dd5e12a40b40939168084ddc 100644 (file)
@@ -55,9 +55,9 @@
 #include <linux/ip.h>
 #include <linux/tcp.h>
 #include <linux/skbuff.h>
+#include <linux/bitops.h>
 #include <asm/delay.h>
 #include <asm/semaphore.h>
-#include <asm/bitops.h>
 #include <net/arp.h>
 
 #include "ieee1394_types.h"
@@ -77,7 +77,7 @@
        printk(KERN_ERR fmt, ## args)
 
 static char version[] __devinitdata =
-       "$Rev: 601 $ Ben Collins <bcollins@debian.org>";
+       "$Rev: 641 $ Ben Collins <bcollins@debian.org>";
 
 /* Our ieee1394 highlevel driver */
 #define ETHER1394_DRIVER_NAME "ether1394"
@@ -360,7 +360,7 @@ static void ether1394_add_host (struct hpsb_host *host)
        priv->host = host;
 
        hi = (struct host_info *)kmalloc (sizeof (struct host_info),
-                                         GFP_KERNEL);
+                                         in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
 
        if (hi == NULL)
                goto out;
@@ -682,6 +682,8 @@ static int ether1394_tx (struct sk_buff *skb, struct net_device *dev)
        ptask->skb = skb;
        ptask->addr = addr;
        ptask->dest_node = dest_node;
+       /* TODO: When 2.4 is out of the way, give each of our ethernet
+        * dev's a workqueue to handle these.  */
        HPSB_INIT_WORK(&ptask->tq, hpsb_write_sched, ptask);
        hpsb_schedule_work(&ptask->tq);
 
index bffc57fca7e40d5b5d4c1295eec349690dede6f7..2157dc653a49ceeece6578eee1a9f639fe71fc19 100644 (file)
@@ -28,7 +28,7 @@
 
 
 LIST_HEAD(hl_drivers);
-rwlock_t hl_drivers_lock = RW_LOCK_UNLOCKED;
+static DECLARE_MUTEX(hl_drivers_lock);
 
 LIST_HEAD(addr_space);
 rwlock_t addr_space_lock = RW_LOCK_UNLOCKED;
@@ -53,11 +53,11 @@ struct hpsb_highlevel *hpsb_register_highlevel(const char *name,
         hl->name = name;
         hl->op = ops;
 
-        write_lock_irq(&hl_drivers_lock);
+       down(&hl_drivers_lock);
         list_add_tail(&hl->hl_list, &hl_drivers);
-        write_unlock_irq(&hl_drivers_lock);
+       up(&hl_drivers_lock);
 
-        hl_all_hosts(hl->op->add_host);
+       hl_all_hosts(hl->op->add_host);
 
         return hl;
 }
@@ -82,9 +82,9 @@ void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
         }
         write_unlock_irq(&addr_space_lock);
 
-        write_lock_irq(&hl_drivers_lock);
+       down(&hl_drivers_lock);
         list_del(&hl->hl_list);
-        write_unlock_irq(&hl_drivers_lock);
+       up(&hl_drivers_lock);
 
         if (hl->op->remove_host)
                hl_all_hosts(hl->op->remove_host);
@@ -119,10 +119,8 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl,
         write_lock_irq(&addr_space_lock);
         entry = addr_space.next;
 
-        while (list_entry(entry, struct hpsb_address_serve, as_list)->end
-               <= start) {
-                if (list_entry(entry->next, struct hpsb_address_serve, as_list)
-                    ->start >= end) {
+        while (list_entry(entry, struct hpsb_address_serve, as_list)->end <= start) {
+                if (list_entry(entry->next, struct hpsb_address_serve, as_list)->start >= end) {
                         list_add(&as->as_list, entry);
                         list_add_tail(&as->addr_list, &hl->addr_list);
                         retval = 1;
@@ -198,13 +196,13 @@ void highlevel_add_host(struct hpsb_host *host)
         struct list_head *entry;
         struct hpsb_highlevel *hl;
 
-        read_lock(&hl_drivers_lock);
+       down(&hl_drivers_lock);
         list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
 
                hl->op->add_host(host);
         }
-        read_unlock(&hl_drivers_lock);
+        up(&hl_drivers_lock);
 }
 
 void highlevel_remove_host(struct hpsb_host *host)
@@ -212,14 +210,14 @@ void highlevel_remove_host(struct hpsb_host *host)
         struct list_head *entry;
         struct hpsb_highlevel *hl;
 
-        write_lock_irq(&hl_drivers_lock);
+        down(&hl_drivers_lock);
        list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
 
                if (hl->op->remove_host)
                        hl->op->remove_host(host);
         }
-        write_unlock_irq(&hl_drivers_lock);
+        up(&hl_drivers_lock);
 }
 
 void highlevel_host_reset(struct hpsb_host *host)
@@ -227,14 +225,14 @@ void highlevel_host_reset(struct hpsb_host *host)
         struct list_head *entry;
         struct hpsb_highlevel *hl;
 
-       read_lock(&hl_drivers_lock);
+       down(&hl_drivers_lock);
        list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
 
                 if (hl->op->host_reset)
                         hl->op->host_reset(host);
         }
-       read_unlock(&hl_drivers_lock);
+       up(&hl_drivers_lock);
 }
 
 void highlevel_iso_receive(struct hpsb_host *host, quadlet_t *data,
@@ -244,7 +242,7 @@ void highlevel_iso_receive(struct hpsb_host *host, quadlet_t *data,
         struct hpsb_highlevel *hl;
         int channel = (data[0] >> 8) & 0x3f;
 
-        read_lock(&hl_drivers_lock);
+        down(&hl_drivers_lock);
         entry = hl_drivers.next;
 
         while (entry != &hl_drivers) {
@@ -254,7 +252,7 @@ void highlevel_iso_receive(struct hpsb_host *host, quadlet_t *data,
                 }
                 entry = entry->next;
         }
-        read_unlock(&hl_drivers_lock);
+        up(&hl_drivers_lock);
 }
 
 void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
@@ -264,7 +262,7 @@ void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
         struct hpsb_highlevel *hl;
         int cts = data[0] >> 4;
 
-        read_lock(&hl_drivers_lock);
+        down(&hl_drivers_lock);
         entry = hl_drivers.next;
 
         while (entry != &hl_drivers) {
@@ -275,7 +273,7 @@ void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
                 }
                 entry = entry->next;
         }
-        read_unlock(&hl_drivers_lock);
+        up(&hl_drivers_lock);
 }
 
 int highlevel_read(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
index 9504458a429031a4b84f7990d92f392121f668cd..175adf294b182ac520cbe3cb5c5d8fa283af0108 100644 (file)
@@ -121,6 +121,7 @@ void hpsb_unref_host(struct hpsb_host *host)
 struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra)
 {
         struct hpsb_host *h;
+       int i;
 
         h = kmalloc(sizeof(struct hpsb_host) + extra, SLAB_KERNEL);
         if (!h) return NULL;
@@ -133,8 +134,8 @@ struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra)
         INIT_LIST_HEAD(&h->pending_packets);
         spin_lock_init(&h->pending_pkt_lock);
 
-        sema_init(&h->tlabel_count, 64);
-        spin_lock_init(&h->tlabel_lock);
+       for (i = 0; i < ARRAY_SIZE(h->tpool); i++)
+               HPSB_TPOOL_INIT(&h->tpool[i]);
 
        atomic_set(&h->generation, 0);
 
index 5169ce1ef06d4fdad6fcaa9b0fb10b06e8811289..5971dd0bf4fdc6993574ad10c41b2d96dbb3ba88 100644 (file)
@@ -18,6 +18,7 @@
 #define CSR_CONFIG_ROM_SIZE       0x100
 
 struct hpsb_packet;
+struct hpsb_iso;
 
 struct hpsb_host {
         struct list_head host_list;
@@ -32,13 +33,6 @@ struct hpsb_host {
         spinlock_t pending_pkt_lock;
         struct hpsb_queue_struct timeout_tq;
 
-        /* A bitmask where a set bit means that this tlabel is in use.
-         * FIXME - should be handled per node instead of per bus. */
-        u32 tlabel_pool[2];
-        struct semaphore tlabel_count;
-        spinlock_t tlabel_lock;
-       u32 tlabel_current;
-
         unsigned char iso_listen_count[64];
 
         int node_count; /* number of identified nodes on this bus */
@@ -64,6 +58,9 @@ struct hpsb_host {
         u8 *speed_map;
         struct csr_control csr;
 
+       /* Per node tlabel pool allocation */
+       struct hpsb_tlabel_pool tpool[64];
+
         struct hpsb_host_driver *driver;
 
        struct pci_dev *pdev;
@@ -108,6 +105,28 @@ enum devctl_cmd {
         ISO_UNLISTEN_CHANNEL
 };
 
+enum isoctl_cmd {
+       /* rawiso API - see iso.h for the meanings of these commands
+        * INIT = allocate resources
+        * START = begin transmission/reception (arg: cycle to start on)
+        * STOP = halt transmission/reception
+        * QUEUE/RELEASE = produce/consume packets (arg: # of packets)
+        * SHUTDOWN = deallocate resources
+        */
+       
+       XMIT_INIT,
+       XMIT_START,
+       XMIT_STOP,
+       XMIT_QUEUE,
+       XMIT_SHUTDOWN,
+       
+       RECV_INIT,
+       RECV_START,
+       RECV_STOP,
+       RECV_RELEASE,
+       RECV_SHUTDOWN,
+};
+
 enum reset_types {
         /* 166 microsecond reset -- only type of reset available on
            non-1394a capable IEEE 1394 controllers */
@@ -115,7 +134,13 @@ enum reset_types {
 
         /* Short (arbitrated) reset -- only available on 1394a capable
            IEEE 1394 capable controllers */
-        SHORT_RESET
+        SHORT_RESET,
+
+       /* Variants, that set force_root before issueing the bus reset */
+       LONG_RESET_FORCE_ROOT, SHORT_RESET_FORCE_ROOT,
+
+       /* Variants, that clear force_root before issueing the bus reset */
+       LONG_RESET_NO_FORCE_ROOT, SHORT_RESET_NO_FORCE_ROOT
 };
 
 struct hpsb_host_driver {
@@ -145,6 +170,11 @@ struct hpsb_host_driver {
          */
         int (*devctl) (struct hpsb_host *host, enum devctl_cmd command, int arg);
 
+        /* ISO transmission/reception functions. Return 0 on success, -1 on failure.
+         * If the low-level driver does not support the new ISO API, set isoctl to NULL.
+         */
+       int (*isoctl) (struct hpsb_iso *iso, enum isoctl_cmd command, int arg);
+       
         /* This function is mainly to redirect local CSR reads/locks to the iso
          * management registers (bus manager id, bandwidth available, channels
          * available) to the hardware registers in OHCI.  reg is 0,1,2,3 for bus
@@ -156,9 +186,6 @@ struct hpsb_host_driver {
                                  quadlet_t data, quadlet_t compare);
 };
 
-/* core internal use */
-void register_builtin_lowlevels(void);
-
 /* high level internal use */
 struct hpsb_highlevel;
 void hl_all_hosts(void (*function)(struct hpsb_host*));
index c68a2ace66ce9a065816e4ca8597887e78871089..fe59095108d210918db9cb18d23a34cc4912d653 100644 (file)
@@ -15,6 +15,7 @@
 #define TCODE_CYCLE_START        0x8
 #define TCODE_LOCK_REQUEST       0x9
 #define TCODE_ISO_DATA           0xa
+#define TCODE_STREAM_DATA        0xa
 #define TCODE_LOCK_RESPONSE      0xb
 
 #define RCODE_COMPLETE           0x0
index fad65a501b888f641eb6da9c9ded1a936e3c2878..0b251ee098c1e68bd113391102120e467493b256 100644 (file)
@@ -29,7 +29,7 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
-#include <asm/bitops.h>
+#include <linux/bitops.h>
 #include <asm/byteorder.h>
 #include <asm/semaphore.h>
 
@@ -42,6 +42,8 @@
 #include "csr.h"
 #include "nodemgr.h"
 #include "ieee1394_hotplug.h"
+#include "dma.h"
+#include "iso.h"
 
 /*
  * Disable the nodemgr detection and config rom reading functionality.
@@ -76,28 +78,31 @@ static void dump_packet(const char *text, quadlet_t *data, int size)
         printk("\n");
 }
 
-static void process_complete_tasks(struct hpsb_packet *packet)
+static void run_packet_complete(struct hpsb_packet *packet)
 {
-       struct list_head *lh, *next;
-
-       list_for_each_safe(lh, next, &packet->complete_tq) {
-               struct hpsb_queue_struct *tq =
-                       list_entry(lh, struct hpsb_queue_struct, hpsb_queue_list);
-               list_del(&tq->hpsb_queue_list);
-               hpsb_schedule_work(tq);
+       if (packet->complete_routine != NULL) {
+               packet->complete_routine(packet->complete_data);
+               packet->complete_routine = NULL;
+               packet->complete_data = NULL;
        }
-
        return;
 }
 
 /**
- * hpsb_add_packet_complete_task - add a new task for when a packet completes
+ * hpsb_set_packet_complete_task - set the task that runs when a packet
+ * completes. You cannot call this more than once on a single packet
+ * before it is sent.
+ *
  * @packet: the packet whose completion we want the task added to
- * @tq: the hpsb_queue_struct describing the task to add
+ * @routine: function to call
+ * @data: data (if any) to pass to the above function
  */
-void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_queue_struct *tq)
+void hpsb_set_packet_complete_task(struct hpsb_packet *packet,
+                                  void (*routine)(void *), void *data)
 {
-       list_add_tail(&tq->hpsb_queue_list, &packet->complete_tq);
+       BUG_ON(packet->complete_routine != NULL);
+       packet->complete_routine = routine;
+       packet->complete_data = data;
        return;
 }
 
@@ -145,9 +150,10 @@ struct hpsb_packet *alloc_hpsb_packet(size_t data_size)
                 packet->data_size = data_size;
         }
 
-        INIT_LIST_HEAD(&packet->complete_tq);
         INIT_LIST_HEAD(&packet->list);
         sema_init(&packet->state_change, 0);
+       packet->complete_routine = NULL;
+       packet->complete_data = NULL;
         packet->state = hpsb_unused;
         packet->generation = -1;
         packet->data_be = 1;
@@ -372,6 +378,7 @@ void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot)
                         /* selfid stage did not complete without error */
                         HPSB_NOTICE("Error in SelfID stage, resetting");
                        host->in_bus_reset = 0;
+                       /* this should work from ohci1394 now... */
                         hpsb_reset_bus(host, LONG_RESET);
                         return;
                 } else {
@@ -397,7 +404,6 @@ void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot)
                 host->is_irm = 0;
         }
 
-        host->reset_retries = 0;
         if (isroot) {
                host->driver->devctl(host, ACT_CYCLE_MASTER, 1);
                host->is_cycmst = 1;
@@ -405,6 +411,29 @@ void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot)
        atomic_inc(&host->generation);
        host->in_bus_reset = 0;
         highlevel_host_reset(host);
+
+        /* check for common cycle master error */
+        hpsb_check_cycle_master(host);
+}
+
+
+void hpsb_check_cycle_master(struct hpsb_host *host)
+{
+       /* check if host is IRM and not ROOT */
+       if (host->is_irm && !host->is_root) {
+               HPSB_NOTICE("Host is IRM but not root, resetting");
+               if (host->reset_retries++ < 4) {
+                       /* selfid stage did not yield valid cycle master */
+                       hpsb_reset_bus(host, LONG_RESET_FORCE_ROOT);
+               } else {
+                       host->reset_retries = 0;
+                       HPSB_NOTICE("Stopping out-of-control reset loop");
+                       HPSB_NOTICE("Warning - Cycle Master not set correctly");
+               }
+               return;
+       }
+
+       host->reset_retries = 0;
 }
 
 
@@ -425,7 +454,7 @@ void hpsb_packet_sent(struct hpsb_host *host, struct hpsb_packet *packet,
                 packet->state = hpsb_complete;
                 up(&packet->state_change);
                 up(&packet->state_change);
-                process_complete_tasks(packet);
+                run_packet_complete(packet);
                 return;
         }
 
@@ -614,7 +643,7 @@ void handle_packet_response(struct hpsb_host *host, int tcode, quadlet_t *data,
 
         packet->state = hpsb_complete;
         up(&packet->state_change);
-       process_complete_tasks(packet);
+       run_packet_complete(packet);
 }
 
 
@@ -647,6 +676,54 @@ static struct hpsb_packet *create_reply_packet(struct hpsb_host *host,
         return p;
 }
 
+#define PREP_ASYNC_HEAD_RCODE(tc) \
+       packet->tcode = tc; \
+       packet->header[0] = (packet->node_id << 16) | (packet->tlabel << 10) \
+               | (1 << 8) | (tc << 4); \
+       packet->header[1] = (packet->host->node_id << 16) | (rcode << 12); \
+       packet->header[2] = 0
+
+static void fill_async_readquad_resp(struct hpsb_packet *packet, int rcode,
+                              quadlet_t data)
+{
+       PREP_ASYNC_HEAD_RCODE(TCODE_READQ_RESPONSE);
+       packet->header[3] = data;
+       packet->header_size = 16;
+       packet->data_size = 0;
+}
+
+static void fill_async_readblock_resp(struct hpsb_packet *packet, int rcode,
+                               int length)
+{
+       if (rcode != RCODE_COMPLETE)
+               length = 0;
+
+       PREP_ASYNC_HEAD_RCODE(TCODE_READB_RESPONSE);
+       packet->header[3] = length << 16;
+       packet->header_size = 16;
+       packet->data_size = length + (length % 4 ? 4 - (length % 4) : 0);
+}
+
+static void fill_async_write_resp(struct hpsb_packet *packet, int rcode)
+{
+       PREP_ASYNC_HEAD_RCODE(TCODE_WRITE_RESPONSE);
+       packet->header[2] = 0;
+       packet->header_size = 12;
+       packet->data_size = 0;
+}
+
+static void fill_async_lock_resp(struct hpsb_packet *packet, int rcode, int extcode,
+                          int length)
+{
+       if (rcode != RCODE_COMPLETE)
+               length = 0;
+
+       PREP_ASYNC_HEAD_RCODE(TCODE_LOCK_RESPONSE);
+       packet->header[3] = (length << 16) | extcode;
+       packet->header_size = 16;
+       packet->data_size = length;
+}
+
 #define PREP_REPLY_PACKET(length) \
                 packet = create_reply_packet(host, data, length); \
                 if (packet == NULL) break
@@ -848,7 +925,7 @@ void abort_requests(struct hpsb_host *host)
                 packet->state = hpsb_complete;
                 packet->ack_code = ACKX_ABORTED;
                 up(&packet->state_change);
-               process_complete_tasks(packet);
+               run_packet_complete(packet);
         }
 }
 
@@ -890,7 +967,7 @@ void abort_timedouts(struct hpsb_host *host)
                 packet->state = hpsb_complete;
                 packet->ack_code = ACKX_TIMEOUT;
                 up(&packet->state_change);
-               process_complete_tasks(packet);
+               run_packet_complete(packet);
         }
 }
 
@@ -1143,14 +1220,17 @@ module_init(ieee1394_init);
 module_exit(ieee1394_cleanup);
 
 /* Exported symbols */
+
+/** hosts.c **/
 EXPORT_SYMBOL(hpsb_alloc_host);
 EXPORT_SYMBOL(hpsb_add_host);
 EXPORT_SYMBOL(hpsb_remove_host);
 EXPORT_SYMBOL(hpsb_ref_host);
 EXPORT_SYMBOL(hpsb_unref_host);
-EXPORT_SYMBOL(hpsb_speedto_str);
-EXPORT_SYMBOL(hpsb_add_packet_complete_task);
 
+/** ieee1394_core.c **/
+EXPORT_SYMBOL(hpsb_speedto_str);
+EXPORT_SYMBOL(hpsb_set_packet_complete_task);
 EXPORT_SYMBOL(alloc_hpsb_packet);
 EXPORT_SYMBOL(free_hpsb_packet);
 EXPORT_SYMBOL(hpsb_send_packet);
@@ -1158,35 +1238,30 @@ EXPORT_SYMBOL(hpsb_reset_bus);
 EXPORT_SYMBOL(hpsb_bus_reset);
 EXPORT_SYMBOL(hpsb_selfid_received);
 EXPORT_SYMBOL(hpsb_selfid_complete);
+EXPORT_SYMBOL(hpsb_check_cycle_master);
 EXPORT_SYMBOL(hpsb_packet_sent);
 EXPORT_SYMBOL(hpsb_packet_received);
+EXPORT_SYMBOL(ieee1394_register_chardev);
+EXPORT_SYMBOL(ieee1394_unregister_chardev);
+EXPORT_SYMBOL(ieee1394_devfs_handle);
+EXPORT_SYMBOL(ieee1394_procfs_entry);
 
-EXPORT_SYMBOL(get_tlabel);
-EXPORT_SYMBOL(free_tlabel);
-EXPORT_SYMBOL(fill_async_readquad);
-EXPORT_SYMBOL(fill_async_readquad_resp);
-EXPORT_SYMBOL(fill_async_readblock);
-EXPORT_SYMBOL(fill_async_readblock_resp);
-EXPORT_SYMBOL(fill_async_writequad);
-EXPORT_SYMBOL(fill_async_writeblock);
-EXPORT_SYMBOL(fill_async_write_resp);
-EXPORT_SYMBOL(fill_async_lock);
-EXPORT_SYMBOL(fill_async_lock_resp);
-EXPORT_SYMBOL(fill_iso_packet);
-EXPORT_SYMBOL(fill_phy_packet);
-EXPORT_SYMBOL(hpsb_make_readqpacket);
-EXPORT_SYMBOL(hpsb_make_readbpacket);
-EXPORT_SYMBOL(hpsb_make_writeqpacket);
-EXPORT_SYMBOL(hpsb_make_writebpacket);
+/** ieee1394_transactions.c **/
+EXPORT_SYMBOL(hpsb_get_tlabel);
+EXPORT_SYMBOL(hpsb_free_tlabel);
+EXPORT_SYMBOL(hpsb_make_readpacket);
+EXPORT_SYMBOL(hpsb_make_writepacket);
 EXPORT_SYMBOL(hpsb_make_lockpacket);
 EXPORT_SYMBOL(hpsb_make_lock64packet);
 EXPORT_SYMBOL(hpsb_make_phypacket);
-EXPORT_SYMBOL(hpsb_packet_success);
-EXPORT_SYMBOL(hpsb_make_packet);
+EXPORT_SYMBOL(hpsb_make_isopacket);
 EXPORT_SYMBOL(hpsb_read);
 EXPORT_SYMBOL(hpsb_write);
 EXPORT_SYMBOL(hpsb_lock);
+EXPORT_SYMBOL(hpsb_lock64);
+EXPORT_SYMBOL(hpsb_packet_success);
 
+/** highlevel.c **/
 EXPORT_SYMBOL(hpsb_register_highlevel);
 EXPORT_SYMBOL(hpsb_unregister_highlevel);
 EXPORT_SYMBOL(hpsb_register_addrspace);
@@ -1201,20 +1276,42 @@ EXPORT_SYMBOL(highlevel_add_host);
 EXPORT_SYMBOL(highlevel_remove_host);
 EXPORT_SYMBOL(highlevel_host_reset);
 
+/** nodemgr.c **/
 EXPORT_SYMBOL(hpsb_guid_get_entry);
 EXPORT_SYMBOL(hpsb_nodeid_get_entry);
+EXPORT_SYMBOL(hpsb_check_nodeid);
 EXPORT_SYMBOL(hpsb_node_fill_packet);
 EXPORT_SYMBOL(hpsb_node_read);
 EXPORT_SYMBOL(hpsb_node_write);
 EXPORT_SYMBOL(hpsb_node_lock);
-EXPORT_SYMBOL(hpsb_update_config_rom);
-EXPORT_SYMBOL(hpsb_get_config_rom);
 EXPORT_SYMBOL(hpsb_register_protocol);
 EXPORT_SYMBOL(hpsb_unregister_protocol);
 EXPORT_SYMBOL(hpsb_release_unit_directory);
 
-EXPORT_SYMBOL(ieee1394_register_chardev);
-EXPORT_SYMBOL(ieee1394_unregister_chardev);
-EXPORT_SYMBOL(ieee1394_devfs_handle);
+/** csr.c **/
+EXPORT_SYMBOL(hpsb_update_config_rom);
+EXPORT_SYMBOL(hpsb_get_config_rom);
 
-EXPORT_SYMBOL(ieee1394_procfs_entry);
+/** dma.c **/
+EXPORT_SYMBOL(dma_prog_region_init);
+EXPORT_SYMBOL(dma_prog_region_alloc);
+EXPORT_SYMBOL(dma_prog_region_free);
+EXPORT_SYMBOL(dma_region_init);
+EXPORT_SYMBOL(dma_region_alloc);
+EXPORT_SYMBOL(dma_region_free);
+EXPORT_SYMBOL(dma_region_sync);
+EXPORT_SYMBOL(dma_region_mmap);
+EXPORT_SYMBOL(dma_region_offset_to_bus);
+
+/** iso.c **/
+EXPORT_SYMBOL(hpsb_iso_xmit_init);
+EXPORT_SYMBOL(hpsb_iso_recv_init);
+EXPORT_SYMBOL(hpsb_iso_xmit_start);
+EXPORT_SYMBOL(hpsb_iso_recv_start);
+EXPORT_SYMBOL(hpsb_iso_stop);
+EXPORT_SYMBOL(hpsb_iso_shutdown);
+EXPORT_SYMBOL(hpsb_iso_xmit_queue_packets);
+EXPORT_SYMBOL(hpsb_iso_recv_release_packets);
+EXPORT_SYMBOL(hpsb_iso_n_ready);
+EXPORT_SYMBOL(hpsb_iso_packet_data);
+EXPORT_SYMBOL(hpsb_iso_packet_info);
index dc33c7199d7bd7a4f9e4ea08bc1d329d64204719..030406396e1abfca2da9122d95ae785bcdaa19c5 100644 (file)
@@ -68,7 +68,10 @@ struct hpsb_packet {
         /* Very core internal, don't care. */
         struct semaphore state_change;
 
-       struct list_head complete_tq;
+       /* Function (and possible data to pass to it) to call when this
+        * packet is completed.  */
+       void (*complete_routine)(void *);
+       void *complete_data;
 
         /* Store jiffies for implementing bus timeouts. */
         unsigned long sendtime;
@@ -76,8 +79,9 @@ struct hpsb_packet {
         quadlet_t embedded_header[5];
 };
 
-/* add a new task for when a packet completes */
-void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_queue_struct *tq);
+/* Set a task for when a packet completes */
+void hpsb_set_packet_complete_task(struct hpsb_packet *packet,
+               void (*routine)(void *), void *data);
 
 static inline struct hpsb_packet *driver_packet(struct list_head *l)
 {
@@ -136,6 +140,12 @@ void hpsb_selfid_received(struct hpsb_host *host, quadlet_t sid);
  */
 void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot);
 
+/* 
+ * Check bus reset results to find cycle master
+ */
+void hpsb_check_cycle_master(struct hpsb_host *host);
+
+
 /*
  * Notify core of sending a packet.  Ackcode is the ack code returned for async
  * transmits or ACKX_SEND_ERROR if the transmission failed completely; ACKX_NONE
index 9733e5454f1de4a7874ff7c446c4caf89295f4e0..8802070a3d612885103ac63849439c06737068a5 100644 (file)
  */
 
 #include <linux/sched.h>
+#include <linux/bitops.h>
 #include <asm/errno.h>
-#include <asm/bitops.h>
+#include <linux/interrupt.h>
 
 #include "ieee1394.h"
 #include "ieee1394_types.h"
 #include "hosts.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"
+#include "nodemgr.h"
 
 
 #define PREP_ASYNC_HEAD_ADDRESS(tc) \
         packet->header[1] = (packet->host->node_id << 16) | (addr >> 32); \
         packet->header[2] = addr & 0xffffffff
 
-#define PREP_ASYNC_HEAD_RCODE(tc) \
-        packet->tcode = tc; \
-        packet->header[0] = (packet->node_id << 16) | (packet->tlabel << 10) \
-                | (1 << 8) | (tc << 4); \
-        packet->header[1] = (packet->host->node_id << 16) | (rcode << 12); \
-        packet->header[2] = 0
-
 
-void fill_async_readquad(struct hpsb_packet *packet, u64 addr)
+static void fill_async_readquad(struct hpsb_packet *packet, u64 addr)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_READQ);
         packet->header_size = 12;
@@ -43,16 +38,7 @@ void fill_async_readquad(struct hpsb_packet *packet, u64 addr)
         packet->expect_response = 1;
 }
 
-void fill_async_readquad_resp(struct hpsb_packet *packet, int rcode, 
-                              quadlet_t data)
-{
-        PREP_ASYNC_HEAD_RCODE(TCODE_READQ_RESPONSE);
-        packet->header[3] = data;
-        packet->header_size = 16;
-        packet->data_size = 0;
-}
-
-void fill_async_readblock(struct hpsb_packet *packet, u64 addr, int length)
+static void fill_async_readblock(struct hpsb_packet *packet, u64 addr, int length)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_READB);
         packet->header[3] = length << 16;
@@ -61,20 +47,7 @@ void fill_async_readblock(struct hpsb_packet *packet, u64 addr, int length)
         packet->expect_response = 1;
 }
 
-void fill_async_readblock_resp(struct hpsb_packet *packet, int rcode, 
-                               int length)
-{
-        if (rcode != RCODE_COMPLETE) {
-                length = 0;
-        }
-
-        PREP_ASYNC_HEAD_RCODE(TCODE_READB_RESPONSE);
-        packet->header[3] = length << 16;
-        packet->header_size = 16;
-        packet->data_size = length + (length % 4 ? 4 - (length % 4) : 0);
-}
-
-void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data)
+static void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_WRITEQ);
         packet->header[3] = data;
@@ -83,7 +56,7 @@ void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data)
         packet->expect_response = 1;
 }
 
-void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length)
+static void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_WRITEB);
         packet->header[3] = length << 16;
@@ -92,15 +65,7 @@ void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length)
         packet->data_size = length + (length % 4 ? 4 - (length % 4) : 0);
 }
 
-void fill_async_write_resp(struct hpsb_packet *packet, int rcode)
-{
-        PREP_ASYNC_HEAD_RCODE(TCODE_WRITE_RESPONSE);
-        packet->header[2] = 0;
-        packet->header_size = 12;
-        packet->data_size = 0;
-}
-
-void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode, 
+static void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode, 
                      int length)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_LOCK_REQUEST);
@@ -110,20 +75,7 @@ void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode,
         packet->expect_response = 1;
 }
 
-void fill_async_lock_resp(struct hpsb_packet *packet, int rcode, int extcode, 
-                          int length)
-{
-        if (rcode != RCODE_COMPLETE) {
-                length = 0;
-        }
-
-        PREP_ASYNC_HEAD_RCODE(TCODE_LOCK_RESPONSE);
-        packet->header[3] = (length << 16) | extcode;
-        packet->header_size = 16;
-        packet->data_size = length;
-}
-
-void fill_iso_packet(struct hpsb_packet *packet, int length, int channel,
+static void fill_iso_packet(struct hpsb_packet *packet, int length, int channel,
                      int tag, int sync)
 {
         packet->header[0] = (length << 16) | (tag << 14) | (channel << 8)
@@ -135,7 +87,7 @@ void fill_iso_packet(struct hpsb_packet *packet, int length, int channel,
         packet->tcode = TCODE_ISO_DATA;
 }
 
-void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data) 
+static void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data) 
 { 
         packet->header[0] = data;
         packet->header[1] = ~data; 
@@ -148,9 +100,8 @@ void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data)
 
 
 /**
- * get_tlabel - allocate a transaction label
- * @host: host to be used for transmission
- * @nodeid: the node ID of the transmission target
+ * hpsb_get_tlabel - allocate a transaction label
+ * @packet: the packet who's tlabel/tpool we set
  * @wait: whether to sleep if no tlabel is available
  *
  * Every asynchronous transaction on the 1394 bus needs a transaction label to
@@ -159,72 +110,66 @@ void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data)
  * matching possible without ambiguity.
  *
  * There are 64 different tlabels, so an allocated tlabel has to be freed with
- * free_tlabel() after the transaction is complete (unless it's reused again for
+ * hpsb_free_tlabel() after the transaction is complete (unless it's reused again for
  * the same target node).
  *
- * @wait must not be set to true if you are calling from interrupt context.
+ * @wait cannot be set if in_interrupt()
  *
- * Return value: The allocated transaction label or -1 if there was no free
- * tlabel and @wait is false.
+ * Return value: Zero on success, otherwise non-zero. A non-zero return
+ * generally means there are no available tlabels.
  */
-int get_tlabel(struct hpsb_host *host, nodeid_t nodeid, int wait)
+int hpsb_get_tlabel(struct hpsb_packet *packet, int wait)
 {
-       int tlabel = 0;
        unsigned long flags;
-       int found_tlabel = 0;
+       struct hpsb_tlabel_pool *tp;
+
+       tp = &packet->host->tpool[packet->node_id & NODE_MASK];
 
        if (wait) {
-               down(&host->tlabel_count);
+               BUG_ON(in_interrupt());
+               down(&tp->count);
        } else {
-               if (down_trylock(&host->tlabel_count)) return -1;
+               if (down_trylock(&tp->count))
+                       return 1;
        }
 
-       spin_lock_irqsave(&host->tlabel_lock, flags);
-
-       while (!found_tlabel) {
-               tlabel = host->tlabel_current;
-               if (tlabel < 32 && !(host->tlabel_pool[0] & 1 << tlabel)) {
-                       host->tlabel_pool[0] |= 1 << tlabel;
-                       found_tlabel = 1;
-               } else if (!(host->tlabel_pool[1] & 1 << (tlabel - 32))) {
-                       host->tlabel_pool[1] |= 1 << (tlabel - 32);
-                       found_tlabel = 1;
-               }
-               host->tlabel_current = (host->tlabel_current + 1) % 64;
-       }
+       spin_lock_irqsave(&tp->lock, flags);
        
-       spin_unlock_irqrestore(&host->tlabel_lock, flags);
-
-       return tlabel;
+       packet->tlabel = find_next_zero_bit(&tp->pool, 64, tp->next);
+       tp->next = (packet->tlabel + 1) % 64;
+       /* Should _never_ happen */
+       BUG_ON(test_and_set_bit(packet->tlabel, &tp->pool));
+       tp->allocations++;
+       spin_unlock_irqrestore(&tp->lock, flags);
+
+       return 0;
 }
 
-/**
- * free_tlabel - free an allocated transaction label
- * @host: host to be used for transmission
- * @nodeid: the node ID of the transmission target
- * @tlabel: the transaction label to free
+/** 
+ * hpsb_free_tlabel - free an allocated transaction label
+ * @packet: packet whos tlabel/tpool needs to be cleared
  *
- * Frees the transaction label allocated with get_tlabel().  The tlabel has to
- * be freed after the transaction is complete (i.e. response was received for a
- * split transaction or packet was sent for a unified transaction).
+ * Frees the transaction label allocated with hpsb_get_tlabel().  The
+ * tlabel has to be freed after the transaction is complete (i.e. response
+ * was received for a split transaction or packet was sent for a unified
+ * transaction).
  *
  * A tlabel must not be freed twice.
  */
-void free_tlabel(struct hpsb_host *host, nodeid_t nodeid, int tlabel)
+void hpsb_free_tlabel(struct hpsb_packet *packet)
 {
         unsigned long flags;
+       struct hpsb_tlabel_pool *tp;
+       
+       tp = &packet->host->tpool[packet->node_id & NODE_MASK];
 
-        spin_lock_irqsave(&host->tlabel_lock, flags);
+       BUG_ON(packet->tlabel > 63 || packet->tlabel < 0);
 
-        if (tlabel < 32) {
-                host->tlabel_pool[0] &= ~(1 << tlabel);
-        } else {
-                host->tlabel_pool[1] &= ~(1 << (tlabel-32));
-        }
+        spin_lock_irqsave(&tp->lock, flags);
+       BUG_ON(!test_and_clear_bit(packet->tlabel, &tp->pool));
+        spin_unlock_irqrestore(&tp->lock, flags);
 
-        spin_unlock_irqrestore(&host->tlabel_lock, flags);
-
-        up(&host->tlabel_count);
+       up(&tp->count);
 }
 
 
@@ -297,124 +242,144 @@ int hpsb_packet_success(struct hpsb_packet *packet)
         HPSB_PANIC("reached unreachable code 2 in %s", __FUNCTION__);
 }
 
-struct hpsb_packet *hpsb_make_readqpacket(struct hpsb_host *host, nodeid_t node,
-                                          u64 addr)
+struct hpsb_packet *hpsb_make_readpacket(struct hpsb_host *host, nodeid_t node,
+                                        u64 addr, size_t length)
 {
-        struct hpsb_packet *p;
-
-        p = alloc_hpsb_packet(0);
-        if (!p) return NULL;
+        struct hpsb_packet *packet;
 
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
-        fill_async_readquad(p, addr);
+       if (length == 0)
+               return NULL;
 
-        return p;
-}
+       packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
+       if (!packet)
+               return NULL;
 
-struct hpsb_packet *hpsb_make_readbpacket(struct hpsb_host *host, nodeid_t node,
-                                          u64 addr, size_t length)
-{
-        struct hpsb_packet *p;
+       packet->host = host;
+       packet->node_id = node;
 
-        p = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
-        if (!p) return NULL;
+       if (hpsb_get_tlabel(packet, in_interrupt() ? 0 : 1)) {
+               free_hpsb_packet(packet);
+               return NULL;
+       }
 
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
-        fill_async_readblock(p, addr, length);
+       if (length == 4)
+               fill_async_readquad(packet, addr);
+       else
+               fill_async_readblock(packet, addr, length);
 
-        return p;
+       return packet;
 }
 
-struct hpsb_packet *hpsb_make_writeqpacket(struct hpsb_host *host,
-                                           nodeid_t node, u64 addr,
-                                           quadlet_t data)
+struct hpsb_packet *hpsb_make_writepacket (struct hpsb_host *host, nodeid_t node,
+                                          u64 addr, quadlet_t *buffer, size_t length)
 {
-        struct hpsb_packet *p;
-
-        p = alloc_hpsb_packet(0);
-        if (!p) return NULL;
-
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
-        fill_async_writequad(p, addr, data);
+       struct hpsb_packet *packet;
 
-        return p;
-}
+       if (length == 0)
+               return NULL;
 
-struct hpsb_packet *hpsb_make_writebpacket(struct hpsb_host *host,
-                                           nodeid_t node, u64 addr,
-                                           size_t length)
-{
-        struct hpsb_packet *p;
+       packet = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
+       if (!packet)
+               return NULL;
 
-        p = alloc_hpsb_packet(length + (length % 4 ? 4 - (length % 4) : 0));
-        if (!p) return NULL;
+       if (length % 4) { /* zero padding bytes */
+               packet->data[length >> 2] = 0;
+       }
+       packet->host = host;
+       packet->node_id = node;
 
-        if (length % 4) {
-                p->data[length / 4] = 0;
-        }
+       if (hpsb_get_tlabel(packet, in_interrupt() ? 0 : 1)) {
+               free_hpsb_packet(packet);
+               return NULL;
+       }
 
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
-        fill_async_writeblock(p, addr, length);
+       if (length == 4) {
+               fill_async_writequad(packet, addr, buffer ? *buffer : 0);
+       } else {
+               fill_async_writeblock(packet, addr, length);
+               if (buffer)
+                       memcpy(packet->data, buffer, length);
+       }
 
-        return p;
+       return packet;
 }
 
 struct hpsb_packet *hpsb_make_lockpacket(struct hpsb_host *host, nodeid_t node,
-                                         u64 addr, int extcode)
+                                         u64 addr, int extcode, quadlet_t *data,
+                                        quadlet_t arg)
 {
-        struct hpsb_packet *p;
+       struct hpsb_packet *p;
+       u32 length;
 
-        p = alloc_hpsb_packet(8);
-        if (!p) return NULL;
+       p = alloc_hpsb_packet(8);
+       if (!p) return NULL;
 
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
+       p->host = host;
+       p->node_id = node;
+       if (hpsb_get_tlabel(p, in_interrupt() ? 0 : 1)) {
+               free_hpsb_packet(p);
+               return NULL;
+       }
 
-        switch (extcode) {
-        case EXTCODE_FETCH_ADD:
-        case EXTCODE_LITTLE_ADD:
-                fill_async_lock(p, addr, extcode, 4);
-                break;
-        default:
-                fill_async_lock(p, addr, extcode, 8);
-                break;
-        }
+       switch (extcode) {
+       case EXTCODE_FETCH_ADD:
+       case EXTCODE_LITTLE_ADD:
+               length = 4;
+               if (data)
+                       p->data[0] = *data;
+               break;
+       default:
+               length = 8;
+               if (data) {
+                       p->data[0] = arg;
+                       p->data[1] = *data;
+               }
+               break;
+       }
+       fill_async_lock(p, addr, extcode, length);
 
-        return p;
+       return p;
 }
 
 struct hpsb_packet *hpsb_make_lock64packet(struct hpsb_host *host, nodeid_t node,
-                                           u64 addr, int extcode)
+                                           u64 addr, int extcode, octlet_t *data,
+                                          octlet_t arg)
 {
-        struct hpsb_packet *p;
+       struct hpsb_packet *p;
+       u32 length;
 
-        p = alloc_hpsb_packet(16);
-        if (!p) return NULL;
+       p = alloc_hpsb_packet(16);
+       if (!p) return NULL;
 
-        p->host = host;
-        p->tlabel = get_tlabel(host, node, 1);
-        p->node_id = node;
+       p->host = host;
+       p->node_id = node;
+       if (hpsb_get_tlabel(p, in_interrupt() ? 0 : 1)) {
+               free_hpsb_packet(p);
+               return NULL;
+       }
 
-        switch (extcode) {
-        case EXTCODE_FETCH_ADD:
-        case EXTCODE_LITTLE_ADD:
-                fill_async_lock(p, addr, extcode, 8);
-                break;
-        default:
-                fill_async_lock(p, addr, extcode, 16);
-                break;
-        }
+       switch (extcode) {
+       case EXTCODE_FETCH_ADD:
+       case EXTCODE_LITTLE_ADD:
+               length = 8;
+               if (data) {
+                       p->data[0] = *data >> 32;
+                       p->data[1] = *data & 0xffffffff;
+               }
+               break;
+       default:
+               length = 16;
+               if (data) {
+                       p->data[0] = arg >> 32;
+                       p->data[1] = arg & 0xffffffff;
+                       p->data[2] = *data >> 32;
+                       p->data[3] = *data & 0xffffffff;
+               }
+               break;
+       }
+       fill_async_lock(p, addr, extcode, length);
 
-        return p;
+       return p;
 }
 
 struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host,
@@ -431,6 +396,23 @@ struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host,
         return p; 
 }
 
+struct hpsb_packet *hpsb_make_isopacket(struct hpsb_host *host,
+                                       int length, int channel,
+                                       int tag, int sync)
+{
+       struct hpsb_packet *p;
+
+       p = alloc_hpsb_packet(length);
+       if (!p) return NULL;
+
+       p->host = host;
+       fill_iso_packet(p, length, channel, tag, sync);
+
+       p->generation = get_hpsb_generation(host);
+
+       return p;
+}
+
 /*
  * FIXME - these functions should probably read from / write to user space to
  * avoid in kernel buffers for user space callers
@@ -442,15 +424,12 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation,
         struct hpsb_packet *packet;
         int retval = 0;
         
-        if (length == 0) {
+        if (length == 0)
                 return -EINVAL;
-        }
 
-        if (length == 4) {
-                packet = hpsb_make_readqpacket(host, node, addr);
-        } else {
-                packet = hpsb_make_readbpacket(host, node, addr, length);
-        }
+       BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
+
+       packet = hpsb_make_readpacket(host, node, addr, length);
 
         if (!packet) {
                 return -ENOMEM;
@@ -475,35 +454,12 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation,
         }
 
 hpsb_read_fail:
-        free_tlabel(host, node, packet->tlabel);
+        hpsb_free_tlabel(packet);
         free_hpsb_packet(packet);
 
         return retval;
 }
 
-struct hpsb_packet *hpsb_make_packet (struct hpsb_host *host, nodeid_t node,
-                                     u64 addr, quadlet_t *buffer, size_t length)
-{
-        struct hpsb_packet *packet;
-        
-        if (length == 0)
-                return NULL;
-
-        if (length == 4)
-                packet = hpsb_make_writeqpacket(host, node, addr, *buffer);
-        else
-                packet = hpsb_make_writebpacket(host, node, addr, length);
-
-        if (!packet)
-                return NULL;
-
-       /* Sometimes this may be called without data, just to allocate the
-        * packet. */
-        if (length != 4 && buffer)
-                memcpy(packet->data, buffer, length);
-
-       return packet;
-}
 
 int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
               u64 addr, quadlet_t *buffer, size_t length)
@@ -514,7 +470,9 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
        if (length == 0)
                return -EINVAL;
 
-       packet = hpsb_make_packet (host, node, addr, buffer, length);
+       BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
+
+       packet = hpsb_make_writepacket (host, node, addr, buffer, length);
 
        if (!packet)
                return -ENOMEM;
@@ -530,7 +488,7 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
         retval = hpsb_packet_success(packet);
 
 hpsb_write_fail:
-        free_tlabel(host, node, packet->tlabel);
+        hpsb_free_tlabel(packet);
         free_hpsb_packet(packet);
 
         return retval;
@@ -542,35 +500,13 @@ int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
              u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
 {
         struct hpsb_packet *packet;
-        int retval = 0, length;
-        
-        packet = alloc_hpsb_packet(8);
-        if (!packet) {
-                return -ENOMEM;
-        }
+        int retval = 0;
 
-        packet->host = host;
-        packet->tlabel = get_tlabel(host, node, 1);
-        packet->node_id = node;
-
-        switch (extcode) {
-        case EXTCODE_MASK_SWAP:
-        case EXTCODE_COMPARE_SWAP:
-        case EXTCODE_BOUNDED_ADD:
-        case EXTCODE_WRAP_ADD:
-                length = 8;
-                packet->data[0] = arg;
-                packet->data[1] = *data;
-                break;
-        case EXTCODE_FETCH_ADD:
-        case EXTCODE_LITTLE_ADD:
-                length = 4;
-                packet->data[0] = *data;
-                break;
-        default:
-                return -EINVAL;
-        }
-        fill_async_lock(packet, addr, extcode, length);
+       BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
+
+       packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);        
+        if (!packet)
+                return -ENOMEM;
 
        packet->generation = generation;
         if (!hpsb_send_packet(packet)) {
@@ -586,8 +522,39 @@ int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
         }
 
 hpsb_lock_fail:
-        free_tlabel(host, node, packet->tlabel);
+        hpsb_free_tlabel(packet);
         free_hpsb_packet(packet);
 
         return retval;
 }
+
+int hpsb_lock64(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+               u64 addr, int extcode, octlet_t *data, octlet_t arg)
+{
+       struct hpsb_packet *packet;
+       int retval = 0;
+
+       BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
+
+       packet = hpsb_make_lock64packet(host, node, addr, extcode, data, arg);
+       if (!packet)
+               return -ENOMEM;
+
+       packet->generation = generation;
+       if (!hpsb_send_packet(packet)) {
+               retval = -EINVAL;
+               goto hpsb_lock64_fail;
+       }
+       down(&packet->state_change);
+       down(&packet->state_change);
+       retval = hpsb_packet_success(packet);
+
+       if (retval == 0)
+               *data = (u64)packet->data[1] << 32 | packet->data[0];
+
+hpsb_lock64_fail:
+       hpsb_free_tlabel(packet);
+       free_hpsb_packet(packet);
+
+        return retval;
+}
index 47ad22239fc6d931cc3b8f9fcad966c2ba33905b..3750e40c0bc7a061a7d8483152ef62ad1de16aad 100644 (file)
@@ -4,49 +4,27 @@
 #include "ieee1394_core.h"
 
 
-/*
- * Utility functions to fill out packet headers.
- */
-void fill_async_readquad(struct hpsb_packet *packet, u64 addr);
-void fill_async_readquad_resp(struct hpsb_packet *packet, int rcode, 
-                              quadlet_t data);
-void fill_async_readblock(struct hpsb_packet *packet, u64 addr, int length);
-void fill_async_readblock_resp(struct hpsb_packet *packet, int rcode, 
-                               int length);
-void fill_async_writequad(struct hpsb_packet *packet, u64 addr, quadlet_t data);
-void fill_async_writeblock(struct hpsb_packet *packet, u64 addr, int length);
-void fill_async_write_resp(struct hpsb_packet *packet, int rcode);
-void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode, 
-                     int length);
-void fill_async_lock_resp(struct hpsb_packet *packet, int rcode, int extcode, 
-                          int length);
-void fill_iso_packet(struct hpsb_packet *packet, int length, int channel,
-                     int tag, int sync);
-void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data);
-
 /*
  * Get and free transaction labels.
  */
-int get_tlabel(struct hpsb_host *host, nodeid_t nodeid, int wait);
-void free_tlabel(struct hpsb_host *host, nodeid_t nodeid, int tlabel);
+int hpsb_get_tlabel(struct hpsb_packet *packet, int wait);
+void hpsb_free_tlabel(struct hpsb_packet *packet);
 
-struct hpsb_packet *hpsb_make_readqpacket(struct hpsb_host *host, nodeid_t node,
-                                          u64 addr);
-struct hpsb_packet *hpsb_make_readbpacket(struct hpsb_host *host, nodeid_t node,
-                                          u64 addr, size_t length);
-struct hpsb_packet *hpsb_make_writeqpacket(struct hpsb_host *host,
-                                           nodeid_t node, u64 addr,
-                                           quadlet_t data);
-struct hpsb_packet *hpsb_make_writebpacket(struct hpsb_host *host,
-                                           nodeid_t node, u64 addr,
-                                           size_t length);
+struct hpsb_packet *hpsb_make_readpacket(struct hpsb_host *host, nodeid_t node,
+                                        u64 addr, size_t length);
 struct hpsb_packet *hpsb_make_lockpacket(struct hpsb_host *host, nodeid_t node,
-                                         u64 addr, int extcode);
+                                         u64 addr, int extcode, quadlet_t *data,
+                                        quadlet_t arg);
 struct hpsb_packet *hpsb_make_lock64packet(struct hpsb_host *host, nodeid_t node,
-                                          u64 addr, int extcode);
+                                          u64 addr, int extcode, octlet_t *data,
+                                         octlet_t arg);
 struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host,
                                         quadlet_t data) ;
-
+struct hpsb_packet *hpsb_make_isopacket(struct hpsb_host *host,
+                                       int length, int channel,
+                                       int tag, int sync);
+struct hpsb_packet *hpsb_make_writepacket (struct hpsb_host *host, nodeid_t node,
+                                          u64 addr, quadlet_t *buffer, size_t length);
 
 /*
  * hpsb_packet_success - Make sense of the ack and reply codes and
@@ -75,10 +53,7 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
               u64 addr, quadlet_t *buffer, size_t length);
 int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
              u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
-
-/* Generic packet creation. Used by hpsb_write. Also useful for protocol
- * drivers that want to implement their own hpsb_write replacement.  */
-struct hpsb_packet *hpsb_make_packet (struct hpsb_host *host, nodeid_t node,
-                                     u64 addr, quadlet_t *buffer, size_t length);
+int hpsb_lock64(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+               u64 addr, int extcode, octlet_t *data, octlet_t arg);
 
 #endif /* _IEEE1394_TRANSACTIONS_H */
index 850f883541262d07285d7963e8c1863fa26a0f17..691705cd1286982fe10d34389c888be9df5b943c 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/list.h>
 #include <linux/init.h>
 #include <linux/string.h>
+#include <asm/semaphore.h>
 #include <asm/byteorder.h>
 
 
 #define HPSB_PREPARE_WORK(x,y,z) PREPARE_WORK(x,y,z)
 #endif
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,44)
+/* pci_pool_create changed. does not take the flags arg any longer */
+#define hpsb_pci_pool_create(a,b,c,d,e,f) pci_pool_create(a,b,c,d,e,f)
+#else
+#define hpsb_pci_pool_create(a,b,c,d,e,f) pci_pool_create(a,b,c,d,e)
+#endif
+
+/* Transaction Label handling */
+struct hpsb_tlabel_pool {
+       u64 pool;
+       spinlock_t lock;
+       u8 next;
+       u32 allocations;
+       struct semaphore count;
+};
+
+#define HPSB_TPOOL_INIT(_tp)            \
+do {                                    \
+       sema_init(&(_tp)->count, 63);   \
+       spin_lock_init(&(_tp)->lock);   \
+       (_tp)->next = 0;                \
+       (_tp)->pool = 0;                \
+} while(0)
+
 
 typedef u32 quadlet_t;
 typedef u64 octlet_t;
diff --git a/drivers/ieee1394/iso.c b/drivers/ieee1394/iso.c
new file mode 100644 (file)
index 0000000..b162ba5
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+ * IEEE 1394 for Linux
+ *
+ * kernel ISO transmission/reception
+ *
+ * Copyright (C) 2002 Maas Digital LLC
+ *
+ * This code is licensed under the GPL.  See the file COPYING in the root
+ * directory of the kernel sources for details.
+ */
+
+#include <linux/slab.h>
+#include "iso.h"
+
+void hpsb_iso_stop(struct hpsb_iso *iso)
+{
+       if(!iso->flags & HPSB_ISO_DRIVER_STARTED)
+               return;
+
+       iso->host->driver->isoctl(iso, iso->type == HPSB_ISO_XMIT ? XMIT_STOP : RECV_STOP, 0);
+       iso->flags &= ~HPSB_ISO_DRIVER_STARTED;
+}
+
+void hpsb_iso_shutdown(struct hpsb_iso *iso)
+{
+       if(iso->flags & HPSB_ISO_DRIVER_INIT) {
+               hpsb_iso_stop(iso);
+               iso->host->driver->isoctl(iso, iso->type == HPSB_ISO_XMIT ? XMIT_SHUTDOWN : RECV_SHUTDOWN, 0);
+               iso->flags &= ~HPSB_ISO_DRIVER_INIT;
+       }
+       
+       dma_region_free(&iso->buf);
+       kfree(iso);
+}
+
+static struct hpsb_iso* hpsb_iso_common_init(struct hpsb_host *host, enum hpsb_iso_type type,
+                                            unsigned int buf_packets,
+                                            unsigned int max_packet_size,
+                                            int channel,
+                                            int irq_interval,
+                                            void (*callback)(struct hpsb_iso*))
+{
+       struct hpsb_iso *iso;
+       unsigned int packet_plus_info;
+       int dma_direction;
+       int iso_header_bytes;
+       const int info_bytes = sizeof(struct hpsb_iso_packet_info);
+       
+       /* make sure driver supports the ISO API */
+       if(!host->driver->isoctl)
+               return NULL;
+
+       if(type == HPSB_ISO_RECV) {
+               /* when receiving, leave 8 extra bytes in front
+                  of the data payload for the iso header */
+               iso_header_bytes = 8;
+       } else {
+               iso_header_bytes = 0;
+       }
+       
+       /* sanitize parameters */
+       
+       if(buf_packets < 2)
+               buf_packets = 2;
+       
+       if(irq_interval < 1 || irq_interval > buf_packets / 2)
+               irq_interval = buf_packets / 2;
+       
+       if(max_packet_size + info_bytes + iso_header_bytes > PAGE_SIZE)
+               return NULL;
+       
+       /* size of packet payload plus the per-packet info must be a power of 2
+          and at most equal to the page size */
+       
+       for(packet_plus_info = 256; packet_plus_info < PAGE_SIZE; packet_plus_info *= 2) {
+               if(packet_plus_info >= (max_packet_size + info_bytes + iso_header_bytes)) {
+                       break;
+               }
+       }
+
+       /* allocate and write the struct hpsb_iso */
+       
+       iso = kmalloc(sizeof(*iso), SLAB_KERNEL);
+       if(!iso)
+               return NULL;
+       
+       iso->type = type;
+       iso->host = host;
+       iso->hostdata = NULL;
+       iso->callback = callback;
+       iso->channel = channel;
+       iso->irq_interval = irq_interval;
+       dma_region_init(&iso->buf);
+       iso->buf_packets = buf_packets;
+       iso->buf_stride = packet_plus_info;
+       iso->max_packet_size = max_packet_size;
+       iso->packet_data_offset = iso_header_bytes;
+       iso->packet_info_offset = iso_header_bytes + max_packet_size;
+       iso->first_packet = 0;
+
+       if(iso->type == HPSB_ISO_XMIT) {
+               atomic_set(&iso->n_dma_packets, 0);
+               dma_direction = PCI_DMA_TODEVICE;
+       } else {
+               atomic_set(&iso->n_dma_packets, iso->buf_packets);
+               dma_direction = PCI_DMA_FROMDEVICE;
+       }
+       
+       atomic_set(&iso->overflows, 0);
+       iso->flags = 0;
+       iso->prebuffer = 0;
+       
+       /* allocate the packet buffer */
+       if(dma_region_alloc(&iso->buf, iso->buf_packets * iso->buf_stride,
+                           host->pdev, dma_direction))
+               goto err;
+
+       return iso;
+
+err:
+       hpsb_iso_shutdown(iso);
+       return NULL;
+}
+
+int hpsb_iso_n_ready(struct hpsb_iso* iso)
+{
+       return iso->buf_packets - atomic_read(&iso->n_dma_packets);
+}
+       
+
+struct hpsb_iso* hpsb_iso_xmit_init(struct hpsb_host *host,
+                                   unsigned int buf_packets,
+                                   unsigned int max_packet_size,
+                                   int channel,
+                                   int speed,
+                                   int irq_interval,
+                                   void (*callback)(struct hpsb_iso*))
+{
+       struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_XMIT,
+                                                   buf_packets, max_packet_size,
+                                                   channel, irq_interval, callback);
+       if(!iso)
+               return NULL;
+
+       iso->speed = speed;
+       
+       /* tell the driver to start working */
+       if(host->driver->isoctl(iso, XMIT_INIT, 0))
+               goto err;
+
+       iso->flags |= HPSB_ISO_DRIVER_INIT;
+       return iso;
+
+err:
+       hpsb_iso_shutdown(iso);
+       return NULL;
+}
+
+struct hpsb_iso* hpsb_iso_recv_init(struct hpsb_host *host,
+                                   unsigned int buf_packets,
+                                   unsigned int max_packet_size,
+                                   int channel,
+                                   int irq_interval,
+                                   void (*callback)(struct hpsb_iso*))
+{
+       struct hpsb_iso *iso = hpsb_iso_common_init(host, HPSB_ISO_RECV,
+                                                   buf_packets, max_packet_size,
+                                                   channel, irq_interval, callback);
+       if(!iso)
+               return NULL;
+
+       /* tell the driver to start working */
+       if(host->driver->isoctl(iso, RECV_INIT, 0))
+               goto err;
+
+       iso->flags |= HPSB_ISO_DRIVER_INIT;
+       return iso;
+
+err:
+       hpsb_iso_shutdown(iso);
+       return NULL;
+}
+
+static int do_iso_xmit_start(struct hpsb_iso *iso, int cycle)
+{
+       int retval = iso->host->driver->isoctl(iso, XMIT_START, cycle);
+       if(retval)
+               return retval;
+
+       iso->flags |= HPSB_ISO_DRIVER_STARTED;
+       return retval;
+}
+
+int hpsb_iso_xmit_start(struct hpsb_iso *iso, int cycle, int prebuffer)
+{
+       if(iso->type != HPSB_ISO_XMIT)
+               return -1;
+       
+       if(iso->flags & HPSB_ISO_DRIVER_STARTED)
+               return 0;
+
+       if(prebuffer < 1)
+               prebuffer = 1;
+
+       if(prebuffer > iso->buf_packets)
+               prebuffer = iso->buf_packets;
+
+       iso->prebuffer = prebuffer;
+
+       if(cycle != -1) {
+               /* pre-fill info->cycle */
+               int pkt = iso->first_packet;
+               int c, i;
+
+               cycle %= 8000;
+
+               c = cycle;
+               for(i = 0; i < iso->buf_packets; i++) {
+                       struct hpsb_iso_packet_info *info = hpsb_iso_packet_info(iso, pkt);
+
+                       info->cycle = c;
+                       
+                       c = (c+1) % 8000;
+                       pkt = (pkt+1) % iso->buf_packets;
+               }
+       }
+       
+       /* remember the starting cycle; DMA will commence from xmit_queue_packets() */
+       iso->start_cycle = cycle;
+
+       return 0;
+}
+
+int hpsb_iso_recv_start(struct hpsb_iso *iso, int cycle)
+{
+       int retval = 0;
+
+       if(iso->type != HPSB_ISO_RECV)
+               return -1;
+       
+       if(iso->flags & HPSB_ISO_DRIVER_STARTED)
+               return 0;
+
+       retval = iso->host->driver->isoctl(iso, RECV_START, cycle);
+       if(retval)
+               return retval;
+
+       iso->flags |= HPSB_ISO_DRIVER_STARTED;
+       return retval;
+}
+
+int hpsb_iso_xmit_queue_packets(struct hpsb_iso *iso, unsigned int n_packets)
+{
+       int i, retval;
+       int pkt = iso->first_packet;
+
+       if(iso->type != HPSB_ISO_XMIT)
+               return -1;
+       
+       /* check packet sizes for sanity */
+       for(i = 0; i < n_packets; i++) {
+               struct hpsb_iso_packet_info *info = hpsb_iso_packet_info(iso, pkt);
+               if(info->len > iso->max_packet_size) {
+                       printk(KERN_ERR "hpsb_iso_xmit_queue_packets: packet too long (%u, max is %u)\n",
+                              info->len, iso->max_packet_size);
+                       return -EINVAL;
+               }
+                                                            
+               pkt = (pkt+1) % iso->buf_packets;
+       }
+
+       retval = iso->host->driver->isoctl(iso, XMIT_QUEUE, n_packets);
+       if(retval)
+               return retval;
+
+       if(iso->prebuffer != 0) {
+               iso->prebuffer -= n_packets;
+               if(iso->prebuffer <= 0) {
+                       iso->prebuffer = 0;
+                       return do_iso_xmit_start(iso,
+                                                iso->start_cycle);
+               }
+       }
+
+       return 0;
+}
+
+int hpsb_iso_recv_release_packets(struct hpsb_iso *iso, unsigned int n_packets)
+{
+       if(iso->type != HPSB_ISO_RECV)
+               return -1;
+       
+       return iso->host->driver->isoctl(iso, RECV_RELEASE, n_packets);
+}
+
+unsigned char* hpsb_iso_packet_data(struct hpsb_iso *iso, unsigned int pkt)
+{
+       return (iso->buf.kvirt + pkt * iso->buf_stride)
+               + iso->packet_data_offset;
+}
+
+struct hpsb_iso_packet_info* hpsb_iso_packet_info(struct hpsb_iso *iso, unsigned int pkt)
+{
+       return (struct hpsb_iso_packet_info*) ((iso->buf.kvirt + pkt * iso->buf_stride)
+                                              + iso->packet_info_offset);
+}
diff --git a/drivers/ieee1394/iso.h b/drivers/ieee1394/iso.h
new file mode 100644 (file)
index 0000000..43c8c05
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * IEEE 1394 for Linux
+ *
+ * kernel ISO transmission/reception
+ *
+ * Copyright (C) 2002 Maas Digital LLC
+ *
+ * This code is licensed under the GPL.  See the file COPYING in the root
+ * directory of the kernel sources for details.
+ */
+
+#ifndef IEEE1394_ISO_H
+#define IEEE1394_ISO_H
+
+#include "hosts.h"
+#include "dma.h"
+
+/* high-level ISO interface */
+
+/* per-packet data embedded in the ringbuffer */
+struct hpsb_iso_packet_info {
+       unsigned short len;
+       unsigned short cycle;
+       unsigned char channel; /* recv only */
+       unsigned char tag;
+       unsigned char sy;
+};
+
+/*
+ * each packet in the ringbuffer consists of three things:
+ * 1. the packet's data payload (no isochronous header)
+ * 2. a struct hpsb_iso_packet_info
+ * 3. some empty space before the next packet
+ *
+ * packets are separated by hpsb_iso.buf_stride bytes
+ * an even number of packets fit on one page
+ * no packet can be larger than one page
+ */
+
+enum hpsb_iso_type { HPSB_ISO_RECV = 0, HPSB_ISO_XMIT = 1 };
+
+struct hpsb_iso {
+       enum hpsb_iso_type type;
+
+       /* pointer to low-level driver and its private data */
+       struct hpsb_host *host;
+       void *hostdata;
+       
+       /* function to be called (from interrupt context) when the iso status changes */
+       void (*callback)(struct hpsb_iso*);
+
+       int speed; /* SPEED_100, 200, or 400 */
+       int channel;
+
+       /* greatest # of packets between interrupts - controls
+          the maximum latency of the buffer */
+       int irq_interval;
+       
+       /* the packet ringbuffer */
+       struct dma_region buf;
+
+       /* # of packets in the ringbuffer */
+       unsigned int buf_packets;
+
+       /* offset between successive packets, in bytes -
+          you can assume that this is a power of 2,
+          and less than or equal to the page size */   
+       int buf_stride;
+       
+       /* largest possible packet size, in bytes */
+       unsigned int max_packet_size;
+
+       /* offset relative to (buf.kvirt + N*buf_stride) at which
+          the data payload begins for packet N */
+       int packet_data_offset;
+       
+       /* offset relative to (buf.kvirt + N*buf_stride) at which the
+          struct hpsb_iso_packet_info is stored for packet N */
+       int packet_info_offset;
+
+       /* the index of the next packet that will be produced
+          or consumed by the user */
+       int first_packet;
+
+       /* number of packets owned by the low-level driver and
+          queued for transmission or reception.
+          this is related to the number of packets available
+          to the user process: n_ready = buf_packets - n_dma_packets */        
+       atomic_t n_dma_packets;
+
+       /* how many times the buffer has overflowed or underflowed */
+       atomic_t overflows;
+
+       /* private flags to track initialization progress */
+#define HPSB_ISO_DRIVER_INIT     (1<<0)
+#define HPSB_ISO_DRIVER_STARTED  (1<<1)
+       unsigned int flags;
+
+       /* # of packets left to prebuffer (xmit only) */
+       int prebuffer;
+
+       /* starting cycle (xmit only) */
+       int start_cycle;
+};
+
+/* functions available to high-level drivers (e.g. raw1394) */
+
+/* allocate the buffer and DMA context */
+
+struct hpsb_iso* hpsb_iso_xmit_init(struct hpsb_host *host,
+                                   unsigned int buf_packets,
+                                   unsigned int max_packet_size,
+                                   int channel,
+                                   int speed,
+                                   int irq_interval,
+                                   void (*callback)(struct hpsb_iso*));
+
+struct hpsb_iso* hpsb_iso_recv_init(struct hpsb_host *host,
+                                   unsigned int buf_packets,
+                                   unsigned int max_packet_size,
+                                   int channel,
+                                   int irq_interval,
+                                   void (*callback)(struct hpsb_iso*));
+
+/* start/stop DMA */
+int hpsb_iso_xmit_start(struct hpsb_iso *iso, int start_on_cycle, int prebuffer);
+int hpsb_iso_recv_start(struct hpsb_iso *iso, int start_on_cycle);
+void hpsb_iso_stop(struct hpsb_iso *iso);
+
+/* deallocate buffer and DMA context */
+void hpsb_iso_shutdown(struct hpsb_iso *iso);
+
+/* N packets have been written to the buffer; queue them for transmission */
+int  hpsb_iso_xmit_queue_packets(struct hpsb_iso *xmit, unsigned int n_packets);
+
+/* N packets have been read out of the buffer, re-use the buffer space */
+int  hpsb_iso_recv_release_packets(struct hpsb_iso *recv, unsigned int n_packets);
+
+/* returns # of packets ready to send or receive */
+int hpsb_iso_n_ready(struct hpsb_iso *iso);
+
+/* returns a pointer to the payload of packet 'pkt' */
+unsigned char* hpsb_iso_packet_data(struct hpsb_iso *iso, unsigned int pkt);
+
+/* returns a pointer to the info struct of packet 'pkt' */
+struct hpsb_iso_packet_info* hpsb_iso_packet_info(struct hpsb_iso *iso, unsigned int pkt);
+
+#endif /* IEEE1394_ISO_H */
index 23b8c1b7fd90738e3566bda7178c9a8656b6d0c5..0f5440f9966bc16b5cbce3be86d88cab6e9a0858 100644 (file)
@@ -9,9 +9,9 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/config.h>
 #include <linux/list.h>
 #include <linux/slab.h>
-#include <asm/byteorder.h>
 #include <linux/smp_lock.h>
 #include <linux/interrupt.h>
 #include <linux/kmod.h>
@@ -20,6 +20,8 @@
 #ifdef CONFIG_PROC_FS
 #include <linux/proc_fs.h>
 #endif
+#include <asm/atomic.h>
+#include <asm/byteorder.h>
 
 #include "ieee1394_types.h"
 #include "ieee1394.h"
 #include "csr.h"
 #include "nodemgr.h"
 
+#ifdef CONFIG_IEEE1394_OUI_DB
+struct oui_list_struct {
+       int oui;
+       char *name;
+};
+
+extern struct oui_list_struct oui_list[];
+
+static char *nodemgr_find_oui_name(int oui) {
+       int i;
+
+       for (i = 0; oui_list[i].name; i++)
+               if (oui_list[i].oui == oui)
+                       return oui_list[i].name;
+
+       return NULL;
+}
+#endif
 
 /* 
  * Basically what we do here is start off retrieving the bus_info block.
@@ -86,6 +106,7 @@ static int raw1394_read_proc(char *page, char **start, off_t off,
        struct node_entry *ne;
        int len;
        char *out = page;
+       unsigned long flags;
 
        if (down_interruptible(&nodemgr_serialize))
                return -EINTR;
@@ -102,10 +123,17 @@ static int raw1394_read_proc(char *page, char **start, off_t off,
                     NODE_BUS_ARGS(ne->nodeid), (unsigned long long)ne->guid);
 
                /* Generic Node information */
-               PUTF("  Vendor ID: `%s' [0x%06x]\n",
-                    ne->vendor_name ?: "Unknown", ne->vendor_id);
+               PUTF("  Vendor ID   : `%s' [0x%06x]\n", ne->oui_name, ne->vendor_id);
+               if (ne->vendor_name)
+                       PUTF("  Vendor text : `%s'\n", ne->vendor_name);
                PUTF("  Capabilities: 0x%06x\n", ne->capabilities);
-               PUTF("  Bus Options:\n");
+               PUTF("  Tlabel stats:\n");
+               spin_lock_irqsave(&ne->tpool->lock, flags);
+               PUTF("    Free  : %d\n", atomic_read(&ne->tpool->count.count) + 1);
+               PUTF("    Total : %u\n", ne->tpool->allocations);
+               PUTF("    Mask  : %016Lx\n", (unsigned long long)ne->tpool->pool);
+               spin_unlock_irqrestore(&ne->tpool->lock, flags);
+               PUTF("  Bus Options :\n");
                PUTF("    IRMC(%d) CMC(%d) ISC(%d) BMC(%d) PMC(%d) GEN(%d)\n"
                     "    LSPD(%d) MAX_REC(%d) CYC_CLK_ACC(%d)\n",
                     ne->busopt.irmc, ne->busopt.cmc, ne->busopt.isc, ne->busopt.bmc,
@@ -136,15 +164,21 @@ static int raw1394_read_proc(char *page, char **start, off_t off,
                        int printed = 0; // small hack
 
                        PUTF("  Unit Directory %d:\n", ud_count++);
+
+                       if (ud->flags & UNIT_DIRECTORY_VENDOR_ID ||
+                           ud->flags & UNIT_DIRECTORY_MODEL_ID) {
+                               PUTF("    Vendor/Model ID  : ");
+                       }
                        if (ud->flags & UNIT_DIRECTORY_VENDOR_ID) {
-                               PUTF("    Vendor/Model ID: %s [%06x]",
-                                    ud->vendor_name ?: "Unknown", ud->vendor_id);
+                               PUTF("%s [%06x]", ud->vendor_name ?: "Unknown",
+                                    ud->vendor_id);
                                printed = 1;
                        }
                        if (ud->flags & UNIT_DIRECTORY_MODEL_ID) {
-                               if (!printed)
-                                       PUTF("    Vendor/Model ID: %s [%06x]",
-                                            ne->vendor_name ?: "Unknown", ne->vendor_id);
+                               if (!printed) {
+                                       PUTF("%s [%06x]", ne->vendor_name ?: "Unknown",
+                                            ne->vendor_id);
+                               }
                                PUTF(" / %s [%06x]", ud->model_name ?: "Unknown", ud->model_id);
                                printed = 1;
                        }
@@ -152,11 +186,11 @@ static int raw1394_read_proc(char *page, char **start, off_t off,
                                PUTF("\n");
 
                        if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID)
-                               PUTF("    Software Specifier ID: %06x\n", ud->specifier_id);
+                               PUTF("    Software Spec ID : %06x\n", ud->specifier_id);
                        if (ud->flags & UNIT_DIRECTORY_VERSION)
-                               PUTF("    Software Version: %06x\n", ud->version);
+                               PUTF("    Software Version : %06x\n", ud->version);
                        if (ud->driver)
-                               PUTF("    Driver: %s\n", ud->driver->name);
+                               PUTF("    Driver           : %s\n", ud->driver->name);
                        PUTF("    Length (in quads): %d\n", ud->count);
                }
 
@@ -297,6 +331,7 @@ static struct node_entry *nodemgr_scan_root_directory
                code = CONFIG_ROM_KEY(quad);
 
                if (code == CONFIG_ROM_VENDOR_ID && length > 0) {
+
                        /* Check if there is a text descriptor leaf
                           immediately after this.  */
                        size = nodemgr_size_text_leaf(host, nodeid, generation,
@@ -305,22 +340,23 @@ static struct node_entry *nodemgr_scan_root_directory
                                address += 4;
                                length--;
                                total_size += (size + 1) * sizeof (quadlet_t);
-                       }
-                       else if (size < 0)
+                       } else if (size < 0)
                                return NULL;
                }
        }
-       ne = kmalloc(total_size, SLAB_ATOMIC);
-       if (ne != NULL) {
-               if (size != 0) {
-                       ne->vendor_name
-                               = (const char *) &(ne->quadlets[2]);
-                       ne->quadlets[size] = 0;
-               }
-               else {
-                       ne->vendor_name = NULL;
-               }
+       ne = kmalloc(total_size, GFP_KERNEL);
+
+       if (!ne)
+               return NULL;
+
+       if (size != 0) {
+               ne->vendor_name
+                       = (const char *) &(ne->quadlets[2]);
+               ne->quadlets[size] = 0;
+       } else {
+               ne->vendor_name = NULL;
        }
+
        return ne; 
 }
 
@@ -335,6 +371,9 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, quadlet_t busoption
 
         INIT_LIST_HEAD(&ne->list);
        INIT_LIST_HEAD(&ne->unit_directories);
+
+       ne->tpool = &host->tpool[nodeid & NODE_MASK];
+
         ne->host = host;
         ne->nodeid = nodeid;
         ne->guid = guid;
@@ -344,9 +383,10 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, quadlet_t busoption
 
        nodemgr_process_config_rom (ne, busoptions);
 
-       HPSB_DEBUG("%s added: Node[" NODE_BUS_FMT "]  GUID[%016Lx]  [%s]",
-                  (host->node_id == nodeid) ? "Host" : "Device",
+       HPSB_DEBUG("%s added: ID:BUS[" NODE_BUS_FMT "]  GUID[%016Lx]  [%s] (%s)",
+                  (host->node_id == nodeid) ? "Host" : "Node",
                   NODE_BUS_ARGS(nodeid), (unsigned long long)guid,
+                  ne->oui_name,
                   ne->vendor_name ?: "Unknown");
 
         return ne;
@@ -648,6 +688,11 @@ static void nodemgr_process_root_directory(struct node_entry *ne)
                switch (code) {
                case CONFIG_ROM_VENDOR_ID:
                        ne->vendor_id = value;
+#ifdef CONFIG_IEEE1394_OUI_DB
+                       ne->oui_name = nodemgr_find_oui_name(value);
+#else
+                       ne->oui_name = "Unknown";
+#endif
                        /* Now check if there is a vendor name text
                           string.  */
                        if (ne->vendor_name != NULL) {
@@ -1211,6 +1256,18 @@ struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid)
        return ne;
 }
 
+struct node_entry *hpsb_check_nodeid(nodeid_t nodeid)
+{
+       struct node_entry *ne;
+
+       if (down_trylock(&nodemgr_serialize))
+               return NULL;
+       ne = find_entry_by_nodeid(nodeid);
+       up(&nodemgr_serialize);
+
+       return ne;
+}
+
 /* The following four convenience functions use a struct node_entry
  * for addressing a node on the bus.  They are intended for use by any
  * process context, not just the nodemgr thread, so we need to be a
@@ -1266,9 +1323,11 @@ int hpsb_node_lock(struct node_entry *ne, u64 addr,
 
 static void nodemgr_add_host(struct hpsb_host *host)
 {
-       struct host_info *hi = kmalloc (sizeof (struct host_info), GFP_KERNEL);
+       struct host_info *hi;
        unsigned long flags;
 
+       hi = kmalloc(sizeof (struct host_info), in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
+
        if (!hi) {
                HPSB_ERR ("NodeMgr: out of memory in add host");
                return;
index 5ebdaa05d156ba2c4f0128dac2153cc6e271f96d..64210b048116fe298531fa9a061348efe8146ebb 100644 (file)
@@ -132,7 +132,11 @@ struct node_entry {
        u32 capabilities;       
        struct list_head unit_directories;
 
+       struct hpsb_tlabel_pool *tpool;
+
        const char *vendor_name;
+       char *oui_name;
+
        quadlet_t quadlets[0];
 };
 
@@ -152,6 +156,10 @@ struct node_entry *hpsb_guid_get_entry(u64 guid);
  * fool-proof by itself, since the nodeid can change.  */
 struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid);
 
+/* Same as above except that it will not block waiting for the nodemgr
+ * serialize semaphore.  */
+struct node_entry *hpsb_check_nodeid(nodeid_t nodeid);
+
 /*
  * If the entry refers to a local host, this function will return the pointer
  * to the hpsb_host structure.  It will return NULL otherwise.  Once you have
index 7f089d750b58d2af0865f0220b1b88bc088f9d0f..04c2743ad4d7d85d9055fe15d07759e40a814689 100644 (file)
@@ -38,6 +38,7 @@
  *
  * Known bugs:
  * . devctl BUS_RESET arg confusion (reset type or root holdoff?)
+ *   added LONG_RESET_ROOT and SHORT_RESET_ROOT for root holdoff --kk
  */
 
 /* 
  *  . Updated to 2.4.x module scheme (PCI aswell)
  *  . Removed procfs support since it trashes random mem
  *  . Config ROM generation
+ *
+ * Manfred Weihs <weihs@ict.tuwien.ac.at>
+ *  . Reworked code for initiating bus resets
+ *    (long, short, with or without hold-off)
  */
 
 #include <linux/config.h>
 #include "ieee1394.h"
 #include "ieee1394_types.h"
 #include "hosts.h"
+#include "dma.h"
+#include "iso.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"
 #include "ohci1394.h"
@@ -153,13 +160,9 @@ printk(level "%s: " fmt "\n" , OHCI1394_DRIVER_NAME , ## args)
 printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
 
 static char version[] __devinitdata =
-       "$Rev: 601 $ Ben Collins <bcollins@debian.org>";
+       "$Rev: 675 $ Ben Collins <bcollins@debian.org>";
 
 /* Module Parameters */
-MODULE_PARM(attempt_root,"i");
-MODULE_PARM_DESC(attempt_root, "Attempt to make the host root (default = 0).");
-static int attempt_root = 0;
-
 MODULE_PARM(phys_dma,"i");
 MODULE_PARM_DESC(phys_dma, "Enable physical dma (default = 1).");
 static int phys_dma = 1;
@@ -170,12 +173,6 @@ static void dma_trm_reset(struct dma_trm_ctx *d);
 static void ohci1394_pci_remove(struct pci_dev *pdev);
 
 #ifndef __LITTLE_ENDIAN
-/* Swap a series of quads inplace. */
-static __inline__ void block_swab32(quadlet_t *data, size_t size) {
-       while (size--)
-               data[size] = swab32(data[size]);
-}
-
 static unsigned hdr_sizes[] = 
 {
        3,      /* TCODE_WRITEQ */
@@ -193,16 +190,19 @@ static unsigned hdr_sizes[] =
 };
 
 /* Swap headers */
-static inline void packet_swab(quadlet_t *data, int tcode, int len)
+static inline void packet_swab(quadlet_t *data, int tcode)
 {
+       size_t size = hdr_sizes[tcode];
+
        if (tcode > TCODE_LOCK_RESPONSE || hdr_sizes[tcode] == 0)
                return;
-       block_swab32(data, hdr_sizes[tcode]);
+
+       while (size--)
+               data[size] = swab32(data[size]);
 }
 #else
 /* Don't waste cycles on same sex byte swaps */
-#define packet_swab(w,x,y)
-#define block_swab32(x,y)
+#define packet_swab(w,x)
 #endif /* !LITTLE_ENDIAN */
 
 /***********************************
@@ -339,8 +339,6 @@ static void handle_selfid(struct ti_ohci *ohci, struct hpsb_host *host,
 
        DBGMSG(ohci->id, "SelfID complete");
 
-       hpsb_selfid_complete(host, phyid, isroot);
-
        return;
 }
 
@@ -398,7 +396,7 @@ static void initialize_dma_rcv_ctx(struct dma_rcv_ctx *d, int generate_irq)
                c = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | DMA_CTL_BRANCH;
                if (generate_irq)
                        c |= DMA_CTL_IRQ;
-                               
+
                d->prg_cpu[i]->control = cpu_to_le32(c | d->buf_size);
 
                /* End of descriptor list? */
@@ -573,7 +571,8 @@ static void ohci_initialize(struct ti_ohci *ohci)
        reg_write(ohci, OHCI1394_HCControlClear, 0x40000000);
 
        /* Enable interrupts */
-       reg_write(ohci, OHCI1394_IntMaskSet, 
+       reg_write(ohci, OHCI1394_IntMaskSet,
+                 OHCI1394_unrecoverableError |
                  OHCI1394_masterIntEnable | 
                  OHCI1394_busReset | 
                  OHCI1394_selfIDComplete |
@@ -646,8 +645,7 @@ static void insert_packet(struct ti_ohci *ohci,
                                 (packet->header[0] & 0xFFFF0000);
                         d->prg_cpu[idx]->data[2] = packet->header[2];
                         d->prg_cpu[idx]->data[3] = packet->header[3];
-                       packet_swab(d->prg_cpu[idx]->data, packet->tcode,
-                                       packet->header_size>>2);
+                       packet_swab(d->prg_cpu[idx]->data, packet->tcode);
                 }
 
                 if (packet->data_size) { /* block transmit */
@@ -712,7 +710,7 @@ static void insert_packet(struct ti_ohci *ohci,
                 d->prg_cpu[idx]->data[0] = packet->speed_code<<16 |
                         (packet->header[0] & 0xFFFF);
                 d->prg_cpu[idx]->data[1] = packet->header[0] & 0xFFFF0000;
-               packet_swab(d->prg_cpu[idx]->data, packet->tcode, packet->header_size>>2);
+               packet_swab(d->prg_cpu[idx]->data, packet->tcode);
   
                 d->prg_cpu[idx]->begin.control = 
                        cpu_to_le32(DMA_CTL_OUTPUT_MORE | 
@@ -844,12 +842,57 @@ static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
        struct ti_ohci *ohci = host->hostdata;
        int retval = 0;
        unsigned long flags;
+       int phy_reg;
 
        switch (cmd) {
        case RESET_BUS:
-               DBGMSG(ohci->id, "devctl: Bus reset requested%s",
-                      attempt_root ? " and attempting to become root" : "");
-               set_phy_reg_mask (ohci, 1, 0x40 | (attempt_root ? 0x80 : 0));
+               switch (arg) {
+               case SHORT_RESET:
+                       phy_reg = get_phy_reg(ohci, 5);
+                       phy_reg |= 0x40;
+                       set_phy_reg(ohci, 5, phy_reg); /* set ISBR */
+                       break;
+               case LONG_RESET:
+                       phy_reg = get_phy_reg(ohci, 1);
+                       phy_reg |= 0x40;
+                       set_phy_reg(ohci, 1, phy_reg); /* set IBR */
+                       break;
+               case SHORT_RESET_NO_FORCE_ROOT:
+                       phy_reg = get_phy_reg(ohci, 1);
+                       if (phy_reg & 0x80) {
+                               phy_reg &= ~0x80;
+                               set_phy_reg(ohci, 1, phy_reg); /* clear RHB */
+                       }
+
+                       phy_reg = get_phy_reg(ohci, 5);
+                       phy_reg |= 0x40;
+                       set_phy_reg(ohci, 5, phy_reg); /* set ISBR */
+                       break;
+               case LONG_RESET_NO_FORCE_ROOT:
+                       phy_reg = get_phy_reg(ohci, 1);
+                       phy_reg &= ~0x80;
+                       phy_reg |= 0x40;
+                       set_phy_reg(ohci, 1, phy_reg); /* clear RHB, set IBR */
+                       break;
+               case SHORT_RESET_FORCE_ROOT:
+                       phy_reg = get_phy_reg(ohci, 1);
+                       if (!(phy_reg & 0x80)) {
+                               phy_reg |= 0x80;
+                               set_phy_reg(ohci, 1, phy_reg); /* set RHB */
+                       }
+
+                       phy_reg = get_phy_reg(ohci, 5);
+                       phy_reg |= 0x40;
+                       set_phy_reg(ohci, 5, phy_reg); /* set ISBR */
+                       break;
+               case LONG_RESET_FORCE_ROOT:
+                       phy_reg = get_phy_reg(ohci, 1);
+                       phy_reg |= 0xc0;
+                       set_phy_reg(ohci, 1, phy_reg); /* set RHB and IBR */
+                       break;
+               default:
+                       retval = -1;
+               }
                break;
 
        case GET_CYCLE_COUNTER:
@@ -977,6 +1020,705 @@ static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
        return retval;
 }
 
+/***********************************
+ * rawiso ISO reception            *
+ ***********************************/
+
+struct ohci_iso_recv {
+       struct ti_ohci *ohci;
+
+       /* memory and PCI mapping for the DMA descriptors */
+       struct dma_prog_region prog;
+       
+       struct ohci1394_iso_tasklet task;
+       int task_active;
+
+       /* index of next packet to arrive */
+       int pkt_dma;
+       
+       u32 ContextControlSet;
+       u32 ContextControlClear;
+       u32 CommandPtr;
+       u32 ContextMatch;
+};
+
+static void ohci_iso_recv_task(unsigned long data);
+static void ohci_iso_recv_stop(struct hpsb_iso *iso);
+static void ohci_iso_recv_shutdown(struct hpsb_iso *iso);
+static void ohci_iso_recv_program(struct hpsb_iso *iso);
+static int  ohci_iso_recv_start(struct hpsb_iso *iso, int cycle);
+
+
+static int ohci_iso_recv_init(struct hpsb_iso *iso)
+{
+       struct ohci_iso_recv *recv;
+       unsigned int prog_size;
+       int ctx;
+       int ret = -ENOMEM;
+       
+       recv = kmalloc(sizeof(*recv), SLAB_KERNEL);
+       if(!recv)
+               return -ENOMEM;
+
+       iso->hostdata = recv;
+       recv->ohci = iso->host->hostdata;
+       recv->task_active = 0;
+       recv->pkt_dma = iso->first_packet;
+       
+       dma_prog_region_init(&recv->prog);
+
+       /* size of DMA program = one INPUT_LAST per packet in the buffer */
+       prog_size = sizeof(struct dma_cmd) * iso->buf_packets;
+       
+       if(dma_prog_region_alloc(&recv->prog, prog_size, recv->ohci->dev))
+               goto err;
+
+       ohci1394_init_iso_tasklet(&recv->task, OHCI_ISO_RECEIVE,
+                                 ohci_iso_recv_task, (unsigned long) iso);
+       
+       if(ohci1394_register_iso_tasklet(recv->ohci, &recv->task) < 0)
+               goto err;
+       
+       recv->task_active = 1;
+
+       /* recv context registers are spaced 32 bytes apart */
+       ctx = recv->task.context;
+       recv->ContextControlSet = OHCI1394_IsoRcvContextControlSet + 32 * ctx;
+       recv->ContextControlClear = OHCI1394_IsoRcvContextControlClear + 32 * ctx;
+       recv->CommandPtr = OHCI1394_IsoRcvCommandPtr + 32 * ctx;
+       recv->ContextMatch = OHCI1394_IsoRcvContextMatch + 32 * ctx;
+
+       /* enable interrupts */
+       reg_write(recv->ohci, OHCI1394_IsoRecvIntMaskSet, 1 << ctx);
+
+       /* write the DMA program */
+       ohci_iso_recv_program(iso);
+       
+       return 0;
+
+err:
+       ohci_iso_recv_shutdown(iso);
+       return ret;
+}
+
+static void ohci_iso_recv_stop(struct hpsb_iso *iso)
+{
+       struct ohci_iso_recv *recv = iso->hostdata;
+       
+       /* halt DMA */
+       ohci1394_stop_context(recv->ohci, recv->ContextControlClear, NULL);
+}
+
+static void ohci_iso_recv_shutdown(struct hpsb_iso *iso)
+{
+       struct ohci_iso_recv *recv = iso->hostdata;
+
+       if(recv->task_active) {
+               /* halt DMA */
+               ohci1394_stop_context(recv->ohci, recv->ContextControlClear, NULL);
+               
+               /* disable interrupts */
+               reg_write(recv->ohci, OHCI1394_IsoRecvIntMaskClear, 1 << recv->task.context);
+               
+               ohci1394_unregister_iso_tasklet(recv->ohci, &recv->task);
+               recv->task_active = 0;
+       }
+       
+       dma_prog_region_free(&recv->prog);
+       kfree(recv);
+       iso->hostdata = NULL;
+}
+
+static void ohci_iso_recv_program(struct hpsb_iso *iso)
+{
+       struct ohci_iso_recv *recv = iso->hostdata;
+       
+       /* address of 'branch' field in previous DMA descriptor */
+       u32 *prev_branch = NULL;
+
+       /* start at pkt_dma and go around the whole buffer */
+       int pkt = recv->pkt_dma;
+       int i;
+       
+       for(i = 0; i < iso->buf_packets; i++) {
+               int want_interrupt;
+               unsigned int data_size;
+               
+               /* pointer to the DMA descriptor */
+               struct dma_cmd *il = ((struct dma_cmd*) recv->prog.kvirt) + pkt;
+
+               /* offset of the DMA descriptor relative to the DMA prog buffer */
+               unsigned long prog_offset = pkt * sizeof(struct dma_cmd);
+
+               /* offset of this bus_cycle within the DMA buffer */
+               unsigned long buf_offset = hpsb_iso_packet_data(iso, pkt) - iso->buf.kvirt;
+
+               /* back up 8 bytes for the iso header */
+               buf_offset -= 8;
+               data_size = iso->max_packet_size + 8;
+
+               /* ask for an interrupt every now and then, and
+                  always interrupt on the final descriptor */
+               
+               if( ((i % iso->irq_interval) == 0) ||
+                   (i == (iso->buf_packets - 1)) ) {
+                       want_interrupt = 1;
+               } else {
+                       want_interrupt = 0;
+               }
+               
+               /* write the DMA descriptor */
+               
+               il->control = 3 << 28; /* INPUT_LAST */
+               il->control |= 8 << 24; /* s = 1, update xferStatus and resCount */
+               if(want_interrupt)
+                       il->control |= 3 << 20;
+               il->control |= 0xC << 16; /* enable branch to address */
+               il->control |= data_size;
+
+               il->address = dma_region_offset_to_bus(&iso->buf, buf_offset);
+               il->branchAddress = 0; /* filled in on next loop */
+               il->status = data_size;
+
+               /* link the previous descriptor to this one */
+               if(prev_branch) {
+                       *prev_branch = dma_prog_region_offset_to_bus(&recv->prog, prog_offset);
+                       *prev_branch |= 1; /* set Z=1 */
+               }
+
+               prev_branch = &il->branchAddress;
+
+               pkt = (pkt + 1) % iso->buf_packets;
+       }
+
+       /* the final descriptor's branch address and Z should be left at 0 */
+}
+
+static int ohci_iso_recv_start(struct hpsb_iso *iso, int cycle)
+{
+       struct ohci_iso_recv *recv = iso->hostdata;
+       u32 command, contextMatch;
+       
+       reg_write(recv->ohci, recv->ContextControlClear, 0xFFFFFFFF);
+       wmb();
+
+       /* use packet-per-buffer mode, and keep ISO headers */
+       reg_write(recv->ohci, recv->ContextControlSet, (1 << 30));
+
+       /* match on all tags, listen on channel */
+       contextMatch = 0xF0000000 | iso->channel;
+       
+       if(cycle != -1) {
+               u32 seconds;
+               
+               /* enable cycleMatch */
+               reg_write(recv->ohci, recv->ContextControlSet, (1 << 29));
+
+               /* set starting cycle */
+               cycle &= 0x1FFF;
+               
+               /* 'cycle' is only mod 8000, but we also need two 'seconds' bits -
+                  just snarf them from the current time */
+               seconds = reg_read(recv->ohci, OHCI1394_IsochronousCycleTimer) >> 25;
+
+               /* advance one second to give some extra time for DMA to start */
+               seconds += 1;
+               
+               cycle |= (seconds & 3) << 13;
+
+               contextMatch |= cycle << 12;
+       }
+
+       reg_write(recv->ohci, recv->ContextMatch, contextMatch);
+       
+       /* address of first descriptor block */
+       command = dma_prog_region_offset_to_bus(&recv->prog, recv->pkt_dma * sizeof(struct dma_cmd));
+       command |= 1; /* Z=1 */
+       
+       reg_write(recv->ohci, recv->CommandPtr, command);
+       wmb();
+       
+       /* run */
+       reg_write(recv->ohci, recv->ContextControlSet, 0x8000);
+
+       /* issue a dummy read of the cycle timer register to force
+          all PCI writes to be posted immediately */
+       mb();
+       reg_read(recv->ohci, OHCI1394_IsochronousCycleTimer);
+
+       /* check RUN */
+       if(!(reg_read(recv->ohci, recv->ContextControlSet) & 0x8000)) {
+               PRINT(KERN_ERR, recv->ohci->id, "Error starting IR DMA (ContextControl 0x%08x)\n",
+                     reg_read(recv->ohci, recv->ContextControlSet));
+               return -1;
+       }
+
+       return 0;
+}
+
+static void ohci_iso_recv_release_one(struct hpsb_iso *iso)
+{
+       struct ohci_iso_recv *recv = iso->hostdata;
+
+       /* re-use the DMA descriptor for first_packet */
+       /* by linking the previous descriptor to it */
+
+       int next_i = iso->first_packet;
+       int prev_i = (next_i == 0) ? (iso->buf_packets - 1) : (next_i - 1);
+       
+       struct dma_cmd *next = dma_region_i(&recv->prog, struct dma_cmd, next_i);
+       struct dma_cmd *prev = dma_region_i(&recv->prog, struct dma_cmd, prev_i);
+
+       /* 'next' becomes the new end of the DMA chain */
+       next->control |= 3 << 20; /* enable interrupt */
+       next->branchAddress = 0; /* disable branch */
+
+       /* link prev to next */ 
+       if(prev_i % iso->irq_interval) {
+               prev->control &= ~(3 << 20); /* no interrupt */
+       } else {
+               prev->control |= 3 << 20; /* enable interrupt */
+       }
+       prev->branchAddress = dma_prog_region_offset_to_bus(&recv->prog,
+                                                           sizeof(struct dma_cmd) * next_i) | 1;
+       wmb();
+       
+       /* wake up DMA in case it fell asleep */
+       reg_write(recv->ohci, recv->ContextControlSet, (1 << 12));
+
+       /* advance packet cursors */
+       iso->first_packet = (iso->first_packet+1) % iso->buf_packets;
+       atomic_inc(&iso->n_dma_packets);
+}
+
+static void ohci_iso_recv_release(struct hpsb_iso *iso, int n_packets)
+{
+       int i;
+       for(i = 0; i < n_packets; i++)
+               ohci_iso_recv_release_one(iso);
+}
+
+static void ohci_iso_recv_task(unsigned long data)
+{
+       struct hpsb_iso *iso = (struct hpsb_iso*) data;
+       struct ohci_iso_recv *recv = iso->hostdata;
+
+       int count;
+       int wake = 0;
+       
+       /* loop over the entire buffer */
+       for(count = 0; count < iso->buf_packets; count++) {
+               u32 packet_len = 0;
+               
+               /* pointer to the DMA descriptor */
+               struct dma_cmd *il = ((struct dma_cmd*) recv->prog.kvirt) + recv->pkt_dma;
+
+               /* check the DMA descriptor for new writes to xferStatus */
+               u16 xferstatus = il->status >> 16;
+               u16 rescount = il->status & 0xFFFF;
+
+               unsigned char event = xferstatus & 0x1F;
+
+               if(!event) {
+                       /* this packet hasn't come in yet; we are done for now */
+                       goto out;
+               }
+               
+               if(event == 0x11) {
+                       /* packet received successfully! */
+                       
+                       /* rescount is the number of bytes *remaining* in the packet buffer,
+                          after the packet was written */
+                       packet_len = iso->max_packet_size - rescount;
+
+               } else if(event == 0x02) {
+                       PRINT(KERN_ERR, recv->ohci->id, "IR DMA error - packet too long for buffer\n");
+               } else if(event) {
+                       PRINT(KERN_ERR, recv->ohci->id, "IR DMA error - OHCI error code 0x%02x\n", event);
+               }
+
+               /* sync our view of the buffer */
+               dma_region_sync(&iso->buf, recv->pkt_dma * iso->buf_stride, iso->buf_stride);
+                       
+               /* record the per-packet info */
+               {
+                       /* iso header is 8 bytes ahead of the data payload */
+                       unsigned char *hdr = hpsb_iso_packet_data(iso, recv->pkt_dma) - 8;
+                       
+                       struct hpsb_iso_packet_info *info = hpsb_iso_packet_info(iso, recv->pkt_dma);
+                       
+                       info->len = packet_len;
+                       info->cycle = (hdr[0] | (hdr[1] << 8)) & 0x1FFF;
+                       info->channel = hdr[5] & 0x3F;
+                       info->tag = hdr[5] >> 6;
+                       info->sy = hdr[4] & 0xF;
+               }
+               
+               /* at least one packet came in, so wake up the reader */
+               wake = 1;
+
+               /* reset the DMA descriptor */
+               il->status = iso->max_packet_size;
+
+               /* advance DMA packet cursor */
+               recv->pkt_dma = (recv->pkt_dma + 1) % iso->buf_packets;
+
+               /* one more packet for the user, one less for us */
+               if(atomic_dec_and_test(&iso->n_dma_packets)) {
+                       /* if n_dma_packets reaches zero, we have an overflow */
+                       atomic_inc(&iso->overflows);
+               }
+       }
+
+out:
+       if(wake && iso->callback) {
+               iso->callback(iso);
+       }
+}
+
+
+/***********************************
+ * rawiso ISO transmission         *
+ ***********************************/
+
+struct ohci_iso_xmit {
+       struct ti_ohci *ohci;
+       struct dma_prog_region prog;
+       struct ohci1394_iso_tasklet task;
+       int task_active;
+       int pkt_dma;
+
+       u32 ContextControlSet;
+       u32 ContextControlClear;
+       u32 CommandPtr;
+};
+
+/* transmission DMA program:
+   one OUTPUT_MORE_IMMEDIATE for the IT header
+   one OUTPUT_LAST for the buffer data */
+
+struct iso_xmit_cmd {
+       struct dma_cmd output_more_immediate;
+       u8 iso_hdr[8];
+       u32 unused[2];
+       struct dma_cmd output_last;
+};
+
+static int ohci_iso_xmit_init(struct hpsb_iso *iso);
+static int ohci_iso_xmit_start(struct hpsb_iso *iso, int cycle);
+static void ohci_iso_xmit_shutdown(struct hpsb_iso *iso);
+static void ohci_iso_xmit_task(unsigned long data);
+
+static int ohci_iso_xmit_init(struct hpsb_iso *iso)
+{
+       struct ohci_iso_xmit *xmit;
+       unsigned int prog_size;
+       int ctx;
+       int ret = -ENOMEM;
+       
+       xmit = kmalloc(sizeof(*xmit), SLAB_KERNEL);
+       if(!xmit)
+               return -ENOMEM;
+
+       iso->hostdata = xmit;
+       xmit->ohci = iso->host->hostdata;
+       xmit->task_active = 0;
+       xmit->pkt_dma = iso->first_packet;
+       
+       dma_prog_region_init(&xmit->prog);
+       
+       prog_size = sizeof(struct iso_xmit_cmd) * iso->buf_packets;
+       
+       if(dma_prog_region_alloc(&xmit->prog, prog_size, xmit->ohci->dev))
+               goto err;
+
+       ohci1394_init_iso_tasklet(&xmit->task, OHCI_ISO_TRANSMIT,
+                                 ohci_iso_xmit_task, (unsigned long) iso);
+       
+       if(ohci1394_register_iso_tasklet(xmit->ohci, &xmit->task) < 0)
+               goto err;
+       
+       xmit->task_active = 1;
+
+       /* xmit context registers are spaced 16 bytes apart */
+       ctx = xmit->task.context;
+       xmit->ContextControlSet = OHCI1394_IsoXmitContextControlSet + 16 * ctx;
+       xmit->ContextControlClear = OHCI1394_IsoXmitContextControlClear + 16 * ctx;
+       xmit->CommandPtr = OHCI1394_IsoXmitCommandPtr + 16 * ctx;
+
+       reg_write(xmit->ohci, xmit->ContextControlClear, 0xFFFFFFFF);
+       
+       /* enable interrupts */
+       reg_write(xmit->ohci, OHCI1394_IsoXmitIntMaskSet, 1 << ctx);
+
+       return 0;
+
+err:
+       ohci_iso_xmit_shutdown(iso);
+       return ret;
+}
+
+static void ohci_iso_xmit_stop(struct hpsb_iso *iso)
+{
+       struct ohci_iso_xmit *xmit = iso->hostdata;
+       ohci1394_stop_context(xmit->ohci, xmit->ContextControlClear, NULL);
+}
+
+static void ohci_iso_xmit_shutdown(struct hpsb_iso *iso)
+{
+       struct ohci_iso_xmit *xmit = iso->hostdata;
+
+       if(xmit->task_active) {
+               /* halt DMA */
+               ohci1394_stop_context(xmit->ohci, xmit->ContextControlClear, NULL);
+               
+               /* disable interrupts */
+               reg_write(xmit->ohci, OHCI1394_IsoXmitIntMaskClear, 1 << xmit->task.context);
+               
+               ohci1394_unregister_iso_tasklet(xmit->ohci, &xmit->task);
+               xmit->task_active = 0;
+       }
+       
+       dma_prog_region_free(&xmit->prog);
+       kfree(xmit);
+       iso->hostdata = NULL;
+}
+
+static void ohci_iso_xmit_task(unsigned long data)
+{
+       struct hpsb_iso *iso = (struct hpsb_iso*) data;
+       struct ohci_iso_xmit *xmit = iso->hostdata;
+       int wake = 0;
+       int count;
+
+       /* check the whole buffer if necessary, starting at pkt_dma */
+       for(count = 0; count < iso->buf_packets; count++) {
+               
+               /* DMA descriptor */
+               struct iso_xmit_cmd *cmd = dma_region_i(&xmit->prog, struct iso_xmit_cmd, xmit->pkt_dma);
+               
+               /* check for new writes to xferStatus */
+               u16 xferstatus = cmd->output_last.status >> 16;
+               u8  event = xferstatus & 0x1F;
+
+               if(!event) {
+                       /* packet hasn't been sent yet; we are done for now */
+                       goto out;
+               }
+
+               if(event != 0x11) {
+                       PRINT(KERN_ERR, xmit->ohci->id, "IT DMA error - OHCI error code 0x%02x\n", event);
+               }
+               
+               /* at least one packet went out, so wake up the writer */
+               wake = 1;
+               
+               /* predict the timestamp pkt_dma will have next time around the buffer */
+               {
+                       struct hpsb_iso_packet_info* info = hpsb_iso_packet_info(iso, xmit->pkt_dma);
+                       unsigned int cycle = cmd->output_last.status & 0x1FFF;
+
+                       cycle += iso->buf_packets;
+                       while(cycle > 8000)
+                               cycle -= 8000;
+                       
+                       info->cycle = cycle;
+               }
+               
+               /* reset the DMA descriptor for next time */
+               cmd->output_last.status = 0;
+               
+               /* advance packet cursor */
+               xmit->pkt_dma = (xmit->pkt_dma + 1) % iso->buf_packets;
+
+               /* one less packet for us */
+               if(atomic_dec_and_test(&iso->n_dma_packets)) {
+                       /* underflow */
+                       atomic_inc(&iso->overflows);
+               }
+       }
+
+out:
+       if(wake && iso->callback) {
+               iso->callback(iso);
+       }
+}
+
+static void ohci_iso_xmit_queue_one(struct hpsb_iso *iso)
+{
+       struct ohci_iso_xmit *xmit = iso->hostdata;
+       struct hpsb_iso_packet_info *info;
+       int next_i, prev_i;
+       struct iso_xmit_cmd *next, *prev;
+       
+       /* sync up the card's view of the buffer */
+       dma_region_sync(&iso->buf, iso->first_packet * iso->buf_stride, iso->buf_stride);
+
+       /* append first_packet to the DMA chain */
+       /* by linking the previous descriptor to it */
+       /* (next will become the new end of the DMA chain) */
+       
+       next_i = iso->first_packet;
+       prev_i = (next_i == 0) ? (iso->buf_packets - 1) : (next_i - 1);
+       
+       next = dma_region_i(&xmit->prog, struct iso_xmit_cmd, next_i);
+       prev = dma_region_i(&xmit->prog, struct iso_xmit_cmd, prev_i);
+
+       /* retrieve the packet info stashed in the buffer */
+       info = hpsb_iso_packet_info(iso, iso->first_packet);
+       
+       /* set up the OUTPUT_MORE_IMMEDIATE descriptor */
+       memset(next, 0, sizeof(struct iso_xmit_cmd));
+       next->output_more_immediate.control = 0x02000008;
+
+       /* ISO packet header is embedded in the OUTPUT_MORE_IMMEDIATE */
+
+       /* tcode = 0xA, and sy */
+       next->iso_hdr[0] = 0xA0 | (info->sy & 0xF);
+
+       /* tag and channel number */
+       next->iso_hdr[1] = (info->tag << 6) | (iso->channel & 0x3F);
+
+       /* transmission speed */
+       next->iso_hdr[2] = iso->speed & 0x7;
+
+       /* payload size */
+       next->iso_hdr[6] = info->len & 0xFF;
+       next->iso_hdr[7] = info->len >> 8;
+
+       /* set up the OUTPUT_LAST */
+       next->output_last.control = 1 << 28;
+       next->output_last.control |= 1 << 27; /* update timeStamp */
+       next->output_last.control |= 3 << 20; /* want interrupt */
+       next->output_last.control |= 3 << 18; /* enable branch */
+       next->output_last.control |= info->len;
+
+       /* payload bus address */
+       next->output_last.address = dma_region_offset_to_bus(&iso->buf,
+                                     hpsb_iso_packet_data(iso, iso->first_packet) - iso->buf.kvirt);
+       
+       /* leave branchAddress at zero for now */
+
+       /* re-write the previous DMA descriptor to chain to this one */
+
+       /* set prev branch address to point to next (Z=3) */
+       prev->output_last.branchAddress =
+               dma_prog_region_offset_to_bus(&xmit->prog, sizeof(struct iso_xmit_cmd) * next_i) | 3;
+       
+       /* disable interrupt, unless required by the IRQ interval */
+       if(prev_i % iso->irq_interval) {
+               prev->output_last.control &= ~(3 << 20); /* no interrupt */
+       } else {
+               prev->output_last.control |= 3 << 20; /* enable interrupt */
+       }
+
+       wmb();
+
+       /* wake DMA in case it is sleeping */
+       reg_write(xmit->ohci, xmit->ContextControlSet, 1 << 12);
+
+       /* issue a dummy read of the cycle timer to force all PCI
+          writes to be posted immediately */
+       mb();
+       reg_read(xmit->ohci, OHCI1394_IsochronousCycleTimer);
+
+       /* increment cursors */
+       iso->first_packet = (iso->first_packet+1) % iso->buf_packets;
+       atomic_inc(&iso->n_dma_packets);
+}
+
+static void ohci_iso_xmit_queue(struct hpsb_iso *iso, int n_packets)
+{
+       int i;
+       for(i = 0; i < n_packets; i++)
+               ohci_iso_xmit_queue_one(iso);
+}
+
+static int ohci_iso_xmit_start(struct hpsb_iso *iso, int cycle)
+{
+       struct ohci_iso_xmit *xmit = iso->hostdata;
+
+       /* clear out the control register */
+       reg_write(xmit->ohci, xmit->ContextControlClear, 0xFFFFFFFF);
+       wmb();
+
+       /* address and length of first descriptor block (Z=3) */
+       reg_write(xmit->ohci, xmit->CommandPtr,
+                 dma_prog_region_offset_to_bus(&xmit->prog, xmit->pkt_dma * sizeof(struct iso_xmit_cmd)) | 3);
+
+       /* cycle match */
+       if(cycle != -1) {
+               u32 start = cycle & 0x1FFF;
+               
+               /* 'cycle' is only mod 8000, but we also need two 'seconds' bits -
+                  just snarf them from the current time */
+               u32 seconds = reg_read(xmit->ohci, OHCI1394_IsochronousCycleTimer) >> 25;
+
+               /* advance one second to give some extra time for DMA to start */
+               seconds += 1;
+               
+               start |= (seconds & 3) << 13;
+
+               reg_write(xmit->ohci, xmit->ContextControlSet, 0x80000000 | (start << 16));
+       }
+
+       /* run */
+       reg_write(xmit->ohci, xmit->ContextControlSet, 0x8000);
+       mb();
+       
+       /* wait 100 usec to give the card time to go active */
+       udelay(100);
+       
+       /* check the RUN bit */
+       if(!(reg_read(xmit->ohci, xmit->ContextControlSet) & 0x8000)) {
+               PRINT(KERN_ERR, xmit->ohci->id, "Error starting IT DMA (ContextControl 0x%08x)\n",
+                     reg_read(xmit->ohci, xmit->ContextControlSet));
+               return -1;
+       }
+       
+       return 0;
+}
+
+static int ohci_isoctl(struct hpsb_iso *iso, enum isoctl_cmd cmd, int arg)
+{
+       
+       switch(cmd) {
+       case XMIT_INIT:
+               return ohci_iso_xmit_init(iso);
+       case XMIT_START:
+               return ohci_iso_xmit_start(iso, arg);
+       case XMIT_STOP:
+               ohci_iso_xmit_stop(iso);
+               return 0;
+       case XMIT_QUEUE:
+               ohci_iso_xmit_queue(iso, arg);
+               return 0;
+       case XMIT_SHUTDOWN:
+               ohci_iso_xmit_shutdown(iso);
+               return 0;
+
+       case RECV_INIT:
+               return ohci_iso_recv_init(iso);
+       case RECV_START:
+               return ohci_iso_recv_start(iso, arg);
+       case RECV_STOP:
+               ohci_iso_recv_stop(iso);
+               return 0;
+       case RECV_RELEASE:
+               ohci_iso_recv_release(iso, arg);
+               return 0;
+       case RECV_SHUTDOWN:
+               ohci_iso_recv_shutdown(iso);
+               return 0;
+               
+       default:
+               PRINT_G(KERN_ERR, "ohci_isoctl cmd %d not implemented yet",
+                       cmd);
+               break;
+       }
+       return -EINVAL;
+}
+
 /***************************************
  * IEEE-1394 functionality section END *
  ***************************************/
@@ -1056,7 +1798,7 @@ static void ohci_irq_handler(int irq, void *dev_id,
        unsigned long flags;
 
        /* Read and clear the interrupt event register.  Don't clear
-        * the busReset event, though, this is done when we get the
+        * the busReset event, though. This is done when we get the
         * selfIDComplete interrupt. */
        spin_lock_irqsave(&ohci->event_lock, flags);
        event = reg_read(ohci, OHCI1394_IntEventClear);
@@ -1067,10 +1809,52 @@ static void ohci_irq_handler(int irq, void *dev_id,
 
        DBGMSG(ohci->id, "IntEvent: %08x", event);
 
-       /* Die right here an now */
        if (event & OHCI1394_unrecoverableError) {
-               PRINT(KERN_ERR, ohci->id, "Unrecoverable error, shutting down card!");
-               return;
+               int ctx;
+               PRINT(KERN_ERR, ohci->id, "Unrecoverable error!");
+
+               if (reg_read(ohci, OHCI1394_AsReqTrContextControlSet) & 0x800)
+                       PRINT(KERN_ERR, ohci->id, "Async Req Tx Context died: "
+                               "ctrl[%08x] cmdptr[%08x]",
+                               reg_read(ohci, OHCI1394_AsReqTrContextControlSet),
+                               reg_read(ohci, OHCI1394_AsReqTrCommandPtr));
+
+               if (reg_read(ohci, OHCI1394_AsRspTrContextControlSet) & 0x800)
+                       PRINT(KERN_ERR, ohci->id, "Async Rsp Tx Context died: "
+                               "ctrl[%08x] cmdptr[%08x]",
+                               reg_read(ohci, OHCI1394_AsRspTrContextControlSet),
+                               reg_read(ohci, OHCI1394_AsRspTrCommandPtr));
+
+               if (reg_read(ohci, OHCI1394_AsReqRcvContextControlSet) & 0x800)
+                       PRINT(KERN_ERR, ohci->id, "Async Req Rcv Context died: "
+                               "ctrl[%08x] cmdptr[%08x]",
+                               reg_read(ohci, OHCI1394_AsReqRcvContextControlSet),
+                               reg_read(ohci, OHCI1394_AsReqRcvCommandPtr));
+
+               if (reg_read(ohci, OHCI1394_AsRspRcvContextControlSet) & 0x800)
+                       PRINT(KERN_ERR, ohci->id, "Async Rsp Rcv Context died: "
+                               "ctrl[%08x] cmdptr[%08x]",
+                               reg_read(ohci, OHCI1394_AsRspRcvContextControlSet),
+                               reg_read(ohci, OHCI1394_AsRspRcvCommandPtr));
+
+               for (ctx = 0; ctx < ohci->nb_iso_xmit_ctx; ctx++) {
+                       if (reg_read(ohci, OHCI1394_IsoXmitContextControlSet + (16 * ctx)) & 0x800)
+                               PRINT(KERN_ERR, ohci->id, "Async Iso Xmit %d Context died: "
+                                       "ctrl[%08x] cmdptr[%08x]", ctx,
+                                       reg_read(ohci, OHCI1394_IsoXmitContextControlSet + (16 * ctx)),
+                                       reg_read(ohci, OHCI1394_IsoXmitCommandPtr + (16 * ctx)));
+               }
+
+               for (ctx = 0; ctx < ohci->nb_iso_rcv_ctx; ctx++) {
+                       if (reg_read(ohci, OHCI1394_IsoRcvContextControlSet + (32 * ctx)) & 0x800)
+                               PRINT(KERN_ERR, ohci->id, "Async Iso Recv %d Context died: "
+                                       "ctrl[%08x] cmdptr[%08x] match[%08x]", ctx,
+                                       reg_read(ohci, OHCI1394_IsoRcvContextControlSet + (32 * ctx)),
+                                       reg_read(ohci, OHCI1394_IsoRcvCommandPtr + (32 * ctx)),
+                                       reg_read(ohci, OHCI1394_IsoRcvContextMatch + (32 * ctx)));
+               }
+
+               event &= ~OHCI1394_unrecoverableError;
        }
 
        if (event & OHCI1394_cycleInconsistent) {
@@ -1099,9 +1883,7 @@ static void ohci_irq_handler(int irq, void *dev_id,
                }
                spin_unlock_irqrestore(&ohci->event_lock, flags);
                if (!host->in_bus_reset) {
-                       DBGMSG(ohci->id, "irq_handler: Bus reset requested%s",
-                             (attempt_root) ? " and attempting to become root"
-                              : "");
+                       DBGMSG(ohci->id, "irq_handler: Bus reset requested");
 
                        /* Subsystem call */
                        hpsb_bus_reset(ohci->host);
@@ -1173,74 +1955,61 @@ static void ohci_irq_handler(int irq, void *dev_id,
        }
        if (event & OHCI1394_selfIDComplete) {
                if (host->in_bus_reset) {
-                       node_id = reg_read(ohci, OHCI1394_NodeID); 
+                       node_id = reg_read(ohci, OHCI1394_NodeID);
 
-                       /* If our nodeid is not valid, give a msec delay
-                        * to let it settle in and try again.  */
                        if (!(node_id & 0x80000000)) {
-                               mdelay(1);
-                               node_id = reg_read(ohci, OHCI1394_NodeID);
+                               PRINT(KERN_ERR, ohci->id,
+                                     "SelfID received, but NodeID invalid "
+                                     "(probably new bus reset occured): %08X",
+                                     node_id);
+                               goto selfid_not_valid;
                        }
 
-                       if (node_id & 0x80000000) { /* NodeID valid */
-                               phyid =  node_id & 0x0000003f;
-                               isroot = (node_id & 0x40000000) != 0;
+                       phyid =  node_id & 0x0000003f;
+                       isroot = (node_id & 0x40000000) != 0;
+
+                       DBGMSG(ohci->id,
+                             "SelfID interrupt received "
+                             "(phyid %d, %s)", phyid, 
+                             (isroot ? "root" : "not root"));
+
+                       handle_selfid(ohci, host, phyid, isroot);
 
-                               DBGMSG(ohci->id,
-                                     "SelfID interrupt received "
-                                     "(phyid %d, %s)", phyid, 
-                                     (isroot ? "root" : "not root"));
+                       /* Clear the bus reset event and re-enable the
+                        * busReset interrupt.  */
+                       spin_lock_irqsave(&ohci->event_lock, flags);
+                       reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset);
+                       reg_write(ohci, OHCI1394_IntMaskSet, OHCI1394_busReset);
+                       spin_unlock_irqrestore(&ohci->event_lock, flags);
 
-                               handle_selfid(ohci, host, 
-                                             phyid, isroot);
+                       /* Accept Physical requests from all nodes. */
+                       reg_write(ohci,OHCI1394_AsReqFilterHiSet, 0xffffffff);
+                       reg_write(ohci,OHCI1394_AsReqFilterLoSet, 0xffffffff);
+
+                       /* Turn on phys dma reception.
+                        *
+                        * TODO: Enable some sort of filtering management.
+                        */
+                       if (phys_dma) {
+                               reg_write(ohci,OHCI1394_PhyReqFilterHiSet, 0xffffffff);
+                               reg_write(ohci,OHCI1394_PhyReqFilterLoSet, 0xffffffff);
+                               reg_write(ohci,OHCI1394_PhyUpperBound, 0xffff0000);
                        } else {
-                               PRINT(KERN_ERR, ohci->id, 
-                                     "SelfID interrupt received, but "
-                                     "NodeID is not valid: %08X",
-                                     node_id);
+                               reg_write(ohci,OHCI1394_PhyReqFilterHiSet, 0x00000000);
+                               reg_write(ohci,OHCI1394_PhyReqFilterLoSet, 0x00000000);
                        }
 
-                       /* Accept Physical requests from all nodes. */
-                       reg_write(ohci,OHCI1394_AsReqFilterHiSet, 
-                                 0xffffffff);
-                       reg_write(ohci,OHCI1394_AsReqFilterLoSet, 
-                                 0xffffffff);
+                       DBGMSG(ohci->id, "PhyReqFilter=%08x%08x\n",
+                              reg_read(ohci,OHCI1394_PhyReqFilterHiSet),
+                              reg_read(ohci,OHCI1394_PhyReqFilterLoSet));
+
+                       hpsb_selfid_complete(host, phyid, isroot);
                } else
                        PRINT(KERN_ERR, ohci->id, 
                              "SelfID received outside of bus reset sequence");
 
-               /* Finally, we clear the busReset event and reenable
-                * the busReset interrupt. */
-               spin_lock_irqsave(&ohci->event_lock, flags);
-               reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset);
-               reg_write(ohci, OHCI1394_IntMaskSet, OHCI1394_busReset); 
-               spin_unlock_irqrestore(&ohci->event_lock, flags);
-               event &= ~OHCI1394_selfIDComplete;      
-
-               /* Turn on phys dma reception. We should
-                * probably manage the filtering somehow, 
-                * instead of blindly turning it on.  */
-
-               /*
-                * CAUTION!
-                * Some chips (TI TSB43AB22) won't take a value in
-                * the PhyReqFilter register until after the IntEvent
-                * is cleared for bus reset, and even then a short
-                * delay is required.
-                */
-               if (phys_dma) {
-                       mdelay(1);
-                       reg_write(ohci,OHCI1394_PhyReqFilterHiSet,
-                                 0xffffffff);
-                       reg_write(ohci,OHCI1394_PhyReqFilterLoSet,
-                                 0xffffffff);
-                       reg_write(ohci,OHCI1394_PhyUpperBound,
-                                 0xffff0000);
-               }
-
-               DBGMSG(ohci->id, "PhyReqFilter=%08x%08x\n",
-                      reg_read(ohci,OHCI1394_PhyReqFilterHiSet),
-                      reg_read(ohci,OHCI1394_PhyReqFilterLoSet));
+               event &= ~OHCI1394_selfIDComplete;
+selfid_not_valid:
        }
 
        /* Make sure we handle everything, just in case we accidentally
@@ -1412,7 +2181,7 @@ static void dma_rcv_tasklet (unsigned long data)
                 * bus reset. We always ignore it.  */
                if (tcode != OHCI1394_TCODE_PHY) {
                        if (!ohci->no_swap_incoming)
-                               packet_swab(d->spb, tcode, (length - 4) >> 2);
+                               packet_swab(d->spb, tcode);
                        DBGMSG(ohci->id, "Packet received from node"
                                " %d ack=0x%02X spd=%d tcode=0x%X"
                                " length=%d ctx=%d tlabel=%d",
@@ -1560,11 +2329,11 @@ static void free_dma_rcv_ctx(struct dma_rcv_ctx *d)
        if (d->prg_cpu) {
                for (i=0; i<d->num_desc; i++) 
                        if (d->prg_cpu[i] && d->prg_bus[i]) {
-                               pci_free_consistent(
-                                       d->ohci->dev, sizeof(struct dma_cmd), 
-                                       d->prg_cpu[i], d->prg_bus[i]);
+                               pci_pool_free(d->prg_pool, d->prg_cpu[i], d->prg_bus[i]);
                                OHCI_DMA_FREE("consistent dma_rcv prg[%d]", i);
                        }
+               pci_pool_destroy(d->prg_pool);
+               OHCI_DMA_FREE("dma_rcv prg pool");
                kfree(d->prg_cpu);
                kfree(d->prg_bus);
        }
@@ -1624,6 +2393,10 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d,
                return -ENOMEM;
        }
 
+       d->prg_pool = hpsb_pci_pool_create("ohci1394 rcv prg", ohci->dev,
+                               sizeof(struct dma_cmd), 4, 0, SLAB_KERNEL);
+       OHCI_DMA_ALLOC("dma_rcv prg pool");
+
        for (i=0; i<d->num_desc; i++) {
                d->buf_cpu[i] = pci_alloc_consistent(ohci->dev, 
                                                     d->buf_size,
@@ -1639,11 +2412,8 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d,
                        return -ENOMEM;
                }
 
-               
-                d->prg_cpu[i] = pci_alloc_consistent(ohci->dev, 
-                                                    sizeof(struct dma_cmd),
-                                                    d->prg_bus+i);
-               OHCI_DMA_ALLOC("consistent dma_rcv prg[%d]", i);
+               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, SLAB_KERNEL, d->prg_bus+i);
+               OHCI_DMA_ALLOC("pool dma_rcv prg[%d]", i);
 
                 if (d->prg_cpu[i] != NULL) {
                         memset(d->prg_cpu[i], 0, sizeof(struct dma_cmd));
@@ -1692,11 +2462,11 @@ static void free_dma_trm_ctx(struct dma_trm_ctx *d)
        if (d->prg_cpu) {
                for (i=0; i<d->num_desc; i++) 
                        if (d->prg_cpu[i] && d->prg_bus[i]) {
-                               pci_free_consistent(
-                                       d->ohci->dev, sizeof(struct at_dma_prg), 
-                                       d->prg_cpu[i], d->prg_bus[i]);
-                               OHCI_DMA_FREE("consistent dma_trm prg[%d]", i);
+                               pci_pool_free(d->prg_pool, d->prg_cpu[i], d->prg_bus[i]);
+                               OHCI_DMA_FREE("pool dma_trm prg[%d]", i);
                        }
+               pci_pool_destroy(d->prg_pool);
+               OHCI_DMA_FREE("dma_trm prg pool");
                kfree(d->prg_cpu);
                kfree(d->prg_bus);
        }
@@ -1732,11 +2502,13 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d,
        memset(d->prg_cpu, 0, d->num_desc * sizeof(struct at_dma_prg*));
        memset(d->prg_bus, 0, d->num_desc * sizeof(dma_addr_t));
 
+       d->prg_pool = hpsb_pci_pool_create("ohci1394 trm prg", ohci->dev,
+                               sizeof(struct at_dma_prg), 4, 0, SLAB_KERNEL);
+       OHCI_DMA_ALLOC("dma_rcv prg pool");
+
        for (i = 0; i < d->num_desc; i++) {
-                d->prg_cpu[i] = pci_alloc_consistent(ohci->dev, 
-                                                    sizeof(struct at_dma_prg),
-                                                    d->prg_bus+i);
-               OHCI_DMA_ALLOC("consistent dma_trm prg[%d]", i);
+               d->prg_cpu[i] = pci_pool_alloc(d->prg_pool, SLAB_KERNEL, d->prg_bus+i);
+               OHCI_DMA_ALLOC("pool dma_trm prg[%d]", i);
 
                 if (d->prg_cpu[i] != NULL) {
                         memset(d->prg_cpu[i], 0, sizeof(struct at_dma_prg));
@@ -1941,6 +2713,7 @@ static struct hpsb_host_driver ohci1394_driver = {
        .get_rom =              ohci_get_rom,
        .transmit_packet =      ohci_transmit,
        .devctl =               ohci_devctl,
+       .isoctl =               ohci_isoctl,
        .hw_csr_reg =           ohci_hw_csr_reg,
 };
 
index c83198183f2f94d9c56e73a0b7b65bd3d7d377a1..e0d9e6e9025fa019d986c3ce06d45346a8ab4dd2 100644 (file)
@@ -95,6 +95,7 @@ struct dma_rcv_ctx {
        /* dma block descriptors */
         struct dma_cmd **prg_cpu;
         dma_addr_t *prg_bus;
+       struct pci_pool *prg_pool;
 
        /* dma buffers */
         quadlet_t **buf_cpu;
@@ -120,6 +121,7 @@ struct dma_trm_ctx {
        /* dma block descriptors */
         struct at_dma_prg **prg_cpu;
        dma_addr_t *prg_bus;
+       struct pci_pool *prg_pool;
 
         unsigned int prg_ind;
         unsigned int sent_ind;
@@ -292,6 +294,9 @@ static inline u32 reg_read(const struct ti_ohci *ohci, int offset)
 #define OHCI1394_IsoRecvIntEventClear         0x0A4
 #define OHCI1394_IsoRecvIntMaskSet            0x0A8
 #define OHCI1394_IsoRecvIntMaskClear          0x0AC
+#define OHCI1394_InitialBandwidthAvailable    0x0B0
+#define OHCI1394_InitialChannelsAvailableHi   0x0B4
+#define OHCI1394_InitialChannelsAvailableLo   0x0B8
 #define OHCI1394_FairnessControl              0x0DC
 #define OHCI1394_LinkControlSet               0x0E0
 #define OHCI1394_LinkControlClear             0x0E4
diff --git a/drivers/ieee1394/oui.db b/drivers/ieee1394/oui.db
new file mode 100644 (file)
index 0000000..056797b
--- /dev/null
@@ -0,0 +1,4931 @@
+000000 XEROX CORPORATION
+000001 XEROX CORPORATION
+000002 XEROX CORPORATION
+000003 XEROX CORPORATION
+000004 XEROX CORPORATION
+000005 XEROX CORPORATION
+000006 XEROX CORPORATION
+000007 XEROX CORPORATION
+000008 XEROX CORPORATION
+000009 XEROX CORPORATION
+00000A OMRON TATEISI ELECTRONICS CO.
+00000B MATRIX CORPORATION
+00000C CISCO SYSTEMS, INC.
+00000D FIBRONICS LTD.
+00000E FUJITSU LIMITED
+00000F NEXT, INC.
+000010 SYTEK INC.
+000011 NORMEREL SYSTEMES
+000012 INFORMATION TECHNOLOGY LIMITED
+000013 CAMEX
+000014 NETRONIX
+000015 DATAPOINT CORPORATION
+000016 DU PONT PIXEL SYSTEMS     .
+000017 TEKELEC
+000018 WEBSTER COMPUTER CORPORATION
+000019 APPLIED DYNAMICS INTERNATIONAL
+00001A ADVANCED MICRO DEVICES
+00001B NOVELL INC.
+00001C BELL TECHNOLOGIES
+00001D CABLETRON SYSTEMS, INC.
+00001E TELSIST INDUSTRIA ELECTRONICA
+00001F Telco Systems, Inc.
+000020 DATAINDUSTRIER DIAB AB
+000021 SUREMAN COMP. & COMMUN. CORP.
+000022 VISUAL TECHNOLOGY INC.
+000023 ABB INDUSTRIAL SYSTEMS AB
+000024 CONNECT AS
+000025 RAMTEK CORP.
+000026 SHA-KEN CO., LTD.
+000027 JAPAN RADIO COMPANY
+000028 PRODIGY SYSTEMS CORPORATION
+000029 IMC NETWORKS CORP.
+00002A TRW - SEDD/INP
+00002B CRISP AUTOMATION, INC
+00002C AUTOTOTE LIMITED
+00002D CHROMATICS INC
+00002E SOCIETE EVIRA
+00002F TIMEPLEX INC.
+000030 VG LABORATORY SYSTEMS LTD
+000031 QPSX COMMUNICATIONS PTY LTD
+000032 Marconi plc
+000033 EGAN MACHINERY COMPANY
+000034 NETWORK RESOURCES CORPORATION
+000035 SPECTRAGRAPHICS CORPORATION
+000036 ATARI CORPORATION
+000037 OXFORD METRICS LIMITED
+000038 CSS LABS
+000039 TOSHIBA CORPORATION
+00003A CHYRON CORPORATION
+00003B i Controls, Inc.
+00003C AUSPEX SYSTEMS INC.
+00003D UNISYS
+00003E SIMPACT
+00003F SYNTREX, INC.
+000040 APPLICON, INC.
+000041 ICE CORPORATION
+000042 METIER MANAGEMENT SYSTEMS LTD.
+000043 MICRO TECHNOLOGY
+000044 CASTELLE CORPORATION
+000045 FORD AEROSPACE & COMM. CORP.
+000046 OLIVETTI NORTH AMERICA
+000047 NICOLET INSTRUMENTS CORP.
+000048 SEIKO EPSON CORPORATION
+000049 APRICOT COMPUTERS, LTD
+00004A ADC CODENOLL TECHNOLOGY CORP.
+00004B ICL DATA OY
+00004C NEC CORPORATION
+00004D DCI CORPORATION
+00004E AMPEX CORPORATION
+00004F LOGICRAFT, INC.
+000050 RADISYS CORPORATION
+000051 HOB ELECTRONIC GMBH & CO. KG
+000052 Intrusion.com, Inc.
+000053 COMPUCORP
+000054 MODICON, INC.
+000055 COMMISSARIAT A L`ENERGIE ATOM.
+000056 DR. B. STRUCK
+000057 SCITEX CORPORATION LTD.
+000058 RACORE COMPUTER PRODUCTS INC.
+000059 HELLIGE GMBH
+00005A SysKonnect GmbH
+00005B ELTEC ELEKTRONIK AG
+00005C TELEMATICS INTERNATIONAL INC.
+00005D CS TELECOM
+00005E USC INFORMATION SCIENCES INST
+00005F SUMITOMO ELECTRIC IND., LTD.
+000060 KONTRON ELEKTRONIK GMBH
+000061 GATEWAY COMMUNICATIONS
+000062 BULL HN INFORMATION SYSTEMS
+000063 DR.ING.SEUFERT GMBH
+000064 YOKOGAWA DIGITAL COMPUTER CORP
+000065 NETWORK ASSOCIATES, INC.
+000066 TALARIS SYSTEMS, INC.
+000067 SOFT * RITE, INC.
+000068 ROSEMOUNT CONTROLS
+000069 CONCORD COMMUNICATIONS INC
+00006A COMPUTER CONSOLES INC.
+00006B SILICON GRAPHICS INC./MIPS
+00006D CRAY COMMUNICATIONS, LTD.
+00006E ARTISOFT, INC.
+00006F MADGE NETWORKS LTD.
+000070 HCL LIMITED
+000071 ADRA SYSTEMS INC.
+000072 MINIWARE TECHNOLOGY
+000073 SIECOR CORPORATION
+000074 RICOH COMPANY LTD.
+000075 Nortel Networks
+000076 ABEKAS VIDEO SYSTEM
+000077 INTERPHASE CORPORATION
+000078 LABTAM LIMITED
+000079 NETWORTH INCORPORATED
+00007A DANA COMPUTER INC.
+00007B RESEARCH MACHINES
+00007C AMPERE INCORPORATED
+00007D SUN MICROSYSTEMS, INC.
+00007E CLUSTRIX CORPORATION
+00007F LINOTYPE-HELL AG
+000080 CRAY COMMUNICATIONS A/S
+000081 BAY NETWORKS
+000082 LECTRA SYSTEMES SA
+000083 TADPOLE TECHNOLOGY PLC
+000084 SUPERNET
+000085 CANON INC.
+000086 MEGAHERTZ CORPORATION
+000087 HITACHI, LTD.
+000088 COMPUTER NETWORK TECH. CORP.
+000089 CAYMAN SYSTEMS INC.
+00008A DATAHOUSE INFORMATION SYSTEMS
+00008B INFOTRON
+00008C ALLOY COMPUTER PRODUCTS, INC.
+00008D VERDIX CORPORATION
+00008E SOLBOURNE COMPUTER, INC.
+00008F RAYTHEON COMPANY
+000090 MICROCOM
+000091 ANRITSU CORPORATION
+000092 COGENT DATA TECHNOLOGIES
+000093 PROTEON INC.
+000094 ASANTE TECHNOLOGIES
+000095 SONY TEKTRONIX CORP.
+000096 MARCONI ELECTRONICS LTD.
+000097 EPOCH SYSTEMS
+000098 CROSSCOMM CORPORATION
+000099 MTX, INC.
+00009A RC COMPUTER A/S
+00009B INFORMATION INTERNATIONAL, INC
+00009C ROLM MIL-SPEC COMPUTERS
+00009D LOCUS COMPUTING CORPORATION
+00009E MARLI S.A.
+00009F AMERISTAR TECHNOLOGIES INC.
+0000A0 TOKYO SANYO ELECTRIC CO. LTD.
+0000A1 MARQUETTE ELECTRIC CO.
+0000A2 BAY NETWORKS
+0000A3 NETWORK APPLICATION TECHNOLOGY
+0000A4 ACORN COMPUTERS LIMITED
+0000A5 COMPATIBLE SYSTEMS CORP.
+0000A6 NETWORK GENERAL CORPORATION
+0000A7 NETWORK COMPUTING DEVICES INC.
+0000A8 STRATUS COMPUTER INC.
+0000A9 NETWORK SYSTEMS CORP.
+0000AA XEROX CORPORATION
+0000AB LOGIC MODELING CORPORATION
+0000AC CONWARE COMPUTER CONSULTING
+0000AD BRUKER INSTRUMENTS INC.
+0000AE DASSAULT ELECTRONIQUE
+0000AF NUCLEAR DATA INSTRUMENTATION
+0000B0 RND-RAD NETWORK DEVICES
+0000B1 ALPHA MICROSYSTEMS INC.
+0000B2 TELEVIDEO SYSTEMS, INC.
+0000B3 CIMLINC INCORPORATED
+0000B4 EDIMAX COMPUTER COMPANY
+0000B5 DATABILITY SOFTWARE SYS. INC.
+0000B6 MICRO-MATIC RESEARCH
+0000B7 DOVE COMPUTER CORPORATION
+0000B8 SEIKOSHA CO., LTD.
+0000B9 MCDONNELL DOUGLAS COMPUTER SYS
+0000BA SIIG, INC.
+0000BB TRI-DATA
+0000BC ALLEN-BRADLEY CO. INC.
+0000BD MITSUBISHI CABLE COMPANY
+0000BE THE NTI GROUP
+0000BF SYMMETRIC COMPUTER SYSTEMS
+0000C0 WESTERN DIGITAL CORPORATION
+0000C1 Madge Networks Ltd.
+0000C2 INFORMATION PRESENTATION TECH.
+0000C3 HARRIS CORP COMPUTER SYS DIV
+0000C4 WATERS DIV. OF MILLIPORE
+0000C5 FARALLON COMPUTING/NETOPIA
+0000C6 EON SYSTEMS
+0000C7 ARIX CORPORATION
+0000C8 ALTOS COMPUTER SYSTEMS
+0000C9 EMULEX CORPORATION
+0000CA APPLITEK
+0000CB COMPU-SHACK ELECTRONIC GMBH
+0000CC DENSAN CO., LTD.
+0000CD Centrecom Systems, Ltd.
+0000CE MEGADATA CORP.
+0000CF HAYES MICROCOMPUTER PRODUCTS
+0000D0 DEVELCON ELECTRONICS LTD.
+0000D1 ADAPTEC INCORPORATED
+0000D2 SBE, INC.
+0000D3 WANG LABORATORIES INC.
+0000D4 PURE DATA LTD.
+0000D5 MICROGNOSIS INTERNATIONAL
+0000D6 PUNCH LINE HOLDING
+0000D7 DARTMOUTH COLLEGE
+0000D8 NOVELL, INC.
+0000D9 NIPPON TELEGRAPH & TELEPHONE
+0000DA ATEX
+0000DB BRITISH TELECOMMUNICATIONS PLC
+0000DC HAYES MICROCOMPUTER PRODUCTS
+0000DD TCL INCORPORATED
+0000DE CETIA
+0000DF BELL & HOWELL PUB SYS DIV
+0000E0 QUADRAM CORP.
+0000E1 GRID SYSTEMS
+0000E2 ACER TECHNOLOGIES CORP.
+0000E3 INTEGRATED MICRO PRODUCTS LTD
+0000E4 IN2 GROUPE INTERTECHNIQUE
+0000E5 SIGMEX LTD.
+0000E6 APTOR PRODUITS DE COMM INDUST
+0000E7 STAR GATE TECHNOLOGIES
+0000E8 ACCTON TECHNOLOGY CORP.
+0000E9 ISICAD, INC.
+0000EA UPNOD AB
+0000EB MATSUSHITA COMM. IND. CO. LTD.
+0000EC MICROPROCESS
+0000ED APRIL
+0000EE NETWORK DESIGNERS, LTD.
+0000EF KTI
+0000F0 SAMSUNG ELECTRONICS CO., LTD.
+0000F1 MAGNA COMPUTER CORPORATION
+0000F2 SPIDER COMMUNICATIONS
+0000F3 GANDALF DATA LIMITED
+0000F4 ALLIED TELESYN INTERNATIONAL
+0000F5 DIAMOND SALES LIMITED
+0000F6 APPLIED MICROSYSTEMS CORP.
+0000F7 YOUTH KEEP ENTERPRISE CO LTD
+0000F8 DIGITAL EQUIPMENT CORPORATION
+0000F9 QUOTRON SYSTEMS INC.
+0000FA MICROSAGE COMPUTER SYSTEMS INC
+0000FB RECHNER ZUR KOMMUNIKATION
+0000FC MEIKO
+0000FD HIGH LEVEL HARDWARE
+0000FE ANNAPOLIS MICRO SYSTEMS
+0000FF CAMTEC ELECTRONICS LTD.
+000100 EQUIP'TRANS
+000102 3COM CORPORATION
+000103 3COM CORPORATION
+000104 DVICO Co., Ltd.
+000105 BECKHOFF GmbH
+000106 Tews Datentechnik GmbH
+000107 Leiser GmbH
+000108 AVLAB Technology, Inc.
+000109 Nagano Japan Radio Co., Ltd.
+00010A CIS TECHNOLOGY INC.
+00010B Space CyberLink, Inc.
+00010C System Talks Inc.
+00010D CORECO, INC.
+00010E Bri-Link Technologies Co., Ltd
+00010F Nishan Systems, Inc.
+000110 Gotham Networks
+000111 iDigm Inc.
+000112 Shark Multimedia Inc.
+000113 OLYMPUS OPTICAL CO., LTD.
+000114 KANDA TSUSHIN KOGYO CO., LTD.
+000115 EXTRATECH CORPORATION
+000116 Netspect Technologies, Inc.
+000117 CANAL +
+000118 EZ Digital Co., Ltd.
+000119 Action Controls Pty. Ltd.
+00011A EEH DataLink GmbH
+00011B Unizone Technologies, Inc.
+00011C Universal Talkware Corporation
+00011D Centillium Communications
+00011E Precidia Technologies, Inc.
+00011F RC Networks, Inc.
+000120 OSCILLOQUARTZ S.A.
+000121 RapidStream Inc.
+000122 Trend Communications, Ltd.
+000123 DIGITAL ELECTRONICS CORP.
+000124 Acer Incorporated
+000125 YAESU MUSEN CO., LTD.
+000126 PAC Labs
+000127 The OPEN Group Limited
+000128 EnjoyWeb, Inc.
+000129 DFI Inc.
+00012A Telematica Sistems Inteligente
+00012B TELENET Co., Ltd.
+00012C Aravox Technologies, Inc.
+00012D Komodo Technology
+00012E PC Partner Ltd.
+00012F Twinhead International Corp
+000130 Extreme Networks
+000131 Detection Systems, Inc.
+000132 Dranetz - BMI
+000133 KYOWA Electronic Instruments C
+000134 SIG Positec Systems AG
+000135 KDC Corp.
+000136 CyberTAN Technology, Inc.
+000137 IT Farm Corporation
+000138 XAVi Technologies Corp.
+000139 Point Multimedia Systems
+00013A SHELCAD COMMUNICATIONS, LTD.
+00013B BNA SYSTEMS
+00013C TIW SYSTEMS
+00013D RiscStation Ltd.
+00013E Ascom Tateco AB
+00013F Neighbor World Co., Ltd.
+000140 Sendtek Corporation
+000141 CABLE PRINT
+000142 Cisco Systems, Inc.
+000143 Cisco Systems, Inc.
+000144 Cereva Networks, Inc.
+000145 WINSYSTEMS, INC.
+000146 Tesco Controls, Inc.
+000147 Zhone Technologies
+000148 X-traWeb Inc.
+000149 T.D.T. Transfer Data Test GmbH
+00014A SONY COMPUTER SCIENCE LABS., I
+00014B Ennovate Networks, Inc.
+00014C Berkeley Process Control
+00014D Shin Kin Enterprises Co., Ltd
+00014E WIN Enterprises, Inc.
+00014F LUMINOUS Networks, Inc.
+000150 GILAT COMMUNICATIONS, LTD.
+000151 Ensemble Communications
+000152 CHROMATEK INC.
+000153 ARCHTEK TELECOM CORPORATION
+000154 G3M Corporation
+000155 Promise Technology, Inc.
+000156 FIREWIREDIRECT.COM, INC.
+000157 SYSWAVE CO., LTD
+000158 Electro Industries/Gauge Tech
+000159 S1 Corporation
+00015A Digital Video Broadcasting
+00015B ITALTEL S.p.A/RF-UP-I
+00015C CADANT INC.
+00015D Pirus Networks
+00015E BEST TECHNOLOGY CO., LTD.
+00015F DIGITAL DESIGN GmbH
+000160 ELMEX Co., LTD.
+000161 Meta Machine Technology
+000162 Cygnet Technologies, Inc.
+000163 Cisco Systems, Inc.
+000164 Cisco Systems, Inc.
+000165 AirSwitch Corporation
+000166 TC GROUP A/S
+000167 HIOKI E.E. CORPORATION
+000168 VITANA CORPORATION
+000169 Celestix Networks Pte Ltd.
+00016A ALITEC
+00016B LightChip, Inc.
+00016C FOXCONN
+00016D Triton Network Systems
+00016E Conklin Corporation
+00016F HAITAI ELECTRONICS CO., LTD.
+000170 ESE Embedded System Engineer'g
+000171 Allied Data Technologies
+000172 TechnoLand Co., LTD.
+000173 JNI Corporation
+000174 CyberOptics Corporation
+000175 Radiant Communications Corp.
+000176 Orient Silver Enterprises
+000177 EDSL
+000178 MARGI Systems, Inc.
+000179 WIRELESS TECHNOLOGY, INC.
+00017A Chengdu Maipu Electric Industrial Co., Ltd.
+00017B Heidelberger Druckmaschinen AG
+00017C AG-E GmbH
+00017D ThermoQuest
+00017E ADTEK System Science Co., Ltd.
+00017F Experience Music Project
+000180 AOpen, Inc.
+000181 Nortel Networks
+000182 DICA TECHNOLOGIES AG
+000183 ANITE TELECOMS
+000184 SIEB & MEYER AG
+000185 Aloka Co., Ltd.
+000186 DISCH GmbH
+000187 i2SE GmbH
+000188 LXCO Technologies ag
+000189 Refraction Technology, Inc.
+00018A ROI COMPUTER AG
+00018B NetLinks Co., Ltd.
+00018C Mega Vision
+00018D AudeSi Technologies
+00018E Logitec Corporation
+00018F Kenetec, Inc.
+000190 SMK-M
+000191 SYRED Data Systems
+000192 Texas Digital Systems
+000193 Hanbyul Telecom Co., Ltd.
+000194 Capital Equipment Corporation
+000195 Sena Technologies, Inc.
+000196 Cisco Systems, Inc.
+000197 Cisco Systems, Inc.
+000198 Darim Vision
+000199 HeiSei Electronics
+00019A LEUNIG GmbH
+00019B Kyoto Microcomputer Co., Ltd.
+00019C JDS Uniphase Inc.
+00019D E-Control Systems, Inc.
+00019E ESS Technology, Inc.
+00019F Phonex Broadband
+0001A0 Infinilink Corporation
+0001A1 Mag-Tek, Inc.
+0001A2 Logical Co., Ltd.
+0001A3 GENESYS LOGIC, INC.
+0001A4 Microlink Corporation
+0001A5 Nextcomm, Inc.
+0001A6 Scientific-Atlanta Arcodan A/S
+0001A7 UNEX TECHNOLOGY CORPORATION
+0001A8 Welltech Computer Co., Ltd.
+0001A9 BMW AG
+0001AA Airspan Communications, Ltd.
+0001AB Main Street Networks
+0001AC Sitara Networks, Inc.
+0001AD Coach Master International  d.b.a. CMI Worldwide, Inc.
+0001AE Trex Enterprises
+0001AF Motorola Computer Group
+0001B0 Fulltek Technology Co., Ltd.
+0001B1 General Bandwidth
+0001B2 Digital Processing Systems, Inc.
+0001B3 Precision Electronic Manufacturing
+0001B4 Wayport, Inc.
+0001B5 Turin Networks, Inc.
+0001B6 SAEJIN T&M Co., Ltd.
+0001B7 Centos, Inc.
+0001B8 Netsensity, Inc.
+0001B9 SKF Condition Monitoring
+0001BA IC-Net, Inc.
+0001BB Frequentis
+0001BC Brains Corporation
+0001BD Peterson Electro-Musical Products, Inc.
+0001BE Gigalink Co., Ltd.
+0001BF Teleforce Co., Ltd.
+0001C0 CompuLab, Ltd.
+0001C1 Exbit Technology
+0001C2 ARK Research Corp.
+0001C3 Acromag, Inc.
+0001C4 NeoWave, Inc.
+0001C5 Simpler Networks
+0001C6 Quarry Technologies
+0001C7 Cisco Systems, Inc.
+0001C8 THOMAS CONRAD CORP.
+0001C8 CONRAD CORP.
+0001C9 Cisco Systems, Inc.
+0001CA Geocast Network Systems, Inc.
+0001CB NetGame, Ltd.
+0001CC Japan Total Design Communication Co., Ltd.
+0001CD ARtem
+0001CE Custom Micro Products, Ltd.
+0001CF Alpha Data Parallel Systems, Ltd.
+0001D0 VitalPoint, Inc.
+0001D1 CoNet Communications, Inc.
+0001D2 MacPower Peripherals, Ltd.
+0001D3 PAXCOMM, Inc.
+0001D4 Leisure Time, Inc.
+0001D5 HAEDONG INFO & COMM CO., LTD
+0001D6 MAN Roland Druckmaschinen AG
+0001D7 F5 Networks, Inc.
+0001D8 Teltronics, Inc.
+0001D9 Sigma, Inc.
+0001DA WINCOMM Corporation
+0001DB Freecom Technologies GmbH
+0001DC Activetelco
+0001DD Avail Networks
+0001DE Trango Systems, Inc.
+0001DF ISDN Communications, Ltd.
+0001E0 Fast Systems, Inc.
+0001E1 Kinpo Electronics, Inc.
+0001E2 Ando Electric Corporation
+0001E3 Siemens AG
+0001E4 Sitera, Inc.
+0001E5 Supernet, Inc.
+0001E6 Hewlett-Packard Company
+0001E7 Hewlett-Packard Company
+0001E8 Force10 Networks, Inc.
+0001E9 Litton Marine Systems B.V.
+0001EA Cirilium Corp.
+0001EB C-COM Corporation
+0001EC Ericsson Group
+0001ED SETA Corp.
+0001EE Comtrol Europe, Ltd.
+0001EF Camtel Technology Corp.
+0001F0 Tridium, Inc.
+0001F1 Innovative Concepts, Inc.
+0001F3 QPS, Inc.
+0001F4 Enterasys Networks
+0001F5 ERIM S.A.
+0001F6 Association of Musical Electronics Industry
+0001F7 Image Display Systems, Inc.
+0001F8 Adherent Systems, Ltd.
+0001F9 TeraGlobal Communications Corp.
+0001FA HOROSCAS
+0001FB DoTop Technology, Inc.
+0001FC Keyence Corporation
+0001FD Digital Voice Systems, Inc.
+0001FE DIGITAL EQUIPMENT CORPORATION
+0001FF Data Direct Networks, Inc.
+000200 Net & Sys Co., Ltd.
+000201 IFM Electronic gmbh
+000202 Amino Communications, Ltd.
+000203 Woonsang Telecom, Inc.
+000204 Bodmann Industries Elektronik GmbH
+000205 Hitachi Denshi, Ltd.
+000206 Telital R&D Denmark A/S
+000208 Unify Networks, Inc.
+000209 Shenzhen SED Information Technology Co., Ltd.
+00020A Gefran Spa
+00020B Native Networks, Inc.
+00020C Metro-Optix
+00020D Micronpc.com
+00020E Laurel Networks, Inc.
+00020F AATR
+000210 Fenecom
+000211 Nature Worldwide Technology Corp.
+000212 SierraCom
+000213 S.D.E.L.
+000214 DTVRO
+000215 Cotas Computer Technology A/B
+000216 Cisco Systems, Inc.
+000217 Cisco Systems, Inc.
+000218 Advanced Scientific Corp
+000219 Paralon Technologies
+00021A Zuma Networks
+00021B Kollmorgen-Servotronix
+00021C Network Elements, Inc.
+00021D Data General Communication Ltd.
+00021E SIMTEL S.R.L.
+00021F Aculab PLC
+000220 Canon Aptex, Inc.
+000221 DSP Application, Ltd.
+000222 Chromisys, Inc.
+000223 ClickTV
+000224 Lantern Communications, Inc.
+000225 Certus Technology, Inc.
+000226 XESystems, Inc.
+000227 ESD GmbH
+000228 Necsom, Ltd.
+000229 Adtec Corporation
+00022A Asound Electronic
+00022B Tamura Electric Works, Ltd.
+00022C ABB Bomem, Inc.
+00022D Agere Systems
+00022E TEAC Corp. R& D
+00022F P-Cube, Ltd.
+000230 Intersoft Electronics
+000231 Ingersoll-Rand
+000232 Avision, Inc.
+000233 Mantra Communications, Inc.
+000234 Imperial Technology, Inc.
+000235 Paragon Networks International
+000236 INIT GmbH
+000237 Cosmo Research Corp.
+000238 Serome Technology, Inc.
+000239 Visicom
+00023A ZSK Stickmaschinen GmbH
+00023B Redback Networks
+00023C Creative Technology, Ltd.
+00023D NuSpeed, Inc.
+00023E Selta Telematica S.p.a
+00023F Compal Electronics, Inc.
+000240 Seedek Co., Ltd.
+000241 Amer.com
+000242 Videoframe Systems
+000243 Raysis Co., Ltd.
+000244 SURECOM Technology Co.
+000245 Lampus Co, Ltd.
+000246 All-Win Tech Co., Ltd.
+000247 Great Dragon Information Technology (Group) Co., Ltd.
+000248 Pila GmbH & Co.
+000249 Aviv Infocom Co, Ltd.
+00024A Cisco Systems, Inc.
+00024B Cisco Systems, Inc.
+00024C SiByte, Inc.
+00024D Mannesman Dematic Colby Pty. Ltd.
+00024E Datacard Group
+00024F IPM Datacom S.R.L.
+000250 Geyser Networks, Inc.
+000251 Soma Networks
+000252 Carrier Corporation
+000253 Televideo, Inc.
+000254 WorldGate
+000255 IBM Corporation
+000256 Alpha Processor, Inc.
+000257 Microcom Corp.
+000258 Flying Packets Communications
+000259 Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group
+00025A Catena Networks
+00025B Cambridge Silicon Radio
+00025C SCI Systems (Kunshan) Co., Ltd.
+00025E High Technology Ltd
+00025F Nortel Networks
+000260 Accordion Networks, Inc.
+000261 i3 Micro Technology AB
+000262 Soyo Group Soyo Com Tech Co., Ltd
+000263 UPS Manufacturing SRL
+000264 AudioRamp.com
+000265 Virditech Co. Ltd.
+000266 Thermalogic Corporation
+000267 NODE RUNNER, INC.
+000268 Harris Government Communications
+000269 Nadatel Co., Ltd
+00026A Cocess Telecom Co., Ltd.
+00026B BCM Computers Co., Ltd.
+00026C Philips CFT
+00026D Adept Telecom
+00026E NeGeN Access, Inc.
+00026F Senao International Co., Ltd.
+000270 Crewave Co., Ltd.
+000271 Vpacket Communications
+000272 CC&C Technologies, Inc.
+000273 Coriolis Networks
+000274 Tommy Technologies Corp.
+000275 SMART Technologies, Inc.
+000276 Primax Electronics Ltd.
+000277 Cash Systemes Industrie
+000278 Samsung Electro-Mechanics Co., Ltd.
+000279 Control Applications, Ltd.
+00027A IOI Technology Corporation
+00027B Amplify Net, Inc.
+00027C Trilithic, Inc.
+00027D Cisco Systems, Inc.
+00027E Cisco Systems, Inc.
+00027F ask-technologies.com
+000280 Mu Net, Inc.
+000281 Red-M (Communications) Ltd.
+000282 ViaClix, Inc.
+000283 Spectrum Controls, Inc.
+000284 Alstom T&D P&C
+000285 Riverstone Networks
+000286 Occam Networks
+000287 Adapcom
+000288 GLOBAL VILLAGE COMMUNICATION
+000289 DNE Technologies
+00028A Ambit Microsystems Corporation
+00028B VDSL Systems OY
+00028C Micrel-Synergy Semiconductor
+00028D Movita Technologies, Inc.
+00028E Rapid 5 Networks, Inc.
+00028F Globetek, Inc.
+000290 Woorigisool, Inc.
+000291 Open Network Co., Ltd.
+000292 Logic Innovations, Inc.
+000293 Solid Data Systems
+000294 Tokyo Sokushin Co., Ltd.
+000295 IP.Access Limited
+000296 Lectron Co,. Ltd.
+000297 C-COR.net
+000298 Broadframe Corporation
+000299 Apex, Inc.
+00029A Storage Apps
+00029B Kreatel Communications AB
+00029D Merix Corp.
+00029E Information Equipment Co., Ltd.
+00029F L-3 Communication Aviation Recorders
+0002A0 Flatstack Ltd.
+0002A1 World Wide Packets
+0002A2 Hilscher GmbH
+0002A3 ABB Power Automation
+0002A4 AddPac Technology Co., Ltd.
+0002A5 Compaq Computer Corporation
+0002A6 Effinet Systems Co., Ltd.
+0002A7 Vivace Networks
+0002A8 Air Link Technology
+0002A9 RACOM, s.r.o.
+0002AA PLcom Co., Ltd.
+0002AB CTC Union Technologies Co., Ltd.
+0002AC 3PAR data
+0002AD Asahi Optical Co., Ltd.
+0002AE Scannex Electronics Ltd.
+0002AF TeleCruz Technology, Inc.
+0002B0 Hokubu Communication & Industrial Co., Ltd.
+0002B1 Anritsu, Ltd.
+0002B2 Cablevision
+0002B3 Intel Corporation
+0002B4 DAPHNE
+0002B5 Avnet, Inc.
+0002B6 Acrosser Technology Co., Ltd.
+0002B7 Watanabe Electric Industry Co., Ltd.
+0002B8 WHI KONSULT AB
+0002B9 Cisco Systems, Inc.
+0002BA Cisco Systems, Inc.
+0002BB Continuous Computing
+0002BC LVL 7 Systems, Inc.
+0002BD Bionet Co., Ltd.
+0002BE Totsu Engineering, Inc.
+0002BF dotRocket, Inc.
+0002C0 Bencent Tzeng Industry Co., Ltd.
+0002C1 Innovative Electronic Designs, Inc.
+0002C2 Net Vision Telecom
+0002C3 Arelnet Ltd.
+0002C4 Vector International BUBA
+0002C5 Evertz Microsystems Ltd.
+0002C6 Data Track Technology PLC
+0002C7 ALPS ELECTRIC Co., Ltd.
+0002C8 Technocom Communications Technology (pte) Ltd
+0002C9 Mellanox Technologies
+0002CA EndPoints, Inc.
+0002CB TriState Ltd.
+0002CC M.C.C.I
+0002CD TeleDream, Inc.
+0002CE FoxJet, Inc.
+0002CF ZyGate Communications, Inc.
+0002D0 Comdial Corporation
+0002D1 Vivotek, Inc.
+0002D2 Workstation AG
+0002D3 NetBotz, Inc.
+0002D4 PDA Peripherals, Inc.
+0002D5 ACR
+0002D6 NICE Systems
+0002D7 EMPEG Ltd
+0002D8 BRECIS Communications Corporation
+0002D9 Reliable Controls
+0002DA ExiO Communications, Inc.
+0002DB NETSEC
+0002DC Fujitsu General Limited
+0002DD Bromax Communications, Ltd.
+0002DE Astrodesign, Inc.
+0002DF Net Com Systems, Inc.
+0002E0 ETAS GmbH
+0002E1 Integrated Network Corporation
+0002E2 NDC Infared Engineering
+0002E3 LITE-ON Communications, Inc.
+0002E4 JC HYUN Systems, Inc.
+0002E5 Timeware Ltd.
+0002E6 Gould Instrument Systems, Inc.
+0002E7 CAB GmbH & Co KG
+0002E8 E.D.&A.
+0002E9 CS Systemes De Securite - C3S
+0002EA Videonics, Inc.
+0002EB Easent Communications
+0002EC Maschoff Design Engineering
+0002ED DXO Telecom Co., Ltd.
+0002EE Nokia Danmark A/S
+0002EF CCC Network Systems Group Ltd.
+0002F0 AME Optimedia Technology Co., Ltd.
+0002F1 Pinetron Co., Ltd.
+0002F2 eDevice, Inc.
+0002F3 Media Serve Co., Ltd.
+0002F4 PCTEL, Inc.
+0002F5 VIVE Synergies, Inc.
+0002F6 Equipe Communications
+0002F7 ARM
+0002F8 SEAKR Engineering, Inc.
+0002F9 Mimos Semiconductor SDN BHD
+0002FA DX Antenna Co., Ltd.
+0002FB Baumuller Aulugen-Systemtechnik GmbH
+0002FC Cisco Systems, Inc.
+0002FD Cisco Systems, Inc.
+0002FE Viditec, Inc.
+0002FF Handan Broad InfoCom
+000300 NetContinuum, Inc.
+000301 Avantas Networks Corporation
+000302 Oasys Telecom, Inc.
+000303 JAMA Electronics Co., Ltd.
+000304 Pacific Broadband Communications
+000305 Smart Network Devices GmbH
+000306 Fusion In Tech Co., Ltd.
+000307 Secure Works, Inc.
+000308 AM Communications, Inc.
+000309 Texcel Technology PLC
+00030A Argus Technologies
+00030B Hunter Technology, Inc.
+00030C Telesoft Technologies Ltd.
+00030D Uniwill Computer Corp.
+00030E Core Communications Co., Ltd.
+00030F Legend Digital China Ltd.
+000310 Link Evolution Corp.
+000311 Micro Technology Co., Ltd.
+000312 TR-Systemtechnik GmbH
+000313 Access Media SPA
+000314 Teleware Network Systems
+000315 Cidco Incorporated
+000316 Nobell Communications, Inc.
+000317 Merlin Systems, Inc.
+000318 Cyras Systems, Inc.
+000319 Infineon AG
+00031A Beijing Broad Telecom Ltd., China
+00031B Cellvision Systems, Inc.
+00031C Svenska Hardvarufabriken AB
+00031D Taiwan Commate Computer, Inc.
+00031E Optranet, Inc.
+00031F Condev Ltd.
+000320 Xpeed, Inc.
+000321 Reco Research Co., Ltd.
+000322 IDIS Co., Ltd.
+000323 Cornet Technology, Inc.
+000324 Tottori SANYO Electric Co., Ltd.
+000325 Arima Computer Corp.
+000326 Iwasaki Information Systems Co., Ltd.
+000327 ACT'L
+000328 Mace Group, Inc.
+000329 F3, Inc.
+00032A UniData Communication Systems, Inc.
+00032B GAI Datenfunksysteme GmbH
+00032C ABB Industrie AG
+00032D IBASE Technology, Inc.
+00032E Scope Information Management, Ltd.
+00032F Global Sun Technology, Inc.
+000330 Imagenics, Co., Ltd.
+000331 Cisco Systems, Inc.
+000332 Cisco Systems, Inc.
+000333 Digitel Co., Ltd.
+000334 Newport Electronics
+000335 Mirae Technology
+000336 Zetes Technologies
+000337 Vaone, Inc.
+000338 Oak Technology
+000339 Eurologic Systems, Ltd.
+00033A Silicon Wave, Inc.
+00033B TAMI Tech Co., Ltd.
+00033C Daiden Co., Ltd.
+00033D ILSHin Lab
+00033E Tateyama System Laboratory Co., Ltd.
+00033F BigBand Networks, Ltd.
+000340 Floware Wireless Systems, Ltd.
+000341 Axon Digital Design
+000342 Nortel Networks
+000343 Martin Professional A/S
+000344 Tietech.Co., Ltd.
+000345 Routrek Networks Corporation
+000346 Hitachi Kokusai Electric, Inc.
+000347 Intel Corporation
+000348 Norscan Instruments, Ltd.
+000349 Vidicode Datacommunicatie B.V.
+00034A RIAS Corporation
+00034B Nortel Networks
+00034C Shanghai DigiVision Technology Co., Ltd.
+00034D Chiaro Networks, Ltd.
+00034E Pos Data Company, Ltd.
+00034F Sur-Gard Security
+000350 BTICINO SPA
+000351 Diebold, Inc.
+000352 Colubris Networks
+000353 Mitac, Inc.
+000354 Fiber Logic Communications
+000355 TeraBeam Internet Systems
+000356 Wincor Nixdorf GmbH & Co KG
+000357 Intervoice-Brite, Inc.
+000358 iCable System Co., Ltd.
+000359 DigitalSis
+00035A Phototron Limited
+00035B BridgeWave Communications
+00035C Saint Song Corp.
+00035D Bosung Hi-Net Co., Ltd.
+00035E Metropolitan Area Networks, Inc.
+00035F Schuehle Mess - und. Kontrollsysteme
+000360 PAC Interactive Technology, Inc.
+000361 Widcomm, Inc.
+000362 Vodtel Communications, Inc.
+000363 Miraesys Co., Ltd.
+000364 Scenix Semiconductor, Inc.
+000365 Kira Information & Communications, Ltd.
+000366 ASM Pacific Technology
+000367 Jasmine Networks, Inc.
+000368 Embedone Co., Ltd.
+000369 Nippon Antenna Co., Ltd.
+00036A Mainnet, Ltd.
+00036B Cisco Systems, Inc.
+00036C Cisco Systems, Inc.
+00036D Runtop, Inc.
+00036E Nicon Systems (Pty) Limited
+00036F Telsey SPA
+000370 NXTV, Inc.
+000371 Acomz Networks Corp.
+000372 ULAN
+000373 Aselsan A.S
+000374 Hunter Watertech
+000375 NetMedia, Inc.
+000376 Graphtec Technology, Inc.
+000377 Gigabit Wireless
+000378 HUMAX Co., Ltd.
+000379 Proscend Communications, Inc.
+00037A Taiyo Yuden Co., Ltd.
+00037B IDEC IZUMI Corporation
+00037C Coax Media
+00037D Stellcom
+00037E PORTech Communications, Inc.
+00037F Atheros Communications, Inc.
+000381 Ingenico International
+000382 A-One Co., Ltd.
+000383 Metera Networks, Inc.
+000384 AETA
+000385 Actelis Networks, Inc.
+000386 Ho Net, Inc.
+000387 Blaze Network Products
+000388 Fastfame Technology Co., Ltd.
+000389 Plantronics
+00038A America Online, Inc.
+00038B PLUS-ONE I&T, Inc.
+00038C Total Impact
+00038D PCS Revenue Control Systems, Inc.
+00038E Atoga Systems, Inc.
+00038F Weinschel Corporation
+000390 Digital Video Communications, Inc.
+000392 Hyundai Teletek Co., Ltd.
+000393 Apple Computer, Inc.
+000394 Connect One
+000395 California Amplifier
+000396 EZ Cast Co., Ltd.
+000397 Watchfront Electronics
+000398 WISI
+000399 Dongju Informations & Communications Co., Ltd.
+00039A nSine, Ltd.
+00039B NetChip Technology, Inc.
+00039C OptiMight Communications, Inc.
+00039D Acer Communications & Multimedia, Inc.
+00039E Tera System Co., Ltd.
+00039F Cisco Systems, Inc.
+0003A0 Cisco Systems, Inc.
+0003A1 HIPER Information & Communication, Inc.
+0003A2 Catapult Communications
+0003A3 MAVIX, Ltd.
+0003A4 Data Storage and Information Management
+0003A5 Medea Corporation
+0003A7 Unixtar Technology, Inc.
+0003A8 IDOT Computers, Inc.
+0003A9 AXCENT Media AG
+0003AA Watlow
+0003AB Bridge Information Systems
+0003AC Fronius Schweissmaschinen
+0003AD Emerson Energy Systems AB
+0003AE Allied Advanced Manufacturing Pte, Ltd.
+0003AF Paragea Communications
+0003B0 Xsense Technology Corp.
+0003B1 Abbott Laboratories HPD
+0003B2 Radware
+0003B3 IA Link Systems Co., Ltd.
+0003B4 Macrotek International Corp.
+0003B5 Entra Technology Co.
+0003B6 QSI Corporation
+0003B7 ZACCESS Systems
+0003B8 NetKit Solutions, LLC
+0003B9 Hualong Telecom Co., Ltd.
+0003BA Sun Microsystems
+0003BB Signal Communications Limited
+0003BC COT GmbH
+0003BD OmniCluster Technologies, Inc.
+0003BE Netility
+0003BF Centerpoint Broadband Technologies, Inc.
+0003C0 RFTNC Co., Ltd.
+0003C1 Packet Dynamics Ltd
+0003C2 Solphone K.K.
+0003C3 Micronik Multimedia
+0003C4 Tomra Systems ASA
+0003C5 Mobotix AG
+0003C6 ICUE Systems, Inc.
+0003C7 hopf Elektronik GmbH
+0003C8 CML Emergency Services
+0003C9 TECOM Co., Ltd.
+0003CA MTS Systems Corp.
+0003CB Nippon Systems Development Co., Ltd.
+0003CC Momentum Computer, Inc.
+0003CD Clovertech, Inc.
+0003CE ETEN Technologies, Inc.
+0003CF Muxcom, Inc.
+0003D0 KOANKEISO Co., Ltd.
+0003D1 Takaya Corporation
+0003D2 Crossbeam Systems, Inc.
+0003D3 Internet Energy Systems, Inc.
+0003D4 Alloptic, Inc.
+0003D5 Advanced Communications Co., Ltd.
+0003D6 RADVision, Ltd.
+0003D7 NextNet Wireless, Inc.
+0003D8 iMPath Networks, Inc.
+0003D9 Secheron SA
+0003DA Takamisawa Cybernetics Co., Ltd.
+0003DB Apogee Electronics Corp.
+0003DC Lexar Media, Inc.
+0003DD Comark Corp.
+0003DE OTC Wireless
+0003DF Desana Systems
+0003E0 RadioFrame Networks, Inc.
+0003E1 Winmate Communication, Inc.
+0003E2 Comspace Corporation
+0003E3 Cisco Systems, Inc.
+0003E4 Cisco Systems, Inc.
+0003E5 Hermstedt SG
+0003E6 Entone Technologies, Inc.
+0003E7 Logostek Co. Ltd.
+0003E8 Wavelength Digital Limited
+0003E9 Akara Canada, Inc.
+0003EA Mega System Technologies, Inc.
+0003EB Atrica
+0003EC ICG Research, Inc.
+0003ED Shinkawa Electric Co., Ltd.
+0003EE MKNet Corporation
+0003EF Oneline AG
+0003F0 Redfern Broadband Networks
+0003F1 Cicada Semiconductor, Inc.
+0003F2 Seneca Networks
+0003F3 Dazzle Multimedia, Inc.
+0003F4 NetBurner
+0003F5 Chip2Chip
+0003F6 Allegro Networks, Inc.
+0003F7 Plast-Control GmbH
+0003F8 SanCastle Technologies, Inc.
+0003F9 Pleiades Communications, Inc.
+0003FA TiMetra Networks
+0003FB Toko Seiki Company, Ltd.
+0003FC Intertex Data AB
+0003FD Cisco Systems, Inc.
+0003FE Cisco Systems, Inc.
+0003FF Connectix
+000400 LEXMARK INTERNATIONAL, INC.
+000401 Osaki Electric Co., Ltd.
+000402 Nexsan Technologies, Ltd.
+000403 Nexsi Corporation
+000404 Makino Milling Machine Co., Ltd.
+000405 ACN Technologies
+000406 Fa. Metabox AG
+000407 Topcon Positioning Systems, Inc.
+000408 Sanko Electronics Co., Ltd.
+000409 Cratos Networks
+00040A Sage Systems
+00040B 3com Europe Ltd.
+00040C KANNO Work's Ltd.
+00040D Avaya, Inc.
+00040E AVM GmbH
+00040F Asus Network Technologies, Inc.
+000410 Spinnaker Networks, Inc.
+000411 Inkra Networks, Inc.
+000412 WaveSmith Networks, Inc.
+000413 SNOM Technology AG
+000414 Umezawa Musen Denki Co., Ltd.
+000415 Rasteme Systems Co., Ltd.
+000416 Parks S/A Comunicacoes Digitais
+000417 ELAU AG
+000418 Teltronic S.A.U.
+000419 Fibercycle Networks, Inc.
+00041A ines GmbH
+00041B Digital Interfaces Ltd.
+00041C ipDialog, Inc.
+00041D Corega of America
+00041E Shikoku Instrumentation Co., Ltd.
+00041F Sony Computer Entertainment, Inc.
+000420 Slim Devices, Inc.
+000421 Ocular Networks
+000422 Gordon Kapes, Inc.
+000423 Intel Corporation
+000424 TMC s.r.l.
+000425 Atmel Corporation
+000426 Autosys
+000427 Cisco Systems, Inc.
+000428 Cisco Systems, Inc.
+000429 Pixord Corporation
+00042A Wireless Networks, Inc.
+00042B IT Access Co., Ltd.
+00042C Minet, Inc.
+00042D Sarian Systems, Ltd.
+00042E Netous Technologies, Ltd.
+00042F International Communications Products, Inc.
+000430 Netgem
+000431 Play Industries
+000432 Voyetra Turtle Beach, Inc.
+000433 Cyberboard A/S
+000434 Accelent Systems, Inc.
+000435 Comptek International, Inc.
+000436 ELANsat Technologies, Inc.
+000437 Powin Information Technology, Inc.
+000438 Nortel Networks
+000439 Rosco Entertainment Technology, Inc.
+00043A Intelligent Telecommunications, Inc.
+00043B Lava Computer Mfg., Inc.
+00043C SONOS Co., Ltd.
+00043D INDEL AG
+00043E Telencomm
+00043F Electronic Systems Technology, Inc.
+000440 cyberPIXIE, Inc.
+000441 Half Dome Systems, Inc.
+000442 NACT
+000443 Agilent Technologies, Inc.
+000444 Wireless Home
+000445 LMS Skalar Instruments GmbH
+000446 CYZENTECH Co., Ltd.
+000447 Acrowave Systems Co., Ltd.
+000448 Polaroid Professional Imaging
+000449 Mapletree Networks
+00044A iPolicy Networks, Inc.
+00044B NVIDIA
+00044C JENOPTIK
+00044D Cisco Systems, Inc.
+00044E Cisco Systems, Inc.
+00044F Leukhardt Systemelektronik GmbH
+000450 DMD Computers SRL
+000451 Medrad, Inc.
+000452 RocketLogix, Inc.
+000453 Yotta Yotta, Inc.
+000454 Quadriga UK
+000455 ANTARA.net
+000456 PipingHot Networks
+000457 Universal Access Technology, Inc.
+000458 Fusion X Co., Ltd.
+000459 Veristar Corporation
+00045A The Linksys Group, Inc.
+00045B Techsan Electronics Co., Ltd.
+00045C Mobiwave Pte Ltd
+00045D BEKA Elektronik
+00045E Poly Trax Information Technology AG
+00045F Evalue Technology, Inc.
+000460 Knilink Technology, Inc.
+000461 EPOX Computer Co., Ltd.
+000462 DAKOS Data & Communication Co., Ltd.
+000463 Philips Communication Security & Imaging
+000464 Fantasma Networks, Inc.
+000465 ist isdn support tecknik GmbH
+000466 ARMITEL Co.
+000467 Wuhan Research Institute
+000468 Vivity, Inc.
+000469 Innocom, Inc.
+00046A Navini Networks
+00046B Palm Wireless, Inc.
+00046C Cyber Technology Co., Ltd.
+00046D Cisco Systems, Inc.
+00046E Cisco Systems, Inc.
+00046F Digitel S/A Industria Eletronica
+000470 ipUnplugged AB
+000471 IPrad
+000472 Telelynx, Inc.
+000473 Photonex Corporation
+000474 LEGRAND
+000475 3 Com Corporation
+000476 3 Com Corporation
+000477 e-Appliance Corp.
+000478 G. Star Technology Corporation
+000479 Radius Co., Ltd.
+00047A AXXESSIT ASA
+00047B Schlumberger
+00047C Skidata AG
+00047D Pelco
+00047E NKF Electronics
+00047F Chr. Mayr GmbH & Co. KG
+000480 Foundry Networks, Inc.
+000481 Econolite Control Products, Inc.
+000482 MediaLogic Corp.
+000483 Deltron Technology, Inc.
+000484 Amann GmbH
+000485 PicoLight
+000486 ITTC, University of Kansas
+000487 Cogency Semiconductor, Inc.
+000488 Eurotherm Action Incorporated.
+000489 YAFO Networks, Inc.
+00048A Temia Vertriebs GmbH
+00048B Poscon Corporation
+00048C Nayna Networks, Inc.
+00048D Tone Commander Systems, Inc.
+00048E Ohm Tech Labs, Inc.
+00048F TD Systems Corp.
+000490 Optical Access
+000491 Technovision, Inc.
+000492 Hive Internet, Ltd.
+000493 Tsinghua Unisplendour Co., Ltd.
+000494 Breezecom, Ltd.
+000495 Tejas Networks
+000496 Extreme Networks
+000497 MacroSystem Digital Video AG
+000499 Chino Corporation
+00049A Cisco Systems, Inc.
+00049B Cisco Systems, Inc.
+00049C Surgient Networks, Inc.
+00049D Ipanema Technologies
+00049E Wirelink Co., Ltd.
+00049F Metrowerks
+0004A0 Verity Instruments, Inc.
+0004A1 Pathway Connectivity
+0004A2 L.S.I. Japan Co., Ltd.
+0004A3 Microchip Technology, Inc.
+0004A4 NetEnabled, Inc.
+0004A5 Barco Projection Systems NV
+0004A6 SAF Tehnika Ltd.
+0004A7 FabiaTech Corporation
+0004A8 Broadmax Technologies, Inc.
+0004A9 SandStream Technologies, Inc.
+0004AA Jetstream Communications
+0004AB Comverse Network Systems, Inc.
+0004AC IBM CORP.
+0004AD Malibu Networks
+0004AE Liquid Metronics
+0004AF Digital Fountain, Inc.
+0004B0 ELESIGN Co., Ltd.
+0004B1 Signal Technology, Inc.
+0004B2 ESSEGI SRL
+0004B3 Videotek, Inc.
+0004B4 CIAC
+0004B5 Equitrac Corporation
+0004B6 Tellumat (Pty) Ltd.
+0004B7 AMB i.t. Holding
+0004B8 Kumahira Co., Ltd.
+0004B9 S.I. Soubou, Inc.
+0004BA KDD Media Will Corporation
+0004BB Bardac Corporation
+0004BC Giantec, Inc.
+0004BD Motorola BCS
+0004BE OptXCon, Inc.
+0004BF Versa Logic Corp.
+0004C0 Cisco Systems, Inc.
+0004C1 Cisco Systems, Inc.
+0004C2 Magnipix, Inc.
+0004C3 CASTOR Informatique
+0004C4 Allen & Health
+0004C5 ASE Technologies, USA
+0004C6 Yamaha Motor Co., Ltd.
+0004C7 NetMount
+0004C8 LIBA Maschinefabrik GmbH
+0004C9 Micro Electron Co., Ltd.
+0004CA FreeMs Corp.
+0004CB Tdsoft Communication, Ltd.
+0004CC Peek Traffic BV.
+0004CD Informedia Research Group
+0004CE Patria Ailon
+0004CF Seagate Technology
+0004D0 Softlink s.r.o.
+0004D1 Drew Technologies, Inc.
+0004D2 Adcon Telemetry AG
+0004D3 Toyokeiki Co., Ltd.
+0004D4 Proview Electronics Co., Ltd.
+0004D5 Hitachi Communication Systems, Inc.
+0004D6 Takagi Industrial Co., Ltd.
+0004D7 Omitec Instrumentation Ltd.
+0004D8 IPWireless, Inc.
+0004D9 Titan Electronics, Inc.
+0004DA Relax Technology, Inc.
+0004DB Tellus Group Corp.
+0004DC Nortel Networks
+0004DD Cisco Systems, Inc.
+0004DE Cisco Systems, Inc.
+0004DF Teracom Telematica Ltda.
+0004E0 Procket Networks
+0004E1 Infinior Microsystems
+0004E2 SMC Networks, Inc.
+0004E3 Accton Technology Corp.
+0004E4 Daeryung Ind., Inc.
+0004E5 Glonet Systems, Inc.
+0004E6 Banyan Network Private Limited
+0004E7 Lightpointe Communications, Inc
+0004E8 IER, Inc.
+0004E9 Infiniswitch Corporation
+0004EA Hewlett-Packard Company
+0004EB Paxonet Communications, Inc.
+0004EC Memobox SA
+0004ED Billion Electric Co., Ltd.
+0004EE Lincoln Electric Company
+0004EF Polestar Corp.
+0004F0 International Computers, Ltd
+0004F1 WhereNet
+0004F2 Circa Communications, Ltd.
+0004F3 FS FORTH-SYSTEME GmbH
+0004F4 Infinite Electronics Inc.
+0004F5 SnowShore Networks, Inc.
+0004F6 Amphus
+0004F7 Omega Band, Inc.
+0004F8 QUALICABLE TV Industria E Com., Ltda
+0004F9 Xtera Communications, Inc.
+0004FA MIST Inc.
+0004FB Commtech, Inc.
+0004FC Stratus Computer (DE), Inc.
+0004FD Japan Control Engineering Co., Ltd.
+0004FE Pelago Networks
+0004FF Acronet Co., Ltd.
+000500 Cisco Systems, Inc.
+000501 Cisco Systems, Inc.
+000502 APPLE COMPUTER
+000503 ICONAG
+000504 Naray Information & Communication Enterprise
+000505 Systems Integration Solutions, Inc.
+000506 Reddo Networks AB
+000507 Fine Appliance Corp.
+000508 Inetcam, Inc.
+000509 AVOC Nishimura Ltd.
+00050A ICS Spa
+00050B SICOM Systems, Inc.
+00050C Network Photonics, Inc.
+00050D Midstream Technologies, Inc.
+00050E 3ware, Inc.
+00050F Tanaka S/S Ltd.
+000510 Infinite Shanghai Communication Terminals Ltd.
+000511 Complementaty Technologies Ltd
+000512 MeshNetworks, Inc.
+000513 VTLinx Multimedia Systems, Inc.
+000514 KDT Systems Co., Ltd.
+000515 Nuark Co., Ltd.
+000516 SMART Modular Technologies
+000517 Shellcomm, Inc.
+000518 Jupiters Technology
+000519 Siemens Building Technologies AG,
+00051A 3Com Europe Ltd.
+00051B Magic Control Technology Corporation
+00051C Xnet Technology Corp.
+00051D Airocon, Inc.
+00051E Rhapsody Networks
+00051F Taijin Media Co., Ltd.
+000520 Smartronix, Inc.
+000521 Control Microsystems
+000522 LEA*D Corporation, Inc.
+000523 AVL List GmbH
+000524 BTL System (HK) Limited
+000525 Puretek Industrial Co., Ltd.
+000526 IPAS GmbH
+000527 SJ Tek Co. Ltd
+000528 New Focus, Inc.
+000529 Shanghai Broadan Communication Technology Co., Ltd
+00052A Ikegami Tsushinki Co., Ltd.
+00052B HORIBA, Ltd.
+00052C Supreme Magic Corporation
+00052D Zoltrix International Limited
+00052E Cinta Networks
+00052F Leviton Voice and Data
+000530 Andiamo Systems, Inc.
+000531 Cisco Systems, Inc.
+000532 Cisco Systems, Inc.
+000533 Sanera Systems, Inc.
+000534 Northstar Engineering Ltd.
+000535 Chip PC Ltd.
+000536 Danam Communications, Inc.
+000537 Nets Technology Co., Ltd.
+000538 Merilus, Inc.
+000539 A Brand New World in Sweden AB
+00053A Willowglen Services Pte Ltd
+00053B Harbour Networks Ltd., Co. Beijing
+00053C Xircom
+00053D Agere Systems
+00053E KID Systeme GmbH
+00053F VisionTek, Inc.
+000540 FAST Corporation
+000541 Advanced Systems Co., Ltd.
+000542 Otari, Inc.
+000543 IQ Wireless GmbH
+000544 Valley Technologies, Inc.
+000545 Internet Photonics
+000546 KDD Network Systems Co., Ltd.
+000547 Starent Networks
+000548 Disco Corporation
+000549 Salira Optical Network Systems
+00054A Ario Data Networks, Inc.
+00054B Micro Innovation AG
+00054C RF Innovations Pty Ltd
+00054D Brans Technologies, Inc.
+00054E Philips Components
+000550 Digi-Tech Communications Limited
+000551 F & S Elektronik Systeme GmbH
+000552 Xycotec Computer GmbH
+000553 DVC Company, Inc.
+000554 Rangestar Wireless
+000555 Japan Cash Machine Co., Ltd.
+000556 360 Systems
+000557 Agile TV Corporation
+000558 Synchronous, Inc.
+000559 Intracom S.A.
+00055A Power Dsine Ltd.
+00055B Charles Industries, Ltd.
+00055C Kowa Company, Ltd.
+00055D D-Link Systems, Inc.
+00055E Cisco Systems, Inc.
+00055F Cisco Systems, Inc.
+000560 LEADER COMM.CO., LTD
+000561 nac Image Technology, Inc.
+000562 Digital View Limited
+000563 J-Works, Inc.
+000564 Tsinghua Bitway Co., Ltd.
+000565 Tailyn Communication Company Ltd.
+000566 Secui.com Corporation
+000567 Etymonic Design, Inc.
+000568 Piltofish Networks AB
+000569 VMWARE, Inc.
+00056B C.P. Technology Co., Ltd.
+00056C Hung Chang Co., Ltd.
+00056D Pacific Corporation
+00056E National Enhance Technology, Inc.
+00056F Innomedia Technologies Pvt. Ltd.
+000570 Baydel Ltd.
+000571 Seiwa Electronics Co.
+000572 Deonet Co., Ltd.
+000573 Cisco Systems, Inc.
+000574 Cisco Systems, Inc.
+000575 CDS-Electronics BV
+000576 NSM Technology Ltd.
+000577 SM Information & Communication
+000579 Universal Control Solution Corp.
+00057A Hatteras Networks
+00057B Chung Nam Electronic Co., Ltd.
+00057C RCO Security AB
+00057D Sun Communications, Inc.
+00057E Eckelmann Steuerungstechnik GmbH
+00057F Acqis Technology
+000580 Fibrolan Ltd.
+000581 Snell & Wilcox Ltd.
+000582 ClearCube Technology
+000583 ImageCom Limited
+000584 AbsoluteValue Systems, Inc.
+000585 Juniper Networks, Inc.
+000586 Lucent Technologies
+000587 Locus, Incorporated
+000588 Sensoria Corp.
+000589 National Datacomputer
+00058A Netcom Co., Ltd.
+00058B IPmental, Inc.
+00058C Opentech Inc.
+00058D Lynx Photonic Networks, Inc.
+00058E Ahead Communications System GmbH
+00058F CLCsoft co.
+000590 Ascom Business Systems
+000591 Active Silicon Ltd.
+000592 Pultex Corp.
+000593 Grammar Engine Inc.
+000594 IXXAT Automation GmbH
+000595 Alesis Corporation
+000596 Genotech Co., Ltd.
+000597 Eagle Traffic Control Systems
+000598 CRONOS S.r.l.
+000599 PEI Electronics, Inc.
+00059A Cisco Systems, Inc.
+00059B Cisco Systems, Inc.
+00059C Kleinknecht GmbH, Ing. Buero
+00059D Daniel Computing Systems, Inc.
+00059E Zinwell Corporation
+00059F Yotta Networks, Inc.
+0005A0 MOBILINE Kft.
+0005A1 Zenocom
+0005A2 CELOX Networks
+0005A3 QEI, Inc.
+0005A4 Lucid Voice Ltd.
+0005A5 KOTT
+0005A6 Extron Electronics
+0005A7 Hyperchip, Inc.
+0005A8 WYLE ELECTRONICS
+0005A9 Princeton Networks, Inc.
+0005AA Moore Industries Int.
+0005AB Cyber Fone, Inc.
+0005AC Northern Digital, Inc.
+0005AD Topspin Communications, Inc.
+0005AE Mediaport USA
+0005AF InnoScan Computing A/S
+0005B0 Korea Computer Technology Co., Ltd.
+0005B1 ASB Technology BV
+0005B2 Medison Co., Ltd.
+0005B3 Asahi-Engineering Co., Ltd.
+0005B4 Aceex Corporation
+0005B5 Broadcom Technologies
+0005B6 INSYS Microelectronics GmbH
+0005B7 Arbor Technology Corp.
+0005B8 Electronic Design Associates, Inc.
+0005B9 Airvana, Inc.
+0005BA Area Netwoeks, Inc.
+0005BC Resorsys Ltd.
+0005BD ROAX BV
+0005BE Kongsberg Seatex AS
+0005BF JustEzy Technology, Inc.
+0005C0 Digital Network Alacarte Co., Ltd.
+0005C1 A-Kyung Motion, Inc.
+0005C2 Digital Archway, Inc.
+0005C3 Pacific Instruments, Inc.
+0005C4 Telect, Inc.
+0005C5 Flaga HF
+0005C6 Triz Communications
+0005C7 I/F-COM A/S
+0005C8 VERYTECH
+0005C9 LG Innotek
+0005CA Hitron Technology, Inc.
+0005CB ROIS Technologies, Inc.
+0005CC Sumtel Communications, Inc.
+0005CD Nippon Columbia
+0005CE Prolink Microsystems Corporation
+0005CF Thunder River Technologies, Inc.
+0005D0 Solinet Systems
+0005D1 Metavector Technologies
+0005D2 DAP Technologies
+0005D3 CAC, Inc.
+0005D4 FutureSmart Networks, Inc.
+0005D5 Speedcom Wireless
+0005D6 Titan Wireless
+0005D7 Vista Imaging, Inc.
+0005D8 Arescom, Inc.
+0005D9 Techno Valley, Inc.
+0005DA Apex Automationstechnik
+0005DB Nentec GmbH
+0005DC Cisco Systems, Inc.
+0005DD Cisco Systems, Inc.
+0005DE Gi Fone Korea, Inc.
+0005DF Electronic Innovation, Inc.
+0005E0 Empirix Corp.
+0005E1 Trellis Photonics, Ltd.
+0005E2 Creativ Network Technologies
+0005E3 LightSand Communications, Inc.
+0005E4 Red Lion Controls L.P.
+0005E5 Renishaw PLC
+0005E6 Egenera, Inc.
+0005E7 Netrake
+0005E8 TurboWave, Inc.
+0005E9 Unicess Networks, Inc.
+0005EA Viewcast Corporation
+0005EB Blue Ridge Networks, Inc.
+0005EC Mosaic Systems Inc.
+0005ED Technikum Joanneaum GmbH
+0005EE BEWATOR Group
+0005EF ADOIR Digital Technology
+0005F0 SATEC
+0005F1 VRcom, Inc.
+0005F2 Power R, Inc.
+0005F3 Weboyn
+0005F4 SystemBase Co., Ltd.
+0005F5 OYO Geospace Corp.
+0005F6 Young Chang Co. Ltd.
+0005F7 Analog Devices, Inc.
+0005F8 Real Time Access, Inc.
+0005F9 Diva Systems
+0005FA IPOptical, Inc.
+0005FB Sharegate
+0005FC Schenck Pegasus Corp.
+0005FD PacketLight Networks Ltd.
+0005FE Traficon N.V.
+0005FF SNS Solutions, Inc.
+000600 Tokyo Electronic Industry Co., Ltd.
+000601 Otanikeiki Co., Ltd.
+000602 Cirkitech Electronics Co.
+000603 Baker Hughes
+000604 @Track Communications, Inc.
+000605 Inncom International, Inc.
+000606 RapidWan, Inc.
+000607 Omni-Directional Control Technology Inc.
+000608 At-Sky SAS
+000609 Crossport Systems
+00060A Blue2space.com
+00060B Paceline Systems Corporation
+00060C Melco Industries, Inc.
+00060D Wave7 Optics
+00060E IGSYS Systems, Inc.
+00060F Narad Networks Inc
+000610 Abeona Networks Inc
+000611 Zeus Wireless, Inc.
+000612 Accusys, Inc.
+000613 Kawasaki Steel Corporation
+000614 Prism Holdings
+000615 Kimoto Electric Co., Ltd.
+000616 Tel Net Co., Ltd.
+000617 Redswitch Inc.
+000618 DigiPower Manufacturing Inc.
+000619 Connection Technology Systems
+00061A Zetari Inc.
+00061B Portable Systems, IBM Japan Co, Ltd
+00061C Hoshino Metal Industries, Ltd.
+00061D MIP Telecom, Inc.
+00061E Maxan Systems
+00061F Vision Components GmbH
+000620 Serial System Ltd.
+000621 Hinox, Co., Ltd.
+000622 Chung Fu Chen Yeh Enterprise Corp.
+000623 MGE UPS Systems France
+000624 Gentner Communications
+000625 The Linksys Group, Inc.
+000626 MWE GmbH
+000627 Uniwide Technologies, Inc.
+000628 Cisco Systems, Inc.
+000629 IBM CORPORATION
+00062A Cisco Systems, Inc.
+00062B INTRASERVER TECHNOLOGY
+00062C Network Robots, Inc.
+00062D TouchStar Technologies, L.L.C.
+00062E Aristos Logic Corp.
+00062F Pivotech Systems Inc.
+000630 Adtranz Sweden
+000631 Optical Solutions, Inc.
+000632 Mesco Engineering GmbH
+000633 Heimann Biometric Systems GmbH
+000634 GTE Airfone Inc.
+000635 PacketAir Networks, Inc.
+000636 Jedai Broadband Networks
+000637 Toptrend-Meta Information (ShenZhen) Inc.
+000638 Sungjin C&C Co., Ltd.
+000639 Newtec
+00063A Dura Micro, Inc.
+00063B Lineo Canada Corp.
+00063C NMI Electronics Ltd
+00063D Microwave Data Systems Inc.
+00063E Opthos Inc.
+00063F Everex Communications Inc.
+000640 White Rock Networks
+000641 ITCN
+000642 Genetel Systems Inc.
+000643 SONO Computer Co., Ltd.
+000644 NEIX Inc.
+000645 Meisei Electric Co. Ltd.
+000646 ShenZhen XunBao Network Technology Co Ltd
+000647 Etrali S.A.
+000648 Seedsware, Inc.
+000649 Quante
+00064A Honeywell Co., Ltd. (KOREA)
+00064B Alexon Co., Ltd.
+00064C Invicta Networks, Inc.
+00064D Sencore
+00064E Broad Net Technology Inc.
+00064F PRO-NETS Technology Corporation
+000650 Tiburon Networks, Inc.
+000651 Aspen Networks Inc.
+000652 Cisco Systems, Inc.
+000653 Cisco Systems, Inc.
+000654 Maxxio Technologies
+000655 Yipee, Inc.
+000656 Tactel AB
+000657 Market Central, Inc.
+000658 Helmut Fischer GmbH & Co. KG
+000659 EAL (Apeldoorn) B.V.
+00065A Strix Systems
+00065B Dell Computer Corp.
+00065C Malachite Technologies, Inc.
+00065D Heidelberg Web Systems
+00065E Photuris, Inc.
+00065F ECI Telecom - NGTS Ltd.
+000660 NADEX Co., Ltd.
+000661 NIA Home Technologies Corp.
+000662 MBM Technology Ltd.
+000663 Human Technology Co., Ltd.
+000664 Fostex Corporation
+000665 Summy Gikem, Inc.
+000666 Roving Networks
+000667 Tripp Lite
+000668 Vicon Industries Inc.
+000669 Datasound Laboratories Ltd
+00066A InfiniCon Systems, Inc.
+00066B Sysmex Corporation
+00066C Robinson Corporation
+00066D Compuprint S.P.A.
+00066E Delta Electronics, Inc.
+00066F Korea Data Systems
+000670 Upponetti Oy
+000671 Softing AG
+000672 Netezza
+000673 Optelecom, Inc.
+000674 Spectrum Control, Inc.
+000675 Banderacom, Inc.
+000676 Novra Technologies, Inc.
+000677 SICK AG
+000678 Marantz Japan, Inc.
+000679 Konami Corporation
+00067A JMP Systems
+00067B Toplink C&C Corporation
+00067C CISCO SYSTEMS, INC.
+00067D Takasago Ltd.
+0006C1 CISCO SYSTEMS, INC.
+000701 RACAL-DATACOM
+000800 MULTITECH SYSTEMS, INC.
+0008C7 COMPAQ COMPUTER CORPORATION
+000A27 Apple Computer, Inc.
+001000 CABLE TELEVISION
+001001 MCK COMMUNICATIONS
+001002 ACTIA
+001003 IMATRON, INC.
+001004 THE BRANTLEY COILE COMPANY,INC
+001005 UEC COMMERCIAL
+001006 RACAL RECORDERS LTD.
+001007 CISCO SYSTEMS, INC.
+001008 VIENNA SYSTEMS CORPORATION
+001009 HORO QUARTZ
+00100A WILLIAMS COMMUNICATIONS GROUP
+00100B CISCO SYSTEMS, INC.
+00100C ITO CO., LTD.
+00100D CISCO SYSTEMS, INC.
+00100E MICRO LINEAR COPORATION
+00100F INDUSTRIAL CPU SYSTEMS
+001010 INITIO CORPORATION
+001011 CISCO SYSTEMS, INC.
+001012 PROCESSOR SYSTEMS (I) PVT LTD
+001013 INDUSTRIAL COMPUTER SOURCE
+001014 CISCO SYSTEMS, INC.
+001015 OOMON INC.
+001016 T.SQWARE
+001017 MICOS GMBH
+001018 BROADCOM CORPORATION
+001019 SIRONA DENTAL SYSTEMS
+00101A PICTURETEL CORP.
+00101B CORNET TECHNOLOGY, INC.
+00101C OHM TECHNOLOGIES INTL, LLC
+00101D WINBOND ELECTRONICS CORP.
+00101E MATSUSHITA ELECTRONIC
+00101F CISCO SYSTEMS, INC.
+001020 WELCH ALLYN, DATA COLLECTION
+001021 ENCANTO NETWORKS, INC.
+001022 SATCOM MEDIA CORPORATION
+001023 FLOWWISE NETWORKS, INC.
+001024 NAGOYA ELECTRIC WORKS CO., LTD
+001025 GRAYHILL INC.
+001026 ACCELERATED NETWORKS, INC.
+001027 L-3 COMMUNICATIONS EAST
+001028 COMPUTER TECHNICA, INC.
+001029 CISCO SYSTEMS, INC.
+00102A ZF MICROSYSTEMS, INC.
+00102B UMAX DATA SYSTEMS, INC.
+00102C Lasat Networks A/S
+00102D HITACHI SOFTWARE ENGINEERING
+00102E NETWORK SYSTEMS & TECHNOLOGIES
+00102F CISCO SYSTEMS, INC.
+001030 WI-LAN, INC.
+001031 OBJECTIVE COMMUNICATIONS, INC.
+001032 ALTA TECHNOLOGY
+001033 ACCESSLAN COMMUNICATIONS, INC.
+001034 GNP COMPUTERS
+001035 ELITEGROUP COMPUTER
+001036 INTER-TEL INTEGRATED SYSTEMS
+001037 CYQ'VE TECHNOLOGY CO., LTD.
+001038 MICRO RESEARCH INSTITUTE, INC.
+001039 VECTRON SYSTEMS GMBH
+00103A DIAMOND NETWORK TECH
+00103B HIPPI NETWORKING FORUM
+00103C IC ENSEMBLE, INC.
+00103D PHASECOM, LTD.
+00103E NETSCHOOLS CORPORATION
+00103F TOLLGRADE COMMUNICATIONS, INC.
+001040 INTERMEC CORPORATION
+001041 BRISTOL BABCOCK, INC.
+001042 ALACRITECH
+001043 A2 CORPORATION
+001044 INNOLABS CORPORATION
+001045 Nortel Networks
+001046 ALCORN MCBRIDE INC.
+001047 ECHO ELETRIC CO. LTD.
+001048 HTRC AUTOMATION, INC.
+001049 SHORELINE TELEWORKS, INC.
+00104A THE PARVUC CORPORATION
+00104B 3COM CORPORATION
+00104C COMPUTER ACCESS TECHNOLOGY
+00104D SURTEC INDUSTRIES, INC.
+00104E CEOLOGIC
+00104F STORAGE TECHNOLOGY CORPORATION
+001050 RION CO., LTD.
+001051 CMICRO CORPORATION
+001052 METTLER-TOLEDO (ALBSTADT) GMBH
+001053 COMPUTER TECHNOLOGY CORP.
+001054 CISCO SYSTEMS, INC.
+001055 FUJITSU MICROELECTRONICS, INC.
+001056 SODICK CO., LTD.
+001057 Rebel.com, Inc.
+001058 ARROWPOINT COMMUNICATIONS,INC.
+001059 DIABLO RESEARCH CO. LLC
+00105A 3COM CORPORATION
+00105B NET INSIGHT AB
+00105C QUANTUM DESIGNS (H.K.) LTD.
+00105D DRAGER, BUSINESS UNIT
+00105E HEKIMIAN LABORATORIES, INC.
+00105F IN-SNEC
+001060 BILLIONTON SYSTEMS, INC.
+001061 HOSTLINK CORP.
+001062 NX SERVER, ILNC.
+001063 STARGUIDE DIGITAL NETWORKS
+001064 DIGITAL EQUIPMENT CORP.
+001065 RADYNE CORPORATION
+001066 ADVANCED CONTROL SYSTEMS, INC.
+001067 REDBACK NETWORKS, INC.
+001068 COMOS TELECOM
+001069 HELIOSS COMMUNICATIONS, INC.
+00106A DIGITAL MICROWAVE CORPORATION
+00106B SONUS NETWORKS, INC.
+00106C INFRATEC PLUS GMBH
+00106D INTEGRITY COMMUNICATIONS, INC.
+00106E TADIRAN COM. LTD.
+00106F TRENTON TECHNOLOGY INC.
+001070 CARADON TREND LTD.
+001071 ADVANET INC.
+001072 GVN TECHNOLOGIES, INC.
+001073 TECHNOBOX, INC.
+001074 ATEN INTERNATIONAL CO., LTD.
+001075 Maxtor Corporation
+001076 EUREM GMBH
+001077 SAF DRIVE SYSTEMS, LTD.
+001078 NUERA COMMUNICATIONS, INC.
+001079 CISCO SYSTEMS, INC.
+00107A AMBICOM, INC.
+00107B CISCO SYSTEMS, INC.
+00107C P-COM, INC.
+00107D AURORA COMMUNICATIONS, LTD.
+00107E BACHMANN ELECTRONIC GMBH
+00107F CRESTRON ELECTRONICS, INC.
+001080 METAWAVE COMMUNICATIONS
+001081 DPS, INC.
+001082 JNA TELECOMMUNICATIONS LIMITED
+001083 HEWLETT-PACKARD COMPANY
+001084 K-BOT COMMUNICATIONS
+001085 POLARIS COMMUNICATIONS, INC.
+001086 ATTO TECHNOLOGY, INC.
+001087 Xstreamis PLC
+001088 AMERICAN NETWORKS INC.
+001089 WEBSONIC
+00108A TERALOGIC, INC.
+00108B LASERANIMATION SOLLINGER GMBH
+00108C FUJITSU TELECOMMUNICATIONS
+00108D JOHNSON CONTROLS, INC.
+00108E HUGH SYMONS CONCEPT
+00108F RAPTOR SYSTEMS
+001090 CIMETRICS, INC.
+001091 NO WIRES NEEDED BV
+001092 NETCORE INC.
+001093 CMS COMPUTERS, LTD.
+001094 ADTECH, INC.
+001095 THOMSON CONSUMER ELECTRONICS
+001096 TRACEWELL SYSTEMS, INC.
+001097 WINNET METROPOLITAN
+001098 STARNET TECHNOLOGIES, INC.
+001099 INNOMEDIA, INC.
+00109A NETLINE
+00109B VIXEL CORPORATION
+00109C M-SYSTEM CO., LTD.
+00109D CLARINET SYSTEMS, INC.
+00109E AWARE, INC.
+00109F PAVO, INC.
+0010A0 INNOVEX TECHNOLOGIES, INC.
+0010A1 KENDIN SEMICONDUCTOR, INC.
+0010A2 TNS
+0010A3 OMNITRONIX, INC.
+0010A4 XIRCOM
+0010A5 OXFORD INSTRUMENTS
+0010A6 CISCO SYSTEMS, INC.
+0010A7 UNEX TECHNOLOGY CORPORATION
+0010A8 RELIANCE COMPUTER CORP.
+0010A9 ADHOC TECHNOLOGIES
+0010AA MEDIA4, INC.
+0010AB KOITO INDUSTRIES, LTD.
+0010AC IMCI TECHNOLOGIES
+0010AD SOFTRONICS USB, INC.
+0010AE SHINKO ELECTRIC INDUSTRIES CO.
+0010AF TAC SYSTEMS, INC.
+0010B0 MERIDIAN TECHNOLOGY CORP.
+0010B1 FOR-A CO., LTD.
+0010B2 COACTIVE AESTHETICS
+0010B3 NOKIA MULTIMEDIA TERMINALS
+0010B4 ATMOSPHERE NETWORKS
+0010B5 ACCTON TECHNOLOGY CORPORATION
+0010B6 ENTRATA COMMUNICATIONS CORP.
+0010B7 COYOTE TECHNOLOGIES, LLC
+0010B8 ISHIGAKI COMPUTER SYSTEM CO.
+0010B9 MAXTOR CORP.
+0010BA MARTINHO-DAVIS SYSTEMS, INC.
+0010BB DATA & INFORMATION TECHNOLOGY
+0010BC Nortel Networks
+0010BD THE TELECOMMUNICATION
+0010BE TELEXIS CORP.
+0010BF INTER AIR WIRELESS
+0010C0 ARMA, INC.
+0010C1 OI ELECTRIC CO., LTD.
+0010C2 WILLNET, INC.
+0010C3 CSI-CONTROL SYSTEMS
+0010C4 MEDIA LINKS CO., LTD.
+0010C5 PROTOCOL TECHNOLOGIES, INC.
+0010C6 USI
+0010C7 DATA TRANSMISSION NETWORK
+0010C8 COMMUNICATIONS ELECTRONICS
+0010C9 MITSUBISHI ELECTRONICS
+0010CA INTEGRAL ACCESS
+0010CB FACIT K.K.
+0010CC CLP COMPUTER LOGISTIK
+0010CD INTERFACE CONCEPT
+0010CE VOLAMP, LTD.
+0010CF FIBERLANE COMMUNICATIONS
+0010D0 WITCOM, LTD.
+0010D1 Top Layer Networks, Inc.
+0010D2 NITTO TSUSHINKI CO., LTD
+0010D3 GRIPS ELECTRONIC GMBH
+0010D4 STORAGE COMPUTER CORPORATION
+0010D5 IMASDE CANARIAS, S.A.
+0010D6 ITT A/CD
+0010D7 ARGOSY RESEARCH INC.
+0010D8 CALISTA
+0010D9 IBM JAPAN, FUJISAWA MT+D
+0010DA MOTION ENGINEERING, INC.
+0010DB NETSCREEN TECHNOLOGIES, INC.
+0010DC MICRO-STAR INTERNATIONAL
+0010DD ENABLE SEMICONDUCTOR, INC.
+0010DE INTERNATIONAL DATACASTING
+0010DF RISE COMPUTER INC.
+0010E0 COBALT MICROSERVER, INC.
+0010E1 S.I. TECH, INC.
+0010E2 ARRAYCOMM, INC.
+0010E3 COMPAQ COMPUTER CORPORATION
+0010E4 NSI CORPORATION
+0010E5 SOLECTRON TEXAS
+0010E6 APPLIED INTELLIGENT
+0010E7 BREEZECOM
+0010E8 TELOCITY, INCORPORATED
+0010E9 RAIDTEC LTD.
+0010EA ADEPT TECHNOLOGY
+0010EB SELSIUS SYSTEMS, ILNC.
+0010EC RPCG, LLC
+0010ED SUNDANCE TECHNOLOGY, INC.
+0010EE CTI PRODUCTS, INC.
+0010EF DB NETWORKS, INC.
+0010F0 RITTAL-WERK RUDOLF LOH
+0010F1 I-O CORPORATION
+0010F2 ANTEC
+0010F3 NEXCOM INTERNATIONAL CO., LTD.
+0010F4 VERTICAL NETWORKS, INC.
+0010F5 AMHERST SYSTEMS, INC.
+0010F6 CISCO SYSTEMS, INC.
+0010F7 IRIICHI TECHNOLOGIES
+0010F8 KENWOOD TMI CORPORATION
+0010F9 UNIQUE SYSTEMS, INC.
+0010FA ZAYANTE, INC.
+0010FB ZIDA TECHNOLOGIES LIMITED
+0010FC BROADBAND NETWORKS, INC.
+0010FD COCOM A/S
+0010FE DIGITAL EQUIPMENT CORPORATION
+0010FF CISCO SYSTEMS, INC.
+001C7C PERQ SYSTEMS CORPORATION
+002000 LEXMARK INTERNATIONAL, INC.
+002001 DSP SOLUTIONS, INC.
+002002 SERITECH ENTERPRISE CO., LTD.
+002003 PIXEL POWER LTD.
+002004 YAMATAKE-HONEYWELL CO., LTD.
+002005 SIMPLE TECHNOLOGY
+002006 GARRETT COMMUNICATIONS, INC.
+002007 SFA, INC.
+002008 CABLE & COMPUTER TECHNOLOGY
+002009 PACKARD BELL ELEC., INC.
+00200A SOURCE-COMM CORP.
+00200B OCTAGON SYSTEMS CORP.
+00200C ADASTRA SYSTEMS CORP.
+00200D CARL ZEISS
+00200E SATELLITE TECHNOLOGY MGMT, INC
+00200F TANBAC CO., LTD.
+002010 JEOL SYSTEM TECHNOLOGY CO. LTD
+002011 CANOPUS CO., LTD.
+002012 CAMTRONICS MEDICAL SYSTEMS
+002013 DIVERSIFIED TECHNOLOGY, INC.
+002014 GLOBAL VIEW CO., LTD.
+002015 ACTIS COMPUTER SA
+002016 SHOWA ELECTRIC WIRE & CABLE CO
+002017 ORBOTECH
+002018 CIS TECHNOLOGY INC.
+002019 OHLER GMBH
+00201A N-BASE SWITCH COMMUNICATIONS
+00201B NORTHERN TELECOM/NETWORK
+00201C EXCEL, INC.
+00201D KATANA PRODUCTS
+00201E NETQUEST CORPORATION
+00201F BEST POWER TECHNOLOGY, INC.
+002020 MEGATRON COMPUTER INDUSTRIES
+002021 ALGORITHMS SOFTWARE PVT. LTD.
+002022 TEKNIQUE, INC.
+002023 T.C. TECHNOLOGIES PTY. LTD
+002024 PACIFIC COMMUNICATION SCIENCES
+002025 CONTROL TECHNOLOGY, INC.
+002026 AMKLY SYSTEMS, INC.
+002027 MING FORTUNE INDUSTRY CO., LTD
+002028 WEST EGG SYSTEMS, INC.
+002029 TELEPROCESSING PRODUCTS, INC.
+00202A N.V. DZINE
+00202B ADVANCED TELECOMMUNICATIONS
+00202C WELLTRONIX CO., LTD.
+00202D TAIYO CORPORATION
+00202E DAYSTAR DIGITAL
+00202F ZETA COMMUNICATIONS, LTD.
+002030 ANALOG & DIGITAL SYSTEMS
+002031 ERTEC GMBH
+002032 ALCATEL TAISEL
+002033 SYNAPSE TECHNOLOGIES, INC.
+002034 ROTEC INDUSTRIEAUTOMATION GMBH
+002035 IBM CORPORATION
+002036 BMC SOFTWARE
+002037 SEAGATE TECHNOLOGY
+002038 VME MICROSYSTEMS INTERNATIONAL
+002039 SCINETS
+00203A DIGITAL BI0METRICS INC.
+00203B WISDM LTD.
+00203C EUROTIME AB
+00203D NOVAR ELECTRONICS CORPORATION
+00203E LOGICAN TECHNOLOGIES, INC.
+00203F JUKI CORPORATION
+002040 Motorola Broadband Communications Sector
+002041 DATA NET
+002042 DATAMETRICS CORP.
+002043 NEURON COMPANY LIMITED
+002044 GENITECH PTY LTD
+002045 ION Networks, Inc.
+002046 CIPRICO, INC.
+002047 STEINBRECHER CORP.
+002048 Marconi Communications
+002049 COMTRON, INC.
+00204A PRONET GMBH
+00204B AUTOCOMPUTER CO., LTD.
+00204C MITRON COMPUTER PTE LTD.
+00204D INOVIS GMBH
+00204E NETWORK SECURITY SYSTEMS, INC.
+00204F DEUTSCHE AEROSPACE AG
+002050 KOREA COMPUTER INC.
+002051 PHOENIX DATA COMMUNUNICATIONS
+002052 RAGULA SYSTEMS
+002053 HUNTSVILLE MICROSYSTEMS, INC.
+002054 EASTERN RESEARCH, INC.
+002055 ALTECH CO., LTD.
+002056 NEOPRODUCTS
+002057 TITZE DATENTECHNIK GMBH
+002058 ALLIED SIGNAL INC.
+002059 MIRO COMPUTER PRODUCTS AG
+00205A COMPUTER IDENTICS
+00205B SKYLINE TECHNOLOGY
+00205C INTERNET SYSTEMS/ FLORIDA INC.
+00205D NANOMATIC OY
+00205E CASTLE ROCK, INC.
+00205F GAMMADATA COMPUTER GMBH
+002060 ALCATEL ITALIA S.P.A.
+002061 DYNATECH COMMUNICATIONS, INC.
+002062 SCORPION LOGIC, LTD.
+002063 WIPRO INFOTECH LTD.
+002064 PROTEC MICROSYSTEMS, INC.
+002065 SUPERNET NETWORKING INC.
+002066 GENERAL MAGIC, INC.
+002068 ISDYNE
+002069 ISDN SYSTEMS CORPORATION
+00206A OSAKA COMPUTER CORP.
+00206B MINOLTA CO., LTD.
+00206C EVERGREEN TECHNOLOGY CORP.
+00206D DATA RACE, INC.
+00206E XACT, INC.
+00206F FLOWPOINT CORPORATION
+002070 HYNET, LTD.
+002071 IBR GMBH
+002072 WORKLINK INNOVATIONS
+002073 FUSION SYSTEMS CORPORATION
+002074 SUNGWOON SYSTEMS
+002075 MOTOROLA COMMUNICATION ISRAEL
+002076 REUDO CORPORATION
+002077 KARDIOS SYSTEMS CORP.
+002078 RUNTOP, INC.
+002079 MIKRON GMBH
+00207A WISE COMMUNICATIONS, INC.
+00207B LEVEL ONE COMMUNICATIONS
+00207C AUTEC GMBH
+00207D ADVANCED COMPUTER APPLICATIONS
+00207E FINECOM CO., LTD.
+00207F KYOEI SANGYO CO., LTD.
+002080 SYNERGY (UK) LTD.
+002081 TITAN ELECTRONICS
+002082 ONEAC CORPORATION
+002083 PRESTICOM INCORPORATED
+002084 OCE PRINTING SYSTEMS, GMBH
+002085 EXIDE ELECTRONICS
+002086 MICROTECH ELECTRONICS LIMITED
+002087 MEMOTEC COMMUNICATIONS CORP.
+002088 GLOBAL VILLAGE COMMUNICATION
+002089 T3PLUS NETWORKING, INC.
+00208A SONIX COMMUNICATIONS, LTD.
+00208B LAPIS TECHNOLOGIES, INC.
+00208C GALAXY NETWORKS, INC.
+00208D CMD TECHNOLOGY
+00208E CHEVIN SOFTWARE ENG. LTD.
+00208F ECI TELECOM LTD.
+002090 ADVANCED COMPRESSION
+002091 J125, NATIONAL SECURITY AGENCY
+002092 CHESS ENGINEERING B.V.
+002093 LANDINGS TECHNOLOGY CORP.
+002094 CUBIX CORPORATION
+002095 RIVA ELECTRONICS
+002096 SIEBE ENVIRONMENTAL CONTROLS
+002097 APPLIED SIGNAL TECHNOLOGY
+002098 HECTRONIC AB
+002099 BON ELECTRIC CO., LTD.
+00209A THE 3DO COMPANY
+00209B ERSAT ELECTRONIC GMBH
+00209C PRIMARY ACCESS CORP.
+00209D LIPPERT AUTOMATIONSTECHNIK
+00209E BROWN'S OPERATING SYSTEM
+00209F MERCURY COMPUTER SYSTEMS, INC.
+0020A0 OA LABORATORY CO., LTD.
+0020A1 DOVATRON
+0020A2 GALCOM NETWORKING LTD.
+0020A3 DIVICOM INC.
+0020A4 MULTIPOINT NETWORKS
+0020A5 API ENGINEERING
+0020A6 PROXIM, INC.
+0020A7 PAIRGAIN TECHNOLOGIES, INC.
+0020A8 SAST TECHNOLOGY CORP.
+0020A9 WHITE HORSE INDUSTRIAL
+0020AA DIGIMEDIA VISION LTD.
+0020AB MICRO INDUSTRIES CORP.
+0020AC INTERFLEX DATENSYSTEME GMBH
+0020AD LINQ SYSTEMS
+0020AE ORNET DATA COMMUNICATION TECH.
+0020AF 3COM CORPORATION
+0020B0 GATEWAY DEVICES, INC.
+0020B1 COMTECH RESEARCH INC.
+0020B2 GKD GESELLSCHAFT FUR
+0020B3 SCLTEC COMMUNICATIONS SYSTEMS
+0020B4 TERMA ELEKTRONIK AS
+0020B5 YASKAWA ELECTRIC CORPORATION
+0020B6 AGILE NETWORKS, INC.
+0020B7 NAMAQUA COMPUTERWARE
+0020B8 PRIME OPTION, INC.
+0020B9 METRICOM, INC.
+0020BA CENTER FOR HIGH PERFORMANCE
+0020BB ZAX CORPORATION
+0020BC JTEC PTY LTD.
+0020BD NIOBRARA R & D CORPORATION
+0020BE LAN ACCESS CORP.
+0020BF AEHR TEST SYSTEMS
+0020C0 PULSE ELECTRONICS, INC.
+0020C1 TAIKO ELECTRIC WORKS, LTD.
+0020C2 TEXAS MEMORY SYSTEMS, INC.
+0020C3 COUNTER SOLUTIONS LTD.
+0020C4 INET,INC.
+0020C5 EAGLE TECHNOLOGY
+0020C6 NECTEC
+0020C7 AKAI Professional M.I. Corp.
+0020C8 LARSCOM INCORPORATED
+0020C9 VICTRON BV
+0020CA DIGITAL OCEAN
+0020CB PRETEC ELECTRONICS CORP.
+0020CC DIGITAL SERVICES, LTD.
+0020CD HYBRID NETWORKS, INC.
+0020CE LOGICAL DESIGN GROUP, INC.
+0020CF TEST & MEASUREMENT SYSTEMS INC
+0020D0 VERSALYNX CORPORATION
+0020D1 MICROCOMPUTER SYSTEMS (M) SDN.
+0020D2 RAD DATA COMMUNICATIONS, LTD.
+0020D3 OST (OUEST STANDARD TELEMATIQU
+0020D4 CABLETRON - ZEITTNET INC.
+0020D5 VIPA GMBH
+0020D6 BREEZECOM
+0020D7 JAPAN MINICOMPUTER SYSTEMS CO.
+0020D8 NETWAVE TECHNOLOGIES, INC.
+0020D9 PANASONIC TECHNOLOGIES, INC./
+0020DA XYLAN CORPORATION
+0020DB XNET TECHNOLOGY, INC.
+0020DC DENSITRON TAIWAN LTD.
+0020DD AWA LTD.
+0020DE JAPAN DIGITAL LABORAT'Y CO.LTD
+0020DF KYOSAN ELECTRIC MFG. CO., LTD.
+0020E0 PREMAX ELECTRONICS, INC.
+0020E1 ALAMAR ELECTRONICS
+0020E2 INFORMATION RESOURCE
+0020E3 MCD KENCOM CORPORATION
+0020E4 HSING TECH ENTERPRISE CO., LTD
+0020E5 APEX DATA, INC.
+0020E6 LIDKOPING MACHINE TOOLS AB
+0020E7 B&W NUCLEAR SERVICE COMPANY
+0020E8 DATATREK CORPORATION
+0020E9 DANTEL
+0020EA EFFICIENT NETWORKS, INC.
+0020EB CINCINNATI MICROWAVE, INC.
+0020EC TECHWARE SYSTEMS CORP.
+0020ED GIGA-BYTE TECHNOLOGY CO., LTD.
+0020EE GTECH CORPORATION
+0020EF USC CORPORATION
+0020F0 UNIVERSAL MICROELECTRONICS CO.
+0020F1 ALTOS INDIA LIMITED
+0020F2 SUN MICROSYSTEMS, INC.
+0020F3 RAYNET CORPORATION
+0020F4 SPECTRIX CORPORATION
+0020F5 PANDATEL AG
+0020F6 NET TEK  AND KARLNET, INC.
+0020F7 CYBERDATA
+0020F8 CARRERA COMPUTERS, INC.
+0020F9 PARALINK NETWORKS, INC.
+0020FA GDE SYSTEMS, INC.
+0020FB OCTEL COMMUNICATIONS CORP.
+0020FC MATROX
+0020FD ITV TECHNOLOGIES, INC.
+0020FE TOPWARE INC. / GRAND COMPUTER
+0020FF SYMMETRICAL TECHNOLOGIES
+003000 ALLWELL TECHNOLOGY CORP.
+003001 SMP
+003002 Expand Networks
+003003 Phasys Ltd.
+003004 LEADTEK RESEARCH INC.
+003005 Fujitsu Siemens Computers
+003006 SUPERPOWER COMPUTER
+003007 OPTI, INC.
+003008 AVIO DIGITAL, INC.
+003009 Tachion Networks, Inc.
+00300A AZTECH SYSTEMS LTD.
+00300B mPHASE Technologies, Inc.
+00300C CONGRUENCY, LTD.
+00300D MMC Technology, Inc.
+00300E Klotz Digital AG
+00300F IMT - Information Management T
+003010 VISIONETICS INTERNATIONAL
+003011 HMS FIELDBUS SYSTEMS AB
+003012 DIGITAL ENGINEERING LTD.
+003013 NEC Corporation
+003014 DIVIO, INC.
+003015 CP CLARE CORP.
+003016 ISHIDA CO., LTD.
+003017 TERASTACK LTD.
+003018 Jetway Information Co., Ltd.
+003019 CISCO SYSTEMS, INC.
+00301A SMARTBRIDGES PTE. LTD.
+00301B SHUTTLE, INC.
+00301C ALTVATER AIRDATA SYSTEMS
+00301D SKYSTREAM, INC.
+00301E 3COM Europe Ltd.
+00301F OPTICAL NETWORKS, INC.
+003020 TSI, Inc..
+003021 HSING TECH. ENTERPRISE CO.,LTD
+003022 Fong Kai Industrial Co., Ltd.
+003023 COGENT COMPUTER SYSTEMS, INC.
+003024 CISCO SYSTEMS, INC.
+003025 CHECKOUT COMPUTER SYSTEMS, LTD
+003026 HEITEL
+003027 KERBANGO, INC.
+003028 FASE Saldatura srl
+003029 OPICOM
+00302A SOUTHERN INFORMATION
+00302B INALP NETWORKS, INC.
+00302C SYLANTRO SYSTEMS CORPORATION
+00302D QUANTUM BRIDGE COMMUNICATIONS
+00302E Hoft & Wessel AG
+00302F Smiths Industries
+003030 HARMONIX CORPORATION
+003031 LIGHTWAVE COMMUNICATIONS, INC.
+003032 MAGICRAM, INC.
+003033 ORIENT TELECOM CO., LTD.
+003036 RMP ELEKTRONIKSYSTEME GMBH
+003037 Packard Bell Nec Services
+003038 XCP, INC.
+003039 SOFTBOOK PRESS
+00303A MAATEL
+00303B PowerCom Technology
+00303C ONNTO CORP.
+00303D IVA CORPORATION
+00303E Radcom Ltd.
+00303F TurboComm Tech Inc.
+003040 CISCO SYSTEMS, INC.
+003041 SAEJIN T & M CO., LTD.
+003042 DeTeWe-Deutsche Telephonwerke
+003043 IDREAM TECHNOLOGIES, PTE. LTD.
+003044 Portsmith LLC
+003045 Village Networks, Inc. (VNI)
+003046 Controlled Electronic Manageme
+003047 NISSEI ELECTRIC CO., LTD.
+003048 Supermicro Computer, Inc.
+003049 BRYANT TECHNOLOGY, LTD.
+00304A FRAUNHOFER INSTITUTE IMS
+00304B ORBACOM SYSTEMS, INC.
+00304C APPIAN COMMUNICATIONS, INC.
+00304D ESI
+00304E BUSTEC PRODUCTION LTD.
+00304F PLANET Technology Corporation
+003050 Versa Technology
+003051 ORBIT AVIONIC & COMMUNICATION
+003052 ELASTIC NETWORKS
+003053 Basler AG
+003054 CASTLENET TECHNOLOGY, INC.
+003055 Hitachi Semiconductor America,
+003056 Beck IPC GmbH
+003057 E-Tel Corporation
+003058 API MOTION
+003059 DIGITAL-LOGIC AG
+00305A TELGEN CORPORATION
+00305B MODULE DEPARTMENT
+00305C SMAR Laboratories Corp.
+00305D DIGITRA SYSTEMS, INC.
+00305E Abelko Innovation
+00305F IMACON APS
+003060 STARMATIX, INC.
+003061 MobyTEL
+003062 PATH 1 NETWORK TECHNOL'S INC.
+003063 SANTERA SYSTEMS, INC.
+003064 ADLINK TECHNOLOGY, INC.
+003065 APPLE COMPUTER, INC.
+003066 DIGITAL WIRELESS CORPORATION
+003067 BIOSTAR MICROTECH INT'L CORP.
+003068 CYBERNETICS TECH. CO., LTD.
+003069 IMPACCT TECHNOLOGY CORP.
+00306A PENTA MEDIA CO., LTD.
+00306B CMOS SYSTEMS, INC.
+00306C Hitex Holding GmbH
+00306D LUCENT TECHNOLOGIES
+00306E HEWLETT PACKARD
+00306F SEYEON TECH. CO., LTD.
+003070 1Net Corporation
+003071 Cisco Systems, Inc.
+003072 INTELLIBYTE INC.
+003073 International Microsystems, In
+003074 EQUIINET LTD.
+003075 ADTECH
+003076 Akamba Corporation
+003077 ONPREM NETWORKS
+003078 Cisco Systems, Inc.
+003079 CQOS, INC.
+00307A Advanced Technology & Systems
+00307B Cisco Systems, Inc.
+00307C ADID SA
+00307D GRE AMERICA, INC.
+00307E Redflex Communication Systems
+00307F IRLAN LTD.
+003080 CISCO SYSTEMS, INC.
+003081 ALTOS C&C
+003082 TAIHAN ELECTRIC WIRE CO., LTD.
+003083 Ivron Systems
+003084 ALLIED TELESYN INTERNAIONAL
+003085 CISCO SYSTEMS, INC.
+003086 Transistor Devices, Inc.
+003087 VEGA GRIESHABER KG
+003088 Siara Systems, Inc.
+003089 Spectrapoint Wireless, LLC
+00308A NICOTRA SISTEMI S.P.A
+00308B Brix Networks
+00308C ADVANCED DIGITAL INFORMATION
+00308D PINNACLE SYSTEMS, INC.
+00308E CROSS MATCH TECHNOLOGIES, INC.
+00308F MICRILOR, Inc.
+003090 CYRA TECHNOLOGIES, INC.
+003091 TAIWAN FIRST LINE ELEC. CORP.
+003092 ModuNORM GmbH
+003093 SONNET TECHNOLOGIES, INC.
+003094 Cisco Systems, Inc.
+003095 Procomp Informatics, Ltd.
+003096 CISCO SYSTEMS, INC.
+003097 EXOMATIC AB
+003098 Global Converging Technologies
+003099 BOENIG UND KALLENBACH OHG
+00309A ASTRO TERRA CORP.
+00309B Smartware
+00309C Timing Applications, Inc.
+00309D Nimble Microsystems, Inc.
+00309E WORKBIT CORPORATION.
+00309F AMBER NETWORKS
+0030A0 TYCO SUBMARINE SYSTEMS, LTD.
+0030A1 OPTI TECH CO., LTD.
+0030A2 Lightner Engineering
+0030A3 CISCO SYSTEMS, INC.
+0030A4 Woodwind Communications System
+0030A5 ACTIVE POWER
+0030A6 VIANET TECHNOLOGIES, LTD.
+0030A7 SCHWEITZER ENGINEERING
+0030A8 OL'E COMMUNICATIONS, INC.
+0030A9 Netiverse, Inc.
+0030AA AXUS MICROSYSTEMS, INC.
+0030AB DELTA NETWORKS, INC.
+0030AC Systeme Lauer GmbH & Co., Ltd.
+0030AD SHANGHAI COMMUNICATION
+0030AE Times N System, Inc.
+0030AF Honeywell Reqelsysteme GmbH
+0030B0 Convergenet Technologies
+0030B1 GOC GESELLSCHAFT FUR OPTISCHE
+0030B2 WESCAM - HEALDSBURG
+0030B3 San Valley Systems, Inc.
+0030B4 INTERSIL CORP.
+0030B5 Tadiran Microwave Networks
+0030B6 CISCO SYSTEMS, INC.
+0030B7 Teletrol Systems, Inc.
+0030B8 RiverDelta Networks
+0030B9 ECTEL
+0030BA AC&T SYSTEM CO., LTD.
+0030BB CacheFlow, Inc.
+0030BC Optronic AG
+0030BD BELKIN COMPONENTS
+0030BE City-Net Technology, Inc.
+0030BF MULTIDATA GMBH
+0030C0 Lara Technology, Inc.
+0030C1 HEWLETT-PACKARD
+0030C2 COMONE
+0030C3 FLUECKIGER ELEKTRONIK AG
+0030C4 Niigata Canotec Co., Inc.
+0030C5 CADENCE DESIGN SYSTEMS
+0030C6 CONTROL SOLUTIONS, INC.
+0030C7 MACROMATE CORP.
+0030C8 GAD LINE, LTD.
+0030C9 LuxN, N
+0030CA Discovery Com
+0030CB OMNI FLOW COMPUTERS, INC.
+0030CC Tenor Networks, Inc.
+0030CD CONEXANT SYSTEMS, INC.
+0030CE Zaffire
+0030CF TWO TECHNOLOGIES, INC.
+0030D1 INOVA CORPORATION
+0030D2 WIN TECHNOLOGIES, CO., LTD.
+0030D3 Agilent Technologies
+0030D4 COMTIER
+0030D5 DResearch GmbH
+0030D6 MSC VERTRIEBS GMBH
+0030D7 Innovative Systems, L.L.C.
+0030D8 SITEK
+0030D9 DATACORE SOFTWARE CORP.
+0030DA COMTREND CO.
+0030DB Mindready Solutions, Inc.
+0030DC RIGHTECH CORPORATION
+0030DD INDIGITA CORPORATION
+0030DE WAGO Kontakttechnik GmbH
+0030DF KB/TEL TELECOMUNICACIONES
+0030E0 OXFORD SEMICONDUCTOR LTD.
+0030E1 ACROTRON SYSTEMS, INC.
+0030E2 GARNET SYSTEMS CO., LTD.
+0030E3 SEDONA NETWORKS CORP.
+0030E4 CHIYODA SYSTEM RIKEN
+0030E5 Amper Datos S.A.
+0030E6 SIEMENS MEDICAL SYSTEMS
+0030E7 CNF MOBILE SOLUTIONS, INC.
+0030E8 ENSIM CORP.
+0030E9 GMA COMMUNICATION MANUFACT'G
+0030EA TeraForce Technology Corporation
+0030EB TURBONET COMMUNICATIONS, INC.
+0030EC BORGARDT
+0030ED Expert Magnetics Corp.
+0030EE DSG Technology, Inc.
+0030EF NEON TECHNOLOGY, INC.
+0030F0 Uniform Industrial Corp.
+0030F1 Accton Technology Corp.
+0030F2 CISCO SYSTEMS, INC.
+0030F3 At Work Computers
+0030F4 STARDOT TECHNOLOGIES
+0030F5 Wild Lab. Ltd.
+0030F6 SECURELOGIX CORPORATION
+0030F7 RAMIX INC.
+0030F8 Dynapro Systems, Inc.
+0030F9 Sollae Systems Co., Ltd.
+0030FA TELICA, INC.
+0030FB AZS Technology AG
+0030FC Terawave Communications, Inc.
+0030FD INTEGRATED SYSTEMS DESIGN
+0030FE DSA GmbH
+0030FF DATAFAB SYSTEMS, INC.
+004000 PCI COMPONENTES DA AMZONIA LTD
+004001 ZYXEL COMMUNICATIONS, INC.
+004002 PERLE SYSTEMS LIMITED
+004003 WESTINGHOUSE PROCESS CONTROL
+004004 ICM CO. LTD.
+004005 ANI COMMUNICATIONS INC.
+004006 SAMPO TECHNOLOGY CORPORATION
+004007 TELMAT INFORMATIQUE
+004008 A PLUS INFO CORPORATION
+004009 TACHIBANA TECTRON CO., LTD.
+00400A PIVOTAL TECHNOLOGIES, INC.
+00400B CISCO SYSTEMS, INC.
+00400C GENERAL MICRO SYSTEMS, INC.
+00400D LANNET DATA COMMUNICATIONS,LTD
+00400E MEMOTEC COMMUNICATIONS, INC.
+00400F DATACOM TECHNOLOGIES
+004010 SONIC SYSTEMS, INC.
+004011 ANDOVER CONTROLS CORPORATION
+004012 WINDATA, INC.
+004013 NTT DATA COMM. SYSTEMS CORP.
+004014 COMSOFT GMBH
+004015 ASCOM INFRASYS AG
+004016 HADAX ELECTRONICS, INC.
+004017 XCD INC.
+004018 ADOBE SYSTEMS, INC.
+004019 AEON SYSTEMS, INC.
+00401A FUJI ELECTRIC CO., LTD.
+00401B PRINTER SYSTEMS CORP.
+00401C AST RESEARCH, INC.
+00401D INVISIBLE SOFTWARE, INC.
+00401E ICC
+00401F COLORGRAPH LTD
+004020 PINACL COMMUNICATION
+004021 RASTER GRAPHICS
+004022 KLEVER COMPUTERS, INC.
+004023 LOGIC CORPORATION
+004024 COMPAC INC.
+004025 MOLECULAR DYNAMICS
+004026 MELCO, INC.
+004027 SMC MASSACHUSETTS, INC.
+004028 NETCOMM LIMITED
+004029 COMPEX
+00402A CANOGA-PERKINS
+00402B TRIGEM COMPUTER, INC.
+00402C ISIS DISTRIBUTED SYSTEMS, INC.
+00402D HARRIS ADACOM CORPORATION
+00402E PRECISION SOFTWARE, INC.
+00402F XLNT DESIGNS INC.
+004030 GK COMPUTER
+004031 KOKUSAI ELECTRIC CO., LTD
+004032 DIGITAL COMMUNICATIONS
+004033 ADDTRON TECHNOLOGY CO., LTD.
+004034 BUSTEK CORPORATION
+004035 OPCOM
+004036 TRIBE COMPUTER WORKS, INC.
+004037 SEA-ILAN, INC.
+004038 TALENT ELECTRIC INCORPORATED
+004039 OPTEC DAIICHI DENKO CO., LTD.
+00403A IMPACT TECHNOLOGIES
+00403B SYNERJET INTERNATIONAL CORP.
+00403C FORKS, INC.
+00403D TERADATA
+00403E RASTER OPS CORPORATION
+00403F SSANGYONG COMPUTER SYSTEMS
+004040 RING ACCESS, INC.
+004041 FUJIKURA LTD.
+004042 N.A.T. GMBH
+004043 NOKIA TELECOMMUNICATIONS
+004044 QNIX COMPUTER CO., LTD.
+004045 TWINHEAD CORPORATION
+004046 UDC RESEARCH LIMITED
+004047 WIND RIVER SYSTEMS
+004048 SMD INFORMATICA S.A.
+004049 TEGIMENTA AG
+00404A WEST AUSTRALIAN DEPARTMENT
+00404B MAPLE COMPUTER SYSTEMS
+00404C HYPERTEC PTY LTD.
+00404D TELECOMMUNICATIONS TECHNIQUES
+00404E FLUENT, INC.
+00404F SPACE & NAVAL WARFARE SYSTEMS
+004050 IRONICS, INCORPORATED
+004051 GRACILIS, INC.
+004052 STAR TECHNOLOGIES, INC.
+004053 AMPRO COMPUTERS
+004054 CONNECTION MACHINES SERVICES
+004055 METRONIX GMBH
+004056 MCM JAPAN LTD.
+004057 LOCKHEED - SANDERS
+004058 KRONOS, INC.
+004059 YOSHIDA KOGYO K. K.
+00405A GOLDSTAR INFORMATION & COMM.
+00405B FUNASSET LIMITED
+00405C FUTURE SYSTEMS, INC.
+00405D STAR-TEK, INC.
+00405E NORTH HILLS ISRAEL
+00405F AFE COMPUTERS LTD.
+004060 COMENDEC LTD
+004061 DATATECH ENTERPRISES CO., LTD.
+004062 E-SYSTEMS, INC./GARLAND DIV.
+004063 VIA TECHNOLOGIES, INC.
+004064 KLA INSTRUMENTS CORPORATION
+004065 GTE SPACENET
+004066 HITACHI CABLE, LTD.
+004067 OMNIBYTE CORPORATION
+004068 EXTENDED SYSTEMS
+004069 LEMCOM SYSTEMS, INC.
+00406A KENTEK INFORMATION SYSTEMS,INC
+00406B SYSGEN
+00406C COPERNIQUE
+00406D LANCO, INC.
+00406E COROLLARY, INC.
+00406F SYNC RESEARCH INC.
+004070 INTERWARE CO., LTD.
+004071 ATM COMPUTER GMBH
+004072 APPLIED INNOVATION, INC.
+004073 BASS ASSOCIATES
+004074 CABLE AND WIRELESS
+004075 M-TRADE (UK) LTD
+004076 Sun Conversion Technologies
+004077 MAXTON TECHNOLOGY CORPORATION
+004078 WEARNES AUTOMATION PTE LTD
+004079 JUKO MANUFACTURE COMPANY, LTD.
+00407A SOCIETE D'EXPLOITATION DU CNIT
+00407B SCIENTIFIC ATLANTA
+00407C QUME CORPORATION
+00407D EXTENSION TECHNOLOGY CORP.
+00407E EVERGREEN SYSTEMS, INC.
+00407F AGEMA INFRARED SYSTEMS AB
+004080 ATHENIX CORPORATION
+004081 MANNESMANN SCANGRAPHIC GMBH
+004082 LABORATORY EQUIPMENT CORP.
+004083 TDA INDUSTRIA DE PRODUTOS
+004084 HONEYWELL INC.
+004085 SAAB INSTRUMENTS AB
+004086 MICHELS & KLEBERHOFF COMPUTER
+004087 UBITREX CORPORATION
+004088 MOBIUS TECHNOLOGIES, INC.
+004089 MEIDENSHA CORPORATION
+00408A TPS TELEPROCESSING SYS. GMBH
+00408B RAYLAN CORPORATION
+00408C AXIS COMMUNICATIONS AB
+00408D THE GOODYEAR TIRE & RUBBER CO.
+00408E DIGILOG, INC.
+00408F WM-DATA MINFO AB
+004090 ANSEL COMMUNICATIONS
+004091 PROCOMP INDUSTRIA ELETRONICA
+004092 ASP COMPUTER PRODUCTS, INC.
+004093 PAXDATA NETWORKS LTD.
+004094 SHOGRAPHICS, INC.
+004095 R.P.T. INTERGROUPS INT'L LTD.
+004096 Aironet Wireless Communication
+004097 DATEX DIVISION OF
+004098 DRESSLER GMBH & CO.
+004099 NEWGEN SYSTEMS CORP.
+00409A NETWORK EXPRESS, INC.
+00409B HAL COMPUTER SYSTEMS INC.
+00409C TRANSWARE
+00409D DIGIBOARD, INC.
+00409E CONCURRENT TECHNOLOGIES  LTD.
+00409F LANCAST/CASAT TECHNOLOGY, INC.
+0040A0 GOLDSTAR CO., LTD.
+0040A1 ERGO COMPUTING
+0040A2 KINGSTAR TECHNOLOGY INC.
+0040A3 MICROUNITY SYSTEMS ENGINEERING
+0040A4 ROSE ELECTRONICS
+0040A5 CLINICOMP INTL.
+0040A6 Cray, Inc.
+0040A7 ITAUTEC PHILCO S.A.
+0040A8 IMF INTERNATIONAL LTD.
+0040A9 DATACOM INC.
+0040AA VALMET AUTOMATION INC.
+0040AB ROLAND DG CORPORATION
+0040AC SUPER WORKSTATION, INC.
+0040AD SMA REGELSYSTEME GMBH
+0040AE DELTA CONTROLS, INC.
+0040AF DIGITAL PRODUCTS, INC.
+0040B0 BYTEX CORPORATION, ENGINEERING
+0040B1 CODONICS INC.
+0040B2 SYSTEMFORSCHUNG
+0040B3 PAR MICROSYSTEMS CORPORATION
+0040B4 NEXTCOM K.K.
+0040B5 VIDEO TECHNOLOGY COMPUTERS LTD
+0040B6 COMPUTERM  CORPORATION
+0040B7 STEALTH COMPUTER SYSTEMS
+0040B8 IDEA ASSOCIATES
+0040B9 MACQ ELECTRONIQUE SA
+0040BA ALLIANT COMPUTER SYSTEMS CORP.
+0040BB GOLDSTAR CABLE CO., LTD.
+0040BC ALGORITHMICS LTD.
+0040BD STARLIGHT NETWORKS, INC.
+0040BE BOEING DEFENSE & SPACE
+0040BF CHANNEL SYSTEMS INTERN'L INC.
+0040C0 VISTA CONTROLS CORPORATION
+0040C1 BIZERBA-WERKE WILHEIM KRAUT
+0040C2 APPLIED COMPUTING DEVICES
+0040C3 FISCHER AND PORTER CO.
+0040C4 KINKEI SYSTEM CORPORATION
+0040C5 MICOM COMMUNICATIONS INC.
+0040C6 FIBERNET RESEARCH, INC.
+0040C7 RUBY TECH CORPORATION
+0040C8 MILAN TECHNOLOGY CORPORATION
+0040C9 NCUBE
+0040CA FIRST INTERNAT'L COMPUTER, INC
+0040CB LANWAN TECHNOLOGIES
+0040CC SILCOM MANUF'G TECHNOLOGY INC.
+0040CD TERA MICROSYSTEMS, INC.
+0040CE NET-SOURCE, INC.
+0040CF STRAWBERRY TREE, INC.
+0040D0 MITAC INTERNATIONAL CORP.
+0040D1 FUKUDA DENSHI CO., LTD.
+0040D2 PAGINE CORPORATION
+0040D3 KIMPSION INTERNATIONAL CORP.
+0040D4 GAGE TALKER CORP.
+0040D5 SARTORIUS AG
+0040D6 LOCAMATION B.V.
+0040D7 STUDIO GEN INC.
+0040D8 OCEAN OFFICE AUTOMATION LTD.
+0040D9 AMERICAN MEGATRENDS INC.
+0040DA TELSPEC LTD
+0040DB ADVANCED TECHNICAL SOLUTIONS
+0040DC TRITEC ELECTRONIC GMBH
+0040DD HONG TECHNOLOGIES
+0040DE ELETTRONICA SAN GIORGIO
+0040DF DIGALOG SYSTEMS, INC.
+0040E0 ATOMWIDE LTD.
+0040E1 MARNER INTERNATIONAL, INC.
+0040E2 MESA RIDGE TECHNOLOGIES, INC.
+0040E3 QUIN SYSTEMS LTD
+0040E4 E-M TECHNOLOGY, INC.
+0040E5 SYBUS CORPORATION
+0040E6 C.A.E.N.
+0040E7 ARNOS INSTRUMENTS & COMPUTER
+0040E8 CHARLES RIVER DATA SYSTEMS,INC
+0040E9 ACCORD SYSTEMS, INC.
+0040EA PLAIN TREE SYSTEMS INC
+0040EB MARTIN MARIETTA CORPORATION
+0040EC MIKASA SYSTEM ENGINEERING
+0040ED NETWORK CONTROLS INT'NATL INC.
+0040EE OPTIMEM
+0040EF HYPERCOM, INC.
+0040F0 MICRO SYSTEMS, INC.
+0040F1 CHUO ELECTRONICS CO., LTD.
+0040F2 JANICH & KLASS COMPUTERTECHNIK
+0040F3 NETCOR
+0040F4 CAMEO COMMUNICATIONS, INC.
+0040F5 OEM ENGINES
+0040F6 KATRON COMPUTERS INC.
+0040F7 POLAROID MEDICAL IMAGING SYS.
+0040F8 SYSTEMHAUS DISCOM
+0040F9 COMBINET
+0040FA MICROBOARDS, INC.
+0040FB CASCADE COMMUNICATIONS CORP.
+0040FC IBR COMPUTER TECHNIK GMBH
+0040FD LXE
+0040FE SYMPLEX COMMUNICATIONS
+0040FF TELEBIT CORPORATION
+005000 NEXO COMMUNICATIONS, INC.
+005001 YAMASHITA SYSTEMS CORP.
+005002 OMNISEC AG
+005003 GRETAG MACBETH AG
+005004 3COM CORPORATION
+005006 TAC AB
+005007 SIEMENS TELECOMMUNICATION
+005008 TIVA MICROCOMPUTER CORP. (TMC)
+005009 PHILIPS BROADBAND NETWORKS
+00500A IRIS TECHNOLOGIES, INC.
+00500B CISCO SYSTEMS, INC.
+00500C ETEK LABS, INC.
+00500D SATORI ELECTORIC CO., LTD.
+00500E CHROMATIS NETWORKS,INC.
+00500F CISCO SYSTEMS, INC.
+005010 NOVANET LEARNING, INC.
+005012 CBL - GMBH
+005013 Chaparral Technologies, Inc.
+005014 CISCO SYSTEMS, INC.
+005015 BRIGHT STAR ENGINEERING
+005016 SST/WOODHEAD INDUSTRIES
+005017 RSR S.R.L.
+005018 ADVANCED MULTIMEDIA INTERNET
+005019 SPRING TIDE NETWORKS, INC.
+00501A UISIQN
+00501B ABL CANADA, INC.
+00501C JATOM SYSTEMS, INC.
+00501E MIRANDA TECHNOLOGIES, INC.
+00501F MRG SYSTEMS, LTD.
+005020 MEDIASTAR CO., LTD.
+005021 EIS INTERNATIONAL, INC.
+005022 ZONET TECHNOLOGY, INC.
+005023 PG DESIGN ELECTRONICS, INC.
+005024 NAVIC SYSTEMS, INC.
+005026 COSYSTEMS, INC.
+005027 GENICOM CORPORATION
+005028 AVAL COMMUNICATIONS
+005029 1394 PRINTER WORKING GROUP
+00502A CISCO SYSTEMS, INC.
+00502B GENRAD LTD.
+00502C SOYO COMPUTER, INC.
+00502D ACCEL, INC.
+00502E CAMBEX CORPORATION
+00502F TOLLBRIDGE TECHNOLOGIES, INC.
+005030 FUTURE PLUS SYSTEMS
+005031 AEROFLEX LABORATORIES, INC.
+005032 PICAZO COMMUNICATIONS, INC.
+005033 MAYAN NETWORKS
+005036 NETCAM, LTD.
+005037 KOGA ELECTRONICS CO.
+005038 DAIN TELECOM CO., LTD.
+005039 MARINER NETWORKS
+00503A DATONG ELECTRONICS LTD.
+00503B MEDIAFIRE CORPORATION
+00503C TSINGHUA NOVEL ELECTRONICS
+00503E CISCO SYSTEMS, INC.
+00503F ANCHOR GAMES
+005040 EMWARE, INC.
+005041 CTX OPTO ELECTRONIC CORP.
+005042 SCI MANUFACTURING
+005043 MARVELL SEMICONDUCTOR, INC.
+005044 ASACA CORPORATION
+005045 RIOWORKS SOLUTIONS, INC.
+005046 MENICX INTERNATIONAL CO., LTD.
+005048 INFOLIBRIA
+005049 ELLACOYA NETWORKS, INC.
+00504A ELTECO A.S.
+00504B BARCONET N.V.
+00504C GALIL MOTION CONTROL, INC.
+00504D TOKYO ELECTRON DEVICE LTD.
+00504E SIERRA MONITOR CORP.
+00504F OLENCOM ELECTRONICS
+005050 CISCO SYSTEMS, INC.
+005051 IWATSU ELECTRIC CO., LTD.
+005052 TIARA NETWORKS, INC.
+005053 CISCO SYSTEMS, INC.
+005054 CISCO SYSTEMS, INC.
+005055 DOMS A/S
+005056 VMWARE, INC.
+005057 BROADBAND ACCESS SYSTEMS
+005058 VEGASTREAM LIMITED
+005059 SUITE TECHNOLOGY SYSTEMS
+00505A NETWORK ALCHEMY, INC.
+00505B KAWASAKI LSI U.S.A., INC.
+00505C TUNDO CORPORATION
+00505E DIGITEK MICROLOGIC S.A.
+00505F BRAND INNOVATORS
+005060 TANDBERG TELECOM AS
+005062 KOUWELL ELECTRONICS CORP.  **
+005063 OY COMSEL SYSTEM AB
+005064 CAE ELECTRONICS
+005065 DENSEI-LAMBAD Co., Ltd.
+005066 ATECOM GMBH ADVANCED
+005067 AEROCOMM, INC.
+005068 ELECTRONIC INDUSTRIES
+005069 PIXSTREAM INCORPORATED
+00506A EDEVA, INC.
+00506B SPX-ATEG
+00506C G & L BEIJER ELECTRONICS AB
+00506D VIDEOJET SYSTEMS
+00506E CORDER ENGINEERING CORPORATION
+00506F G-CONNECT
+005070 CHAINTECH COMPUTER CO., LTD.
+005071 AIWA CO., LTD.
+005072 CORVIS CORPORATION
+005073 CISCO SYSTEMS, INC.
+005074 ADVANCED HI-TECH CORP.
+005075 KESTREL SOLUTIONS
+005076 IBM
+005077 PROLIFIC TECHNOLOGY, INC.
+005078 MEGATON HOUSE, LTD.
+00507A XPEED, INC.
+00507B MERLOT COMMUNICATIONS
+00507C VIDEOCON AG
+00507D IFP
+00507E NEWER TECHNOLOGY
+00507F DRAYTEK CORP.
+005080 CISCO SYSTEMS, INC.
+005081 MURATA MACHINERY, LTD.
+005082 FORESSON CORPORATION
+005083 GILBARCO, INC.
+005084 ATL PRODUCTS
+005086 TELKOM SA, LTD.
+005087 TERASAKI ELECTRIC CO., LTD.
+005088 AMANO CORPORATION
+005089 SAFETY MANAGEMENT SYSTEMS
+00508B COMPAQ COMPUTER CORPORATION
+00508C RSI SYSTEMS
+00508D ABIT COMPUTER CORPORATION
+00508E OPTIMATION, INC.
+00508F ASITA TECHNOLOGIES INT'L LTD.
+005090 DCTRI
+005091 NETACCESS, INC.
+005092 RIGAKU INDUSTRIAL CORPORATION
+005093 BOEING
+005094 PACE MICRO TECHNOLOGY PLC
+005095 PERACOM NETWORKS
+005096 SALIX TECHNOLOGIES, INC.
+005097 MMC-EMBEDDED
+005098 GLOBALOOP, LTD.
+005099 3COM EUROPE, LTD.
+00509A TAG ELECTRONIC SYSTEMS
+00509B SWITCHCORE AB
+00509C BETA RESEARCH
+00509D THE INDUSTREE B.V.
+00509E LES TECHNOLOGIES
+00509F HORIZON COMPUTER
+0050A0 DELTA COMPUTER SYSTEMS, INC.
+0050A1 CARLO GAVAZZI, INC.
+0050A2 CISCO SYSTEMS, INC.
+0050A3 TRANSMEDIA COMMUNICATIONS, INC
+0050A4 IO TECH, INC.
+0050A5 CAPITOL BUSINESS SYSTEMS, LTD.
+0050A6 OPTRONICS
+0050A7 CISCO SYSTEMS, INC.
+0050A8 OPENCON SYSTEMS, INC.
+0050A9 MOLDAT WIRELESS TECHNOLGIES
+0050AA KONICA CORPORATION
+0050AB NALTEC, INC.
+0050AC MAPLE COMPUTER CORPORATION
+0050AD COMMUNIQUE WIRELESS CORP.
+0050AE IWAKI ELECTRONICS CO., LTD.
+0050AF INTERGON, INC.
+0050B0 TECHNOLOGY ATLANTA CORPORATION
+0050B1 GIDDINGS & LEWIS
+0050B2 BRODEL AUTOMATION
+0050B3 VOICEBOARD CORPORATION
+0050B4 SATCHWELL CONTROL SYSTEMS, LTD
+0050B5 FICHET-BAUCHE
+0050B6 GOOD WAY IND. CO., LTD.
+0050B7 BOSER TECHNOLOGY CO., LTD.
+0050B8 INOVA COMPUTERS GMBH & CO. KG
+0050B9 XITRON TECHNOLOGIES, INC.
+0050BA D-LINK
+0050BB CMS TECHNOLOGIES
+0050BC HAMMER STORAGE SOLUTIONS
+0050BD CISCO SYSTEMS, INC.
+0050BE FAST MULTIMEDIA AG
+0050BF MOTOTECH INC.
+0050C0 GATAN, INC.
+0050C1 GEMFLEX NETWORKS, LTD.
+0050C2 IEEE REGISTRATION AUTHORITY
+0050C4 IMD
+0050C5 ADS TECHNOLOGIES, INC.
+0050C6 LOOP TELECOMMUNICATION
+0050C8 ADDONICS COMMUNICATIONS, INC.
+0050C9 MASPRO DENKOH CORP.
+0050CA NET TO NET TECHNOLOGIES
+0050CB JETTER
+0050CC XYRATEX
+0050CD DIGIANSWER A/S
+0050CE LG INTERNATIONAL CORP.
+0050CF VANLINK COMMUNICATION
+0050D0 MINERVA SYSTEMS
+0050D1 CISCO SYSTEMS, INC.
+0050D2 BAE Systems Canada, Inc.
+0050D3 DIGITAL AUDIO
+0050D4 JOOHONG INFORMATION &
+0050D5 AD SYSTEMS CORP.
+0050D6 ATLAS COPCO TOOLS AB
+0050D7 TELSTRAT
+0050D8 UNICORN COMPUTER CORP.
+0050D9 ENGETRON-ENGENHARIA ELETRONICA
+0050DA 3COM CORPORATION
+0050DB CONTEMPORARY CONTROL
+0050DC TAS TELEFONBAU A. SCHWABE
+0050DD SERRA SOLDADURA, S.A.
+0050DE SIGNUM SYSTEMS CORP.
+0050DF AIRFIBER, INC.
+0050E1 NS TECH ELECTRONICS SDN BHD
+0050E2 CISCO SYSTEMS, INC.
+0050E3 TELEGATE
+0050E4 APPLE COMPUTER, INC.
+0050E6 HAKUSAN CORPORATION
+0050E7 PARADISE INNOVATIONS (ASIA)
+0050E8 NOMADIX INC.
+0050EA XEL COMMUNICTIONS, INC.
+0050EB ALPHA-TOP CORPORATION
+0050EC OLICOM A/S
+0050ED ANDA NETWORKS
+0050EE TEK DIGITEL CORPORATION
+0050EF SPE SYSTEMHAUS GMBH
+0050F0 CISCO SYSTEMS, INC.
+0050F1 LIBIT SIGNAL PROCESSING, LTD.
+0050F2 MICROSOFT CORP.
+0050F3 GLOBAL NET INFORMATION CO.,LTD
+0050F4 SIGMATEK GMBH & CO. KG
+0050F6 PAN-INTERNATIONAL
+0050F7 VENTURE MANUFACTURING
+0050F8 ENTREGA TECHNOLOGIES, INC.
+0050FA OXTEL, LTD.
+0050FB VSK ELECTRONICS
+0050FC EDIMAX TECHNOLOGY CO., LTD.
+0050FD ISIONCOMM CO., LTD.
+0050FE PCTVNET ASA
+0050FF HAKKO ELECTRONICS CO., LTD.
+006000 XYCOM INC.
+006001 INNOSYS, INC.
+006002 SCREEN SUBTITLING SYSTEMS, LTD
+006003 TERAOKA WEIGH SYSTEM PTE, LTD.
+006004 COMPUTADORES MODULARES SA
+006005 FEEDBACK DATA LTD.
+006006 SOTEC CO., LTD
+006007 ACRES GAMING, INC.
+006008 3COM CORPORATION
+006009 CISCO SYSTEMS, INC.
+00600A SORD COMPUTER CORPORATION
+00600B LOGWARE GMBH
+00600C APPLIED DATA SYSTEMS, INC.
+00600D MICRODESIGN GMBH
+00600E WAVENET INTERNATIONAL, INC.
+00600F WESTELL, INC.
+006010 NETWORK MACHINES, INC.
+006011 CRYSTAL SEMICONDUCTOR CORP.
+006012 POWER COMPUTING CORPORATION
+006013 NETSTAL MASCHINEN AG
+006014 EDEC CO., LTD.
+006015 NET2NET CORPORATION
+006016 CLARIION
+006017 TOKIMEC INC.
+006018 STELLAR ONE CORPORATION
+006019 BOEHRINGER MANNHEIM CORP.
+00601A KEITHLEY INSTRUMENTS
+00601B MESA ELECTRONICS
+00601C TELXON CORPORATION
+00601D LUCENT TECHNOLOGIES
+00601E SOFTLAB, INC.
+00601F STALLION TECHNOLOGIES
+006020 PIVOTAL NETWORKING, INC.
+006021 DSC CORPORATION
+006022 VICOM SYSTEMS, INC.
+006023 PERICOM SEMICONDUCTOR CORP.
+006024 GRADIENT TECHNOLOGIES, INC.
+006025 ACTIVE IMAGING PLC
+006026 VIKING COMPONENTS, INC.
+006027 Superior Modular Products
+006028 MACROVISION CORPORATION
+006029 CARY PERIPHERALS INC.
+00602A SYMICRON COMPUTER
+00602B PEAK AUDIO
+00602C LINX DATA TERMINALS, INC.
+00602D ALERTON TECHNOLOGIES, INC.
+00602E CYCLADES CORPORATION
+00602F CISCO SYSTEMS, INC.
+006030 VILLAGE TRONIC
+006031 HRK SYSTEMS
+006032 I-CUBE, INC.
+006033 ACUITY IMAGING, INC.
+006034 ROBERT BOSCH GMBH
+006035 DALLAS SEMICONDUCTOR, INC.
+006036 AUSTRIAN RESEARCH CENTER
+006037 PHILIPS SEMICONDUCTORS
+006038 Nortel Networks
+006039 SANCOM TECHNOLOGY, INC.
+00603A QUICK CONTROLS LTD.
+00603B AMTEC SPA
+00603C HAGIWARA SYS-COM CO., LTD.
+00603D 3CX
+00603E CISCO SYSTEMS, INC.
+00603F PATAPSCO DESIGNS
+006040 NETRO CORP.
+006041 Yokogawa Electric Corporation
+006042 TKS (USA), INC.
+006043 COMSOFT SYSTEMS, INC.
+006044 LITTON/POLY-SCIENTIFIC
+006045 PATHLIGHT TECHNOLOGIES
+006046 VMETRO, INC.
+006047 CISCO SYSTEMS, INC.
+006048 EMC CORPORATION
+006049 VINA TECHNOLOGIES
+00604A SAIC IDEAS GROUP
+00604B BIODATA GMBH
+00604C SAT
+00604D MMC NETWORKS, INC.
+00604E CYCLE COMPUTER CORPORATION, INC.
+00604F SUZUKI MFG. CO., LTD.
+006050 INTERNIX INC.
+006051 QUALITY SEMICONDUCTOR
+006052 PERIPHERALS ENTERPRISE CO., L.
+006053 TOYODA MACHINE WORKS, LTD.
+006054 CONTROLWARE GMBH
+006055 CORNELL UNIVERSITY
+006056 NETWORK TOOLS, INC.
+006057 MURATA MANUFACTURING CO., LTD.
+006058 COPPER MOUNTAIN
+006059 TECHNICAL COMMUNICATIONS CORP.
+00605A CELCORE, INC.
+00605B INTRASERVER TECHNOLOGY INC.
+00605C CISCO SYSTEMS, INC.
+00605D SCANIVALVE CORP.
+00605E LIBERTY TECHNOLOGY NETWORKING
+00605F NIPPON UNISOFT CORPORATION
+006060 DAWNING TECHNOLOGIES, INC.
+006061 WHISTLE COMMUNICATIONS CORP.
+006062 TELESYNC, INC.
+006063 PSION DACOM PLC.
+006064 NETCOMM LIMITED
+006065 BERNECKER & RAINER
+006066 LACROIX TECHNOLGIE
+006067 ACER NETXUS INC.
+006068 EICON TECHNOLOGY CORPORATION
+006069 BROCADE COMMUNICATIONS SYSTEMS
+00606A MITSUBISHI WIRELESS COMM. INC.
+00606B AICHI ELECTRONICS CO.,LTD.
+00606C ARESCOM
+00606D DIGITAL EQUIPMENT CORP.
+00606E DAVICOM SEMICONDUCTOR, INC.
+00606F CLARION CORPORATION OF AMERICA
+006070 CISCO SYSTEMS, INC.
+006071 MIDAS LAB, INC.
+006072 VXL INSTRUMENTS, LIMITED
+006073 REDCREEK COMMUNICATIONS, INC.
+006074 QSC AUDIO PRODUCTS
+006075 PENTEK, INC.
+006076 SCHLUMBERGER TECHNOLOGIES
+006077 PRISA NETWORKS
+006078 POWER MEASUREMENT LTD.
+006079 WAVEPHORE NETWORKS, INC.
+00607A DVS GMBH
+00607B FORE SYSTEMS, INC.
+00607C WAVEACCESS, LTD.
+00607D SENTIENT NETWORKS INC.
+00607E GIGALABS, INC.
+00607F AURORA TECHNOLOGIES, INC.
+006080 MICROTRONIX DATACOM LTD.
+006081 TV/COM INTERNATIONAL
+006082 NOVALINK TECHNOLOGIES, INC.
+006083 CISCO SYSTEMS, INC.
+006084 DIGITAL VIDEO
+006085 STORAGE CONCEPTS
+006086 LOGIC REPLACEMENT TECH. LTD.
+006087 KANSAI ELECTRIC CO., LTD.
+006088 WHITE MOUNTAIN DSP, INC.
+006089 XATA
+00608A CITADEL COMPUTER
+00608B CONFERTECH INTERNATIONAL
+00608C 3COM CORPORATION
+00608D UNIPULSE CORP.
+00608E HE ELECTRONICS, TECHNOLOGIE &
+00608F TEKRAM TECHNOLOGY CO., LTD.
+006090 ABLE COMMUNICATIONS, INC.
+006091 FIRST PACIFIC NETWORKS, INC.
+006092 MICRO/SYS, INC.
+006093 VARIAN
+006094 IBM CORP.
+006095 ACCU-TIME SYSTEMS, INC.
+006096 T.S. MICROTECH INC.
+006097 3COM CORPORATION
+006098 HT COMMUNICATIONS
+006099 LAN MEDIA CORPORATION
+00609A NJK TECHNO CO.
+00609B ASTRO-MED, INC.
+00609C PERKIN-ELMER CORPORATION
+00609D PMI FOOD EQUIPMENT GROUP
+00609E X3 - INFORMATION TECHNOLOGY
+00609F PHAST CORPORATION
+0060A0 SWITCHED NETWORK
+0060A1 VPNET
+0060A2 NIHON UNISYS LIMITED CO.
+0060A3 CONTINUUM TECHNOLOGY CORP.
+0060A4 GRINAKER SYSTEM TECHNOLOGIES
+0060A5 PERFORMANCE TELECOM CORP.
+0060A6 PARTICLE MEASURING SYSTEMS
+0060A7 MICROSENS GMBH & CO. KG
+0060A8 TIDOMAT AB
+0060A9 GESYTEC MBH
+0060AA INTELLIGENT DEVICES INC. (IDI)
+0060AB LARSCOM INCORPORATED
+0060AC RESILIENCE CORPORATION
+0060AD MEGACHIPS CORPORATION
+0060AE TRIO INFORMATION SYSTEMS AB
+0060AF PACIFIC MICRO DATA, INC.
+0060B0 HEWLETT-PACKARD CO.
+0060B1 INPUT/OUTPUT, INC.
+0060B2 PROCESS CONTROL CORP.
+0060B3 Z-COM, INC.
+0060B4 GLENAYRE R&D INC.
+0060B5 KEBA GMBH
+0060B6 LAND COMPUTER CO., LTD.
+0060B7 CHANNELMATIC, INC.
+0060B8 CORELIS INC.
+0060B9 NITSUKO CORPORATION
+0060BA SAHARA NETWORKS, INC.
+0060BB CABLETRON - NETLINK, INC.
+0060BC KEUNYOUNG ELECTRONICS &
+0060BD HUBBELL-PULSECOM
+0060BE WEBTRONICS
+0060BF MACRAIGOR SYSTEMS, INC.
+0060C0 NERA AS
+0060C1 WAVESPAN CORPORATION
+0060C2 MPL AG
+0060C3 NETVISION CORPORATION
+0060C4 SOLITON SYSTEMS K.K.
+0060C5 ANCOT CORP.
+0060C6 DCS AG
+0060C7 AMATI COMMUNICATIONS CORP.
+0060C8 KUKA WELDING SYSTEMS & ROBOTS
+0060C9 CONTROLNET, INC.
+0060CA HARMONIC SYSTEMS INCORPORATED
+0060CB HITACHI ZOSEN CORPORATION
+0060CC EMTRAK, INCORPORATED
+0060CD VIDEOSERVER, INC.
+0060CE ACCLAIM COMMUNICATIONS
+0060CF ALTEON NETWORKS, INC.
+0060D0 SNMP RESEARCH INCORPORATED
+0060D1 CASCADE COMMUNICATIONS
+0060D2 LUCENT TECHNOLOGIES TAIWAN
+0060D3 AT&T
+0060D4 ELDAT COMMUNICATION LTD.
+0060D5 MIYACHI TECHNOS CORP.
+0060D6 NOVATEL WIRELESS TECHNOLOGIES
+0060D7 ECOLE POLYTECHNIQUE FEDERALE
+0060D8 ELMIC SYSTEMS, INC.
+0060D9 TRANSYS NETWORKS INC.
+0060DA JBM ELECTRONICS CO.
+0060DB NTP ELEKTRONIK A/S
+0060DC TOYO COMMUNICATION EQUIPMENT
+0060DD MYRICOM, INC.
+0060DE KAYSER-THREDE GMBH
+0060DF INRANGE TECHNOLOGIES CORP.
+0060E0 AXIOM TECHNOLOGY CO., LTD.
+0060E1 ORCKIT COMMUNICATIONS LTD.
+0060E2 QUEST ENGINEERING & DEV.
+0060E3 ARBIN INSTRUMENTS
+0060E4 COMPUSERVE, INC.
+0060E5 FUJI AUTOMATION CO., LTD.
+0060E6 SHOMITI SYSTEMS INCORPORATED
+0060E7 RANDATA
+0060E8 HITACHI COMPUTER PRODUCTS
+0060E9 ATOP TECHNOLOGIES, INC.
+0060EA STREAMLOGIC
+0060EB FOURTHTRACK SYSTEMS
+0060EC HERMARY OPTO ELECTRONICS INC.
+0060ED RICARDO TEST AUTOMATION LTD.
+0060EE APOLLO
+0060EF FLYTECH TECHNOLOGY CO., LTD.
+0060F0 JOHNSON & JOHNSON MEDICAL, INC
+0060F1 EXP COMPUTER, INC.
+0060F2 LASERGRAPHICS, INC.
+0060F3 NETCOM SYSTEMS, INC.
+0060F4 ADVANCED COMPUTER SOLUTIONS,
+0060F5 ICON WEST, INC.
+0060F6 NEXTEST COMMUNICATION
+0060F7 DATAFUSION SYSTEMS
+0060F8 LORAN INTERNATIONAL TECHN. INC
+0060F9 DIAMOND LANE COMMUNICATIONS
+0060FA EDUCATIONAL TECHNOLOGY
+0060FB PACKETEER, INC.
+0060FC CONSERVATION THROUGH
+0060FD NETICS, INC.
+0060FE LYNX SYSTEM DEVELOPERS, INC.
+0060FF QUVIS, INC.
+0070B0 M/A-COM INC. COMPANIES
+0070B3 DATA RECALL LTD.
+008000 MULTITECH SYSTEMS, INC.
+008001 PERIPHONICS CORPORATION
+008002 SATELCOM (UK) LTD
+008003 HYTEC ELECTRONICS LTD.
+008004 ANTLOW COMMUNICATIONS, LTD.
+008005 CACTUS COMPUTER INC.
+008006 COMPUADD CORPORATION
+008007 DLOG NC-SYSTEME
+008008 DYNATECH COMPUTER SYSTEMS
+008009 JUPITER SYSTEMS, INC.
+00800A JAPAN COMPUTER CORP.
+00800B CSK CORPORATION
+00800C VIDECOM LIMITED
+00800D VOSSWINKEL F.U.
+00800E ATLANTIX CORPORATION
+00800F STANDARD MICROSYSTEMS
+008010 COMMODORE INTERNATIONAL
+008011 DIGITAL SYSTEMS INT'L. INC.
+008012 INTEGRATED MEASUREMENT SYSTEMS
+008013 THOMAS-CONRAD CORPORATION
+008014 ESPRIT SYSTEMS
+008015 SEIKO SYSTEMS, INC.
+008016 WANDEL AND GOLTERMANN
+008017 PFU LIMITED
+008018 KOBE STEEL, LTD.
+008019 DAYNA COMMUNICATIONS, INC.
+00801A BELL ATLANTIC
+00801B KODIAK TECHNOLOGY
+00801C NEWPORT SYSTEMS SOLUTIONS
+00801D INTEGRATED INFERENCE MACHINES
+00801E XINETRON, INC.
+00801F KRUPP ATLAS ELECTRONIK GMBH
+008020 NETWORK PRODUCTS
+008021 NEWBRIDGE RESEARCH CORP.
+008022 SCAN-OPTICS
+008023 INTEGRATED BUSINESS NETWORKS
+008024 KALPANA, INC.
+008025 STOLLMANN GMBH
+008026 NETWORK PRODUCTS CORPORATION
+008027 ADAPTIVE SYSTEMS, INC.
+008028 TRADPOST (HK) LTD
+008029 EAGLE TECHNOLOGY, INC.
+00802A TEST SYSTEMS & SIMULATIONS INC
+00802B INTEGRATED MARKETING CO
+00802C THE SAGE GROUP PLC
+00802D XYLOGICS INC
+00802E CASTLE ROCK COMPUTING
+00802F NATIONAL INSTRUMENTS CORP.
+008030 NEXUS ELECTRONICS
+008031 BASYS, CORP.
+008032 ACCESS CO., LTD.
+008033 FORMATION, INC.
+008034 SMT GOUPIL
+008035 TECHNOLOGY WORKS, INC.
+008036 REFLEX MANUFACTURING SYSTEMS
+008037 Ericsson Group
+008038 DATA RESEARCH & APPLICATIONS
+008039 ALCATEL STC AUSTRALIA
+00803A VARITYPER, INC.
+00803B APT COMMUNICATIONS, INC.
+00803C TVS ELECTRONICS LTD
+00803D SURIGIKEN CO.,  LTD.
+00803E SYNERNETICS
+00803F TATUNG COMPANY
+008040 JOHN FLUKE MANUFACTURING CO.
+008041 VEB KOMBINAT ROBOTRON
+008042 FORCE COMPUTERS
+008043 NETWORLD, INC.
+008044 SYSTECH COMPUTER CORP.
+008045 MATSUSHITA ELECTRIC IND. CO
+008046 UNIVERSITY OF TORONTO
+008047 IN-NET CORP.
+008048 COMPEX INCORPORATED
+008049 NISSIN ELECTRIC CO., LTD.
+00804A PRO-LOG
+00804B EAGLE TECHNOLOGIES PTY.LTD.
+00804C CONTEC CO., LTD.
+00804D CYCLONE MICROSYSTEMS, INC.
+00804E APEX COMPUTER COMPANY
+00804F DAIKIN INDUSTRIES, LTD.
+008050 ZIATECH CORPORATION
+008051 FIBERMUX
+008052 TECHNICALLY ELITE CONCEPTS
+008053 INTELLICOM, INC.
+008054 FRONTIER TECHNOLOGIES CORP.
+008055 FERMILAB
+008056 SPHINX ELEKTRONIK GMBH
+008057 ADSOFT, LTD.
+008058 PRINTER SYSTEMS CORPORATION
+008059 STANLEY ELECTRIC CO., LTD
+00805A TULIP COMPUTERS INTERNAT'L B.V
+00805B CONDOR SYSTEMS, INC.
+00805C AGILIS CORPORATION
+00805D CANSTAR
+00805E LSI LOGIC CORPORATION
+00805F COMPAQ COMPUTER CORPORATION
+008060 NETWORK INTERFACE CORPORATION
+008061 LITTON SYSTEMS, INC.
+008062 INTERFACE  CO.
+008063 RICHARD HIRSCHMANN GMBH & CO.
+008064 WYSE TECHNOLOGY
+008065 CYBERGRAPHIC SYSTEMS PTY LTD.
+008066 ARCOM CONTROL SYSTEMS, LTD.
+008067 SQUARE D COMPANY
+008068 YAMATECH SCIENTIFIC LTD.
+008069 COMPUTONE SYSTEMS
+00806A ERI (EMPAC RESEARCH INC.)
+00806B SCHMID TELECOMMUNICATION
+00806C CEGELEC PROJECTS LTD
+00806D CENTURY SYSTEMS CORP.
+00806E NIPPON STEEL CORPORATION
+00806F ONELAN LTD.
+008070 COMPUTADORAS MICRON
+008071 SAI TECHNOLOGY
+008072 MICROPLEX SYSTEMS LTD.
+008073 DWB ASSOCIATES
+008074 FISHER CONTROLS
+008075 PARSYTEC GMBH
+008076 MCNC
+008077 BROTHER INDUSTRIES, LTD.
+008078 PRACTICAL PERIPHERALS, INC.
+008079 MICROBUS DESIGNS LTD.
+00807A AITECH SYSTEMS LTD.
+00807B ARTEL COMMUNICATIONS CORP.
+00807C FIBERCOM, INC.
+00807D EQUINOX SYSTEMS INC.
+00807E SOUTHERN PACIFIC LTD.
+00807F DY-4 INCORPORATED
+008080 DATAMEDIA CORPORATION
+008081 KENDALL SQUARE RESEARCH CORP.
+008082 PEP MODULAR COMPUTERS GMBH
+008083 AMDAHL
+008084 THE CLOUD INC.
+008085 H-THREE SYSTEMS CORPORATION
+008086 COMPUTER GENERATION INC.
+008087 OKI ELECTRIC INDUSTRY CO., LTD
+008088 VICTOR COMPANY OF JAPAN, LTD.
+008089 TECNETICS (PTY) LTD.
+00808A SUMMIT MICROSYSTEMS CORP.
+00808B DACOLL LIMITED
+00808C NetScout Systems, Inc.
+00808D WESTCOAST TECHNOLOGY B.V.
+00808E RADSTONE TECHNOLOGY
+00808F C. ITOH ELECTRONICS, INC.
+008090 MICROTEK INTERNATIONAL, INC.
+008091 TOKYO ELECTRIC CO.,LTD
+008092 JAPAN COMPUTER INDUSTRY, INC.
+008093 XYRON CORPORATION
+008094 ALFA LAVAL AUTOMATION AB
+008095 BASIC MERTON HANDELSGES.M.B.H.
+008096 HUMAN DESIGNED SYSTEMS, INC.
+008097 CENTRALP AUTOMATISMES
+008098 TDK CORPORATION
+008099 KLOCKNER MOELLER IPC
+00809A NOVUS NETWORKS LTD
+00809B JUSTSYSTEM CORPORATION
+00809C LUXCOM, INC.
+00809D Commscraft Ltd.
+00809E DATUS GMBH
+00809F ALCATEL BUSINESS SYSTEMS
+0080A0 EDISA HEWLETT PACKARD S/A
+0080A1 MICROTEST, INC.
+0080A2 CREATIVE ELECTRONIC SYSTEMS
+0080A3 LANTRONIX
+0080A4 LIBERTY ELECTRONICS
+0080A5 SPEED INTERNATIONAL
+0080A6 REPUBLIC TECHNOLOGY, INC.
+0080A7 MEASUREX CORP.
+0080A8 VITACOM CORPORATION
+0080A9 CLEARPOINT RESEARCH
+0080AA MAXPEED
+0080AB DUKANE NETWORK INTEGRATION
+0080AC IMLOGIX, DIVISION OF GENESYS
+0080AD CNET TECHNOLOGY, INC.
+0080AE HUGHES NETWORK SYSTEMS
+0080AF ALLUMER CO., LTD.
+0080B0 ADVANCED INFORMATION
+0080B1 SOFTCOM A/S
+0080B2 NETWORK EQUIPMENT TECHNOLOGIES
+0080B3 AVAL DATA CORPORATION
+0080B4 SOPHIA SYSTEMS
+0080B5 UNITED NETWORKS INC.
+0080B6 THEMIS COMPUTER
+0080B7 STELLAR COMPUTER
+0080B8 BUG, INCORPORATED
+0080B9 ARCHE TECHNOLIGIES INC.
+0080BA SPECIALIX (ASIA) PTE, LTD
+0080BB HUGHES LAN SYSTEMS
+0080BC HITACHI ENGINEERING CO., LTD
+0080BD THE FURUKAWA ELECTRIC CO., LTD
+0080BE ARIES RESEARCH
+0080BF TAKAOKA ELECTRIC MFG. CO. LTD.
+0080C0 PENRIL DATACOMM
+0080C1 LANEX CORPORATION
+0080C2 IEEE 802 COMMITTEE
+0080C3 BICC INFORMATION SYSTEMS & SVC
+0080C4 DOCUMENT TECHNOLOGIES, INC.
+0080C5 NOVELLCO DE MEXICO
+0080C6 NATIONAL DATACOMM CORPORATION
+0080C7 XIRCOM
+0080C8 D-LINK SYSTEMS, INC.
+0080C9 ALBERTA MICROELECTRONIC CENTRE
+0080CA NETCOM RESEARCH INCORPORATED
+0080CB FALCO DATA PRODUCTS
+0080CC MICROWAVE BYPASS SYSTEMS
+0080CD MICRONICS COMPUTER, INC.
+0080CE BROADCAST TELEVISION SYSTEMS
+0080CF EMBEDDED PERFORMANCE INC.
+0080D0 COMPUTER PERIPHERALS, INC.
+0080D1 KIMTRON CORPORATION
+0080D2 SHINNIHONDENKO CO., LTD.
+0080D3 SHIVA CORP.
+0080D4 CHASE RESEARCH LTD.
+0080D5 CADRE TECHNOLOGIES
+0080D6 NUVOTECH, INC.
+0080D7 FANTUM ENGINEERING, INC.
+0080D8 NETWORK PERIPHERALS INC.
+0080D9 EMK ELEKTRONIK
+0080DA BRUEL & KJAER
+0080DB GRAPHON CORPORATION
+0080DC PICKER INTERNATIONAL
+0080DD GMX INC/GIMIX
+0080DE GIPSI S.A.
+0080DF ADC CODENOLL TECHNOLOGY CORP.
+0080E0 XTP SYSTEMS, INC.
+0080E1 STMICROELECTRONICS
+0080E2 T.D.I. CO., LTD.
+0080E3 CORAL NETWORK CORPORATION
+0080E4 NORTHWEST DIGITAL SYSTEMS, INC
+0080E5 MYLEX CORPORATION
+0080E6 PEER NETWORKS, INC.
+0080E7 LYNWOOD SCIENTIFIC DEV. LTD.
+0080E8 CUMULUS CORPORATIION
+0080E9 MADGE NETWORKS
+0080EA ADVA Optical Networking Ltd.
+0080EB COMPCONTROL B.V.
+0080EC SUPERCOMPUTING SOLUTIONS, INC.
+0080ED IQ TECHNOLOGIES, INC.
+0080EE THOMSON CSF
+0080EF RATIONAL
+0080F0 KYUSHU MATSUSHITA ELECTRIC CO.
+0080F1 OPUS SYSTEMS
+0080F2 RAYCOM SYSTEMS INC
+0080F3 SUN ELECTRONICS CORP.
+0080F4 TELEMECANIQUE ELECTRIQUE
+0080F5 QUANTEL LTD
+0080F6 SYNERGY MICROSYSTEMS
+0080F7 ZENITH ELECTRONICS
+0080F8 MIZAR, INC.
+0080F9 HEURIKON CORPORATION
+0080FA RWT GMBH
+0080FB BVM LIMITED
+0080FC AVATAR CORPORATION
+0080FD EXSCEED CORPRATION
+0080FE AZURE TECHNOLOGIES, INC.
+0080FF SOC. DE TELEINFORMATIQUE RTC
+009000 DIAMOND MULTIMEDIA
+009001 NISHIMU ELCTRONICS INDUSTRIES
+009002 ALLGON AB
+009003 APLIO
+009004 3COM EUROPE LTD.
+009005 PROTECH SYSTEMS CO., LTD.
+009006 HAMAMATSU PHOTONICS K.K.
+009007 DOMEX TECHNOLOGY CORP.
+009008 HAN A SYSTEMS, INC.
+009009 i Controls, Inc.
+00900A PROTON ELECTRONIC INDUSTRIAL
+00900B LANNER ELECTRONICS, INC.
+00900C CISCO SYSTEMS, INC.
+00900D OVERLAND DATA INC.
+00900E HANDLINK TECHNOLOGIES, INC.
+00900F KAWASAKI HEAVY INDUSTRIES, LTD
+009010 SIMULATION LABORATORIES, INC.
+009011 WAVTRACE, INC.
+009012 GLOBESPAN SEMICONDUCTOR, INC.
+009013 SAMSAN CORP.
+009014 ROTORK INSTRUMENTS, LTD.
+009015 CENTIGRAM COMMUNICATIONS CORP.
+009016 ZAC
+009017 ZYPCOM, INC.
+009018 ITO ELECTRIC INDUSTRY CO, LTD.
+009019 HERMES ELECTRONICS CO., LTD.
+00901A UNISPHERE SOLUTIONS
+00901B DIGITAL CONTROLS
+00901C MPS SOFTWARE GMBH
+00901D PEC (NZ) LTD.
+00901E SELESTA INGEGNE RIA S.P.A.
+00901F ADTEC PRODUCTIONS, INC.
+009020 PHILIPS ANALYTICAL X-RAY B.V.
+009021 CISCO SYSTEMS, INC.
+009022 IVEX
+009023 ZILOG INC.
+009024 PIPELINKS, INC.
+009025 VISION SYSTEMS LTD. PTY
+009026 ADVANCED SWITCHING
+009027 INTEL CORPORATION
+009028 NIPPON SIGNAL CO., LTD.
+009029 CRYPTO AG
+00902A COMMUNICATION DEVICES, INC.
+00902B CISCO SYSTEMS, INC.
+00902C DATA & CONTROL EQUIPMENT LTD.
+00902D DATA ELECTRONICS
+00902E NAMCO LIMITED
+00902F NETCORE SYSTEMS, INC.
+009030 HONEYWELL-DATING
+009031 MYSTICOM, LTD.
+009032 PELCOMBE GROUP LTD.
+009033 INNOVAPHONE GMBH
+009034 IMAGIC, INC.
+009035 ALPHA TELECOM, INC.
+009036 ENS, INC.
+009037 ACUCOMM, INC.
+009038 FOUNTAIN TECHNOLOGIES, INC.
+009039 SHASTA NETWORKS
+00903A NIHON MEDIA TOOL INC.
+00903B TRIEMS RESEARCH LAB, INC.
+00903C ATLANTIC NETWORK SYSTEMS
+00903D BIOPAC SYSTEMS, INC.
+00903E N.V. PHILIPS INDUSTRIAL
+00903F AZTEC RADIOMEDIA
+009040 CASTLE NETWORKS, INC.
+009041 APPLIED DIGITAL ACCESS
+009042 ECCS
+009043 NICHIBEI DENSHI CO., LTD.
+009044 ASSURED DIGITAL, INC.
+009045 MARIPOSA TECHNOLOGY
+009046 DEXDYNE, LTD.
+009047 GIGA FAST E. LTD.
+009048 ZEAL CORPORATION
+009049 ENTRIDIA CORPORATION
+00904A CONCUR SYSTEM TECHNOLOGIES
+00904B GEMTEK TECHNOLOGY CO., LTD.
+00904C EPIGRAM, INC.
+00904D SPEC S.A.
+00904E DELEM BV
+00904F ABB POWER T&D COMPANY, INC.
+009050 TELESTE OY
+009051 ULTIMATE TECHNOLOGY CORP.
+009052 SELCOM ELETTRONICA S.R.L.
+009053 DAEWOO ELECTRONICS CO., LTD.
+009054 INNOVATIVE SEMICONDUCTORS, INC
+009055 PARKER HANNIFIN CORPORATION
+009056 TELESTREAM, INC.
+009057 AANETCOM, INC.
+009058 ULTRA ELECTRONICS LTD.
+009059 TELECOM DEVICE K.K.
+00905A DEARBORN GROUP, INC.
+00905B RAYMOND AND LAE ENGINEERING
+00905C EDMI
+00905D NETCOM SICHERHEITSTECHNIK GMBH
+00905E RAULAND-BORG CORPORATION
+00905F CISCO SYSTEMS, INC.
+009060 SYSTEM CREATE CORP.
+009061 PACIFIC RESEARCH & ENGINEERING
+009062 ICP VORTEX COMPUTERSYSTEME
+009063 COHERENT COMMUNICATIONS
+009064 THOMSON BROADCAST SYSTEMS
+009065 FINISAR CORPORATION
+009066 Troika Networks, Inc.
+009067 WALKABOUT COMPUTERS, INC.
+009068 DVT CORP.
+009069 JUNIPER NETWORKS, INC.
+00906A TURNSTONE SYSTEMS, INC.
+00906B APPLIED RESOURCES, INC.
+00906C GWT GLOBAL WEIGHING
+00906D CISCO SYSTEMS, INC.
+00906E PRAXON, INC.
+00906F CISCO SYSTEMS, INC.
+009070 NEO NETWORKS, INC.
+009071 BADGER TECHNOLOGY, INC.
+009072 SIMRAD AS
+009073 GAIO TECHNOLOGY
+009074 ARGON NETWORKS, INC.
+009075 NEC DO BRASIL S.A.
+009076 FMT AIRCRAFT GATE SUPPORT
+009077 ADVANCED FIBRE COMMUNICATIONS
+009078 MER TELEMANAGEMENT
+009079 CLEARONE INC.
+00907A SPECTRALINK CORP.
+00907B E-TECH, INC.
+00907C DIGITALCAST, INC.
+00907D HOME WIRELESS NETWORKS
+00907E VETRONIX CORP.
+00907F WATCHGUARD TECHNOLOGIES, INC.
+009080 NOT LIMITED, INC.
+009081 ALOHA NETWORKS, INC.
+009082 FORCE INSTITUTE
+009083 TURBO COMMUNICATION, INC.
+009084 ATECH SYSTEM
+009085 GOLDEN ENTERPRISES, INC.
+009086 CISCO SYSTEMS, INC.
+009087 ITIS
+009088 BAXALL SECURITY LTD.
+009089 SOFTCOM MICROSYSTEMS, INC.
+00908A BAYLY COMMUNICATIONS, INC.
+00908B CELL COMPUTING, INC.
+00908C ETREND ELECTRONICS, INC.
+00908D VICKERS ELECTRONICS SYSTEMS
+00908E Nortel Networks Broadband Access
+00908F AUDIOCODES LTD.
+009090 I-BUS
+009091 DIGITALSCAPE, INC.
+009092 CISCO SYSTEMS, INC.
+009093 NANAO CORPORATION
+009094 OSPREY TECHNOLOGIES, INC.
+009095 UNIVERSAL AVIONICS
+009096 ASKEY COMPUTER CORP.
+009097 SYCAMORE NETWORKS
+009098 SBC DESIGNS, INC.
+009099 ALLIED TELESIS,K.K.
+00909A ONE WORLD SYSTEMS, INC.
+00909B MARKPOINT AB
+00909C COMBOX, LTD.
+00909D GSE SYSTEMS, INC.
+00909E DELPHI ENGINEERING GROUP
+00909F DIGI-DATA CORPORATION
+0090A0 8X8 INC.
+0090A1 FLYING PIG SYSTEMS, LTD.
+0090A2 CYBERTAN TECHNOLOGY, INC.
+0090A3 MEDIALINCS CO., LTD.
+0090A4 ALTIGA NETWORKS
+0090A5 SPECTRA LOGIC
+0090A6 CISCO SYSTEMS, INC.
+0090A7 CLIENTEC CORPORATION
+0090A8 NINETILES NETWORKS LTD.
+0090A9 WESTERN DIGITAL
+0090AA INDIGO ACTIVE VISION
+0090AB CISCO SYSTEMS, INC.
+0090AC OPTIVISION, INC.
+0090AD ASPECT ELECTRONICS, INC.
+0090AE ITALTEL SPA
+0090AF J. MORITA MFG. CORP.
+0090B0 VADEM
+0090B1 CISCO SYSTEMS, INC.
+0090B2 AVICI SYSTEMS INC.
+0090B3 AGRANAT SYSTEMS
+0090B4 WILLOWBROOK TECHNOLOGIES
+0090B5 NIKON CORPORATION
+0090B6 FIBEX SYSTEMS
+0090B7 DIGITAL LIGHTWAVE, INC.
+0090B8 ROHDE & SCHWARZ GMBH & CO. KG
+0090B9 BERAN INSTRUMENTS LTD.
+0090BA VALID NETWORKS, INC.
+0090BB TAINET COMMUNICATION SYSTEM
+0090BC TELEMANN CO., LTD.
+0090BD OMNIA COMMUNICATIONS, INC.
+0090BE IBC/INTEGRATED BUSINESS
+0090BF CISCO SYSTEMS, INC.
+0090C0 K.J. LAW ENGINEERS, INC.
+0090C1 EDA INDUSTRIES
+0090C2 JK MICROSYSTEMS, INC.
+0090C3 TOPIC SEMICONDUCTOR CORP.
+0090C4 JAVELIN SYSTEMS, INC.
+0090C5 INTERNET MAGIC, INC.
+0090C6 OPTIM SYSTEMS, INC.
+0090C7 ICOM INC.
+0090C8 WAVERIDER COMMUNICATIONS
+0090C9 PRODUCTIVITY ENHANCEMENT
+0090CA ACCORD VIDEO
+0090CB WIRELESS ONLINE, INC.
+0090CC PLANEX COMMUNICATIONS, INC.
+0090CD ENT-EMPRESA NACIONAL
+0090CE TETRA GMBH
+0090CF NORTEL
+0090D0 ALCATEL BELL
+0090D1 LEICHU ENTERPRISE CO., LTD.
+0090D2 ARTEL VIDEO SYSTEMS
+0090D3 GIESECKE & DEVRIENT GMBH
+0090D4 BINDVIEW DEVELOPMENT CORP.
+0090D5 EUPHONIX, INC.
+0090D6 CRYSTAL GROUP
+0090D7 NETBOOST CORP.
+0090D8 WHITECROSS SYSTEMS
+0090D9 CISCO SYSTEMS, INC.
+0090DA DYNARC, INC.
+0090DB NEXT LEVEL COMMUNICATIONS
+0090DC TECO INFORMATION SYSTEMS
+0090DD THE MIHARU COMMUNICATIONS
+0090DE CARDKEY SYSTEMS, INC.
+0090DF MITSUBISHI CHEMICAL
+0090E0 SYSTRAN CORP.
+0090E1 TELENA S.P.A.
+0090E2 DISTRIBUTED PROCESSING
+0090E3 AVEX ELECTRONICS INC.
+0090E4 NEC AMERICA, INC.
+0090E5 TEKNEMA, INC.
+0090E6 ACER LABORATORIES, INC.
+0090E7 HORSCH ELEKTRONIK AG
+0090E8 MOXA TECHNOLOGIES CORP., LTD.
+0090E9 JANZ COMPUTER AG
+0090EA ALPHA TECHNOLOGIES, INC.
+0090EB SENTRY TELECOM SYSTEMS
+0090EC PYRESCOM
+0090ED CENTRAL SYSTEM RESEARCH
+0090EE PERSONAL COMMUNICATIONS
+0090EF INTEGRIX, INC.
+0090F0 HARMONIC LIGHTWAVES, LTD.
+0090F1 DOT HILL SYSTEMS CORPORATION
+0090F2 CISCO SYSTEMS, INC.
+0090F3 ASPECT COMMUNICATIONS
+0090F4 LIGHTNING INSTRUMENTATION
+0090F5 CLEVO CO.
+0090F6 ESCALATE NETWORKS, INC.
+0090F7 NBASE COMMUNICATIONS LTD.
+0090F8 MEDIATRIX TELECOM
+0090F9 LEITCH
+0090FA GIGANET, INC.
+0090FB PORTWELL, INC.
+0090FC NETWORK COMPUTING DEVICES
+0090FD COPPERCOM, INC.
+0090FE ELECOM CO., LTD.  (LANEED DIV.
+0090FF TELLUS TECHNOLOGY INC.
+009D8E CARDIAC RECORDERS, INC.
+00A000 CENTILLION NETWORKS, INC.
+00A001 WATKINS-JOHNSON COMPANY
+00A002 LEEDS & NORTHRUP AUSTRALIA
+00A003 STAEFA CONTROL SYSTEM
+00A004 NETPOWER, INC.
+00A005 DANIEL INSTRUMENTS, LTD.
+00A006 IMAGE DATA PROCESSING
+00A007 APEXX TECHNOLOGY, INC.
+00A008 NETCORP
+00A009 WHITETREE NETWORK
+00A00A R.D.C. COMMUNICATION
+00A00B COMPUTEX CO., LTD.
+00A00C KINGMAX TECHNOLOGY, INC.
+00A00D THE PANDA PROJECT
+00A00E VISUAL NETWORKS, INC.
+00A00F Broadband Technologies
+00A010 SYSLOGIC DATENTECHNIK AG
+00A011 MUTOH INDUSTRIES LTD.
+00A012 B.A.T.M. ADVANCED TECHNOLOGIES
+00A013 TELTREND LTD.
+00A014 CSIR
+00A015 WYLE
+00A016 MICROPOLIS CORP.
+00A017 J B M CORPORATION
+00A018 CREATIVE CONTROLLERS, INC.
+00A019 NEBULA CONSULTANTS, INC.
+00A01A BINAR ELEKTRONIK AB
+00A01B PREMISYS COMMUNICATIONS, INC.
+00A01C NASCENT NETWORKS CORPORATION
+00A01D SIXNET
+00A01E EST CORPORATION
+00A01F TRICORD SYSTEMS, INC.
+00A020 CITICORP/TTI
+00A021 GENERAL DYNAMICS-
+00A022 CENTRE FOR DEVELOPMENT OF
+00A023 APPLIED CREATIVE TECHNOLOGY,
+00A024 3COM CORPORATION
+00A025 REDCOM LABS INC.
+00A026 TELDAT, S.A.
+00A027 FIREPOWER SYSTEMS, INC.
+00A028 CONNER PERIPHERALS
+00A029 COULTER CORPORATION
+00A02A TRANCELL SYSTEMS
+00A02B TRANSITIONS RESEARCH CORP.
+00A02C INTERWAVE COMMUNICATIONS
+00A02D 1394 Trade Association
+00A02E BRAND COMMUNICATIONS, LTD.
+00A02F PIRELLI CAVI
+00A030 CAPTOR NV/SA
+00A031 HAZELTINE CORPORATION, MS 1-17
+00A032 GES SINGAPORE PTE. LTD.
+00A033 IMC MESS-SYSTEME GMBH
+00A034 AXEL
+00A035 CYLINK CORPORATION
+00A036 APPLIED NETWORK TECHNOLOGY
+00A037 DATASCOPE CORPORATION
+00A038 EMAIL ELECTRONICS
+00A039 ROSS TECHNOLOGY, INC.
+00A03A KUBOTEK CORPORATION
+00A03B TOSHIN ELECTRIC CO., LTD.
+00A03C EG&G NUCLEAR INSTRUMENTS
+00A03D OPTO - 22
+00A03E ATM FORUM
+00A03F COMPUTER SOCIETY MICROPROCES'R
+00A040 APPLE COMPUTER
+00A041 LEYBOLD-INFICON
+00A042 SPUR PRODUCTS CORP.
+00A043 AMERICAN TECHNOLOGY LABS, INC.
+00A044 NTT INTELLIGENT TECHNOLOGY
+00A045 PHOENIX CONTACT GMBH & CO.
+00A046 SCITEX CORP. LTD.
+00A047 INTEGRATED FITNESS CORP.
+00A048 QUESTECH, LTD.
+00A049 DIGITECH INDUSTRIES, INC.
+00A04A NISSHIN ELECTRIC CO., LTD.
+00A04B TFL LAN INC.
+00A04C INNOVATIVE SYSTEMS & TECH. INC
+00A04D EDA INSTRUMENTS, INC.
+00A04E VOELKER TECHNOLOGIES, INC.
+00A04F AMERITEC CORP.
+00A050 CYPRESS SEMICONDUCTOR
+00A051 ANGIA COMMUNICATIONS. INC.
+00A052 STANILITE ELECTRONICS PTY. LTD
+00A053 COMPACT DEVICES, INC.
+00A055 LINKTECH, INC.
+00A056 MICROPROSS
+00A057 ELSA AG
+00A058 GLORY, LTD.
+00A059 HAMILTON HALLMARK
+00A05A KOFAX IMAGE PRODUCTS
+00A05B MARQUIP, INC.
+00A05C INVENTORY CONVERSION, INC./
+00A05D CS COMPUTER SYSTEME GMBH
+00A05E MYRIAD LOGIC INC.
+00A05F BTG ENGINEERING BV
+00A060 ACER PERIPHERALS, INC.
+00A061 PURITAN BENNETT
+00A062 AES PRODATA
+00A063 JRL SYSTEMS, INC.
+00A064 KVB/ANALECT
+00A065 NEXLAND, INC.
+00A066 ISA CO., LTD.
+00A067 NETWORK SERVICES GROUP
+00A068 BHP LIMITED
+00A069 TrueTime
+00A06A VERILINK CORP.
+00A06B DMS DORSCH MIKROSYSTEM GMBH
+00A06C SHINDENGEN ELECTRIC MFG.
+00A06D MANNESMANN TALLY CORPORATION
+00A06E AUSTRON, INC.
+00A06F THE APPCON GROUP, INC.
+00A070 COASTCOM
+00A071 VIDEO LOTTERY TECHNOLOGIES,INC
+00A072 OVATION SYSTEMS LTD.
+00A073 COM21, INC.
+00A074 PERCEPTION TECHNOLOGY
+00A075 MICRON TECHNOLOGY, INC.
+00A076 CARDWARE LAB, INC.
+00A077 FUJITSU NEXION, INC.
+00A078 Marconi Communications
+00A079 ALPS ELECTRIC (USA), INC.
+00A07A ADVANCED PERIPHERALS
+00A07B DAWN COMPUTER INCORPORATION
+00A07C TONYANG NYLON CO., LTD.
+00A07D SEEQ TECHNOLOGY, INC.
+00A07E AVID TECHNOLOGY, INC.
+00A07F GSM-SYNTEL, LTD.
+00A080 ANTARES MICROSYSTEMS
+00A081 ALCATEL DATA NETWORKS
+00A082 NKT ELEKTRONIK A/S
+00A083 ASIMMPHONY TURKEY
+00A084 DATAPLEX PTY. LTD.
+00A086 AMBER WAVE SYSTEMS, INC.
+00A087 MITEL SEMICONDUCTOR, LTD.
+00A088 ESSENTIAL COMMUNICATIONS
+00A089 XPOINT TECHNOLOGIES, INC.
+00A08A BROOKTROUT TECHNOLOGY, INC.
+00A08B ASTON ELECTRONIC DESIGNS LTD.
+00A08C MULTIMEDIA LANS, INC.
+00A08D JACOMO CORPORATION
+00A08E Nokia Internet Communications
+00A08F DESKNET SYSTEMS, INC.
+00A090 TIMESTEP CORPORATION
+00A091 APPLICOM INTERNATIONAL
+00A092 H. BOLLMANN MANUFACTURERS, LTD
+00A093 B/E AEROSPACE
+00A094 COMSAT CORPORATION
+00A095 ACACIA NETWORKS, INC.
+00A096 MITSUMI ELECTRIC CO., LTD.
+00A097 JC INFORMATION SYSTEMS
+00A098 NETWORK APPLIANCE CORP.
+00A099 K-NET LTD.
+00A09A NIHON KOHDEN AMERICA
+00A09B QPSX COMMUNICATIONS, LTD.
+00A09C XYPLEX, INC.
+00A09D JOHNATHON FREEMAN TECHNOLOGIES
+00A09E ICTV
+00A09F COMMVISION CORP.
+00A0A0 COMPACT DATA, LTD.
+00A0A1 EPIC DATA INC.
+00A0A2 DIGICOM S.P.A.
+00A0A3 RELIABLE POWER METERS
+00A0A4 MICROS SYSTEMS, INC.
+00A0A5 TEKNOR MICROSYSTEME, INC.
+00A0A6 M.I. SYSTEMS, K.K.
+00A0A7 VORAX CORPORATION
+00A0A8 RENEX CORPORATION
+00A0A9 GN NETTEST (CANADA) INC.
+00A0AA SPACELABS MEDICAL
+00A0AB NETCS INFORMATIONSTECHNIK GMBH
+00A0AC GILAT SATELLITE NETWORKS, LTD.
+00A0AD MARCONI SPA
+00A0AE NUCOM SYSTEMS, INC.
+00A0AF WMS INDUSTRIES
+00A0B0 I-O DATA DEVICE, INC.
+00A0B1 FIRST VIRTUAL CORPORATION
+00A0B2 SHIMA SEIKI
+00A0B3 ZYKRONIX
+00A0B4 TEXAS MICROSYSTEMS, INC.
+00A0B5 3H TECHNOLOGY
+00A0B6 SANRITZ AUTOMATION CO., LTD.
+00A0B7 CORDANT, INC.
+00A0B8 SYMBIOS LOGIC INC.
+00A0B9 EAGLE TECHNOLOGY, INC.
+00A0BA PATTON ELECTRONICS CO.
+00A0BB HILAN GMBH
+00A0BC VIASAT, INCORPORATED
+00A0BD I-TECH CORP.
+00A0BE INTEGRATED CIRCUIT SYSTEMS,INC
+00A0BF WIRELESS DATA GROUP MOTOROLA
+00A0C0 DIGITAL LINK CORP.
+00A0C1 ORTIVUS MEDICAL AB
+00A0C2 R.A. SYSTEMS CO., LTD.
+00A0C3 UNICOMPUTER GMBH
+00A0C4 CRISTIE ELECTRONICS LTD.
+00A0C5 ZYXEL COMMUNICATION
+00A0C6 QUALCOMM INCORPORATED
+00A0C7 TADIRAN TELECOMMUNICATIONS
+00A0C8 ADTRAN INC.
+00A0C9 INTEL CORPORATION - HF1-06
+00A0CA FUJITSU DENSO LTD.
+00A0CB ARK TELECOMMUNICATIONS, INC.
+00A0CC LITE-ON COMMUNICATIONS, INC.
+00A0CD DR. JOHANNES HEIDENHAIN GMBH
+00A0CE ASTROCOM CORPORATION
+00A0CF SOTAS, INC.
+00A0D0 TEN X TECHNOLOGY, INC.
+00A0D1 INVENTEC CORPORATION
+00A0D2 ALLIED TELESIS INTERNATIONAL
+00A0D3 INSTEM COMPUTER SYSTEMS, LTD.
+00A0D4 RADIOLAN,  INC.
+00A0D5 SIERRA WIRELESS INC.
+00A0D6 SBE, INC.
+00A0D7 KASTEN CHASE APPLIED RESEARCH
+00A0D8 SPECTRA - TEK
+00A0D9 CONVEX COMPUTER CORPORATION
+00A0DA INTEGRATED SYSTEMS
+00A0DB FISHER & PAYKEL PRODUCTION
+00A0DC O.N. ELECTRONIC CO., LTD.
+00A0DD AZONIX CORPORATION
+00A0DE YAMAHA CORPORATION
+00A0DF STS TECHNOLOGIES, INC.
+00A0E0 TENNYSON TECHNOLOGIES PTY LTD
+00A0E1 WESTPORT RESEARCH
+00A0E2 KEISOKU GIKEN CORP.
+00A0E3 XKL SYSTEMS CORP.
+00A0E4 OPTIQUEST
+00A0E5 NHC COMMUNICATIONS
+00A0E6 DIALOGIC CORPORATION
+00A0E7 CENTRAL DATA CORPORATION
+00A0E8 REUTERS HOLDINGS PLC
+00A0E9 ELECTRONIC RETAILING SYSTEMS
+00A0EA ETHERCOM CORP.
+00A0EB FASTCOMM COMMUNICATIONS CORP.
+00A0EC TRANSMITTON LTD.
+00A0ED PRI AUTOMATION
+00A0EE NASHOBA NETWORKS
+00A0EF LUCIDATA LTD.
+00A0F0 TORONTO MICROELECTRONICS INC.
+00A0F1 MTI
+00A0F2 INFOTEK COMMUNICATIONS, INC.
+00A0F3 STAUBLI
+00A0F4 GE
+00A0F5 RADGUARD LTD.
+00A0F6 AUTOGAS SYSTEMS, INC.
+00A0F7 V.I COMPUTER CORP.
+00A0F8 SYMBOL TECHNOLOGIES, INC.
+00A0F9 BINTEC COMMUNICATIONS GMBH
+00A0FA Marconi Communication GmbH
+00A0FB TORAY ENGINEERING CO., LTD.
+00A0FC IMAGE SCIENCES, INC.
+00A0FD SCITEX DIGITAL PRINTING, INC.
+00A0FE BOSTON TECHNOLOGY, INC.
+00A0FF TELLABS OPERATIONS, INC.
+00AA00 INTEL CORPORATION
+00AA01 INTEL CORPORATION
+00AA02 INTEL CORPORATION
+00AA3C OLIVETTI TELECOM SPA (OLTECO)
+00B009 Grass Valley Group
+00B017 InfoGear Technology Corp.
+00B019 Casi-Rusco
+00B01C Westport Technologies
+00B01E Rantic Labs, Inc.
+00B02A ORSYS GmbH
+00B02D ViaGate Technologies, Inc.
+00B03B HiQ Networks
+00B048 Marconi Communications Inc.
+00B04A Cisco Systems, Inc.
+00B052 Intellon Corporation
+00B064 Cisco Systems, Inc.
+00B069 Honewell Oy
+00B06D Jones Futurex Inc.
+00B080 Mannesmann Ipulsys B.V.
+00B086 LocSoft Limited
+00B08E Cisco Systems, Inc.
+00B091 Transmeta Corp.
+00B094 Alaris, Inc.
+00B09A Morrow Technologies Corp.
+00B09D Point Grey Research Inc.
+00B0AC SIAE-Microelettronica S.p.A.
+00B0AE Symmetricom
+00B0B3 Xstreamis PLC
+00B0C2 Cisco Systems, Inc.
+00B0C7 Tellabs Operations, Inc.
+00B0CE TECHNOLOGY RESCUE
+00B0D0 Dell Computer Corp.
+00B0DB Nextcell, Inc.
+00B0DF Reliable Data Technology, Inc.
+00B0E7 British Federal Ltd.
+00B0EC EACEM
+00B0EE Ajile Systems, Inc.
+00B0F0 CALY NETWORKS
+00B0F5 NetWorth Technologies, Inc.
+00BB01 OCTOTHORPE CORP.
+00BBF0 UNGERMANN-BASS INC.
+00C000 LANOPTICS, LTD.
+00C001 DIATEK PATIENT MANAGMENT
+00C002 SERCOMM CORPORATION
+00C003 GLOBALNET COMMUNICATIONS
+00C004 JAPAN BUSINESS COMPUTER CO.LTD
+00C005 LIVINGSTON ENTERPRISES, INC.
+00C006 NIPPON AVIONICS CO., LTD.
+00C007 PINNACLE DATA SYSTEMS, INC.
+00C008 SECO SRL
+00C009 KT TECHNOLOGY (S) PTE LTD
+00C00A MICRO CRAFT
+00C00B NORCONTROL A.S.
+00C00C RELIA TECHNOLGIES
+00C00D ADVANCED LOGIC RESEARCH, INC.
+00C00E PSITECH, INC.
+00C00F QUANTUM SOFTWARE SYSTEMS LTD.
+00C010 HIRAKAWA HEWTECH CORP.
+00C011 INTERACTIVE COMPUTING DEVICES
+00C012 NETSPAN CORPORATION
+00C013 NETRIX
+00C014 TELEMATICS CALABASAS INT'L,INC
+00C015 NEW MEDIA CORPORATION
+00C016 ELECTRONIC THEATRE CONTROLS
+00C017 FORTE NETWORKS
+00C018 LANART CORPORATION
+00C019 LEAP TECHNOLOGY, INC.
+00C01A COROMETRICS MEDICAL SYSTEMS
+00C01B SOCKET COMMUNICATIONS, INC.
+00C01C INTERLINK COMMUNICATIONS LTD.
+00C01D GRAND JUNCTION NETWORKS, INC.
+00C01E LA FRANCAISE DES JEUX
+00C01F S.E.R.C.E.L.
+00C020 ARCO ELECTRONIC, CONTROL LTD.
+00C021 NETEXPRESS
+00C022 LASERMASTER TECHNOLOGIES, INC.
+00C023 TUTANKHAMON ELECTRONICS
+00C024 EDEN SISTEMAS DE COMPUTACAO SA
+00C025 DATAPRODUCTS CORPORATION
+00C026 LANS TECHNOLOGY CO., LTD.
+00C027 CIPHER SYSTEMS, INC.
+00C028 JASCO CORPORATION
+00C029 KABEL RHEYDT AG
+00C02A OHKURA ELECTRIC CO., LTD.
+00C02B GERLOFF GESELLSCHAFT FUR
+00C02C CENTRUM COMMUNICATIONS, INC.
+00C02D FUJI PHOTO FILM CO., LTD.
+00C02E NETWIZ
+00C02F OKUMA CORPORATION
+00C030 INTEGRATED ENGINEERING B. V.
+00C031 DESIGN RESEARCH SYSTEMS, INC.
+00C032 I-CUBED LIMITED
+00C033 TELEBIT COMMUNICATIONS APS
+00C034 TRANSACTION NETWORK
+00C035 QUINTAR COMPANY
+00C036 RAYTECH ELECTRONIC CORP.
+00C037 DYNATEM
+00C038 RASTER IMAGE PROCESSING SYSTEM
+00C039 TDK SEMICONDUCTOR CORPORATION
+00C03A MEN-MIKRO ELEKTRONIK GMBH
+00C03B MULTIACCESS COMPUTING CORP.
+00C03C TOWER TECH S.R.L.
+00C03D WIESEMANN & THEIS GMBH
+00C03E FA. GEBR. HELLER GMBH
+00C03F STORES AUTOMATED SYSTEMS, INC.
+00C040 ECCI
+00C041 DIGITAL TRANSMISSION SYSTEMS
+00C042 DATALUX CORP.
+00C043 STRATACOM
+00C044 EMCOM CORPORATION
+00C045 ISOLATION SYSTEMS, LTD.
+00C046 KEMITRON LTD.
+00C047 UNIMICRO SYSTEMS, INC.
+00C048 BAY TECHNICAL ASSOCIATES
+00C049 U.S. ROBOTICS, INC.
+00C04A GROUP 2000 AG
+00C04B CREATIVE MICROSYSTEMS
+00C04C DEPARTMENT OF FOREIGN AFFAIRS
+00C04D MITEC, INC.
+00C04E COMTROL CORPORATION
+00C04F DELL COMPUTER CORPORATION
+00C050 TOYO DENKI SEIZO K.K.
+00C051 ADVANCED INTEGRATION RESEARCH
+00C052 BURR-BROWN
+00C053 DAVOX CORPORATION
+00C054 NETWORK PERIPHERALS, LTD.
+00C055 MODULAR COMPUTING TECHNOLOGIES
+00C056 SOMELEC
+00C057 MYCO ELECTRONICS
+00C058 DATAEXPERT CORP.
+00C059 NIPPON DENSO CO., LTD.
+00C05A SEMAPHORE COMMUNICATIONS CORP.
+00C05B NETWORKS NORTHWEST, INC.
+00C05C ELONEX PLC
+00C05D L&N TECHNOLOGIES
+00C05E VARI-LITE, INC.
+00C05F FINE-PAL COMPANY LIMITED
+00C060 ID SCANDINAVIA AS
+00C061 SOLECTEK CORPORATION
+00C062 IMPULSE TECHNOLOGY
+00C063 MORNING STAR TECHNOLOGIES, INC
+00C064 GENERAL DATACOMM IND. INC.
+00C065 SCOPE COMMUNICATIONS, INC.
+00C066 DOCUPOINT, INC.
+00C067 UNITED BARCODE INDUSTRIES
+00C068 PHILIP DRAKE ELECTRONICS LTD.
+00C069 ADAPTIVE BROADBAND CORPORATION
+00C06A ZAHNER-ELEKTRIK GMBH & CO. KG
+00C06B OSI PLUS CORPORATION
+00C06C SVEC COMPUTER CORP.
+00C06D BOCA RESEARCH, INC.
+00C06E HAFT TECHNOLOGY, INC.
+00C06F KOMATSU LTD.
+00C070 SECTRA SECURE-TRANSMISSION AB
+00C071 AREANEX COMMUNICATIONS, INC.
+00C072 KNX LTD.
+00C073 XEDIA CORPORATION
+00C074 TOYODA AUTOMATIC LOOM
+00C075 XANTE CORPORATION
+00C076 I-DATA INTERNATIONAL A-S
+00C077 DAEWOO TELECOM LTD.
+00C078 COMPUTER SYSTEMS ENGINEERING
+00C079 FONSYS CO.,LTD.
+00C07A PRIVA B.V.
+00C07B ASCEND COMMUNICATIONS, INC.
+00C07C HIGHTECH INFORMATION
+00C07D RISC DEVELOPMENTS LTD.
+00C07E KUBOTA CORPORATION ELECTRONIC
+00C07F NUPON COMPUTING CORP.
+00C080 NETSTAR, INC.
+00C081 METRODATA LTD.
+00C082 MOORE PRODUCTS CO.
+00C083 TRACE MOUNTAIN PRODUCTS, INC.
+00C084 DATA LINK CORP. LTD.
+00C085 ELECTRONICS FOR IMAGING, INC.
+00C086 THE LYNK CORPORATION
+00C087 UUNET TECHNOLOGIES, INC.
+00C088 EKF ELEKTRONIK GMBH
+00C089 TELINDUS DISTRIBUTION
+00C08A LAUTERBACH DATENTECHNIK GMBH
+00C08B RISQ MODULAR SYSTEMS, INC.
+00C08C PERFORMANCE TECHNOLOGIES, INC.
+00C08D TRONIX PRODUCT DEVELOPMENT
+00C08E NETWORK INFORMATION TECHNOLOGY
+00C08F MATSUSHITA ELECTRIC WORKS, LTD
+00C090 PRAIM S.R.L.
+00C091 JABIL CIRCUIT, INC.
+00C092 MENNEN MEDICAL INC.
+00C093 ALTA RESEARCH CORP.
+00C094 VMX INC.
+00C095 ZNYX
+00C096 TAMURA CORPORATION
+00C097 ARCHIPEL SA
+00C098 CHUNTEX ELECTRONIC CO., LTD.
+00C099 YOSHIKI INDUSTRIAL CO.,LTD.
+00C09A PHOTONICS CORPORATION
+00C09B RELIANCE COMM/TEC, R-TEC
+00C09C TOA ELECTRONIC LTD.
+00C09D DISTRIBUTED SYSTEMS INT'L, INC
+00C09E CACHE COMPUTERS, INC.
+00C09F QUANTA COMPUTER, INC.
+00C0A0 ADVANCE MICRO RESEARCH, INC.
+00C0A1 TOKYO DENSHI SEKEI CO.
+00C0A2 INTERMEDIUM A/S
+00C0A3 DUAL ENTERPRISES CORPORATION
+00C0A4 UNIGRAF OY
+00C0A5 DICKENS DATA SYSTEMS
+00C0A6 EXICOM AUSTRALIA PTY. LTD
+00C0A7 SEEL LTD.
+00C0A8 GVC CORPORATION
+00C0A9 BARRON MCCANN LTD.
+00C0AA SILICON VALLEY COMPUTER
+00C0AB Telco Systems, Inc.
+00C0AC GAMBIT COMPUTER COMMUNICATIONS
+00C0AD MARBEN COMMUNICATION SYSTEMS
+00C0AE TOWERCOM CO. INC. DBA PC HOUSE
+00C0AF TEKLOGIX INC.
+00C0B0 GCC TECHNOLOGIES,INC.
+00C0B1 GENIUS NET CO.
+00C0B2 NORAND CORPORATION
+00C0B3 COMSTAT DATACOMM CORPORATION
+00C0B4 MYSON TECHNOLOGY, INC.
+00C0B5 CORPORATE NETWORK SYSTEMS,INC.
+00C0B6 MERIDIAN DATA, INC.
+00C0B7 AMERICAN POWER CONVERSION CORP
+00C0B8 FRASER'S HILL LTD.
+00C0B9 FUNK SOFTWARE, INC.
+00C0BA NETVANTAGE
+00C0BB FORVAL CREATIVE, INC.
+00C0BC TELECOM AUSTRALIA/CSSC
+00C0BD INEX TECHNOLOGIES, INC.
+00C0BE ALCATEL - SEL
+00C0BF TECHNOLOGY CONCEPTS, LTD.
+00C0C0 SHORE MICROSYSTEMS, INC.
+00C0C1 QUAD/GRAPHICS, INC.
+00C0C2 INFINITE NETWORKS LTD.
+00C0C3 ACUSON COMPUTED SONOGRAPHY
+00C0C4 COMPUTER OPERATIONAL
+00C0C5 SID INFORMATICA
+00C0C6 PERSONAL MEDIA CORP.
+00C0C7 SPARKTRUM MICROSYSTEMS, INC.
+00C0C8 MICRO BYTE PTY. LTD.
+00C0C9 ELSAG BAILEY PROCESS
+00C0CA ALFA, INC.
+00C0CB CONTROL TECHNOLOGY CORPORATION
+00C0CC TELESCIENCES CO SYSTEMS, INC.
+00C0CD COMELTA, S.A.
+00C0CE CEI SYSTEMS & ENGINEERING PTE
+00C0CF IMATRAN VOIMA OY
+00C0D0 RATOC SYSTEM INC.
+00C0D1 COMTREE TECHNOLOGY CORPORATION
+00C0D2 SYNTELLECT, INC.
+00C0D3 OLYMPUS IMAGE SYSTEMS, INC.
+00C0D4 AXON NETWORKS, INC.
+00C0D5 QUANCOM ELECTRONIC GMBH
+00C0D6 J1 SYSTEMS, INC.
+00C0D7 TAIWAN TRADING CENTER DBA
+00C0D8 UNIVERSAL DATA SYSTEMS
+00C0D9 QUINTE NETWORK CONFIDENTIALITY
+00C0DA NICE SYSTEMS LTD.
+00C0DB IPC CORPORATION (PTE) LTD.
+00C0DC EOS TECHNOLOGIES, INC.
+00C0DD QLogic Corporation
+00C0DE ZCOMM, INC.
+00C0DF KYE SYSTEMS CORP.
+00C0E0 DSC COMMUNICATION CORP.
+00C0E1 SONIC SOLUTIONS
+00C0E2 CALCOMP, INC.
+00C0E3 OSITECH COMMUNICATIONS, INC.
+00C0E4 SIEMENS BUILDING
+00C0E5 GESPAC, S.A.
+00C0E6 Verilink Corporation
+00C0E7 FIBERDATA AB
+00C0E8 PLEXCOM, INC.
+00C0E9 OAK SOLUTIONS, LTD.
+00C0EA ARRAY TECHNOLOGY LTD.
+00C0EB SEH COMPUTERTECHNIK GMBH
+00C0EC DAUPHIN TECHNOLOGY
+00C0ED US ARMY ELECTRONIC
+00C0EE KYOCERA CORPORATION
+00C0EF ABIT CORPORATION
+00C0F0 KINGSTON TECHNOLOGY CORP.
+00C0F1 SHINKO ELECTRIC CO., LTD.
+00C0F2 TRANSITION NETWORKS
+00C0F3 NETWORK COMMUNICATIONS CORP.
+00C0F4 INTERLINK SYSTEM CO., LTD.
+00C0F5 METACOMP, INC.
+00C0F6 CELAN TECHNOLOGY INC.
+00C0F7 ENGAGE COMMUNICATION, INC.
+00C0F8 ABOUT COMPUTING INC.
+00C0F9 HARRIS AND JEFFRIES, INC.
+00C0FA CANARY COMMUNICATIONS, INC.
+00C0FB ADVANCED TECHNOLOGY LABS
+00C0FC ELASTIC REALITY, INC.
+00C0FD PROSUM
+00C0FE APTEC COMPUTER SYSTEMS, INC.
+00C0FF DOT HILL SYSTEMS CORPORATION
+00CBBD Cambridge Broadband Ltd.
+00CF1C COMMUNICATION MACHINERY CORP.
+00D000 FERRAN SCIENTIFIC, INC.
+00D001 VST TECHNOLOGIES, INC.
+00D002 DITECH CORPORATION
+00D003 COMDA ENTERPRISES CORP.
+00D004 PENTACOM LTD.
+00D005 ZHS ZEITMANAGEMENTSYSTEME
+00D006 CISCO SYSTEMS, INC.
+00D007 MIC ASSOCIATES, INC.
+00D008 MACTELL CORPORATION
+00D009 HSING TECH. ENTERPRISE CO. LTD
+00D00A LANACCESS TELECOM S.A.
+00D00B RHK TECHNOLOGY, INC.
+00D00C SNIJDER MICRO SYSTEMS
+00D00D MICROMERITICS INSTRUMENT
+00D00E PLURIS, INC.
+00D00F SPEECH DESIGN GMBH
+00D010 CONVERGENT NETWORKS, INC.
+00D011 PRISM VIDEO, INC.
+00D012 GATEWORKS CORP.
+00D013 PRIMEX AEROSPACE COMPANY
+00D014 ROOT, INC.
+00D015 UNIVEX MICROTECHNOLOGY CORP.
+00D016 SCM MICROSYSTEMS, INC.
+00D017 SYNTECH INFORMATION CO., LTD.
+00D018 QWES. COM, INC.
+00D019 DAINIPPON SCREEN CORPORATE
+00D01A URMET SUD S.P.A.
+00D01B MIMAKI ENGINEERING CO., LTD.
+00D01C SBS TECHNOLOGIES,
+00D01D FURUNO ELECTRIC CO., LTD.
+00D01E PINGTEL CORP.
+00D01F CTAM PTY. LTD.
+00D020 AIM SYSTEM, INC.
+00D021 REGENT ELECTRONICS CORP.
+00D022 INCREDIBLE TECHNOLOGIES, INC.
+00D023 INFORTREND TECHNOLOGY, INC.
+00D024 Cognex Corporation
+00D025 XROSSTECH, INC.
+00D026 HIRSCHMANN AUSTRIA GMBH
+00D027 APPLIED AUTOMATION, INC.
+00D028 OMNEON VIDEO NETWORKS
+00D029 WAKEFERN FOOD CORPORATION
+00D02A FLEXION SYSTEMS
+00D02B JETCELL, INC.
+00D02C CAMPBELL SCIENTIFIC, INC.
+00D02D ADEMCO
+00D02E COMMUNICATION AUTOMATION CORP.
+00D02F VLSI TECHNOLOGY INC.
+00D030 SAFETRAN SYSTEMS CORP.
+00D031 INDUSTRIAL LOGIC CORPORATION
+00D032 YANO ELECTRIC CO., LTD.
+00D033 DALIAN DAXIAN NETWORK
+00D034 ORMEC SYSTEMS CORP.
+00D035 BEHAVIOR TECH. COMPUTER CORP.
+00D036 TECHNOLOGY ATLANTA CORP.
+00D037 PHILIPS-DVS-LO BDR
+00D038 FIVEMERE, LTD.
+00D039 UTILICOM, INC.
+00D03A ZONEWORX, INC.
+00D03B VISION PRODUCTS PTY. LTD.
+00D03C Vieo, Inc.
+00D03E ROCKETCHIPS, INC.
+00D03F AMERICAN COMMUNICATION
+00D040 SYSMATE CO., LTD.
+00D041 AMIGO TECHNOLOGY CO., LTD.
+00D042 MAHLO GMBH & CO. UG
+00D043 ZONAL RETAIL DATA SYSTEMS
+00D044 ALIDIAN NETWORKS, INC.
+00D045 KVASER AB
+00D046 DOLBY LABORATORIES, INC.
+00D047 XN TECHNOLOGIES
+00D048 ECTON, INC.
+00D049 IMPRESSTEK CO., LTD.
+00D04A PRESENCE TECHNOLOGY GMBH
+00D04B LA CIE GROUP S.A.
+00D04C EUROTEL TELECOM LTD.
+00D04D DIV OF RESEARCH & STATISTICS
+00D04E LOGIBAG
+00D04F BITRONICS, INC.
+00D050 ISKRATEL
+00D051 O2 MICRO, INC.
+00D052 ASCEND COMMUNICATIONS, INC.
+00D053 CONNECTED SYSTEMS
+00D054 SAS INSTITUTE INC.
+00D055 KATHREIN-WERKE KG
+00D056 SOMAT CORPORATION
+00D057 ULTRAK, INC.
+00D058 CISCO SYSTEMS, INC.
+00D059 AMBIT MICROSYSTEMS CORP.
+00D05A SYMBIONICS, LTD.
+00D05B ACROLOOP MOTION CONTROL
+00D05C TECHNOTREND SYSTEMTECHNIK GMBH
+00D05D INTELLIWORXX, INC.
+00D05E STRATABEAM TECHNOLOGY, INC.
+00D05F VALCOM, INC.
+00D060 PANASONIC EUROPEAN
+00D061 TREMON ENTERPRISES CO., LTD.
+00D062 DIGIGRAM
+00D063 CISCO SYSTEMS, INC.
+00D064 MULTITEL
+00D065 TOKO ELECTRIC
+00D066 WINTRISS ENGINEERING CORP.
+00D067 CAMPIO COMMUNICATIONS
+00D068 IWILL CORPORATION
+00D069 TECHNOLOGIC SYSTEMS
+00D06A LINKUP SYSTEMS CORPORATION
+00D06B SR TELECOM INC.
+00D06C SHAREWAVE, INC.
+00D06D ACRISON, INC.
+00D06E TRENDVIEW RECORDERS LTD.
+00D06F KMC CONTROLS
+00D070 LONG WELL ELECTRONICS CORP.
+00D071 ECHELON CORP.
+00D072 BROADLOGIC
+00D073 ACN ADVANCED COMMUNICATIONS
+00D074 TAQUA SYSTEMS, INC.
+00D075 ALARIS MEDICAL SYSTEMS, INC.
+00D076 MERRILL LYNCH & CO., INC.
+00D077 LUCENT TECHNOLOGIES
+00D078 ELTEX OF SWEDEN AB
+00D079 CISCO SYSTEMS, INC.
+00D07A AMAQUEST COMPUTER CORP.
+00D07B COMCAM INTERNATIONAL LTD.
+00D07C KOYO ELECTRONICS INC. CO.,LTD.
+00D07D COSINE COMMUNICATIONS
+00D07E KEYCORP LTD.
+00D07F STRATEGY & TECHNOLOGY, LIMITED
+00D080 EXABYTE CORPORATION
+00D081 REAL TIME DEVICES USA, INC.
+00D082 IOWAVE INC.
+00D083 INVERTEX, INC.
+00D084 NEXCOMM SYSTEMS, INC.
+00D085 OTIS ELEVATOR COMPANY
+00D086 FOVEON, INC.
+00D087 MICROFIRST INC.
+00D088 MAINSAIL NETWORKS, INC.
+00D089 DYNACOLOR, INC.
+00D08A PHOTRON USA
+00D08B ADVA Limited
+00D08C GENOA TECHNOLOGY, INC.
+00D08D PHOENIX GROUP, INC.
+00D08E NVISION INC.
+00D08F ARDENT TECHNOLOGIES, INC.
+00D090 CISCO SYSTEMS, INC.
+00D091 SMARTSAN SYSTEMS, INC.
+00D092 GLENAYRE WESTERN MULTIPLEX
+00D093 TQ - COMPONENTS GMBH
+00D094 TIMELINE VISTA, INC.
+00D095 XYLAN CORPORATION
+00D096 3COM EUROPE LTD.
+00D097 CISCO SYSTEMS, INC.
+00D098 IPS AUTOMATION
+00D099 ELCARD OY
+00D09A FILANET CORPORATION
+00D09B SPECTEL LTD.
+00D09C KAPADIA COMMUNICATIONS
+00D09D VERIS INDUSTRIES
+00D09E 2WIRE, INC.
+00D09F NOVTEK TEST SYSTEMS
+00D0A0 MIPS DENMARK
+00D0A1 OSKAR VIERLING GMBH + CO. KG
+00D0A2 INTEGRATED DEVICE
+00D0A3 VOCAL DATA, INC.
+00D0A4 ALANTRO COMMUNICATIONS
+00D0A5 AMERICAN ARIUM
+00D0A6 LANBIRD TECHNOLOGY CO., LTD.
+00D0A7 TOKYO SOKKI KENKYUJO CO., LTD.
+00D0A8 NETWORK ENGINES, INC.
+00D0A9 SHINANO KENSHI CO., LTD.
+00D0AA CHASE COMMUNICATIONS
+00D0AB DELTAKABEL TELECOM CV
+00D0AC GRAYSON WIRELESS
+00D0AD TL INDUSTRIES
+00D0AE ORESIS COMMUNICATIONS, INC.
+00D0AF CUTLER-HAMMER, INC.
+00D0B0 BITSWITCH LTD.
+00D0B1 OMEGA ELECTRONICS SA
+00D0B2 XIOTECH CORPORATION
+00D0B3 DRS FLIGHT SAFETY AND
+00D0B4 KATSUJIMA CO., LTD.
+00D0B5 DOTCOM
+00D0B6 CRESCENT NETWORKS, INC.
+00D0B7 INTEL CORPOTATION
+00D0B8 IOMEGA CORP.
+00D0B9 MICROTEK INTERNATIONAL, INC.
+00D0BA CISCO SYSTEMS, INC.
+00D0BB CISCO SYSTEMS, INC.
+00D0BC CISCO SYSTEMS, INC.
+00D0BD SICAN GMBH
+00D0BE EMUTEC INC.
+00D0BF PIVOTAL TECHNOLOGIES
+00D0C0 CISCO SYSTEMS, INC.
+00D0C1 HARMONIC DATA SYSTEMS, LTD.
+00D0C2 BALTHAZAR TECHNOLOGY AB
+00D0C3 VIVID TECHNOLOGY PTE, LTD.
+00D0C4 TERATECH CORPORATION
+00D0C5 COMPUTATIONAL SYSTEMS, INC.
+00D0C6 THOMAS & BETTS CORP.
+00D0C7 PATHWAY, INC.
+00D0C8 I/O CONSULTING A/S
+00D0C9 ADVANTECH CO., LTD.
+00D0CA INTRINSYC SOFTWARE INC.
+00D0CB DASAN CO., LTD.
+00D0CC TECHNOLOGIES LYRE INC.
+00D0CD ATAN TECHNOLOGY INC.
+00D0CE ASYST ELECTRONIC
+00D0CF MORETON BAY
+00D0D0 ZHONGXING TELECOM LTD.
+00D0D1 SIROCCO SYSTEMS, INC.
+00D0D2 EPILOG CORPORATION
+00D0D3 CISCO SYSTEMS, INC.
+00D0D4 V-BITS, INC.
+00D0D5 GRUNDIG AG
+00D0D6 AETHRA TELECOMUNICAZIONI
+00D0D7 B2C2, INC.
+00D0D8 3Com Corporation
+00D0D9 DEDICATED MICROCOMPUTERS
+00D0DA TAICOM DATA SYSTEMS CO., LTD.
+00D0DB MCQUAY INTERNATIONAL
+00D0DC MODULAR MINING SYSTEMS, INC.
+00D0DD SUNRISE TELECOM, INC.
+00D0DE PHILIPS MULTIMEDIA NETWORK
+00D0DF KUZUMI ELECTRONICS, INC.
+00D0E0 DOOIN ELECTRONICS CO.
+00D0E1 AVIONITEK ISRAEL INC.
+00D0E2 MRT MICRO, INC.
+00D0E3 ELE-CHEM ENGINEERING CO., LTD.
+00D0E4 CISCO SYSTEMS, INC.
+00D0E5 SOLIDUM SYSTEMS CORP.
+00D0E6 IBOND INC.
+00D0E7 VCON TELECOMMUNICATION LTD.
+00D0E8 MAC SYSTEM CO., LTD.
+00D0E9 ADVANTAGE CENTURY
+00D0EA NEXTONE COMMUNICATIONS, INC.
+00D0EB LIGHTERA NETWORKS, INC.
+00D0EC NAKAYO TELECOMMUNICATIONS, INC
+00D0ED XIOX
+00D0EE DICTAPHONE CORPORATION
+00D0EF IGT
+00D0F0 CONVISION TECHNOLOGY GMBH
+00D0F1 SEGA ENTERPRISES, LTD.
+00D0F2 MONTEREY NETWORKS
+00D0F3 SOLARI DI UDINE SPA
+00D0F4 CARINTHIAN TECH INSTITUTE
+00D0F5 ORANGE MICRO, INC.
+00D0F6 NORTHCHURCH COMMUNICATIONS INC
+00D0F7 NEXT NETS CORPORATION
+00D0F8 FUJIAN STAR TERMINAL
+00D0F9 ACUTE COMMUNICATIONS CORP.
+00D0FA RACAL GUARDATA
+00D0FB TEK MICROSYSTEMS, INCORPORATED
+00D0FC GRANITE MICROSYSTEMS
+00D0FD OPTIMA TELE.COM, INC.
+00D0FE ASTRAL POINT
+00D0FF CISCO SYSTEMS, INC.
+00DD00 UNGERMANN-BASS INC.
+00DD01 UNGERMANN-BASS INC.
+00DD02 UNGERMANN-BASS INC.
+00DD03 UNGERMANN-BASS INC.
+00DD04 UNGERMANN-BASS INC.
+00DD05 UNGERMANN-BASS INC.
+00DD06 UNGERMANN-BASS INC.
+00DD07 UNGERMANN-BASS INC.
+00DD08 UNGERMANN-BASS INC.
+00DD09 UNGERMANN-BASS INC.
+00DD0A UNGERMANN-BASS INC.
+00DD0B UNGERMANN-BASS INC.
+00DD0C UNGERMANN-BASS INC.
+00DD0D UNGERMANN-BASS INC.
+00DD0E UNGERMANN-BASS INC.
+00DD0F UNGERMANN-BASS INC.
+00E000 FUJITSU, LTD
+00E001 STRAND LIGHTING LIMITED
+00E002 CROSSROADS SYSTEMS, INC.
+00E003 NOKIA WIRELESS BUSINESS COMMUN
+00E004 PMC-SIERRA, INC.
+00E005 TECHNICAL CORP.
+00E006 SILICON INTEGRATED SYS. CORP.
+00E007 NETWORK ALCHEMY LTD.
+00E008 AMAZING CONTROLS! INC.
+00E009 MARATHON TECHNOLOGIES CORP.
+00E00A DIBA, INC.
+00E00B ROOFTOP COMMUNICATIONS CORP.
+00E00C MOTOROLA
+00E00D RADIANT SYSTEMS
+00E00E AVALON IMAGING SYSTEMS, INC.
+00E00F SHANGHAI BAUD DATA
+00E010 HESS SB-AUTOMATENBAU GMBH
+00E011 UNIDEN SAN DIEGO
+00E012 PLUTO TECHNOLOGIES
+00E013 EASTERN ELECTRONIC CO., LTD.
+00E014 CISCO SYSTEMS, INC.
+00E015 HEIWA CORPORATION
+00E016 RAPID CITY COMMUNICATIONS
+00E017 EXXACT GMBH
+00E018 ASUSTEK COMPUTER INC.
+00E019 ING. GIORDANO ELETTRONICA
+00E01A COMTEC SYSTEMS. CO., LTD.
+00E01B SPHERE COMMUNICATIONS, INC.
+00E01C MOBILITY ELECTRONICSY
+00E01D WEBTV NETWORKS, INC.
+00E01E CISCO SYSTEMS, INC.
+00E01F AVIDIA SYSTEMS, INC.
+00E020 TECNOMEN OY
+00E021 FREEGATE CORP.
+00E022 MEDIALIGHT INC.
+00E023 TELRAD
+00E024 GADZOOX NETWORKS
+00E025 DIT CO., LTD.
+00E026 EASTMAN KODAK CO.
+00E027 DUX, INC.
+00E028 APTIX CORPORATION
+00E029 STANDARD MICROSYSTEMS CORP.
+00E02A TANDBERG TELEVISION AS
+00E02B EXTREME NETWORKS
+00E02C AST COMPUTER
+00E02D INNOMEDIALOGIC, INC.
+00E02E SPC ELECTRONICS CORPORATION
+00E02F MCNS HOLDINGS, L.P.
+00E030 MELITA INTERNATIONAL CORP.
+00E031 HAGIWARA ELECTRIC CO., LTD.
+00E032 MISYS FINANCIAL SYSTEMS, LTD.
+00E033 E.E.P.D. GMBH
+00E034 CISCO SYSTEMS, INC.
+00E035 LOUGHBOROUGH SOUND IMAGES, PLC
+00E036 PIONEER CORPORATION
+00E037 CENTURY CORPORATION
+00E038 PROXIMA CORPORATION
+00E039 PARADYNE CORP.
+00E03A CABLETRON SYSTEMS, INC.
+00E03B PROMINET CORPORATION
+00E03C ADVANSYS
+00E03D FOCON ELECTRONIC SYSTEMS A/S
+00E03E ALFATECH, INC.
+00E03F JATON CORPORATION
+00E040 DESKSTATION TECHNOLOGY, INC.
+00E041 CSPI
+00E042 PACOM DATA LTD.
+00E043 VITALCOM
+00E044 LSICS CORPORATION
+00E045 TOUCHWAVE, INC.
+00E046 BENTLY NEVADA CORP.
+00E047 INFOCUS SYSTEMS
+00E048 SDL COMMUNICATIONS, INC.
+00E049 MICROWI ELECTRONIC GMBH
+00E04A ENHANCED MESSAGING SYSTEMS,INC
+00E04B JUMP INDUSTRIELLE
+00E04C REALTEK SEMICONDUCTOR CORP.
+00E04D INTERNET INITIATIVE JAPAN, INC
+00E04E SANYO DENKI CO., LTD.
+00E04F CISCO SYSTEMS, INC.
+00E050 EXECUTONE INFORMATION
+00E051 TALX CORPORATION
+00E052 FOUNDRY NETWORKS, INC.
+00E053 CELLPORT LABS, INC.
+00E054 KODAI HITEC CO., LTD.
+00E055 INGENIERIA ELECTRONICA
+00E056 HOLONTECH CORPORATION
+00E057 HAN MICROTELECOM. CO., LTD.
+00E058 PHASE ONE DENMARK A/S
+00E059 CONTROLLED ENVIRONMENTS, LTD.
+00E05A GALEA NETWORK SECURITY
+00E05B WEST END SYSTEMS CORP.
+00E05C MATSUSHITA KOTOBUKI
+00E05D UNITEC CO., LTD.
+00E05E JAPAN AVIATION ELECTRONICS
+00E05F E-NET, INC.
+00E060 SHERWOOD
+00E061 EDGEPOINT NETWORKS, INC.
+00E062 HOST ENGINEERING
+00E063 CABLETRON - YAGO SYSTEMS, INC.
+00E064 SAMSUNG ELECTRONICS
+00E065 OPTICAL ACCESS INTERNATIONAL
+00E066 PROMAX SYSTEMS, INC.
+00E067 EAC AUTOMATION-CONSULTING GMBH
+00E068 MERRIMAC SYSTEMS INC.
+00E069 JAYCOR NETWORKS, INC.
+00E06A KAPSCH AG
+00E06B W&G SPECIAL PRODUCTS
+00E06C BALTIMORE TECHNOLOGIES, LTD.
+00E06D COMPUWARE CORPORATION
+00E06E FAR SYSTEMS SPA
+00E06F TERAYON CORP.
+00E070 DH TECHNOLOGY
+00E071 EPIS MICROCOMPUTER
+00E072 LYNK
+00E073 NATIONAL AMUSEMENT
+00E074 TIERNAN COMMUNICATIONS, INC.
+00E075 ATLAS COMPUTER EQUIPMENT, INC.
+00E076 DEVELOPMENT CONCEPTS, INC.
+00E077 WEBGEAR, INC.
+00E078 BERKELEY NETWORKS
+00E079 A.T.N.R.
+00E07A MIKRODIDAKT AB
+00E07B BAY NETWORKS
+00E07C METTLER-TOLEDO, INC.
+00E07D NETRONIX, INC.
+00E07E WALT DISNEY IMAGINEERING
+00E07F LOGISTISTEM SRL
+00E080 CONTROL RESOURCES CORPORATION
+00E081 TYAN COMPUTER CORP.
+00E082 ANERMA
+00E083 JATO TECHNOLOGIES, INC.
+00E084 COMPULITE R&D
+00E085 GLOBAL MAINTECH, INC.
+00E086 CYBEX COMPUTER PRODUCTS
+00E087 LECROY
+00E088 LTX CORPORATION
+00E089 ION Networks, Inc.
+00E08A GEC AVERY, LTD.
+00E08B QLOGIC CORP.
+00E08C NEOPARADIGM LABS, INC.
+00E08D PRESSURE SYSTEMS, INC.
+00E08E UTSTARCOM
+00E08F CISCO SYSTEMS, INC.
+00E090 BECKMAN LAB. AUTOMATION DIV.
+00E091 LG ELECTRONICS, INC.
+00E092 ADMTEK INCORPORATED
+00E093 ACKFIN NETWORKS
+00E094 OSAI SRL
+00E095 ADVANCED-VISION TECHNOLGIES
+00E096 SHIMADZU CORPORATION
+00E097 CARRIER ACCESS CORPORATION
+00E098 ABOCOM SYSTEMS, INC.
+00E099 SAMSON AG
+00E09A POSITRON INDUSTRIES, INC.
+00E09B ENGAGE NETWORKS, INC.
+00E09C MII
+00E09D SARNOFF CORPORATION
+00E09E QUANTUM CORPORATION
+00E09F PIXEL VISION
+00E0A0 WILTRON CO.
+00E0A1 HIMA PAUL HILDEBRANDT
+00E0A2 MICROSLATE INC.
+00E0A3 CISCO SYSTEMS, INC.
+00E0A4 ESAOTE S.P.A.
+00E0A5 COMCORE SEMICONDUCTOR, INC.
+00E0A6 TELOGY NETWORKS, INC.
+00E0A7 IPC INFORMATION SYSTEMS, INC.
+00E0A8 SAT GMBH&CO
+00E0A9 FUNAI ELECTRIC CO., LTD.
+00E0AA ELECTROSONIC LTD.
+00E0AB DIMAT S.A.
+00E0AC MIDSCO, INC.
+00E0AD EES TECHNOLOGY, LTD.
+00E0AE XAQTI CORPORATION
+00E0AF GENERAL DYNAMICS INFORMATION
+00E0B0 CISCO SYSTEMS, INC.
+00E0B1 PACKET ENGINES, INC.
+00E0B2 TELMAX COMMUNICATIONS CORP.
+00E0B3 ETHERWAN SYSTEMS, INC.
+00E0B4 TECHNO SCOPE CO., LTD.
+00E0B5 ARDENT COMMUNICATIONS CORP.
+00E0B6 Entrada Networks
+00E0B7 PI GROUP, LTD.
+00E0B8 GATEWAY 2000
+00E0B9 BYAS SYSTEMS
+00E0BA BERGHOF AUTOMATIONSTECHNIK
+00E0BB NBX CORPORATION
+00E0BC SYMON COMMUNICATIONS, INC.
+00E0BD INTERFACE SYSTEMS, INC.
+00E0BE GENROCO INTERNATIONAL, INC.
+00E0BF TORRENT NETWORKING
+00E0C0 SEIWA ERECTRIC MFG. CO., LTD.
+00E0C1 MEMOREX TELEX JAPAN, LTD.
+00E0C2 NECSY SPA
+00E0C3 SAKAI SYSTEM DEVELOPMENT CORP.
+00E0C4 HORNER ELECTRIC, INC.
+00E0C5 BCOM ELECTRONICS INC.
+00E0C6 LINK2IT, L.L.C.
+00E0C7 EUROTECH SRL
+00E0C8 VIRTUAL ACCESS, LTD.
+00E0C9 AUTOMATEDLOGIC CORPORATION
+00E0CA BEST DATA PRODUCTS
+00E0CB RESON, INC.
+00E0CC HERO SYSTEMS, LTD.
+00E0CD SENSIS CORPORATION
+00E0CE ARN
+00E0CF INTEGRATED DEVICE
+00E0D0 NETSPEED, INC.
+00E0D1 TELSIS LIMITED
+00E0D2 VERSANET COMMUNICATIONS, INC.
+00E0D3 DATENTECHNIK GMBH
+00E0D4 EXCELLENT COMPUTER
+00E0D5 ARCXEL TECHNOLOGIES, INC.
+00E0D6 COMPUTER & COMMUNICATION
+00E0D7 SUNSHINE ELECTRONICS, INC.
+00E0D8 LANBIT COMPUTER, INC.
+00E0D9 TAZMO CO., LTD.
+00E0DA ASSURED ACCESS
+00E0DB VIAVIDEO COMMUNICATIONS
+00E0DC NEXWARE CORP.
+00E0DD ZENITH ELECTRONICS CORPORATION
+00E0DE DATAX NV
+00E0DF KE KOMMUNIKATIONS-ELECTRONIK
+00E0E0 SI ELECTRONICS, LTD.
+00E0E1 G2 NETWORKS, ILNC.
+00E0E2 INNOVA CORP.
+00E0E3 SK-ELEKTRONIK GMBH
+00E0E4 FANUC ROBOTICS NORTH AMERICA,
+00E0E5 CINCO NETWORKS, INC.
+00E0E6 INCAA DATACOM B.V.
+00E0E7 RAYTHEON E-SYSTEMS, INC.
+00E0E8 GRETACODER DATA SYSTEMS AG
+00E0E9 DATA LABS, INC.
+00E0EA INNOVAT COMMUNICATIONS, INC.
+00E0EB DIGICOM SYSTEMS, INCORPORATED
+00E0EC CELESTICA INC.
+00E0ED SILICOM, LTD.
+00E0EE MAREL HF
+00E0EF DIONEX
+00E0F0 ABLER TECHNOLOGY, INC.
+00E0F1 THAT CORPORATION
+00E0F2 ARLOTTO COMNET, INC.
+00E0F3 WEBSPRINT COMMUNICATIONS, INC.
+00E0F4 INSIDE TECHNOLOGY A/S
+00E0F5 TELES AG
+00E0F6 DECISION EUROPE
+00E0F7 CISCO SYSTEMS, INC.
+00E0F8 DIANA CONTROL AB
+00E0F9 CISCO SYSTEMS, INC.
+00E0FA TRL TECHNOLOGY, LTD.
+00E0FB LEIGHTRONIX, INC.
+00E0FC HUAWEI TECHNOLOGIES CO., LTD.
+00E0FD A-TREND TECHNOLOGY CO., LTD.
+00E0FE CISCO SYSTEMS, INC.
+00E0FF SECURITY DYNAMICS TECHNOLOGIES
+00E6D3 NIXDORF COMPUTER CORP.
+020701 RACAL-DATACOM
+021C7C PERQ SYSTEMS CORPORATION
+026086 LOGIC REPLACEMENT TECH. LTD.
+02608C 3COM CORPORATION
+027001 RACAL-DATACOM
+0270B0 M/A-COM INC. COMPANIES
+0270B3 DATA RECALL LTD
+029D8E CARDIAC RECORDERS INC.
+02AA3C OLIVETTI TELECOMM SPA (OLTECO)
+02BB01 OCTOTHORPE CORP.
+02C08C 3COM CORPORATION
+02CF1C COMMUNICATION MACHINERY CORP.
+02E6D3 NIXDORF COMPUTER CORPORATION
+040AE0 XMIT AG COMPUTER NETWORKS
+04E0C4 TRIUMPH-ADLER AG
+080001 COMPUTERVISION CORPORATION
+080002 BRIDGE COMMUNICATIONS INC.
+080003 ADVANCED COMPUTER COMM.
+080004 CROMEMCO INCORPORATED
+080005 SYMBOLICS INC.
+080006 SIEMENS AG
+080007 APPLE COMPUTER INC.
+080008 BOLT BERANEK AND NEWMAN INC.
+080009 HEWLETT PACKARD
+08000A NESTAR SYSTEMS INCORPORATED
+08000B UNISYS CORPORATION
+08000C MIKLYN DEVELOPMENT CO.
+08000D INTERNATIONAL COMPUTERS LTD.
+08000E NCR CORPORATION
+08000F MITEL CORPORATION
+080011 TEKTRONIX INC.
+080012 BELL ATLANTIC INTEGRATED SYST.
+080013 EXXON
+080014 EXCELAN
+080015 STC BUSINESS SYSTEMS
+080016 BARRISTER INFO SYS CORP
+080017 NATIONAL SEMICONDUCTOR
+080018 PIRELLI FOCOM NETWORKS
+080019 GENERAL ELECTRIC CORPORATION
+08001A TIARA/ 10NET
+08001B DATA GENERAL
+08001C KDD-KOKUSAI DEBNSIN DENWA CO.
+08001D ABLE COMMUNICATIONS INC.
+08001E APOLLO COMPUTER INC.
+08001F SHARP CORPORATION
+080020 SUN MICROSYSTEMS INC.
+080021 3M COMPANY
+080022 NBI INC.
+080023 MATSUHITA GRAPHIC COMM SYS INC
+080024 10NET COMMUNICATIONS/DCA
+080025 CONTROL DATA
+080026 NORSK DATA A.S.
+080027 CADMUS COMPUTER SYSTEMS
+080028 TEXAS INSTRUMENTS
+080029 MEGATEK CORPORATION
+08002A MOSAIC TECHNOLOGIES INC.
+08002B DIGITAL EQUIPMENT CORPORATION
+08002C BRITTON LEE INC.
+08002D LAN-TEC INC.
+08002E METAPHOR COMPUTER SYSTEMS
+08002F PRIME COMPUTER INC.
+080030 NETWORK RESEARCH CORPORATION
+080030 CERN
+080030 ROYAL MELBOURNE INST OF TECH
+080031 LITTLE MACHINES INC.
+080032 TIGAN INCORPORATED
+080033 BAUSCH & LOMB
+080034 FILENET CORPORATION
+080035 MICROFIVE CORPORATION
+080036 INTERGRAPH CORPORATION
+080037 FUJI-XEROX CO. LTD.
+080038 CII HONEYWELL BULL
+080039 SPIDER SYSTEMS LIMITED
+08003A ORCATECH INC.
+08003B TORUS SYSTEMS LIMITED
+08003C SCHLUMBERGER WELL SERVICES
+08003D CADNETIX CORPORATIONS
+08003E CODEX CORPORATION
+08003F FRED KOSCHARA ENTERPRISES
+080040 FERRANTI COMPUTER SYS. LIMITED
+080041 RACAL-MILGO INFORMATION SYS..
+080042 JAPAN MACNICS CORP.
+080043 PIXEL COMPUTER INC.
+080044 DAVID SYSTEMS INC.
+080045 CONCURRENT COMPUTER CORP.
+080046 SONY CORPORATION LTD.
+080047 SEQUENT COMPUTER SYSTEMS INC.
+080048 EUROTHERM GAUGING SYSTEMS
+080049 UNIVATION
+08004A BANYAN SYSTEMS INC.
+08004B PLANNING RESEARCH CORP.
+08004C HYDRA COMPUTER SYSTEMS INC.
+08004D CORVUS SYSTEMS INC.
+08004E 3COM EUROPE LTD.
+08004F CYGNET SYSTEMS
+080050 DAISY SYSTEMS CORP.
+080051 EXPERDATA
+080052 INSYSTEC
+080053 MIDDLE EAST TECH. UNIVERSITY
+080055 STANFORD TELECOMM. INC.
+080056 STANFORD LINEAR ACCEL. CENTER
+080057 EVANS & SUTHERLAND
+080058 SYSTEMS CONCEPTS
+080059 A/S MYCRON
+08005A IBM CORPORATION
+08005B VTA TECHNOLOGIES INC.
+08005C FOUR PHASE SYSTEMS
+08005D GOULD INC.
+08005E COUNTERPOINT COMPUTER INC.
+08005F SABER TECHNOLOGY CORP.
+080060 INDUSTRIAL NETWORKING INC.
+080061 JAROGATE LTD.
+080062 GENERAL DYNAMICS
+080063 PLESSEY
+080064 AUTOPHON AG
+080065 GENRAD INC.
+080066 AGFA CORPORATION
+080067 COMDESIGN
+080068 RIDGE COMPUTERS
+080069 SILICON GRAPHICS INC.
+08006A ATT BELL LABORATORIES
+08006B ACCEL TECHNOLOGIES INC.
+08006C SUNTEK TECHNOLOGY INT'L
+08006D WHITECHAPEL COMPUTER WORKS
+08006E MASSCOMP
+08006F PHILIPS APELDOORN B.V.
+080070 MITSUBISHI ELECTRIC CORP.
+080071 MATRA (DSIE)
+080072 XEROX CORP UNIV GRANT PROGRAM
+080073 TECMAR INC.
+080074 CASIO COMPUTER CO. LTD.
+080075 DANSK DATA ELECTRONIK
+080076 PC LAN TECHNOLOGIES
+080077 TSL COMMUNICATIONS LTD.
+080078 ACCELL CORPORATION
+080079 THE DROID WORKS
+08007A INDATA
+08007B SANYO ELECTRIC CO. LTD.
+08007C VITALINK COMMUNICATIONS CORP.
+08007E AMALGAMATED WIRELESS(AUS) LTD
+08007F CARNEGIE-MELLON UNIVERSITY
+080080 AES DATA INC.
+080081 ,ASTECH INC.
+080082 VERITAS SOFTWARE
+080083 SEIKO INSTRUM. AND ELECTRONICS
+080084 TOMEN ELECTRONICS CORP.
+080085 ELXSI
+080086 IMAGEN CORPORATION
+080087 XYPLEX
+080088 MCDATA CORPORATION
+080089 KINETICS
+08008A PERFORMANCE TECHNOLOGY
+08008B PYRAMID TECHNOLOGY CORP.
+08008C NETWORK RESEARCH CORPORATION
+08008D XYVISION INC.
+08008E TANDEM COMPUTERS
+08008F CHIPCOM CORPORATION
+080090 SONOMA SYSTEMS
+08BBCC AK-NORD EDV VERTRIEBSGES. MBH
+10005A IBM CORPORATION
+1000E8 NATIONAL SEMICONDUCTOR
+800010 ATT BELL LABORATORIES
+A06A00 Verilink Corporation
+AA0000 DIGITAL EQUIPMENT CORPORATION
+AA0001 DIGITAL EQUIPMENT CORPORATION
+AA0002 DIGITAL EQUIPMENT CORPORATION
+AA0003 DIGITAL EQUIPMENT CORPORATION
+AA0004 DIGITAL EQUIPMENT CORPORATION
diff --git a/drivers/ieee1394/oui2c.sh b/drivers/ieee1394/oui2c.sh
new file mode 100644 (file)
index 0000000..d50dc7a
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+cat <<EOF
+/* Generated file for OUI database */
+
+#include <linux/config.h>
+
+#ifdef CONFIG_IEEE1394_OUI_DB
+struct oui_list_struct {
+       int oui;
+       char *name;
+} oui_list[] = {
+EOF
+
+while read oui name; do
+       echo "  { 0x$oui, \"$name\" },"
+done
+
+cat <<EOF
+};
+
+#endif /* CONFIG_IEEE1394_OUI_DB */
+EOF
index 96b9e24c0625b7274e9a76fd91daf7156957e4a1..9521c1331214c9fc5ca1966477eb08f461007dc2 100644 (file)
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+/*
+ * Contributions:
+ *
+ * Manfred Weihs <weihs@ict.tuwien.ac.at>
+ *        reading bus info block (containing GUID) from serial 
+ *            eeprom via i2c and storing it in config ROM
+ *        Reworked code for initiating bus resets
+ *            (long, short, with or without hold-off)
+ */
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -450,7 +460,7 @@ static void handle_selfid(struct ti_lynx *lynx, struct hpsb_host *host)
 
         if (host->in_bus_reset) return; /* in bus reset again */
 
-        if (isroot) reg_set_bits(lynx, LINK_CONTROL, LINK_CONTROL_CYCMASTER);
+        if (isroot) reg_set_bits(lynx, LINK_CONTROL, LINK_CONTROL_CYCMASTER); //FIXME: I do not think, we need this here
         reg_set_bits(lynx, LINK_CONTROL,
                      LINK_CONTROL_RCV_CMP_VALID | LINK_CONTROL_TX_ASYNC_EN
                      | LINK_CONTROL_RX_ASYNC_EN | LINK_CONTROL_CYCTIMEREN);
@@ -563,6 +573,7 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
         struct hpsb_packet *packet;
        LIST_HEAD(packet_list);
         unsigned long flags;
+       int phy_reg;
 
         switch (cmd) {
         case RESET_BUS:
@@ -571,21 +582,140 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg)
                         break;
                 }
 
-                if (arg) {
-                        arg = 3 << 6;
-                } else {
-                        arg = 1 << 6;
-                }
-
-                retval = get_phy_reg(lynx, 1);
-                arg |= (retval == -1 ? 63 : retval);
-                retval = 0;
-
-                PRINT(KERN_INFO, lynx->id, "resetting bus on request");
+               switch (arg) {
+               case SHORT_RESET:
+                       if (lynx->phyic.reg_1394a) {
+                               phy_reg = get_phy_reg(lynx, 5);
+                               if (phy_reg == -1) {
+                                       PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                                       retval = -1;
+                                       break;
+                               }
+                               phy_reg |= 0x40;
+
+                               PRINT(KERN_INFO, lynx->id, "resetting bus (short bus reset) on request");
+
+                               lynx->selfid_size = -1;
+                               lynx->phy_reg0 = -1;
+                               set_phy_reg(lynx, 5, phy_reg); /* set ISBR */
+                               break;
+                       } else {
+                               PRINT(KERN_INFO, lynx->id, "cannot do short bus reset, because of old phy");
+                               /* fall through to long bus reset */
+                       }
+               case LONG_RESET:
+                       phy_reg = get_phy_reg(lynx, 1);
+                       if (phy_reg == -1) {
+                               PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                               retval = -1;
+                               break;
+                       }
+                       phy_reg |= 0x40;
+
+                       PRINT(KERN_INFO, lynx->id, "resetting bus (long bus reset) on request");
+
+                       lynx->selfid_size = -1;
+                       lynx->phy_reg0 = -1;
+                       set_phy_reg(lynx, 1, phy_reg); /* clear RHB, set IBR */
+                       break;
+               case SHORT_RESET_NO_FORCE_ROOT:
+                       if (lynx->phyic.reg_1394a) {
+                               phy_reg = get_phy_reg(lynx, 1);
+                               if (phy_reg == -1) {
+                                       PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                                       retval = -1;
+                                       break;
+                               }
+                               if (phy_reg & 0x80) {
+                                       phy_reg &= ~0x80;
+                                       set_phy_reg(lynx, 1, phy_reg); /* clear RHB */
+                               }
+
+                               phy_reg = get_phy_reg(lynx, 5);
+                               if (phy_reg == -1) {
+                                       PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                                       retval = -1;
+                                       break;
+                               }
+                               phy_reg |= 0x40;
+
+                               PRINT(KERN_INFO, lynx->id, "resetting bus (short bus reset, no force_root) on request");
+
+                               lynx->selfid_size = -1;
+                               lynx->phy_reg0 = -1;
+                               set_phy_reg(lynx, 5, phy_reg); /* set ISBR */
+                               break;
+                       } else {
+                               PRINT(KERN_INFO, lynx->id, "cannot do short bus reset, because of old phy");
+                               /* fall through to long bus reset */
+                       }
+               case LONG_RESET_NO_FORCE_ROOT:
+                       phy_reg = get_phy_reg(lynx, 1);
+                       if (phy_reg == -1) {
+                               PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                               retval = -1;
+                               break;
+                       }
+                       phy_reg &= ~0x80;
+                       phy_reg |= 0x40;
+
+                       PRINT(KERN_INFO, lynx->id, "resetting bus (long bus reset, no force_root) on request");
+
+                       lynx->selfid_size = -1;
+                       lynx->phy_reg0 = -1;
+                       set_phy_reg(lynx, 1, phy_reg); /* clear RHB, set IBR */
+                       break;
+               case SHORT_RESET_FORCE_ROOT:
+                       if (lynx->phyic.reg_1394a) {
+                               phy_reg = get_phy_reg(lynx, 1);
+                               if (phy_reg == -1) {
+                                       PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                                       retval = -1;
+                                       break;
+                               }
+                               if (!(phy_reg & 0x80)) {
+                                       phy_reg |= 0x80;
+                                       set_phy_reg(lynx, 1, phy_reg); /* set RHB */
+                               }
+
+                               phy_reg = get_phy_reg(lynx, 5);
+                               if (phy_reg == -1) {
+                                       PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                                       retval = -1;
+                                       break;
+                               }
+                               phy_reg |= 0x40;
+
+                               PRINT(KERN_INFO, lynx->id, "resetting bus (short bus reset, force_root set) on request");
+
+                               lynx->selfid_size = -1;
+                               lynx->phy_reg0 = -1;
+                               set_phy_reg(lynx, 5, phy_reg); /* set ISBR */
+                               break;
+                       } else {
+                               PRINT(KERN_INFO, lynx->id, "cannot do short bus reset, because of old phy");
+                               /* fall through to long bus reset */
+                       }
+               case LONG_RESET_FORCE_ROOT:
+                       phy_reg = get_phy_reg(lynx, 1);
+                       if (phy_reg == -1) {
+                               PRINT(KERN_ERR, lynx->id, "cannot reset bus, because read phy reg failed");
+                               retval = -1;
+                               break;
+                       }
+                       phy_reg |= 0xc0;
+
+                       PRINT(KERN_INFO, lynx->id, "resetting bus (long bus reset, force_root set) on request");
+
+                       lynx->selfid_size = -1;
+                       lynx->phy_reg0 = -1;
+                       set_phy_reg(lynx, 1, phy_reg); /* set IBR and RHB */
+                       break;
+               default:
+                       PRINT(KERN_ERR, lynx->id, "unknown argument for reset_bus command %d", arg);
+                       retval = -1;
+               }
 
-                lynx->selfid_size = -1;
-                lynx->phy_reg0 = -1;
-                set_phy_reg(lynx, 1, arg);
                 break;
 
         case GET_CYCLE_COUNTER:
@@ -1706,6 +1836,7 @@ static struct hpsb_host_driver lynx_driver = {
         .get_rom =         get_lynx_rom,
         .transmit_packet = lynx_transmit,
         .devctl =          lynx_devctl,
+       .isoctl =          NULL,
 };
 
 MODULE_AUTHOR("Andreas E. Bombe <andreas.bombe@munich.netsurf.de>");
index ef0ed0e8739f9737121909b2520d33b285ba8990..5653362f09101da09fd958c305da4e3195178feb 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/init.h>
 #include <linux/version.h>
 #include <linux/smp_lock.h>
+#include <linux/interrupt.h>
 #include <asm/uaccess.h>
 #include <asm/atomic.h>
 #include <linux/devfs_fs_kernel.h>
@@ -46,6 +47,7 @@
 #include "ieee1394_core.h"
 #include "hosts.h"
 #include "highlevel.h"
+#include "iso.h"
 #include "ieee1394_transactions.h"
 #include "raw1394.h"
 
@@ -90,10 +92,10 @@ static int arm_lock (struct hpsb_host *host, int nodeid, quadlet_t *store,
 static int arm_lock64 (struct hpsb_host *host, int nodeid, octlet_t *store,
                u64 addr, octlet_t data, octlet_t arg, int ext_tcode, u16 flags);
 static struct hpsb_address_ops arm_ops = {
-        .read     = arm_read,
-        .write    = arm_write,
-        .lock     = arm_lock,
-        .lock64   = arm_lock64,
+       .read   = arm_read,
+       .write  = arm_write,
+       .lock   = arm_lock,
+       .lock64 = arm_lock64,
 };
 
 static void queue_complete_cb(struct pending_request *req);
@@ -107,7 +109,6 @@ static struct pending_request *__alloc_pending_request(int flags)
         if (req != NULL) {
                 memset(req, 0, sizeof(struct pending_request));
                 INIT_LIST_HEAD(&req->list);
-                HPSB_INIT_WORK(&req->tq, (void(*)(void*))queue_complete_cb, NULL);
         }
 
         return req;
@@ -132,18 +133,25 @@ static void free_pending_request(struct pending_request *req)
         kfree(req);
 }
 
+/* fi->reqlists_lock must be taken */
+static void __queue_complete_req(struct pending_request *req)
+{
+       struct file_info *fi = req->file_info;
+       list_del(&req->list);
+        list_add_tail(&req->list, &fi->req_complete);
+
+       up(&fi->complete_sem);
+        wake_up_interruptible(&fi->poll_wait_complete);
+}
+
 static void queue_complete_req(struct pending_request *req)
 {
         unsigned long flags;
         struct file_info *fi = req->file_info;
 
         spin_lock_irqsave(&fi->reqlists_lock, flags);
-        list_del(&req->list);
-        list_add_tail(&req->list, &fi->req_complete);
+       __queue_complete_req(req);
         spin_unlock_irqrestore(&fi->reqlists_lock, flags);
-
-        up(&fi->complete_sem);
-        wake_up_interruptible(&fi->poll_wait_complete);
 }
 
 static void queue_complete_cb(struct pending_request *req)
@@ -171,8 +179,11 @@ static void queue_complete_cb(struct pending_request *req)
                 req->req.length = 0;
         }
 
-        if (req->req.type != RAW1394_REQ_PHYPACKET)
-                free_tlabel(packet->host, packet->node_id, packet->tlabel);
+        if ((req->req.type == RAW1394_REQ_ASYNC_READ) ||
+           (req->req.type == RAW1394_REQ_ASYNC_WRITE) ||
+           (req->req.type == RAW1394_REQ_LOCK) ||
+           (req->req.type == RAW1394_REQ_LOCK64))
+                hpsb_free_tlabel(packet);
 
         queue_complete_req(req);
 }
@@ -183,7 +194,8 @@ static void add_host(struct hpsb_host *host)
         struct host_info *hi;
         unsigned long flags;
 
-        hi = (struct host_info *)kmalloc(sizeof(struct host_info), SLAB_KERNEL);
+        hi = (struct host_info *)kmalloc(sizeof(struct host_info),
+               in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
         if (hi != NULL) {
                 INIT_LIST_HEAD(&hi->list);
                 hi->host = host;
@@ -642,47 +654,39 @@ static int handle_async_request(struct file_info *fi,
 
         switch (req->req.type) {
         case RAW1394_REQ_ASYNC_READ:
-                if (req->req.length == 4) {
-                        DBGMSG("quadlet_read_request called");        
-                        packet = hpsb_make_readqpacket(fi->host, node, addr);
-                        if (!packet) return -ENOMEM;
+               DBGMSG("read_request called");
+               packet = hpsb_make_readpacket(fi->host, node, addr, req->req.length);
 
-                        req->data = &packet->header[3];
-                } else {
-                        DBGMSG("block_read_request called");
-                        packet = hpsb_make_readbpacket(fi->host, node, addr,
-                                                       req->req.length);
-                        if (!packet) return -ENOMEM;
+               if (!packet)
+                       return -ENOMEM;
 
-                        req->data = packet->data;
-                }
+               if (req->req.length == 4)
+                       req->data = &packet->header[3];
+               else
+                       req->data = packet->data;
+  
                 break;
 
-        case RAW1394_REQ_ASYNC_WRITE:
-                if (req->req.length == 4) {
-                        quadlet_t x;
-
-                        DBGMSG("quadlet_write_request called");
-                        if (copy_from_user(&x, int2ptr(req->req.sendb), 4)) {
-                                req->req.error = RAW1394_ERROR_MEMFAULT;
-                        }
-
-                        packet = hpsb_make_writeqpacket(fi->host, node, addr,
-                                                        x);
-                        if (!packet) return -ENOMEM;
-                } else {
-                        DBGMSG("block_write_request called");
-                        packet = hpsb_make_writebpacket(fi->host, node, addr,
-                                                        req->req.length);
-                        if (!packet) return -ENOMEM;
-
-                        if (copy_from_user(packet->data, int2ptr(req->req.sendb),
-                                           req->req.length)) {
-                                req->req.error = RAW1394_ERROR_MEMFAULT;
-                        }
-                }
-                req->req.length = 0;
-                break;
+       case RAW1394_REQ_ASYNC_WRITE:
+               DBGMSG("write_request called");
+
+               packet = hpsb_make_writepacket(fi->host, node, addr, NULL,
+                                              req->req.length);
+               if (!packet)
+                       return -ENOMEM;
+
+               if (req->req.length == 4) {
+                       if (copy_from_user(&packet->header[3], int2ptr(req->req.sendb),
+                                       req->req.length))
+                               req->req.error = RAW1394_ERROR_MEMFAULT;
+               } else {
+                       if (copy_from_user(packet->data, int2ptr(req->req.sendb),
+                                       req->req.length))
+                               req->req.error = RAW1394_ERROR_MEMFAULT;
+               }
+                       
+               req->req.length = 0;
+           break;
 
         case RAW1394_REQ_LOCK:
                 DBGMSG("lock_request called");
@@ -700,7 +704,7 @@ static int handle_async_request(struct file_info *fi,
                 }
 
                 packet = hpsb_make_lockpacket(fi->host, node, addr,
-                                              req->req.misc);
+                                              req->req.misc, NULL, 0);
                 if (!packet) return -ENOMEM;
 
                 if (copy_from_user(packet->data, int2ptr(req->req.sendb),
@@ -728,7 +732,7 @@ static int handle_async_request(struct file_info *fi,
                         }
                 }
                 packet = hpsb_make_lock64packet(fi->host, node, addr,
-                                                req->req.misc);
+                                                req->req.misc, NULL, 0);
                 if (!packet) return -ENOMEM;
 
                 if (copy_from_user(packet->data, int2ptr(req->req.sendb),
@@ -753,8 +757,7 @@ static int handle_async_request(struct file_info *fi,
                 return sizeof(struct raw1394_request);
         }
 
-        req->tq.data = req;
-        hpsb_add_packet_complete_task(packet, &req->tq);
+       hpsb_set_packet_complete_task(packet, (void(*)(void*))queue_complete_cb, req);
 
         spin_lock_irq(&fi->reqlists_lock);
         list_add_tail(&req->list, &fi->req_pending);
@@ -765,7 +768,7 @@ static int handle_async_request(struct file_info *fi,
         if (!hpsb_send_packet(packet)) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
                 req->req.length = 0;
-                free_tlabel(packet->host, packet->node_id, packet->tlabel);
+                hpsb_free_tlabel(packet);
                 queue_complete_req(req);
         }
         return sizeof(struct raw1394_request);
@@ -776,15 +779,14 @@ static int handle_iso_send(struct file_info *fi, struct pending_request *req,
 {
         struct hpsb_packet *packet;
 
-        packet = alloc_hpsb_packet(req->req.length);
-        if (!packet) return -ENOMEM;
-        req->packet = packet;
+       packet = hpsb_make_isopacket(fi->host, req->req.length, channel & 0x3f,
+                                    (req->req.misc >> 16) & 0x3, req->req.misc & 0xf);
+       if (!packet)
+               return -ENOMEM;
 
-        fill_iso_packet(packet, req->req.length, channel & 0x3f,
-                        (req->req.misc >> 16) & 0x3, req->req.misc & 0xf);
-        packet->type = hpsb_iso;
         packet->speed_code = req->req.address & 0x3;
-        packet->host = fi->host;
+
+       req->packet = packet;
 
         if (copy_from_user(packet->data, int2ptr(req->req.sendb),
                            req->req.length)) {
@@ -794,16 +796,15 @@ static int handle_iso_send(struct file_info *fi, struct pending_request *req,
                 return sizeof(struct raw1394_request);
         }
 
-       HPSB_PREPARE_WORK(&req->tq, (void (*)(void*))queue_complete_req, req);
         req->req.length = 0;
-       hpsb_add_packet_complete_task(packet, &req->tq);
+       hpsb_set_packet_complete_task(packet, (void (*)(void*))queue_complete_req, req);
 
         spin_lock_irq(&fi->reqlists_lock);
         list_add_tail(&req->list, &fi->req_pending);
         spin_unlock_irq(&fi->reqlists_lock);
 
        /* Update the generation of the packet just before sending. */
-       packet->generation = get_hpsb_generation(fi->host);
+       packet->generation = req->req.generation;
 
         if (!hpsb_send_packet(packet)) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
@@ -857,16 +858,15 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req)
         packet->header_size=header_length;
         packet->data_size=req->req.length-header_length;
 
-       HPSB_PREPARE_WORK(&req->tq, (void (*)(void*))queue_complete_req, req);
         req->req.length = 0;
-        hpsb_add_packet_complete_task(packet, &req->tq);
+        hpsb_set_packet_complete_task(packet, (void(*)(void*))queue_complete_cb, req);
 
         spin_lock_irq(&fi->reqlists_lock);
         list_add_tail(&req->list, &fi->req_pending);
         spin_unlock_irq(&fi->reqlists_lock);
 
         /* Update the generation of the packet just before sending. */
-        packet->generation = get_hpsb_generation(fi->host);
+        packet->generation = req->req.generation;
 
         if (!hpsb_send_packet(packet)) {
                 req->req.error = RAW1394_ERROR_SEND_ERROR;
@@ -1806,8 +1806,7 @@ static int write_phypacket(struct file_info *fi, struct pending_request *req)
         if (!packet) return -ENOMEM;
         req->req.length=0;
         req->packet=packet;
-        req->tq.data=req;
-        hpsb_add_packet_complete_task(packet, &req->tq);
+        hpsb_set_packet_complete_task(packet, (void(*)(void*))queue_complete_cb, req);
         spin_lock_irq(&fi->reqlists_lock);
         list_add_tail(&req->list, &fi->req_pending);
         spin_unlock_irq(&fi->reqlists_lock);
@@ -1997,6 +1996,234 @@ static ssize_t raw1394_write(struct file *file, const char *buffer, size_t count
         return retval;
 }
 
+/* rawiso operations */
+
+/* check if any RAW1394_REQ_RAWISO_ACTIVITY event is already in the
+ * completion queue (reqlists_lock must be taken) */
+static inline int __rawiso_event_in_queue(struct file_info *fi)
+{
+       struct list_head *lh;
+       struct pending_request *req;
+       
+       list_for_each(lh, &fi->req_complete) {
+               req = list_entry(lh, struct pending_request, list);
+               if(req->req.type == RAW1394_REQ_RAWISO_ACTIVITY) {
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+static void rawiso_activity_cb(struct hpsb_iso *iso)
+{
+       unsigned long host_flags;
+        struct list_head *lh;
+        struct host_info *hi;
+
+        spin_lock_irqsave(&host_info_lock, host_flags);
+        hi = find_host_info(iso->host);
+       
+       if (hi != NULL) {
+               list_for_each(lh, &hi->file_info_list) {
+                       unsigned long reqlist_flags;
+                       struct file_info *fi = list_entry(lh, struct file_info, list);
+                       
+                       spin_lock_irqsave(&fi->reqlists_lock, reqlist_flags);
+
+                       /* only one ISO activity event may be in the queue */
+                       if(!__rawiso_event_in_queue(fi)) {
+                               struct pending_request *req = __alloc_pending_request(SLAB_ATOMIC);
+
+                               if(req) {
+                                       req->file_info = fi;
+                                       req->req.type = RAW1394_REQ_RAWISO_ACTIVITY;
+                                       req->req.generation = get_hpsb_generation(iso->host);
+                                       __queue_complete_req(req);
+                               } else {
+                                       /* on allocation failure, signal an overflow */
+                                       if(fi->iso_handle) {
+                                               atomic_inc(&fi->iso_handle->overflows);
+                                       }
+                               }
+                       }
+                       spin_unlock_irqrestore(&fi->reqlists_lock, reqlist_flags);
+               }
+       }
+       
+       spin_unlock_irqrestore(&host_info_lock, host_flags);
+}
+
+/* helper function - gather all the kernel iso status bits for returning to user-space */
+static void raw1394_iso_fill_status(struct hpsb_iso *iso, struct raw1394_iso_status *stat)
+{
+       stat->config.buf_packets = iso->buf_packets;
+       stat->config.max_packet_size = iso->max_packet_size;
+       stat->config.channel = iso->channel;
+       stat->config.speed = iso->speed;
+       stat->config.irq_interval = iso->irq_interval;
+       stat->buf_stride = iso->buf_stride;
+       stat->packet_data_offset = iso->packet_data_offset;
+       stat->packet_info_offset = iso->packet_info_offset;
+       stat->first_packet = iso->first_packet;
+       stat->n_packets = hpsb_iso_n_ready(iso);
+       stat->overflows = atomic_read(&iso->overflows);
+}
+
+static int raw1394_iso_xmit_init(struct file_info *fi, void *uaddr)
+{
+       struct raw1394_iso_status stat;
+
+       if(copy_from_user(&stat, uaddr, sizeof(stat)))
+               return -EFAULT;
+       
+       fi->iso_handle = hpsb_iso_xmit_init(fi->host,
+                                           stat.config.buf_packets,
+                                           stat.config.max_packet_size,
+                                           stat.config.channel,
+                                           stat.config.speed,
+                                           stat.config.irq_interval,
+                                           rawiso_activity_cb);
+       if(!fi->iso_handle)
+               return -ENOMEM;
+
+       fi->iso_state = RAW1394_ISO_XMIT;
+       
+       raw1394_iso_fill_status(fi->iso_handle, &stat);
+       if(copy_to_user(uaddr, &stat, sizeof(stat)))
+               return -EFAULT;
+
+       /* queue an event to get things started */
+       rawiso_activity_cb(fi->iso_handle);
+       
+       return 0;
+}
+
+static int raw1394_iso_recv_init(struct file_info *fi, void *uaddr)
+{
+       struct raw1394_iso_status stat;
+
+       if(copy_from_user(&stat, uaddr, sizeof(stat)))
+               return -EFAULT;
+       
+       fi->iso_handle = hpsb_iso_recv_init(fi->host,
+                                           stat.config.buf_packets,
+                                           stat.config.max_packet_size,
+                                           stat.config.channel,
+                                           stat.config.irq_interval,
+                                           rawiso_activity_cb);
+       if(!fi->iso_handle)
+               return -ENOMEM;
+
+       fi->iso_state = RAW1394_ISO_RECV;
+       
+       raw1394_iso_fill_status(fi->iso_handle, &stat);
+       if(copy_to_user(uaddr, &stat, sizeof(stat)))
+               return -EFAULT;
+       return 0;
+}
+
+static int raw1394_iso_get_status(struct file_info *fi, void *uaddr)
+{
+       struct raw1394_iso_status stat;
+       struct hpsb_iso *iso = fi->iso_handle;
+
+       raw1394_iso_fill_status(fi->iso_handle, &stat);
+       if(copy_to_user(uaddr, &stat, sizeof(stat)))
+               return -EFAULT;
+
+       /* reset overflow counter */
+       atomic_set(&iso->overflows, 0);
+       
+       return 0;
+}
+
+static void raw1394_iso_shutdown(struct file_info *fi)
+{
+       if(fi->iso_handle)
+               hpsb_iso_shutdown(fi->iso_handle);
+       
+       fi->iso_handle = NULL;
+       fi->iso_state = RAW1394_ISO_INACTIVE;
+}
+
+/* mmap the rawiso xmit/recv buffer */
+static int raw1394_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct file_info *fi = file->private_data;
+
+       if(fi->iso_state == RAW1394_ISO_INACTIVE)
+               return -EINVAL;
+
+       return dma_region_mmap(&fi->iso_handle->buf, file, vma);
+}
+
+/* ioctl is only used for rawiso operations */
+static int raw1394_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct file_info *fi = file->private_data;
+       
+       switch(fi->iso_state) {
+       case RAW1394_ISO_INACTIVE:
+               switch(cmd) {
+               case RAW1394_ISO_XMIT_INIT:
+                       return raw1394_iso_xmit_init(fi, (void*) arg);
+               case RAW1394_ISO_RECV_INIT:
+                       return raw1394_iso_recv_init(fi, (void*) arg);
+               default:
+                       break;
+               }
+               break;
+       case RAW1394_ISO_RECV:
+               switch(cmd) {
+               case RAW1394_ISO_RECV_START:
+                       return hpsb_iso_recv_start(fi->iso_handle, arg);
+               case RAW1394_ISO_STOP:
+                       hpsb_iso_stop(fi->iso_handle);
+                       return 0;
+
+               case RAW1394_ISO_GET_STATUS:
+                       return raw1394_iso_get_status(fi, (void*) arg);
+                       
+               case RAW1394_ISO_PRODUCE_CONSUME:
+                       return hpsb_iso_recv_release_packets(fi->iso_handle, arg);
+                       
+               case RAW1394_ISO_SHUTDOWN:
+                       raw1394_iso_shutdown(fi);
+                       return 0;
+               }
+               break;
+       case RAW1394_ISO_XMIT:
+               switch(cmd) {
+               case RAW1394_ISO_XMIT_START: {
+                       /* copy two ints from user-space */
+                       int args[2];
+                       if(copy_from_user(&args[0], (void*) arg, sizeof(args)))
+                               return -EFAULT;
+                       return hpsb_iso_xmit_start(fi->iso_handle, args[0], args[1]);
+               }
+               case RAW1394_ISO_STOP:
+                       hpsb_iso_stop(fi->iso_handle);
+                       return 0;
+                       
+               case RAW1394_ISO_GET_STATUS:
+                       return raw1394_iso_get_status(fi, (void*) arg);
+                       
+               case RAW1394_ISO_PRODUCE_CONSUME:
+                       return hpsb_iso_xmit_queue_packets(fi->iso_handle, arg);
+                       
+               case RAW1394_ISO_SHUTDOWN:
+                       raw1394_iso_shutdown(fi);
+                       return 0;
+               }
+               break;
+       default:
+               break;
+       }
+       
+       return -EINVAL;
+}
+
 static unsigned int raw1394_poll(struct file *file, poll_table *pt)
 {
         struct file_info *fi = file->private_data;
@@ -2009,7 +2236,7 @@ static unsigned int raw1394_poll(struct file *file, poll_table *pt)
                 mask |= POLLIN | POLLRDNORM;
         }
         spin_unlock_irq(&fi->reqlists_lock);
-
+       
         return mask;
 }
 
@@ -2057,6 +2284,9 @@ static int raw1394_release(struct inode *inode, struct file *file)
         struct arm_addr  *arm_addr = NULL;
         int another_host;
 
+       if(fi->iso_state != RAW1394_ISO_INACTIVE)
+               raw1394_iso_shutdown(fi);
+       
         for (i = 0; i < 64; i++) {
                 if (fi->listen_channels & (1ULL << i)) {
                         hpsb_unlisten_channel(hl_handle, fi->host, i);
@@ -2164,7 +2394,9 @@ static struct hpsb_highlevel_ops hl_ops = {
 static struct file_operations file_ops = {
        .owner =        THIS_MODULE,
         .read =                raw1394_read, 
-        .write =       raw1394_write, 
+        .write =       raw1394_write,
+       .mmap =         raw1394_mmap,
+       .ioctl =        raw1394_ioctl,
         .poll =                raw1394_poll, 
         .open =                raw1394_open, 
         .release =     raw1394_release, 
index c9e72a56e47563acb384f5a4c4f9019207ba0bf0..323a30faf4f9402ea282deac6b8df6d7445d7d0d 100644 (file)
 #define RAW1394_REQ_PHYPACKET       500
 
 /* kernel to user */
-#define RAW1394_REQ_BUS_RESET     10000
-#define RAW1394_REQ_ISO_RECEIVE   10001
-#define RAW1394_REQ_FCP_REQUEST   10002
-#define RAW1394_REQ_ARM           10003
+#define RAW1394_REQ_BUS_RESET        10000
+#define RAW1394_REQ_ISO_RECEIVE      10001
+#define RAW1394_REQ_FCP_REQUEST      10002
+#define RAW1394_REQ_ARM              10003
+#define RAW1394_REQ_RAWISO_ACTIVITY  10004
 
 /* error codes */
 #define RAW1394_ERROR_NONE        0
@@ -115,6 +116,64 @@ typedef struct arm_request_response {
         struct arm_response *response;
 } *arm_request_response_t;
 
+/* rawiso API */
+
+/* ioctls */
+#define RAW1394_ISO_XMIT_INIT        1  /* arg: raw1394_iso_status* */
+#define RAW1394_ISO_RECV_INIT        2  /* arg: raw1394_iso_status* */
+#define RAW1394_ISO_RECV_START       3  /* arg: int, starting cycle */
+#define RAW1394_ISO_XMIT_START       8  /* arg: int[2], { starting cycle, prebuffer } */
+#define RAW1394_ISO_STOP             4
+#define RAW1394_ISO_GET_STATUS       5  /* arg: raw1394_iso_status* */
+#define RAW1394_ISO_PRODUCE_CONSUME  6  /* arg: int, # of packets */
+#define RAW1394_ISO_SHUTDOWN         7
+
+/* per-packet metadata embedded in the ringbuffer */
+/* must be identical to hpsb_iso_packet_info in iso.h! */
+struct raw1394_iso_packet_info {
+       unsigned short len;
+       unsigned short cycle;
+       unsigned char channel; /* recv only */
+       unsigned char tag;
+       unsigned char sy;
+};
+
+struct raw1394_iso_config {
+       unsigned int buf_packets;
+       unsigned int max_packet_size;
+       int channel;
+       int speed; /* xmit only */
+       int irq_interval;
+};
+
+/* argument to RAW1394_ISO_XMIT/RECV_INIT and RAW1394_ISO_GET_STATUS */
+struct raw1394_iso_status {
+       /* current settings */
+       struct raw1394_iso_config config;
+       
+       /* byte offset between successive packets in the buffer */
+       int buf_stride;
+
+       /* byte offset of data payload within each packet */
+       int packet_data_offset;
+       
+       /* byte offset of struct iso_packet_info within each packet */
+       int packet_info_offset;
+
+       /* index of next packet to fill with data (ISO transmission)
+          or next packet containing data recieved (ISO reception) */
+       unsigned int first_packet;
+
+       /* number of packets waiting to be filled with data (ISO transmission)
+          or containing data received (ISO reception) */
+       unsigned int n_packets;
+
+       /* approximate number of packets dropped due to overflow or
+          underflow of the packet buffer (a value of zero guarantees
+          that no packets have been dropped) */
+       unsigned int overflows;
+};
+
 #ifdef __KERNEL__
 
 struct iso_block_store {
@@ -123,6 +182,10 @@ struct iso_block_store {
         quadlet_t data[0];
 };
 
+enum raw1394_iso_state { RAW1394_ISO_INACTIVE = 0,
+                        RAW1394_ISO_RECV = 1,
+                        RAW1394_ISO_XMIT = 2 };
+
 struct file_info {
         struct list_head list;
 
@@ -141,11 +204,16 @@ struct file_info {
 
         u8 *fcp_buffer;
 
+       /* old ISO API */
         u64 listen_channels;
         quadlet_t *iso_buffer;
         size_t iso_buffer_length;
 
         u8 notification; /* (busreset-notification) RAW1394_NOTIFY_OFF/ON */
+
+       /* new rawiso API */
+       enum raw1394_iso_state iso_state;
+       struct hpsb_iso *iso_handle;
 };
 
 struct arm_addr {
@@ -164,7 +232,6 @@ struct pending_request {
         struct list_head list;
         struct file_info *file_info;
         struct hpsb_packet *packet;
-        struct hpsb_queue_struct tq;
         struct iso_block_store *ibs;
         quadlet_t *data;
         int free_data;
index 7beb853d66ea91a000113ae51ed8be3846475825..1ec7fc84aef8b9cd0761e6b6f984d6b44a673cd5 100644 (file)
  *
  * sbp2_max_speed              - Force max speed allowed 
  *                               (2 = 400mb, 1 = 200mb, 0 = 100mb. default = 2)
- * sbp2_serialize_io           - Serialize all I/O coming down from the scsi drivers 
+ * sbp2_serialize_io           - Serialize all I/O coming down from the scsi drivers
  *                               (0 = deserialized, 1 = serialized, default = 0)
  * sbp2_max_sectors,           - Change max sectors per I/O supported (default = 255)
- * sbp2_max_outstanding_cmds   - Change max outstanding concurrent commands (default = 8)
- * sbp2_max_cmds_per_lun       - Change max concurrent commands per sbp2 device (default = 1)
  * sbp2_exclusive_login                - Set to zero if you'd like to allow multiple hosts the ability
  *                               to log in at the same time. Sbp2 device must support this,
  *                               and you must know what you're doing (default = 1)
 #include <linux/list.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/interrupt.h>
 #include <linux/fs.h>
 #include <linux/poll.h>
 #include <linux/module.h>
 #include <linux/blk.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
+#include <linux/version.h>
 #include <asm/current.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/io.h>
 #include <asm/scatterlist.h>
 
-#ifdef CONFIG_KBUILD_2_5
-#include <scsi.h>
-#include <hosts.h>
-#else
 #include "../scsi/scsi.h"
 #include "../scsi/hosts.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,47)
+#include "../scsi/sd.h"
 #endif
 
 #include "ieee1394.h"
 #include "sbp2.h"
 
 static char version[] __devinitdata =
-       "$Rev: 601 $ James Goodwin <jamesg@filanet.com>";
+       "$Rev: 697 $ James Goodwin <jamesg@filanet.com>";
 
 /*
  * Module load parameter definitions
@@ -392,26 +390,6 @@ MODULE_PARM(sbp2_max_sectors,"i");
 MODULE_PARM_DESC(sbp2_max_sectors, "Change max sectors per I/O supported (default = 255)");
 static int sbp2_max_sectors = SBP2_MAX_SECTORS;
 
-/*
- * Adjust sbp2_max_outstanding_cmds to tune performance if you have many
- * sbp2 devices attached (or if you need to do some debugging).
- */
-MODULE_PARM(sbp2_max_outstanding_cmds,"i");
-MODULE_PARM_DESC(sbp2_max_outstanding_cmds, "Change max outstanding concurrent commands (default = 8)");
-static int sbp2_max_outstanding_cmds = SBP2SCSI_MAX_OUTSTANDING_CMDS;
-
-/*
- * Adjust sbp2_max_cmds_per_lun to tune performance. Enabling more than
- * one concurrent/linked command per sbp2 device may allow some
- * performance gains, but some older sbp2 devices have firmware bugs
- * resulting in problems when linking commands... so, enable this with
- * care.  I can note that the Oxsemi OXFW911 sbp2 chipset works very well
- * with large numbers of concurrent/linked commands.  =)
- */
-MODULE_PARM(sbp2_max_cmds_per_lun,"i");
-MODULE_PARM_DESC(sbp2_max_cmds_per_lun, "Change max concurrent commands per sbp2 device (default = 1)");
-static int sbp2_max_cmds_per_lun = SBP2SCSI_MAX_CMDS_PER_LUN;
-
 /*
  * Exclusive login to sbp2 device? In most cases, the sbp2 driver should
  * do an exclusive login, as it's generally unsafe to have two hosts
@@ -555,7 +533,7 @@ static struct hpsb_address_ops sbp2_physdma_ops = {
 static struct hpsb_protocol_driver sbp2_driver = {
        .name =         "SBP2 Driver",
        .id_table =     sbp2_id_table,
-       .probe =                sbp2_probe,
+       .probe =        sbp2_probe,
        .disconnect =   sbp2_disconnect,
        .update =       sbp2_update
 };
@@ -658,90 +636,11 @@ static int sbp2util_down_timeout(atomic_t *done, int timeout)
        return ((i > 0) ? 0:1);
 }
 
-/*
- * This function is called to initially create a packet pool for use in
- * sbp2 I/O requests. This packet pool is used when sending out sbp2
- * command and agent reset requests, and allows us to remove all
- * kmallocs/kfrees from the critical I/O paths.
- */
-static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi)
-{
-       struct hpsb_packet *packet;
-       int i;
-
-       hi->request_packet = kmalloc(sizeof(struct sbp2_request_packet) * SBP2_MAX_REQUEST_PACKETS, 
-                                    GFP_KERNEL);
-
-       if (!hi->request_packet) {
-               SBP2_ERR("sbp2util_create_request_packet_pool - packet allocation failed!");
-               return(-ENOMEM);
-       }
-       memset(hi->request_packet, 0, sizeof(struct sbp2_request_packet) * SBP2_MAX_REQUEST_PACKETS);
-
-       /* 
-        * Create a pool of request packets. Just take the max supported 
-        * concurrent commands and multiply by two to be safe... 
-        */
-       for (i=0; i<SBP2_MAX_REQUEST_PACKETS; i++) {
-
-               /*
-                * Max payload of 8 bytes since the sbp2 command request
-                * uses a payload of 8 bytes, and agent reset is a quadlet
-                * write request. Bump this up if we plan on using this
-                * pool for other stuff.
-                */
-               packet = alloc_hpsb_packet(8);
-
-               if (!packet) {
-                       SBP2_ERR("sbp2util_create_request_packet_pool - packet allocation failed!");
-                       return(-ENOMEM);
-               }
-
-               /* 
-                * Put these request packets into a free list
-                */
-               INIT_LIST_HEAD(&hi->request_packet[i].list);
-               hi->request_packet[i].packet = packet;
-               list_add_tail(&hi->request_packet[i].list, &hi->sbp2_req_free);
-
-       }
-
-       return(0);
-}
-
-/*
- * This function is called to remove the packet pool. It is called when
- * the sbp2 driver is unloaded.
- */
-static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi)
+/* Free's an allocated packet */
+static void sbp2_free_packet(struct hpsb_packet *packet)
 {
-       struct list_head *lh;
-       struct sbp2_request_packet *request_packet;
-       unsigned long flags;
-
-       /* 
-        * Go through free list releasing packets
-        */
-       sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags);
-       while (!list_empty(&hi->sbp2_req_free)) {
-
-               lh = hi->sbp2_req_free.next;
-               list_del(lh);
-
-               request_packet = list_entry(lh, struct sbp2_request_packet, list);
-
-               /*
-                * Free the hpsb packets that we allocated for the pool
-                */
-               if (request_packet) {
-                       free_hpsb_packet(request_packet->packet);
-               }
-
-       }
-       kfree(hi->request_packet);
-       sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags);
-
-       return;
+       hpsb_free_tlabel(packet);
+       free_hpsb_packet(packet);
 }
 
 /*
@@ -751,93 +650,28 @@ static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi)
  * out a free request packet and re-initialize values in it. I'm sure this
  * can still stand some more optimization.
  */
-static struct sbp2_request_packet *
-sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi,
-                                      struct node_entry *ne, u64 addr,
-                                      size_t data_size,
-                                      quadlet_t data) {
-       struct list_head *lh;
-       struct sbp2_request_packet *request_packet = NULL;
+static struct hpsb_packet *
+sbp2util_allocate_write_packet(struct sbp2scsi_host_info *hi,
+                              struct node_entry *ne, u64 addr,
+                              size_t data_size,
+                              quadlet_t *data)
+{
        struct hpsb_packet *packet;
-       unsigned long flags;
-
-       sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags);
-       if (!list_empty(&hi->sbp2_req_free)) {
-
-               /*
-                * Pull out a free request packet
-                */
-               lh = hi->sbp2_req_free.next;
-               list_del(lh);
-
-               request_packet = list_entry(lh, struct sbp2_request_packet, list);
-               packet = request_packet->packet;
 
-               /*
-                * Initialize the packet (this is really initialization
-                * the core 1394 stack should do, but I'm doing it myself
-                * to avoid the overhead).
-                */
-               packet->data_size = data_size;
-               INIT_LIST_HEAD(&packet->list);
-               sema_init(&packet->state_change, 0);
-               packet->state = hpsb_unused;
-               packet->data_be = 1;
-               
-               hpsb_node_fill_packet(ne, packet);
+       packet = hpsb_make_writepacket(hi->host, ne->nodeid,
+                                      addr, data, data_size);
 
-               packet->tlabel = get_tlabel(hi->host, packet->node_id, 0);
+        if (!packet)
+                return NULL;
 
-               if (!data_size) {
-                       fill_async_writequad(packet, addr, data);
-               } else {
-                       fill_async_writeblock(packet, addr, data_size);         
-               }
+       hpsb_set_packet_complete_task(packet, (void (*)(void*))sbp2_free_packet,
+                                     packet);
 
-               /*
-                * Set up a task queue completion routine, which returns
-                * the packet to the free list and releases the tlabel.
-                */
-               HPSB_PREPARE_WORK(&request_packet->tq,
-                                 (void (*)(void*))sbp2util_free_request_packet,
-                                 request_packet);
-               request_packet->hi_context = hi;
-               hpsb_add_packet_complete_task(packet, &request_packet->tq);
+       hpsb_node_fill_packet(ne, packet);
 
-               /*
-                * Now, put the packet on the in-use list.
-                */
-               list_add_tail(&request_packet->list, &hi->sbp2_req_inuse);
-
-       } else {
-               SBP2_ERR("sbp2util_allocate_request_packet - no packets available!");
-       }
-       sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags);
-
-       return(request_packet);
+       return packet;
 }
 
-/*
- * This function is called to return a packet to our packet pool. It is
- * also called as a completion routine when a request packet is completed.
- */
-static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet)
-{
-       unsigned long flags;
-       struct sbp2scsi_host_info *hi = request_packet->hi_context;
-
-       /*
-        * Free the tlabel, and return the packet to the free pool.
-        */
-       sbp2_spin_lock(&hi->sbp2_request_packet_lock, flags);
-       free_tlabel(hi->host, LOCAL_BUS | request_packet->packet->node_id,
-                   request_packet->packet->tlabel);
-       list_del(&request_packet->list);
-       list_add_tail(&request_packet->list, &hi->sbp2_req_free);
-       sbp2_spin_unlock(&hi->sbp2_request_packet_lock, flags);
-
-       return;
-}
 
 /*
  * This function is called to create a pool of command orbs used for
@@ -847,11 +681,13 @@ static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_i
                                            struct sbp2scsi_host_info *hi)
 {
        int i;
-       unsigned long flags;
+       unsigned long flags, orbs;
        struct sbp2_command_info *command;
+
+       orbs = sbp2_serialize_io ? 2 : SBP2_MAX_COMMAND_ORBS;
         
        sbp2_spin_lock(&scsi_id->sbp2_command_orb_lock, flags);
-       for (i = 0; i < scsi_id->sbp2_total_command_orbs; i++) {
+       for (i = 0; i < orbs; i++) {
                command = (struct sbp2_command_info *)
                    kmalloc(sizeof(struct sbp2_command_info), GFP_KERNEL);
                if (!command) {
@@ -1148,7 +984,7 @@ static void sbp2_update(struct unit_directory *ud)
        sbp2_set_busy_timeout(hi, scsi_id);
 
        /* Do a SBP-2 fetch agent reset. */
-       sbp2_agent_reset(hi, scsi_id, 0);
+       sbp2_agent_reset(hi, scsi_id, 1);
        
        /* Get the max speed and packet size that we can use. */
        sbp2_max_speed_and_size(hi, scsi_id);
@@ -1175,7 +1011,7 @@ static void sbp2_add_host(struct hpsb_host *host)
 
        /* Allocate some memory for our host info structure */
        hi = (struct sbp2scsi_host_info *)kmalloc(sizeof(struct sbp2scsi_host_info),
-                                                 GFP_KERNEL);
+                                                 in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
 
        if (hi == NULL) {
                SBP2_ERR("out of memory in sbp2_add_host");
@@ -1185,17 +1021,8 @@ static void sbp2_add_host(struct hpsb_host *host)
        /* Initialize some host stuff */
        memset(hi, 0, sizeof(struct sbp2scsi_host_info));
        INIT_LIST_HEAD(&hi->list);
-       INIT_LIST_HEAD(&hi->sbp2_req_inuse);
-       INIT_LIST_HEAD(&hi->sbp2_req_free);
        hi->host = host;
        hi->sbp2_command_lock = SPIN_LOCK_UNLOCKED;
-       hi->sbp2_request_packet_lock = SPIN_LOCK_UNLOCKED;
-
-       /* Create our request packet pool (pool of packets for use in I/O) */
-       if (sbp2util_create_request_packet_pool(hi)) {
-               SBP2_ERR("sbp2util_create_request_packet_pool failed!");
-               return;
-       }
 
        sbp2_spin_lock(&sbp2_host_info_lock, flags);
        list_add_tail(&hi->list, &sbp2_host_info_list);
@@ -1262,7 +1089,6 @@ static void sbp2_remove_host(struct hpsb_host *host)
 
        hi = sbp2_find_host_info(host);
        if (hi != NULL) {
-               sbp2util_remove_request_packet_pool(hi);
                list_del(&hi->list);
                kfree(hi);
        }
@@ -1373,7 +1199,6 @@ alloc_fail_first:
        INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_inuse);
        INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_completed);
        scsi_id->sbp2_command_orb_lock = SPIN_LOCK_UNLOCKED;
-       scsi_id->sbp2_total_command_orbs = 0;
 
        /*
         * Make sure that we've gotten ahold of the sbp2 management agent
@@ -1382,15 +1207,6 @@ alloc_fail_first:
         */
        sbp2_parse_unit_directory(scsi_id);
 
-       scsi_id->sbp2_total_command_orbs = SBP2_MAX_COMMAND_ORBS;
-
-       /* 
-        * Knock the total command orbs down if we are serializing I/O
-        */
-       if (sbp2_serialize_io) {
-               scsi_id->sbp2_total_command_orbs = 2;   /* one extra for good measure */
-       }
-
        /*
         * Find an empty spot to stick our scsi id instance data. 
         */
@@ -1440,7 +1256,7 @@ alloc_fail_first:
        /*
         * Do a SBP-2 fetch agent reset
         */
-       sbp2_agent_reset(hi, scsi_id, 0);
+       sbp2_agent_reset(hi, scsi_id, 1);
        
        /*
         * Get the max speed and packet size that we can use
@@ -1461,10 +1277,7 @@ static void sbp2_remove_device(struct sbp2scsi_host_info *hi,
        /* Complete any pending commands with selection timeout */
        sbp2scsi_complete_all_commands(hi, scsi_id, DID_NO_CONNECT);
                                
-       /* Clean up any other structures */
-       if (scsi_id->sbp2_total_command_orbs) {
-               sbp2util_remove_command_orb_pool(scsi_id, hi);
-       }
+       sbp2util_remove_command_orb_pool(scsi_id, hi);
 
        if (scsi_id->login_response) {
                pci_free_consistent(hi->host->pdev,
@@ -1951,7 +1764,7 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id)
         * possible.  */
        if ((scsi_id->sbp2_firmware_revision & 0xffff00) ==
                        SBP2_128KB_BROKEN_FIRMWARE &&
-                       (sbp2_max_sectors * 512) > (128 * 1024)) {
+                       (sbp2_max_sectors * 512) > (128*1024)) {
                SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB max transfer size.",
                                NODE_BUS_ARGS(scsi_id->ne->nodeid));
                SBP2_WARN("WARNING: Current sbp2_max_sectors setting is larger than 128KB (%d sectors)!",
@@ -2012,35 +1825,36 @@ static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id
 /*
  * This function is called in order to perform a SBP-2 agent reset. 
  */
-static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, u32 flags
+static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, int wait
 {
-       struct sbp2_request_packet *agent_reset_request_packet;
-
+       struct hpsb_packet *packet;
+       quadlet_t data;
+       
        SBP2_DEBUG("sbp2_agent_reset");
 
        /*
         * Ok, let's write to the target's management agent register
         */
-       agent_reset_request_packet =
-               sbp2util_allocate_write_request_packet(hi, scsi_id->ne,
-                                                      scsi_id->sbp2_command_block_agent_addr +
-                                                      SBP2_AGENT_RESET_OFFSET,
-                                                      0, ntohl(SBP2_AGENT_RESET_DATA));
+       data = ntohl(SBP2_AGENT_RESET_DATA);
+       packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
+                                               scsi_id->sbp2_command_block_agent_addr +
+                                               SBP2_AGENT_RESET_OFFSET,
+                                               4, &data);
 
-       if (!agent_reset_request_packet) {
-               SBP2_ERR("sbp2util_allocate_write_request_packet failed");
-               return(-EIO);
+       if (!packet) {
+               SBP2_ERR("sbp2util_allocate_write_packet failed");
+               return(-ENOMEM);
        }
 
-       if (!hpsb_send_packet(agent_reset_request_packet->packet)) {
+       if (!hpsb_send_packet(packet)) {
                SBP2_ERR("hpsb_send_packet failed");
-               sbp2util_free_request_packet(agent_reset_request_packet); 
+               sbp2_free_packet(packet); 
                return(-EIO);
        }
 
-       if (!(flags & SBP2_SEND_NO_WAIT)) {
-               down(&agent_reset_request_packet->packet->state_change);
-               down(&agent_reset_request_packet->packet->state_change);
+       if (wait) {
+               down(&packet->state_change);
+               down(&packet->state_change);
        }
 
        /*
@@ -2049,7 +1863,6 @@ static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instan
        scsi_id->last_orb = NULL;
 
        return(0);
-
 }
 
 /*
@@ -2310,7 +2123,7 @@ static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi,
 static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
                                 struct sbp2_command_info *command)
 {
-        struct sbp2_request_packet *command_request_packet;
+        struct hpsb_packet *packet;
        struct sbp2_command_orb *command_orb = &command->command_orb;
 
        outstanding_orb_incr;
@@ -2333,25 +2146,24 @@ static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_i
                 */
                if (hpsb_node_entry_valid(scsi_id->ne)) {
 
-                       command_request_packet =
-                               sbp2util_allocate_write_request_packet(hi, scsi_id->ne,
+                       packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
                                                                scsi_id->sbp2_command_block_agent_addr +
-                                                               SBP2_ORB_POINTER_OFFSET, 8, 0);
+                                                               SBP2_ORB_POINTER_OFFSET, 8, NULL);
                
-                       if (!command_request_packet) {
-                               SBP2_ERR("sbp2util_allocate_write_request_packet failed");
-                               return(-EIO);
+                       if (!packet) {
+                               SBP2_ERR("sbp2util_allocate_write_packet failed");
+                               return(-ENOMEM);
                        }
                
-                       command_request_packet->packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id);
-                       command_request_packet->packet->data[1] = command->command_orb_dma;
-                       sbp2util_cpu_to_be32_buffer(command_request_packet->packet->data, 8);
+                       packet->data[0] = ORB_SET_NODE_ID(hi->host->node_id);
+                       packet->data[1] = command->command_orb_dma;
+                       sbp2util_cpu_to_be32_buffer(packet->data, 8);
                
                        SBP2_ORB_DEBUG("write command agent, command orb %p", command_orb);
 
-                       if (!hpsb_send_packet(command_request_packet->packet)) {
+                       if (!hpsb_send_packet(packet)) {
                                SBP2_ERR("hpsb_send_packet failed");
-                               sbp2util_free_request_packet(command_request_packet); 
+                               sbp2_free_packet(packet); 
                                return(-EIO);
                        }
 
@@ -2382,22 +2194,22 @@ static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_i
                 * Ring the doorbell
                 */
                if (hpsb_node_entry_valid(scsi_id->ne)) {
+                       quadlet_t data = cpu_to_be32(command->command_orb_dma);
 
-                       command_request_packet = sbp2util_allocate_write_request_packet(hi,
-                               scsi_id->ne,
-                               scsi_id->sbp2_command_block_agent_addr + SBP2_DOORBELL_OFFSET,
-                               0, cpu_to_be32(command->command_orb_dma));
+                       packet = sbp2util_allocate_write_packet(hi, scsi_id->ne,
+                                       scsi_id->sbp2_command_block_agent_addr +
+                                       SBP2_DOORBELL_OFFSET, 4, &data);
        
-                       if (!command_request_packet) {
-                               SBP2_ERR("sbp2util_allocate_write_request_packet failed");
-                               return(-EIO);
+                       if (!packet) {
+                               SBP2_ERR("sbp2util_allocate_write_packet failed");
+                               return(-ENOMEM);
                        }
 
                        SBP2_ORB_DEBUG("ring doorbell, command orb %p", command_orb);
 
-                       if (!hpsb_send_packet(command_request_packet->packet)) {
+                       if (!hpsb_send_packet(packet)) {
                                SBP2_ERR("hpsb_send_packet failed");
-                               sbp2util_free_request_packet(command_request_packet);
+                               sbp2_free_packet(packet);
                                return(-EIO);
                        }
                }
@@ -2789,7 +2601,7 @@ static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int dest
                                 * Initiate a fetch agent reset. 
                                 */
                                SBP2_DEBUG("Dead bit set - initiating fetch agent reset");
-                                sbp2_agent_reset(hi, scsi_id, SBP2_SEND_NO_WAIT);
+                                sbp2_agent_reset(hi, scsi_id, 0);
                        }
 
                        SBP2_ORB_DEBUG("completing command orb %p", &command->command_orb);
@@ -3107,7 +2919,7 @@ static int sbp2scsi_abort (Scsi_Cmnd *SCpnt)
                /*
                 * Initiate a fetch agent reset. 
                 */
-               sbp2_agent_reset(hi, scsi_id, SBP2_SEND_NO_WAIT);
+               sbp2_agent_reset(hi, scsi_id, 0);
                sbp2scsi_complete_all_commands(hi, scsi_id, DID_BUS_BUSY);              
                sbp2_spin_unlock(&hi->sbp2_command_lock, flags);
        }
@@ -3127,7 +2939,7 @@ static int sbp2scsi_reset (Scsi_Cmnd *SCpnt)
 
        if (scsi_id) {
                SBP2_ERR("Generating sbp2 fetch agent reset");
-               sbp2_agent_reset(hi, scsi_id, SBP2_SEND_NO_WAIT);
+               sbp2_agent_reset(hi, scsi_id, 0);
        }
 
        return(SUCCESS);
@@ -3138,12 +2950,12 @@ static int sbp2scsi_reset (Scsi_Cmnd *SCpnt)
  */
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,43)
 static int sbp2scsi_biosparam (struct scsi_device *sdev,
-               struct block_device *dev, sector_t capacity, int geom[]) 
+                struct block_device *dev, sector_t capacity, int geom[])
 {
 #else
-static int sbp2scsi_biosparam (Scsi_Disk *disk, kdev_t dev, int geom[]) 
+static int sbp2scsi_biosparam (Scsi_Disk *disk, kdev_t dev, int geom[])
 {
-       sector_t capacity = disk->capacity;
+        unsigned capacity = disk->capacity;
 #endif
        int heads, sectors, cylinders;
 
@@ -3208,16 +3020,12 @@ static const char *sbp2scsi_info (struct Scsi_Host *host)
                "SBP-2 module load options:\n"
                "- Max speed supported: %s\n"
                "- Max sectors per I/O supported: %d\n"
-               "- Max outstanding commands supported: %d\n"
-               "- Max outstanding commands per lun supported: %d\n"
                 "- Serialized I/O (debug): %s\n"
                "- Exclusive login: %s",
                hi->host->driver->name,
                version,
                hpsb_speedto_str[sbp2_max_speed],
                sbp2_max_sectors,
-               sbp2_max_outstanding_cmds,
-               sbp2_max_cmds_per_lun,
                sbp2_serialize_io ? "yes" : "no",
                sbp2_exclusive_login ? "yes" : "no");
 
@@ -3242,29 +3050,27 @@ static Scsi_Host_Template scsi_driver_template = {
        .eh_host_reset_handler =sbp2scsi_reset,
        .bios_param =           sbp2scsi_biosparam,
        .this_id =              -1,
-       .sg_tablesize =         SBP2_MAX_SG_ELEMENTS,
-       .use_clustering =       SBP2_CLUSTERING,
+       .sg_tablesize =         SG_ALL,
+       .use_clustering =       ENABLE_CLUSTERING,
+       .cmd_per_lun =          SBP2_MAX_CMDS_PER_LUN,
+       .can_queue =            SBP2_MAX_SCSI_QUEUE,
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
        .use_new_eh_code =      TRUE,
 #endif
        .emulated =             1,
-       .proc_name =    SBP2_DEVICE_NAME,
+       .proc_name =            SBP2_DEVICE_NAME,
 };
 
 static int sbp2_module_init(void)
 {
        SBP2_DEBUG("sbp2_module_init");
 
-       /*
-        * Module load debug option to force one command at a time (serializing I/O)
-        */
+       /* Module load debug option to force one command at a time
+        * (serializing I/O) */
        if (sbp2_serialize_io) {
                SBP2_ERR("Driver forced to serialize I/O (serialize_io = 1)");
                scsi_driver_template.can_queue = 1;
                scsi_driver_template.cmd_per_lun = 1;
-       } else {
-               scsi_driver_template.can_queue = sbp2_max_outstanding_cmds;
-               scsi_driver_template.cmd_per_lun = sbp2_max_cmds_per_lun;
        }
 
        /* 
index d5239ef4309b08331f38f89f83fe0e891004ff52..5968d6a3dcc37af9b21a78b608aeac1c95d5d814 100644 (file)
 #endif
 
 #define SBP2_DEVICE_NAME               "sbp2"
-#define SBP2_DEVICE_NAME_SIZE          4
 
 /*
  * SBP2 specific structures and defines
  */
 
-#define ORB_FMT_CMD                    0x0
-#define ORB_FMT_DUMMY                  0x3
-
 #define ORB_DIRECTION_WRITE_TO_MEDIA    0x0
 #define ORB_DIRECTION_READ_FROM_MEDIA   0x1
 #define ORB_DIRECTION_NO_DATA_TRANSFER  0x2
 
 #define ORB_SET_NULL_PTR(value)                        ((value & 0x1) << 31)
 #define ORB_SET_NOTIFY(value)                   ((value & 0x1) << 31)
-#define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29)
+#define ORB_SET_RQ_FMT(value)                   ((value & 0x3) << 29)  /* unused ? */
 #define ORB_SET_NODE_ID(value)                 ((value & 0xffff) << 16)
-
-struct sbp2_dummy_orb {
-       volatile u32 next_ORB_hi;
-       volatile u32 next_ORB_lo;
-       u32 reserved1;
-        u32 reserved2;
-       u32 notify_rq_fmt;
-       u8 command_block[12];
-};
-
 #define ORB_SET_DATA_SIZE(value)                (value & 0xffff)
 #define ORB_SET_PAGE_SIZE(value)                ((value & 0x7) << 16)
 #define ORB_SET_PAGE_TABLE_PRESENT(value)       ((value & 0x1) << 19)
@@ -253,25 +239,15 @@ struct sbp2_status_block {
  * Other misc defines
  */
 #define SBP2_128KB_BROKEN_FIRMWARE                             0xa0b800
-#define SBP2_BROKEN_FIRMWARE_MAX_TRANSFER                      0x20000
 
 #define SBP2_DEVICE_TYPE_LUN_UNINITIALIZED                     0xffffffff
 
-/*
- * Flags for SBP-2 functions
- */
-#define SBP2_SEND_NO_WAIT                                      0x00000001
-
 /*
  * SCSI specific stuff
  */
 
-#define SBP2_MAX_SG_ELEMENTS           SG_ALL
-#define SBP2_CLUSTERING                        ENABLE_CLUSTERING
 #define SBP2_MAX_SG_ELEMENT_LENGTH     0xf000
 #define SBP2SCSI_MAX_SCSI_IDS          16      /* Max sbp2 device instances supported */
-#define SBP2SCSI_MAX_OUTSTANDING_CMDS  8       /* Max total outstanding sbp2 commands allowed at a time! */
-#define SBP2SCSI_MAX_CMDS_PER_LUN      1       /* Max outstanding sbp2 commands per device - tune as needed */
 #define SBP2_MAX_SECTORS               255     /* Max sectors supported */
 
 #ifndef TYPE_SDAD
@@ -314,26 +290,18 @@ static unchar sbp2scsi_direction_table[0x100] = {
        DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN,DUN
 };
 
-#define SBP2_MAX_REQUEST_PACKETS       (sbp2_max_outstanding_cmds * 2)
-#define SBP2_MAX_COMMAND_ORBS          (sbp2_max_cmds_per_lun * 2)
-
-/*
- * Request packets structure (used for sending command and agent reset packets)
- */
-struct sbp2_request_packet {
-
-       struct list_head list;
-       struct hpsb_packet *packet;
-       struct hpsb_queue_struct tq;
-       void *hi_context;
-
-};
-
+/* This should be safe. If there's more than one LUN per node, we could
+ * saturate the tlabel's though.  */
+#define SBP2_MAX_CMDS_PER_LUN   8
+#define SBP2_MAX_SCSI_QUEUE    (SBP2_MAX_CMDS_PER_LUN * SBP2SCSI_MAX_SCSI_IDS)
+#define SBP2_MAX_COMMAND_ORBS  SBP2_MAX_SCSI_QUEUE
 
 /* This is the two dma types we use for cmd_dma below */
-#define CMD_DMA_NONE   0x0
-#define CMD_DMA_PAGE   0x1
-#define CMD_DMA_SINGLE 0x2
+enum cmd_dma_types {
+       CMD_DMA_NONE,
+       CMD_DMA_PAGE,
+       CMD_DMA_SINGLE
+};
 
 /* 
  * Encapsulates all the info necessary for an outstanding command. 
@@ -347,11 +315,11 @@ struct sbp2_command_info {
        void (*Current_done)(Scsi_Cmnd *);
 
        /* Also need s/g structure for each sbp2 command */
-       struct sbp2_unrestricted_page_table scatter_gather_element[SBP2_MAX_SG_ELEMENTS] ____cacheline_aligned;
+       struct sbp2_unrestricted_page_table scatter_gather_element[SG_ALL] ____cacheline_aligned;
        dma_addr_t sge_dma ____cacheline_aligned;
        void *sge_buffer;
        dma_addr_t cmd_dma;
-       int dma_type;
+       enum cmd_dma_types dma_type;
        unsigned long dma_size;
        int dma_dir;
 
@@ -412,7 +380,6 @@ struct scsi_id_instance_data {
        spinlock_t sbp2_command_orb_lock;
        struct list_head sbp2_command_orb_inuse;
        struct list_head sbp2_command_orb_completed;
-       u32 sbp2_total_command_orbs;
 
        /* Node entry, as retrieved from NodeMgr entries */
        struct node_entry *ne;
@@ -433,10 +400,9 @@ struct sbp2scsi_host_info {
        struct hpsb_host *host;
 
        /*
-        * Spin locks for command processing and packet pool management
+        * Spin locks for command processing
         */
        spinlock_t sbp2_command_lock;
-       spinlock_t sbp2_request_packet_lock;
 
        /*
         * This is the scsi host we register with the scsi mid level.
@@ -445,21 +411,6 @@ struct sbp2scsi_host_info {
         */
        struct Scsi_Host *scsi_host;
 
-       /*
-        * Lists keeping track of inuse/free sbp2_request_packets. These structures are
-        * used for sending out sbp2 command and agent reset packets. We initially create
-        * a pool of request packets so that we don't have to do any kmallocs while in critical
-        * I/O paths.
-        */
-       struct list_head sbp2_req_inuse;
-       struct list_head sbp2_req_free;
-
-       /*
-        * Here is the pool of request packets. All the hpsb packets (for 1394 bus transactions)
-        * are allocated at init and simply re-initialized when needed.
-        */
-       struct sbp2_request_packet *request_packet;
-
        /*
         * SCSI ID instance data (one for each sbp2 device instance possible)
         */
@@ -474,13 +425,6 @@ struct sbp2scsi_host_info {
 /*
  * Various utility prototypes
  */
-static int sbp2util_create_request_packet_pool(struct sbp2scsi_host_info *hi);
-static void sbp2util_remove_request_packet_pool(struct sbp2scsi_host_info *hi);
-static struct sbp2_request_packet *sbp2util_allocate_write_request_packet(struct sbp2scsi_host_info *hi,
-                                                                         struct node_entry *ne, u64 addr,
-                                                                         size_t data_size,
-                                                                         quadlet_t data);
-static void sbp2util_free_request_packet(struct sbp2_request_packet *request_packet);
 static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
 static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
 static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
@@ -523,7 +467,7 @@ static int sbp2_reconnect_device(struct sbp2scsi_host_info *hi, struct scsi_id_i
 static int sbp2_logout_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
 static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
                                    quadlet_t *data, u64 addr, unsigned int length, u16 flags);
-static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, u32 flags);
+static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, int wait);
 static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi, 
                                   struct scsi_id_instance_data *scsi_id,
                                   struct sbp2_command_info *command,
@@ -552,8 +496,7 @@ void sbp2scsi_setup(char *str, int *ints);
 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,44)
 static int sbp2scsi_biosparam (struct scsi_device *sdev, struct block_device *dev, sector_t capacity, int geom[]);
 #else
-static int sbp2scsi_biosparam (struct scsi_device *sdev, 
-                       struct block_device *dev, sector_t capacy, int geom[]);
+static int sbp2scsi_biosparam (Scsi_Disk *disk, kdev_t dev, int geom[]);
 #endif
 static int sbp2scsi_abort (Scsi_Cmnd *SCpnt); 
 static int sbp2scsi_reset (Scsi_Cmnd *SCpnt); 
index 39618c91e661169f52c1fc41c60ca5b1e16dbdc4..5bba2258b3edf86bc1325853ae0ea15073fc4f93 100644 (file)
@@ -37,8 +37,7 @@
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/devfs_fs_kernel.h>
-
-#include <asm/bitops.h>
+#include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/wrapper.h>
 #include <linux/vmalloc.h>
@@ -1249,18 +1248,15 @@ static int video1394_ioctl(struct inode *inode, struct file *file,
 int video1394_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct file_ctx *ctx = (struct file_ctx *)file->private_data;
-       struct video_card *video = ctx->video;
-       struct ti_ohci *ohci = video->ohci;
        int res = -EINVAL;
 
        lock_kernel();
-       ohci = video->ohci;
-
        if (ctx->current_ctx == NULL) {
-               PRINT(KERN_ERR, ohci->id, "Current iso context not set");
+               PRINT(KERN_ERR, ctx->video->ohci->id, "Current iso context not set");
        } else
-               res = do_iso_mmap(ohci, ctx->current_ctx, vma);
+               res = do_iso_mmap(ctx->video->ohci, ctx->current_ctx, vma);
        unlock_kernel();
+
        return res;
 }