Add support to get EHT rate stats from ethtool.
This is the preliminary patch to add EHT support for mt7996.
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 EXPORT_SYMBOL_GPL(mt76_calculate_default_rate);
 
 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
-                        struct mt76_sta_stats *stats)
+                        struct mt76_sta_stats *stats, bool eht)
 {
        int i, ei = wi->initial_stat_idx;
        u64 *data = wi->data;
        data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_EXT_SU];
        data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_TB];
        data[ei++] += stats->tx_mode[MT_PHY_TYPE_HE_MU];
+       if (eht) {
+               data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_SU];
+               data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_TRIG];
+               data[ei++] += stats->tx_mode[MT_PHY_TYPE_EHT_MU];
+       }
 
-       for (i = 0; i < ARRAY_SIZE(stats->tx_bw); i++)
+       for (i = 0; i < (ARRAY_SIZE(stats->tx_bw) - !eht); i++)
                data[ei++] += stats->tx_bw[i];
 
-       for (i = 0; i < 12; i++)
+       for (i = 0; i < (eht ? 14 : 12); i++)
                data[ei++] += stats->tx_mcs[i];
 
        wi->worker_stat_count = ei - wi->initial_stat_idx;
 
 
 struct mt76_sta_stats {
        u64 tx_mode[__MT_PHY_TYPE_MAX];
-       u64 tx_bw[4];           /* 20, 40, 80, 160 */
+       u64 tx_bw[5];           /* 20, 40, 80, 160, 320 */
        u64 tx_nss[4];          /* 1, 2, 3, 4 */
        u64 tx_mcs[16];         /* mcs idx */
        u64 tx_bytes;
 
 void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index);
 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
-                        struct mt76_sta_stats *stats);
+                        struct mt76_sta_stats *stats, bool eht);
 int mt76_skb_adjust_pad(struct sk_buff *skb, int pad);
 int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type,
                           u16 val, u16 offset, void *buf, size_t len);
 
        if (msta->vif->mt76.idx != wi->idx)
                return;
 
-       mt76_ethtool_worker(wi, &msta->wcid.stats);
+       mt76_ethtool_worker(wi, &msta->wcid.stats, false);
 }
 
 static
 
        if (msta->vif->mt76.idx != wi->idx)
                return;
 
-       mt76_ethtool_worker(wi, &msta->wcid.stats);
+       mt76_ethtool_worker(wi, &msta->wcid.stats, false);
 }
 
 static
 
        "v_tx_mode_he_ext_su",
        "v_tx_mode_he_tb",
        "v_tx_mode_he_mu",
+       "v_tx_mode_eht_su",
+       "v_tx_mode_eht_trig",
+       "v_tx_mode_eht_mu",
        "v_tx_bw_20",
        "v_tx_bw_40",
        "v_tx_bw_80",
        "v_tx_bw_160",
+       "v_tx_bw_320",
        "v_tx_mcs_0",
        "v_tx_mcs_1",
        "v_tx_mcs_2",
        "v_tx_mcs_9",
        "v_tx_mcs_10",
        "v_tx_mcs_11",
+       "v_tx_mcs_12",
+       "v_tx_mcs_13",
 };
 
 #define MT7996_SSTATS_LEN ARRAY_SIZE(mt7996_gstrings_stats)
        if (msta->vif->mt76.idx != wi->idx)
                return;
 
-       mt76_ethtool_worker(wi, &msta->stats);
+       mt76_ethtool_worker(wi, &msta->stats, true);
 }
 
 static