moved plx9080 dma abort routine from cb_pcidas64 driver into plx9080 header
authorFrank Mori Hess <fmhess@speakeasy.net>
Sat, 15 Feb 2003 17:45:17 +0000 (17:45 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Sat, 15 Feb 2003 17:45:17 +0000 (17:45 +0000)
comedi/drivers/cb_pcidas64.c
comedi/drivers/plx9080.h

index 47da819cb04b9ecde196acbb00bd41c5a721e6e5..cb8442366523956d506bae8823e8cb102fa63476 100644 (file)
@@ -289,7 +289,7 @@ enum calibration_contents
  *  2 : 5V
  *  3 : 0.5V
  *  4 : 0.05V
- *  5 : ground or 0.005V?
+ *  5 : ground
  *  6 : dac channel 0
  *  7 : dac channel 1
  */
@@ -2453,54 +2453,12 @@ static void handle_interrupt(int irq, void *d, struct pt_regs *regs)
 
 void abort_dma(comedi_device *dev, unsigned int channel)
 {
-       unsigned long dma_cs_addr;
-       uint8_t dma_status;
-       const int timeout = 10000;
-       unsigned int i;
        unsigned long flags;
 
-       if(channel)
-               dma_cs_addr = priv(dev)->plx9080_iobase + PLX_DMA1_CS_REG;
-       else
-               dma_cs_addr = priv(dev)->plx9080_iobase + PLX_DMA0_CS_REG;
-
        // spinlock for plx dma control/status reg
        comedi_spin_lock_irqsave( &dev->spinlock, flags );
 
-       // abort dma transfer if necessary
-       dma_status = readb(dma_cs_addr);
-       if((dma_status & PLX_DMA_EN_BIT) == 0)
-       {
-               comedi_spin_unlock_irqrestore( &dev->spinlock, flags );
-               return;
-       }
-
-       // wait to make sure done bit is zero
-       for(i = 0; (dma_status & PLX_DMA_DONE_BIT) && i < timeout; i++)
-       {
-               dma_status = readb(dma_cs_addr);
-               udelay(1);
-       }
-       if(i == timeout)
-       {
-               rt_printk("cb_pcidas64: cancel() timed out waiting for dma %i done clear\n", channel);
-               comedi_spin_unlock_irqrestore( &dev->spinlock, flags );
-               return;
-       }
-       // disable channel
-       writeb(0, dma_cs_addr);
-       udelay(1);
-       // abort channel
-       writeb(PLX_DMA_ABORT_BIT, dma_cs_addr);
-       // wait for dma done bit
-       dma_status = readb(dma_cs_addr);
-       for(i = 0; (dma_status & PLX_DMA_DONE_BIT) == 0 && i < timeout; i++)
-       {
-               udelay(1);
-               dma_status = readb(dma_cs_addr);
-       }
-       if(i == timeout)
-               rt_printk("cb_pcidas64: cancel() timed out waiting for dma %i done set\n", channel);
+       plx9080_abort_dma( priv( dev )->plx9080_iobase, channel );
 
        comedi_spin_unlock_irqrestore( &dev->spinlock, flags );
 }
@@ -2514,7 +2472,7 @@ static int ai_cancel(comedi_device *dev, comedi_subdevice *s)
        {
                comedi_spin_unlock_irqrestore( &dev->spinlock, flags );
                return 0;
-       } 
+       }
        priv(dev)->ai_cmd_running = 0;
        comedi_spin_unlock_irqrestore( &dev->spinlock, flags );
 
index f779a5dbd6bc626e1b22f7f4611b3d64fb0025cf..6e738381cc345f24f452daa6c3681e2e29090f51 100644 (file)
@@ -1,16 +1,15 @@
 /* plx9080.h
+ *
+ * Copyright (C) 2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net>
  *
  * I modified this file from the plx9060.h header for the
  * wanXL device driver in the linux kernel,
- * for the register offsets and bit definitions.  Minor modifications,
+ * for the register offsets and bit definitions.  Made minor modifications,
  * added plx9080 registers and
- * stripped out stuff that was specifically for the wanXL driver.  I
- * use this for the plx9080 chip used in the cards supported by
- * the cb_pcidas64.c driver.
- * Frank Mori Hess
+ * stripped out stuff that was specifically for the wanXL driver.
+ *
  ********************************************************************
  *
- * SBE wanXL device driver
  * Copyright (C) 1999 RG Studio s.c., http://www.rgstudio.com.pl/
  * Written by Krzysztof Halasa <khc@rgstudio.com.pl>
  *
@@ -357,4 +356,55 @@ struct plx_dma_desc
 #define MBX_ADDR_SPACE_360 0x80        /* wanXL100s/200/400 */
 #define MBX_ADDR_MASK_360 (MBX_ADDR_SPACE_360-1)
 
+static inline int plx9080_abort_dma( unsigned long iobase, unsigned int channel )
+{
+       unsigned long dma_cs_addr;
+       uint8_t dma_status;
+       const int timeout = 10000;
+       unsigned int i;
+
+       if( channel )
+               dma_cs_addr = iobase + PLX_DMA1_CS_REG;
+       else
+               dma_cs_addr = iobase + PLX_DMA0_CS_REG;
+
+       // abort dma transfer if necessary
+       dma_status = readb( dma_cs_addr );
+       if( ( dma_status & PLX_DMA_EN_BIT ) == 0 )
+       {
+               return 0;
+       }
+
+       // wait to make sure done bit is zero
+       for( i = 0; ( dma_status & PLX_DMA_DONE_BIT ) && i < timeout; i++ )
+       {
+               dma_status = readb( dma_cs_addr );
+               udelay( 1 );
+       }
+       if( i == timeout )
+       {
+               rt_printk("plx9080: cancel() timed out waiting for dma %i done clear\n", channel);
+               return -ETIMEDOUT;
+       }
+       // disable channel
+       writeb( 0, dma_cs_addr );
+       udelay( 1 );
+       // abort channel
+       writeb( PLX_DMA_ABORT_BIT, dma_cs_addr );
+       // wait for dma done bit
+       dma_status = readb( dma_cs_addr );
+       for( i = 0; ( dma_status & PLX_DMA_DONE_BIT ) == 0 && i < timeout; i++ )
+       {
+               udelay( 1 );
+               dma_status = readb( dma_cs_addr );
+       }
+       if( i == timeout )
+       {
+               rt_printk("plx9080: cancel() timed out waiting for dma %i done set\n", channel);
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
 #endif /* __COMEDI_PLX9080_H */