unsigned char b_DmaDoubleBuffer;        /*  we can use double buffering */
        unsigned int ui_DmaActualBuffer;        /*  which buffer is used now */
        unsigned short *ul_DmaBufferVirtual[2]; /*  pointers to DMA buffer */
-       unsigned int ul_DmaBufferHw[2]; /*  hw address of DMA buff */
+       dma_addr_t ul_DmaBufferHw[2];           /*  hw address of DMA buff */
        unsigned int ui_DmaBufferSize[2];       /*  size of dma buffer in bytes */
        unsigned int ui_DmaBufferUsesize[2];    /*  which size we may now used for transfer */
-       unsigned int ui_DmaBufferPageOrder[2];  /*  log2 of pages in buffer */
        unsigned char b_DigitalOutputRegister;  /*  Digital Output Register */
        unsigned char b_OutputMemoryStatus;
        unsigned char b_TimerSelectMode;        /*  Contain data written at iobase + 0C */
 
        for (i = 0; i < 2; i++) {
                for (order = 2; order >= 0; order--) {
                        devpriv->ul_DmaBufferVirtual[i] =
-                           (void *)__get_free_pages(GFP_KERNEL, order);
+                           dma_alloc_coherent(dev->hw_dev, PAGE_SIZE << order,
+                                              &devpriv->ul_DmaBufferHw[i],
+                                              GFP_KERNEL);
 
                        if (devpriv->ul_DmaBufferVirtual[i])
                                break;
                }
                if (!devpriv->ul_DmaBufferVirtual[i])
                        break;
-               devpriv->ui_DmaBufferPageOrder[i] = order;
                devpriv->ui_DmaBufferSize[i] = PAGE_SIZE << order;
-               devpriv->ul_DmaBufferHw[i] =
-                   virt_to_bus(devpriv->ul_DmaBufferVirtual[i]);
        }
        if (!devpriv->ul_DmaBufferVirtual[0])
                devpriv->us_UseDma = 0;
                apci3120_reset(dev);
        comedi_pci_detach(dev);
        if (devpriv) {
-               if (devpriv->ul_DmaBufferVirtual[0]) {
-                       free_pages((unsigned long)devpriv->
-                               ul_DmaBufferVirtual[0],
-                               devpriv->ui_DmaBufferPageOrder[0]);
-               }
-               if (devpriv->ul_DmaBufferVirtual[1]) {
-                       free_pages((unsigned long)devpriv->
-                               ul_DmaBufferVirtual[1],
-                               devpriv->ui_DmaBufferPageOrder[1]);
+               unsigned int i;
+
+               for (i = 0; i < 2; i++) {
+                       if (devpriv->ul_DmaBufferVirtual[i]) {
+                               dma_free_coherent(dev->hw_dev,
+                                                 devpriv->ui_DmaBufferSize[i],
+                                                 devpriv->
+                                                 ul_DmaBufferVirtual[i],
+                                                 devpriv->ul_DmaBufferHw[i]);
+                       }
                }
        }
 }