mt76: move mt76x02_phy_get_min_avg_rssi to mt76 core
authorFelix Fietkau <nbd@nbd.name>
Wed, 5 Dec 2018 16:06:58 +0000 (17:06 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 17 Jan 2019 13:50:15 +0000 (14:50 +0100)
This will be used by mt7603 as well

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h
drivers/net/wireless/mediatek/mt76/mt76x02_util.c
drivers/net/wireless/mediatek/mt76/mt76x2/phy.c
drivers/net/wireless/mediatek/mt76/util.c

index 467b5a6..226f98f 100644 (file)
@@ -548,7 +548,7 @@ mt76_check_ccmp_pn(struct sk_buff *skb)
 }
 
 static void
-mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb)
+mt76_check_sta(struct mt76_dev *dev, struct sk_buff *skb)
 {
        struct mt76_rx_status *status = (struct mt76_rx_status *) skb->cb;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
@@ -567,6 +567,9 @@ mt76_check_ps(struct mt76_dev *dev, struct sk_buff *skb)
 
        sta = container_of((void *) wcid, struct ieee80211_sta, drv_priv);
 
+       ewma_signal_add(&wcid->rssi, status->signal);
+       wcid->inactive_count = 0;
+
        if (!test_bit(MT_WCID_FLAG_CHECK_PS, &wcid->flags))
                return;
 
@@ -626,7 +629,7 @@ void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q,
        __skb_queue_head_init(&frames);
 
        while ((skb = __skb_dequeue(&dev->rx_skb[q])) != NULL) {
-               mt76_check_ps(dev, skb);
+               mt76_check_sta(dev, skb);
                mt76_rx_aggr_reorder(skb, &frames);
        }
 
@@ -660,6 +663,7 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif,
                mt76_txq_init(dev, sta->txq[i]);
        }
 
+       ewma_signal_init(&wcid->rssi);
        rcu_assign_pointer(dev->wcid[wcid->idx], wcid);
 
 out:
index 16b342f..2267163 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/skbuff.h>
 #include <linux/leds.h>
 #include <linux/usb.h>
+#include <linux/average.h>
 #include <net/mac80211.h>
 #include "util.h"
 
@@ -174,6 +175,8 @@ enum mt76_wcid_flags {
 
 #define MT76_N_WCIDS 128
 
+DECLARE_EWMA(signal, 10, 8);
+
 struct mt76_wcid {
        struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS];
 
@@ -181,6 +184,9 @@ struct mt76_wcid {
 
        unsigned long flags;
 
+       struct ewma_signal rssi;
+       int inactive_count;
+
        u8 idx;
        u8 hw_key_idx;
 
@@ -680,6 +686,8 @@ int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 
 struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb);
 
+int mt76_get_min_avg_rssi(struct mt76_dev *dev);
+
 int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                     int *dbm);
 
index b2b38b9..5a4c6f3 100644 (file)
@@ -1077,7 +1077,9 @@ mt76x0_phy_update_channel_gain(struct mt76x02_dev *dev)
        u8 gain_delta;
        int low_gain;
 
-       dev->cal.avg_rssi_all = mt76x02_phy_get_min_avg_rssi(dev);
+       dev->cal.avg_rssi_all = mt76_get_min_avg_rssi(&dev->mt76);
+       if (!dev->cal.avg_rssi_all)
+               dev->cal.avg_rssi_all = -75;
 
        low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) +
                   (dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev));
index 38cd77d..68d01e1 100644 (file)
@@ -656,11 +656,6 @@ int mt76x02_mac_process_rx(struct mt76x02_dev *dev, struct sk_buff *skb,
        status->tid = FIELD_GET(MT_RXWI_TID, tid_sn);
        status->seqno = FIELD_GET(MT_RXWI_SN, tid_sn);
 
-       if (sta) {
-               ewma_signal_add(&sta->rssi, status->signal);
-               sta->inactive_count = 0;
-       }
-
        return mt76x02_mac_process_rate(status, rate);
 }
 
index 735fe96..940c07f 100644 (file)
@@ -18,8 +18,6 @@
 #ifndef __MT76X02_MAC_H
 #define __MT76X02_MAC_H
 
-#include <linux/average.h>
-
 struct mt76x02_dev;
 
 struct mt76x02_tx_status {
@@ -41,8 +39,6 @@ struct mt76x02_vif {
        u8 idx;
 };
 
-DECLARE_EWMA(signal, 10, 8);
-
 struct mt76x02_sta {
        struct mt76_wcid wcid; /* must be first */
 
@@ -50,8 +46,6 @@ struct mt76x02_sta {
        struct mt76x02_tx_status status;
        int n_frames;
 
-       struct ewma_signal rssi;
-       int inactive_count;
 };
 
 #define MT_RXINFO_BA                   BIT(0)
index 977a8e7..a020c75 100644 (file)
@@ -132,53 +132,6 @@ void mt76x02_phy_set_txpower(struct mt76x02_dev *dev, int txp_0, int txp_1)
 }
 EXPORT_SYMBOL_GPL(mt76x02_phy_set_txpower);
 
-int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev)
-{
-       struct mt76x02_sta *sta;
-       struct mt76_wcid *wcid;
-       int i, j, min_rssi = 0;
-       s8 cur_rssi;
-
-       local_bh_disable();
-       rcu_read_lock();
-
-       for (i = 0; i < ARRAY_SIZE(dev->mt76.wcid_mask); i++) {
-               unsigned long mask = dev->mt76.wcid_mask[i];
-
-               if (!mask)
-                       continue;
-
-               for (j = i * BITS_PER_LONG; mask; j++, mask >>= 1) {
-                       if (!(mask & 1))
-                               continue;
-
-                       wcid = rcu_dereference(dev->mt76.wcid[j]);
-                       if (!wcid)
-                               continue;
-
-                       sta = container_of(wcid, struct mt76x02_sta, wcid);
-                       spin_lock(&dev->mt76.rx_lock);
-                       if (sta->inactive_count++ < 5)
-                               cur_rssi = ewma_signal_read(&sta->rssi);
-                       else
-                               cur_rssi = 0;
-                       spin_unlock(&dev->mt76.rx_lock);
-
-                       if (cur_rssi < min_rssi)
-                               min_rssi = cur_rssi;
-               }
-       }
-
-       rcu_read_unlock();
-       local_bh_enable();
-
-       if (!min_rssi)
-               return -75;
-
-       return min_rssi;
-}
-EXPORT_SYMBOL_GPL(mt76x02_phy_get_min_avg_rssi);
-
 void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl)
 {
        int core_val, agc_val;
index 2b316cf..d2971db 100644 (file)
@@ -51,7 +51,6 @@ void mt76x02_limit_rate_power(struct mt76_rate_power *r, int limit);
 int mt76x02_get_max_rate_power(struct mt76_rate_power *r);
 void mt76x02_phy_set_rxpath(struct mt76x02_dev *dev);
 void mt76x02_phy_set_txdac(struct mt76x02_dev *dev);
-int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev);
 void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl);
 void mt76x02_phy_set_band(struct mt76x02_dev *dev, int band,
                          bool primary_upper);
index 59f50a9..0bd23d6 100644 (file)
@@ -250,8 +250,6 @@ int mt76x02_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
        if (vif->type == NL80211_IFTYPE_AP)
                set_bit(MT_WCID_FLAG_CHECK_PS, &msta->wcid.flags);
 
-       ewma_signal_init(&msta->rssi);
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(mt76x02_sta_add);
index c9634a7..e2ee5e4 100644 (file)
@@ -284,7 +284,9 @@ void mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev)
        int low_gain;
        u32 val;
 
-       dev->cal.avg_rssi_all = mt76x02_phy_get_min_avg_rssi(dev);
+       dev->cal.avg_rssi_all = mt76_get_min_avg_rssi(&dev->mt76);
+       if (!dev->cal.avg_rssi_all)
+               dev->cal.avg_rssi_all = -75;
 
        low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) +
                   (dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev));
index 0c35b8d..6242421 100644 (file)
@@ -75,4 +75,46 @@ int mt76_wcid_alloc(unsigned long *mask, int size)
 }
 EXPORT_SYMBOL_GPL(mt76_wcid_alloc);
 
+int mt76_get_min_avg_rssi(struct mt76_dev *dev)
+{
+       struct mt76_wcid *wcid;
+       int i, j, min_rssi = 0;
+       s8 cur_rssi;
+
+       local_bh_disable();
+       rcu_read_lock();
+
+       for (i = 0; i < ARRAY_SIZE(dev->wcid_mask); i++) {
+               unsigned long mask = dev->wcid_mask[i];
+
+               if (!mask)
+                       continue;
+
+               for (j = i * BITS_PER_LONG; mask; j++, mask >>= 1) {
+                       if (!(mask & 1))
+                               continue;
+
+                       wcid = rcu_dereference(dev->wcid[j]);
+                       if (!wcid)
+                               continue;
+
+                       spin_lock(&dev->rx_lock);
+                       if (wcid->inactive_count++ < 5)
+                               cur_rssi = ewma_signal_read(&wcid->rssi);
+                       else
+                               cur_rssi = 0;
+                       spin_unlock(&dev->rx_lock);
+
+                       if (cur_rssi < min_rssi)
+                               min_rssi = cur_rssi;
+               }
+       }
+
+       rcu_read_unlock();
+       local_bh_enable();
+
+       return min_rssi;
+}
+EXPORT_SYMBOL_GPL(mt76_get_min_avg_rssi);
+
 MODULE_LICENSE("Dual BSD/GPL");