mt76: unify channel survey update code
[linux-2.6-microblaze.git] / drivers / net / wireless / mediatek / mt76 / mt7615 / mac.c
index e07ce2c..271f36f 100644 (file)
@@ -41,6 +41,16 @@ static struct mt76_wcid *mt7615_rx_get_wcid(struct mt7615_dev *dev,
        return &sta->vif->sta.wcid;
 }
 
+void mt7615_mac_reset_counters(struct mt7615_dev *dev)
+{
+       int i;
+
+       for (i = 0; i < 4; i++)
+               mt76_rr(dev, MT_TX_AGG_CNT(i));
+
+       memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats));
+}
+
 int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
 {
        struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
@@ -83,6 +93,20 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
                status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
        }
 
+       if (!(rxd2 & (MT_RXD2_NORMAL_NON_AMPDU_SUB |
+                     MT_RXD2_NORMAL_NON_AMPDU))) {
+               status->flag |= RX_FLAG_AMPDU_DETAILS;
+
+               /* all subframes of an A-MPDU have the same timestamp */
+               if (dev->rx_ampdu_ts != rxd[12]) {
+                       if (!++dev->mt76.ampdu_ref)
+                               dev->mt76.ampdu_ref++;
+               }
+               dev->rx_ampdu_ts = rxd[12];
+
+               status->ampdu_ref = dev->mt76.ampdu_ref;
+       }
+
        remove_pad = rxd1 & MT_RXD1_NORMAL_HDR_OFFSET;
 
        if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
@@ -1239,38 +1263,34 @@ void mt7615_update_channel(struct mt76_dev *mdev)
 {
        struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
        struct mt76_channel_state *state;
-       ktime_t cur_time;
-       u32 busy;
-
-       if (!test_bit(MT76_STATE_RUNNING, &mdev->state))
-               return;
 
-       state = mt76_channel_state(mdev, mdev->chandef.chan);
        /* TODO: add DBDC support */
-       busy = mt76_get_field(dev, MT_MIB_SDR16(0), MT_MIB_BUSY_MASK);
-
-       spin_lock_bh(&mdev->cc_lock);
-       cur_time = ktime_get_boottime();
-       state->cc_busy += busy;
-       state->cc_active += ktime_to_us(ktime_sub(cur_time,
-                                                 mdev->survey_time));
-       mdev->survey_time = cur_time;
-       spin_unlock_bh(&mdev->cc_lock);
+       state = mdev->chan_state;
+       state->cc_busy += mt76_get_field(dev, MT_MIB_SDR16(0),
+                                        MT_MIB_BUSY_MASK);
 }
 
 void mt7615_mac_work(struct work_struct *work)
 {
        struct mt7615_dev *dev;
+       int i, idx;
 
        dev = (struct mt7615_dev *)container_of(work, struct mt76_dev,
                                                mac_work.work);
 
        mutex_lock(&dev->mt76.mutex);
-       mt7615_update_channel(&dev->mt76);
+       mt76_update_survey(&dev->mt76);
        if (++dev->mac_work_count == 5) {
                mt7615_mac_scs_check(dev);
                dev->mac_work_count = 0;
        }
+
+       for (i = 0, idx = 0; i < 4; i++) {
+               u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i));
+
+               dev->mt76.aggr_stats[idx++] += val & 0xffff;
+               dev->mt76.aggr_stats[idx++] += val >> 16;
+       }
        mutex_unlock(&dev->mt76.mutex);
 
        mt76_tx_status_check(&dev->mt76, NULL, false);