]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/mon/mon_dma.c
m32r: Cleanup linker script using new linker script macros.
[karo-tx-linux.git] / drivers / usb / mon / mon_dma.c
index 0a1367b760a00947e72d1b539d3dc9f6e32cd3f5..140cc80bd2b1d085fe438663237be4cfd16ba124 100644 (file)
 #include <linux/usb.h> /* Only needed for declarations in usb_mon.h */
 #include "usb_mon.h"
 
-#ifdef __i386__                /* CONFIG_ARCH_I386 does not exit */
+/*
+ * PC-compatibles, are, fortunately, sufficiently cache-coherent for this.
+ */
+#if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */
 #define MON_HAS_UNMAP 1
 
 #define phys_to_page(phys)     pfn_to_page((phys) >> PAGE_SHIFT)
@@ -45,6 +48,36 @@ char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len)
        local_irq_restore(flags);
        return 0;
 }
+
+void mon_dmapeek_vec(const struct mon_reader_bin *rp,
+    unsigned int offset, dma_addr_t dma_addr, unsigned int length)
+{
+       unsigned long flags;
+       unsigned int step_len;
+       struct page *pg;
+       unsigned char *map;
+       unsigned long page_off, page_len;
+
+       local_irq_save(flags);
+       while (length) {
+               /* compute number of bytes we are going to copy in this page */
+               step_len = length;
+               page_off = dma_addr & (PAGE_SIZE-1);
+               page_len = PAGE_SIZE - page_off;
+               if (page_len < step_len)
+                       step_len = page_len;
+
+               /* copy data and advance pointers */
+               pg = phys_to_page(dma_addr);
+               map = kmap_atomic(pg, KM_IRQ0);
+               offset = mon_copy_to_buff(rp, offset, map + page_off, step_len);
+               kunmap_atomic(map, KM_IRQ0);
+               dma_addr += step_len;
+               length -= step_len;
+       }
+       local_irq_restore(flags);
+}
+
 #endif /* __i386__ */
 
 #ifndef MON_HAS_UNMAP
@@ -52,4 +85,11 @@ char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len)
 {
        return 'D';
 }
-#endif
+
+void mon_dmapeek_vec(const struct mon_reader_bin *rp,
+    unsigned int offset, dma_addr_t dma_addr, unsigned int length)
+{
+       ;
+}
+
+#endif /* MON_HAS_UNMAP */