summaryrefslogtreecommitdiff
path: root/wctdm.c
diff options
context:
space:
mode:
Diffstat (limited to 'wctdm.c')
-rwxr-xr-xwctdm.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/wctdm.c b/wctdm.c
index da6cee6..9e0ff1e 100755
--- a/wctdm.c
+++ b/wctdm.c
@@ -241,7 +241,7 @@ static inline void wcfxs_receiveprep(struct wcfxs *wc, unsigned char ints)
static inline void wcfxs_check_hook(struct wcfxs *wc, int card);
static void wcfxs_stop_dma(struct wcfxs *wc);
-static void wcfxs_start_dma(struct wcfxs *wc);
+static void wcfxs_restart_dma(struct wcfxs *wc);
static void wcfxs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
@@ -259,7 +259,7 @@ static void wcfxs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
/* Restart DMA */
printk("PCI Master abort\n");
wcfxs_stop_dma(wc);
- wcfxs_start_dma(wc);
+ wcfxs_restart_dma(wc);
return;
}
@@ -1069,6 +1069,18 @@ static void wcfxs_start_dma(struct wcfxs *wc)
outb(0x01, wc->ioaddr + WC_OPER);
}
+static void wcfxs_restart_dma(struct wcfxs *wc)
+{
+ int x;
+ /* Reset Master and TDM */
+ outb(0x0f, wc->ioaddr + WC_CNTL);
+ /* Can't really wait, so simulate a wait */
+ for (x=0;x<100;x++)
+ inb(wc->ioaddr + WC_CNTL);
+ outb(0x01, wc->ioaddr + WC_CNTL);
+ outb(0x01, wc->ioaddr + WC_OPER);
+}
+
static void wcfxs_stop_dma(struct wcfxs *wc)
{
outb(0x00, wc->ioaddr + WC_OPER);