|
@@ -28,6 +28,7 @@
|
|
#include <linux/mm.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/gfp.h>
|
|
#include <linux/gfp.h>
|
|
#include "sound_config.h"
|
|
#include "sound_config.h"
|
|
|
|
+#include "sleep.h"
|
|
|
|
|
|
#define DMAP_FREE_ON_CLOSE 0
|
|
#define DMAP_FREE_ON_CLOSE 0
|
|
#define DMAP_KEEP_ON_CLOSE 1
|
|
#define DMAP_KEEP_ON_CLOSE 1
|
|
@@ -351,8 +352,7 @@ static void dma_reset_output(int dev)
|
|
if (!signal_pending(current) && adev->dmap_out->qlen &&
|
|
if (!signal_pending(current) && adev->dmap_out->qlen &&
|
|
adev->dmap_out->underrun_count == 0){
|
|
adev->dmap_out->underrun_count == 0){
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
- interruptible_sleep_on_timeout(&adev->out_sleeper,
|
|
|
|
- dmabuf_timeout(dmap));
|
|
|
|
|
|
+ oss_broken_sleep_on(&adev->out_sleeper, dmabuf_timeout(dmap));
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
}
|
|
}
|
|
adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
|
|
adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
|
|
@@ -446,7 +446,7 @@ int DMAbuf_sync(int dev)
|
|
long t = dmabuf_timeout(dmap);
|
|
long t = dmabuf_timeout(dmap);
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
/* FIXME: not safe may miss events */
|
|
/* FIXME: not safe may miss events */
|
|
- t = interruptible_sleep_on_timeout(&adev->out_sleeper, t);
|
|
|
|
|
|
+ t = oss_broken_sleep_on(&adev->out_sleeper, t);
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
if (!t) {
|
|
if (!t) {
|
|
adev->dmap_out->flags &= ~DMA_SYNCING;
|
|
adev->dmap_out->flags &= ~DMA_SYNCING;
|
|
@@ -466,7 +466,7 @@ int DMAbuf_sync(int dev)
|
|
while (!signal_pending(current) &&
|
|
while (!signal_pending(current) &&
|
|
adev->d->local_qlen(dev)){
|
|
adev->d->local_qlen(dev)){
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
- interruptible_sleep_on_timeout(&adev->out_sleeper,
|
|
|
|
|
|
+ oss_broken_sleep_on(&adev->out_sleeper,
|
|
dmabuf_timeout(dmap));
|
|
dmabuf_timeout(dmap));
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
spin_lock_irqsave(&dmap->lock,flags);
|
|
}
|
|
}
|
|
@@ -587,8 +587,7 @@ int DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock)
|
|
timeout = dmabuf_timeout(dmap);
|
|
timeout = dmabuf_timeout(dmap);
|
|
|
|
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
spin_unlock_irqrestore(&dmap->lock,flags);
|
|
- timeout = interruptible_sleep_on_timeout(&adev->in_sleeper,
|
|
|
|
- timeout);
|
|
|
|
|
|
+ timeout = oss_broken_sleep_on(&adev->in_sleeper, timeout);
|
|
if (!timeout) {
|
|
if (!timeout) {
|
|
/* FIXME: include device name */
|
|
/* FIXME: include device name */
|
|
err = -EIO;
|
|
err = -EIO;
|
|
@@ -768,8 +767,7 @@ static int output_sleep(int dev, int dontblock)
|
|
timeout_value = dmabuf_timeout(dmap);
|
|
timeout_value = dmabuf_timeout(dmap);
|
|
else
|
|
else
|
|
timeout_value = MAX_SCHEDULE_TIMEOUT;
|
|
timeout_value = MAX_SCHEDULE_TIMEOUT;
|
|
- timeout_value = interruptible_sleep_on_timeout(&adev->out_sleeper,
|
|
|
|
- timeout_value);
|
|
|
|
|
|
+ timeout_value = oss_broken_sleep_on(&adev->out_sleeper, timeout_value);
|
|
if (timeout != MAX_SCHEDULE_TIMEOUT && !timeout_value) {
|
|
if (timeout != MAX_SCHEDULE_TIMEOUT && !timeout_value) {
|
|
printk(KERN_WARNING "Sound: DMA (output) timed out - IRQ/DRQ config error?\n");
|
|
printk(KERN_WARNING "Sound: DMA (output) timed out - IRQ/DRQ config error?\n");
|
|
dma_reset_output(dev);
|
|
dma_reset_output(dev);
|