--- margi2/cvdv.c 2001/01/22 05:01:52 1.3 +++ margi2/cvdv.c 2001/01/31 14:19:02 1.4 @@ -504,7 +504,8 @@ int DecoderWriteBlock(struct cvdv_cards if (size > 0) { if (!card->use_ring) - MargiSetBuffers(card, 16*65536); + MargiSetBuffers(card, NBBUF* + CHANNELBUFFERSIZE); if (card->startingDVDV || card->startingDVDA) setSCR = 1; @@ -920,14 +921,17 @@ static int PSrelease(struct inode *inode struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16 int channel = MINOR(inode->i_rdev) / MAXDEV; // minor number div. 16 int i, closed; - + int count; + count = ring_read_rest(&(card->rbuf)); + if (count > 0 ) card->DMAABusy = 1; if (card != NULL) { printk(KERN_DEBUG LOGNAME ": -- PSrelease\n"); - if (!card->open[channel]) + if (!card->open[channel]) printk(KERN_DEBUG LOGNAME ": PSrelease - not open: channel %d\n", channel); card->open[channel]--; + //MOD_DEC_USE_COUNT; if (!card->open[channel]) { closed = 1; @@ -938,12 +942,14 @@ static int PSrelease(struct inode *inode printk(KERN_DEBUG LOGNAME ": PSrelease - last close\n"); // flush remaining data - MargiFlush(card); card->channelApos = 0; card->channelBpos = 0; - if ((card->DMAABusy || card->DMABBusy) && (card->intdecodestatus)) { // ongoing DMA? + if ((card->DMAABusy || card->DMABBusy + || count >1000 ) && + (card->intdecodestatus)) { + // ongoing DMA? printk(KERN_DEBUG LOGNAME ": Delayed closing: A=%d B=%d\n", card->DMAABusy, @@ -951,7 +957,8 @@ static int PSrelease(struct inode *inode card->closing = 1; // then delay closing until DMA finished, } else { // otherwise CloseCard(card); // close immediately - L64021Init(card); + printk(KERN_DEBUG LOGNAME + ": closing now\n"); } } }