carl9170 firmware: fixup const volatile register access
authorChristian Lamparter <chunkeey@googlemail.com>
Wed, 29 Jun 2011 21:45:38 +0000 (23:45 +0200)
committerChristian Lamparter <chunkeey@googlemail.com>
Wed, 29 Jun 2011 21:52:16 +0000 (23:52 +0200)
Due to heavy usage of all sorts of different optimitations
option, the compiler tries to optimize repeated reads of
const type * away if they are not marked as volatile.
Unfortunately, this breaks the code in several places, as it
causes infinite loops while waiting for hardware to update
BUSY registers.

Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
carlfw/include/io.h
carlfw/include/wl.h
carlfw/src/wlan.c

index f594a3f73e60379c4e126fe751802ab0edfd0ea0..1186af61aa1a372814155b4d988b5a392a33e1b1 100644 (file)
@@ -31,14 +31,14 @@ static inline __inline uint16_t readw(const volatile void *addr)
        return *(const volatile uint16_t *) addr;
 }
 
-static inline __inline void *readp(const volatile void *addr)
+static inline __inline volatile void *readp(const volatile void *addr)
 {
-       return *(void **) addr;
+       return *(volatile void **) addr;
 }
 
 static inline __inline uint32_t readl(const volatile void *addr)
 {
-       return (uint32_t) (const unsigned int *) readp(addr);
+       return *(const volatile unsigned int *) addr;
 }
 
 static inline __inline void writeb(volatile void *addr, const volatile uint8_t val)
@@ -119,10 +119,10 @@ static inline __inline void incl(const volatile uint32_t addr)
 
 static inline __inline uint32_t get(const volatile uint32_t addr)
 {
-       return readl((const volatile void *) addr);
+       return readl((volatile void *) addr);
 }
 
-static inline __inline void *getp(const volatile uint32_t addr)
+static inline __inline volatile void *getp(const volatile uint32_t addr)
 {
        return readp((const volatile void *) addr);
 }
index 7152de0eff8515ab29567bb89cd3e623f116d4d2..9064dcb2c6af35e28691f1f147e27a86be293aec 100644 (file)
@@ -42,17 +42,17 @@ static inline __inline void set_wlan_txq_dma_curr_addr(const unsigned int q, con
        set(AR9170_MAC_REG_DMA_TXQ_CURR_ADDR + (q << 3), v);
 }
 
-static inline __inline struct dma_desc *get_wlan_txq_dma_addr(const unsigned int q)
+static inline __inline volatile struct dma_desc *get_wlan_txq_dma_addr(const unsigned int q)
 {
        return getp(AR9170_MAC_REG_DMA_TXQ_ADDR + (q << 3));
 }
 
-static inline __inline struct dma_desc *get_wlan_txq_addr(const unsigned int q)
+static inline __inline volatile struct dma_desc *get_wlan_txq_addr(const unsigned int q)
 {
        return getp(AR9170_MAC_REG_DMA_TXQ_CURR_ADDR + (q << 3));
 }
 
-static inline __inline struct dma_desc *get_wlan_txq_last_addr(const unsigned int q)
+static inline __inline volatile struct dma_desc *get_wlan_txq_last_addr(const unsigned int q)
 {
        return getp(AR9170_MAC_REG_DMA_TXQ_LAST_ADDR + (q << 2));
 }
index 6c73b4840f5649c7b0cbb6a1597f4df8257c3ce3..bc9ddc12d66975520081baae9395d20f4e6011c6 100644 (file)
@@ -1223,7 +1223,7 @@ static void wlan_check_hang(void)
                }
 
                /* fetch the current DMA queue position */
-               desc = get_wlan_txq_addr(i);
+               desc = (struct dma_desc *)get_wlan_txq_addr(i);
 
                /* Stuck frame detection */
                if (unlikely(DESC_PAYLOAD(desc) == fw.wlan.last_super[i])) {