update madwifi to latest trunk, include a few more fixes/improvements
[openwrt-10.03/.git] / package / madwifi / patches / 326-soc_dma.patch
diff --git a/package/madwifi/patches/326-soc_dma.patch b/package/madwifi/patches/326-soc_dma.patch
new file mode 100644 (file)
index 0000000..8ac6187
--- /dev/null
@@ -0,0 +1,82 @@
+Index: madwifi-trunk-r3280/ath/if_ath_ahb.c
+===================================================================
+--- madwifi-trunk-r3280.orig/ath/if_ath_ahb.c  2008-01-28 19:12:37.022826852 +0100
++++ madwifi-trunk-r3280/ath/if_ath_ahb.c       2008-01-28 19:31:09.184472483 +0100
+@@ -69,27 +69,13 @@
+ void *
+ bus_alloc_consistent(void *hwdev, size_t size, dma_addr_t *dma_handle)
+ {
+-      void *ret;
+-
+-      ret = (void *) __get_free_pages(GFP_ATOMIC, get_order(size));
+-
+-      if (ret != NULL) {
+-              memset(ret, 0, size);
+-              *dma_handle = __pa(ret);
+-              dma_cache_wback_inv((unsigned long) ret, size);
+-              ret = UNCAC_ADDR(ret);
+-      }
+-
+-      return ret;
++      return dma_alloc_coherent(hwdev, size, dma_handle, GFP_ATOMIC);
+ }
+ void
+ bus_free_consistent(void *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
+ {
+-      unsigned long addr = (unsigned long) vaddr;
+-
+-      addr = CAC_ADDR(addr);
+-      free_pages(addr, get_order(size));
++      dma_free_coherent(hwdev, size, vaddr, dma_handle);
+ }
+ static int
+Index: madwifi-trunk-r3280/ath/if_ath_ahb.h
+===================================================================
+--- madwifi-trunk-r3280.orig/ath/if_ath_ahb.h  2008-01-28 19:20:06.016413537 +0100
++++ madwifi-trunk-r3280/ath/if_ath_ahb.h       2008-01-28 19:30:40.978865135 +0100
+@@ -89,8 +89,8 @@
+ #define AR531X_RADIO1_MASK    0x000c
+ #define AR531X_RADIO1_S               2
+-#define BUS_DMA_FROMDEVICE    0
+-#define BUS_DMA_TODEVICE      1
++#define BUS_DMA_FROMDEVICE    DMA_FROM_DEVICE
++#define BUS_DMA_TODEVICE      DMA_TO_DEVICE
+ #define AR531X_APBBASE                0xbc000000
+ #define AR531X_RESETTMR               (AR531X_APBBASE  + 0x3000)
+@@ -115,29 +115,19 @@
+ static __inline void bus_dma_sync_single(void *hwdev, dma_addr_t dma_handle,
+       size_t size, int direction)
+ {
+-      unsigned long addr;
+-
+-      addr = (unsigned long) __va(dma_handle);
+-      dma_cache_wback_inv(addr, size);
++      dma_sync_single(hwdev, dma_handle, size, direction);
+ }
+ static __inline dma_addr_t bus_map_single(void *hwdev, void *ptr,
+       size_t size, int direction)
+ {
+-      dma_cache_wback_inv((unsigned long) ptr, size);
+-
+-      return __pa(ptr);
++      return dma_map_single(hwdev, ptr, size, direction);
+ }
+ static __inline void bus_unmap_single(void *hwdev, dma_addr_t dma_addr,
+       size_t size, int direction)
+ {
+-      if (direction != BUS_DMA_TODEVICE) {
+-              unsigned long addr;
+-
+-              addr = (unsigned long)__va(dma_addr);
+-              dma_cache_wback_inv(addr, size);
+-      }
++      dma_unmap_single(hwdev, dma_addr, size, direction);
+ }
+ void *bus_alloc_consistent(void *, size_t, dma_addr_t *);
+ void bus_free_consistent(void *, size_t, void *, dma_addr_t);