• Pieter Palmers's avatar
    ieee1394: rawiso: requeue packet for transmission after skipped cycle · cc9429bc
    Pieter Palmers authored
    As it seems, some host controllers have issues that can cause them to
    skip cycles now and then when using large packets. I suspect that this
    is due to DMA not succeeding in time. If the transmit fifo can't contain
    more than one packet (big packets), the DMA should provide a new packet
    each cycle (125us). I am under the impression that my current PCI
    express test system can't guarantee this.
    
    In any case, the patch tries to provide a workaround as follows:
    The DMA program descriptors are modified such that when an error occurs,
    the DMA engine retries the descriptor the next cycle instead of
    stalling. This way no data is lost. The side effect of this is that
    packets are sent with one cycle delay. This however might not be that
    much of a problem for certain protocols (e.g. AM824). If they use
    padding packets for e.g. rate matching they can drop one of those to
    resync the streams.
    
    The amount of skips between two userspace wakeups is counted. This
    number is then propagated to userspace through the upper 16 bits of the
    'dropped' parameter. This allows unmodified userspace applications due
    to the following:
    1) libraw simply passes this dropped parameter to the user application
    2) the meaning of the dropped parameter is: if it's nonzero, something
    bad has happened. The actual value of the parameter at this moment does
    not have a specific meaning.
    
    A libraw client can then retrieve the number of skipped cycles and
    account for them if needed.
    Signed-off-by: default avatarPieter Palmers <pieterp@joow.be>
    Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
    cc9429bc
ohci1394.c 102 KB