13 Jan, 2011

1 commit

  • PAGE_KERNEL_RO is not available on all architectures, so its use
    in the new AR code broke compilation on sparc64.

    Because the read-only mapping was just a debugging aid, just use
    PAGE_KERNEL instead.

    Signed-off-by: Clemens Ladisch

    James Bottomley wrote:
    > On Thu, 2011-01-13 at 08:27 +0100, Clemens Ladisch wrote:
    >> firewire: ohci: fix compilation on arches without PAGE_KERNEL_RO, e.g. sparc
    >>
    >> PAGE_KERNEL_RO is not available on all architectures, so its use in the
    >> new AR code broke compilation on sparc64.
    >>
    >> Because the R/O mapping is only used to catch drivers that try to write
    >> to the reception buffer and not actually required for correct operation,
    >> we can just use a normal PAGE_KERNEL mapping where _RO is not available.
    [...]
    >> +/*
    >> + * For archs where PAGE_KERNEL_RO is not supported;
    >> + * mapping the AR buffers readonly for the CPU is just a debugging aid.
    >> + */
    >> +#ifndef PAGE_KERNEL_RO
    >> +#define PAGE_KERNEL_RO PAGE_KERNEL
    >> +#endif
    >
    > This might cause interesting issues on sparc64 if it ever acquired a
    > PAGE_KERNEL_RO. Sparc64 has extern pgprot_t for it's PAGE_KERNEL types
    > rather than #defines, so the #ifdef check wouldn't see this.
    >
    > I think either PAGE_PROT_RO becomes part of our arch API (so all
    > architectures are forced to add it), or, if it's not part of the API,
    > ohci isn't entitled to use it. The latter seems simplest since you have
    > no real use for write protection anyway.

    Reported-by: Andrew Morton
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     

04 Jan, 2011

5 commits


19 Dec, 2010

2 commits

  • At ifup, carrier status would be shown on even if it actually was off.
    Also add an include for ethtool_ops rather than to rely on the one from
    netdevice.h.

    Note, we can alas not use fwnet_device_mutex to serialize access to
    dev->peer_count (as I originally wanted). This would cause a lock
    inversion:
    - fwnet_probe | takes fwnet_device_mutex
    + register_netdev | takes rtnl_mutex
    - devinet_ioctl | takes rtnl_mutex
    + fwnet_open | ...must not take fwnet_device_mutex

    Hence use the dev->lock spinlock for serialization.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • To make userland, e.g. NetworkManager work with firewire, we need to
    detect whether cable is plugged or not. Simple and correct way of doing
    that is just counting number of peers. No peers - no link and vice
    versa.

    Signed-off-by: Stefan Richter

    Maxim Levitsky
     

14 Dec, 2010

10 commits

  • Unfortunately its easy to trigger such error messages by removing the
    cable while sending streams of data over the link.

    Such errors are normal, and therefore this patch stops firewire-net from
    flooding the kernel log with these errors, by combining series of same
    errors together.

    Signed-off-by: Maxim Levitsky

    (Stefan R:) Eventually we should remove this logging when firewire-net
    and related firewire-ohci facilities have been stabilized.

    Signed-off-by: Stefan Richter

    Maxim Levitsky
     
  • Restore iso channels DMA so that iso channels could continue to work
    after resume from RAM/disk.

    Signed-off-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Maxim Levitsky
     
  • Some lousy BIOSes, e.g. my Aspire 5720 BIOS forget to restore the GUID
    register on resume from RAM.

    Fix that by setting it to the last value that was read from it.

    Signed-off-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Maxim Levitsky
     
  • The buffers used for the selfIDs packets and the AR request and response
    descriptors end up using three pages because dma_alloc_coherent()
    allocates at least one page per call. However, these data structures
    would all fit into 4 KB, so we can save space by using a common buffer
    for them.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • When the isochRx/isochTx bit is clear, we do not need to read the
    corresponding iso interrupt event register.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Change the header of PHY packets to be sent to include a pseudo
    transaction code. This makes the header consistent with that of
    received PHY packets, and allows at_context_queue_packet() and
    log_ar_at_event() to see the packet type directly instead of having
    to deduce it from the header length or even from the header contents.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • To remove the error information from the controller's queue and to allow
    more posted writes, the driver has to read the failed posted write
    address before clearing the postedWriteErr interrupt bit.

    Signed-off-by: Clemens Ladisch

    (Stefan R:) The spec is somewhat fuzzy about the actual requirements.
    To err on the safe side, let's do these two read accesses.

    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Make sure that interrupt event clear bit writes are executed before the
    interrupt handler returns.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Add proper error handling for the context_init() calls.

    Signed-off-by: Clemens Ladisch
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Move the AR DMA descriptors out of the buffer pages, and map the buffer
    pages linearly into the kernel's address space. This allows the driver
    to ignore any page boundaries in the DMA data and thus to avoid any
    copying around of packet payloads.

    This fixes the bug where S800 packets that are so big (> 4080 bytes)
    that they can be split over three pages were not handled correctly.

    Due to the changed algorithm, we can now use arbitrarily many buffer
    pages, which improves performance because the controller can more easily
    unload its DMA FIFO.

    Furthermore, using streaming DMA mappings should improve perfomance on
    architectures where coherent DMA mappings are not cacheable. Even on
    other architectures, the caching behaviour should be improved slightly
    because the CPU no longer writes to the buffer pages.

    v2: Detect the last filled buffer page by searching the descriptor's
    residual count value fields in order (like in the old code), instead
    of going backwards through the transfer status fields; it looks as
    if some controllers do not set the latter correctly.

    v3: Fix an old resume bug that would now make the handler run into
    a BUG_ON, and replace that check with more useful error handling.
    Increase the buffer size for better performance with non-TI chips.

    Signed-off-by: Clemens Ladisch

    Maxim Levitsky writes:
    Works almost perfectly. I can still see RCODE_BUSY errors
    sometimes, not very often though. 64K here eliminates these errors
    completely. This is most likely due to nouveau drivers and lowest
    perf level I use to lower card temperature. That increases
    latencies too much I think. Besides that the IO is just perfect.

    Tested-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     

12 Dec, 2010

4 commits


29 Nov, 2010

1 commit


17 Nov, 2010

5 commits

  • This prevents firewire-net from submitting write requests in fast
    succession until failure due to all 64 transaction labels were used up
    for unfinished split transactions. The netif_stop/wake_queue API is
    used for this purpose.

    Without this stop/wake mechanism, datagrams were simply lost whenever
    the tlabel pool was exhausted. Plus, tlabel exhaustion by firewire-net
    also prevented other unrelated outbound transactions to be initiated.

    The chosen queue depth was checked by me to hit the maximum possible
    throughput with an OS X peer whose receive DMA is good enough to never
    reject requests due to busy inbound request FIFO. Current Linux peers
    show a mixed picture of -5%...+15% change in bandwidth; their current
    bottleneck are RCODE_BUSY situations (fewer or more, depending on TX
    queue depth) due to too small AR buffer in firewire-ohci.

    Maxim Levitsky tested this change with similar watermarks with a Linux
    peer and some pending firewire-ohci improvements that address the
    RCODE_BUSY problem and confirmed that these TX queue limits are good.

    Note: This removes some netif_wake_queue from reception code paths.
    They were apparently copy&paste artefacts from a nonsensical
    netif_wake_queue use in the older eth1394 driver. This belongs only
    into the transmit path.

    Signed-off-by: Stefan Richter
    Tested-by: Maxim Levitsky

    Stefan Richter
     
  • The current transmit code does not at all make use of
    - fwnet_device.packet_list
    and only very limited use of
    - fwnet_device.broadcasted_list,
    - fwnet_device.queued_packets.
    Their current function is to track whether the TX soft-IRQ finished
    dealing with an skb when the AT-req tasklet takes over, and to discard
    pending tx datagrams (if there are any) when the local node is removed.

    The latter does actually contain a race condition bug with TX soft-IRQ
    and AT-req tasklet.

    Instead of these lists and the corresponding link in fwnet_packet_task,
    - a flag in fwnet_packet_task to track whether fwnet_tx is done,
    - a counter of queued datagrams in fwnet_device
    do the job as well.

    The above mentioned theoretic race condition is resolved by letting
    fwnet_remove sleep until all datagrams were flushed. It may sleep
    almost arbitrarily long since fwnet_remove is executed in the context of
    a multithreaded (concurrency managed) workqueue.

    The type of max_payload is changed to u16 here to avoid waste in struct
    fwnet_packet_task. This value cannot exceed 4096 per IEEE 1394:2008
    table 16-18 (or 32678 per specification of packet headers, if there is
    ever going to be something else than beta mode).

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • a) fwnet_transmit_packet_done used to poison ptask->pt_link by list_del.
    If fwnet_send_packet checked later whether it was responsible to clean
    up (in the border case that the TX soft IRQ was outpaced by the AT-req
    tasklet on another CPU), it missed this because ptask->pt_link was no
    longer shown as empty.

    b) If fwnet_write_complete got an rcode other than RCODE_COMPLETE, we
    missed to free the skb and ptask entirely.

    Also, count stats.tx_dropped and stats.tx_errors when rcode != 0.

    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Signed-off-by: Stefan Richter

    Stefan Richter
     
  • Move the mid-layer's ->queuecommand() invocation from being locked
    with the host lock to being unlocked to facilitate speeding up the
    critical path for drivers who don't need this lock taken anyway.

    The patch below presents a simple SCSI host lock push-down as an
    equivalent transformation. No locking or other behavior should change
    with this patch. All existing bugs and locking orders are preserved.

    Additionally, add one parameter to queuecommand,
    struct Scsi_Host *
    and remove one parameter from queuecommand,
    void (*done)(struct scsi_cmnd *)

    Scsi_Host* is a convenient pointer that most host drivers need anyway,
    and 'done' is redundant to struct scsi_cmnd->scsi_done.

    Minimal code disturbance was attempted with this change. Most drivers
    needed only two one-line modifications for their host lock push-down.

    Signed-off-by: Jeff Garzik
    Acked-by: James Bottomley
    Signed-off-by: Linus Torvalds

    Jeff Garzik
     

06 Nov, 2010

1 commit


31 Oct, 2010

4 commits

  • If the controller is storing a split packet and therefore changing
    d->res_count to zero between the two reads by the driver, we end up with
    an end pointer that is not at a packet boundary, and therefore overflow
    the buffer when handling the split packet.

    To fix this, read the field once, atomically. The compiler usually
    merges the two reads anyway, but for correctness, we have to enforce it.

    Signed-off-by: Clemens Ladisch
    Tested-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • Freeing an AR buffer page just to allocate a new page immediately
    afterwards is not only a pointless effort but also dangerous because
    the allocation can fail, which would result in an oops later.

    Split ar_context_add_page() into two functions so that we can reuse
    the old page directly.

    Signed-off-by: Clemens Ladisch
    Tested-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • When handling an AR buffer that has been completely filled, we assumed
    that its descriptor will not be read by the controller and can be
    overwritten. However, when the last received packet happens to end at
    the end of the buffer, the controller might not yet have moved on to the
    next buffer and might read the branch address later. If we overwrite
    and free the page before that, the DMA context will either go dead
    because of an invalid Z value, or go off into some random memory.

    To fix this, ensure that the descriptor does not get overwritten by
    using only the actual buffer instead of the entire page for reassembling
    the split packet. Furthermore, to avoid freeing the page too early,
    move on to the next buffer only when some data in it guarantees that the
    controller has moved on.

    This should eliminate the remaining firewire-net problems.

    Signed-off-by: Clemens Ladisch
    Cc: 2.6.22-2.6.36
    Tested-by: Maxim Levitsky
    Signed-off-by: Stefan Richter

    Clemens Ladisch
     
  • When the controller had to split a received asynchronous packet into two
    buffers, the driver tries to reassemble it by copying both parts into
    the first page. However, if size + rest > PAGE_SIZE, i.e., if the yet
    unhandled packets before the split packet, the split packet itself, and
    any received packets after the split packet are together larger than one
    page, then the memory after the first page would get overwritten.

    To fix this, do not try to copy the data of all unhandled packets at
    once, but copy the possibly needed data every time when handling
    a packet.

    This gets rid of most of the infamous crashes and data corruptions when
    using firewire-net.

    Signed-off-by: Clemens Ladisch
    Cc: 2.6.22-2.6.36
    Tested-by: Maxim Levitsky
    Signed-off-by: Stefan Richter (cast PAGE_SIZE to size_t)

    Clemens Ladisch
     

25 Oct, 2010

1 commit


24 Oct, 2010

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits)
    bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
    vlan: Calling vlan_hwaccel_do_receive() is always valid.
    tproxy: use the interface primary IP address as a default value for --on-ip
    tproxy: added IPv6 support to the socket match
    cxgb3: function namespace cleanup
    tproxy: added IPv6 support to the TPROXY target
    tproxy: added IPv6 socket lookup function to nf_tproxy_core
    be2net: Changes to use only priority codes allowed by f/w
    tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
    tproxy: added tproxy sockopt interface in the IPV6 layer
    tproxy: added udp6_lib_lookup function
    tproxy: added const specifiers to udp lookup functions
    tproxy: split off ipv6 defragmentation to a separate module
    l2tp: small cleanup
    nf_nat: restrict ICMP translation for embedded header
    can: mcp251x: fix generation of error frames
    can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
    can-raw: add msg_flags to distinguish local traffic
    9p: client code cleanup
    rds: make local functions/variables static
    ...

    Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
    drivers/net/wireless/ath/ath9k/debug.c as per David

    Linus Torvalds
     

23 Oct, 2010

1 commit

  • * 'llseek' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl:
    vfs: make no_llseek the default
    vfs: don't use BKL in default_llseek
    llseek: automatically add .llseek fop
    libfs: use generic_file_llseek for simple_attr
    mac80211: disallow seeks in minstrel debug code
    lirc: make chardev nonseekable
    viotape: use noop_llseek
    raw: use explicit llseek file operations
    ibmasmfs: use generic_file_llseek
    spufs: use llseek in all file operations
    arm/omap: use generic_file_llseek in iommu_debug
    lkdtm: use generic_file_llseek in debugfs
    net/wireless: use generic_file_llseek in debugfs
    drm: use noop_llseek

    Linus Torvalds
     

21 Oct, 2010

1 commit


17 Oct, 2010

1 commit

  • Revert commit 54672386ccf36ffa21d1de8e75624af83f9b0eeb
    "firewire: ohci: fix up configuration of TI chips".
    It caused massive slow-down and data corruption with a TSB82AA2 based
    StarTech EC1394B2 ExpressCard and FireWire 800 harddisks.

    https://bugs.launchpad.net/ubuntu/+source/linux/+bug/657081
    http://thread.gmane.org/gmane.linux.kernel.firewire.user/4013

    The fact that some card EEPROMs do not program these enhancements may be
    related to TSB81BA3 phy chip errata, if not to bugs of TSB82AA2 itself.
    We could re-add these configuration steps, but only conditional on a
    whitelist of cards on which these enhancements bring a proven positive
    effect.

    Reported-and-tested-by: Eric Shattow
    Cc: Clemens Ladisch
    Cc: 2.6.35
    Signed-off-by: Stefan Richter

    Stefan Richter
     

15 Oct, 2010

1 commit

  • All file_operations should get a .llseek operation so we can make
    nonseekable_open the default for future file operations without a
    .llseek pointer.

    The three cases that we can automatically detect are no_llseek, seq_lseek
    and default_llseek. For cases where we can we can automatically prove that
    the file offset is always ignored, we use noop_llseek, which maintains
    the current behavior of not returning an error from a seek.

    New drivers should normally not use noop_llseek but instead use no_llseek
    and call nonseekable_open at open time. Existing drivers can be converted
    to do the same when the maintainer knows for certain that no user code
    relies on calling seek on the device file.

    The generated code is often incorrectly indented and right now contains
    comments that clarify for each added line why a specific variant was
    chosen. In the version that gets submitted upstream, the comments will
    be gone and I will manually fix the indentation, because there does not
    seem to be a way to do that using coccinelle.

    Some amount of new code is currently sitting in linux-next that should get
    the same modifications, which I will do at the end of the merge window.

    Many thanks to Julia Lawall for helping me learn to write a semantic
    patch that does all this.

    ===== begin semantic patch =====
    // This adds an llseek= method to all file operations,
    // as a preparation for making no_llseek the default.
    //
    // The rules are
    // - use no_llseek explicitly if we do nonseekable_open
    // - use seq_lseek for sequential files
    // - use default_llseek if we know we access f_pos
    // - use noop_llseek if we know we don't access f_pos,
    // but we still want to allow users to call lseek
    //
    @ open1 exists @
    identifier nested_open;
    @@
    nested_open(...)
    {

    }

    @ open exists@
    identifier open_f;
    identifier i, f;
    identifier open1.nested_open;
    @@
    int open_f(struct inode *i, struct file *f)
    {

    }

    @ read disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {

    }

    @ read_no_fpos disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ write @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {

    }

    @ write_no_fpos @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ fops0 @
    identifier fops;
    @@
    struct file_operations fops = {
    ...
    };

    @ has_llseek depends on fops0 @
    identifier fops0.fops;
    identifier llseek_f;
    @@
    struct file_operations fops = {
    ...
    .llseek = llseek_f,
    ...
    };

    @ has_read depends on fops0 @
    identifier fops0.fops;
    identifier read_f;
    @@
    struct file_operations fops = {
    ...
    .read = read_f,
    ...
    };

    @ has_write depends on fops0 @
    identifier fops0.fops;
    identifier write_f;
    @@
    struct file_operations fops = {
    ...
    .write = write_f,
    ...
    };

    @ has_open depends on fops0 @
    identifier fops0.fops;
    identifier open_f;
    @@
    struct file_operations fops = {
    ...
    .open = open_f,
    ...
    };

    // use no_llseek if we call nonseekable_open
    ////////////////////////////////////////////
    @ nonseekable1 depends on !has_llseek && has_open @
    identifier fops0.fops;
    identifier nso ~= "nonseekable_open";
    @@
    struct file_operations fops = {
    ... .open = nso, ...
    +.llseek = no_llseek, /* nonseekable */
    };

    @ nonseekable2 depends on !has_llseek @
    identifier fops0.fops;
    identifier open.open_f;
    @@
    struct file_operations fops = {
    ... .open = open_f, ...
    +.llseek = no_llseek, /* open uses nonseekable */
    };

    // use seq_lseek for sequential files
    /////////////////////////////////////
    @ seq depends on !has_llseek @
    identifier fops0.fops;
    identifier sr ~= "seq_read";
    @@
    struct file_operations fops = {
    ... .read = sr, ...
    +.llseek = seq_lseek, /* we have seq_read */
    };

    // use default_llseek if there is a readdir
    ///////////////////////////////////////////
    @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier readdir_e;
    @@
    // any other fop is used that changes pos
    struct file_operations fops = {
    ... .readdir = readdir_e, ...
    +.llseek = default_llseek, /* readdir is present */
    };

    // use default_llseek if at least one of read/write touches f_pos
    /////////////////////////////////////////////////////////////////
    @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read.read_f;
    @@
    // read fops use offset
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = default_llseek, /* read accesses f_pos */
    };

    @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ... .write = write_f, ...
    + .llseek = default_llseek, /* write accesses f_pos */
    };

    // Use noop_llseek if neither read nor write accesses f_pos
    ///////////////////////////////////////////////////////////

    @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    identifier write_no_fpos.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ...
    .write = write_f,
    .read = read_f,
    ...
    +.llseek = noop_llseek, /* read and write both use no f_pos */
    };

    @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write_no_fpos.write_f;
    @@
    struct file_operations fops = {
    ... .write = write_f, ...
    +.llseek = noop_llseek, /* write uses no f_pos */
    };

    @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    @@
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = noop_llseek, /* read uses no f_pos */
    };

    @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    @@
    struct file_operations fops = {
    ...
    +.llseek = noop_llseek, /* no read or write fn */
    };
    ===== End semantic patch =====

    Signed-off-by: Arnd Bergmann
    Cc: Julia Lawall
    Cc: Christoph Hellwig

    Arnd Bergmann
     

11 Oct, 2010

1 commit

  • 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

    Stefan Richter