diff mbox

[ath9k-devel] ath9k, multiple stations, and AMPDUs

Message ID 4C9ADE7E.5070406@candelatech.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Ben Greear Sept. 23, 2010, 4:58 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index c5e7af4..9165ac8 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -977,7 +977,11 @@  static void ath9k_process_rssi(struct ath_common *common,
          * at least one sdata of a wiphy on mac80211 but with ath9k virtual
          * wiphy you'd have to iterate over every wiphy and each sdata.
          */
-       sta = ieee80211_find_sta_by_hw(hw, hdr->addr2);
+       if (is_multicast_ether_addr(hdr->addr1))
+               sta = ieee80211_find_sta_by_hw(hw, hdr->addr2, NULL);
+       else
+               sta = ieee80211_find_sta_by_hw(hw, hdr->addr2, hdr->addr1);
+
         if (sta) {
                 an = (struct ath_node *) sta->drv_priv;
                 if (rx_stats->rs_rssi != ATH9K_RSSI_BAD &&
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 85a7323..6543828 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -329,7 +329,7 @@  static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
         rcu_read_lock();

         /* XXX: use ieee80211_find_sta! */
-       sta = ieee80211_find_sta_by_hw(hw, hdr->addr1);
+       sta = ieee80211_find_sta_by_hw(hw, hdr->addr1, hdr->addr2);
         if (!sta) {
                 rcu_read_unlock();

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 12a49f0..1b2840f 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2419,7 +2419,8 @@  struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif,
   * ieee80211_find_sta_by_hw - find a station on hardware
   *
   * @hw: pointer as obtained from ieee80211_alloc_hw()
- * @addr: station's address
+ * @addr: remote station's address
+ * @addr2: local address (vif->sdata->dev->dev_addr).  Can be NULL for 'any'.
   *
   * This function must be called under RCU lock and the
   * resulting pointer is only valid under RCU lock as well.
@@ -2434,7 +2435,8 @@  struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif,
   * DO NOT USE THIS FUNCTION.
   */
  struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw,
-                                              const u8 *addr);
+                                              const u8 *addr,
+                                              const u8 *localaddr);

  /**
   * ieee80211_sta_block_awake - block station from waking up
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 44e10a9..1ba56a8 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -839,12 +839,18 @@  void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata,
  }

  struct ieee80211_sta *ieee80211_find_sta_by_hw(struct ieee80211_hw *hw,
-                                              const u8 *addr)
+                                              const u8 *addr,
+                                              const u8 *localaddr)
  {
         struct sta_info *sta, *nxt;

-       /* Just return a random station ... first in list ... */
+       /* Just return a random station if localaddr is NULL
+        * ... first in list.
+        */
         for_each_sta_info(hw_to_local(hw), addr, sta, nxt) {
+               if (localaddr &&
+                   memcmp(sta->sdata->dev->dev_addr, localaddr, ETH_ALEN) != 0)
+                       continue;
                 if (!sta->uploaded)
                         return NULL;
                 return &sta->sta;