mt76x0: use mt76x02_mac_work as stats handler
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Mon, 15 Oct 2018 09:33:15 +0000 (11:33 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 30 Nov 2018 11:21:39 +0000 (12:21 +0100)
Use mt76x02_mac_work utility routine as stats workqueue handler
and remove duplicated code. Moreover run mac stuck check in
mt76x02_mac_work for client interfaces.
Remove no longer used avg_ampdu_len and mt76x02_mac_stats data
structure in mt76x02_dev

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/init.c
drivers/net/wireless/mediatek/mt76/mt76x0/mac.c
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
drivers/net/wireless/mediatek/mt76/mt76x02.h
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c

index f90ef4d..f5c7db9 100644 (file)
@@ -339,7 +339,6 @@ mt76x0_alloc_device(struct device *pdev,
 
        dev = container_of(mdev, struct mt76x02_dev, mt76);
        mutex_init(&dev->phy_mutex);
-       atomic_set(&dev->avg_ampdu_len, 1);
 
        return dev;
 }
@@ -378,7 +377,7 @@ int mt76x0_register_device(struct mt76x02_dev *dev)
 
        wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
 
-       INIT_DELAYED_WORK(&dev->mac_work, mt76x0_mac_work);
+       INIT_DELAYED_WORK(&dev->mac_work, mt76x02_mac_work);
 
        ret = mt76_register_device(mdev, true, mt76x02_rates,
                                   ARRAY_SIZE(mt76x02_rates));
index 9cabe8e..98d4a97 100644 (file)
@@ -105,74 +105,6 @@ void mt76x0_mac_config_tsf(struct mt76x02_dev *dev, bool enable, int interval)
                MT_BEACON_TIME_CFG_TBTT_EN;
 }
 
-static void mt76x0_check_mac_err(struct mt76x02_dev *dev)
-{
-       u32 val = mt76_rr(dev, 0x10f4);
-
-       if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5))))
-               return;
-
-       dev_err(dev->mt76.dev, "Error: MAC specific condition occurred\n");
-
-       mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
-       udelay(10);
-       mt76_clear(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
-}
-void mt76x0_mac_work(struct work_struct *work)
-{
-       struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
-                                              mac_work.work);
-       struct {
-               u32 addr_base;
-               u32 span;
-               u64 *stat_base;
-       } spans[] = {
-               { MT_RX_STAT_0, 3,      dev->stats.rx_stat },
-               { MT_TX_STA_0,  3,      dev->stats.tx_stat },
-               { MT_TX_AGG_STAT,       1,      dev->stats.aggr_stat },
-               { MT_MPDU_DENSITY_CNT,  1,      dev->stats.zero_len_del },
-               { MT_TX_AGG_CNT_BASE0,  8,      &dev->stats.aggr_n[0] },
-               { MT_TX_AGG_CNT_BASE1,  8,      &dev->stats.aggr_n[16] },
-       };
-       u32 sum, n;
-       int i, j, k;
-
-       mt76x02_update_channel(&dev->mt76);
-
-       /* Note: using MCU_RANDOM_READ is actually slower then reading all the
-        *       registers by hand.  MCU takes ca. 20ms to complete read of 24
-        *       registers while reading them one by one will takes roughly
-        *       24*200us =~ 5ms.
-        */
-
-       k = 0;
-       n = 0;
-       sum = 0;
-       for (i = 0; i < ARRAY_SIZE(spans); i++)
-               for (j = 0; j < spans[i].span; j++) {
-                       u32 val = mt76_rr(dev, spans[i].addr_base + j * 4);
-
-                       spans[i].stat_base[j * 2] += val & 0xffff;
-                       spans[i].stat_base[j * 2 + 1] += val >> 16;
-
-                       /* Calculate average AMPDU length */
-                       if (spans[i].addr_base != MT_TX_AGG_CNT_BASE0 &&
-                           spans[i].addr_base != MT_TX_AGG_CNT_BASE1)
-                               continue;
-
-                       n += (val >> 16) + (val & 0xffff);
-                       sum += (val & 0xffff) * (1 + k * 2) +
-                               (val >> 16) * (2 + k * 2);
-                       k++;
-               }
-
-       atomic_set(&dev->avg_ampdu_len, n ? DIV_ROUND_CLOSEST(sum, n) : 1);
-
-       mt76x0_check_mac_err(dev);
-
-       ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mac_work, 10 * HZ);
-}
-
 void mt76x0_mac_set_ampdu_factor(struct mt76x02_dev *dev)
 {
        struct ieee80211_sta *sta;
index b9743b5..85de821 100644 (file)
@@ -69,7 +69,6 @@ void mt76x0_phy_set_txpower(struct mt76x02_dev *dev);
 void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);
 
 /* MAC */
-void mt76x0_mac_work(struct work_struct *work);
 void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
                                int ht_mode);
 void mt76x0_mac_set_short_preamble(struct mt76x02_dev *dev, bool short_preamb);
index 5872130..bdbe4bb 100644 (file)
 
 #define MT_CALIBRATE_INTERVAL  HZ
 
-struct mt76x02_mac_stats {
-       u64 rx_stat[6];
-       u64 tx_stat[6];
-       u64 aggr_stat[2];
-       u64 aggr_n[32];
-       u64 zero_len_del[2];
-};
-
 #define MT_MAX_CHAINS          2
 struct mt76x02_rx_freq_cal {
        s8 high_gain[MT_MAX_CHAINS];
@@ -85,8 +77,6 @@ struct mt76x02_dev {
        struct delayed_work cal_work;
        struct delayed_work mac_work;
 
-       struct mt76x02_mac_stats stats;
-       atomic_t avg_ampdu_len;
        u32 aggr_stats[32];
 
        struct sk_buff *beacons[8];
index c7666f4..3896da6 100644 (file)
@@ -754,6 +754,21 @@ void mt76x02_update_channel(struct mt76_dev *mdev)
 }
 EXPORT_SYMBOL_GPL(mt76x02_update_channel);
 
+static void mt76x02_check_mac_err(struct mt76x02_dev *dev)
+{
+       u32 val = mt76_rr(dev, 0x10f4);
+
+       if (!(val & BIT(29)) || !(val & (BIT(7) | BIT(5))))
+               return;
+
+       dev_err(dev->mt76.dev, "mac specific condition occurred\n");
+
+       mt76_set(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_RESET_CSR);
+       udelay(10);
+       mt76_clear(dev, MT_MAC_SYS_CTRL,
+                  MT_MAC_SYS_CTRL_ENABLE_TX | MT_MAC_SYS_CTRL_ENABLE_RX);
+}
+
 void mt76x02_mac_work(struct work_struct *work)
 {
        struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
@@ -768,6 +783,10 @@ void mt76x02_mac_work(struct work_struct *work)
                dev->aggr_stats[idx++] += val >> 16;
        }
 
+       /* XXX: check beacon stuck for ap mode */
+       if (!dev->beacon_mask)
+               mt76x02_check_mac_err(dev);
+
        ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,
                                     MT_CALIBRATE_INTERVAL);
 }