> /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); }