14 Feb, 2010

1 commit

  • In isochronous transmit DMA descriptors, link the skip address pointer
    back to the descriptor itself. When a cycle is lost, the controller
    will send the packet in the next cycle, instead of terminating the
    entire DMA program.

    There are two reasons for this:

    * This behaviour is compatible with the old IEEE1394 stack. Old
    applications would not expect the DMA program to stop in this case.

    * Since the OHCI driver does not report any uncompleted packets, the
    context would stop silently; clients would not have any chance to
    detect and handle this error without a watchdog timer.

    Signed-off-by: Clemens Ladisch

    Pieter Palmers notes:

    "The reason I added this retry behavior to the old stack is because some
    cards now and then fail to send a packet (e.g. the o2micro card in my
    dell laptop). I couldn't figure out why exactly this happens, my best
    guess is that the card cannot fetch the payload data on time. This
    happens much more frequently when sending large packets, which leads me
    to suspect that there are some contention issues with the DMA that fills
    the transmit FIFO.

    In the old stack it was a pretty critical issue as it resulted in a
    freeze of the userspace application.

    The omission of a packet doesn't necessarily have to be an issue. E.g.
    in IEC61883 streams the DBC field can be used to detect discontinuities
    in the stream. So as long as the other side doesn't bail when no
    [packet] is present in a cycle, there is not really a problem.

    I'm not convinced though that retrying is the proper solution, but it is
    simple and effective for what it had to do. And I think there are no
    reasons not to do it this way. Userspace can still detect this by
    checking the cycle the descriptor was sent in."

    Signed-off-by: Stefan Richter (changelog, comment)

    Clemens Ladisch
     

28 Jan, 2010

1 commit

  • Unsurprisingly, Texas Instruments TSB43AB23 exhibits the same behaviour
    as TSB43AB22/A in dual buffer IR DMA mode: If descriptors are located
    at physical addresses above the 31 bit address range (2 GB), the
    controller will overwrite random memory. With luck, this merely
    prevents video reception. With only a little less luck, the machine
    crashes.

    We use the same workaround here as with TSB43AB22/A: Switch off the
    dual buffer capability flag and use packet-per-buffer IR DMA instead.
    Another possible workaround would be to limit the coherent DMA mask to
    31 bits.

    In Linux 2.6.33, this change serves effectively only as documentation
    since dual buffer mode is not used for any controller anymore. But
    somebody might want to re-enable it in the future to make use of
    features of dual buffer DMA that are not available in packet-per-buffer
    mode.

    In Linux 2.6.32 and older, this update is vital for anyone with this
    controller, more than 2 GB RAM, a 64 bit kernel, and FireWire video or
    audio applications.

    We have at least four reports:
    http://bugzilla.kernel.org/show_bug.cgi?id=13808
    http://marc.info/?l=linux1394-user&m=126154279004083
    https://bugzilla.redhat.com/show_bug.cgi?id=552142
    http://marc.info/?l=linux1394-user&m=126432246128386

    Reported-by: Paul Johnson
    Reported-by: Ronneil Camara
    Reported-by: G Zornetzer
    Reported-by: Mark Thompson
    Cc: stable@kernel.org
    Signed-off-by: Stefan Richter

    Stefan Richter
     

30 Dec, 2009

1 commit

  • This is a minimal change meant for the short term: Never set the
    ohci->use_dualbuffer flag to true.

    There are two reasons to do so:

    - Packet-per-buffer mode and dual-buffer mode do not behave the same
    under certain circumstances, notably if several packets are covered
    by a single fw_cdev_iso_packet descriptor.
    http://marc.info/?l=linux1394-devel&m=124965653718313
    Therefore the driver stack should not silently choose one or the
    other mode but should leave the choice to the high-level driver
    (regardless if kernel driver or userspace driver). Or simply always
    only offer packet-per-buffer mode, since a considerable number of
    controllers, even current ones, does not offer dual-buffer support.

    - Even under circumstances where packet-per-buffer mode and
    dual-buffer mode behave exactly the same --- notably when used
    through libraw1394, libdc1394, as well as the current two kernel
    drivers which use isochronous reception (firewire-net and firedtv)
    --- we are still faced with the problem that several OHCI 1.1
    controllers have bugs in dual-buffer mode. Although it looks like
    we have identified most of those buggy controllers by now, we
    cannot be quite sure about that.

    So, use packet-per-buffer by default from now on. This change should
    be followed up by a more complete solution: Either extend the
    in-kernel API and the userspace ABI by a choice between the two IR modes
    or remove all dual-buffer related code from firewire-ohci.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

12 Dec, 2009

2 commits


09 Dec, 2009

1 commit

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
    ieee1394: Use hweight32
    firewire: cdev: reduce stack usage by ioctl_dispatch
    firewire: ohci: 0 may be a valid DMA address
    firewire: core: WARN on wrong usage of core transaction functions
    firewire: core: optimize Topology Map creation
    firewire: core: clarify generate_config_rom usage
    firewire: optimize config ROM creation
    firewire: cdev: normalize variable names
    firewire: normalize style of queue_work wrappers
    firewire: cdev: fix memory leak in an error path

    Linus Torvalds
     

21 Nov, 2009

1 commit

  • Here is the final set of patches I used to get ffado to work with the
    new firewire stack. With these patches, I was able to start ardour
    and record from and playback to my PreSonus Inspire1394 from a
    (mostly) Fedora 12 system.

    Signed-off-by: Jay Fenlason

    Until now, firewire-ohci exposed only the transmit cycle of the last
    transmitted packet at each isochronous transmit complete event. This
    made it impossible for FFADO (FireWire audio drivers in userspace) to
    synchronize audio-out streams. The fix is to store the timestamp of
    each packet in the iso xmit event. As a bonus, the transfer status is
    stored too.

    Signed-off-by: Stefan Richter

    Jay Fenlason
     

19 Nov, 2009

1 commit

  • Calling the START_ISO ioctl with a nonnegative cycle paramater has
    never worked. Last night I got around to figuring out why. Most of
    this patch is a big comment explaining why we enable an interrupt
    source then don't actually do anything when we get one. As the
    comment says, we should do more, but we don't have a way to tell
    userspace what happened. . .

    Signed-off-by: Jay Fenlason
    Signed-off-by: Stefan Richter (edited comment)

    Jay Fenlason
     

31 Oct, 2009

1 commit

  • I was told that there are obscure architectures with non-coherent DMA
    which may DMA-map to bus address 0. We shall not use 0 as a magic
    number of uninitialized bus address variables.

    The packet->payload_length > 0 test cannot be used either (except in
    at_context_queue_packet) because local requests are not DMA-mapped
    regardless of payload_length. Hence add a state flag to struct
    fw_packet.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

15 Oct, 2009

1 commit

  • The config ROM image of the local node was created in CPU byte order,
    then a temporary big endian copy was created to compute the CRC, and
    finally the card driver created its own big endian copy.

    We now generate it in big endian byte order in the first place to avoid
    one byte order conversion and the temporary on-stack copy of the ROM
    image (1000 bytes stack usage in process context). Furthermore, two
    1000 bytes memset()s are replaced by one 1000 bytes - ROM length sized
    memset.

    The trivial fw_memcpy_{from,to}_be32() helpers are now superfluous and
    removed. The newly added __compute_block_crc() function will be folded
    into fw_compute_block_crc() in a subsequent change.

    Signed-off-by: Stefan Richter

    Stefan Richter
     

12 Sep, 2009

1 commit

  • The selfIDSize field of Self ID Count is 9 bits wide, and we are only
    interested in the high 8 bits. Fix the mask accordingly. The
    previously too large mask didn't do damage though because the next few
    bits in the register are reserved and therefore zero with presently
    existing hardware.

    Also, check for the maximum possible self ID count of 252 (according to
    OHCI 1.1 clause 11.2 and IEEE 1394a-2000 clause 4.3.4.1, i.e. up to four
    self IDs of up to 63 nodes, even though IEEE 1394 up to edition 2008
    defines only up to three self IDs per node). More than 252 self IDs
    would only happen if the self ID receive DMA unit malfunctioned, which
    would likely be caught by other self ID buffer checks. However, check
    it early to be sure. More than 253 quadlets would overflow the Topology
    Map CSR.

    Reported-By: PaX Team
    Signed-off-by: Stefan Richter

    Stefan Richter
     

05 Sep, 2009

2 commits

  • In dual-buffer DMA mode, no video frames are ever received from R5C832
    by libdc1394. Fallback to packet-per-buffer DMA works reliably.
    http://thread.gmane.org/gmane.linux.kernel.firewire.devel/13393/focus=13476

    Reported-by: Jonathan Cameron
    Signed-off-by: Stefan Richter

    Stefan Richter
     
  • An Agere FW643 OHCI 1.1 card works fine for video reception from one
    camera but fails early if receiving from two cameras. After a short
    while, no IR IRQ events occur and the context control register does not
    react anymore. This happens regardless whether both IR DMA contexts are
    dual-buffer or one is dual-buffer and the other packet-per-buffer.

    This can be worked around by disabling dual buffer DMA mode entirely.
    http://sourceforge.net/mailarchive/message.php?msg_name=4A7C0594.2020208%40gmail.com
    (Reported by Samuel Audet.)

    In another report (by Jonathan Cameron), an FW643 works OK with two
    cameras in dual buffer mode. Whether this is due to different chip
    revisions or different usage patterns (different video formats) is not
    yet clear. However, as far as the current capabilities of
    firewire-core's isochronous I/O interface are concerned, simply
    switching off dual-buffer on non-working and working FW643s alike is not
    a problem in practice. We only need to revisit this issue if we are
    going to enhance the interface, e.g. so that applications can explicitly
    choose modes.

    Reported-by: Samuel Audet
    Reported-by: Jonathan Cameron
    Signed-off-by: Stefan Richter

    Stefan Richter
     

05 Jun, 2009

1 commit

  • The source files of firewire-core, firewire-ohci, firewire-sbp2, i.e.
    "drivers/firewire/fw-*.c"
    are renamed to
    "drivers/firewire/core-*.c",
    "drivers/firewire/ohci.c",
    "drivers/firewire/sbp2.c".

    The old fw- prefix was redundant to the directory name. The new core-
    prefix distinguishes the files according to which driver they belong to.

    This change comes a little late, but still before further firewire
    drivers are added as anticipated RSN.

    Signed-off-by: Stefan Richter

    Stefan Richter