ath5k: Check RXE when setting RXDP
authorNick Kossifidis <mickflemm@gmail.com>
Tue, 23 Nov 2010 18:52:24 +0000 (20:52 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 30 Nov 2010 18:52:32 +0000 (13:52 -0500)
 * Make sure we are not trying to set RXDP while RX is active,
 for now ignore the return value.

Signed-off-by: Nick Kossifidis <mickflemm@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/dma.c

index 629a5eebe302fc4f775a49929787c6e92e369223..b36d3a53025808f7839485d95a31024f57b69037 100644 (file)
@@ -1168,7 +1168,7 @@ void ath5k_hw_set_clockrate(struct ath5k_hw *ah);
 void ath5k_hw_start_rx_dma(struct ath5k_hw *ah);
 int ath5k_hw_stop_rx_dma(struct ath5k_hw *ah);
 u32 ath5k_hw_get_rxdp(struct ath5k_hw *ah);
-void ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr);
+int ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr);
 int ath5k_hw_start_tx_dma(struct ath5k_hw *ah, unsigned int queue);
 int ath5k_hw_stop_tx_dma(struct ath5k_hw *ah, unsigned int queue);
 u32 ath5k_hw_get_txdp(struct ath5k_hw *ah, unsigned int queue);
index bfdfcff42a1e95270bd730fad047bae4b77c240d..3fe634f588c2dd7cbe723a1f1d1b775d2e143d41 100644 (file)
@@ -95,11 +95,18 @@ u32 ath5k_hw_get_rxdp(struct ath5k_hw *ah)
  * @ah: The &struct ath5k_hw
  * @phys_addr: RX descriptor address
  *
- * XXX: Should we check if rx is enabled before setting rxdp ?
+ * Returns -EIO if rx is active
  */
-void ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr)
+int ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr)
 {
+       if (ath5k_hw_reg_read(ah, AR5K_CR) & AR5K_CR_RXE) {
+               ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_DMA,
+                               "tried to set RXDP while rx was active !\n");
+               return -EIO;
+       }
+
        ath5k_hw_reg_write(ah, phys_addr, AR5K_RXDP);
+       return 0;
 }