• Krzysztof Helt's avatar
    ALSA: snd_dma_pointer workaround for chipsets with buggy DMA · 8066e51a
    Krzysztof Helt authored
    The chipsets with the isa_dma_bridge_buggy set do not stop DMA during
    DMA counter reads. The DMA counter is read in two 8-bit read steps
    on x86 platform. Sometimes, such reads happen during higher byte
    change so the lower byte is already decremented (rolled over) but
    the higher byte is not. It introduces an error that position is
    moved 256 bytes ahead of the true position. Thus, the next DMA
    position read can return a lower value then the previous read.
    If the DMA position is decreased (reversed) the ALSA subsystem is
    tricked into the playback underrun error and resets the playback.
    It results in a "pop" during a playback.
    
    Work around the issue by reading the counter twice and choosing a higher
    value.
    Signed-off-by: default avatarKrzysztof Helt <krzysztof.h1@wp.pl>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    8066e51a
isadma.c 3 KB