ieee1394: remove the old IEEE 1394 driver stack
Stefan Richter [Sat, 9 Oct 2010 22:12:20 +0000 (00:12 +0200)]
The drivers
  - ohci1394 (controller driver)
  - ieee1394 (core)
  - dv1394, raw1394, video1394 (userspace ABI)
  - eth1394, sbp2 (protocol drivers)
are replaced by
  - firewire-ohci (controller driver)
  - firewire-core (core and userspace ABI)
  - firewire-net, firewire-sbp2 (protocol drivers)
which are more featureful, better performing, and more secure than the older
drivers; all with a smaller and more modern code base.

The driver firedtv in drivers/media/dvb/firewire/ contains backends to both
ieee1394 and firewire-core.  Its ieee1394 backend code can be removed in an
independent commit; firedtv as-is builds and works fine without ieee1394.

The driver pcilynx (an incomplete controller driver) is deleted without
replacement since PCILynx cards are extremely rare.  Owners of these cards
use them with the stand-alone bus sniffer driver nosy instead.

The drivers nosy and init_ohci1394_dma which do not interact with either of
the two IEEE 1394 stacks are not affected by the ieee1394 subsystem removal.

There are still some issues with the newer firewire subsystem compared to
the older one:
  - The rare and quirky controllers ALi M52xx, Apple UniNorth v1, NVIDIA
    NForce2 are even less well supported by firewire-ohci than by ohci1394.
    I am looking into the M52xx issue.
  - The experimental firewire-net is reportedly less stable than its
    experimental cousin eth1394.
  - Audio playback of a certain group of audio devices (ones based on DICE
    chipset with EAP; supported by prerelease FFADO code) does not work yet.
    This issue is still under investigation.
  - There were some ieee1394 based out-of-the-mainline drivers.  Of them,
    only lisight, an audio driver for iSight webcams, seems still useful.
    Work is underway to reimplement it on top of firewire-core.

All these remainig issues are minor; they should not stand in the way of
overall better user experience of IEEE 1394 on Linux, together with a
reduction in support efforts and maintenance burden.  The coexistence of two
IEEE 1394 kernel driver stacks in the mainline since 2.6.22 shall end now,
as announced earlier this year.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>

50 files changed:
Documentation/ABI/obsolete/dv1394 [deleted file]
Documentation/ABI/removed/dv1394 [new file with mode: 0644]
Documentation/ABI/removed/raw1394 [new file with mode: 0644]
Documentation/ABI/removed/raw1394_legacy_isochronous [deleted file]
Documentation/ABI/removed/video1394 [new file with mode: 0644]
Documentation/feature-removal-schedule.txt
drivers/Makefile
drivers/firewire/Kconfig
drivers/ieee1394/Kconfig [deleted file]
drivers/ieee1394/Makefile [deleted file]
drivers/ieee1394/config_roms.c [deleted file]
drivers/ieee1394/config_roms.h [deleted file]
drivers/ieee1394/csr.c [deleted file]
drivers/ieee1394/csr.h [deleted file]
drivers/ieee1394/csr1212.c [deleted file]
drivers/ieee1394/csr1212.h [deleted file]
drivers/ieee1394/dma.c [deleted file]
drivers/ieee1394/dma.h [deleted file]
drivers/ieee1394/dv1394-private.h [deleted file]
drivers/ieee1394/dv1394.c [deleted file]
drivers/ieee1394/dv1394.h [deleted file]
drivers/ieee1394/eth1394.c [deleted file]
drivers/ieee1394/eth1394.h [deleted file]
drivers/ieee1394/highlevel.c [deleted file]
drivers/ieee1394/highlevel.h [deleted file]
drivers/ieee1394/hosts.c [deleted file]
drivers/ieee1394/hosts.h [deleted file]
drivers/ieee1394/ieee1394-ioctl.h [deleted file]
drivers/ieee1394/ieee1394.h [deleted file]
drivers/ieee1394/ieee1394_core.c [deleted file]
drivers/ieee1394/ieee1394_core.h [deleted file]
drivers/ieee1394/ieee1394_hotplug.h [deleted file]
drivers/ieee1394/ieee1394_transactions.c [deleted file]
drivers/ieee1394/ieee1394_transactions.h [deleted file]
drivers/ieee1394/ieee1394_types.h [deleted file]
drivers/ieee1394/iso.c [deleted file]
drivers/ieee1394/iso.h [deleted file]
drivers/ieee1394/nodemgr.c [deleted file]
drivers/ieee1394/nodemgr.h [deleted file]
drivers/ieee1394/ohci1394.c [deleted file]
drivers/ieee1394/ohci1394.h [deleted file]
drivers/ieee1394/pcilynx.c [deleted file]
drivers/ieee1394/pcilynx.h [deleted file]
drivers/ieee1394/raw1394-private.h [deleted file]
drivers/ieee1394/raw1394.c [deleted file]
drivers/ieee1394/raw1394.h [deleted file]
drivers/ieee1394/sbp2.c [deleted file]
drivers/ieee1394/sbp2.h [deleted file]
drivers/ieee1394/video1394.c [deleted file]
drivers/ieee1394/video1394.h [deleted file]

diff --git a/Documentation/ABI/obsolete/dv1394 b/Documentation/ABI/obsolete/dv1394
deleted file mode 100644 (file)
index 2ee3686..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-What:          dv1394 (a.k.a. "OHCI-DV I/O support" for FireWire)
-Contact:       linux1394-devel@lists.sourceforge.net
-Description:
-       New application development should use raw1394 + userspace libraries
-       instead, notably libiec61883 which is functionally equivalent.
-
-Users:
-       ffmpeg/libavformat (used by a variety of media players)
-       dvgrab v1.x (replaced by dvgrab2 on top of raw1394 and resp. libraries)
diff --git a/Documentation/ABI/removed/dv1394 b/Documentation/ABI/removed/dv1394
new file mode 100644 (file)
index 0000000..c2310b6
--- /dev/null
@@ -0,0 +1,14 @@
+What:          dv1394 (a.k.a. "OHCI-DV I/O support" for FireWire)
+Date:          May 2010 (scheduled), finally removed in kernel v2.6.37
+Contact:       linux1394-devel@lists.sourceforge.net
+Description:
+       /dev/dv1394/* were character device files, one for each FireWire
+       controller and for NTSC and PAL respectively, from which DV data
+       could be received by read() or transmitted by write().  A few
+       ioctl()s allowed limited control.
+       This special-purpose interface has been superseded by libraw1394 +
+       libiec61883 which are functionally equivalent, support HDV, and
+       transparently work on top of the newer firewire kernel drivers.
+
+Users:
+       ffmpeg/libavformat (if configured for DV1394)
diff --git a/Documentation/ABI/removed/raw1394 b/Documentation/ABI/removed/raw1394
new file mode 100644 (file)
index 0000000..490aa1e
--- /dev/null
@@ -0,0 +1,15 @@
+What:          raw1394 (a.k.a. "Raw IEEE1394 I/O support" for FireWire)
+Date:          May 2010 (scheduled), finally removed in kernel v2.6.37
+Contact:       linux1394-devel@lists.sourceforge.net
+Description:
+       /dev/raw1394 was a character device file that allowed low-level
+       access to FireWire buses.  Its major drawbacks were its inability
+       to implement sensible device security policies, and its low level
+       of abstraction that required userspace clients do duplicate much
+       of the kernel's ieee1394 core functionality.
+       Replaced by /dev/fw*, i.e. the <linux/firewire-cdev.h> ABI of
+       firewire-core.
+
+Users:
+       libraw1394 (works with firewire-cdev too, transparent to library ABI
+       users)
diff --git a/Documentation/ABI/removed/raw1394_legacy_isochronous b/Documentation/ABI/removed/raw1394_legacy_isochronous
deleted file mode 100644 (file)
index 1b62962..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-What:          legacy isochronous ABI of raw1394 (1st generation iso ABI)
-Date:          June 2007 (scheduled), removed in kernel v2.6.23
-Contact:       linux1394-devel@lists.sourceforge.net
-Description:
-       The two request types RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN have
-       been deprecated for quite some time.  They are very inefficient as they
-       come with high interrupt load and several layers of callbacks for each
-       packet.  Because of these deficiencies, the video1394 and dv1394 drivers
-       and the 3rd-generation isochronous ABI in raw1394 (rawiso) were created.
-
-Users:
-       libraw1394 users via the long deprecated API raw1394_iso_write,
-       raw1394_start_iso_write, raw1394_start_iso_rcv, raw1394_stop_iso_rcv
-
-       libdc1394, which optionally uses these old libraw1394 calls
-       alternatively to the more efficient video1394 ABI
diff --git a/Documentation/ABI/removed/video1394 b/Documentation/ABI/removed/video1394
new file mode 100644 (file)
index 0000000..c39c25a
--- /dev/null
@@ -0,0 +1,16 @@
+What:          video1394 (a.k.a. "OHCI-1394 Video support" for FireWire)
+Date:          May 2010 (scheduled), finally removed in kernel v2.6.37
+Contact:       linux1394-devel@lists.sourceforge.net
+Description:
+       /dev/video1394/* were character device files, one for each FireWire
+       controller, which were used for isochronous I/O.  It was added as an
+       alternative to raw1394's isochronous I/O functionality which had
+       performance issues in its first generation.  Any video1394 user had
+       to use raw1394 + libraw1394 too because video1394 did not provide
+       asynchronous I/O for device discovery and configuration.
+       Replaced by /dev/fw*, i.e. the <linux/firewire-cdev.h> ABI of
+       firewire-core.
+
+Users:
+       libdc1394 (works with firewire-cdev too, transparent to library ABI
+       users)
index 842aa9d..1388eca 100644 (file)
@@ -530,16 +530,6 @@ Who:       Thomas Gleixner <tglx@linutronix.de>
 
 ----------------------------
 
-What:  old ieee1394 subsystem (CONFIG_IEEE1394)
-When:  2.6.37
-Files: drivers/ieee1394/ except init_ohci1394_dma.c
-Why:   superseded by drivers/firewire/ (CONFIG_FIREWIRE) which offers more
-       features, better performance, and better security, all with smaller
-       and more modern code base
-Who:   Stefan Richter <stefanr@s5r6.in-berlin.de>
-
-----------------------------
-
 What:  The acpi_sleep=s4_nonvs command line option
 When:  2.6.37
 Files: arch/x86/kernel/acpi/sleep.c
index a2aea53..ecde80a 100644 (file)
@@ -51,7 +51,6 @@ obj-y                         += net/
 obj-$(CONFIG_ATM)              += atm/
 obj-$(CONFIG_FUSION)           += message/
 obj-y                          += firewire/
-obj-y                          += ieee1394/
 obj-$(CONFIG_UIO)              += uio/
 obj-y                          += cdrom/
 obj-y                          += auxdisplay/
index fcf3ea2..40a222e 100644 (file)
@@ -3,9 +3,6 @@ menu "IEEE 1394 (FireWire) support"
        # firewire-core does not depend on PCI but is
        # not useful without PCI controller driver
 
-comment "You can enable one or both FireWire driver stacks."
-comment "The newer stack is recommended."
-
 config FIREWIRE
        tristate "FireWire driver stack"
        select CRC_ITU_T
@@ -64,8 +61,6 @@ config FIREWIRE_NET
          To compile this driver as a module, say M here:  The module will be
          called firewire-net.
 
-source "drivers/ieee1394/Kconfig"
-
 config FIREWIRE_NOSY
        tristate "Nosy - a FireWire traffic sniffer for PCILynx cards"
        depends on PCI
diff --git a/drivers/ieee1394/Kconfig b/drivers/ieee1394/Kconfig
deleted file mode 100644 (file)
index e02096c..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-config IEEE1394
-       tristate "Legacy alternative FireWire driver stack"
-       depends on PCI || BROKEN
-       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
-         computer.
-
-         If you have FireWire hardware and want to use it, say Y here.  This
-         is the core support only, you will also need to select a driver for
-         your IEEE 1394 adapter.
-
-         To compile this driver as a module, say M here: the module will be
-         called ieee1394.
-
-         NOTE:
-         ieee1394 is superseded by the newer firewire-core driver.  See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-config IEEE1394_OHCI1394
-       tristate "OHCI-1394 controllers"
-       depends on PCI && IEEE1394
-       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
-         use one of these chipsets.  It should work with any OHCI-1394
-         compliant card, however.
-
-         To compile this driver as a module, say M here: the module will be
-         called ohci1394.
-
-         NOTE:
-         ohci1394 is superseded by the newer firewire-ohci driver.  See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-         If you want to install firewire-ohci and ohci1394 together, you
-         should configure them only as modules and blacklist the driver(s)
-         which you don't want to have auto-loaded.  Add either
-
-             blacklist ohci1394
-             blacklist video1394
-             blacklist dv1394
-         or
-             blacklist firewire-ohci
-
-         to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf
-         depending on your distribution.
-
-comment "PCILynx controller requires I2C"
-       depends on IEEE1394 && I2C=n
-
-config IEEE1394_PCILYNX
-       tristate "PCILynx controller"
-       depends on PCI && IEEE1394 && I2C
-       select I2C_ALGOBIT
-       help
-         Say Y here if you have an IEEE-1394 controller with the Texas
-         Instruments PCILynx chip.  Note: this driver is written for revision
-         2 of this chip and may not work with revision 0.
-
-         To compile this driver as a module, say M here: the module will be
-         called pcilynx.
-
-         Only some old and now very rare PCI and CardBus cards and
-         PowerMacs G3 B&W contain the PCILynx controller.  Therefore
-         almost everybody can say N here.
-
-comment "SBP-2 support (for storage devices) requires SCSI"
-       depends on IEEE1394 && SCSI=n
-
-config IEEE1394_SBP2
-       tristate "Storage devices (SBP-2 protocol)"
-       depends on IEEE1394 && SCSI
-       help
-         This option enables you to use SBP-2 devices connected to an IEEE
-         1394 bus.  SBP-2 devices include storage devices like harddisks and
-         DVD drives, also some other FireWire devices like scanners.
-
-         You should also enable support for disks, CD-ROMs, etc. in the SCSI
-         configuration section.
-
-         To compile this driver as a module, say M here: the module will be
-         called sbp2.
-
-         NOTE:
-         sbp2 is superseded by the newer firewire-sbp2 driver. See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-config IEEE1394_SBP2_PHYS_DMA
-       bool "Enable replacement for physical DMA in SBP2"
-       depends on IEEE1394_SBP2 && VIRT_TO_BUS && EXPERIMENTAL
-       help
-         This builds sbp2 for use with non-OHCI host adapters which do not
-         support physical DMA or for when ohci1394 is run with phys_dma=0.
-         Physical DMA is data movement without assistance of the drivers'
-         interrupt handlers.  This option includes the interrupt handlers
-         that are required in absence of this hardware feature.
-
-         This option is buggy and currently broken on some architectures.
-         If unsure, say N.
-
-config IEEE1394_ETH1394_ROM_ENTRY
-       depends on IEEE1394
-       bool
-       default n
-
-config IEEE1394_ETH1394
-       tristate "IP networking over 1394 (experimental)"
-       depends on IEEE1394 && EXPERIMENTAL && INET
-       select IEEE1394_ETH1394_ROM_ENTRY
-       help
-         This driver implements a functional majority of RFC 2734: IPv4 over
-         1394.  It will provide IP connectivity with implementations of RFC
-         2734 found on other operating systems.  It will not communicate with
-         older versions of this driver found in stock kernels prior to 2.6.3.
-         This driver is still considered experimental.  It does not yet support
-         MCAP, therefore multicast support is significantly limited.
-
-         The module is called eth1394 although it does not emulate Ethernet.
-
-         NOTE:
-         eth1394 is superseded by the newer firewire-net driver. See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-config IEEE1394_RAWIO
-       tristate "raw1394 userspace interface"
-       depends on IEEE1394
-       help
-         This option adds support for the raw1394 device file which enables
-         direct communication of user programs with IEEE 1394 devices
-         (isochronous and asynchronous).  Almost all application programs
-         which access FireWire require this option.
-
-         To compile this driver as a module, say M here: the module will be
-         called raw1394.
-
-         NOTE:
-         raw1394 is superseded by the newer firewire-core driver. See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-config IEEE1394_VIDEO1394
-       tristate "video1394 userspace interface"
-       depends on IEEE1394 && IEEE1394_OHCI1394
-       help
-         This option adds support for the video1394 device files which enable
-         isochronous communication of user programs with IEEE 1394 devices,
-         especially video capture or export.  This interface is used by all
-         libdc1394 based programs and by several other programs, in addition to
-         the raw1394 interface.  It is generally not required for DV capture.
-
-         To compile this driver as a module, say M here: the module will be
-         called video1394.
-
-         NOTE:
-         video1394 is superseded by the newer firewire-core driver. See
-         http://ieee1394.wiki.kernel.org/index.php/Juju_Migration for
-         further information on how to switch to the new FireWire drivers.
-
-config IEEE1394_DV1394
-       tristate "dv1394 userspace interface (deprecated)"
-       depends on IEEE1394 && IEEE1394_OHCI1394
-       help
-         The dv1394 driver is unsupported and may be removed from Linux in a
-         future release.  Its functionality is now provided by either
-         raw1394 or firewire-core together with libraries such as libiec61883.
-
-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
-         ieee1394 drivers, including sent and received packet headers.  This
-         will quickly result in large amounts of data sent to the system log.
-
-         Say Y if you really need the debugging output.  Everyone else says N.
diff --git a/drivers/ieee1394/Makefile b/drivers/ieee1394/Makefile
deleted file mode 100644 (file)
index 427b86b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Makefile for the Linux IEEE 1394 implementation
-#
-
-ieee1394-objs := ieee1394_core.o ieee1394_transactions.o hosts.o \
-                highlevel.o csr.o nodemgr.o dma.o iso.o \
-                csr1212.o config_roms.o
-
-obj-$(CONFIG_IEEE1394) += ieee1394.o
-obj-$(CONFIG_IEEE1394_PCILYNX) += pcilynx.o
-obj-$(CONFIG_IEEE1394_OHCI1394) += ohci1394.o
-obj-$(CONFIG_IEEE1394_VIDEO1394) += video1394.o
-obj-$(CONFIG_IEEE1394_RAWIO) += raw1394.o
-obj-$(CONFIG_IEEE1394_SBP2) += sbp2.o
-obj-$(CONFIG_IEEE1394_DV1394) += dv1394.o
-obj-$(CONFIG_IEEE1394_ETH1394) += eth1394.o
diff --git a/drivers/ieee1394/config_roms.c b/drivers/ieee1394/config_roms.c
deleted file mode 100644 (file)
index 1b98120..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * IEEE 1394 for Linux
- *
- * ConfigROM  entries
- *
- * Copyright (C) 2004 Ben Collins
- *
- * This code is licensed under the GPL.  See the file COPYING in the root
- * directory of the kernel sources for details.
- */
-
-#include <linux/types.h>
-
-#include "csr1212.h"
-#include "ieee1394.h"
-#include "ieee1394_types.h"
-#include "hosts.h"
-#include "ieee1394_core.h"
-#include "highlevel.h"
-#include "csr.h"
-#include "config_roms.h"
-
-struct hpsb_config_rom_entry {
-       const char *name;
-
-       /* Base initialization, called at module load */
-       int (*init)(void);
-
-       /* Cleanup called at module exit */
-       void (*cleanup)(void);
-
-       /* The flag added to host->config_roms */
-       unsigned int flag;
-};
-
-/* The default host entry. This must succeed. */
-int hpsb_default_host_entry(struct hpsb_host *host)
-{
-       struct csr1212_keyval *root;
-       struct csr1212_keyval *vend_id = NULL;
-       struct csr1212_keyval *text = NULL;
-       char csr_name[128];
-       int ret;
-
-       sprintf(csr_name, "Linux - %s", host->driver->name);
-       root = host->csr.rom->root_kv;
-
-       vend_id = csr1212_new_immediate(CSR1212_KV_ID_VENDOR, host->csr.guid_hi >> 8);
-       text = csr1212_new_string_descriptor_leaf(csr_name);
-
-       if (!vend_id || !text) {
-               if (vend_id)
-                       csr1212_release_keyval(vend_id);
-               if (text)
-                       csr1212_release_keyval(text);
-               csr1212_destroy_csr(host->csr.rom);
-               return -ENOMEM;
-       }
-
-       csr1212_associate_keyval(vend_id, text);
-       csr1212_release_keyval(text);
-       ret = csr1212_attach_keyval_to_directory(root, vend_id);
-       csr1212_release_keyval(vend_id);
-       if (ret != CSR1212_SUCCESS) {
-               csr1212_destroy_csr(host->csr.rom);
-               return -ENOMEM;
-       }
-
-       host->update_config_rom = 1;
-
-       return 0;
-}
-
-
-#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
-#include "eth1394.h"
-
-static struct csr1212_keyval *ip1394_ud;
-
-static int config_rom_ip1394_init(void)
-{
-       struct csr1212_keyval *spec_id = NULL;
-       struct csr1212_keyval *spec_desc = NULL;
-       struct csr1212_keyval *ver = NULL;
-       struct csr1212_keyval *ver_desc = NULL;
-       int ret = -ENOMEM;
-
-       ip1394_ud = csr1212_new_directory(CSR1212_KV_ID_UNIT);
-
-       spec_id = csr1212_new_immediate(CSR1212_KV_ID_SPECIFIER_ID,
-                                       ETHER1394_GASP_SPECIFIER_ID);
-       spec_desc = csr1212_new_string_descriptor_leaf("IANA");
-       ver = csr1212_new_immediate(CSR1212_KV_ID_VERSION,
-                                   ETHER1394_GASP_VERSION);
-       ver_desc = csr1212_new_string_descriptor_leaf("IPv4");
-
-       if (!ip1394_ud || !spec_id || !spec_desc || !ver || !ver_desc)
-               goto ip1394_fail;
-
-       csr1212_associate_keyval(spec_id, spec_desc);
-       csr1212_associate_keyval(ver, ver_desc);
-       if (csr1212_attach_keyval_to_directory(ip1394_ud, spec_id)
-                       == CSR1212_SUCCESS &&
-           csr1212_attach_keyval_to_directory(ip1394_ud, ver)
-                       == CSR1212_SUCCESS)
-               ret = 0;
-
-ip1394_fail:
-       if (ret && ip1394_ud) {
-               csr1212_release_keyval(ip1394_ud);
-               ip1394_ud = NULL;
-       }
-
-       if (spec_id)
-               csr1212_release_keyval(spec_id);
-       if (spec_desc)
-               csr1212_release_keyval(spec_desc);
-       if (ver)
-               csr1212_release_keyval(ver);
-       if (ver_desc)
-               csr1212_release_keyval(ver_desc);
-
-       return ret;
-}
-
-static void config_rom_ip1394_cleanup(void)
-{
-       if (ip1394_ud) {
-               csr1212_release_keyval(ip1394_ud);
-               ip1394_ud = NULL;
-       }
-}
-
-int hpsb_config_rom_ip1394_add(struct hpsb_host *host)
-{
-       if (!ip1394_ud)
-               return -ENODEV;
-
-       if (csr1212_attach_keyval_to_directory(host->csr.rom->root_kv,
-                                              ip1394_ud) != CSR1212_SUCCESS)
-               return -ENOMEM;
-
-       host->config_roms |= HPSB_CONFIG_ROM_ENTRY_IP1394;
-       host->update_config_rom = 1;
-       return 0;
-}
-EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_add);
-
-void hpsb_config_rom_ip1394_remove(struct hpsb_host *host)
-{
-       csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, ip1394_ud);
-       host->config_roms &= ~HPSB_CONFIG_ROM_ENTRY_IP1394;
-       host->update_config_rom = 1;
-}
-EXPORT_SYMBOL_GPL(hpsb_config_rom_ip1394_remove);
-
-static struct hpsb_config_rom_entry ip1394_entry = {
-       .name           = "ip1394",
-       .init           = config_rom_ip1394_init,
-       .cleanup        = config_rom_ip1394_cleanup,
-       .flag           = HPSB_CONFIG_ROM_ENTRY_IP1394,
-};
-
-#endif /* CONFIG_IEEE1394_ETH1394_ROM_ENTRY */
-
-static struct hpsb_config_rom_entry *const config_rom_entries[] = {
-#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
-       &ip1394_entry,
-#endif
-};
-
-/* Initialize all config roms */
-int hpsb_init_config_roms(void)
-{
-       int i, error = 0;
-
-       for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
-               if (config_rom_entries[i]->init()) {
-                       HPSB_ERR("Failed to initialize config rom entry `%s'",
-                                config_rom_entries[i]->name);
-                       error = -1;
-               }
-
-       return error;
-}
-
-/* Cleanup all config roms */
-void hpsb_cleanup_config_roms(void)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(config_rom_entries); i++)
-               config_rom_entries[i]->cleanup();
-}
diff --git a/drivers/ieee1394/config_roms.h b/drivers/ieee1394/config_roms.h
deleted file mode 100644 (file)
index 1f5cd1f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _IEEE1394_CONFIG_ROMS_H
-#define _IEEE1394_CONFIG_ROMS_H
-
-struct hpsb_host;
-
-int hpsb_default_host_entry(struct hpsb_host *host);
-int hpsb_init_config_roms(void);
-void hpsb_cleanup_config_roms(void);
-
-/* List of flags to check if a host contains a certain extra config rom
- * entry. Available in the host->config_roms member. */
-#define HPSB_CONFIG_ROM_ENTRY_IP1394           0x00000001
-
-#ifdef CONFIG_IEEE1394_ETH1394_ROM_ENTRY
-int hpsb_config_rom_ip1394_add(struct hpsb_host *host);
-void hpsb_config_rom_ip1394_remove(struct hpsb_host *host);
-#endif
-
-#endif /* _IEEE1394_CONFIG_ROMS_H */
diff --git a/drivers/ieee1394/csr.c b/drivers/ieee1394/csr.c
deleted file mode 100644 (file)
index d696f69..0000000
+++ /dev/null
@@ -1,843 +0,0 @@
-/*
- * IEEE 1394 for Linux
- *
- * CSR implementation, iso/bus manager implementation.
- *
- * Copyright (C) 1999 Andreas E. Bombe
- *               2002 Manfred Weihs <weihs@ict.tuwien.ac.at>
- *
- * This code is licensed under the GPL.  See the file COPYING in the root
- * directory of the kernel sources for details.
- *
- *
- * Contributions:
- *
- * Manfred Weihs <weihs@ict.tuwien.ac.at>
- *        configuration ROM manipulation
- *
- */
-
-#include <linux/jiffies.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/param.h>
-#include <linux/spinlock.h>
-#include <linux/string.h>
-
-#include "csr1212.h"
-#include "ieee1394_types.h"
-#include "hosts.h"
-#include "ieee1394.h"
-#include "highlevel.h"
-#include "ieee1394_core.h"
-
-/* Module Parameters */
-/* this module parameter can be used to disable mapping of the FCP registers */
-
-static int fcp = 1;
-module_param(fcp, int, 0444);
-MODULE_PARM_DESC(fcp, "Map FCP registers (default = 1, disable = 0).");
-
-static struct csr1212_keyval *node_cap = NULL;
-
-static void add_host(struct hpsb_host *host);
-static void remove_host(struct hpsb_host *host);
-static void host_reset(struct hpsb_host *host);
-static int read_maps(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
-                    u64 addr, size_t length, u16 fl);
-static int write_fcp(struct hpsb_host *host, int nodeid, int dest,
-                    quadlet_t *data, u64 addr, size_t length, u16 flags);
-static int read_regs(struct hpsb_host *host, int nodeid, quadlet_t *buf,
-                    u64 addr, size_t length, u16 flags);
-static int write_regs(struct hpsb_host *host, int nodeid, int destid,
-                     quadlet_t *data, u64 addr, size_t length, u16 flags);
-static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
-                    u64 addr, quadlet_t data, quadlet_t arg, int extcode, u16 fl);
-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);
-static int read_config_rom(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
-                          u64 addr, size_t length, u16 fl);
-static u64 allocate_addr_range(u64 size, u32 alignment, void *__host);
-static void release_addr_range(u64 addr, void *__host);
-
-static struct hpsb_highlevel csr_highlevel = {
-       .name =         "standard registers",
-       .add_host =     add_host,
-       .remove_host =  remove_host,
-       .host_reset =   host_reset,
-};
-
-static const struct hpsb_address_ops map_ops = {
-       .read = read_maps,
-};
-
-static const struct hpsb_address_ops fcp_ops = {
-       .write = write_fcp,
-};
-
-static const struct hpsb_address_ops reg_ops = {
-       .read = read_regs,
-       .write = write_regs,
-       .lock = lock_regs,
-       .lock64 = lock64_regs,
-};
-
-static const struct hpsb_address_ops config_rom_ops = {
-       .read = read_config_rom,
-};
-
-struct csr1212_bus_ops csr_bus_ops = {
-       .allocate_addr_range =  allocate_addr_range,
-       .release_addr =         release_addr_range,
-};
-
-
-static u16 csr_crc16(unsigned *data, int length)
-{
-        int check=0, i;
-        int shift, sum, next=0;
-
-        for (i = length; i; i--) {
-                for (next = check, shift = 28; shift >= 0; shift -= 4 ) {
-                        sum = ((next >> 12) ^ (be32_to_cpu(*data) >> shift)) & 0xf;
-                        next = (next << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
-                }
-                check = next & 0xffff;
-                data++;
-        }
-
-        return check;
-}
-
-static void host_reset(struct hpsb_host *host)
-{
-        host->csr.state &= 0x300;
-
-        host->csr.bus_manager_id = 0x3f;
-        host->csr.bandwidth_available = 4915;
-       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;
-
-        if (!host->is_root) {
-                /* clear cmstr bit */
-                host->csr.state &= ~0x100;
-        }
-
-       be32_add_cpu(&host->csr.topology_map[1], 1);
-        host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16
-                                                | host->selfid_count);
-        host->csr.topology_map[0] =
-                cpu_to_be32((host->selfid_count + 2) << 16
-                            | csr_crc16(host->csr.topology_map + 1,
-                                        host->selfid_count + 2));
-
-       be32_add_cpu(&host->csr.speed_map[1], 1);
-        host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16
-                                             | csr_crc16(host->csr.speed_map+1,
-                                                         0x3f1));
-}
-
-/*
- * HI == seconds (bits 0:2)
- * LO == fractions of a second in units of 125usec (bits 19:31)
- *
- * Convert SPLIT_TIMEOUT to jiffies.
- * The default and minimum as per 1394a-2000 clause 8.3.2.2.6 is 100ms.
- */
-static inline void calculate_expire(struct csr_control *csr)
-{
-       unsigned int usecs = (csr->split_timeout_hi & 7) * 1000000 +
-                            (csr->split_timeout_lo >> 19) * 125;
-
-       csr->expire = usecs_to_jiffies(usecs > 100000 ? usecs : 100000);
-       HPSB_VERBOSE("CSR: setting expire to %lu, HZ=%u", csr->expire, HZ);
-}
-
-
-static void add_host(struct hpsb_host *host)
-{
-       struct csr1212_keyval *root;
-       quadlet_t bus_info[CSR_BUS_INFO_SIZE];
-
-       hpsb_register_addrspace(&csr_highlevel, host, &reg_ops,
-                               CSR_REGISTER_BASE,
-                               CSR_REGISTER_BASE + CSR_CONFIG_ROM);
-       hpsb_register_addrspace(&csr_highlevel, host, &config_rom_ops,
-                               CSR_REGISTER_BASE + CSR_CONFIG_ROM,
-                               CSR_REGISTER_BASE + CSR_CONFIG_ROM_END);
-       if (fcp) {
-               hpsb_register_addrspace(&csr_highlevel, host, &fcp_ops,
-                                       CSR_REGISTER_BASE + CSR_FCP_COMMAND,
-                                       CSR_REGISTER_BASE + CSR_FCP_END);
-       }
-       hpsb_register_addrspace(&csr_highlevel, host, &map_ops,
-                               CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP,
-                               CSR_REGISTER_BASE + CSR_TOPOLOGY_MAP_END);
-       hpsb_register_addrspace(&csr_highlevel, host, &map_ops,
-                               CSR_REGISTER_BASE + CSR_SPEED_MAP,
-                               CSR_REGISTER_BASE + CSR_SPEED_MAP_END);
-
-        spin_lock_init(&host->csr.lock);
-
-        host->csr.state                 = 0;
-        host->csr.node_ids              = 0;
-        host->csr.split_timeout_hi      = 0;
-        host->csr.split_timeout_lo      = 800 << 19;
-       calculate_expire(&host->csr);
-        host->csr.cycle_time            = 0;
-        host->csr.bus_time              = 0;
-        host->csr.bus_manager_id        = 0x3f;
-        host->csr.bandwidth_available   = 4915;
-       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);
-               }
-       }
-
-       if (host->csr.max_rec >= 9)
-               host->csr.max_rom = 2;
-       else if (host->csr.max_rec >= 5)
-               host->csr.max_rom = 1;
-       else
-               host->csr.max_rom = 0;
-
-       host->csr.generation = 2;
-
-       bus_info[1] = IEEE1394_BUSID_MAGIC;
-       bus_info[2] = cpu_to_be32((hpsb_disable_irm ? 0 : 1 << CSR_IRMC_SHIFT) |
-                                 (1 << CSR_CMC_SHIFT) |
-                                 (1 << CSR_ISC_SHIFT) |
-                                 (0 << CSR_BMC_SHIFT) |
-                                 (0 << CSR_PMC_SHIFT) |
-                                 (host->csr.cyc_clk_acc << CSR_CYC_CLK_ACC_SHIFT) |
-                                 (host->csr.max_rec << CSR_MAX_REC_SHIFT) |
-                                 (host->csr.max_rom << CSR_MAX_ROM_SHIFT) |
-                                 (host->csr.generation << CSR_GENERATION_SHIFT) |
-                                 host->csr.lnk_spd);
-
-       bus_info[3] = cpu_to_be32(host->csr.guid_hi);
-       bus_info[4] = cpu_to_be32(host->csr.guid_lo);
-
-       /* The hardware copy of the bus info block will be set later when a
-        * bus reset is issued. */
-
-       csr1212_init_local_csr(host->csr.rom, bus_info, host->csr.max_rom);
-
-       root = host->csr.rom->root_kv;
-
-       if(csr1212_attach_keyval_to_directory(root, node_cap) != CSR1212_SUCCESS) {
-               HPSB_ERR("Failed to attach Node Capabilities to root directory");
-       }
-
-       host->update_config_rom = 1;
-}
-
-static void remove_host(struct hpsb_host *host)
-{
-       quadlet_t bus_info[CSR_BUS_INFO_SIZE];
-
-       bus_info[1] = IEEE1394_BUSID_MAGIC;
-       bus_info[2] = cpu_to_be32((0 << CSR_IRMC_SHIFT) |
-                                 (0 << CSR_CMC_SHIFT) |
-                                 (0 << CSR_ISC_SHIFT) |
-                                 (0 << CSR_BMC_SHIFT) |
-                                 (0 << CSR_PMC_SHIFT) |
-                                 (host->csr.cyc_clk_acc << CSR_CYC_CLK_ACC_SHIFT) |
-                                 (host->csr.max_rec << CSR_MAX_REC_SHIFT) |
-                                 (0 << CSR_MAX_ROM_SHIFT) |
-                                 (0 << CSR_GENERATION_SHIFT) |
-                                 host->csr.lnk_spd);
-
-       bus_info[3] = cpu_to_be32(host->csr.guid_hi);
-       bus_info[4] = cpu_to_be32(host->csr.guid_lo);
-
-       csr1212_detach_keyval_from_directory(host->csr.rom->root_kv, node_cap);
-
-       csr1212_init_local_csr(host->csr.rom, bus_info, 0);
-       host->update_config_rom = 1;
-}
-
-
-int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom,
-       size_t buffersize, unsigned char rom_version)
-{
-       unsigned long flags;
-       int ret;
-
-       HPSB_NOTICE("hpsb_update_config_rom() is deprecated");
-
-        spin_lock_irqsave(&host->csr.lock, flags);
-       if (rom_version != host->csr.generation)
-                ret = -1;
-       else if (buffersize > host->csr.rom->cache_head->size)
-               ret = -2;
-        else {
-               /* Just overwrite the generated ConfigROM image with new data,
-                * it can be regenerated later. */
-               memcpy(host->csr.rom->cache_head->data, new_rom, buffersize);
-               host->csr.rom->cache_head->len = buffersize;
-
-               if (host->driver->set_hw_config_rom)
-                       host->driver->set_hw_config_rom(host, host->csr.rom->bus_info_data);
-               /* Increment the generation number to keep some sort of sync
-                * with the newer ConfigROM manipulation method. */
-               host->csr.generation++;
-               if (host->csr.generation > 0xf || host->csr.generation < 2)
-                       host->csr.generation = 2;
-               ret=0;
-        }
-        spin_unlock_irqrestore(&host->csr.lock, flags);
-        return ret;
-}
-
-
-/* Read topology / speed maps and configuration ROM */
-static int read_maps(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
-                     u64 addr, size_t length, u16 fl)
-{
-       unsigned long flags;
-        int csraddr = addr - CSR_REGISTER_BASE;
-        const char *src;
-
-        spin_lock_irqsave(&host->csr.lock, flags);
-
-       if (csraddr < CSR_SPEED_MAP) {
-                src = ((char *)host->csr.topology_map) + csraddr
-                        - CSR_TOPOLOGY_MAP;
-        } else {
-                src = ((char *)host->csr.speed_map) + csraddr - CSR_SPEED_MAP;
-        }
-
-        memcpy(buffer, src, length);
-        spin_unlock_irqrestore(&host->csr.lock, flags);
-        return RCODE_COMPLETE;
-}
-
-
-#define out if (--length == 0) break
-
-static int read_regs(struct hpsb_host *host, int nodeid, quadlet_t *buf,
-                     u64 addr, size_t length, u16 flags)
-{
-        int csraddr = addr - CSR_REGISTER_BASE;
-        int oldcycle;
-        quadlet_t ret;
-
-        if ((csraddr | length) & 0x3)
-                return RCODE_TYPE_ERROR;
-
-        length /= 4;
-
-        switch (csraddr) {
-        case CSR_STATE_CLEAR:
-                *(buf++) = cpu_to_be32(host->csr.state);
-                out;
-        case CSR_STATE_SET:
-                *(buf++) = cpu_to_be32(host->csr.state);
-                out;
-        case CSR_NODE_IDS:
-                *(buf++) = cpu_to_be32(host->csr.node_ids);
-                out;
-
-        case CSR_RESET_START:
-                return RCODE_TYPE_ERROR;
-
-                /* address gap - handled by default below */
-
-        case CSR_SPLIT_TIMEOUT_HI:
-                *(buf++) = cpu_to_be32(host->csr.split_timeout_hi);
-                out;
-        case CSR_SPLIT_TIMEOUT_LO:
-                *(buf++) = cpu_to_be32(host->csr.split_timeout_lo);
-                out;
-
-                /* address gap */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_CYCLE_TIME:
-                oldcycle = host->csr.cycle_time;
-                host->csr.cycle_time =
-                        host->driver->devctl(host, GET_CYCLE_COUNTER, 0);
-
-                if (oldcycle > host->csr.cycle_time) {
-                        /* cycle time wrapped around */
-                        host->csr.bus_time += 1 << 7;
-                }
-                *(buf++) = cpu_to_be32(host->csr.cycle_time);
-                out;
-        case CSR_BUS_TIME:
-                oldcycle = host->csr.cycle_time;
-                host->csr.cycle_time =
-                        host->driver->devctl(host, GET_CYCLE_COUNTER, 0);
-
-                if (oldcycle > host->csr.cycle_time) {
-                        /* cycle time wrapped around */
-                        host->csr.bus_time += (1 << 7);
-                }
-                *(buf++) = cpu_to_be32(host->csr.bus_time
-                                       | (host->csr.cycle_time >> 25));
-                out;
-
-                /* address gap */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_BUSY_TIMEOUT:
-                /* not yet implemented */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_BUS_MANAGER_ID:
-                if (host->driver->hw_csr_reg)
-                        ret = host->driver->hw_csr_reg(host, 0, 0, 0);
-                else
-                        ret = host->csr.bus_manager_id;
-
-                *(buf++) = cpu_to_be32(ret);
-                out;
-        case CSR_BANDWIDTH_AVAILABLE:
-                if (host->driver->hw_csr_reg)
-                        ret = host->driver->hw_csr_reg(host, 1, 0, 0);
-                else
-                        ret = host->csr.bandwidth_available;
-
-                *(buf++) = cpu_to_be32(ret);
-                out;
-        case CSR_CHANNELS_AVAILABLE_HI:
-                if (host->driver->hw_csr_reg)
-                        ret = host->driver->hw_csr_reg(host, 2, 0, 0);
-                else
-                        ret = host->csr.channels_available_hi;
-
-                *(buf++) = cpu_to_be32(ret);
-                out;
-        case CSR_CHANNELS_AVAILABLE_LO:
-                if (host->driver->hw_csr_reg)
-                        ret = host->driver->hw_csr_reg(host, 3, 0, 0);
-                else
-                        ret = host->csr.channels_available_lo;
-
-                *(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;
-        }
-
-        return RCODE_COMPLETE;
-}
-
-static int write_regs(struct hpsb_host *host, int nodeid, int destid,
-                     quadlet_t *data, u64 addr, size_t length, u16 flags)
-{
-        int csraddr = addr - CSR_REGISTER_BASE;
-
-        if ((csraddr | length) & 0x3)
-                return RCODE_TYPE_ERROR;
-
-        length /= 4;
-
-        switch (csraddr) {
-        case CSR_STATE_CLEAR:
-                /* FIXME FIXME FIXME */
-                printk("doh, someone wants to mess with state clear\n");
-                out;
-        case CSR_STATE_SET:
-                printk("doh, someone wants to mess with state set\n");
-                out;
-
-        case CSR_NODE_IDS:
-                host->csr.node_ids &= NODE_MASK << 16;
-                host->csr.node_ids |= be32_to_cpu(*(data++)) & (BUS_MASK << 16);
-                host->node_id = host->csr.node_ids >> 16;
-                host->driver->devctl(host, SET_BUS_ID, host->node_id >> 6);
-                out;
-
-        case CSR_RESET_START:
-                /* FIXME - perform command reset */
-                out;
-
-                /* address gap */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_SPLIT_TIMEOUT_HI:
-                host->csr.split_timeout_hi =
-                        be32_to_cpu(*(data++)) & 0x00000007;
-               calculate_expire(&host->csr);
-                out;
-        case CSR_SPLIT_TIMEOUT_LO:
-                host->csr.split_timeout_lo =
-                        be32_to_cpu(*(data++)) & 0xfff80000;
-               calculate_expire(&host->csr);
-                out;
-
-                /* address gap */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_CYCLE_TIME:
-                /* should only be set by cycle start packet, automatically */
-                host->csr.cycle_time = be32_to_cpu(*data);
-                host->driver->devctl(host, SET_CYCLE_COUNTER,
-                                       be32_to_cpu(*(data++)));
-                out;
-        case CSR_BUS_TIME:
-                host->csr.bus_time = be32_to_cpu(*(data++)) & 0xffffff80;
-                out;
-
-                /* address gap */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_BUSY_TIMEOUT:
-                /* not yet implemented */
-                return RCODE_ADDRESS_ERROR;
-
-        case CSR_BUS_MANAGER_ID:
-        case CSR_BANDWIDTH_AVAILABLE:
-        case CSR_CHANNELS_AVAILABLE_HI:
-        case CSR_CHANNELS_AVAILABLE_LO:
-                /* 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;
-        }
-
-        return RCODE_COMPLETE;
-}
-
-#undef out
-
-
-static int lock_regs(struct hpsb_host *host, int nodeid, quadlet_t *store,
-                     u64 addr, quadlet_t data, quadlet_t arg, int extcode, u16 fl)
-{
-        int csraddr = addr - CSR_REGISTER_BASE;
-        unsigned long flags;
-        quadlet_t *regptr = NULL;
-
-        if (csraddr & 0x3)
-               return RCODE_TYPE_ERROR;
-
-        if (csraddr < CSR_BUS_MANAGER_ID || csraddr > CSR_CHANNELS_AVAILABLE_LO
-            || extcode != EXTCODE_COMPARE_SWAP)
-                goto unsupported_lockreq;
-
-        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(host, nodeid));
-
-               data &= ~0x1;   /* keep broadcast channel allocated */
-       }
-
-        if (host->driver->hw_csr_reg) {
-                quadlet_t old;
-
-                old = host->driver->
-                        hw_csr_reg(host, (csraddr - CSR_BUS_MANAGER_ID) >> 2,
-                                   data, arg);
-
-                *store = cpu_to_be32(old);
-                return RCODE_COMPLETE;
-        }
-
-        spin_lock_irqsave(&host->csr.lock, flags);
-
-        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;
-        }
-        }
-
-        spin_unlock_irqrestore(&host->csr.lock, flags);
-
-        return RCODE_COMPLETE;
-
- unsupported_lockreq:
-        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_BROADCAST_CHANNEL:
-                return RCODE_TYPE_ERROR;
-
-        case CSR_BUSY_TIMEOUT:
-                /* not yet implemented - fall through */
-        default:
-                return RCODE_ADDRESS_ERROR;
-        }
-}
-
-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(host, 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, size_t length, u16 flags)
-{
-        int csraddr = addr - CSR_REGISTER_BASE;
-
-        if (length > 512)
-                return RCODE_TYPE_ERROR;
-
-        switch (csraddr) {
-        case CSR_FCP_COMMAND:
-                highlevel_fcp_request(host, nodeid, 0, (u8 *)data, length);
-                break;
-        case CSR_FCP_RESPONSE:
-                highlevel_fcp_request(host, nodeid, 1, (u8 *)data, length);
-                break;
-        default:
-                return RCODE_TYPE_ERROR;
-        }
-
-        return RCODE_COMPLETE;
-}
-
-static int read_config_rom(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
-                          u64 addr, size_t length, u16 fl)
-{
-       u32 offset = addr - CSR1212_REGISTER_SPACE_BASE;
-
-       if (csr1212_read(host->csr.rom, offset, buffer, length) == CSR1212_SUCCESS)
-               return RCODE_COMPLETE;
-       else
-               return RCODE_ADDRESS_ERROR;
-}
-
-static u64 allocate_addr_range(u64 size, u32 alignment, void *__host)
-{
-       struct hpsb_host *host = (struct hpsb_host*)__host;
-
-       return hpsb_allocate_and_register_addrspace(&csr_highlevel,
-                                                   host,
-                                                   &config_rom_ops,
-                                                   size, alignment,
-                                                   CSR1212_UNITS_SPACE_BASE,
-                                                   CSR1212_UNITS_SPACE_END);
-}
-
-static void release_addr_range(u64 addr, void *__host)
-{
-       struct hpsb_host *host = (struct hpsb_host*)__host;
-       hpsb_unregister_addrspace(&csr_highlevel, host, addr);
-}
-
-
-int init_csr(void)
-{
-       node_cap = csr1212_new_immediate(CSR1212_KV_ID_NODE_CAPABILITIES, 0x0083c0);
-       if (!node_cap) {
-               HPSB_ERR("Failed to allocate memory for Node Capabilties ConfigROM entry!");
-               return -ENOMEM;
-       }
-
-       hpsb_register_highlevel(&csr_highlevel);
-
-       return 0;
-}
-
-void cleanup_csr(void)
-{
-       if (node_cap)
-               csr1212_release_keyval(node_cap);
-        hpsb_unregister_highlevel(&csr_highlevel);
-}
diff --git a/drivers/ieee1394/csr.h b/drivers/ieee1394/csr.h
deleted file mode 100644 (file)
index 90fb3f2..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef _IEEE1394_CSR_H
-#define _IEEE1394_CSR_H
-
-#include <linux/spinlock_types.h>
-
-#include "csr1212.h"
-#include "ieee1394_types.h"
-
-#define CSR_REGISTER_BASE              0xfffff0000000ULL
-
-/* register offsets relative to CSR_REGISTER_BASE */
-#define CSR_STATE_CLEAR                        0x0
-#define CSR_STATE_SET                  0x4
-#define CSR_NODE_IDS                   0x8
-#define CSR_RESET_START                        0xc
-#define CSR_SPLIT_TIMEOUT_HI           0x18
-#define CSR_SPLIT_TIMEOUT_LO           0x1c
-#define CSR_CYCLE_TIME                 0x200
-#define CSR_BUS_TIME                   0x204
-#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
-#define CSR_FCP_RESPONSE               0xD00
-#define CSR_FCP_END                    0xF00
-#define CSR_TOPOLOGY_MAP               0x1000
-#define CSR_TOPOLOGY_MAP_END           0x1400
-#define CSR_SPEED_MAP                  0x2000
-#define CSR_SPEED_MAP_END              0x3000
-
-/* IEEE 1394 bus specific Configuration ROM Key IDs */
-#define IEEE1394_KV_ID_POWER_REQUIREMENTS (0x30)
-
-/* IEEE 1394 Bus Information Block specifics */
-#define CSR_BUS_INFO_SIZE (5 * sizeof(quadlet_t))
-
-#define CSR_IRMC_SHIFT                 31
-#define CSR_CMC_SHIFT                  30
-#define CSR_ISC_SHIFT                  29
-#define CSR_BMC_SHIFT                  28
-#define CSR_PMC_SHIFT                  27
-#define CSR_CYC_CLK_ACC_SHIFT          16
-#define CSR_MAX_REC_SHIFT              12
-#define CSR_MAX_ROM_SHIFT              8
-#define CSR_GENERATION_SHIFT           4
-
-static inline void csr_set_bus_info_generation(struct csr1212_csr *csr, u8 gen)
-{
-       csr->bus_info_data[2] &= ~cpu_to_be32(0xf << CSR_GENERATION_SHIFT);
-       csr->bus_info_data[2] |= cpu_to_be32((u32)gen << CSR_GENERATION_SHIFT);
-}
-
-struct csr_control {
-       spinlock_t lock;
-
-       quadlet_t state;
-       quadlet_t node_ids;
-       quadlet_t split_timeout_hi, split_timeout_lo;
-       unsigned long expire;   /* Calculated from split_timeout */
-       quadlet_t cycle_time;
-       quadlet_t bus_time;
-       quadlet_t bus_manager_id;
-       quadlet_t bandwidth_available;
-       quadlet_t channels_available_hi, channels_available_lo;
-       quadlet_t broadcast_channel;
-
-       /* Bus Info */
-       quadlet_t guid_hi, guid_lo;
-       u8 cyc_clk_acc;
-       u8 max_rec;
-       u8 max_rom;
-       u8 generation;  /* Only use values between 0x2 and 0xf */
-       u8 lnk_spd;
-
-       unsigned long gen_timestamp[16];
-
-       struct csr1212_csr *rom;
-
-       quadlet_t topology_map[256];
-       quadlet_t speed_map[1024];
-};
-
-extern struct csr1212_bus_ops csr_bus_ops;
-
-int init_csr(void);
-void cleanup_csr(void);
-
-/* hpsb_update_config_rom() is deprecated */
-struct hpsb_host;
-int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom,
-                          size_t size, unsigned char rom_version);
-
-#endif /* _IEEE1394_CSR_H */
diff --git a/drivers/ieee1394/csr1212.c b/drivers/ieee1394/csr1212.c
deleted file mode 100644 (file)
index e76cac6..0000000
+++ /dev/null
@@ -1,1467 +0,0 @@
-/*
- * csr1212.c -- IEEE 1212 Control and Status Register support for Linux
- *
- * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
- *                    Steve Kinneberg <kinnebergsteve@acmsystems.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *    1. Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *    2. Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *    3. The name of the author may not be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/* TODO List:
- * - Verify interface consistency: i.e., public functions that take a size
- *   parameter expect size to be in bytes.
- */
-
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/kmemcheck.h>
-#include <linux/string.h>
-#include <asm/bug.h>
-#include <asm/byteorder.h>
-
-#include "csr1212.h"
-
-
-/* Permitted key type for each key id */
-#define __I (1 << CSR1212_KV_TYPE_IMMEDIATE)
-#define __C (1 << CSR1212_KV_TYPE_CSR_OFFSET)
-#define __D (1 << CSR1212_KV_TYPE_DIRECTORY)
-#define __L (1 << CSR1212_KV_TYPE_LEAF)
-static const u8 csr1212_key_id_type_map[0x30] = {
-       __C,                    /* used by Apple iSight */
-       __D | __L,              /* Descriptor */
-       __I | __D | __L,        /* Bus_Dependent_Info */
-       __I | __D | __L,        /* Vendor */
-       __I,                    /* Hardware_Version */
-       0, 0,                   /* Reserved */
-       __D | __L | __I,        /* Module */
-       __I, 0, 0, 0,           /* used by Apple iSight, Reserved */
-       __I,                    /* Node_Capabilities */
-       __L,                    /* EUI_64 */
-       0, 0, 0,                /* Reserved */
-       __D,                    /* Unit */
-       __I,                    /* Specifier_ID */
-       __I,                    /* Version */
-       __I | __C | __D | __L,  /* Dependent_Info */
-       __L,                    /* Unit_Location */
-       0,                      /* Reserved */
-       __I,                    /* Model */
-       __D,                    /* Instance */
-       __L,                    /* Keyword */
-       __D,                    /* Feature */
-       __L,                    /* Extended_ROM */
-       __I,                    /* Extended_Key_Specifier_ID */
-       __I,                    /* Extended_Key */
-       __I | __C | __D | __L,  /* Extended_Data */
-       __L,                    /* Modifiable_Descriptor */
-       __I,                    /* Directory_ID */
-       __I,                    /* Revision */
-};
-#undef __I
-#undef __C
-#undef __D
-#undef __L
-
-
-#define quads_to_bytes(_q) ((_q) * sizeof(u32))
-#define bytes_to_quads(_b) DIV_ROUND_UP(_b, sizeof(u32))
-
-static void free_keyval(struct csr1212_keyval *kv)
-{
-       if ((kv->key.type == CSR1212_KV_TYPE_LEAF) &&
-           (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM))
-               CSR1212_FREE(kv->value.leaf.data);
-
-       CSR1212_FREE(kv);
-}
-
-static u16 csr1212_crc16(const u32 *buffer, size_t length)
-{
-       int shift;
-       u32 data;
-       u16 sum, crc = 0;
-
-       for (; length; length--) {
-               data = be32_to_cpu(*buffer);
-               buffer++;
-               for (shift = 28; shift >= 0; shift -= 4 ) {
-                       sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
-                       crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
-               }
-               crc &= 0xffff;
-       }
-
-       return cpu_to_be16(crc);
-}
-
-/* Microsoft computes the CRC with the bytes in reverse order. */
-static u16 csr1212_msft_crc16(const u32 *buffer, size_t length)
-{
-       int shift;
-       u32 data;
-       u16 sum, crc = 0;
-
-       for (; length; length--) {
-               data = le32_to_cpu(*buffer);
-               buffer++;
-               for (shift = 28; shift >= 0; shift -= 4 ) {
-                       sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
-                       crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
-               }
-               crc &= 0xffff;
-       }
-
-       return cpu_to_be16(crc);
-}
-
-static struct csr1212_dentry *
-csr1212_find_keyval(struct csr1212_keyval *dir, struct csr1212_keyval *kv)
-{
-       struct csr1212_dentry *pos;
-
-       for (pos = dir->value.directory.dentries_head;
-            pos != NULL; pos = pos->next)
-               if (pos->kv == kv)
-                       return pos;
-       return NULL;
-}
-
-static struct csr1212_keyval *
-csr1212_find_keyval_offset(struct csr1212_keyval *kv_list, u32 offset)
-{
-       struct csr1212_keyval *kv;
-
-       for (kv = kv_list->next; kv && (kv != kv_list); kv = kv->next)
-               if (kv->offset == offset)
-                       return kv;
-       return NULL;
-}
-
-
-/* Creation Routines */
-
-struct csr1212_csr *csr1212_create_csr(struct csr1212_bus_ops *ops,
-                                      size_t bus_info_size, void *private)
-{
-       struct csr1212_csr *csr;
-
-       csr = CSR1212_MALLOC(sizeof(*csr));
-       if (!csr)
-               return NULL;
-
-       csr->cache_head =
-               csr1212_rom_cache_malloc(CSR1212_CONFIG_ROM_SPACE_OFFSET,
-                                        CSR1212_CONFIG_ROM_SPACE_SIZE);
-       if (!csr->cache_head) {
-               CSR1212_FREE(csr);
-               return NULL;
-       }
-
-       /* The keyval key id is not used for the root node, but a valid key id
-        * that can be used for a directory needs to be passed to
-        * csr1212_new_directory(). */
-       csr->root_kv = csr1212_new_directory(CSR1212_KV_ID_VENDOR);
-       if (!csr->root_kv) {
-               CSR1212_FREE(csr->cache_head);
-               CSR1212_FREE(csr);
-               return NULL;
-       }
-
-       csr->bus_info_data = csr->cache_head->data;
-       csr->bus_info_len = bus_info_size;
-       csr->crc_len = bus_info_size;
-       csr->ops = ops;
-       csr->private = private;
-       csr->cache_tail = csr->cache_head;
-
-       return csr;
-}
-
-void csr1212_init_local_csr(struct csr1212_csr *csr,
-                           const u32 *bus_info_data, int max_rom)
-{
-       static const int mr_map[] = { 4, 64, 1024, 0 };
-
-       BUG_ON(max_rom & ~0x3);
-       csr->max_rom = mr_map[max_rom];
-       memcpy(csr->bus_info_data, bus_info_data, csr->bus_info_len);
-}
-
-static struct csr1212_keyval *csr1212_new_keyval(u8 type, u8 key)
-{
-       struct csr1212_keyval *kv;
-
-       if (key < 0x30 && ((csr1212_key_id_type_map[key] & (1 << type)) == 0))
-               return NULL;
-
-       kv = CSR1212_MALLOC(sizeof(*kv));
-       if (!kv)
-               return NULL;
-
-       atomic_set(&kv->refcnt, 1);
-       kv->key.type = type;
-       kv->key.id = key;
-       kv->associate = NULL;
-       kv->next = NULL;
-       kv->prev = NULL;
-       kv->offset = 0;
-       kv->valid = 0;
-       return kv;
-}
-
-struct csr1212_keyval *csr1212_new_immediate(u8 key, u32 value)
-{
-       struct csr1212_keyval *kv;
-
-       kv = csr1212_new_keyval(CSR1212_KV_TYPE_IMMEDIATE, key);
-       if (!kv)
-               return NULL;
-
-       kv->value.immediate = value;
-       kv->valid = 1;
-       return kv;
-}
-
-static struct csr1212_keyval *
-csr1212_new_leaf(u8 key, const void *data, size_t data_len)
-{
-       struct csr1212_keyval *kv;
-
-       kv = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF, key);
-       if (!kv)
-               return NULL;
-
-       if (data_len > 0) {
-               kv->value.leaf.data = CSR1212_MALLOC(data_len);
-               if (!kv->value.leaf.data) {
-                       CSR1212_FREE(kv);
-                       return NULL;
-               }
-
-               if (data)
-                       memcpy(kv->value.leaf.data, data, data_len);
-       } else {
-               kv->value.leaf.data = NULL;
-       }
-
-       kv->value.leaf.len = bytes_to_quads(data_len);
-       kv->offset = 0;
-       kv->valid = 1;
-
-       return kv;
-}
-
-static struct csr1212_keyval *
-csr1212_new_csr_offset(u8 key, u32 csr_offset)
-{
-       struct csr1212_keyval *kv;
-
-       kv = csr1212_new_keyval(CSR1212_KV_TYPE_CSR_OFFSET, key);
-       if (!kv)
-               return NULL;
-
-       kv->value.csr_offset = csr_offset;
-
-       kv->offset = 0;
-       kv->valid = 1;
-       return kv;
-}
-
-struct csr1212_keyval *csr1212_new_directory(u8 key)
-{
-       struct csr1212_keyval *kv;
-
-       kv = csr1212_new_keyval(CSR1212_KV_TYPE_DIRECTORY, key);
-       if (!kv)
-               return NULL;
-
-       kv->value.directory.len = 0;
-       kv->offset = 0;
-       kv->value.directory.dentries_head = NULL;
-       kv->value.directory.dentries_tail = NULL;
-       kv->valid = 1;
-       return kv;
-}
-
-void csr1212_associate_keyval(struct csr1212_keyval *kv,
-                             struct csr1212_keyval *associate)
-{
-       BUG_ON(!kv || !associate || kv->key.id == CSR1212_KV_ID_DESCRIPTOR ||
-              (associate->key.id != CSR1212_KV_ID_DESCRIPTOR &&
-               associate->key.id != CSR1212_KV_ID_DEPENDENT_INFO &&
-               associate->key.id != CSR1212_KV_ID_EXTENDED_KEY &&
-               associate->key.id != CSR1212_KV_ID_EXTENDED_DATA &&
-               associate->key.id < 0x30) ||
-              (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID &&
-               associate->key.id != CSR1212_KV_ID_EXTENDED_KEY) ||
-              (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
-               associate->key.id != CSR1212_KV_ID_EXTENDED_DATA) ||
-              (associate->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
-               kv->key.id != CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) ||
-              (associate->key.id == CSR1212_KV_ID_EXTENDED_DATA &&
-               kv->key.id != CSR1212_KV_ID_EXTENDED_KEY));
-
-       if (kv->associate)
-               csr1212_release_keyval(kv->associate);
-
-       csr1212_keep_keyval(associate);
-       kv->associate = associate;
-}
-
-static int __csr1212_attach_keyval_to_directory(struct csr1212_keyval *dir,
-                                               struct csr1212_keyval *kv,
-                                               bool keep_keyval)
-{
-       struct csr1212_dentry *dentry;
-
-       BUG_ON(!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY);
-
-       dentry = CSR1212_MALLOC(sizeof(*dentry));
-       if (!dentry)
-               return -ENOMEM;
-
-       if (keep_keyval)
-               csr1212_keep_keyval(kv);
-       dentry->kv = kv;
-
-       dentry->next = NULL;
-       dentry->prev = dir->value.directory.dentries_tail;
-
-       if (!dir->value.directory.dentries_head)
-               dir->value.directory.dentries_head = dentry;
-
-       if (dir->value.directory.dentries_tail)
-               dir->value.directory.dentries_tail->next = dentry;
-       dir->value.directory.dentries_tail = dentry;
-
-       return CSR1212_SUCCESS;
-}
-
-int csr1212_attach_keyval_to_directory(struct csr1212_keyval *dir,
-                                      struct csr1212_keyval *kv)
-{
-       return __csr1212_attach_keyval_to_directory(dir, kv, true);
-}
-
-#define CSR1212_DESCRIPTOR_LEAF_DATA(kv) \
-       (&((kv)->value.leaf.data[1]))
-
-#define CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, type) \
-       ((kv)->value.leaf.data[0] = \
-        cpu_to_be32(CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID(kv) | \
-                    ((type) << CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT)))
-#define CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, spec_id) \
-       ((kv)->value.leaf.data[0] = \
-        cpu_to_be32((CSR1212_DESCRIPTOR_LEAF_TYPE(kv) << \
-                     CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT) | \
-                    ((spec_id) & CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID_MASK)))
-
-static struct csr1212_keyval *
-csr1212_new_descriptor_leaf(u8 dtype, u32 specifier_id,
-                           const void *data, size_t data_len)
-{
-       struct csr1212_keyval *kv;
-
-       kv = csr1212_new_leaf(CSR1212_KV_ID_DESCRIPTOR, NULL,
-                             data_len + CSR1212_DESCRIPTOR_LEAF_OVERHEAD);
-       if (!kv)
-               return NULL;
-
-       kmemcheck_annotate_variable(kv->value.leaf.data[0]);
-       CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, dtype);
-       CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, specifier_id);
-
-       if (data)
-               memcpy(CSR1212_DESCRIPTOR_LEAF_DATA(kv), data, data_len);
-
-       return kv;
-}
-
-/* Check if string conforms to minimal ASCII as per IEEE 1212 clause 7.4 */
-static int csr1212_check_minimal_ascii(const char *s)
-{
-       static const char minimal_ascii_table[] = {
-                                       /*  1   2   4   8  16  32  64  128 */
-               128,                    /* --, --, --, --, --, --, --, 07, */
-               4 + 16 + 32,            /* --, --, 0a, --, 0C, 0D, --, --, */
-               0,                      /* --, --, --, --, --, --, --, --, */
-               0,                      /* --, --, --, --, --, --, --, --, */
-               255 - 8 - 16,           /* 20, 21, 22, --, --, 25, 26, 27, */
-               255,                    /* 28, 29, 2a, 2b, 2c, 2d, 2e, 2f, */
-               255,                    /* 30, 31, 32, 33, 34, 35, 36, 37, */
-               255,                    /* 38, 39, 3a, 3b, 3c, 3d, 3e, 3f, */
-               255,                    /* 40, 41, 42, 43, 44, 45, 46, 47, */
-               255,                    /* 48, 49, 4a, 4b, 4c, 4d, 4e, 4f, */
-               255,                    /* 50, 51, 52, 53, 54, 55, 56, 57, */
-               1 + 2 + 4 + 128,        /* 58, 59, 5a, --, --, --, --, 5f, */
-               255 - 1,                /* --, 61, 62, 63, 64, 65, 66, 67, */
-               255,                    /* 68, 69, 6a, 6b, 6c, 6d, 6e, 6f, */
-               255,                    /* 70, 71, 72, 73, 74, 75, 76, 77, */
-               1 + 2 + 4,              /* 78, 79, 7a, --, --, --, --, --, */
-       };
-       int i, j;
-
-       for (; *s; s++) {
-               i = *s >> 3;            /*  i = *s / 8;         */
-               j = 1 << (*s & 3);      /*  j = 1 << (*s % 8);  */
-
-               if (i >= ARRAY_SIZE(minimal_ascii_table) ||
-                   !(minimal_ascii_table[i] & j))
-                       return -EINVAL;
-       }
-       return 0;
-}
-
-/* IEEE 1212 clause 7.5.4.1 textual descriptors (English, minimal ASCII) */
-struct csr1212_keyval *csr1212_new_string_descriptor_leaf(const char *s)
-{
-       struct csr1212_keyval *kv;
-       u32 *text;
-       size_t str_len, quads;
-
-       if (!s || !*s || csr1212_check_minimal_ascii(s))
-               return NULL;
-
-       str_len = strlen(s);
-       quads = bytes_to_quads(str_len);
-       kv = csr1212_new_descriptor_leaf(0, 0, NULL, quads_to_bytes(quads) +
-                                     CSR1212_TEXTUAL_DESCRIPTOR_LEAF_OVERHEAD);
-       if (!kv)
-               return NULL;
-
-       kv->value.leaf.data[1] = 0;     /* width, character_set, language */
-       text = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(kv);
-       text[quads - 1] = 0;            /* padding */
-       memcpy(text, s, str_len);
-
-       return kv;
-}
-
-
-/* Destruction Routines */
-
-void csr1212_detach_keyval_from_directory(struct csr1212_keyval *dir,
-                                         struct csr1212_keyval *kv)
-{
-       struct csr1212_dentry *dentry;
-
-       if (!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY)
-               return;
-
-       dentry = csr1212_find_keyval(dir, kv);
-
-       if (!dentry)
-               return;
-
-       if (dentry->prev)
-               dentry->prev->next = dentry->next;
-       if (dentry->next)
-               dentry->next->prev = dentry->prev;
-       if (dir->value.directory.dentries_head == dentry)
-               dir->value.directory.dentries_head = dentry->next;
-       if (dir->value.directory.dentries_tail == dentry)
-               dir->value.directory.dentries_tail = dentry->prev;
-
-       CSR1212_FREE(dentry);
-
-       csr1212_release_keyval(kv);
-}
-
-/* This function is used to free the memory taken by a keyval.  If the given
- * keyval is a directory type, then any keyvals contained in that directory
- * will be destroyed as well if noone holds a reference on them.  By means of
- * list manipulation, this routine will descend a directory structure in a
- * non-recursive manner. */
-void csr1212_release_keyval(struct csr1212_keyval *kv)
-{
-       struct csr1212_keyval *k, *a;
-       struct csr1212_dentry dentry;
-       struct csr1212_dentry *head, *tail;
-
-       if (!atomic_dec_and_test(&kv->refcnt))
-               return;
-
-       dentry.kv = kv;
-       dentry.next = NULL;
-       dentry.prev = NULL;
-
-       head = &dentry;
-       tail = head;
-
-       while (head) {
-               k = head->kv;
-
-               while (k) {
-                       /* must not dec_and_test kv->refcnt again */
-                       if (k != kv && !atomic_dec_and_test(&k->refcnt))
-                               break;
-
-                       a = k->associate;
-
-                       if (k->key.type == CSR1212_KV_TYPE_DIRECTORY) {
-                               /* If the current entry is a directory, move all
-                                * the entries to the destruction list. */
-                               if (k->value.directory.dentries_head) {
-                                       tail->next =
-                                           k->value.directory.dentries_head;
-                                       k->value.directory.dentries_head->prev =
-                                           tail;
-                                       tail = k->value.directory.dentries_tail;
-                               }
-                       }
-                       free_keyval(k);
-                       k = a;
-               }
-
-               head = head->next;
-               if (head) {
-                       if (head->prev && head->prev != &dentry)
-                               CSR1212_FREE(head->prev);
-                       head->prev = NULL;
-               } else if (tail != &dentry) {
-                       CSR1212_FREE(tail);
-               }
-       }
-}
-
-void csr1212_destroy_csr(struct csr1212_csr *csr)
-{
-       struct csr1212_csr_rom_cache *c, *oc;
-       struct csr1212_cache_region *cr, *ocr;
-
-       csr1212_release_keyval(csr->root_kv);
-
-       c = csr->cache_head;
-       while (c) {
-               oc = c;
-               cr = c->filled_head;
-               while (cr) {
-                       ocr = cr;
-                       cr = cr->next;
-                       CSR1212_FREE(ocr);
-               }
-               c = c->next;
-               CSR1212_FREE(oc);
-       }
-
-       CSR1212_FREE(csr);
-}
-
-
-/* CSR Image Creation */
-
-static int csr1212_append_new_cache(struct csr1212_csr *csr, size_t romsize)
-{
-       struct csr1212_csr_rom_cache *cache;
-       u64 csr_addr;
-
-       BUG_ON(!csr || !csr->ops || !csr->ops->allocate_addr_range ||
-              !csr->ops->release_addr || csr->max_rom < 1);
-
-       /* ROM size must be a multiple of csr->max_rom */
-       romsize = (romsize + (csr->max_rom - 1)) & ~(csr->max_rom - 1);
-
-       csr_addr = csr->ops->allocate_addr_range(romsize, csr->max_rom,
-                                                csr->private);
-       if (csr_addr == CSR1212_INVALID_ADDR_SPACE)
-               return -ENOMEM;
-
-       if (csr_addr < CSR1212_REGISTER_SPACE_BASE) {
-               /* Invalid address returned from allocate_addr_range(). */
-               csr->ops->release_addr(csr_addr, csr->private);
-               return -ENOMEM;
-       }
-
-       cache = csr1212_rom_cache_malloc(csr_addr - CSR1212_REGISTER_SPACE_BASE,
-                                        romsize);
-       if (!cache) {
-               csr->ops->release_addr(csr_addr, csr->private);
-               return -ENOMEM;
-       }
-
-       cache->ext_rom = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF,
-                                           CSR1212_KV_ID_EXTENDED_ROM);
-       if (!cache->ext_rom) {
-               csr->ops->release_addr(csr_addr, csr->private);
-               CSR1212_FREE(cache);
-               return -ENOMEM;
-       }
-
-       if (csr1212_attach_keyval_to_directory(csr->root_kv, cache->ext_rom) !=
-           CSR1212_SUCCESS) {
-               csr1212_release_keyval(cache->ext_rom);
-               csr->ops->release_addr(csr_addr, csr->private);
-               CSR1212_FREE(cache);
-               return -ENOMEM;
-       }
-       cache->ext_rom->offset = csr_addr - CSR1212_REGISTER_SPACE_BASE;
-       cache->ext_rom->value.leaf.len = -1;
-       cache->ext_rom->value.leaf.data = cache->data;
-
-       /* Add cache to tail of cache list */
-       cache->prev = csr->cache_tail;
-       csr->cache_tail->next = cache;
-       csr->cache_tail = cache;
-       return CSR1212_SUCCESS;
-}
-
-static void csr1212_remove_cache(struct csr1212_csr *csr,
-                                struct csr1212_csr_rom_cache *cache)
-{
-       if (csr->cache_head == cache)
-               csr->cache_head = cache->next;
-       if (csr->cache_tail == cache)
-               csr->cache_tail = cache->prev;
-
-       if (cache->prev)
-               cache->prev->next = cache->next;
-       if (cache->next)
-               cache->next->prev = cache->prev;
-
-       if (cache->ext_rom) {
-               csr1212_detach_keyval_from_directory(csr->root_kv,
-                                                    cache->ext_rom);
-               csr1212_release_keyval(cache->ext_rom);
-       }
-
-       CSR1212_FREE(cache);
-}
-
-static int csr1212_generate_layout_subdir(struct csr1212_keyval *dir,
-                                         struct csr1212_keyval **layout_tail)
-{
-       struct csr1212_dentry *dentry;
-       struct csr1212_keyval *dkv;
-       struct csr1212_keyval *last_extkey_spec = NULL;
-       struct csr1212_keyval *last_extkey = NULL;
-       int num_entries = 0;
-
-       for (dentry = dir->value.directory.dentries_head; dentry;
-            dentry = dentry->next) {
-               for (dkv = dentry->kv; dkv; dkv = dkv->associate) {
-                       /* Special Case: Extended Key Specifier_ID */
-                       if (dkv->key.id ==
-                           CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
-                               if (last_extkey_spec == NULL)
-                                       last_extkey_spec = dkv;
-                               else if (dkv->value.immediate !=
-                                        last_extkey_spec->value.immediate)
-                                       last_extkey_spec = dkv;
-                               else
-                                       continue;
-                       /* Special Case: Extended Key */
-                       } else if (dkv->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
-                               if (last_extkey == NULL)
-                                       last_extkey = dkv;
-                               else if (dkv->value.immediate !=
-                                        last_extkey->value.immediate)
-                                       last_extkey = dkv;
-                               else
-                                       continue;
-                       }
-
-                       num_entries += 1;
-
-                       switch (dkv->key.type) {
-                       default:
-                       case CSR1212_KV_TYPE_IMMEDIATE:
-                       case CSR1212_KV_TYPE_CSR_OFFSET:
-                               break;
-                       case CSR1212_KV_TYPE_LEAF:
-                       case CSR1212_KV_TYPE_DIRECTORY:
-                               /* Remove from list */
-                               if (dkv->prev && (dkv->prev->next == dkv))
-                                       dkv->prev->next = dkv->next;
-                               if (dkv->next && (dkv->next->prev == dkv))
-                                       dkv->next->prev = dkv->prev;
-                               //if (dkv == *layout_tail)
-                               //      *layout_tail = dkv->prev;
-
-                               /* Special case: Extended ROM leafs */
-                               if (dkv->key.id == CSR1212_KV_ID_EXTENDED_ROM) {
-                                       dkv->value.leaf.len = -1;
-                                       /* Don't add Extended ROM leafs in the
-                                        * layout list, they are handled
-                                        * differently. */
-                                       break;
-                               }
-
-                               /* Add to tail of list */
-                               dkv->next = NULL;
-                               dkv->prev = *layout_tail;
-                               (*layout_tail)->next = dkv;
-                               *layout_tail = dkv;
-                               break;
-                       }
-               }
-       }
-       return num_entries;
-}
-
-static size_t csr1212_generate_layout_order(struct csr1212_keyval *kv)
-{
-       struct csr1212_keyval *ltail = kv;
-       size_t agg_size = 0;
-
-       while (kv) {
-               switch (kv->key.type) {
-               case CSR1212_KV_TYPE_LEAF:
-                       /* Add 1 quadlet for crc/len field */
-                       agg_size += kv->value.leaf.len + 1;
-                       break;
-
-               case CSR1212_KV_TYPE_DIRECTORY:
-                       kv->value.directory.len =
-                               csr1212_generate_layout_subdir(kv, &ltail);
-                       /* Add 1 quadlet for crc/len field */
-                       agg_size += kv->value.directory.len + 1;
-                       break;
-               }
-               kv = kv->next;
-       }
-       return quads_to_bytes(agg_size);
-}
-
-static struct csr1212_keyval *
-csr1212_generate_positions(struct csr1212_csr_rom_cache *cache,
-                          struct csr1212_keyval *start_kv, int start_pos)
-{
-       struct csr1212_keyval *kv = start_kv;
-       struct csr1212_keyval *okv = start_kv;
-       int pos = start_pos;
-       int kv_len = 0, okv_len = 0;
-
-       cache->layout_head = kv;
-
-       while (kv && pos < cache->size) {
-               /* Special case: Extended ROM leafs */
-               if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
-                       kv->offset = cache->offset + pos;
-
-               switch (kv->key.type) {
-               case CSR1212_KV_TYPE_LEAF:
-                       kv_len = kv->value.leaf.len;
-                       break;
-
-               case CSR1212_KV_TYPE_DIRECTORY:
-                       kv_len = kv->value.directory.len;
-                       break;
-
-               default:
-                       /* Should never get here */
-                       WARN_ON(1);
-                       break;
-               }
-
-               pos += quads_to_bytes(kv_len + 1);
-
-               if (pos <= cache->size) {
-                       okv = kv;
-                       okv_len = kv_len;
-                       kv = kv->next;
-               }
-       }
-
-       cache->layout_tail = okv;
-       cache->len = okv->offset - cache->offset + quads_to_bytes(okv_len + 1);
-
-       return kv;
-}
-
-#define CSR1212_KV_KEY_SHIFT           24
-#define CSR1212_KV_KEY_TYPE_SHIFT      6
-#define CSR1212_KV_KEY_ID_MASK         0x3f
-#define CSR1212_KV_KEY_TYPE_MASK       0x3     /* after shift */
-
-static void
-csr1212_generate_tree_subdir(struct csr1212_keyval *dir, u32 *data_buffer)
-{
-       struct csr1212_dentry *dentry;
-       struct csr1212_keyval *last_extkey_spec = NULL;
-       struct csr1212_keyval *last_extkey = NULL;
-       int index = 0;
-
-       for (dentry = dir->value.directory.dentries_head;
-            dentry;
-            dentry = dentry->next) {
-               struct csr1212_keyval *a;
-
-               for (a = dentry->kv; a; a = a->associate) {
-                       u32 value = 0;
-
-                       /* Special Case: Extended Key Specifier_ID */
-                       if (a->key.id ==
-                           CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
-                               if (last_extkey_spec == NULL)
-                                       last_extkey_spec = a;
-                               else if (a->value.immediate !=
-                                        last_extkey_spec->value.immediate)
-                                       last_extkey_spec = a;
-                               else
-                                       continue;
-
-                       /* Special Case: Extended Key */
-                       } else if (a->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
-                               if (last_extkey == NULL)
-                                       last_extkey = a;
-                               else if (a->value.immediate !=
-                                        last_extkey->value.immediate)
-                                       last_extkey = a;
-                               else
-                                       continue;
-                       }
-
-                       switch (a->key.type) {
-                       case CSR1212_KV_TYPE_IMMEDIATE:
-                               value = a->value.immediate;
-                               break;
-                       case CSR1212_KV_TYPE_CSR_OFFSET:
-                               value = a->value.csr_offset;
-                               break;
-                       case CSR1212_KV_TYPE_LEAF:
-                               value = a->offset;
-                               value -= dir->offset + quads_to_bytes(1+index);
-                               value = bytes_to_quads(value);
-                               break;
-                       case CSR1212_KV_TYPE_DIRECTORY:
-                               value = a->offset;
-                               value -= dir->offset + quads_to_bytes(1+index);
-                               value = bytes_to_quads(value);
-                               break;
-                       default:
-                               /* Should never get here */
-                               WARN_ON(1);
-                               break;
-                       }
-
-                       value |= (a->key.id & CSR1212_KV_KEY_ID_MASK) <<
-                                CSR1212_KV_KEY_SHIFT;
-                       value |= (a->key.type & CSR1212_KV_KEY_TYPE_MASK) <<
-                                (CSR1212_KV_KEY_SHIFT +
-                                 CSR1212_KV_KEY_TYPE_SHIFT);
-                       data_buffer[index] = cpu_to_be32(value);
-                       index++;
-               }
-       }
-}
-
-struct csr1212_keyval_img {
-       u16 length;
-       u16 crc;
-
-       /* Must be last */
-       u32 data[0];    /* older gcc can't handle [] which is standard */
-};
-
-static void csr1212_fill_cache(struct csr1212_csr_rom_cache *cache)
-{
-       struct csr1212_keyval *kv, *nkv;
-       struct csr1212_keyval_img *kvi;
-
-       for (kv = cache->layout_head;
-            kv != cache->layout_tail->next;
-            kv = nkv) {
-               kvi = (struct csr1212_keyval_img *)(cache->data +
-                               bytes_to_quads(kv->offset - cache->offset));
-               switch (kv->key.type) {
-               default:
-               case CSR1212_KV_TYPE_IMMEDIATE:
-               case CSR1212_KV_TYPE_CSR_OFFSET:
-                       /* Should never get here */
-                       WARN_ON(1);
-                       break;
-
-               case CSR1212_KV_TYPE_LEAF:
-                       /* Don't copy over Extended ROM areas, they are
-                        * already filled out! */
-                       if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
-                               memcpy(kvi->data, kv->value.leaf.data,
-                                      quads_to_bytes(kv->value.leaf.len));
-
-                       kvi->length = cpu_to_be16(kv->value.leaf.len);
-                       kvi->crc = csr1212_crc16(kvi->data, kv->value.leaf.len);
-                       break;
-
-               case CSR1212_KV_TYPE_DIRECTORY:
-                       csr1212_generate_tree_subdir(kv, kvi->data);
-
-                       kvi->length = cpu_to_be16(kv->value.directory.len);
-                       kvi->crc = csr1212_crc16(kvi->data,
-                                                kv->value.directory.len);
-                       break;
-               }
-
-               nkv = kv->next;
-               if (kv->prev)
-                       kv->prev->next = NULL;
-               if (kv->next)
-                       kv->next->prev = NULL;
-               kv->prev = NULL;
-               kv->next = NULL;
-       }
-}
-
-/* This size is arbitrarily chosen.
- * The struct overhead is subtracted for more economic allocations. */
-#define CSR1212_EXTENDED_ROM_SIZE (2048 - sizeof(struct csr1212_csr_rom_cache))
-
-int csr1212_generate_csr_image(struct csr1212_csr *csr)
-{
-       struct csr1212_bus_info_block_img *bi;
-       struct csr1212_csr_rom_cache *cache;
-       struct csr1212_keyval *kv;
-       size_t agg_size;
-       int ret;
-       int init_offset;
-
-       BUG_ON(!csr);
-
-       cache = csr->cache_head;
-
-       bi = (struct csr1212_bus_info_block_img*)cache->data;
-
-       bi->length = bytes_to_quads(csr->bus_info_len) - 1;
-       bi->crc_length = bi->length;
-       bi->crc = csr1212_crc16(bi->data, bi->crc_length);
-
-       csr->root_kv->next = NULL;
-       csr->root_kv->prev = NULL;
-
-       agg_size = csr1212_generate_layout_order(csr->root_kv);
-
-       init_offset = csr->bus_info_len;
-
-       for (kv = csr->root_kv, cache = csr->cache_head;
-            kv;
-            cache = cache->next) {
-               if (!cache) {
-                       /* Estimate approximate number of additional cache
-                        * regions needed (it assumes that the cache holding
-                        * the first 1K Config ROM space always exists). */
-                       int est_c = agg_size / (CSR1212_EXTENDED_ROM_SIZE -
-                                               (2 * sizeof(u32))) + 1;
-
-                       /* Add additional cache regions, extras will be
-                        * removed later */
-                       for (; est_c; est_c--) {
-                               ret = csr1212_append_new_cache(csr,
-                                               CSR1212_EXTENDED_ROM_SIZE);
-                               if (ret != CSR1212_SUCCESS)
-                                       return ret;
-                       }
-                       /* Need to re-layout for additional cache regions */
-                       agg_size = csr1212_generate_layout_order(csr->root_kv);
-                       kv = csr->root_kv;
-                       cache = csr->cache_head;
-                       init_offset = csr->bus_info_len;
-               }
-               kv = csr1212_generate_positions(cache, kv, init_offset);
-               agg_size -= cache->len;
-               init_offset = sizeof(u32);
-       }
-
-       /* Remove unused, excess cache regions */
-       while (cache) {
-               struct csr1212_csr_rom_cache *oc = cache;
-
-               cache = cache->next;
-               csr1212_remove_cache(csr, oc);
-       }
-
-       /* Go through the list backward so that when done, the correct CRC
-        * will be calculated for the Extended ROM areas. */
-       for (cache = csr->cache_tail; cache; cache = cache->prev) {
-               /* Only Extended ROM caches should have this set. */
-               if (cache->ext_rom) {
-                       int leaf_size;
-
-                       /* Make sure the Extended ROM leaf is a multiple of
-                        * max_rom in size. */
-                       BUG_ON(csr->max_rom < 1);
-                       leaf_size = (cache->len + (csr->max_rom - 1)) &
-                               ~(csr->max_rom - 1);
-
-                       /* Zero out the unused ROM region */
-                       memset(cache->data + bytes_to_quads(cache->len), 0x00,
-                              leaf_size - cache->len);
-
-                       /* Subtract leaf header */
-                       leaf_size -= sizeof(u32);
-
-                       /* Update the Extended ROM leaf length */
-                       cache->ext_rom->value.leaf.len =
-                               bytes_to_quads(leaf_size);
-               } else {
-                       /* Zero out the unused ROM region */
-                       memset(cache->data + bytes_to_quads(cache->len), 0x00,
-                              cache->size - cache->len);
-               }
-
-               /* Copy the data into the cache buffer */
-               csr1212_fill_cache(cache);
-
-               if (cache != csr->cache_head) {
-                       /* Set the length and CRC of the extended ROM. */
-                       struct csr1212_keyval_img *kvi =
-                               (struct csr1212_keyval_img*)cache->data;
-                       u16 len = bytes_to_quads(cache->len) - 1;
-
-                       kvi->length = cpu_to_be16(len);
-                       kvi->crc = csr1212_crc16(kvi->data, len);
-               }
-       }
-
-       return CSR1212_SUCCESS;
-}
-
-int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer, u32 len)
-{
-       struct csr1212_csr_rom_cache *cache;
-
-       for (cache = csr->cache_head; cache; cache = cache->next)
-               if (offset >= cache->offset &&
-                   (offset + len) <= (cache->offset + cache->size)) {
-                       memcpy(buffer, &cache->data[
-                                       bytes_to_quads(offset - cache->offset)],
-                              len);
-                       return CSR1212_SUCCESS;
-               }
-
-       return -ENOENT;
-}
-
-/*
- * Apparently there are many different wrong implementations of the CRC
- * algorithm.  We don't fail, we just warn... approximately once per GUID.
- */
-static void
-csr1212_check_crc(const u32 *buffer, size_t length, u16 crc, __be32 *guid)
-{
-       static u64 last_bad_eui64;
-       u64 eui64 = ((u64)be32_to_cpu(guid[0]) << 32) | be32_to_cpu(guid[1]);
-
-       if (csr1212_crc16(buffer, length) == crc ||
-           csr1212_msft_crc16(buffer, length) == crc ||
-           eui64 == last_bad_eui64)
-               return;
-
-       printk(KERN_DEBUG "ieee1394: config ROM CRC error\n");
-       last_bad_eui64 = eui64;
-}
-
-/* Parse a chunk of data as a Config ROM */
-
-static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
-{
-       struct csr1212_bus_info_block_img *bi;
-       struct csr1212_cache_region *cr;
-       int i;
-       int ret;
-
-       for (i = 0; i < csr->bus_info_len; i += sizeof(u32)) {
-               ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
-                               &csr->cache_head->data[bytes_to_quads(i)],
-                               csr->private);
-               if (ret != CSR1212_SUCCESS)
-                       return ret;
-
-               /* check ROM header's info_length */
-               if (i == 0 &&
-                   be32_to_cpu(csr->cache_head->data[0]) >> 24 !=
-                   bytes_to_quads(csr->bus_info_len) - 1)
-                       return -EINVAL;
-       }
-
-       bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data;
-       csr->crc_len = quads_to_bytes(bi->crc_length);
-
-       /* IEEE 1212 recommends that crc_len be equal to bus_info_len, but that
-        * is not always the case, so read the rest of the crc area 1 quadlet at
-        * a time. */
-       for (i = csr->bus_info_len; i <= csr->crc_len; i += sizeof(u32)) {
-               ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
-                               &csr->cache_head->data[bytes_to_quads(i)],
-                               csr->private);
-               if (ret != CSR1212_SUCCESS)
-                       return ret;
-       }
-
-       csr1212_check_crc(bi->data, bi->crc_length, bi->crc,
-                         &csr->bus_info_data[3]);
-
-       cr = CSR1212_MALLOC(sizeof(*cr));
-       if (!cr)
-               return -ENOMEM;
-
-       cr->next = NULL;
-       cr->prev = NULL;
-       cr->offset_start = 0;
-       cr->offset_end = csr->crc_len + 4;
-
-       csr->cache_head->filled_head = cr;
-       csr->cache_head->filled_tail = cr;
-
-       return CSR1212_SUCCESS;
-}
-
-#define CSR1212_KV_KEY(q)      (be32_to_cpu(q) >> CSR1212_KV_KEY_SHIFT)
-#define CSR1212_KV_KEY_TYPE(q) (CSR1212_KV_KEY(q) >> CSR1212_KV_KEY_TYPE_SHIFT)
-#define CSR1212_KV_KEY_ID(q)   (CSR1212_KV_KEY(q) & CSR1212_KV_KEY_ID_MASK)
-#define CSR1212_KV_VAL_MASK    0xffffff
-#define CSR1212_KV_VAL(q)      (be32_to_cpu(q) & CSR1212_KV_VAL_MASK)
-
-static int
-csr1212_parse_dir_entry(struct csr1212_keyval *dir, u32 ki, u32 kv_pos)
-{
-       int ret = CSR1212_SUCCESS;
-       struct csr1212_keyval *k = NULL;
-       u32 offset;
-       bool keep_keyval = true;
-
-       switch (CSR1212_KV_KEY_TYPE(ki)) {
-       case CSR1212_KV_TYPE_IMMEDIATE:
-               k = csr1212_new_immediate(CSR1212_KV_KEY_ID(ki),
-                                         CSR1212_KV_VAL(ki));
-               if (!k) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               /* Don't keep local reference when parsing. */
-               keep_keyval = false;
-               break;
-
-       case CSR1212_KV_TYPE_CSR_OFFSET:
-               k = csr1212_new_csr_offset(CSR1212_KV_KEY_ID(ki),
-                                          CSR1212_KV_VAL(ki));
-               if (!k) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               /* Don't keep local reference when parsing. */
-               keep_keyval = false;
-               break;
-
-       default:
-               /* Compute the offset from 0xffff f000 0000. */
-               offset = quads_to_bytes(CSR1212_KV_VAL(ki)) + kv_pos;
-               if (offset == kv_pos) {
-                       /* Uh-oh.  Can't have a relative offset of 0 for Leaves
-                        * or Directories.  The Config ROM image is most likely
-                        * messed up, so we'll just abort here. */
-                       ret = -EIO;
-                       goto out;
-               }
-
-               k = csr1212_find_keyval_offset(dir, offset);
-
-               if (k)
-                       break;          /* Found it. */
-
-               if (CSR1212_KV_KEY_TYPE(ki) == CSR1212_KV_TYPE_DIRECTORY)
-                       k = csr1212_new_directory(CSR1212_KV_KEY_ID(ki));
-               else
-                       k = csr1212_new_leaf(CSR1212_KV_KEY_ID(ki), NULL, 0);
-
-               if (!k) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
-               /* Don't keep local reference when parsing. */
-               keep_keyval = false;
-               /* Contents not read yet so it's not valid. */
-               k->valid = 0;
-               k->offset = offset;
-
-               k->prev = dir;
-               k->next = dir->next;
-               dir->next->prev = k;
-               dir->next = k;
-       }
-       ret = __csr1212_attach_keyval_to_directory(dir, k, keep_keyval);
-out:
-       if (ret != CSR1212_SUCCESS && k != NULL)
-               free_keyval(k);
-       return ret;
-}
-
-int csr1212_parse_keyval(struct csr1212_keyval *kv,
-                        struct csr1212_csr_rom_cache *cache)
-{
-       struct csr1212_keyval_img *kvi;
-       int i;
-       int ret = CSR1212_SUCCESS;
-       int kvi_len;
-
-       kvi = (struct csr1212_keyval_img*)
-               &cache->data[bytes_to_quads(kv->offset - cache->offset)];
-       kvi_len = be16_to_cpu(kvi->length);
-
-       /* GUID is wrong in here in case of extended ROM.  We don't care. */
-       csr1212_check_crc(kvi->data, kvi_len, kvi->crc, &cache->data[3]);
-
-       switch (kv->key.type) {
-       case CSR1212_KV_TYPE_DIRECTORY:
-               for (i = 0; i < kvi_len; i++) {
-                       u32 ki = kvi->data[i];
-
-                       /* Some devices put null entries in their unit
-                        * directories.  If we come across such an entry,
-                        * then skip it. */
-                       if (ki == 0x0)
-                               continue;
-                       ret = csr1212_parse_dir_entry(kv, ki,
-                                       kv->offset + quads_to_bytes(i + 1));
-               }
-               kv->value.directory.len = kvi_len;
-               break;
-
-       case CSR1212_KV_TYPE_LEAF:
-               if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM) {
-                       size_t size = quads_to_bytes(kvi_len);
-
-                       kv->value.leaf.data = CSR1212_MALLOC(size);
-                       if (!kv->value.leaf.data) {
-                               ret = -ENOMEM;
-                               goto out;
-                       }
-
-                       kv->value.leaf.len = kvi_len;
-                       memcpy(kv->value.leaf.data, kvi->data, size);
-               }
-               break;
-       }
-
-       kv->valid = 1;
-out:
-       return ret;
-}
-
-static int
-csr1212_read_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv)
-{
-       struct csr1212_cache_region *cr, *ncr, *newcr = NULL;
-       struct csr1212_keyval_img *kvi = NULL;
-       struct csr1212_csr_rom_cache *cache;
-       int cache_index;
-       u64 addr;
-       u32 *cache_ptr;
-       u16 kv_len = 0;
-
-       BUG_ON(!csr || !kv || csr->max_rom < 1);
-
-       /* First find which cache the data should be in (or go in if not read
-        * yet). */
-       for (cache = csr->cache_head; cache; cache = cache->next)
-               if (kv->offset >= cache->offset &&
-                   kv->offset < (cache->offset + cache->size))
-                       break;
-
-       if (!cache) {
-               u32 q, cache_size;
-
-               /* Only create a new cache for Extended ROM leaves. */
-               if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
-                       return -EINVAL;
-
-               if (csr->ops->bus_read(csr,
-                                      CSR1212_REGISTER_SPACE_BASE + kv->offset,
-                                      &q, csr->private))
-                       return -EIO;
-
-               kv->value.leaf.len = be32_to_cpu(q) >> 16;
-
-               cache_size = (quads_to_bytes(kv->value.leaf.len + 1) +
-                             (csr->max_rom - 1)) & ~(csr->max_rom - 1);
-
-               cache = csr1212_rom_cache_malloc(kv->offset, cache_size);
-               if (!cache)
-                       return -ENOMEM;
-
-               kv->value.leaf.data = &cache->data[1];
-               csr->cache_tail->next = cache;
-               cache->prev = csr->cache_tail;
-               cache->next = NULL;
-               csr->cache_tail = cache;
-               cache->filled_head =
-                       CSR1212_MALLOC(sizeof(*cache->filled_head));
-               if (!cache->filled_head)
-                       return -ENOMEM;
-
-               cache->filled_head->offset_start = 0;
-               cache->filled_head->offset_end = sizeof(u32);
-               cache->filled_tail = cache->filled_head;
-               cache->filled_head->next = NULL;
-               cache->filled_head->prev = NULL;
-               cache->data[0] = q;
-
-               /* Don't read the entire extended ROM now.  Pieces of it will
-                * be read when entries inside it are read. */
-               return csr1212_parse_keyval(kv, cache);
-       }
-
-       cache_index = kv->offset - cache->offset;
-
-       /* Now seach read portions of the cache to see if it is there. */
-       for (cr = cache->filled_head; cr; cr = cr->next) {
-               if (cache_index < cr->offset_start) {
-                       newcr = CSR1212_MALLOC(sizeof(*newcr));
-                       if (!newcr)
-                               return -ENOMEM;
-
-                       newcr->offset_start = cache_index & ~(csr->max_rom - 1);
-                       newcr->offset_end = newcr->offset_start;
-                       newcr->next = cr;
-                       newcr->prev = cr->prev;
-                       cr->prev = newcr;
-                       cr = newcr;
-                       break;
-               } else if ((cache_index >= cr->offset_start) &&
-                          (cache_index < cr->offset_end)) {
-                       kvi = (struct csr1212_keyval_img*)
-                               (&cache->data[bytes_to_quads(cache_index)]);
-                       kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
-                       break;
-               } else if (cache_index == cr->offset_end) {
-                       break;
-               }
-       }
-
-       if (!cr) {
-               cr = cache->filled_tail;
-               newcr = CSR1212_MALLOC(sizeof(*newcr));
-               if (!newcr)
-                       return -ENOMEM;
-
-               newcr->offset_start = cache_index & ~(csr->max_rom - 1);
-               newcr->offset_end = newcr->offset_start;
-               newcr->prev = cr;
-               newcr->next = cr->next;
-               cr->next = newcr;
-               cr = newcr;
-               cache->filled_tail = newcr;
-       }
-
-       while(!kvi || cr->offset_end < cache_index + kv_len) {
-               cache_ptr = &cache->data[bytes_to_quads(cr->offset_end &
-                                                       ~(csr->max_rom - 1))];
-
-               addr = (CSR1212_CSR_ARCH_REG_SPACE_BASE + cache->offset +
-                       cr->offset_end) & ~(csr->max_rom - 1);
-
-               if (csr->ops->bus_read(csr, addr, cache_ptr, csr->private))
-                       return -EIO;
-
-               cr->offset_end += csr->max_rom - (cr->offset_end &
-                                                 (csr->max_rom - 1));
-
-               if (!kvi && (cr->offset_end > cache_index)) {
-                       kvi = (struct csr1212_keyval_img*)
-                               (&cache->data[bytes_to_quads(cache_index)]);
-                       kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
-               }
-
-               if ((kv_len + (kv->offset - cache->offset)) > cache->size) {
-                       /* The Leaf or Directory claims its length extends
-                        * beyond the ConfigROM image region and thus beyond the
-                        * end of our cache region.  Therefore, we abort now
-                        * rather than seg faulting later. */
-                       return -EIO;
-               }
-
-               ncr = cr->next;
-
-               if (ncr && (cr->offset_end >= ncr->offset_start)) {
-                       /* consolidate region entries */
-                       ncr->offset_start = cr->offset_start;
-
-                       if (cr->prev)
-                               cr->prev->next = cr->next;
-                       ncr->prev = cr->prev;
-                       if (cache->filled_head == cr)
-                               cache->filled_head = ncr;
-                       CSR1212_FREE(cr);
-                       cr = ncr;
-               }
-       }
-
-       return csr1212_parse_keyval(kv, cache);
-}
-
-struct csr1212_keyval *
-csr1212_get_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv)
-{
-       if (!kv)
-               return NULL;
-       if (!kv->valid)
-               if (csr1212_read_keyval(csr, kv) != CSR1212_SUCCESS)
-                       return NULL;
-       return kv;
-}
-
-int csr1212_parse_csr(struct csr1212_csr *csr)
-{
-       struct csr1212_dentry *dentry;
-       int ret;
-
-       BUG_ON(!csr || !csr->ops || !csr->ops->bus_read);
-
-       ret = csr1212_parse_bus_info_block(csr);
-       if (ret != CSR1212_SUCCESS)
-               return ret;
-
-       /*
-        * There has been a buggy firmware with bus_info_block.max_rom > 0
-        * spotted which actually only supported quadlet read requests to the
-        * config ROM.  Therefore read everything quadlet by quadlet regardless
-        * of what the bus info block says.
-        */
-       csr->max_rom = 4;
-
-       csr->cache_head->layout_head = csr->root_kv;
-       csr->cache_head->layout_tail = csr->root_kv;
-
-       csr->root_kv->offset = (CSR1212_CONFIG_ROM_SPACE_BASE & 0xffff) +
-               csr->bus_info_len;
-
-       csr->root_kv->valid = 0;
-       csr->root_kv->next = csr->root_kv;
-       csr->root_kv->prev = csr->root_kv;
-       ret = csr1212_read_keyval(csr, csr->root_kv);
-       if (ret != CSR1212_SUCCESS)
-               return ret;
-
-       /* Scan through the Root directory finding all extended ROM regions
-        * and make cache regions for them */
-       for (dentry = csr->root_kv->value.directory.dentries_head;
-            dentry; dentry = dentry->next) {
-               if (dentry->kv->key.id == CSR1212_KV_ID_EXTENDED_ROM &&
-                       !dentry->kv->valid) {
-                       ret = csr1212_read_keyval(csr, dentry->kv);
-                       if (ret != CSR1212_SUCCESS)
-                               return ret;
-               }
-       }
-
-       return CSR1212_SUCCESS;
-}
diff --git a/drivers/ieee1394/csr1212.h b/drivers/ieee1394/csr1212.h
deleted file mode 100644 (file)
index a892d92..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * csr1212.h -- IEEE 1212 Control and Status Register support for Linux
- *
- * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
- *                    Steve Kinneberg <kinnebergsteve@acmsystems.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *    1. Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *    2. Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *    3. The name of the author may not be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CSR1212_H__
-#define __CSR1212_H__
-
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <asm/atomic.h>
-
-#define CSR1212_MALLOC(size)   kmalloc((size), GFP_KERNEL)
-#define CSR1212_FREE(ptr)      kfree(ptr)
-
-#define CSR1212_SUCCESS (0)
-
-
-/* CSR 1212 key types */
-#define CSR1212_KV_TYPE_IMMEDIATE              0
-#define CSR1212_KV_TYPE_CSR_OFFSET             1
-#define CSR1212_KV_TYPE_LEAF                   2
-#define CSR1212_KV_TYPE_DIRECTORY              3
-
-
-/* CSR 1212 key ids */
-#define CSR1212_KV_ID_DESCRIPTOR               0x01
-#define CSR1212_KV_ID_BUS_DEPENDENT_INFO       0x02
-#define CSR1212_KV_ID_VENDOR                   0x03
-#define CSR1212_KV_ID_HARDWARE_VERSION         0x04
-#define CSR1212_KV_ID_MODULE                   0x07
-#define CSR1212_KV_ID_NODE_CAPABILITIES                0x0C
-#define CSR1212_KV_ID_EUI_64                   0x0D
-#define CSR1212_KV_ID_UNIT                     0x11
-#define CSR1212_KV_ID_SPECIFIER_ID             0x12
-#define CSR1212_KV_ID_VERSION                  0x13
-#define CSR1212_KV_ID_DEPENDENT_INFO           0x14
-#define CSR1212_KV_ID_UNIT_LOCATION            0x15
-#define CSR1212_KV_ID_MODEL                    0x17
-#define CSR1212_KV_ID_INSTANCE                 0x18
-#define CSR1212_KV_ID_KEYWORD                  0x19
-#define CSR1212_KV_ID_FEATURE                  0x1A
-#define CSR1212_KV_ID_EXTENDED_ROM             0x1B
-#define CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID        0x1C
-#define CSR1212_KV_ID_EXTENDED_KEY             0x1D
-#define CSR1212_KV_ID_EXTENDED_DATA            0x1E
-#define CSR1212_KV_ID_MODIFIABLE_DESCRIPTOR    0x1F
-#define CSR1212_KV_ID_DIRECTORY_ID             0x20
-#define CSR1212_KV_ID_REVISION                 0x21
-
-
-/* IEEE 1212 Address space map */
-#define CSR1212_ALL_SPACE_BASE                 (0x000000000000ULL)
-#define CSR1212_ALL_SPACE_SIZE                 (1ULL << 48)
-#define CSR1212_ALL_SPACE_END                  (CSR1212_ALL_SPACE_BASE + CSR1212_ALL_SPACE_SIZE)
-
-#define  CSR1212_MEMORY_SPACE_BASE             (0x000000000000ULL)
-#define  CSR1212_MEMORY_SPACE_SIZE             ((256ULL * (1ULL << 40)) - (512ULL * (1ULL << 20)))
-#define  CSR1212_MEMORY_SPACE_END              (CSR1212_MEMORY_SPACE_BASE + CSR1212_MEMORY_SPACE_SIZE)
-
-#define  CSR1212_PRIVATE_SPACE_BASE            (0xffffe0000000ULL)
-#define  CSR1212_PRIVATE_SPACE_SIZE            (256ULL * (1ULL << 20))
-#define  CSR1212_PRIVATE_SPACE_END             (CSR1212_PRIVATE_SPACE_BASE + CSR1212_PRIVATE_SPACE_SIZE)
-
-#define  CSR1212_REGISTER_SPACE_BASE           (0xfffff0000000ULL)
-#define  CSR1212_REGISTER_SPACE_SIZE           (256ULL * (1ULL << 20))
-#define  CSR1212_REGISTER_SPACE_END            (CSR1212_REGISTER_SPACE_BASE + CSR1212_REGISTER_SPACE_SIZE)
-
-#define  CSR1212_CSR_ARCH_REG_SPACE_BASE       (0xfffff0000000ULL)
-#define  CSR1212_CSR_ARCH_REG_SPACE_SIZE       (512)
-#define  CSR1212_CSR_ARCH_REG_SPACE_END                (CSR1212_CSR_ARCH_REG_SPACE_BASE + CSR1212_CSR_ARCH_REG_SPACE_SIZE)
-#define  CSR1212_CSR_ARCH_REG_SPACE_OFFSET     (CSR1212_CSR_ARCH_REG_SPACE_BASE - CSR1212_REGISTER_SPACE_BASE)
-
-#define  CSR1212_CSR_BUS_DEP_REG_SPACE_BASE    (0xfffff0000200ULL)
-#define  CSR1212_CSR_BUS_DEP_REG_SPACE_SIZE    (512)
-#define  CSR1212_CSR_BUS_DEP_REG_SPACE_END     (CSR1212_CSR_BUS_DEP_REG_SPACE_BASE + CSR1212_CSR_BUS_DEP_REG_SPACE_SIZE)
-#define  CSR1212_CSR_BUS_DEP_REG_SPACE_OFFSET  (CSR1212_CSR_BUS_DEP_REG_SPACE_BASE - CSR1212_REGISTER_SPACE_BASE)
-
-#define  CSR1212_CONFIG_ROM_SPACE_BASE         (0xfffff0000400ULL)
-#define  CSR1212_CONFIG_ROM_SPACE_SIZE         (1024)
-#define  CSR1212_CONFIG_ROM_SPACE_END          (CSR1212_CONFIG_ROM_SPACE_BASE + CSR1212_CONFIG_ROM_SPACE_SIZE)
-#define  CSR1212_CONFIG_ROM_SPACE_OFFSET       (CSR1212_CONFIG_ROM_SPACE_BASE - CSR1212_REGISTER_SPACE_BASE)
-
-#define  CSR1212_UNITS_SPACE_BASE              (0xfffff0000800ULL)
-#define  CSR1212_UNITS_SPACE_SIZE              ((256ULL * (1ULL << 20)) - 2048)
-#define  CSR1212_UNITS_SPACE_END               (CSR1212_UNITS_SPACE_BASE + CSR1212_UNITS_SPACE_SIZE)
-#define  CSR1212_UNITS_SPACE_OFFSET            (CSR1212_UNITS_SPACE_BASE - CSR1212_REGISTER_SPACE_BASE)
-
-#define  CSR1212_INVALID_ADDR_SPACE            -1
-
-
-/* Config ROM image structures */
-struct csr1212_bus_info_block_img {
-       u8 length;
-       u8 crc_length;
-       u16 crc;
-
-       /* Must be last */
-       u32 data[0];    /* older gcc can't handle [] which is standard */
-};
-
-struct csr1212_leaf {
-       int len;
-       u32 *data;
-};
-
-struct csr1212_dentry {
-       struct csr1212_dentry *next, *prev;
-       struct csr1212_keyval *kv;
-};
-
-struct csr1212_directory {
-       int len;
-       struct csr1212_dentry *dentries_head, *dentries_tail;
-};
-
-struct csr1212_keyval {
-       struct {
-               u8 type;
-               u8 id;
-       } key;
-       union {
-               u32 immediate;
-               u32 csr_offset;
-               struct csr1212_leaf leaf;
-               struct csr1212_directory directory;
-       } value;
-       struct csr1212_keyval *associate;
-       atomic_t refcnt;
-
-       /* used in generating and/or parsing CSR image */
-       struct csr1212_keyval *next, *prev;     /* flat list of CSR elements */
-       u32 offset;     /* position in CSR from 0xffff f000 0000 */
-       u8 valid;       /* flag indicating keyval has valid data*/
-};
-
-
-struct csr1212_cache_region {
-       struct csr1212_cache_region *next, *prev;
-       u32 offset_start;       /* inclusive */
-       u32 offset_end;         /* exclusive */
-};
-
-struct csr1212_csr_rom_cache {
-       struct csr1212_csr_rom_cache *next, *prev;
-       struct csr1212_cache_region *filled_head, *filled_tail;
-       struct csr1212_keyval *layout_head, *layout_tail;
-       size_t size;
-       u32 offset;
-       struct csr1212_keyval *ext_rom;
-       size_t len;
-
-       /* Must be last */
-       u32 data[0];    /* older gcc can't handle [] which is standard */
-};
-
-struct csr1212_csr {
-       size_t bus_info_len;    /* bus info block length in bytes */
-       size_t crc_len;         /* crc length in bytes */
-       __be32 *bus_info_data;  /* bus info data incl bus name and EUI */
-
-       void *private;          /* private, bus specific data */
-       struct csr1212_bus_ops *ops;
-
-       struct csr1212_keyval *root_kv;
-
-       int max_rom;            /* max bytes readable in Config ROM region */
-
-       /* Items below used for image parsing and generation */
-       struct csr1212_csr_rom_cache *cache_head, *cache_tail;
-};
-
-struct csr1212_bus_ops {
-       /* This function is used by csr1212 to read additional information
-        * from remote nodes when parsing a Config ROM (i.e., read Config ROM
-        * entries located in the Units Space.  Must return 0 on success
-        * anything else indicates an error. */
-       int (*bus_read) (struct csr1212_csr *csr, u64 addr,
-                        void *buffer, void *private);
-
-       /* This function is used by csr1212 to allocate a region in units space
-        * in the event that Config ROM entries don't all fit in the predefined
-        * 1K region.  The void *private parameter is private member of struct
-        * csr1212_csr. */
-       u64 (*allocate_addr_range) (u64 size, u32 alignment, void *private);
-
-       /* This function is used by csr1212 to release a region in units space
-        * that is no longer needed. */
-       void (*release_addr) (u64 addr, void *private);
-};
-
-
-/* Descriptor Leaf manipulation macros */
-#define CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT 24
-#define CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID_MASK 0xffffff
-#define CSR1212_DESCRIPTOR_LEAF_OVERHEAD (1 * sizeof(u32))
-
-#define CSR1212_DESCRIPTOR_LEAF_TYPE(kv) \
-       (be32_to_cpu((kv)->value.leaf.data[0]) >> \
-        CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT)
-#define CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID(kv) \
-       (be32_to_cpu((kv)->value.leaf.data[0]) & \
-        CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID_MASK)
-
-
-/* Text Descriptor Leaf manipulation macros */
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT 28
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_MASK 0xf /* after shift */
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT 16
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK 0xfff  /* after shift */
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK 0xffff
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_OVERHEAD (1 * sizeof(u32))
-
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH(kv) \
-       (be32_to_cpu((kv)->value.leaf.data[1]) >> \
-        CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT)
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET(kv) \
-       ((be32_to_cpu((kv)->value.leaf.data[1]) >> \
-         CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT) & \
-        CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK)
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE(kv) \
-       (be32_to_cpu((kv)->value.leaf.data[1]) & \
-        CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK)
-#define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(kv) \
-       (&((kv)->value.leaf.data[2]))
-
-
-/* The following 2 function are for creating new Configuration ROM trees.  The
- * first function is used for both creating local trees and parsing remote
- * trees.  The second function adds pertinent information to local Configuration
- * ROM trees - namely data for the bus information block. */
-extern struct csr1212_csr *csr1212_create_csr(struct csr1212_bus_ops *ops,
-                                             size_t bus_info_size,
-                                             void *private);
-extern void csr1212_init_local_csr(struct csr1212_csr *csr,
-                                  const u32 *bus_info_data, int max_rom);
-
-
-/* Destroy a Configuration ROM tree and release all memory taken by the tree. */
-extern void csr1212_destroy_csr(struct csr1212_csr *csr);
-
-
-/* The following set of functions are fore creating new keyvals for placement in
- * a Configuration ROM tree.  Code that creates new keyvals with these functions
- * must release those keyvals with csr1212_release_keyval() when they are no
- * longer needed. */
-extern struct csr1212_keyval *csr1212_new_immediate(u8 key, u32 value);
-extern struct csr1212_keyval *csr1212_new_directory(u8 key);
-extern struct csr1212_keyval *csr1212_new_string_descriptor_leaf(const char *s);
-
-
-/* The following function manages association between keyvals.  Typically,
- * Descriptor Leaves and Directories will be associated with another keyval and
- * it is desirable for the Descriptor keyval to be place immediately after the
- * keyval that it is associated with.
- * Take care with subsequent ROM modifications:  There is no function to remove
- * previously specified associations.
- */
-extern void csr1212_associate_keyval(struct csr1212_keyval *kv,
-                                    struct csr1212_keyval *associate);
-
-
-/* The following functions manage the association of a keyval and directories.
- * A keyval may be attached to more than one directory. */
-extern int csr1212_attach_keyval_to_directory(struct csr1212_keyval *dir,
-                                             struct csr1212_keyval *kv);
-extern void csr1212_detach_keyval_from_directory(struct csr1212_keyval *dir,
-                                                struct csr1212_keyval *kv);
-
-
-/* Creates a complete Configuration ROM image in the list of caches available
- * via csr->cache_head. */
-extern int csr1212_generate_csr_image(struct csr1212_csr *csr);
-
-
-/* This is a convience function for reading a block of data out of one of the
- * caches in the csr->cache_head list. */
-extern int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer,
-                       u32 len);
-
-
-/* The following functions are in place for parsing Configuration ROM images.
- * csr1212_parse_keyval() is used should there be a need to directly parse a
- * Configuration ROM directly. */
-extern int csr1212_parse_keyval(struct csr1212_keyval *kv,
-                               struct csr1212_csr_rom_cache *cache);
-extern int csr1212_parse_csr(struct csr1212_csr *csr);
-
-
-/* This function allocates a new cache which may be used for either parsing or
- * generating sub-sets of Configuration ROM images. */
-static inline struct csr1212_csr_rom_cache *
-csr1212_rom_cache_malloc(u32 offset, size_t size)
-{
-       struct csr1212_csr_rom_cache *cache;
-
-       cache = CSR1212_MALLOC(sizeof(*cache) + size);
-       if (!cache)
-               return NULL;
-
-       cache->next = NULL;
-       cache->prev = NULL;
-       cache->filled_head = NULL;
-       cache->filled_tail = NULL;
-       cache->layout_head = NULL;
-       cache->layout_tail = NULL;
-       cache->offset = offset;
-       cache->size = size;
-       cache->ext_rom = NULL;
-
-       return cache;
-}
-
-
-/* This function ensures that a keyval contains data when referencing a keyval
- * created by parsing a Configuration ROM. */
-extern struct csr1212_keyval *
-csr1212_get_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv);
-
-
-/* This function increments the reference count for a keyval should there be a
- * need for code to retain a keyval that has been parsed. */
-static inline void csr1212_keep_keyval(struct csr1212_keyval *kv)
-{
-       atomic_inc(&kv->refcnt);
-       smp_mb__after_atomic_inc();
-}
-
-
-/* This function decrements a keyval's reference count and will destroy the
- * keyval when there are no more users of the keyval.  This should be called by
- * any code that calls csr1212_keep_keyval() or any of the keyval creation
- * routines csr1212_new_*(). */
-extern void csr1212_release_keyval(struct csr1212_keyval *kv);
-
-
-/*
- * This macro allows for looping over the keyval entries in a directory and it
- * ensures that keyvals from remote ConfigROMs are parsed properly.
- *
- * struct csr1212_csr *_csr points to the CSR associated with dir.
- * struct csr1212_keyval *_kv points to the current keyval (loop index).
- * struct csr1212_keyval *_dir points to the directory to be looped.
- * struct csr1212_dentry *_pos is used internally for indexing.
- *
- * kv will be NULL upon exit of the loop.
- */
-#define csr1212_for_each_dir_entry(_csr, _kv, _dir, _pos)              \
-       for (csr1212_get_keyval((_csr), (_dir)),                        \
-            _pos = (_dir)->value.directory.dentries_head,              \
-            _kv = (_pos) ? csr1212_get_keyval((_csr), _pos->kv) : NULL;\
-            (_kv) && (_pos);                                           \
-            (_kv->associate == NULL) ?                                 \
-                    ((_pos = _pos->next), (_kv = (_pos) ?              \
-                               csr1212_get_keyval((_csr), _pos->kv) :  \
-                               NULL)) :                                \
-                    (_kv = csr1212_get_keyval((_csr), _kv->associate)))
-
-#endif /* __CSR1212_H__ */
diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c
deleted file mode 100644 (file)
index d178699..0000000
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * 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/mm.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/vmalloc.h>
-#include <linux/scatterlist.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 */
-       n_bytes = PAGE_ALIGN(n_bytes);
-
-       prog->n_pages = n_bytes >> PAGE_SHIFT;
-
-       prog->kvirt = pci_alloc_consistent(dev, n_bytes, &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_SHIFT,
-                                   prog->kvirt, prog->bus_addr);
-       }
-
-       prog->kvirt = NULL;
-       prog->dev = NULL;
-       prog->n_pages = 0;
-       prog->bus_addr = 0;
-}
-
-/* dma_region */
-
-/**
- * dma_region_init - clear out all fields but do not allocate anything
- */
-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;
-}
-
-/**
- * dma_region_alloc - 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)
-{
-       unsigned int i;
-
-       /* round up to page size */
-       n_bytes = PAGE_ALIGN(n_bytes);
-
-       dma->n_pages = n_bytes >> PAGE_SHIFT;
-
-       dma->kvirt = vmalloc_32(n_bytes);
-       if (!dma->kvirt) {
-               printk(KERN_ERR "dma_region_alloc: vmalloc_32() failed\n");
-               goto err;
-       }
-
-       /* Clear the ram out, no junk to the user */
-       memset(dma->kvirt, 0, n_bytes);
-
-       /* allocate scatter/gather list */
-       dma->sglist = vmalloc(dma->n_pages * sizeof(*dma->sglist));
-       if (!dma->sglist) {
-               printk(KERN_ERR "dma_region_alloc: vmalloc(sglist) failed\n");
-               goto err;
-       }
-
-       sg_init_table(dma->sglist, dma->n_pages);
-
-       /* fill scatter/gather list with pages */
-       for (i = 0; i < dma->n_pages; i++) {
-               unsigned long va =
-                   (unsigned long)dma->kvirt + (i << PAGE_SHIFT);
-
-               sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va),
-                               PAGE_SIZE, 0);
-       }
-
-       /* map sglist to the IOMMU */
-       dma->n_dma_pages =
-           pci_map_sg(dev, dma->sglist, 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;
-}
-
-/**
- * dma_region_free - unmap and free the buffer
- */
-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;
-       }
-
-       vfree(dma->sglist);
-       dma->sglist = NULL;
-
-       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 int start, unsigned long *rem)
-{
-       int i;
-       unsigned long off = offset;
-
-       for (i = start; i < dma->n_dma_pages; i++) {
-               if (off < sg_dma_len(&dma->sglist[i])) {
-                       *rem = off;
-                       break;
-               }
-
-               off -= sg_dma_len(&dma->sglist[i]);
-       }
-
-       BUG_ON(i >= dma->n_dma_pages);
-
-       return i;
-}
-
-/**
- * dma_region_offset_to_bus - get bus address of an offset within a DMA region
- *
- * Returns the DMA bus address of the byte with the given @offset relative to
- * the beginning of the @dma.
- */
-dma_addr_t dma_region_offset_to_bus(struct dma_region * dma,
-                                   unsigned long offset)
-{
-       unsigned long rem = 0;
-
-       struct scatterlist *sg =
-           &dma->sglist[dma_region_find(dma, offset, 0, &rem)];
-       return sg_dma_address(sg) + rem;
-}
-
-/**
- * dma_region_sync_for_cpu - sync the CPU's view of the buffer
- */
-void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset,
-                            unsigned long len)
-{
-       int first, last;
-       unsigned long rem = 0;
-
-       if (!len)
-               len = 1;
-
-       first = dma_region_find(dma, offset, 0, &rem);
-       last = dma_region_find(dma, rem + len - 1, first, &rem);
-
-       pci_dma_sync_sg_for_cpu(dma->dev, &dma->sglist[first], last - first + 1,
-                               dma->direction);
-}
-
-/**
- * dma_region_sync_for_device - sync the IO bus' view of the buffer
- */
-void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset,
-                               unsigned long len)
-{
-       int first, last;
-       unsigned long rem = 0;
-
-       if (!len)
-               len = 1;
-
-       first = dma_region_find(dma, offset, 0, &rem);
-       last = dma_region_find(dma, rem + len - 1, first, &rem);
-
-       pci_dma_sync_sg_for_device(dma->dev, &dma->sglist[first],
-                                  last - first + 1, dma->direction);
-}
-
-#ifdef CONFIG_MMU
-
-static int dma_region_pagefault(struct vm_area_struct *vma,
-                               struct vm_fault *vmf)
-{
-       struct dma_region *dma = (struct dma_region *)vma->vm_private_data;
-
-       if (!dma->kvirt)
-               return VM_FAULT_SIGBUS;
-
-       if (vmf->pgoff >= dma->n_pages)
-               return VM_FAULT_SIGBUS;
-
-       vmf->page = vmalloc_to_page(dma->kvirt + (vmf->pgoff << PAGE_SHIFT));
-       get_page(vmf->page);
-       return 0;
-}
-
-static const struct vm_operations_struct dma_region_vm_ops = {
-       .fault = dma_region_pagefault,
-};
-
-/**
- * dma_region_mmap - map the buffer into a user space process
- */
-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 (XXX: comment is wrong, we could allow pgoff) */
-       if (vma->vm_pgoff != 0)
-               return -EINVAL;
-
-       /* check the length */
-       size = vma->vm_end - vma->vm_start;
-       if (size > (dma->n_pages << PAGE_SHIFT))
-               return -EINVAL;
-
-       vma->vm_ops = &dma_region_vm_ops;
-       vma->vm_private_data = dma;
-       vma->vm_file = file;
-       vma->vm_flags |= VM_RESERVED | VM_ALWAYSDUMP;
-
-       return 0;
-}
-
-#else                          /* CONFIG_MMU */
-
-int dma_region_mmap(struct dma_region *dma, struct file *file,
-                   struct vm_area_struct *vma)
-{
-       return -EINVAL;
-}
-
-#endif                         /* CONFIG_MMU */
diff --git a/drivers/ieee1394/dma.h b/drivers/ieee1394/dma.h
deleted file mode 100644 (file)
index 467373c..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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 <asm/types.h>
-
-struct file;
-struct pci_dev;
-struct scatterlist;
-struct vm_area_struct;
-
-/**
- * struct dma_prog_region - small contiguous DMA buffer
- * @kvirt:    kernel virtual address
- * @dev:      PCI device
- * @n_pages:  number of kernel pages
- * @bus_addr: base bus address
- *
- * a small, physically contiguous DMA buffer with random-access, synchronous
- * usage characteristics
- */
-struct dma_prog_region {
-       unsigned char *kvirt;
-       struct pci_dev *dev;
-       unsigned int n_pages;
-       dma_addr_t bus_addr;
-};
-
-/* 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 - large non-contiguous DMA buffer
- * @virt:        kernel virtual address
- * @dev:         PCI device
- * @n_pages:     number of kernel pages
- * @n_dma_pages: number of IOMMU pages
- * @sglist:      IOMMU mapping
- * @direction:   PCI_DMA_TODEVICE, etc.
- *
- * a large, non-physically-contiguous DMA buffer with streaming, asynchronous
- * usage characteristics
- */
-struct dma_region {
-       unsigned char *kvirt;
-       struct pci_dev *dev;
-       unsigned int n_pages;
-       unsigned int n_dma_pages;
-       struct scatterlist *sglist;
-       int direction;
-};
-
-void dma_region_init(struct dma_region *dma);
-int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes,
-                    struct pci_dev *dev, int direction);
-void dma_region_free(struct dma_region *dma);
-void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset,
-                            unsigned long len);
-void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset,
-                               unsigned long len);
-int  dma_region_mmap(struct dma_region *dma, struct file *file,
-                    struct vm_area_struct *vma);
-dma_addr_t dma_region_offset_to_bus(struct dma_region *dma,
-                                   unsigned long offset);
-
-/**
- * dma_region_i - macro to index into a DMA region (or dma_prog_region)
- */
-#define dma_region_i(_dma, _type, _index) \
-       ( ((_type*) ((_dma)->kvirt)) + (_index) )
-
-#endif /* IEEE1394_DMA_H */
diff --git a/drivers/ieee1394/dv1394-private.h b/drivers/ieee1394/dv1394-private.h
deleted file mode 100644 (file)
index 18b92cb..0000000
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- * dv1394-private.h - DV input/output over IEEE 1394 on OHCI chips
- *   Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
- *     receive by Dan Dennedy <dan@dennedy.org>
- *
- * based on:
- *   video1394.h - driver for OHCI 1394 boards
- *   Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
- *                          Peter Schlaile <udbz@rz.uni-karlsruhe.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef _DV_1394_PRIVATE_H
-#define _DV_1394_PRIVATE_H
-
-#include "ieee1394.h"
-#include "ohci1394.h"
-#include "dma.h"
-
-/* data structures private to the dv1394 driver */
-/* none of this is exposed to user-space */
-
-
-/*
-   the 8-byte CIP (Common Isochronous Packet) header that precedes
-   each packet of DV data.
-
-   See the IEC 61883 standard.
-*/
-
-struct CIP_header { unsigned char b[8]; };
-
-static inline void fill_cip_header(struct CIP_header *cip,
-                                  unsigned char source_node_id,
-                                  unsigned long counter,
-                                  enum pal_or_ntsc format,
-                                  unsigned long timestamp)
-{
-       cip->b[0] = source_node_id;
-       cip->b[1] = 0x78; /* packet size in quadlets (480/4) - even for empty packets! */
-       cip->b[2] = 0x00;
-       cip->b[3] = counter;
-
-       cip->b[4] = 0x80; /* const */
-
-       switch(format) {
-       case DV1394_PAL:
-               cip->b[5] = 0x80;
-               break;
-       case DV1394_NTSC:
-               cip->b[5] = 0x00;
-               break;
-       }
-
-       cip->b[6] = timestamp >> 8;
-       cip->b[7] = timestamp & 0xFF;
-}
-
-
-
-/*
-   DMA commands used to program the OHCI's DMA engine
-
-   See the Texas Instruments OHCI 1394 chipset documentation.
-*/
-
-struct output_more_immediate { __le32 q[8]; };
-struct output_more { __le32 q[4]; };
-struct output_last { __le32 q[4]; };
-struct input_more { __le32 q[4]; };
-struct input_last { __le32 q[4]; };
-
-/* outputs */
-
-static inline void fill_output_more_immediate(struct output_more_immediate *omi,
-                                             unsigned char tag,
-                                             unsigned char channel,
-                                             unsigned char sync_tag,
-                                             unsigned int  payload_size)
-{
-       omi->q[0] = cpu_to_le32(0x02000000 | 8); /* OUTPUT_MORE_IMMEDIATE; 8 is the size of the IT header */
-       omi->q[1] = cpu_to_le32(0);
-       omi->q[2] = cpu_to_le32(0);
-       omi->q[3] = cpu_to_le32(0);
-
-       /* IT packet header */
-       omi->q[4] = cpu_to_le32(  (0x0 << 16)  /* IEEE1394_SPEED_100 */
-                                 | (tag << 14)
-                                 | (channel << 8)
-                                 | (TCODE_ISO_DATA << 4)
-                                 | (sync_tag) );
-
-       /* reserved field; mimic behavior of my Sony DSR-40 */
-       omi->q[5] = cpu_to_le32((payload_size << 16) | (0x7F << 8) | 0xA0);
-
-       omi->q[6] = cpu_to_le32(0);
-       omi->q[7] = cpu_to_le32(0);
-}
-
-static inline void fill_output_more(struct output_more *om,
-                                   unsigned int data_size,
-                                   unsigned long data_phys_addr)
-{
-       om->q[0] = cpu_to_le32(data_size);
-       om->q[1] = cpu_to_le32(data_phys_addr);
-       om->q[2] = cpu_to_le32(0);
-       om->q[3] = cpu_to_le32(0);
-}
-
-static inline void fill_output_last(struct output_last *ol,
-                                   int want_timestamp,
-                                   int want_interrupt,
-                                   unsigned int data_size,
-                                   unsigned long data_phys_addr)
-{
-       u32 temp = 0;
-       temp |= 1 << 28; /* OUTPUT_LAST */
-
-       if (want_timestamp) /* controller will update timestamp at DMA time */
-               temp |= 1 << 27;
-
-       if (want_interrupt)
-               temp |= 3 << 20;
-
-       temp |= 3 << 18; /* must take branch */
-       temp |= data_size;
-
-       ol->q[0] = cpu_to_le32(temp);
-       ol->q[1] = cpu_to_le32(data_phys_addr);
-       ol->q[2] = cpu_to_le32(0);
-       ol->q[3] = cpu_to_le32(0);
-}
-
-/* inputs */
-
-static inline void fill_input_more(struct input_more *im,
-                                  int want_interrupt,
-                                  unsigned int data_size,
-                                  unsigned long data_phys_addr)
-{
-       u32 temp =  2 << 28; /* INPUT_MORE */
-       temp |= 8 << 24; /* s = 1, update xferStatus and resCount */
-       if (want_interrupt)
-               temp |= 0 << 20; /* interrupts, i=0 in packet-per-buffer mode */
-       temp |= 0x0 << 16; /* disable branch to address for packet-per-buffer mode */
-                              /* disable wait on sync field, not used in DV :-( */
-               temp |= data_size;
-
-       im->q[0] = cpu_to_le32(temp);
-       im->q[1] = cpu_to_le32(data_phys_addr);
-       im->q[2] = cpu_to_le32(0); /* branchAddress and Z not use in packet-per-buffer mode */
-       im->q[3] = cpu_to_le32(0); /* xferStatus & resCount, resCount must be initialize to data_size */
-}
-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 */
-       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;
-
-       il->q[0] = cpu_to_le32(temp);
-       il->q[1] = cpu_to_le32(data_phys_addr);
-       il->q[2] = cpu_to_le32(1); /* branchAddress (filled in later) and Z = 1 descriptor in next block */
-       il->q[3] = cpu_to_le32(data_size); /* xferStatus & resCount, resCount must be initialize to data_size */
-}
-
-
-
-/*
-   A "DMA descriptor block" consists of several contiguous DMA commands.
-   struct DMA_descriptor_block encapsulates all of the commands necessary
-   to send one packet of DV data.
-
-   There are three different types of these blocks:
-
-        1) command to send an empty packet (CIP header only, no DV data):
-
-           OUTPUT_MORE-Immediate <-- contains the iso header in-line
-           OUTPUT_LAST           <-- points to the CIP header
-
-       2) command to send a full packet when the DV data payload does NOT
-          cross a page boundary:
-
-           OUTPUT_MORE-Immediate <-- contains the iso header in-line
-           OUTPUT_MORE           <-- points to the CIP header
-           OUTPUT_LAST           <-- points to entire DV data payload
-
-       3) command to send a full packet when the DV payload DOES cross
-          a page boundary:
-
-           OUTPUT_MORE-Immediate <-- contains the iso header in-line
-           OUTPUT_MORE           <-- points to the CIP header
-           OUTPUT_MORE           <-- points to first part of DV data payload
-           OUTPUT_LAST           <-- points to second part of DV data payload
-
-   This struct describes all three block types using unions.
-
-   !!! It is vital that an even number of these descriptor blocks fit on one
-   page of memory, since a block cannot cross a page boundary !!!
-
- */
-
-struct DMA_descriptor_block {
-
-       union {
-               struct {
-                       /*  iso header, common to all output block types */
-                       struct output_more_immediate omi;
-
-                       union {
-                               /* empty packet */
-                               struct {
-                                       struct output_last ol;  /* CIP header */
-                               } empty;
-
-                               /* full packet */
-                               struct {
-                                       struct output_more om;  /* CIP header */
-
-                                       union {
-                                              /* payload does not cross page boundary */
-                                               struct {
-                                                       struct output_last ol;  /* data payload */
-                                               } nocross;
-
-                                              /* payload crosses page boundary */
-                                               struct {
-                                                       struct output_more om;  /* data payload */
-                                                       struct output_last ol;  /* data payload */
-                                               } cross;
-                                       } u;
-
-                               } full;
-                       } u;
-               } out;
-
-               struct {
-                       struct input_last il;
-               } in;
-
-       } u;
-
-       /* ensure that PAGE_SIZE % sizeof(struct DMA_descriptor_block) == 0
-          by padding out to 128 bytes */
-       u32 __pad__[12];
-};
-
-
-/* struct frame contains all data associated with one frame in the
-   ringbuffer these are allocated when the DMA context is initialized
-   do_dv1394_init().  They are re-used after the card finishes
-   transmitting the frame. */
-
-struct video_card; /* forward declaration */
-
-struct frame {
-
-       /* points to the struct video_card that owns this frame */
-       struct video_card *video;
-
-       /* index of this frame in video_card->frames[] */
-       unsigned int frame_num;
-
-       /* FRAME_CLEAR - DMA program not set up, waiting for data
-          FRAME_READY - DMA program written, ready to transmit
-
-          Changes to these should be locked against the interrupt
-       */
-       enum {
-               FRAME_CLEAR = 0,
-               FRAME_READY
-       } state;
-
-       /* whether this frame has been DMA'ed already; used only from
-          the IRQ handler to determine whether the frame can be reset */
-       int done;
-
-
-       /* kernel virtual pointer to the start of this frame's data in
-          the user ringbuffer. Use only for CPU access; to get the DMA
-          bus address you must go through the video->user_dma mapping */
-       unsigned long data;
-
-       /* Max # of packets per frame */
-#define MAX_PACKETS 500
-
-
-       /* a PAGE_SIZE memory pool for allocating CIP headers
-          !header_pool must be aligned to PAGE_SIZE! */
-       struct CIP_header *header_pool;
-       dma_addr_t         header_pool_dma;
-
-
-       /* a physically contiguous memory pool for allocating DMA
-          descriptor blocks; usually around 64KB in size
-          !descriptor_pool must be aligned to PAGE_SIZE! */
-       struct DMA_descriptor_block *descriptor_pool;
-       dma_addr_t                   descriptor_pool_dma;
-       unsigned long                descriptor_pool_size;
-
-
-       /* # of packets allocated for this frame */
-       unsigned int n_packets;
-
-
-       /* below are several pointers (kernel virtual addresses, not
-          DMA bus addresses) to parts of the DMA program.  These are
-          set each time the DMA program is written in
-          frame_prepare(). They are used later on, e.g. from the
-          interrupt handler, to check the status of the frame */
-
-       /* points to status/timestamp field of first DMA packet */
-       /* (we'll check it later to monitor timestamp accuracy) */
-       __le32 *frame_begin_timestamp;
-
-       /* the timestamp we assigned to the first packet in the frame */
-       u32 assigned_timestamp;
-
-       /* pointer to the first packet's CIP header (where the timestamp goes) */
-       struct CIP_header *cip_syt1;
-
-       /* pointer to the second packet's CIP header
-          (only set if the first packet was empty) */
-       struct CIP_header *cip_syt2;
-
-       /* in order to figure out what caused an interrupt,
-          store pointers to the status fields of the two packets
-          that can cause interrupts. We'll check these from the
-          interrupt handler.
-       */
-       __le32 *mid_frame_timestamp;
-       __le32 *frame_end_timestamp;
-
-       /* branch address field of final packet. This is effectively
-          the "tail" in the chain of DMA descriptor blocks.
-          We will fill it with the address of the first DMA descriptor
-          block in the subsequent frame, once it is ready.
-       */
-       __le32 *frame_end_branch;
-
-       /* the number of descriptors in the first descriptor block
-          of the frame. Needed to start DMA */
-       int first_n_descriptors;
-};
-
-
-struct packet {
-       __le16  timestamp;
-       u16     invalid;
-       u16     iso_header;
-       __le16  data_length;
-       u32     cip_h1;
-       u32     cip_h2;
-       unsigned char data[480];
-       unsigned char padding[16]; /* force struct size =512 for page alignment */
-};
-
-
-/* allocate/free a frame */
-static struct frame* frame_new(unsigned int frame_num, struct video_card *video);
-static void frame_delete(struct frame *f);
-
-/* reset f so that it can be used again */
-static void frame_reset(struct frame *f);
-
-/* struct video_card contains all data associated with one instance
-   of the dv1394 driver
-*/
-enum modes {
-       MODE_RECEIVE,
-       MODE_TRANSMIT
-};
-
-struct video_card {
-
-       /* ohci card to which this instance corresponds */
-       struct ti_ohci *ohci;
-
-       /* OHCI card id; the link between the VFS inode and a specific video_card
-          (essentially the device minor number) */
-       int id;
-
-       /* entry in dv1394_cards */
-       struct list_head list;
-
-       /* OHCI card IT DMA context number, -1 if not in use */
-       int ohci_it_ctx;
-       struct ohci1394_iso_tasklet it_tasklet;
-
-       /* register offsets for current IT DMA context, 0 if not in use */
-       u32 ohci_IsoXmitContextControlSet;
-       u32 ohci_IsoXmitContextControlClear;
-       u32 ohci_IsoXmitCommandPtr;
-
-       /* OHCI card IR DMA context number, -1 if not in use */
-       struct ohci1394_iso_tasklet ir_tasklet;
-       int ohci_ir_ctx;
-
-       /* register offsets for current IR DMA context, 0 if not in use */
-       u32 ohci_IsoRcvContextControlSet;
-       u32 ohci_IsoRcvContextControlClear;
-       u32 ohci_IsoRcvCommandPtr;
-       u32 ohci_IsoRcvContextMatch;
-
-
-       /* CONCURRENCY CONTROL */
-
-       /* there are THREE levels of locking associated with video_card. */
-
-       /*
-          1) the 'open' flag - this prevents more than one process from
-          opening the device. (the driver currently assumes only one opener).
-          This is a regular int, but use test_and_set_bit() (on bit zero) 
-          for atomicity.
-        */
-       unsigned long open;
-
-       /*
-          2) the spinlock - this provides mutual exclusion between the interrupt
-          handler and process-context operations. Generally you must take the
-          spinlock under the following conditions:
-            1) DMA (and hence the interrupt handler) may be running
-            AND
-            2) you need to operate on the video_card, especially active_frame
-
-            It is OK to play with video_card without taking the spinlock if
-            you are certain that DMA is not running. Even if DMA is running,
-            it is OK to *read* active_frame with the lock, then drop it
-            immediately. This is safe because the interrupt handler will never
-            advance active_frame onto a frame that is not READY (and the spinlock
-            must be held while marking a frame READY).
-
-            spinlock is also used to protect ohci_it_ctx and ohci_ir_ctx,
-            which can be accessed from both process and interrupt context
-        */
-       spinlock_t spinlock;
-
-       /* flag to prevent spurious interrupts (which OHCI seems to
-          generate a lot :) from accessing the struct */
-       int dma_running;
-
-       /*
-         3) the sleeping mutex 'mtx' - this is used from process context only,
-         to serialize various operations on the video_card. Even though only one
-         open() is allowed, we still need to prevent multiple threads of execution
-         from entering calls like read, write, ioctl, etc.
-
-         I honestly can't think of a good reason to use dv1394 from several threads
-         at once, but we need to serialize anyway to prevent oopses =).
-
-         NOTE: if you need both spinlock and mtx, take mtx first to avoid deadlock!
-        */
-       struct mutex mtx;
-
-       /* people waiting for buffer space, please form a line here... */
-       wait_queue_head_t waitq;
-
-       /* support asynchronous I/O signals (SIGIO) */
-       struct fasync_struct *fasync;
-
-       /* the large, non-contiguous (rvmalloc()) ringbuffer for DV
-           data, exposed to user-space via mmap() */
-       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;
-
-       struct frame *frames[DV1394_MAX_FRAMES];
-
-       /* n_frames also serves as an indicator that this struct video_card is
-          initialized and ready to run DMA buffers */
-
-       int n_frames;
-
-       /* this is the frame that is currently "owned" by the OHCI DMA controller
-          (set to -1 iff DMA is not running)
-
-          ! must lock against the interrupt handler when accessing it !
-
-          RULES:
-
-              Only the interrupt handler may change active_frame if DMA
-                 is running; if not, process may change it
-
-              If the next frame is READY, the interrupt handler will advance
-              active_frame when the current frame is finished.
-
-              If the next frame is CLEAR, the interrupt handler will re-transmit
-              the current frame, and the dropped_frames counter will be  incremented.
-
-              The interrupt handler will NEVER advance active_frame to a
-              frame that is not READY.
-       */
-       int active_frame;
-       int first_run;
-
-       /* the same locking rules apply to these three fields also: */
-
-       /* altered ONLY from process context. Must check first_clear_frame->state;
-          if it's READY, that means the ringbuffer is full with READY frames;
-          if it's CLEAR, that means one or more ringbuffer frames are CLEAR */
-       unsigned int first_clear_frame;
-
-       /* altered both by process and interrupt */
-       unsigned int n_clear_frames;
-
-       /* only altered by the interrupt */
-       unsigned int dropped_frames;
-
-
-
-       /* the CIP accumulator and continuity counter are properties
-          of the DMA stream as a whole (not a single frame), so they
-          are stored here in the video_card */
-
-       unsigned long cip_accum;
-       unsigned long cip_n, cip_d;
-       unsigned int syt_offset;
-       unsigned int continuity_counter;
-
-       enum pal_or_ntsc pal_or_ntsc;
-
-       /* redundant, but simplifies the code somewhat */
-       unsigned int frame_size; /* in bytes */
-
-       /* the isochronous channel to use, -1 if video card is inactive */
-       int channel;
-
-
-       /* physically contiguous packet ringbuffer for receive */
-       struct dma_region packet_buf;
-       unsigned long  packet_buf_size;
-
-       unsigned int current_packet;
-       int first_frame;        /* received first start frame marker? */
-       enum modes mode;
-};
-
-/*
-   if the video_card is not initialized, then the ONLY fields that are valid are:
-   ohci
-   open
-   n_frames
-*/
-
-static inline int video_card_initialized(struct video_card *v)
-{
-       return v->n_frames > 0;
-}
-
-static int do_dv1394_init(struct video_card *video, struct dv1394_init *init);
-static int do_dv1394_init_default(struct video_card *video);
-static void do_dv1394_shutdown(struct video_card *video, int free_user_buf);
-
-
-/* NTSC empty packet rate accurate to within 0.01%,
-   calibrated against a Sony DSR-40 DVCAM deck */
-
-#define CIP_N_NTSC   68000000
-#define CIP_D_NTSC 1068000000
-
-#define CIP_N_PAL  1
-#define CIP_D_PAL 16
-
-#endif /* _DV_1394_PRIVATE_H */
-
diff --git a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c
deleted file mode 100644 (file)
index c5a031b..0000000
+++ /dev/null
@@ -1,2584 +0,0 @@
-/*
- * dv1394.c - DV input/output over IEEE 1394 on OHCI chips
- *   Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
- *     receive by Dan Dennedy <dan@dennedy.org>
- *
- * based on:
- *  video1394.c - video driver for OHCI 1394 boards
- *  Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/*
-  OVERVIEW
-
-  I designed dv1394 as a "pipe" that you can use to shoot DV onto a
-  FireWire bus. In transmission mode, dv1394 does the following:
-
-   1. accepts contiguous frames of DV data from user-space, via write()
-      or mmap() (see dv1394.h for the complete API)
-   2. wraps IEC 61883 packets around the DV data, inserting
-      empty synchronization packets as necessary
-   3. assigns accurate SYT timestamps to the outgoing packets
-   4. shoots them out using the OHCI card's IT DMA engine
-
-   Thanks to Dan Dennedy, we now have a receive mode that does the following:
-
-   1. accepts raw IEC 61883 packets from the OHCI card
-   2. re-assembles the DV data payloads into contiguous frames,
-      discarding empty packets
-   3. sends the DV data to user-space via read() or mmap()
-*/
-
-/*
-  TODO:
-
-  - tunable frame-drop behavior: either loop last frame, or halt transmission
-
-  - use a scatter/gather buffer for DMA programs (f->descriptor_pool)
-    so that we don't rely on allocating 64KB of contiguous kernel memory
-    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
-    recovery if dropped packet)
-  - handle bus resets gracefully (OHCI card seems to take care of this itself(!))
-  - do not allow resizing the user_buf once allocated; eliminate nuke_buffer_mappings
-  - eliminated #ifdef DV1394_DEBUG_LEVEL by inventing macros debug_printk and irq_printk
-  - added wmb() and mb() to places where PCI read/write ordering needs to be enforced
-  - set video->id correctly
-  - store video_cards in an array indexed by OHCI card ID, rather than a list
-  - implement DMA context allocation to cooperate with other users of the OHCI
-  - fix all XXX showstoppers
-  - disable IR/IT DMA interrupts on shutdown
-  - flush pci writes to the card by issuing a read
-  - character device dispatching
-  - switch over to the new kernel DMA API (pci_map_*()) (* needs testing on platforms with IOMMU!)
-  - keep all video_cards in a list (for open() via chardev), set file->private_data = video
-  - dv1394_poll should indicate POLLIN when receiving buffers are available
-  - add proc fs interface to set cip_n, cip_d, syt_offset, and video signal
-  - expose xmit and recv as separate devices (not exclusive)
-  - expose NTSC and PAL as separate devices (can be overridden)
-
-*/
-
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/wait.h>
-#include <linux/errno.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/mutex.h>
-#include <linux/bitops.h>
-#include <asm/byteorder.h>
-#include <asm/atomic.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <linux/delay.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/vmalloc.h>
-#include <linux/string.h>
-#include <linux/compat.h>
-#include <linux/cdev.h>
-
-#include "dv1394.h"
-#include "dv1394-private.h"
-#include "highlevel.h"
-#include "hosts.h"
-#include "ieee1394.h"
-#include "ieee1394_core.h"
-#include "ieee1394_hotplug.h"
-#include "ieee1394_types.h"
-#include "nodemgr.h"
-#include "ohci1394.h"
-
-/* DEBUG LEVELS:
-   0 - no debugging messages
-   1 - some debugging messages, but none during DMA frame transmission
-   2 - lots of messages, including during DMA frame transmission
-       (will cause underflows if your machine is too slow!)
-*/
-
-#define DV1394_DEBUG_LEVEL 0
-
-/* for debugging use ONLY: allow more than one open() of the device */
-/* #define DV1394_ALLOW_MORE_THAN_ONE_OPEN 1 */
-
-#if DV1394_DEBUG_LEVEL >= 2
-#define irq_printk( args... ) printk( args )
-#else
-#define irq_printk( args... ) do {} while (0)
-#endif
-
-#if DV1394_DEBUG_LEVEL >= 1
-#define debug_printk( args... ) printk( args)
-#else
-#define debug_printk( args... ) do {} while (0)
-#endif
-
-/* issue a dummy PCI read to force the preceding write
-   to be posted to the PCI bus immediately */
-
-static inline void flush_pci_write(struct ti_ohci *ohci)
-{
-       mb();
-       reg_read(ohci, OHCI1394_IsochronousCycleTimer);
-}
-
-static void it_tasklet_func(unsigned long data);
-static void ir_tasklet_func(unsigned long data);
-
-#ifdef CONFIG_COMPAT
-static long dv1394_compat_ioctl(struct file *file, unsigned int cmd,
-                              unsigned long arg);
-#endif
-
-/* GLOBAL DATA */
-
-/* list of all video_cards */
-static LIST_HEAD(dv1394_cards);
-static DEFINE_SPINLOCK(dv1394_cards_lock);
-
-/* translate from a struct file* to the corresponding struct video_card* */
-
-static inline struct video_card* file_to_video_card(struct file *file)
-{
-       return file->private_data;
-}
-
-/*** FRAME METHODS *********************************************************/
-
-static void frame_reset(struct frame *f)
-{
-       f->state = FRAME_CLEAR;
-       f->done = 0;
-       f->n_packets = 0;
-       f->frame_begin_timestamp = NULL;
-       f->assigned_timestamp = 0;
-       f->cip_syt1 = NULL;
-       f->cip_syt2 = NULL;
-       f->mid_frame_timestamp = NULL;
-       f->frame_end_timestamp = NULL;
-       f->frame_end_branch = NULL;
-}
-
-static struct frame* frame_new(unsigned int frame_num, struct video_card *video)
-{
-       struct frame *f = kmalloc(sizeof(*f), GFP_KERNEL);
-       if (!f)
-               return NULL;
-
-       f->video = video;
-       f->frame_num = frame_num;
-
-       f->header_pool = pci_alloc_consistent(f->video->ohci->dev, PAGE_SIZE, &f->header_pool_dma);
-       if (!f->header_pool) {
-               printk(KERN_ERR "dv1394: failed to allocate CIP header pool\n");
-               kfree(f);
-               return NULL;
-       }
-
-       debug_printk("dv1394: frame_new: allocated CIP header pool at virt 0x%08lx (contig) dma 0x%08lx size %ld\n",
-                    (unsigned long) f->header_pool, (unsigned long) f->header_pool_dma, PAGE_SIZE);
-
-       f->descriptor_pool_size = MAX_PACKETS * sizeof(struct DMA_descriptor_block);
-       /* make it an even # of pages */
-       f->descriptor_pool_size += PAGE_SIZE - (f->descriptor_pool_size%PAGE_SIZE);
-
-       f->descriptor_pool = pci_alloc_consistent(f->video->ohci->dev,
-                                                 f->descriptor_pool_size,
-                                                 &f->descriptor_pool_dma);
-       if (!f->descriptor_pool) {
-               pci_free_consistent(f->video->ohci->dev, PAGE_SIZE, f->header_pool, f->header_pool_dma);
-               kfree(f);
-               return NULL;
-       }
-
-       debug_printk("dv1394: frame_new: allocated DMA program memory at virt 0x%08lx (contig) dma 0x%08lx size %ld\n",
-                    (unsigned long) f->descriptor_pool, (unsigned long) f->descriptor_pool_dma, f->descriptor_pool_size);
-
-       f->data = 0;
-       frame_reset(f);
-
-       return f;
-}
-
-static void frame_delete(struct frame *f)
-{
-       pci_free_consistent(f->video->ohci->dev, PAGE_SIZE, f->header_pool, f->header_pool_dma);
-       pci_free_consistent(f->video->ohci->dev, f->descriptor_pool_size, f->descriptor_pool, f->descriptor_pool_dma);
-       kfree(f);
-}
-
-
-
-
-/*
-   frame_prepare() - build the DMA program for transmitting
-
-   Frame_prepare() must be called OUTSIDE the video->spinlock.
-   However, frame_prepare() must still be serialized, so
-   it should be called WITH the video->mtx taken.
- */
-
-static void frame_prepare(struct video_card *video, unsigned int this_frame)
-{
-       struct frame *f = video->frames[this_frame];
-       int last_frame;
-
-       struct DMA_descriptor_block *block;
-       dma_addr_t block_dma;
-       struct CIP_header *cip;
-       dma_addr_t cip_dma;
-
-       unsigned int n_descriptors, full_packets, packets_per_frame, payload_size;
-
-       /* these flags denote packets that need special attention */
-       int empty_packet, first_packet, last_packet, mid_packet;
-
-       __le32 *branch_address, *last_branch_address = NULL;
-       unsigned long data_p;
-       int first_packet_empty = 0;
-       u32 cycleTimer, ct_sec, ct_cyc, ct_off;
-       unsigned long irq_flags;
-
-       irq_printk("frame_prepare( %d ) ---------------------\n", this_frame);
-
-       full_packets = 0;
-
-
-
-       if (video->pal_or_ntsc == DV1394_PAL)
-               packets_per_frame = DV1394_PAL_PACKETS_PER_FRAME;
-       else
-               packets_per_frame = DV1394_NTSC_PACKETS_PER_FRAME;
-
-       while ( full_packets < packets_per_frame ) {
-               empty_packet = first_packet = last_packet = mid_packet = 0;
-
-               data_p = f->data + full_packets * 480;
-
-               /************************************************/
-               /* allocate a descriptor block and a CIP header */
-               /************************************************/
-
-               /* note: these should NOT cross a page boundary (DMA restriction) */
-
-               if (f->n_packets >= MAX_PACKETS) {
-                       printk(KERN_ERR "dv1394: FATAL ERROR: max packet count exceeded\n");
-                       return;
-               }
-
-               /* the block surely won't cross a page boundary,
-                  since an even number of descriptor_blocks fit on a page */
-               block = &(f->descriptor_pool[f->n_packets]);
-
-               /* DMA address of the block = offset of block relative
-                   to the kernel base address of the descriptor pool
-                   + DMA base address of the descriptor pool */
-               block_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
-
-
-               /* the whole CIP pool fits on one page, so no worries about boundaries */
-               if ( ((unsigned long) &(f->header_pool[f->n_packets]) - (unsigned long) f->header_pool)
-                   > PAGE_SIZE) {
-                       printk(KERN_ERR "dv1394: FATAL ERROR: no room to allocate CIP header\n");
-                       return;
-               }
-
-               cip = &(f->header_pool[f->n_packets]);
-
-               /* DMA address of the CIP header = offset of cip
-                  relative to kernel base address of the header pool
-                  + DMA base address of the header pool */
-               cip_dma = (unsigned long) cip % PAGE_SIZE + f->header_pool_dma;
-
-               /* is this an empty packet? */
-
-               if (video->cip_accum > (video->cip_d - video->cip_n)) {
-                       empty_packet = 1;
-                       payload_size = 8;
-                       video->cip_accum -= (video->cip_d - video->cip_n);
-               } else {
-                       payload_size = 488;
-                       video->cip_accum += video->cip_n;
-               }
-
-               /* there are three important packets each frame:
-
-                  the first packet in the frame - we ask the card to record the timestamp when
-                                                  this packet is actually sent, so we can monitor
-                                                  how accurate our timestamps are. Also, the first
-                                                  packet serves as a semaphore to let us know that
-                                                  it's OK to free the *previous* frame's DMA buffer
-
-                  the last packet in the frame -  this packet is used to detect buffer underflows.
-                                                  if this is the last ready frame, the last DMA block
-                                                  will have a branch back to the beginning of the frame
-                                                  (so that the card will re-send the frame on underflow).
-                                                  if this branch gets taken, we know that at least one
-                                                  frame has been dropped. When the next frame is ready,
-                                                  the branch is pointed to its first packet, and the
-                                                  semaphore is disabled.
-
-                  a "mid" packet slightly before the end of the frame - this packet should trigger
-                                  an interrupt so we can go and assign a timestamp to the first packet
-                                  in the next frame. We don't use the very last packet in the frame
-                                  for this purpose, because that would leave very little time to set
-                                  the timestamp before DMA starts on the next frame.
-               */
-
-               if (f->n_packets == 0) {
-                       first_packet = 1;
-               } else if ( full_packets == (packets_per_frame-1) ) {
-                       last_packet = 1;
-               } else if (f->n_packets == packets_per_frame) {
-                       mid_packet = 1;
-               }
-
-
-               /********************/
-               /* setup CIP header */
-               /********************/
-
-               /* the timestamp will be written later from the
-                  mid-frame interrupt handler. For now we just
-                  store the address of the CIP header(s) that
-                  need a timestamp. */
-
-               /* first packet in the frame needs a timestamp */
-               if (first_packet) {
-                       f->cip_syt1 = cip;
-                       if (empty_packet)
-                               first_packet_empty = 1;
-
-               } else if (first_packet_empty && (f->n_packets == 1) ) {
-                       /* if the first packet was empty, the second
-                          packet's CIP header also needs a timestamp */
-                       f->cip_syt2 = cip;
-               }
-
-               fill_cip_header(cip,
-                               /* the node ID number of the OHCI card */
-                               reg_read(video->ohci, OHCI1394_NodeID) & 0x3F,
-                               video->continuity_counter,
-                               video->pal_or_ntsc,
-                               0xFFFF /* the timestamp is filled in later */);
-
-               /* advance counter, only for full packets */
-               if ( ! empty_packet )
-                       video->continuity_counter++;
-
-               /******************************/
-               /* setup DMA descriptor block */
-               /******************************/
-
-               /* first descriptor - OUTPUT_MORE_IMMEDIATE, for the controller's IT header */
-               fill_output_more_immediate( &(block->u.out.omi), 1, video->channel, 0, payload_size);
-
-               if (empty_packet) {
-                       /* second descriptor - OUTPUT_LAST for CIP header */
-                       fill_output_last( &(block->u.out.u.empty.ol),
-
-                                         /* want completion status on all interesting packets */
-                                         (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                         /* want interrupts on all interesting packets */
-                                         (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                         sizeof(struct CIP_header), /* data size */
-                                         cip_dma);
-
-                       if (first_packet)
-                               f->frame_begin_timestamp = &(block->u.out.u.empty.ol.q[3]);
-                       else if (mid_packet)
-                               f->mid_frame_timestamp = &(block->u.out.u.empty.ol.q[3]);
-                       else if (last_packet) {
-                               f->frame_end_timestamp = &(block->u.out.u.empty.ol.q[3]);
-                               f->frame_end_branch = &(block->u.out.u.empty.ol.q[2]);
-                       }
-
-                       branch_address = &(block->u.out.u.empty.ol.q[2]);
-                       n_descriptors = 3;
-                       if (first_packet)
-                               f->first_n_descriptors = n_descriptors;
-
-               } else { /* full packet */
-
-                       /* second descriptor - OUTPUT_MORE for CIP header */
-                       fill_output_more( &(block->u.out.u.full.om),
-                                         sizeof(struct CIP_header), /* data size */
-                                         cip_dma);
-
-
-                       /* third (and possibly fourth) descriptor - for DV data */
-                       /* the 480-byte payload can cross a page boundary; if so,
-                          we need to split it into two DMA descriptors */
-
-                       /* does the 480-byte data payload cross a page boundary? */
-                       if ( (PAGE_SIZE- ((unsigned long)data_p % PAGE_SIZE) ) < 480 ) {
-
-                               /* page boundary crossed */
-
-                               fill_output_more( &(block->u.out.u.full.u.cross.om),
-                                                 /* data size - how much of data_p fits on the first page */
-                                                 PAGE_SIZE - (data_p % PAGE_SIZE),
-
-                                                 /* DMA address of data_p */
-                                                 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),
-
-                                                 /* want completion status on all interesting packets */
-                                                 (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                                 /* want interrupt on all interesting packets */
-                                                 (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                                 /* data size - remaining portion of data_p */
-                                                 480 - (PAGE_SIZE - (data_p % PAGE_SIZE)),
-
-                                                 /* DMA address of data_p + PAGE_SIZE - (data_p % PAGE_SIZE) */
-                                                 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]);
-                               else if (mid_packet)
-                                       f->mid_frame_timestamp = &(block->u.out.u.full.u.cross.ol.q[3]);
-                               else if (last_packet) {
-                                       f->frame_end_timestamp = &(block->u.out.u.full.u.cross.ol.q[3]);
-                                       f->frame_end_branch = &(block->u.out.u.full.u.cross.ol.q[2]);
-                               }
-
-                               branch_address = &(block->u.out.u.full.u.cross.ol.q[2]);
-
-                               n_descriptors = 5;
-                               if (first_packet)
-                                       f->first_n_descriptors = n_descriptors;
-
-                               full_packets++;
-
-                       } else {
-                               /* fits on one page */
-
-                               fill_output_last( &(block->u.out.u.full.u.nocross.ol),
-
-                                                 /* want completion status on all interesting packets */
-                                                 (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                                 /* want interrupt on all interesting packets */
-                                                 (first_packet || mid_packet || last_packet) ? 1 : 0,
-
-                                                 480, /* data size (480 bytes of DV data) */
-
-
-                                                 /* DMA address of data_p */
-                                                 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]);
-                               else if (mid_packet)
-                                       f->mid_frame_timestamp = &(block->u.out.u.full.u.nocross.ol.q[3]);
-                               else if (last_packet) {
-                                       f->frame_end_timestamp = &(block->u.out.u.full.u.nocross.ol.q[3]);
-                                       f->frame_end_branch = &(block->u.out.u.full.u.nocross.ol.q[2]);
-                               }
-
-                               branch_address = &(block->u.out.u.full.u.nocross.ol.q[2]);
-
-                               n_descriptors = 4;
-                               if (first_packet)
-                                       f->first_n_descriptors = n_descriptors;
-
-                               full_packets++;
-                       }
-               }
-
-               /* link this descriptor block into the DMA program by filling in
-                  the branch address of the previous block */
-
-               /* note: we are not linked into the active DMA chain yet */
-
-               if (last_branch_address) {
-                       *(last_branch_address) = cpu_to_le32(block_dma | n_descriptors);
-               }
-
-               last_branch_address = branch_address;
-
-
-               f->n_packets++;
-
-       }
-
-       /* when we first assemble a new frame, set the final branch
-          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 this frame visible to the PCI card */
-       dma_region_sync_for_device(&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);
-
-       f->state = FRAME_READY;
-
-       video->n_clear_frames--;
-
-       last_frame = video->first_clear_frame - 1;
-       if (last_frame == -1)
-               last_frame = video->n_frames-1;
-
-       video->first_clear_frame = (video->first_clear_frame + 1) % video->n_frames;
-
-       irq_printk("   frame %d prepared, active_frame = %d, n_clear_frames = %d, first_clear_frame = %d\n last=%d\n",
-                  this_frame, video->active_frame, video->n_clear_frames, video->first_clear_frame, last_frame);
-
-       irq_printk("   begin_ts %08lx mid_ts %08lx end_ts %08lx end_br %08lx\n",
-                  (unsigned long) f->frame_begin_timestamp,
-                  (unsigned long) f->mid_frame_timestamp,
-                  (unsigned long) f->frame_end_timestamp,
-                  (unsigned long) f->frame_end_branch);
-
-       if (video->active_frame != -1) {
-
-               /* if DMA is already active, we are almost done */
-               /* just link us onto the active DMA chain */
-               if (video->frames[last_frame]->frame_end_branch) {
-                       u32 temp;
-
-                       /* point the previous frame's tail to this frame's head */
-                       *(video->frames[last_frame]->frame_end_branch) = cpu_to_le32(f->descriptor_pool_dma | f->first_n_descriptors);
-
-                       /* this write MUST precede the next one, or we could silently drop frames */
-                       wmb();
-
-                       /* disable the want_status semaphore on the last packet */
-                       temp = le32_to_cpu(*(video->frames[last_frame]->frame_end_branch - 2));
-                       temp &= 0xF7CFFFFF;
-                       *(video->frames[last_frame]->frame_end_branch - 2) = cpu_to_le32(temp);
-
-                       /* flush these writes to memory ASAP */
-                       flush_pci_write(video->ohci);
-
-                       /* NOTE:
-                          ideally the writes should be "atomic": if
-                          the OHCI card reads the want_status flag in
-                          between them, we'll falsely report a
-                          dropped frame. Hopefully this window is too
-                          small to really matter, and the consequence
-                          is rather harmless. */
-
-
-                       irq_printk("     new frame %d linked onto DMA chain\n", this_frame);
-
-               } else {
-                       printk(KERN_ERR "dv1394: last frame not ready???\n");
-               }
-
-       } else {
-
-               u32 transmit_sec, transmit_cyc;
-               u32 ts_cyc;
-
-               /* DMA is stopped, so this is the very first frame */
-               video->active_frame = this_frame;
-
-               /* set CommandPtr to address and size of first descriptor block */
-               reg_write(video->ohci, video->ohci_IsoXmitCommandPtr,
-                         video->frames[video->active_frame]->descriptor_pool_dma |
-                         f->first_n_descriptors);
-
-               /* assign a timestamp based on the current cycle time...
-                  We'll tell the card to begin DMA 100 cycles from now,
-                  and assign a timestamp 103 cycles from now */
-
-               cycleTimer = reg_read(video->ohci, OHCI1394_IsochronousCycleTimer);
-
-               ct_sec = cycleTimer >> 25;
-               ct_cyc = (cycleTimer >> 12) & 0x1FFF;
-               ct_off = cycleTimer & 0xFFF;
-
-               transmit_sec = ct_sec;
-               transmit_cyc = ct_cyc + 100;
-
-               transmit_sec += transmit_cyc/8000;
-               transmit_cyc %= 8000;
-
-               ts_cyc = transmit_cyc + 3;
-               ts_cyc %= 8000;
-
-               f->assigned_timestamp = (ts_cyc&0xF) << 12;
-
-               /* now actually write the timestamp into the appropriate CIP headers */
-               if (f->cip_syt1) {
-                       f->cip_syt1->b[6] = f->assigned_timestamp >> 8;
-                       f->cip_syt1->b[7] = f->assigned_timestamp & 0xFF;
-               }
-               if (f->cip_syt2) {
-                       f->cip_syt2->b[6] = f->assigned_timestamp >> 8;
-                       f->cip_syt2->b[7] = f->assigned_timestamp & 0xFF;
-               }
-
-               /* --- start DMA --- */
-
-               /* clear all bits in ContextControl register */
-
-               reg_write(video->ohci, video->ohci_IsoXmitContextControlClear, 0xFFFFFFFF);
-               wmb();
-
-               /* the OHCI card has the ability to start ISO transmission on a
-                  particular cycle (start-on-cycle). This way we can ensure that
-                  the first DV frame will have an accurate timestamp.
-
-                  However, start-on-cycle only appears to work if the OHCI card
-                  is cycle master! Since the consequences of messing up the first
-                  timestamp are minimal*, just disable start-on-cycle for now.
-
-                  * my DV deck drops the first few frames before it "locks in;"
-                    so the first frame having an incorrect timestamp is inconsequential.
-               */
-
-#if 0
-               reg_write(video->ohci, video->ohci_IsoXmitContextControlSet,
-                         (1 << 31) /* enable start-on-cycle */
-                         | ( (transmit_sec & 0x3) << 29)
-                         | (transmit_cyc << 16));
-               wmb();
-#endif
-
-               video->dma_running = 1;
-
-               /* set the 'run' bit */
-               reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, 0x8000);
-               flush_pci_write(video->ohci);
-
-               /* --- DMA should be running now --- */
-
-               debug_printk("    Cycle = %4u ContextControl = %08x CmdPtr = %08x\n",
-                            (reg_read(video->ohci, OHCI1394_IsochronousCycleTimer) >> 12) & 0x1FFF,
-                            reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
-                            reg_read(video->ohci, video->ohci_IsoXmitCommandPtr));
-
-               debug_printk("    DMA start - current cycle %4u, transmit cycle %4u (%2u), assigning ts cycle %2u\n",
-                            ct_cyc, transmit_cyc, transmit_cyc & 0xF, ts_cyc & 0xF);
-
-#if DV1394_DEBUG_LEVEL >= 2
-               {
-                       /* check if DMA is really running */
-                       int i = 0;
-                       while (i < 20) {
-                               mb();
-                               mdelay(1);
-                               if (reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) & (1 << 10)) {
-                                       printk("DMA ACTIVE after %d msec\n", i);
-                                       break;
-                               }
-                               i++;
-                       }
-
-                       printk("set = %08x, cmdPtr = %08x\n",
-                              reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
-                              reg_read(video->ohci, video->ohci_IsoXmitCommandPtr)
-                              );
-
-                       if ( ! (reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) &  (1 << 10)) ) {
-                               printk("DMA did NOT go active after 20ms, event = %x\n",
-                                      reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) & 0x1F);
-                       } else
-                               printk("DMA is RUNNING!\n");
-               }
-#endif
-
-       }
-
-
-       spin_unlock_irqrestore(&video->spinlock, irq_flags);
-}
-
-
-
-/*** RECEIVE FUNCTIONS *****************************************************/
-
-/*
-       frame method put_packet
-
-       map and copy the packet data to its location in the frame
-       based upon DIF section and sequence
-*/
-
-static void inline
-frame_put_packet (struct frame *f, struct packet *p)
-{
-       int section_type = p->data[0] >> 5;           /* section type is in bits 5 - 7 */
-       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);
-               break;
-
-       case 1:           /* 2 Subcode blocks */
-               memcpy( (void *) f->data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p->data, 480);
-               break;
-
-       case 2:           /* 3 VAUX blocks */
-               memcpy( (void *) f->data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p->data, 480);
-               break;
-
-       case 3:           /* 9 Audio blocks interleaved with video */
-               memcpy( (void *) f->data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p->data, 480);
-               break;
-
-       case 4:           /* 135 Video blocks interleaved with audio */
-               memcpy( (void *) f->data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + dif_block) * 80, p->data, 480);
-               break;
-
-       default:           /* we can not handle any other data */
-               break;
-       }
-}
-
-
-static void start_dma_receive(struct video_card *video)
-{
-       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);
-
-               /* 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();
-
-               video->dma_running = 1;
-
-               /* run */
-               reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x8000);
-               flush_pci_write(video->ohci);
-
-               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;
-                               }
-                       }
-                       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));
-       }
-}
-
-
-/*
-   receive_packets() - build the DMA program for receiving
-*/
-
-static void receive_packets(struct video_card *video)
-{
-       struct DMA_descriptor_block *block = NULL;
-       dma_addr_t block_dma = 0;
-       struct packet *data = NULL;
-       dma_addr_t data_dma = 0;
-       __le32 *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);
-
-       for (j = 0; j < video->n_frames; j++) {
-
-               /* 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 */
-
-               f = video->frames[j];
-
-               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);
-
-                       /* 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);
-
-}
-
-
-
-/*** MANAGEMENT FUNCTIONS **************************************************/
-
-static int do_dv1394_init(struct video_card *video, struct dv1394_init *init)
-{
-       unsigned long flags, new_buf_size;
-       int i;
-       u64 chan_mask;
-       int retval = -EINVAL;
-
-       debug_printk("dv1394: initialising %d\n", video->id);
-       if (init->api_version != DV1394_API_VERSION)
-               return -EINVAL;
-
-       /* first sanitize all the parameters */
-       if ( (init->n_frames < 2) || (init->n_frames > DV1394_MAX_FRAMES) )
-               return -EINVAL;
-
-       if ( (init->format != DV1394_NTSC) && (init->format != DV1394_PAL) )
-               return -EINVAL;
-
-       if ( (init->syt_offset == 0) || (init->syt_offset > 50) )
-               /* default SYT offset is 3 cycles */
-               init->syt_offset = 3;
-
-       if (init->channel > 63)
-               init->channel = 63;
-
-       chan_mask = (u64)1 << init->channel;
-
-       /* calculate what size DMA buffer is needed */
-       if (init->format == DV1394_NTSC)
-               new_buf_size = DV1394_NTSC_FRAME_SIZE * init->n_frames;
-       else
-               new_buf_size = DV1394_PAL_FRAME_SIZE * init->n_frames;
-
-       /* round up to PAGE_SIZE */
-       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->dv_buf.kvirt && video->dv_buf_size != new_buf_size) {
-               printk("dv1394: re-sizing the DMA buffer is not allowed\n");
-               return -EINVAL;
-       }
-
-       /* shutdown the card if it's currently active */
-       /* (the card should not be reset if the parameters are screwy) */
-
-       do_dv1394_shutdown(video, 0);
-
-       /* try to claim the ISO channel */
-       spin_lock_irqsave(&video->ohci->IR_channel_lock, flags);
-       if (video->ohci->ISO_channel_usage & chan_mask) {
-               spin_unlock_irqrestore(&video->ohci->IR_channel_lock, flags);
-               retval = -EBUSY;
-               goto err;
-       }
-       video->ohci->ISO_channel_usage |= chan_mask;
-       spin_unlock_irqrestore(&video->ohci->IR_channel_lock, flags);
-
-       video->channel = init->channel;
-
-       /* initialize misc. fields of video */
-       video->n_frames = init->n_frames;
-       video->pal_or_ntsc = init->format;
-
-       video->cip_accum = 0;
-       video->continuity_counter = 0;
-
-       video->active_frame = -1;
-       video->first_clear_frame = 0;
-       video->n_clear_frames = video->n_frames;
-       video->dropped_frames = 0;
-
-       video->write_off = 0;
-
-       video->first_run = 1;
-       video->current_packet = -1;
-       video->first_frame = 0;
-
-       if (video->pal_or_ntsc == DV1394_NTSC) {
-               video->cip_n = init->cip_n != 0 ? init->cip_n : CIP_N_NTSC;
-               video->cip_d = init->cip_d != 0 ? init->cip_d : CIP_D_NTSC;
-               video->frame_size = DV1394_NTSC_FRAME_SIZE;
-       } else {
-               video->cip_n = init->cip_n != 0 ? init->cip_n : CIP_N_PAL;
-               video->cip_d = init->cip_d != 0 ? init->cip_d : CIP_D_PAL;
-               video->frame_size = DV1394_PAL_FRAME_SIZE;
-       }
-
-       video->syt_offset = init->syt_offset;
-
-       /* find and claim DMA contexts on the OHCI card */
-
-       if (video->ohci_it_ctx == -1) {
-               ohci1394_init_iso_tasklet(&video->it_tasklet, OHCI_ISO_TRANSMIT,
-                                         it_tasklet_func, (unsigned long) video);
-
-               if (ohci1394_register_iso_tasklet(video->ohci, &video->it_tasklet) < 0) {
-                       printk(KERN_ERR "dv1394: could not find an available IT DMA context\n");
-                       retval = -EBUSY;
-                       goto err;
-               }
-
-               video->ohci_it_ctx = video->it_tasklet.context;
-               debug_printk("dv1394: claimed IT DMA context %d\n", video->ohci_it_ctx);
-       }
-
-       if (video->ohci_ir_ctx == -1) {
-               ohci1394_init_iso_tasklet(&video->ir_tasklet, OHCI_ISO_RECEIVE,
-                                         ir_tasklet_func, (unsigned long) video);
-
-               if (ohci1394_register_iso_tasklet(video->ohci, &video->ir_tasklet) < 0) {
-                       printk(KERN_ERR "dv1394: could not find an available IR DMA context\n");
-                       retval = -EBUSY;
-                       goto err;
-               }
-               video->ohci_ir_ctx = video->ir_tasklet.context;
-               debug_printk("dv1394: claimed IR DMA context %d\n", video->ohci_ir_ctx);
-       }
-
-       /* allocate struct frames */
-       for (i = 0; i < init->n_frames; i++) {
-               video->frames[i] = frame_new(i, video);
-
-               if (!video->frames[i]) {
-                       printk(KERN_ERR "dv1394: Cannot allocate frame structs\n");
-                       retval = -ENOMEM;
-                       goto err;
-               }
-       }
-
-       if (!video->dv_buf.kvirt) {
-               /* allocate the ringbuffer */
-               retval = dma_region_alloc(&video->dv_buf, new_buf_size, video->ohci->dev, PCI_DMA_TODEVICE);
-               if (retval)
-                       goto err;
-
-               video->dv_buf_size = new_buf_size;
-
-               debug_printk("dv1394: Allocated %d frame buffers, total %u pages (%u DMA pages), %lu bytes\n", 
-                            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->dv_buf.kvirt + i * video->frame_size;
-
-       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;
-
-               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);
-       }
-
-       /* 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;
-       video->ohci_IsoXmitContextControlClear = OHCI1394_IsoXmitContextControlClear+16*video->ohci_it_ctx;
-       video->ohci_IsoXmitCommandPtr = OHCI1394_IsoXmitCommandPtr+16*video->ohci_it_ctx;
-
-       /* enable interrupts for IT context */
-       reg_write(video->ohci, OHCI1394_IsoXmitIntMaskSet, (1 << video->ohci_it_ctx));
-       debug_printk("dv1394: interrupts enabled for IT context %d\n", video->ohci_it_ctx);
-
-       /* set up register offsets for IR context */
-       /* IR DMA context registers are spaced 32 bytes apart */
-       video->ohci_IsoRcvContextControlSet = OHCI1394_IsoRcvContextControlSet+32*video->ohci_ir_ctx;
-       video->ohci_IsoRcvContextControlClear = OHCI1394_IsoRcvContextControlClear+32*video->ohci_ir_ctx;
-       video->ohci_IsoRcvCommandPtr = OHCI1394_IsoRcvCommandPtr+32*video->ohci_ir_ctx;
-       video->ohci_IsoRcvContextMatch = OHCI1394_IsoRcvContextMatch+32*video->ohci_ir_ctx;
-
-       /* enable interrupts for IR context */
-       reg_write(video->ohci, OHCI1394_IsoRecvIntMaskSet, (1 << video->ohci_ir_ctx) );
-       debug_printk("dv1394: interrupts enabled for IR context %d\n", video->ohci_ir_ctx);
-
-       return 0;
-
-err:
-       do_dv1394_shutdown(video, 1);
-       return retval;
-}
-
-/* if the user doesn't bother to call ioctl(INIT) before starting
-   mmap() or read()/write(), just give him some default values */
-
-static int do_dv1394_init_default(struct video_card *video)
-{
-       struct dv1394_init init;
-
-       init.api_version = DV1394_API_VERSION;
-       init.n_frames = DV1394_MAX_FRAMES / 4;
-       init.channel = video->channel;
-       init.format = video->pal_or_ntsc;
-       init.cip_n = video->cip_n;
-       init.cip_d = video->cip_d;
-       init.syt_offset = video->syt_offset;
-
-       return do_dv1394_init(video, &init);
-}
-
-/* do NOT call from interrupt context */
-static void stop_dma(struct video_card *video)
-{
-       unsigned long flags;
-       int i;
-
-       /* no interrupts */
-       spin_lock_irqsave(&video->spinlock, flags);
-
-       video->dma_running = 0;
-
-       if ( (video->ohci_it_ctx == -1) && (video->ohci_ir_ctx == -1) )
-               goto out;
-
-       /* stop DMA if in progress */
-       if ( (video->active_frame != -1) ||
-           (reg_read(video->ohci, video->ohci_IsoXmitContextControlClear) & (1 << 10)) ||
-           (reg_read(video->ohci, video->ohci_IsoRcvContextControlClear) &  (1 << 10)) ) {
-
-               /* clear the .run bits */
-               reg_write(video->ohci, video->ohci_IsoXmitContextControlClear, (1 << 15));
-               reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, (1 << 15));
-               flush_pci_write(video->ohci);
-
-               video->active_frame = -1;
-               video->first_run = 1;
-
-               /* wait until DMA really stops */
-               i = 0;
-               while (i < 1000) {
-
-                       /* wait 0.1 millisecond */
-                       udelay(100);
-
-                       if ( (reg_read(video->ohci, video->ohci_IsoXmitContextControlClear) & (1 << 10)) ||
-                           (reg_read(video->ohci, video->ohci_IsoRcvContextControlClear)  & (1 << 10)) ) {
-                               /* still active */
-                               debug_printk("dv1394: stop_dma: DMA not stopped yet\n" );
-                               mb();
-                       } else {
-                               debug_printk("dv1394: stop_dma: DMA stopped safely after %d ms\n", i/10);
-                               break;
-                       }
-
-                       i++;
-               }
-
-               if (i == 1000) {
-                       printk(KERN_ERR "dv1394: stop_dma: DMA still going after %d ms!\n", i/10);
-               }
-       }
-       else
-               debug_printk("dv1394: stop_dma: already stopped.\n");
-
-out:
-       spin_unlock_irqrestore(&video->spinlock, flags);
-}
-
-
-
-static void do_dv1394_shutdown(struct video_card *video, int free_dv_buf)
-{
-       int i;
-
-       debug_printk("dv1394: shutdown...\n");
-
-       /* stop DMA if in progress */
-       stop_dma(video);
-
-       /* release the DMA contexts */
-       if (video->ohci_it_ctx != -1) {
-               video->ohci_IsoXmitContextControlSet = 0;
-               video->ohci_IsoXmitContextControlClear = 0;
-               video->ohci_IsoXmitCommandPtr = 0;
-
-               /* disable interrupts for IT context */
-               reg_write(video->ohci, OHCI1394_IsoXmitIntMaskClear, (1 << video->ohci_it_ctx));
-
-               /* remove tasklet */
-               ohci1394_unregister_iso_tasklet(video->ohci, &video->it_tasklet);
-               debug_printk("dv1394: IT context %d released\n", video->ohci_it_ctx);
-               video->ohci_it_ctx = -1;
-       }
-
-       if (video->ohci_ir_ctx != -1) {
-               video->ohci_IsoRcvContextControlSet = 0;
-               video->ohci_IsoRcvContextControlClear = 0;
-               video->ohci_IsoRcvCommandPtr = 0;
-               video->ohci_IsoRcvContextMatch = 0;
-
-               /* disable interrupts for IR context */
-               reg_write(video->ohci, OHCI1394_IsoRecvIntMaskClear, (1 << video->ohci_ir_ctx));
-
-               /* remove tasklet */
-               ohci1394_unregister_iso_tasklet(video->ohci, &video->ir_tasklet);
-               debug_printk("dv1394: IR context %d released\n", video->ohci_ir_ctx);
-               video->ohci_ir_ctx = -1;
-       }
-
-       /* release the ISO channel */
-       if (video->channel != -1) {
-               u64 chan_mask;
-               unsigned long flags;
-
-               chan_mask = (u64)1 << video->channel;
-
-               spin_lock_irqsave(&video->ohci->IR_channel_lock, flags);
-               video->ohci->ISO_channel_usage &= ~(chan_mask);
-               spin_unlock_irqrestore(&video->ohci->IR_channel_lock, flags);
-
-               video->channel = -1;
-       }
-
-       /* free the frame structs */
-       for (i = 0; i < DV1394_MAX_FRAMES; i++) {
-               if (video->frames[i])
-                       frame_delete(video->frames[i]);
-               video->frames[i] = NULL;
-       }
-
-       video->n_frames = 0;
-
-       /* we can't free the DMA buffer unless it is guaranteed that
-          no more user-space mappings exist */
-
-       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 OK\n");
-}
-
-/*
-       **********************************
-       *** MMAP() THEORY OF OPERATION ***
-       **********************************
-
-        The ringbuffer cannot be re-allocated or freed while
-        a user program maintains a mapping of it. (note that a mapping
-       can persist even after the device fd is closed!)
-
-       So, only let the user process allocate the DMA buffer once.
-       To resize or deallocate it, you must close the device file
-       and open it again.
-
-       Previously Dan M. hacked out a scheme that allowed the DMA
-       buffer to change by forcefully unmapping it from the user's
-       address space. It was prone to error because it's very hard to
-       track all the places the buffer could have been mapped (we
-       would have had to walk the vma list of every process in the
-       system to be sure we found all the mappings!). Instead, we
-       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.
-*/
-
-static int dv1394_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       struct video_card *video = file_to_video_card(file);
-       int retval = -EINVAL;
-
-       /*
-        * We cannot use the blocking variant mutex_lock here because .mmap
-        * is called with mmap_sem held, while .ioctl, .read, .write acquire
-        * video->mtx and subsequently call copy_to/from_user which will
-        * grab mmap_sem in case of a page fault.
-        */
-       if (!mutex_trylock(&video->mtx))
-               return -EAGAIN;
-
-       if ( ! video_card_initialized(video) ) {
-               retval = do_dv1394_init_default(video);
-               if (retval)
-                       goto out;
-       }
-
-       retval = dma_region_mmap(&video->dv_buf, file, vma);
-out:
-       mutex_unlock(&video->mtx);
-       return retval;
-}
-
-/*** DEVICE FILE INTERFACE *************************************************/
-
-/* no need to serialize, multiple threads OK */
-static unsigned int dv1394_poll(struct file *file, struct poll_table_struct *wait)
-{
-       struct video_card *video = file_to_video_card(file);
-       unsigned int mask = 0;
-       unsigned long flags;
-
-       poll_wait(file, &video->waitq, wait);
-
-       spin_lock_irqsave(&video->spinlock, flags);
-       if ( video->n_frames == 0 ) {
-
-       } else if ( video->active_frame == -1 ) {
-               /* nothing going on */
-               mask |= POLLOUT;
-       } else {
-               /* any clear/ready buffers? */
-               if (video->n_clear_frames >0)
-                       mask |= POLLOUT | POLLIN;
-       }
-       spin_unlock_irqrestore(&video->spinlock, flags);
-
-       return mask;
-}
-
-static int dv1394_fasync(int fd, struct file *file, int on)
-{
-       /* I just copied this code verbatim from Alan Cox's mouse driver example
-          (Documentation/DocBook/) */
-
-       struct video_card *video = file_to_video_card(file);
-
-       return fasync_helper(fd, file, on, &video->fasync);
-}
-
-static ssize_t dv1394_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
-{
-       struct video_card *video = file_to_video_card(file);
-       DECLARE_WAITQUEUE(wait, current);
-       ssize_t ret;
-       size_t cnt;
-       unsigned long flags;
-       int target_frame;
-
-       /* serialize this to prevent multi-threaded mayhem */
-       if (file->f_flags & O_NONBLOCK) {
-               if (!mutex_trylock(&video->mtx))
-                       return -EAGAIN;
-       } else {
-               if (mutex_lock_interruptible(&video->mtx))
-                       return -ERESTARTSYS;
-       }
-
-       if ( !video_card_initialized(video) ) {
-               ret = do_dv1394_init_default(video);
-               if (ret) {
-                       mutex_unlock(&video->mtx);
-                       return ret;
-               }
-       }
-
-       ret = 0;
-       add_wait_queue(&video->waitq, &wait);
-
-       while (count > 0) {
-
-               /* must set TASK_INTERRUPTIBLE *before* checking for free
-                  buffers; otherwise we could miss a wakeup if the interrupt
-                  fires between the check and the schedule() */
-
-               set_current_state(TASK_INTERRUPTIBLE);
-
-               spin_lock_irqsave(&video->spinlock, flags);
-
-               target_frame = video->first_clear_frame;
-
-               spin_unlock_irqrestore(&video->spinlock, flags);
-
-               if (video->frames[target_frame]->state == FRAME_CLEAR) {
-
-                       /* how much room is left in the target frame buffer */
-                       cnt = video->frame_size - (video->write_off - target_frame * video->frame_size);
-
-               } else {
-                       /* buffer is already used */
-                       cnt = 0;
-               }
-
-               if (cnt > count)
-                       cnt = count;
-
-               if (cnt <= 0) {
-                       /* no room left, gotta wait */
-                       if (file->f_flags & O_NONBLOCK) {
-                               if (!ret)
-                                       ret = -EAGAIN;
-                               break;
-                       }
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               break;
-                       }
-
-                       schedule();
-
-                       continue; /* start over from 'while(count > 0)...' */
-               }
-
-               if (copy_from_user(video->dv_buf.kvirt + video->write_off, buffer, cnt)) {
-                       if (!ret)
-                               ret = -EFAULT;
-                       break;
-               }
-
-               video->write_off = (video->write_off + cnt) % (video->n_frames * video->frame_size);
-
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-
-               if (video->write_off == video->frame_size * ((target_frame + 1) % video->n_frames))
-                               frame_prepare(video, target_frame);
-       }
-
-       remove_wait_queue(&video->waitq, &wait);
-       set_current_state(TASK_RUNNING);
-       mutex_unlock(&video->mtx);
-       return ret;
-}
-
-
-static ssize_t dv1394_read(struct file *file,  char __user *buffer, size_t count, loff_t *ppos)
-{
-       struct video_card *video = file_to_video_card(file);
-       DECLARE_WAITQUEUE(wait, current);
-       ssize_t ret;
-       size_t cnt;
-       unsigned long flags;
-       int target_frame;
-
-       /* serialize this to prevent multi-threaded mayhem */
-       if (file->f_flags & O_NONBLOCK) {
-               if (!mutex_trylock(&video->mtx))
-                       return -EAGAIN;
-       } else {
-               if (mutex_lock_interruptible(&video->mtx))
-                       return -ERESTARTSYS;
-       }
-
-       if ( !video_card_initialized(video) ) {
-               ret = do_dv1394_init_default(video);
-               if (ret) {
-                       mutex_unlock(&video->mtx);
-                       return ret;
-               }
-               video->continuity_counter = -1;
-
-               receive_packets(video);
-
-               start_dma_receive(video);
-       }
-
-       ret = 0;
-       add_wait_queue(&video->waitq, &wait);
-
-       while (count > 0) {
-
-               /* must set TASK_INTERRUPTIBLE *before* checking for free
-                  buffers; otherwise we could miss a wakeup if the interrupt
-                  fires between the check and the schedule() */
-
-               set_current_state(TASK_INTERRUPTIBLE);
-
-               spin_lock_irqsave(&video->spinlock, flags);
-
-               target_frame = video->first_clear_frame;
-
-               spin_unlock_irqrestore(&video->spinlock, flags);
-
-               if (target_frame >= 0 &&
-                       video->n_clear_frames > 0 &&
-                       video->frames[target_frame]->state == FRAME_CLEAR) {
-
-                       /* how much room is left in the target frame buffer */
-                       cnt = video->frame_size - (video->write_off - target_frame * video->frame_size);
-
-               } else {
-                       /* buffer is already used */
-                       cnt = 0;
-               }
-
-               if (cnt > count)
-                       cnt = count;
-
-               if (cnt <= 0) {
-                       /* no room left, gotta wait */
-                       if (file->f_flags & O_NONBLOCK) {
-                               if (!ret)
-                                       ret = -EAGAIN;
-                               break;
-                       }
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               break;
-                       }
-
-                       schedule();
-
-                       continue; /* start over from 'while(count > 0)...' */
-               }
-
-               if (copy_to_user(buffer, video->dv_buf.kvirt + video->write_off, cnt)) {
-                               if (!ret)
-                                       ret = -EFAULT;
-                               break;
-               }
-
-               video->write_off = (video->write_off + cnt) % (video->n_frames * video->frame_size);
-
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-
-               if (video->write_off == video->frame_size * ((target_frame + 1) % video->n_frames)) {
-                       spin_lock_irqsave(&video->spinlock, flags);
-                       video->n_clear_frames--;
-                       video->first_clear_frame = (video->first_clear_frame + 1) % video->n_frames;
-                       spin_unlock_irqrestore(&video->spinlock, flags);
-               }
-       }
-
-       remove_wait_queue(&video->waitq, &wait);
-       set_current_state(TASK_RUNNING);
-       mutex_unlock(&video->mtx);
-       return ret;
-}
-
-
-/*** DEVICE IOCTL INTERFACE ************************************************/
-
-static long dv1394_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-       struct video_card *video = file_to_video_card(file);
-       unsigned long flags;
-       int ret = -EINVAL;
-       void __user *argp = (void __user *)arg;
-
-       DECLARE_WAITQUEUE(wait, current);
-
-       /* serialize this to prevent multi-threaded mayhem */
-       if (file->f_flags & O_NONBLOCK) {
-               if (!mutex_trylock(&video->mtx))
-                       return -EAGAIN;
-       } else {
-               if (mutex_lock_interruptible(&video->mtx))
-                       return -ERESTARTSYS;
-       }
-
-       switch(cmd)
-       {
-       case DV1394_IOC_SUBMIT_FRAMES: {
-               unsigned int n_submit;
-
-               if ( !video_card_initialized(video) ) {
-                       ret = do_dv1394_init_default(video);
-                       if (ret)
-                               goto out;
-               }
-
-               n_submit = (unsigned int) arg;
-
-               if (n_submit > video->n_frames) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               while (n_submit > 0) {
-
-                       add_wait_queue(&video->waitq, &wait);
-                       set_current_state(TASK_INTERRUPTIBLE);
-
-                       spin_lock_irqsave(&video->spinlock, flags);
-
-                       /* wait until video->first_clear_frame is really CLEAR */
-                       while (video->frames[video->first_clear_frame]->state != FRAME_CLEAR) {
-
-                               spin_unlock_irqrestore(&video->spinlock, flags);
-
-                               if (signal_pending(current)) {
-                                       remove_wait_queue(&video->waitq, &wait);
-                                       set_current_state(TASK_RUNNING);
-                                       ret = -EINTR;
-                                       goto out;
-                               }
-
-                               schedule();
-                               set_current_state(TASK_INTERRUPTIBLE);
-
-                               spin_lock_irqsave(&video->spinlock, flags);
-                       }
-                       spin_unlock_irqrestore(&video->spinlock, flags);
-
-                       remove_wait_queue(&video->waitq, &wait);
-                       set_current_state(TASK_RUNNING);
-
-                       frame_prepare(video, video->first_clear_frame);
-
-                       n_submit--;
-               }
-
-               ret = 0;
-               break;
-       }
-
-       case DV1394_IOC_WAIT_FRAMES: {
-               unsigned int n_wait;
-
-               if ( !video_card_initialized(video) ) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               n_wait = (unsigned int) arg;
-
-               /* since we re-run the last frame on underflow, we will
-                  never actually have n_frames clear frames; at most only
-                  n_frames - 1 */
-
-               if (n_wait > (video->n_frames-1) ) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               add_wait_queue(&video->waitq, &wait);
-               set_current_state(TASK_INTERRUPTIBLE);
-
-               spin_lock_irqsave(&video->spinlock, flags);
-
-               while (video->n_clear_frames < n_wait) {
-
-                       spin_unlock_irqrestore(&video->spinlock, flags);
-
-                       if (signal_pending(current)) {
-                               remove_wait_queue(&video->waitq, &wait);
-                               set_current_state(TASK_RUNNING);
-                               ret = -EINTR;
-                               goto out;
-                       }
-
-                       schedule();
-                       set_current_state(TASK_INTERRUPTIBLE);
-
-                       spin_lock_irqsave(&video->spinlock, flags);
-               }
-
-               spin_unlock_irqrestore(&video->spinlock, flags);
-
-               remove_wait_queue(&video->waitq, &wait);
-               set_current_state(TASK_RUNNING);
-               ret = 0;
-               break;
-       }
-
-       case DV1394_IOC_RECEIVE_FRAMES: {
-               unsigned int n_recv;
-
-               if ( !video_card_initialized(video) ) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               n_recv = (unsigned int) arg;
-
-               /* at least one frame must be active */
-               if (n_recv > (video->n_frames-1) ) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               spin_lock_irqsave(&video->spinlock, flags);
-
-               /* release the clear frames */
-               video->n_clear_frames -= n_recv;
-
-               /* advance the clear frame cursor */
-               video->first_clear_frame = (video->first_clear_frame + n_recv) % video->n_frames;
-
-               /* reset dropped_frames */
-               video->dropped_frames = 0;
-
-               spin_unlock_irqrestore(&video->spinlock, flags);
-
-               ret = 0;
-               break;
-       }
-
-       case DV1394_IOC_START_RECEIVE: {
-               if ( !video_card_initialized(video) ) {
-                       ret = do_dv1394_init_default(video);
-                       if (ret)
-                               goto out;
-               }
-
-               video->continuity_counter = -1;
-
-               receive_packets(video);
-
-               start_dma_receive(video);
-
-               ret = 0;
-               break;
-       }
-
-       case DV1394_IOC_INIT: {
-               struct dv1394_init init;
-               if (!argp) {
-                       ret = do_dv1394_init_default(video);
-               } else {
-                       if (copy_from_user(&init, argp, sizeof(init))) {
-                               ret = -EFAULT;
-                               goto out;
-                       }
-                       ret = do_dv1394_init(video, &init);
-               }
-               break;
-       }
-
-       case DV1394_IOC_SHUTDOWN:
-               do_dv1394_shutdown(video, 0);
-               ret = 0;
-               break;
-
-
-        case DV1394_IOC_GET_STATUS: {
-               struct dv1394_status status;
-
-               if ( !video_card_initialized(video) ) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-
-               status.init.api_version = DV1394_API_VERSION;
-               status.init.channel = video->channel;
-               status.init.n_frames = video->n_frames;
-               status.init.format = video->pal_or_ntsc;
-               status.init.cip_n = video->cip_n;
-               status.init.cip_d = video->cip_d;
-               status.init.syt_offset = video->syt_offset;
-
-               status.first_clear_frame = video->first_clear_frame;
-
-               /* the rest of the fields need to be locked against the interrupt */
-               spin_lock_irqsave(&video->spinlock, flags);
-
-               status.active_frame = video->active_frame;
-               status.n_clear_frames = video->n_clear_frames;
-
-               status.dropped_frames = video->dropped_frames;
-
-               /* reset dropped_frames */
-               video->dropped_frames = 0;
-
-               spin_unlock_irqrestore(&video->spinlock, flags);
-
-               if (copy_to_user(argp, &status, sizeof(status))) {
-                       ret = -EFAULT;
-                       goto out;
-               }
-
-               ret = 0;
-               break;
-       }
-
-       default:
-               break;
-       }
-
- out:
-       mutex_unlock(&video->mtx);
-       return ret;
-}
-
-/*** DEVICE FILE INTERFACE CONTINUED ***************************************/
-
-static int dv1394_open(struct inode *inode, struct file *file)
-{
-       struct video_card *video = NULL;
-
-       if (file->private_data) {
-               video = file->private_data;
-
-       } else {
-               /* look up the card by ID */
-               unsigned long flags;
-               int idx = ieee1394_file_to_instance(file);
-
-               spin_lock_irqsave(&dv1394_cards_lock, flags);
-               if (!list_empty(&dv1394_cards)) {
-                       struct video_card *p;
-                       list_for_each_entry(p, &dv1394_cards, list) {
-                               if ((p->id) == idx) {
-                                       video = p;
-                                       break;
-                               }
-                       }
-               }
-               spin_unlock_irqrestore(&dv1394_cards_lock, flags);
-
-               if (!video) {
-                       debug_printk("dv1394: OHCI card %d not found", idx);
-                       return -ENODEV;
-               }
-
-               file->private_data = (void*) video;
-       }
-
-#ifndef DV1394_ALLOW_MORE_THAN_ONE_OPEN
-
-       if ( test_and_set_bit(0, &video->open) ) {
-               /* video is already open by someone else */
-               return -EBUSY;
-       }
-
-#endif
-
-       printk(KERN_INFO "%s: NOTE, the dv1394 interface is unsupported "
-              "and will not be available in the new firewire driver stack. "
-              "Try libraw1394 based programs instead.\n", current->comm);
-
-       return nonseekable_open(inode, file);
-}
-
-
-static int dv1394_release(struct inode *inode, struct file *file)
-{
-       struct video_card *video = file_to_video_card(file);
-
-       /* OK to free the DMA buffer, no more mappings can exist */
-       do_dv1394_shutdown(video, 1);
-
-       /* give someone else a turn */
-       clear_bit(0, &video->open);
-
-       return 0;
-}
-
-
-/*** DEVICE DRIVER HANDLERS ************************************************/
-
-static void it_tasklet_func(unsigned long data)
-{
-       int wake = 0;
-       struct video_card *video = (struct video_card*) data;
-
-       spin_lock(&video->spinlock);
-
-       if (!video->dma_running)
-               goto out;
-
-       irq_printk("ContextControl = %08x, CommandPtr = %08x\n",
-              reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
-              reg_read(video->ohci, video->ohci_IsoXmitCommandPtr)
-              );
-
-
-       if ( (video->ohci_it_ctx != -1) &&
-           (reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) & (1 << 10)) ) {
-
-               struct frame *f;
-               unsigned int frame, i;
-
-
-               if (video->active_frame == -1)
-                       frame = 0;
-               else
-                       frame = video->active_frame;
-
-               /* check all the DMA-able frames */
-               for (i = 0; i < video->n_frames; i++, frame = (frame+1) % video->n_frames) {
-
-                       irq_printk("IRQ checking frame %d...", frame);
-                       f = video->frames[frame];
-                       if (f->state != FRAME_READY) {
-                               irq_printk("clear, skipping\n");
-                               /* we don't own this frame */
-                               continue;
-                       }
-
-                       irq_printk("DMA\n");
-
-                       /* check the frame begin semaphore to see if we can free the previous frame */
-                       if ( *(f->frame_begin_timestamp) ) {
-                               int prev_frame;
-                               struct frame *prev_f;
-
-
-
-                               /* don't reset, need this later *(f->frame_begin_timestamp) = 0; */
-                               irq_printk("  BEGIN\n");
-
-                               prev_frame = frame - 1;
-                               if (prev_frame == -1)
-                                       prev_frame += video->n_frames;
-                               prev_f = video->frames[prev_frame];
-
-                               /* make sure we can actually garbage collect
-                                  this frame */
-                               if ( (prev_f->state == FRAME_READY) &&
-                                   prev_f->done && (!f->done) )
-                               {
-                                       frame_reset(prev_f);
-                                       video->n_clear_frames++;
-                                       wake = 1;
-                                       video->active_frame = frame;
-
-                                       irq_printk("  BEGIN - freeing previous frame %d, new active frame is %d\n", prev_frame, frame);
-                               } else {
-                                       irq_printk("  BEGIN - can't free yet\n");
-                               }
-
-                               f->done = 1;
-                       }
-
-
-                       /* see if we need to set the timestamp for the next frame */
-                       if ( *(f->mid_frame_timestamp) ) {
-                               struct frame *next_frame;
-                               u32 begin_ts, ts_cyc, ts_off;
-
-                               *(f->mid_frame_timestamp) = 0;
-
-                               begin_ts = le32_to_cpu(*(f->frame_begin_timestamp));
-
-                               irq_printk("  MIDDLE - first packet was sent at cycle %4u (%2u), assigned timestamp was (%2u) %4u\n",
-                                          begin_ts & 0x1FFF, begin_ts & 0xF,
-                                          f->assigned_timestamp >> 12, f->assigned_timestamp & 0xFFF);
-
-                               /* prepare next frame and assign timestamp */
-                               next_frame = video->frames[ (frame+1) % video->n_frames ];
-
-                               if (next_frame->state == FRAME_READY) {
-                                       irq_printk("  MIDDLE - next frame is ready, good\n");
-                               } else {
-                                       debug_printk("dv1394: Underflow! At least one frame has been dropped.\n");
-                                       next_frame = f;
-                               }
-
-                               /* set the timestamp to the timestamp of the last frame sent,
-                                  plus the length of the last frame sent, plus the syt latency */
-                               ts_cyc = begin_ts & 0xF;
-                               /* advance one frame, plus syt latency (typically 2-3) */
-                               ts_cyc += f->n_packets + video->syt_offset ;
-
-                               ts_off = 0;
-
-                               ts_cyc += ts_off/3072;
-                               ts_off %= 3072;
-
-                               next_frame->assigned_timestamp = ((ts_cyc&0xF) << 12) + ts_off;
-                               if (next_frame->cip_syt1) {
-                                       next_frame->cip_syt1->b[6] = next_frame->assigned_timestamp >> 8;
-                                       next_frame->cip_syt1->b[7] = next_frame->assigned_timestamp & 0xFF;
-                               }
-                               if (next_frame->cip_syt2) {
-                                       next_frame->cip_syt2->b[6] = next_frame->assigned_timestamp >> 8;
-                                       next_frame->cip_syt2->b[7] = next_frame->assigned_timestamp & 0xFF;
-                               }
-
-                       }
-
-                       /* see if the frame looped */
-                       if ( *(f->frame_end_timestamp) ) {
-
-                               *(f->frame_end_timestamp) = 0;
-
-                               debug_printk("  END - the frame looped at least once\n");
-
-                               video->dropped_frames++;
-                       }
-
-               } /* for (each frame) */
-       }
-
-       if (wake) {
-               kill_fasync(&video->fasync, SIGIO, POLL_OUT);
-
-               /* wake readers/writers/ioctl'ers */
-               wake_up_interruptible(&video->waitq);
-       }
-
-out:
-       spin_unlock(&video->spinlock);
-}
-
-static void ir_tasklet_func(unsigned long data)
-{
-       int wake = 0;
-       struct video_card *video = (struct video_card*) data;
-
-       spin_lock(&video->spinlock);
-
-       if (!video->dma_running)
-               goto out;
-
-       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;
-               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_for_cpu(&video->packet_buf,
-                                               (unsigned long) p - (unsigned long) video->packet_buf.kvirt,
-                                               sizeof(struct packet));
-
-                       packet_length = le16_to_cpu(p->data_length);
-
-                       /* 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 = le32_to_cpu(block->u.in.il.q[3]) >> 16;
-                       xferstatus &= 0x1F;
-                       irq_printk("ir_tasklet_func: xferStatus/resCount [%d] = 0x%08x\n", i, le32_to_cpu(block->u.in.il.q[3]) );
-
-                       /* get the current frame */
-                       f = video->frames[video->active_frame];
-
-                       /* exclude empty packet */
-                       if (packet_length > 8 && xferstatus == 0x11) {
-                               /* 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) )
-                               {
-                                       printk(KERN_WARNING "dv1394: discontinuity detected, dropping all frames\n" );
-                                       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;
-
-                               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++;
-                                               printk(KERN_WARNING "dv1394: dropped a frame during reception\n" );
-                                               video->n_clear_frames = video->n_frames-1;
-                                               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] |= cpu_to_le32(3 << 20); /* enable interrupt */
-                       next->u.in.il.q[2] = cpu_to_le32(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] &= ~cpu_to_le32(3 << 20); /* no interrupt */
-                       } else {
-                               prev->u.in.il.q[0] |= cpu_to_le32(3 << 20); /* enable interrupt */
-                       }
-                       prev->u.in.il.q[2] = cpu_to_le32(next_dma | 1); /* set Z=1 */
-                       wmb();
-
-                       /* 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 */
-
-       if (wake) {
-               kill_fasync(&video->fasync, SIGIO, POLL_IN);
-
-               /* wake readers/writers/ioctl'ers */
-               wake_up_interruptible(&video->waitq);
-       }
-
-out:
-       spin_unlock(&video->spinlock);
-}
-
-static struct cdev dv1394_cdev;
-static const struct file_operations dv1394_fops=
-{
-       .owner =        THIS_MODULE,
-       .poll =         dv1394_poll,
-       .unlocked_ioctl = dv1394_ioctl,
-#ifdef CONFIG_COMPAT
-       .compat_ioctl = dv1394_compat_ioctl,
-#endif
-       .mmap =         dv1394_mmap,
-       .open =         dv1394_open,
-       .write =        dv1394_write,
-       .read =         dv1394_read,
-       .release =      dv1394_release,
-       .fasync =       dv1394_fasync,
-       .llseek =       no_llseek,
-};
-
-
-/*** HOTPLUG STUFF **********************************************************/
-/*
- * Export information about protocols/devices supported by this driver.
- */
-#ifdef MODULE
-static const struct ieee1394_device_id dv1394_id_table[] = {
-       {
-               .match_flags    = IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
-               .specifier_id   = AVC_UNIT_SPEC_ID_ENTRY & 0xffffff,
-               .version        = AVC_SW_VERSION_ENTRY & 0xffffff
-       },
-       { }
-};
-
-MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table);
-#endif /* MODULE */
-
-static struct hpsb_protocol_driver dv1394_driver = {
-       .name = "dv1394",
-};
-
-
-/*** IEEE1394 HPSB CALLBACKS ***********************************************/
-
-static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes mode)
-{
-       struct video_card *video;
-       unsigned long flags;
-       int i;
-
-       video = kzalloc(sizeof(*video), GFP_KERNEL);
-       if (!video) {
-               printk(KERN_ERR "dv1394: cannot allocate video_card\n");
-               return -1;
-       }
-
-       video->ohci = ohci;
-       /* lower 2 bits of id indicate which of four "plugs"
-          per host */
-       video->id = ohci->host->id << 2;
-       if (format == DV1394_NTSC)
-               video->id |= mode;
-       else
-               video->id |= 2 + mode;
-
-       video->ohci_it_ctx = -1;
-       video->ohci_ir_ctx = -1;
-
-       video->ohci_IsoXmitContextControlSet = 0;
-       video->ohci_IsoXmitContextControlClear = 0;
-       video->ohci_IsoXmitCommandPtr = 0;
-
-       video->ohci_IsoRcvContextControlSet = 0;
-       video->ohci_IsoRcvContextControlClear = 0;
-       video->ohci_IsoRcvCommandPtr = 0;
-       video->ohci_IsoRcvContextMatch = 0;
-
-       video->n_frames = 0; /* flag that video is not initialized */
-       video->channel = 63; /* default to broadcast channel */
-       video->active_frame = -1;
-
-       /* initialize the following */
-       video->pal_or_ntsc = format;
-       video->cip_n = 0; /* 0 = use builtin default */
-       video->cip_d = 0;
-       video->syt_offset = 0;
-       video->mode = mode;
-
-       for (i = 0; i < DV1394_MAX_FRAMES; i++)
-               video->frames[i] = NULL;
-
-       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);
-       video->dma_running = 0;
-       mutex_init(&video->mtx);
-       init_waitqueue_head(&video->waitq);
-       video->fasync = NULL;
-
-       spin_lock_irqsave(&dv1394_cards_lock, flags);
-       INIT_LIST_HEAD(&video->list);
-       list_add_tail(&video->list, &dv1394_cards);
-       spin_unlock_irqrestore(&dv1394_cards_lock, flags);
-
-       debug_printk("dv1394: dv1394_init() OK on ID %d\n", video->id);
-       return 0;
-}
-
-static void dv1394_remove_host(struct hpsb_host *host)
-{
-       struct video_card *video, *tmp_video;
-       unsigned long flags;
-       int found_ohci_card = 0;
-
-       do {
-               video = NULL;
-               spin_lock_irqsave(&dv1394_cards_lock, flags);
-               list_for_each_entry(tmp_video, &dv1394_cards, list) {
-                       if ((tmp_video->id >> 2) == host->id) {
-                               list_del(&tmp_video->list);
-                               video = tmp_video;
-                               found_ohci_card = 1;
-                               break;
-                       }
-               }
-               spin_unlock_irqrestore(&dv1394_cards_lock, flags);
-
-               if (video) {
-                       do_dv1394_shutdown(video, 1);
-                       kfree(video);
-               }
-       } while (video);
-
-       if (found_ohci_card)
-               device_destroy(hpsb_protocol_class, MKDEV(IEEE1394_MAJOR,
-                          IEEE1394_MINOR_BLOCK_DV1394 * 16 + (host->id << 2)));
-}
-
-static void dv1394_add_host(struct hpsb_host *host)
-{
-       struct ti_ohci *ohci;
-       int id = host->id;
-
-       /* We only work with the OHCI-1394 driver */
-       if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
-               return;
-
-       ohci = (struct ti_ohci *)host->hostdata;
-
-       device_create(hpsb_protocol_class, NULL,
-                     MKDEV(IEEE1394_MAJOR,
-                           IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)),
-                     NULL, "dv1394-%d", id);
-
-       dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE);
-       dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);
-       dv1394_init(ohci, DV1394_PAL, MODE_RECEIVE);
-       dv1394_init(ohci, DV1394_PAL, MODE_TRANSMIT);
-}
-
-
-/* Bus reset handler. In the event of a bus reset, we may need to
-   re-start the DMA contexts - otherwise the user program would
-   end up waiting forever.
-*/
-
-static void dv1394_host_reset(struct hpsb_host *host)
-{
-       struct video_card *video = NULL, *tmp_vid;
-       unsigned long flags;
-
-       /* We only work with the OHCI-1394 driver */
-       if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
-               return;
-
-       /* find the corresponding video_cards */
-       spin_lock_irqsave(&dv1394_cards_lock, flags);
-       list_for_each_entry(tmp_vid, &dv1394_cards, list) {
-               if ((tmp_vid->id >> 2) == host->id) {
-                       video = tmp_vid;
-                       break;
-               }
-       }
-       spin_unlock_irqrestore(&dv1394_cards_lock, flags);
-
-       if (!video)
-               return;
-
-
-       spin_lock_irqsave(&video->spinlock, flags);
-
-       if (!video->dma_running)
-               goto out;
-
-       /* check IT context */
-       if (video->ohci_it_ctx != -1) {
-               u32 ctx;
-
-               ctx = reg_read(video->ohci, video->ohci_IsoXmitContextControlSet);
-
-               /* if (RUN but not ACTIVE) */
-               if ( (ctx & (1<<15)) &&
-                   !(ctx & (1<<10)) ) {
-
-                       debug_printk("dv1394: IT context stopped due to bus reset; waking it up\n");
-
-                       /* to be safe, assume a frame has been dropped. User-space programs
-                          should handle this condition like an underflow. */
-                       video->dropped_frames++;
-
-                       /* for some reason you must clear, then re-set the RUN bit to restart DMA */
-
-                       /* clear RUN */
-                       reg_write(video->ohci, video->ohci_IsoXmitContextControlClear, (1 << 15));
-                       flush_pci_write(video->ohci);
-
-                       /* set RUN */
-                       reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, (1 << 15));
-                       flush_pci_write(video->ohci);
-
-                       /* set the WAKE bit (just in case; this isn't strictly necessary) */
-                       reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, (1 << 12));
-                       flush_pci_write(video->ohci);
-
-                       irq_printk("dv1394: AFTER IT restart ctx 0x%08x ptr 0x%08x\n",
-                                  reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
-                                  reg_read(video->ohci, video->ohci_IsoXmitCommandPtr));
-               }
-       }
-
-       /* check IR context */
-       if (video->ohci_ir_ctx != -1) {
-               u32 ctx;
-
-               ctx = reg_read(video->ohci, video->ohci_IsoRcvContextControlSet);
-
-               /* if (RUN but not ACTIVE) */
-               if ( (ctx & (1<<15)) &&
-                   !(ctx & (1<<10)) ) {
-
-                       debug_printk("dv1394: IR context stopped due to bus reset; waking it up\n");
-
-                       /* to be safe, assume a frame has been dropped. User-space programs
-                          should handle this condition like an overflow. */
-                       video->dropped_frames++;
-
-                       /* for some reason you must clear, then re-set the RUN bit to restart DMA */
-                       /* XXX this doesn't work for me, I can't get IR DMA to restart :[ */
-
-                       /* clear RUN */
-                       reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, (1 << 15));
-                       flush_pci_write(video->ohci);
-
-                       /* set RUN */
-                       reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 15));
-                       flush_pci_write(video->ohci);
-
-                       /* set the WAKE bit (just in case; this isn't strictly necessary) */
-                       reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 12));
-                       flush_pci_write(video->ohci);
-
-                       irq_printk("dv1394: AFTER IR restart ctx 0x%08x ptr 0x%08x\n",
-                                  reg_read(video->ohci, video->ohci_IsoRcvContextControlSet),
-                                  reg_read(video->ohci, video->ohci_IsoRcvCommandPtr));
-               }
-       }
-
-out:
-       spin_unlock_irqrestore(&video->spinlock, flags);
-
-       /* wake readers/writers/ioctl'ers */
-       wake_up_interruptible(&video->waitq);
-}
-
-static struct hpsb_highlevel dv1394_highlevel = {
-       .name =         "dv1394",
-       .add_host =     dv1394_add_host,
-       .remove_host =  dv1394_remove_host,
-       .host_reset =   dv1394_host_reset,
-};
-
-#ifdef CONFIG_COMPAT
-
-#define DV1394_IOC32_INIT       _IOW('#', 0x06, struct dv1394_init32)
-#define DV1394_IOC32_GET_STATUS _IOR('#', 0x0c, struct dv1394_status32)
-
-struct dv1394_init32 {
-       u32 api_version;
-       u32 channel;
-       u32 n_frames;
-       u32 format;
-       u32 cip_n;
-       u32 cip_d;
-       u32 syt_offset;
-};
-
-struct dv1394_status32 {
-       struct dv1394_init32 init;
-       s32 active_frame;
-       u32 first_clear_frame;
-       u32 n_clear_frames;
-       u32 dropped_frames;
-};
-
-/* RED-PEN: this should use compat_alloc_userspace instead */
-
-static int handle_dv1394_init(struct file *file, unsigned int cmd, unsigned long arg)
-{
-       struct dv1394_init32 dv32;
-       struct dv1394_init dv;
-       mm_segment_t old_fs;
-       int ret;
-
-       if (file->f_op->unlocked_ioctl != dv1394_ioctl)
-               return -EFAULT;
-
-       if (copy_from_user(&dv32, (void __user *)arg, sizeof(dv32)))
-               return -EFAULT;
-
-       dv.api_version = dv32.api_version;
-       dv.channel = dv32.channel;
-       dv.n_frames = dv32.n_frames;
-       dv.format = dv32.format;
-       dv.cip_n = (unsigned long)dv32.cip_n;
-       dv.cip_d = (unsigned long)dv32.cip_d;
-       dv.syt_offset = dv32.syt_offset;
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = dv1394_ioctl(file, DV1394_IOC_INIT, (unsigned long)&dv);
-       set_fs(old_fs);
-
-       return ret;
-}
-
-static int handle_dv1394_get_status(struct file *file, unsigned int cmd, unsigned long arg)
-{
-       struct dv1394_status32 dv32;
-       struct dv1394_status dv;
-       mm_segment_t old_fs;
-       int ret;
-
-       if (file->f_op->unlocked_ioctl != dv1394_ioctl)
-               return -EFAULT;
-
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       ret = dv1394_ioctl(file, DV1394_IOC_GET_STATUS, (unsigned long)&dv);
-       set_fs(old_fs);
-
-       if (!ret) {
-               dv32.init.api_version = dv.init.api_version;
-               dv32.init.channel = dv.init.channel;
-               dv32.init.n_frames = dv.init.n_frames;
-               dv32.init.format = dv.init.format;
-               dv32.init.cip_n = (u32)dv.init.cip_n;
-               dv32.init.cip_d = (u32)dv.init.cip_d;
-               dv32.init.syt_offset = dv.init.syt_offset;
-               dv32.active_frame = dv.active_frame;
-               dv32.first_clear_frame = dv.first_clear_frame;
-               dv32.n_clear_frames = dv.n_clear_frames;
-               dv32.dropped_frames = dv.dropped_frames;
-
-               if (copy_to_user((struct dv1394_status32 __user *)arg, &dv32, sizeof(dv32)))
-                       ret = -EFAULT;
-       }
-
-       return ret;
-}
-
-
-
-static long dv1394_compat_ioctl(struct file *file, unsigned int cmd,
-                              unsigned long arg)
-{
-       switch (cmd) {
-       case DV1394_IOC_SHUTDOWN:
-       case DV1394_IOC_SUBMIT_FRAMES:
-       case DV1394_IOC_WAIT_FRAMES:
-       case DV1394_IOC_RECEIVE_FRAMES:
-       case DV1394_IOC_START_RECEIVE:
-               return dv1394_ioctl(file, cmd, arg);
-
-       case DV1394_IOC32_INIT:
-               return handle_dv1394_init(file, cmd, arg);
-       case DV1394_IOC32_GET_STATUS:
-               return handle_dv1394_get_status(file, cmd, arg);
-       default:
-               return -ENOIOCTLCMD;
-       }
-}
-
-#endif /* CONFIG_COMPAT */
-
-
-/*** KERNEL MODULE HANDLERS ************************************************/
-
-MODULE_AUTHOR("Dan Maas <dmaas@dcine.com>, Dan Dennedy <dan@dennedy.org>");
-MODULE_DESCRIPTION("driver for DV input/output on OHCI board");
-MODULE_SUPPORTED_DEVICE("dv1394");
-MODULE_LICENSE("GPL");
-
-static void __exit dv1394_exit_module(void)
-{
-       hpsb_unregister_protocol(&dv1394_driver);
-       hpsb_unregister_highlevel(&dv1394_highlevel);
-       cdev_del(&dv1394_cdev);
-}
-
-static int __init dv1394_init_module(void)
-{
-       int ret;
-
-       cdev_init(&dv1394_cdev, &dv1394_fops);
-       dv1394_cdev.owner = THIS_MODULE;
-       ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16);
-       if (ret) {
-               printk(KERN_ERR "dv1394: unable to register character device\n");
-               return ret;
-       }
-
-       hpsb_register_highlevel(&dv1394_highlevel);
-
-       ret = hpsb_register_protocol(&dv1394_driver);
-       if (ret) {
-               printk(KERN_ERR "dv1394: failed to register protocol\n");
-               hpsb_unregister_highlevel(&dv1394_highlevel);
-               cdev_del(&dv1394_cdev);
-               return ret;
-       }
-
-       return 0;
-}
-
-module_init(dv1394_init_module);
-module_exit(dv1394_exit_module);
diff --git a/drivers/ieee1394/dv1394.h b/drivers/ieee1394/dv1394.h
deleted file mode 100644 (file)
index 5807f52..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * dv1394.h - DV input/output over IEEE 1394 on OHCI chips
- *   Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
- *     receive by Dan Dennedy <dan@dennedy.org>
- *
- * based on:
- *   video1394.h - driver for OHCI 1394 boards
- *   Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
- *                          Peter Schlaile <udbz@rz.uni-karlsruhe.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifndef _DV_1394_H
-#define _DV_1394_H
-
-/* This is the public user-space interface. Try not to break it. */
-
-#define DV1394_API_VERSION 0x20011127
-
-/* ********************
-   **                **
-   **   DV1394 API   **
-   **                **
-   ********************
-
-   There are two methods of operating the DV1394 DV output device.
-
-   1)
-
-   The simplest is an interface based on write(): simply write
-   full DV frames of data to the device, and they will be transmitted
-   as quickly as possible. The FD may be set for non-blocking I/O,
-   in which case you can use select() or poll() to wait for output
-   buffer space.
-
-   To set the DV output parameters (e.g. whether you want NTSC or PAL
-   video), use the DV1394_INIT ioctl, passing in the parameters you
-   want in a struct dv1394_init.
-
-   Example 1:
-         To play a raw .DV file:   cat foo.DV > /dev/dv1394
-        (cat will use write() internally)
-
-   Example 2:
-           static struct dv1394_init init = {
-             0x63,        (broadcast channel)
-              4,           (four-frame ringbuffer)
-             DV1394_NTSC, (send NTSC video)
-             0, 0         (default empty packet rate)
-           }
-
-          ioctl(fd, DV1394_INIT, &init);
-
-          while (1) {
-                 read( <a raw DV file>, buf, DV1394_NTSC_FRAME_SIZE );
-                 write( <the dv1394 FD>, buf, DV1394_NTSC_FRAME_SIZE );
-           }
-
-   2)
-
-   For more control over buffering, and to avoid unnecessary copies
-   of the DV data, you can use the more sophisticated the mmap() interface.
-   First, call the DV1394_INIT ioctl to specify your parameters,
-   including the number of frames in the ringbuffer. Then, calling mmap()
-   on the dv1394 device will give you direct access to the ringbuffer
-   from which the DV card reads your frame data.
-
-   The ringbuffer is simply one large, contiguous region of memory
-   containing two or more frames of packed DV data. Each frame of DV data
-   is 120000 bytes (NTSC) or 144000 bytes (PAL).
-
-   Fill one or more frames in the ringbuffer, then use the DV1394_SUBMIT_FRAMES
-   ioctl to begin I/O. You can use either the DV1394_WAIT_FRAMES ioctl
-   or select()/poll() to wait until the frames are transmitted. Next, you'll
-   need to call the DV1394_GET_STATUS ioctl to determine which ringbuffer
-   frames are clear (ready to be filled with new DV data). Finally, use
-   DV1394_SUBMIT_FRAMES again to send the new data to the DV output.
-
-
-   Example: here is what a four-frame ringbuffer might look like
-            during DV transmission:
-
-
-         frame 0   frame 1   frame 2   frame 3
-
-       *--------------------------------------*
-        | CLEAR   | DV data | DV data | CLEAR  |
-        *--------------------------------------*
-                   <ACTIVE>
-
-       transmission goes in this direction --->>>
-
-
-   The DV hardware is currently transmitting the data in frame 1.
-   Once frame 1 is finished, it will automatically transmit frame 2.
-   (if frame 2 finishes before frame 3 is submitted, the device
-   will continue to transmit frame 2, and will increase the dropped_frames
-   counter each time it repeats the transmission).
-
-
-   If you called DV1394_GET_STATUS at this instant, you would
-   receive the following values:
-
-                  n_frames          = 4
-                 active_frame      = 1
-                 first_clear_frame = 3
-                 n_clear_frames    = 2
-
-   At this point, you should write new DV data into frame 3 and optionally
-   frame 0. Then call DV1394_SUBMIT_FRAMES to inform the device that
-   it may transmit the new frames.
-
-   ERROR HANDLING
-
-   An error (buffer underflow/overflow or a break in the DV stream due
-   to a 1394 bus reset) can be detected by checking the dropped_frames
-   field of struct dv1394_status (obtained through the
-   DV1394_GET_STATUS ioctl).
-
-   The best way to recover from such an error is to re-initialize
-   dv1394, either by using the DV1394_INIT ioctl call, or closing the
-   file descriptor and opening it again. (note that you must unmap all
-   ringbuffer mappings when closing the file descriptor, or else
-   dv1394 will still be considered 'in use').
-
-   MAIN LOOP
-
-   For maximum efficiency and robustness against bus errors, you are
-   advised to model the main loop of your application after the
-   following pseudo-code example:
-
-   (checks of system call return values omitted for brevity; always
-   check return values in your code!)
-
-   while ( frames left ) {
-
-    struct pollfd *pfd = ...;
-
-    pfd->fd = dv1394_fd;
-    pfd->revents = 0;
-    pfd->events = POLLOUT | POLLIN; (OUT for transmit, IN for receive)
-
-    (add other sources of I/O here)
-
-    poll(pfd, 1, -1); (or select(); add a timeout if you want)
-
-    if (pfd->revents) {
-         struct dv1394_status status;
-
-         ioctl(dv1394_fd, DV1394_GET_STATUS, &status);
-
-        if (status.dropped_frames > 0) {
-             reset_dv1394();
-         } else {
-              for (int i = 0; i < status.n_clear_frames; i++) {
-                 copy_DV_frame();
-              }
-         }
-    }
-   }
-
-   where copy_DV_frame() reads or writes on the dv1394 file descriptor
-   (read/write mode) or copies data to/from the mmap ringbuffer and
-   then calls ioctl(DV1394_SUBMIT_FRAMES) to notify dv1394 that new
-   frames are availble (mmap mode).
-
-   reset_dv1394() is called in the event of a buffer
-   underflow/overflow or a halt in the DV stream (e.g. due to a 1394
-   bus reset). To guarantee recovery from the error, this function
-   should close the dv1394 file descriptor (and munmap() all
-   ringbuffer mappings, if you are using them), then re-open the
-   dv1394 device (and re-map the ringbuffer).
-
-*/
-
-
-/* maximum number of frames in the ringbuffer */
-#define DV1394_MAX_FRAMES 32
-
-/* number of *full* isochronous packets per DV frame */
-#define DV1394_NTSC_PACKETS_PER_FRAME 250
-#define DV1394_PAL_PACKETS_PER_FRAME  300
-
-/* size of one frame's worth of DV data, in bytes */
-#define DV1394_NTSC_FRAME_SIZE (480 * DV1394_NTSC_PACKETS_PER_FRAME)
-#define DV1394_PAL_FRAME_SIZE  (480 * DV1394_PAL_PACKETS_PER_FRAME)
-
-
-/* ioctl() commands */
-#include "ieee1394-ioctl.h"
-
-
-enum pal_or_ntsc {
-       DV1394_NTSC = 0,
-       DV1394_PAL
-};
-
-
-
-
-/* this is the argument to DV1394_INIT */
-struct dv1394_init {
-       /* DV1394_API_VERSION */
-       unsigned int api_version;
-
-       /* isochronous transmission channel to use */
-       unsigned int channel;
-
-       /* number of frames in the ringbuffer. Must be at least 2
-          and at most DV1394_MAX_FRAMES. */
-       unsigned int n_frames;
-
-       /* send/receive PAL or NTSC video format */
-       enum pal_or_ntsc format;
-
-       /* the following are used only for transmission */
-
-       /* set these to zero unless you want a
-          non-default empty packet rate (see below) */
-       unsigned long cip_n;
-       unsigned long cip_d;
-
-       /* set this to zero unless you want a
-          non-default SYT cycle offset (default = 3 cycles) */
-       unsigned int syt_offset;
-};
-
-/* NOTE: you may only allocate the DV frame ringbuffer once each time
-   you open the dv1394 device. DV1394_INIT will fail if you call it a
-   second time with different 'n_frames' or 'format' arguments (which
-   would imply a different size for the ringbuffer). If you need a
-   different buffer size, simply close and re-open the device, then
-   initialize it with your new settings. */
-
-/* Q: What are cip_n and cip_d? */
-
-/*
-  A: DV video streams do not utilize 100% of the potential bandwidth offered
-  by IEEE 1394 (FireWire). To achieve the correct rate of data transmission,
-  DV devices must periodically insert empty packets into the 1394 data stream.
-  Typically there is one empty packet per 14-16 data-carrying packets.
-
-  Some DV devices will accept a wide range of empty packet rates, while others
-  require a precise rate. If the dv1394 driver produces empty packets at
-  a rate that your device does not accept, you may see ugly patterns on the
-  DV output, or even no output at all.
-
-  The default empty packet insertion rate seems to work for many people; if
-  your DV output is stable, you can simply ignore this discussion. However,
-  we have exposed the empty packet rate as a parameter to support devices that
-  do not work with the default rate.
-
-  The decision to insert an empty packet is made with a numerator/denominator
-  algorithm. Empty packets are produced at an average rate of CIP_N / CIP_D.
-  You can alter the empty packet rate by passing non-zero values for cip_n
-  and cip_d to the INIT ioctl.
-
- */
-
-
-
-struct dv1394_status {
-       /* this embedded init struct returns the current dv1394
-          parameters in use */
-       struct dv1394_init init;
-
-       /* the ringbuffer frame that is currently being
-          displayed. (-1 if the device is not transmitting anything) */
-       int active_frame;
-
-       /* index of the first buffer (ahead of active_frame) that
-          is ready to be filled with data */
-       unsigned int first_clear_frame;
-
-       /* how many buffers, including first_clear_buffer, are
-          ready to be filled with data */
-       unsigned int n_clear_frames;
-
-       /* how many times the DV stream has underflowed, overflowed,
-          or otherwise encountered an error, since the previous call
-          to DV1394_GET_STATUS */
-       unsigned int dropped_frames;
-
-       /* N.B. The dropped_frames counter is only a lower bound on the actual
-          number of dropped frames, with the special case that if dropped_frames
-          is zero, then it is guaranteed that NO frames have been dropped
-          since the last call to DV1394_GET_STATUS.
-       */
-};
-
-
-#endif /* _DV_1394_H */
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
deleted file mode 100644 (file)
index bc289e3..0000000
+++ /dev/null
@@ -1,1736 +0,0 @@
-/*
- * eth1394.c -- IPv4 driver for Linux IEEE-1394 Subsystem
- *
- * Copyright (C) 2001-2003 Ben Collins <bcollins@debian.org>
- *               2000 Bonin Franck <boninf@free.fr>
- *               2003 Steve Kinneberg <kinnebergsteve@acmsystems.com>
- *
- * Mainly based on work by Emanuel Pirker and Andreas E. Bombe
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-/*
- * This driver intends to support RFC 2734, which describes a method for
- * transporting IPv4 datagrams over IEEE-1394 serial busses.
- *
- * TODO:
- * RFC 2734 related:
- * - Add MCAP. Limited Multicast exists only to 224.0.0.1 and 224.0.0.2.
- *
- * Non-RFC 2734 related:
- * - Handle fragmented skb's coming from the networking layer.
- * - Move generic GASP reception to core 1394 code
- * - Convert kmalloc/kfree for link fragments to use kmem_cache_* instead
- * - Stability improvements
- * - Performance enhancements
- * - Consider garbage collecting old partial datagrams after X amount of time
- */
-
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/errno.h>
-#include <linux/types.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/workqueue.h>
-
-#include <linux/netdevice.h>
-#include <linux/inetdevice.h>
-#include <linux/if_arp.h>
-#include <linux/if_ether.h>
-#include <linux/ip.h>
-#include <linux/in.h>
-#include <linux/tcp.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-#include <linux/ethtool.h>
-#include <asm/uaccess.h>
-#include <asm/delay.h>
-#include <asm/unaligned.h>
-#include <net/arp.h>
-
-#include "config_roms.h"
-#include "csr1212.h"
-#include "eth1394.h"
-#include "highlevel.h"
-#include "ieee1394.h"
-#include "ieee1394_core.h"
-#include "ieee1394_hotplug.h"
-#include "ieee1394_transactions.h"
-#include "ieee1394_types.h"
-#include "iso.h"
-#include "nodemgr.h"
-
-#define ETH1394_PRINT_G(level, fmt, args...) \
-       printk(level "%s: " fmt, driver_name, ## args)
-
-#define ETH1394_PRINT(level, dev_name, fmt, args...) \
-       printk(level "%s: %s: " fmt, driver_name, dev_name, ## args)
-
-struct fragment_info {
-       struct list_head list;
-       int offset;
-       int len;
-};
-
-struct partial_datagram {
-       struct list_head list;
-       u16 dgl;
-       u16 dg_size;
-       __be16 ether_type;
-       struct sk_buff *skb;
-       char *pbuf;
-       struct list_head frag_info;
-};
-
-struct pdg_list {
-       struct list_head list;  /* partial datagram list per node       */
-       unsigned int sz;        /* partial datagram list size per node  */
-       spinlock_t lock;        /* partial datagram lock                */
-};
-
-struct eth1394_host_info {
-       struct hpsb_host *host;
-       struct net_device *dev;
-};
-
-struct eth1394_node_ref {
-       struct unit_directory *ud;
-       struct list_head list;
-};
-
-struct eth1394_node_info {
-       u16 maxpayload;         /* max payload                  */
-       u8 sspd;                /* max speed                    */
-       u64 fifo;               /* FIFO address                 */
-       struct pdg_list pdg;    /* partial RX datagram lists    */
-       int dgl;                /* outgoing datagram label      */
-};
-
-static const char driver_name[] = "eth1394";
-
-static struct kmem_cache *packet_task_cache;
-
-static struct hpsb_highlevel eth1394_highlevel;
-
-/* Use common.lf to determine header len */
-static const int hdr_type_len[] = {
-       sizeof(struct eth1394_uf_hdr),
-       sizeof(struct eth1394_ff_hdr),
-       sizeof(struct eth1394_sf_hdr),
-       sizeof(struct eth1394_sf_hdr)
-};
-
-static const u16 eth1394_speedto_maxpayload[] = {
-/*     S100, S200, S400, S800, S1600, S3200 */
-       512, 1024, 2048, 4096,  4096,  4096
-};
-
-MODULE_AUTHOR("Ben Collins (bcollins@debian.org)");
-MODULE_DESCRIPTION("IEEE 1394 IPv4 Driver (IPv4-over-1394 as per RFC 2734)");
-MODULE_LICENSE("GPL");
-
-/*
- * The max_partial_datagrams parameter is the maximum number of fragmented
- * datagrams per node that eth1394 will keep in memory.  Providing an upper
- * bound allows us to limit the amount of memory that partial datagrams
- * consume in the event that some partial datagrams are never completed.
- */
-static int max_partial_datagrams = 25;
-module_param(max_partial_datagrams, int, S_IRUGO | S_IWUSR);
-MODULE_PARM_DESC(max_partial_datagrams,
-                "Maximum number of partially received fragmented datagrams "
-                "(default = 25).");
-
-
-static int ether1394_header(struct sk_buff *skb, struct net_device *dev,
-                           unsigned short type, const void *daddr,
-                           const void *saddr, unsigned len);
-static int ether1394_rebuild_header(struct sk_buff *skb);
-static int ether1394_header_parse(const struct sk_buff *skb,
-                                 unsigned char *haddr);
-static int ether1394_header_cache(const struct neighbour *neigh,
-                                 struct hh_cache *hh);
-static void ether1394_header_cache_update(struct hh_cache *hh,
-                                         const struct net_device *dev,
-                                         const unsigned char *haddr);
-static netdev_tx_t ether1394_tx(struct sk_buff *skb,
-                               struct net_device *dev);
-static void ether1394_iso(struct hpsb_iso *iso);
-
-static const struct ethtool_ops ethtool_ops;
-
-static int ether1394_write(struct hpsb_host *host, int srcid, int destid,
-                          quadlet_t *data, u64 addr, size_t len, u16 flags);
-static void ether1394_add_host(struct hpsb_host *host);
-static void ether1394_remove_host(struct hpsb_host *host);
-static void ether1394_host_reset(struct hpsb_host *host);
-
-/* Function for incoming 1394 packets */
-static const struct hpsb_address_ops addr_ops = {
-       .write =        ether1394_write,
-};
-
-/* Ieee1394 highlevel driver functions */
-static struct hpsb_highlevel eth1394_highlevel = {
-       .name =         driver_name,
-       .add_host =     ether1394_add_host,
-       .remove_host =  ether1394_remove_host,
-       .host_reset =   ether1394_host_reset,
-};
-
-static int ether1394_recv_init(struct eth1394_priv *priv)
-{
-       unsigned int iso_buf_size;
-
-       /* FIXME: rawiso limits us to PAGE_SIZE */
-       iso_buf_size = min((unsigned int)PAGE_SIZE,
-                          2 * (1U << (priv->host->csr.max_rec + 1)));
-
-       priv->iso = hpsb_iso_recv_init(priv->host,
-                                      ETHER1394_GASP_BUFFERS * iso_buf_size,
-                                      ETHER1394_GASP_BUFFERS,
-                                      priv->broadcast_channel,
-                                      HPSB_ISO_DMA_PACKET_PER_BUFFER,
-                                      1, ether1394_iso);
-       if (priv->iso == NULL) {
-               ETH1394_PRINT_G(KERN_ERR, "Failed to allocate IR context\n");
-               priv->bc_state = ETHER1394_BC_ERROR;
-               return -EAGAIN;
-       }
-
-       if (hpsb_iso_recv_start(priv->iso, -1, (1 << 3), -1) < 0)
-               priv->bc_state = ETHER1394_BC_STOPPED;
-       else
-               priv->bc_state = ETHER1394_BC_RUNNING;
-       return 0;
-}
-
-/* This is called after an "ifup" */
-static int ether1394_open(struct net_device *dev)
-{
-       struct eth1394_priv *priv = netdev_priv(dev);
-       int ret;
-
-       if (priv->bc_state == ETHER1394_BC_ERROR) {
-               ret = ether1394_recv_init(priv);
-               if (ret)
-                       return ret;
-       }
-       netif_start_queue(dev);
-       return 0;
-}
-
-/* This is called after an "ifdown" */
-static int ether1394_stop(struct net_device *dev)
-{
-       /* flush priv->wake */
-       flush_scheduled_work();
-
-       netif_stop_queue(dev);
-       return 0;
-}
-
-/* FIXME: What to do if we timeout? I think a host reset is probably in order,
- * so that's what we do. Should we increment the stat counters too?  */
-static void ether1394_tx_timeout(struct net_device *dev)
-{
-       struct hpsb_host *host =
-                       ((struct eth1394_priv *)netdev_priv(dev))->host;
-
-       ETH1394_PRINT(KERN_ERR, dev->name, "Timeout, resetting host\n");
-       ether1394_host_reset(host);
-}
-
-static inline int ether1394_max_mtu(struct hpsb_host* host)
-{
-       return (1 << (host->csr.max_rec + 1))
-                       - sizeof(union eth1394_hdr) - ETHER1394_GASP_OVERHEAD;
-}
-
-static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
-{
-       int max_mtu;
-
-       if (new_mtu < 68)
-               return -EINVAL;
-
-       max_mtu = ether1394_max_mtu(
-                       ((struct eth1394_priv *)netdev_priv(dev))->host);
-       if (new_mtu > max_mtu) {
-               ETH1394_PRINT(KERN_INFO, dev->name,
-                             "Local node constrains MTU to %d\n", max_mtu);
-               return -ERANGE;
-       }
-
-       dev->mtu = new_mtu;
-       return 0;
-}
-
-static void purge_partial_datagram(struct list_head *old)
-{
-       struct partial_datagram *pd;
-       struct list_head *lh, *n;
-       struct fragment_info *fi;
-
-       pd = list_entry(old, struct partial_datagram, list);
-
-       list_for_each_safe(lh, n, &pd->frag_info) {
-               fi = list_entry(lh, struct fragment_info, list);
-               list_del(lh);
-               kfree(fi);
-       }
-       list_del(old);
-       kfree_skb(pd->skb);
-       kfree(pd);
-}
-
-/******************************************
- * 1394 bus activity functions
- ******************************************/
-
-static struct eth1394_node_ref *eth1394_find_node(struct list_head *inl,
-                                                 struct unit_directory *ud)
-{
-       struct eth1394_node_ref *node;
-
-       list_for_each_entry(node, inl, list)
-               if (node->ud == ud)
-                       return node;
-
-       return NULL;
-}
-
-static struct eth1394_node_ref *eth1394_find_node_guid(struct list_head *inl,
-                                                      u64 guid)
-{
-       struct eth1394_node_ref *node;
-
-       list_for_each_entry(node, inl, list)
-               if (node->ud->ne->guid == guid)
-                       return node;
-
-       return NULL;
-}
-
-static struct eth1394_node_ref *eth1394_find_node_nodeid(struct list_head *inl,
-                                                        nodeid_t nodeid)
-{
-       struct eth1394_node_ref *node;
-
-       list_for_each_entry(node, inl, list)
-               if (node->ud->ne->nodeid == nodeid)
-                       return node;
-
-       return NULL;
-}
-
-static int eth1394_new_node(struct eth1394_host_info *hi,
-                           struct unit_directory *ud)
-{
-       struct eth1394_priv *priv;
-       struct eth1394_node_ref *new_node;
-       struct eth1394_node_info *node_info;
-
-       new_node = kmalloc(sizeof(*new_node), GFP_KERNEL);
-       if (!new_node)
-               return -ENOMEM;
-
-       node_info = kmalloc(sizeof(*node_info), GFP_KERNEL);
-       if (!node_info) {
-               kfree(new_node);
-               return -ENOMEM;
-       }
-
-       spin_lock_init(&node_info->pdg.lock);
-       INIT_LIST_HEAD(&node_info->pdg.list);
-       node_info->pdg.sz = 0;
-       node_info->fifo = CSR1212_INVALID_ADDR_SPACE;
-
-       dev_set_drvdata(&ud->device, node_info);
-       new_node->ud = ud;
-
-       priv = netdev_priv(hi->dev);
-       list_add_tail(&new_node->list, &priv->ip_node_list);
-       return 0;
-}
-
-static int eth1394_probe(struct device *dev)
-{
-       struct unit_directory *ud;
-       struct eth1394_host_info *hi;
-
-       ud = container_of(dev, struct unit_directory, device);
-       hi = hpsb_get_hostinfo(&eth1394_highlevel, ud->ne->host);
-       if (!hi)
-               return -ENOENT;
-
-       return eth1394_new_node(hi, ud);
-}
-
-static int eth1394_remove(struct device *dev)
-{
-       struct unit_directory *ud;
-       struct eth1394_host_info *hi;
-       struct eth1394_priv *priv;
-       struct eth1394_node_ref *old_node;
-       struct eth1394_node_info *node_info;
-       struct list_head *lh, *n;
-       unsigned long flags;
-
-       ud = container_of(dev, struct unit_directory, device);
-       hi = hpsb_get_hostinfo(&eth1394_highlevel, ud->ne->host);
-       if (!hi)
-               return -ENOENT;
-
-       priv = netdev_priv(hi->dev);
-
-       old_node = eth1394_find_node(&priv->ip_node_list, ud);
-       if (!old_node)
-               return 0;
-
-       list_del(&old_node->list);
-       kfree(old_node);
-
-       node_info = dev_get_drvdata(&ud->device);
-
-       spin_lock_irqsave(&node_info->pdg.lock, flags);
-       /* The partial datagram list should be empty, but we'll just
-        * make sure anyway... */
-       list_for_each_safe(lh, n, &node_info->pdg.list)
-               purge_partial_datagram(lh);
-       spin_unlock_irqrestore(&node_info->pdg.lock, flags);
-
-       kfree(node_info);
-       dev_set_drvdata(&ud->device, NULL);
-       return 0;
-}
-
-static int eth1394_update(struct unit_directory *ud)
-{
-       struct eth1394_host_info *hi;
-       struct eth1394_priv *priv;
-       struct eth1394_node_ref *node;
-
-       hi = hpsb_get_hostinfo(&eth1394_highlevel, ud->ne->host);
-       if (!hi)
-               return -ENOENT;
-
-       priv = netdev_priv(hi->dev);
-       node = eth1394_find_node(&priv->ip_node_list, ud);
-       if (node)
-               return 0;
-
-       return eth1394_new_node(hi, ud);
-}
-
-static const struct ieee1394_device_id eth1394_id_table[] = {
-       {
-               .match_flags = (IEEE1394_MATCH_SPECIFIER_ID |
-                               IEEE1394_MATCH_VERSION),
-               .specifier_id = ETHER1394_GASP_SPECIFIER_ID,
-               .version = ETHER1394_GASP_VERSION,
-       },
-       {}
-};
-
-MODULE_DEVICE_TABLE(ieee1394, eth1394_id_table);
-
-static struct hpsb_protocol_driver eth1394_proto_driver = {
-       .name           = driver_name,
-       .id_table       = eth1394_id_table,
-       .update         = eth1394_update,
-       .driver         = {
-               .probe          = eth1394_probe,
-               .remove         = eth1394_remove,
-       },
-};
-
-static void ether1394_reset_priv(struct net_device *dev, int set_mtu)
-{
-       unsigned long flags;
-       int i;
-       struct eth1394_priv *priv = netdev_priv(dev);
-       struct hpsb_host *host = priv->host;
-       u64 guid = get_unaligned((u64 *)&(host->csr.rom->bus_info_data[3]));
-       int max_speed = IEEE1394_SPEED_MAX;
-
-       spin_lock_irqsave(&priv->lock, flags);
-
-       memset(priv->ud_list, 0, sizeof(priv->ud_list));
-       priv->bc_maxpayload = 512;
-
-       /* Determine speed limit */
-       /* FIXME: This is broken for nodes with link speed < PHY speed,
-        * and it is suboptimal for S200B...S800B hardware.
-        * The result of nodemgr's speed probe should be used somehow. */
-       for (i = 0; i < host->node_count; i++) {
-               /* take care of S100B...S400B PHY ports */
-               if (host->speed[i] == SELFID_SPEED_UNKNOWN) {
-                       max_speed = IEEE1394_SPEED_100;
-                       break;
-               }
-               if (max_speed > host->speed[i])
-                       max_speed = host->speed[i];
-       }
-       priv->bc_sspd = max_speed;
-
-       if (set_mtu) {
-               /* Use the RFC 2734 default 1500 octets or the maximum payload
-                * as initial MTU */
-               dev->mtu = min(1500, ether1394_max_mtu(host));
-
-               /* Set our hardware address while we're at it */
-               memcpy(dev->dev_addr, &guid, sizeof(u64));
-               memset(dev->broadcast, 0xff, sizeof(u64));
-       }
-
-       spin_unlock_irqrestore(&priv->lock, flags);
-}
-
-static const struct header_ops ether1394_header_ops = {
-       .create         = ether1394_header,
-       .rebuild        = ether1394_rebuild_header,
-       .cache          = ether1394_header_cache,
-       .cache_update   = ether1394_header_cache_update,
-       .parse          = ether1394_header_parse,
-};
-
-static const struct net_device_ops ether1394_netdev_ops = {
-       .ndo_open       = ether1394_open,
-       .ndo_stop       = ether1394_stop,
-       .ndo_start_xmit = ether1394_tx,
-       .ndo_tx_timeout = ether1394_tx_timeout,
-       .ndo_change_mtu = ether1394_change_mtu,
-};
-
-static void ether1394_init_dev(struct net_device *dev)
-{
-
-       dev->header_ops         = &ether1394_header_ops;
-       dev->netdev_ops         = &ether1394_netdev_ops;
-
-       SET_ETHTOOL_OPS(dev, &ethtool_ops);
-
-       dev->watchdog_timeo     = ETHER1394_TIMEOUT;
-       dev->flags              = IFF_BROADCAST | IFF_MULTICAST;
-       dev->features           = NETIF_F_HIGHDMA;
-       dev->addr_len           = ETH1394_ALEN;
-       dev->hard_header_len    = ETH1394_HLEN;
-       dev->type               = ARPHRD_IEEE1394;
-
-       /* FIXME: This value was copied from ether_setup(). Is it too much? */
-       dev->tx_queue_len       = 1000;
-}
-
-/*
- * Wake the queue up after commonly encountered transmit failure conditions are
- * hopefully over.  Currently only tlabel exhaustion is accounted for.
- */
-static void ether1394_wake_queue(struct work_struct *work)
-{
-       struct eth1394_priv *priv;
-       struct hpsb_packet *packet;
-
-       priv = container_of(work, struct eth1394_priv, wake);
-       packet = hpsb_alloc_packet(0);
-
-       /* This is really bad, but unjam the queue anyway. */
-       if (!packet)
-               goto out;
-
-       packet->host = priv->host;
-       packet->node_id = priv->wake_node;
-       /*
-        * A transaction label is all we really want.  If we get one, it almost
-        * always means we can get a lot more because the ieee1394 core recycled
-        * a whole batch of tlabels, at last.
-        */
-       if (hpsb_get_tlabel(packet) == 0)
-               hpsb_free_tlabel(packet);
-
-       hpsb_free_packet(packet);
-out:
-