ath9k: use correct hw for tx aggregation TX completion
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Tue, 3 Nov 2009 00:08:34 +0000 (16:08 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 11 Nov 2009 22:09:02 +0000 (17:09 -0500)
When ath9k virtual wiphys are used the sc->hw will not always represent
the active hw, instead we need to get it from the skb->cb private
driver area. This ensures the right hw is used to find a sta for
the TX'd skb.

Cc: Jouni.Malinen <Jouni.Malinen@atheros.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/xmit.c

index 8e052f4..6d7f0bc 100644 (file)
@@ -267,7 +267,10 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
        struct ath_node *an = NULL;
        struct sk_buff *skb;
        struct ieee80211_sta *sta;
+       struct ieee80211_hw *hw;
        struct ieee80211_hdr *hdr;
+       struct ieee80211_tx_info *tx_info;
+       struct ath_tx_info_priv *tx_info_priv;
        struct ath_atx_tid *tid = NULL;
        struct ath_buf *bf_next, *bf_last = bf->bf_lastbf;
        struct ath_desc *ds = bf_last->bf_desc;
@@ -280,10 +283,14 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
        skb = bf->bf_mpdu;
        hdr = (struct ieee80211_hdr *)skb->data;
 
+       tx_info = IEEE80211_SKB_CB(skb);
+       tx_info_priv = (struct ath_tx_info_priv *) tx_info->rate_driver_data[0];
+       hw = tx_info_priv->aphy->hw;
+
        rcu_read_lock();
 
        /* XXX: use ieee80211_find_sta! */
-       sta = ieee80211_find_sta_by_hw(sc->hw, hdr->addr1);
+       sta = ieee80211_find_sta_by_hw(hw, hdr->addr1);
        if (!sta) {
                rcu_read_unlock();
                return;