From 50d50d189a357a9c8b3e453a3e724ee2e382414e Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Wed, 24 Mar 2010 07:10:54 +0100 Subject: [PATCH] --- yaml --- r: 188931 b: refs/heads/master c: 1c583063a5c769fe2ec604752e383972c69e6d9b h: refs/heads/master i: 188929: 158b969356ed07687aec76fb52bded549f8f5704 188927: 7056ffa98e2521b71508afa7844e7cee4ee8f370 v: v3 --- [refs] | 2 +- trunk/sound/pci/cmipci.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 9a7dd475abf3..c30711cdab87 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fc8aa7b16a5fcfe9c6d0be9bb587f1fcedd9145f +refs/heads/master: 1c583063a5c769fe2ec604752e383972c69e6d9b diff --git a/trunk/sound/pci/cmipci.c b/trunk/sound/pci/cmipci.c index 1ded64e05643..329968edca9b 100644 --- a/trunk/sound/pci/cmipci.c +++ b/trunk/sound/pci/cmipci.c @@ -941,13 +941,21 @@ static snd_pcm_uframes_t snd_cmipci_pcm_pointer(struct cmipci *cm, struct cmipci struct snd_pcm_substream *substream) { size_t ptr; - unsigned int reg; + unsigned int reg, rem, tries; + if (!rec->running) return 0; #if 1 // this seems better.. reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; - ptr = rec->dma_size - (snd_cmipci_read_w(cm, reg) + 1); - ptr >>= rec->shift; + for (tries = 0; tries < 3; tries++) { + rem = snd_cmipci_read_w(cm, reg); + if (rem < rec->dma_size) + goto ok; + } + printk(KERN_ERR "cmipci: invalid PCM pointer: %#x\n", rem); + return SNDRV_PCM_POS_XRUN; +ok: + ptr = (rec->dma_size - (rem + 1)) >> rec->shift; #else reg = rec->ch ? CM_REG_CH1_FRAME1 : CM_REG_CH0_FRAME1; ptr = snd_cmipci_read(cm, reg) - rec->offset;