dev = container_of(mdev, struct mt76x02_dev, mt76);
        mutex_init(&dev->phy_mutex);
-       atomic_set(&dev->avg_ampdu_len, 1);
 
        return 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));
 
                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;
 
 }
 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,
                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);
 }