Re: ath: DMA failed to stop in 10 ms AR_CR=0x00000024AR_DIAG_SW=0x02000020 DMADBG_7=0x00008040

From: Mohammed Shafi
Date: Tue Mar 20 2012 - 03:44:44 EST


> /home/kernel/linux-next/drivers/net/wireless/ath/ath9k/ath9k.o...done.
> (gdb) l *(ath_tx_start+0x284)
> 0xcad4 is in ath_tx_start (drivers/net/wireless/ath/ath9k/xmit.c:1878).
> 1873                    ieee80211_is_data_qos(hdr->frame_control)) {
> 1874                    tidno = ieee80211_get_qos_ctl(hdr)[0] &
> 1875                            IEEE80211_QOS_CTL_TID_MASK;
> 1876                    tid = ATH_AN_2_TID(txctl->an, tidno);
> 1877
> 1878                    WARN_ON(tid->ac->txq != txctl->txq);
> 1879            }
> 1880
> 1881            if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) {
> 1882                    /*
> (gdb

please check with the attached debug patch if tid is 'NULL'


its my theory that tid is not initialized in ath_tx_node_init just after resume.
during suspend ath9k_sta_remove may be called
ieee80211_suspend -> drv_sta_state ->
drv_sta_remove->ath9k_sta_remove->ath_node_detach->ath_tx_node_cleanup

during resume

ieee80211_resume ->
ieee80211_reconfig->drv_sta_state->ath9k_sta_add->ath_node_attach->ath_tx_node_init

now sta.ht_cap.ht_supported should be true. it will be set to true in
assoc_sucess path and then sta_add is called.

let me see if i had missed something or my analysis itself is wrong.

>



--
thanks,
shafi
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 834e6bc..eb22156 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1875,6 +1875,12 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb,
IEEE80211_QOS_CTL_TID_MASK;
tid = ATH_AN_2_TID(txctl->an, tidno);

+ if (!tid) {
+ printk("\ntid is NULL!!!");
+ return;
+ }
+
+
WARN_ON(tid->ac->txq != txctl->txq);
}