• David Moore's avatar
    firewire: fw-ohci: Dynamically allocate buffers for DMA descriptors · fe5ca634
    David Moore authored
    Previously, the fw-ohci driver used fixed-length buffers for storing
    descriptors for isochronous receive DMA programs.  If an application
    (such as libdc1394) generated a DMA program that was too large, fw-ohci
    would reach the limit of its fixed-sized buffer and return an error to
    userspace.
    
    This patch replaces the fixed-length ring-buffer with a linked-list of
    page-sized buffers.  Additional buffers can be dynamically allocated and
    appended to the list when necessary.  For a particular context, buffers
    are kept around after use and reused as necessary, so there is no
    allocation taking place after the DMA program is generated for the first
    time.
    
    In addition, the buffers it uses are coherent for DMA so there is no
    syncing required before and after writes.  This syncing wasn't properly
    done in the previous version of the code.
    
    -
    
    This is the fourth version of my patch that replaces a fixed-length
    buffer for DMA descriptors with a dynamically allocated linked-list of
    buffers.
    
    As we discovered with the last attempt, new context programs are
    sometimes queued from interrupt context, making it unacceptable to call
    tasklet_disable() from context_get_descriptors().
    
    This version of the patch uses ohci->lock for all locking needs instead
    of tasklet_disable/enable.  There is a new requirement that
    context_get_descriptors() be called while holding ohci->lock.  It was
    already held for the AT context, so adding the requirement for the iso
    context did not seem particularly onerous.  In addition, this has the
    side benefit of allowing iso queue to be safely called from concurrent
    user-space threads, which previously was not safe.
    Signed-off-by: default avatarDavid Moore <dcm@acm.org>
    Signed-off-by: default avatarKristian Høgsberg <krh@redhat.com>
    Signed-off-by: default avatarJarod Wilson <jwilson@redhat.com>
    
    -
    
    Fixes the following issues:
      - Isochronous reception stopped prematurely if an application used a
        larger buffer.  (Reproduced with coriander.)
      - Isochronous reception stopped after one or a few frames on VT630x
        in OHCI 1.0 mode.  (Fixes reception in coriander, but dvgrab still
        doesn't work with these chips.)
    
    Patch update: struct member alignment, whitespace nits
    Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
    fe5ca634
fw-ohci.c 60.9 KB