mt76: report Rx timestamp
authorRyder Lee <ryder.lee@mediatek.com>
Mon, 29 Mar 2021 17:25:00 +0000 (01:25 +0800)
committerFelix Fietkau <nbd@nbd.name>
Mon, 12 Apr 2021 21:07:24 +0000 (23:07 +0200)
Frame reception timestamp (low 32-bits) that indicates the value of the
local TSF timer value at the time the first bit of the MAC header in the
received frame (PPDU unit) arriving at the MAC.

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
15 files changed:
drivers/net/wireless/mediatek/mt76/agg-rx.c
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7603/init.c
drivers/net/wireless/mediatek/mt76/mt7603/mac.c
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7915/init.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h
drivers/net/wireless/mediatek/mt76/mt7921/init.c
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h

index 144e8a8910ba77439792efd061132adb34869e94..72622220051bbc570c1126b0001e0dcf133c9645 100644 (file)
@@ -76,9 +76,9 @@ mt76_rx_aggr_check_release(struct mt76_rx_tid *tid, struct sk_buff_head *frames)
 
                nframes--;
                status = (struct mt76_rx_status *)skb->cb;
-               if (!time_after(jiffies,
-                               status->reorder_time +
-                               mt76_aggr_tid_to_timeo(tid->num)))
+               if (!time_after32(jiffies,
+                                 status->reorder_time +
+                                 mt76_aggr_tid_to_timeo(tid->num)))
                        continue;
 
                mt76_rx_aggr_release_frames(tid, frames, status->seqno);
index ef31026ac9d79c4d9f84df514e5d6ee980056822..29ef15ec22fed3fd283ff0e2d1827661399c8ccb 100644 (file)
@@ -754,6 +754,8 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
        status->signal = mstat.signal;
        status->chains = mstat.chains;
        status->ampdu_reference = mstat.ampdu_ref;
+       status->device_timestamp = mstat.timestamp;
+       status->mactime = mstat.timestamp;
 
        BUILD_BUG_ON(sizeof(mstat) > sizeof(skb->cb));
        BUILD_BUG_ON(sizeof(status->chain_signal) !=
index b09b0f5ffd6d43139ed69fe6af55782f871fb612..d121c176c37c3275d4d28b345d53e2037852f380 100644 (file)
@@ -498,9 +498,10 @@ struct mt76_rx_status {
                u16 wcid_idx;
        };
 
-       unsigned long reorder_time;
+       u32 reorder_time;
 
        u32 ampdu_ref;
+       u32 timestamp;
 
        u8 iv[6];
 
index f0b879c3eba87cd785d48c797493d44012d5f4e9..e1b2cfa56074faa80d143b35a3c3cf2522769fd1 100644 (file)
@@ -548,6 +548,9 @@ int mt7603_register_device(struct mt7603_dev *dev)
        hw->max_report_rates = 7;
        hw->max_rate_tries = 11;
 
+       hw->radiotap_timestamp.units_pos =
+               IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
+
        hw->sta_data_size = sizeof(struct mt7603_sta);
        hw->vif_data_size = sizeof(struct mt7603_vif);
 
index c29b60a878199e87c50b26d992b95a45e439a76c..e3a9dd6fbd87d74836a0cdff5f88f623ca5ec7e8 100644 (file)
@@ -532,20 +532,6 @@ mt7603_mac_fill_rx(struct mt7603_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->ampdu_ref)
-                               dev->ampdu_ref++;
-               }
-               dev->rx_ampdu_ts = rxd[12];
-
-               status->ampdu_ref = dev->ampdu_ref;
-       }
-
        remove_pad = rxd1 & MT_RXD1_NORMAL_HDR_OFFSET;
 
        if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
@@ -579,6 +565,23 @@ mt7603_mac_fill_rx(struct mt7603_dev *dev, struct sk_buff *skb)
                        return -EINVAL;
        }
        if (rxd0 & MT_RXD0_NORMAL_GROUP_2) {
+               status->timestamp = le32_to_cpu(rxd[0]);
+               status->flag |= RX_FLAG_MACTIME_START;
+
+               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 != status->timestamp) {
+                               if (!++dev->ampdu_ref)
+                                       dev->ampdu_ref++;
+                       }
+                       dev->rx_ampdu_ts = status->timestamp;
+
+                       status->ampdu_ref = dev->ampdu_ref;
+               }
+
                rxd += 2;
                if ((u8 *)rxd - skb->data >= skb->len)
                        return -EINVAL;
index b787c56fd8d67edd6a2d3dcbe841f7a4a33c4130..1df5b9fed2bb7dada733ac823d3e262b519ed0db 100644 (file)
@@ -120,7 +120,7 @@ struct mt7603_dev {
        unsigned long last_cca_adj;
 
        u32 ampdu_ref;
-       __le32 rx_ampdu_ts;
+       u32 rx_ampdu_ts;
        u8 rssi_offset[3];
 
        u8 slottime;
index 857fb49189759cd04ebf0e207b254c604240ef2b..1e418740c17bb85e91e1534e5f575a62c78589ba 100644 (file)
@@ -333,6 +333,9 @@ mt7615_init_wiphy(struct ieee80211_hw *hw)
        hw->max_rate_tries = 11;
        hw->netdev_features = NETIF_F_RXCSUM;
 
+       hw->radiotap_timestamp.units_pos =
+               IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
+
        phy->slottime = 9;
 
        hw->sta_data_size = sizeof(struct mt7615_sta);
index 6a1395de3066692668ce7b056bc8e37716514ab3..005c2829d3dfce8099b99c8c7ab41a59460cc7af 100644 (file)
@@ -235,7 +235,6 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
        u32 rxd1 = le32_to_cpu(rxd[1]);
        u32 rxd2 = le32_to_cpu(rxd[2]);
        u32 csum_mask = MT_RXD0_NORMAL_IP_SUM | MT_RXD0_NORMAL_UDP_TCP_SUM;
-       __le32 rxd12 = rxd[12];
        bool unicast, hdr_trans, remove_pad, insert_ccmp_hdr = false;
        int phy_idx;
        int i, idx;
@@ -329,6 +328,23 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
        }
 
        if (rxd0 & MT_RXD0_NORMAL_GROUP_2) {
+               status->timestamp = le32_to_cpu(rxd[0]);
+               status->flag |= RX_FLAG_MACTIME_START;
+
+               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 (phy->rx_ampdu_ts != status->timestamp) {
+                               if (!++phy->ampdu_ref)
+                                       phy->ampdu_ref++;
+                       }
+                       phy->rx_ampdu_ts = status->timestamp;
+
+                       status->ampdu_ref = phy->ampdu_ref;
+               }
+
                rxd += 2;
                if ((u8 *)rxd - skb->data >= skb->len)
                        return -EINVAL;
@@ -372,20 +388,6 @@ static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
        if (!sband->channels)
                return -EINVAL;
 
-       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 (phy->rx_ampdu_ts != rxd12) {
-                       if (!++phy->ampdu_ref)
-                               phy->ampdu_ref++;
-               }
-               phy->rx_ampdu_ts = rxd12;
-
-               status->ampdu_ref = phy->ampdu_ref;
-       }
-
        if (rxd0 & MT_RXD0_NORMAL_GROUP_3) {
                u32 rxdg0 = le32_to_cpu(rxd[0]);
                u32 rxdg1 = le32_to_cpu(rxd[1]);
index dbabdeef4e0b3148b16572601a54343b6b59ee5c..6a50338ec9f57939a3dea7c05146f4e572be7ee1 100644 (file)
@@ -168,7 +168,7 @@ struct mt7615_phy {
        u8 rdd_state;
        int dfs_state;
 
-       __le32 rx_ampdu_ts;
+       u32 rx_ampdu_ts;
        u32 ampdu_ref;
 
        struct mib_stats mib;
index 261f5ab237214a8bf2f1a22dda2b72d853cba768..983ec5276f46254b73bacae8b9418b3b3616c799 100644 (file)
@@ -96,6 +96,9 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
        hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
        hw->netdev_features = NETIF_F_RXCSUM;
 
+       hw->radiotap_timestamp.units_pos =
+               IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
+
        phy->slottime = 9;
 
        hw->sta_data_size = sizeof(struct mt7915_sta);
index 0924ae074db22258dd344266eceea11f6503c9fc..11596e74712a63ad07c92194bf50983e4e3e4328 100644 (file)
@@ -389,19 +389,6 @@ int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
                status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
        }
 
-       if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
-               status->flag |= RX_FLAG_AMPDU_DETAILS;
-
-               /* all subframes of an A-MPDU have the same timestamp */
-               if (phy->rx_ampdu_ts != rxd[14]) {
-                       if (!++phy->ampdu_ref)
-                               phy->ampdu_ref++;
-               }
-               phy->rx_ampdu_ts = rxd[14];
-
-               status->ampdu_ref = phy->ampdu_ref;
-       }
-
        remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
 
        if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
@@ -440,6 +427,22 @@ int mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
        }
 
        if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
+               status->timestamp = le32_to_cpu(rxd[0]);
+               status->flag |= RX_FLAG_MACTIME_START;
+
+               if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
+                       status->flag |= RX_FLAG_AMPDU_DETAILS;
+
+                       /* all subframes of an A-MPDU have the same timestamp */
+                       if (phy->rx_ampdu_ts != status->timestamp) {
+                               if (!++phy->ampdu_ref)
+                                       phy->ampdu_ref++;
+                       }
+                       phy->rx_ampdu_ts = status->timestamp;
+
+                       status->ampdu_ref = phy->ampdu_ref;
+               }
+
                rxd += 2;
                if ((u8 *)rxd - skb->data >= skb->len)
                        return -EINVAL;
index 1160d1bf8a7c3da37b28c5419a698e31322801c8..455c84cd99c22bbe2816188b7ffd29bfb7c583bf 100644 (file)
@@ -142,7 +142,7 @@ struct mt7915_phy {
        u8 rdd_state;
        int dfs_state;
 
-       __le32 rx_ampdu_ts;
+       u32 rx_ampdu_ts;
        u32 ampdu_ref;
 
        struct mib_stats mib;
index b34db6e8d0ae84dfef7ca853f419c14febac1485..5bb0a7b9e9e5de0fc7e75116d83c6c68c48e4372 100644 (file)
@@ -77,6 +77,9 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
        hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
        hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF;
 
+       hw->radiotap_timestamp.units_pos =
+               IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
+
        phy->slottime = 9;
 
        hw->sta_data_size = sizeof(struct mt7921_sta);
index 36eaa9d97f64bd061c054dbced0f4bec8019f9f3..b507f391783020d5fcc9eea74ac01f17e23b4b29 100644 (file)
@@ -370,19 +370,6 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
                status->flag |= RX_FLAG_MMIC_STRIPPED | RX_FLAG_MIC_STRIPPED;
        }
 
-       if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
-               status->flag |= RX_FLAG_AMPDU_DETAILS;
-
-               /* all subframes of an A-MPDU have the same timestamp */
-               if (phy->rx_ampdu_ts != rxd[14]) {
-                       if (!++phy->ampdu_ref)
-                               phy->ampdu_ref++;
-               }
-               phy->rx_ampdu_ts = rxd[14];
-
-               status->ampdu_ref = phy->ampdu_ref;
-       }
-
        remove_pad = FIELD_GET(MT_RXD2_NORMAL_HDR_OFFSET, rxd2);
 
        if (rxd2 & MT_RXD2_NORMAL_MAX_LEN_ERROR)
@@ -414,6 +401,22 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)
        }
 
        if (rxd1 & MT_RXD1_NORMAL_GROUP_2) {
+               status->timestamp = le32_to_cpu(rxd[0]);
+               status->flag |= RX_FLAG_MACTIME_START;
+
+               if (!(rxd2 & MT_RXD2_NORMAL_NON_AMPDU)) {
+                       status->flag |= RX_FLAG_AMPDU_DETAILS;
+
+                       /* all subframes of an A-MPDU have the same timestamp */
+                       if (phy->rx_ampdu_ts != status->timestamp) {
+                               if (!++phy->ampdu_ref)
+                                       phy->ampdu_ref++;
+                       }
+                       phy->rx_ampdu_ts = status->timestamp;
+
+                       status->ampdu_ref = phy->ampdu_ref;
+               }
+
                rxd += 2;
                if ((u8 *)rxd - skb->data >= skb->len)
                        return -EINVAL;
index e4211b049040e7fdf52e7acc68505ebda67c933a..e3d83d3d954c213031a79ef281bc5ec30412de64 100644 (file)
@@ -132,7 +132,7 @@ struct mt7921_phy {
        s16 coverage_class;
        u8 slottime;
 
-       __le32 rx_ampdu_ts;
+       u32 rx_ampdu_ts;
        u32 ampdu_ref;
 
        struct mib_stats mib;