linux/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
<<
>>
Prefs
   1// SPDX-License-Identifier: ISC
   2/* Copyright (C) 2020 MediaTek Inc. */
   3
   4#include <linux/firmware.h>
   5#include <linux/fs.h>
   6#include "mt7915.h"
   7#include "mcu.h"
   8#include "mac.h"
   9#include "eeprom.h"
  10
  11struct mt7915_patch_hdr {
  12        char build_date[16];
  13        char platform[4];
  14        __be32 hw_sw_ver;
  15        __be32 patch_ver;
  16        __be16 checksum;
  17        u16 reserved;
  18        struct {
  19                __be32 patch_ver;
  20                __be32 subsys;
  21                __be32 feature;
  22                __be32 n_region;
  23                __be32 crc;
  24                u32 reserved[11];
  25        } desc;
  26} __packed;
  27
  28struct mt7915_patch_sec {
  29        __be32 type;
  30        __be32 offs;
  31        __be32 size;
  32        union {
  33                __be32 spec[13];
  34                struct {
  35                        __be32 addr;
  36                        __be32 len;
  37                        __be32 sec_key_idx;
  38                        __be32 align_len;
  39                        u32 reserved[9];
  40                } info;
  41        };
  42} __packed;
  43
  44struct mt7915_fw_trailer {
  45        u8 chip_id;
  46        u8 eco_code;
  47        u8 n_region;
  48        u8 format_ver;
  49        u8 format_flag;
  50        u8 reserved[2];
  51        char fw_ver[10];
  52        char build_date[15];
  53        u32 crc;
  54} __packed;
  55
  56struct mt7915_fw_region {
  57        __le32 decomp_crc;
  58        __le32 decomp_len;
  59        __le32 decomp_blk_sz;
  60        u8 reserved[4];
  61        __le32 addr;
  62        __le32 len;
  63        u8 feature_set;
  64        u8 reserved1[15];
  65} __packed;
  66
  67#define MCU_PATCH_ADDRESS               0x200000
  68
  69#define FW_FEATURE_SET_ENCRYPT          BIT(0)
  70#define FW_FEATURE_SET_KEY_IDX          GENMASK(2, 1)
  71#define FW_FEATURE_OVERRIDE_ADDR        BIT(5)
  72
  73#define DL_MODE_ENCRYPT                 BIT(0)
  74#define DL_MODE_KEY_IDX                 GENMASK(2, 1)
  75#define DL_MODE_RESET_SEC_IV            BIT(3)
  76#define DL_MODE_WORKING_PDA_CR4         BIT(4)
  77#define DL_MODE_NEED_RSP                BIT(31)
  78
  79#define FW_START_OVERRIDE               BIT(0)
  80#define FW_START_WORKING_PDA_CR4        BIT(2)
  81
  82#define PATCH_SEC_TYPE_MASK             GENMASK(15, 0)
  83#define PATCH_SEC_TYPE_INFO             0x2
  84
  85#define to_wcid_lo(id)                  FIELD_GET(GENMASK(7, 0), (u16)id)
  86#define to_wcid_hi(id)                  FIELD_GET(GENMASK(9, 8), (u16)id)
  87
  88#define HE_PHY(p, c)                    u8_get_bits(c, IEEE80211_HE_PHY_##p)
  89#define HE_MAC(m, c)                    u8_get_bits(c, IEEE80211_HE_MAC_##m)
  90
  91static enum mcu_cipher_type
  92mt7915_mcu_get_cipher(int cipher)
  93{
  94        switch (cipher) {
  95        case WLAN_CIPHER_SUITE_WEP40:
  96                return MCU_CIPHER_WEP40;
  97        case WLAN_CIPHER_SUITE_WEP104:
  98                return MCU_CIPHER_WEP104;
  99        case WLAN_CIPHER_SUITE_TKIP:
 100                return MCU_CIPHER_TKIP;
 101        case WLAN_CIPHER_SUITE_AES_CMAC:
 102                return MCU_CIPHER_BIP_CMAC_128;
 103        case WLAN_CIPHER_SUITE_CCMP:
 104                return MCU_CIPHER_AES_CCMP;
 105        case WLAN_CIPHER_SUITE_CCMP_256:
 106                return MCU_CIPHER_CCMP_256;
 107        case WLAN_CIPHER_SUITE_GCMP:
 108                return MCU_CIPHER_GCMP;
 109        case WLAN_CIPHER_SUITE_GCMP_256:
 110                return MCU_CIPHER_GCMP_256;
 111        case WLAN_CIPHER_SUITE_SMS4:
 112                return MCU_CIPHER_WAPI;
 113        default:
 114                return MCU_CIPHER_NONE;
 115        }
 116}
 117
 118static u8 mt7915_mcu_chan_bw(struct cfg80211_chan_def *chandef)
 119{
 120        static const u8 width_to_bw[] = {
 121                [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
 122                [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
 123                [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
 124                [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
 125                [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
 126                [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
 127                [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
 128                [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
 129        };
 130
 131        if (chandef->width >= ARRAY_SIZE(width_to_bw))
 132                return 0;
 133
 134        return width_to_bw[chandef->width];
 135}
 136
 137static const struct ieee80211_sta_he_cap *
 138mt7915_get_he_phy_cap(struct mt7915_phy *phy, struct ieee80211_vif *vif)
 139{
 140        struct ieee80211_supported_band *sband;
 141        enum nl80211_band band;
 142
 143        band = phy->mt76->chandef.chan->band;
 144        sband = phy->mt76->hw->wiphy->bands[band];
 145
 146        return ieee80211_get_he_iftype_cap(sband, vif->type);
 147}
 148
 149static u8
 150mt7915_get_phy_mode(struct ieee80211_vif *vif, struct ieee80211_sta *sta)
 151{
 152        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 153        enum nl80211_band band = mvif->phy->mt76->chandef.chan->band;
 154        struct ieee80211_sta_ht_cap *ht_cap;
 155        struct ieee80211_sta_vht_cap *vht_cap;
 156        const struct ieee80211_sta_he_cap *he_cap;
 157        u8 mode = 0;
 158
 159        if (sta) {
 160                ht_cap = &sta->ht_cap;
 161                vht_cap = &sta->vht_cap;
 162                he_cap = &sta->he_cap;
 163        } else {
 164                struct ieee80211_supported_band *sband;
 165
 166                sband = mvif->phy->mt76->hw->wiphy->bands[band];
 167
 168                ht_cap = &sband->ht_cap;
 169                vht_cap = &sband->vht_cap;
 170                he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
 171        }
 172
 173        if (band == NL80211_BAND_2GHZ) {
 174                mode |= PHY_MODE_B | PHY_MODE_G;
 175
 176                if (ht_cap->ht_supported)
 177                        mode |= PHY_MODE_GN;
 178
 179                if (he_cap->has_he)
 180                        mode |= PHY_MODE_AX_24G;
 181        } else if (band == NL80211_BAND_5GHZ) {
 182                mode |= PHY_MODE_A;
 183
 184                if (ht_cap->ht_supported)
 185                        mode |= PHY_MODE_AN;
 186
 187                if (vht_cap->vht_supported)
 188                        mode |= PHY_MODE_AC;
 189
 190                if (he_cap->has_he)
 191                        mode |= PHY_MODE_AX_5G;
 192        }
 193
 194        return mode;
 195}
 196
 197static u8
 198mt7915_mcu_get_sta_nss(u16 mcs_map)
 199{
 200        u8 nss;
 201
 202        for (nss = 8; nss > 0; nss--) {
 203                u8 nss_mcs = (mcs_map >> (2 * (nss - 1))) & 3;
 204
 205                if (nss_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED)
 206                        break;
 207        }
 208
 209        return nss - 1;
 210}
 211
 212static void
 213mt7915_mcu_set_sta_he_mcs(struct ieee80211_sta *sta, __le16 *he_mcs,
 214                          const u16 *mask)
 215{
 216        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
 217        struct cfg80211_chan_def *chandef = &msta->vif->phy->mt76->chandef;
 218        int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
 219        u16 mcs_map;
 220
 221        switch (chandef->width) {
 222        case NL80211_CHAN_WIDTH_80P80:
 223                mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80p80);
 224                break;
 225        case NL80211_CHAN_WIDTH_160:
 226                mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_160);
 227                break;
 228        default:
 229                mcs_map = le16_to_cpu(sta->he_cap.he_mcs_nss_supp.rx_mcs_80);
 230                break;
 231        }
 232
 233        for (nss = 0; nss < max_nss; nss++) {
 234                int mcs;
 235
 236                switch ((mcs_map >> (2 * nss)) & 0x3) {
 237                case IEEE80211_HE_MCS_SUPPORT_0_11:
 238                        mcs = GENMASK(11, 0);
 239                        break;
 240                case IEEE80211_HE_MCS_SUPPORT_0_9:
 241                        mcs = GENMASK(9, 0);
 242                        break;
 243                case IEEE80211_HE_MCS_SUPPORT_0_7:
 244                        mcs = GENMASK(7, 0);
 245                        break;
 246                default:
 247                        mcs = 0;
 248                }
 249
 250                mcs = mcs ? fls(mcs & mask[nss]) - 1 : -1;
 251
 252                switch (mcs) {
 253                case 0 ... 7:
 254                        mcs = IEEE80211_HE_MCS_SUPPORT_0_7;
 255                        break;
 256                case 8 ... 9:
 257                        mcs = IEEE80211_HE_MCS_SUPPORT_0_9;
 258                        break;
 259                case 10 ... 11:
 260                        mcs = IEEE80211_HE_MCS_SUPPORT_0_11;
 261                        break;
 262                default:
 263                        mcs = IEEE80211_HE_MCS_NOT_SUPPORTED;
 264                        break;
 265                }
 266                mcs_map &= ~(0x3 << (nss * 2));
 267                mcs_map |= mcs << (nss * 2);
 268
 269                /* only support 2ss on 160MHz */
 270                if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
 271                        break;
 272        }
 273
 274        *he_mcs = cpu_to_le16(mcs_map);
 275}
 276
 277static void
 278mt7915_mcu_set_sta_vht_mcs(struct ieee80211_sta *sta, __le16 *vht_mcs,
 279                           const u16 *mask)
 280{
 281        u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
 282        int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
 283        u16 mcs;
 284
 285        for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
 286                switch (mcs_map & 0x3) {
 287                case IEEE80211_VHT_MCS_SUPPORT_0_9:
 288                        mcs = GENMASK(9, 0);
 289                        break;
 290                case IEEE80211_VHT_MCS_SUPPORT_0_8:
 291                        mcs = GENMASK(8, 0);
 292                        break;
 293                case IEEE80211_VHT_MCS_SUPPORT_0_7:
 294                        mcs = GENMASK(7, 0);
 295                        break;
 296                default:
 297                        mcs = 0;
 298                }
 299
 300                vht_mcs[nss] = cpu_to_le16(mcs & mask[nss]);
 301
 302                /* only support 2ss on 160MHz */
 303                if (nss > 1 && (sta->bandwidth == IEEE80211_STA_RX_BW_160))
 304                        break;
 305        }
 306}
 307
 308static void
 309mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
 310                          const u8 *mask)
 311{
 312        int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
 313
 314        for (nss = 0; nss < max_nss; nss++)
 315                ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
 316}
 317
 318static int
 319mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
 320                          struct sk_buff *skb, int seq)
 321{
 322        struct mt7915_mcu_rxd *rxd;
 323        int ret = 0;
 324
 325        if (!skb) {
 326                dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
 327                        cmd, seq);
 328                return -ETIMEDOUT;
 329        }
 330
 331        rxd = (struct mt7915_mcu_rxd *)skb->data;
 332        if (seq != rxd->seq)
 333                return -EAGAIN;
 334
 335        if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
 336                skb_pull(skb, sizeof(*rxd) - 4);
 337                ret = *skb->data;
 338        } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
 339                skb_pull(skb, sizeof(*rxd) + 4);
 340                ret = le32_to_cpu(*(__le32 *)skb->data);
 341        } else {
 342                skb_pull(skb, sizeof(struct mt7915_mcu_rxd));
 343        }
 344
 345        return ret;
 346}
 347
 348static int
 349mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
 350                        int cmd, int *wait_seq)
 351{
 352        struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
 353        struct mt7915_mcu_txd *mcu_txd;
 354        enum mt76_mcuq_id qid;
 355        __le32 *txd;
 356        u32 val;
 357        u8 seq;
 358
 359        /* TODO: make dynamic based on msg type */
 360        mdev->mcu.timeout = 20 * HZ;
 361
 362        seq = ++dev->mt76.mcu.msg_seq & 0xf;
 363        if (!seq)
 364                seq = ++dev->mt76.mcu.msg_seq & 0xf;
 365
 366        if (cmd == MCU_CMD(FW_SCATTER)) {
 367                qid = MT_MCUQ_FWDL;
 368                goto exit;
 369        }
 370
 371        mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
 372        if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
 373                qid = MT_MCUQ_WA;
 374        else
 375                qid = MT_MCUQ_WM;
 376
 377        txd = mcu_txd->txd;
 378
 379        val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
 380              FIELD_PREP(MT_TXD0_PKT_FMT, MT_TX_TYPE_CMD) |
 381              FIELD_PREP(MT_TXD0_Q_IDX, MT_TX_MCU_PORT_RX_Q0);
 382        txd[0] = cpu_to_le32(val);
 383
 384        val = MT_TXD1_LONG_FORMAT |
 385              FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD);
 386        txd[1] = cpu_to_le32(val);
 387
 388        mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
 389        mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU,
 390                                               MT_TX_MCU_PORT_RX_Q0));
 391        mcu_txd->pkt_type = MCU_PKT_ID;
 392        mcu_txd->seq = seq;
 393
 394        mcu_txd->cid = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
 395        mcu_txd->set_query = MCU_Q_NA;
 396        mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
 397        if (mcu_txd->ext_cid) {
 398                mcu_txd->ext_cid_ack = 1;
 399
 400                /* do not use Q_SET for efuse */
 401                if (cmd & __MCU_CMD_FIELD_QUERY)
 402                        mcu_txd->set_query = MCU_Q_QUERY;
 403                else
 404                        mcu_txd->set_query = MCU_Q_SET;
 405        }
 406
 407        if (cmd & __MCU_CMD_FIELD_WA)
 408                mcu_txd->s2d_index = MCU_S2D_H2C;
 409        else
 410                mcu_txd->s2d_index = MCU_S2D_H2N;
 411
 412exit:
 413        if (wait_seq)
 414                *wait_seq = seq;
 415
 416        return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
 417}
 418
 419static void
 420mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
 421{
 422        struct {
 423                __le32 args[3];
 424        } req = {
 425                .args = {
 426                        cpu_to_le32(a1),
 427                        cpu_to_le32(a2),
 428                        cpu_to_le32(a3),
 429                },
 430        };
 431
 432        mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
 433}
 434
 435static void
 436mt7915_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
 437{
 438        if (vif->csa_active)
 439                ieee80211_csa_finish(vif);
 440}
 441
 442static void
 443mt7915_mcu_rx_csa_notify(struct mt7915_dev *dev, struct sk_buff *skb)
 444{
 445        struct mt76_phy *mphy = &dev->mt76.phy;
 446        struct mt7915_mcu_csa_notify *c;
 447
 448        c = (struct mt7915_mcu_csa_notify *)skb->data;
 449
 450        if (c->band_idx && dev->mt76.phy2)
 451                mphy = dev->mt76.phy2;
 452
 453        ieee80211_iterate_active_interfaces_atomic(mphy->hw,
 454                        IEEE80211_IFACE_ITER_RESUME_ALL,
 455                        mt7915_mcu_csa_finish, mphy->hw);
 456}
 457
 458static void
 459mt7915_mcu_rx_thermal_notify(struct mt7915_dev *dev, struct sk_buff *skb)
 460{
 461        struct mt76_phy *mphy = &dev->mt76.phy;
 462        struct mt7915_mcu_thermal_notify *t;
 463        struct mt7915_phy *phy;
 464
 465        t = (struct mt7915_mcu_thermal_notify *)skb->data;
 466        if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE)
 467                return;
 468
 469        if (t->ctrl.band_idx && dev->mt76.phy2)
 470                mphy = dev->mt76.phy2;
 471
 472        phy = (struct mt7915_phy *)mphy->priv;
 473        phy->throttle_state = t->ctrl.duty.duty_cycle;
 474}
 475
 476static void
 477mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)
 478{
 479        struct mt76_phy *mphy = &dev->mt76.phy;
 480        struct mt7915_mcu_rdd_report *r;
 481
 482        r = (struct mt7915_mcu_rdd_report *)skb->data;
 483
 484        if (r->band_idx && dev->mt76.phy2)
 485                mphy = dev->mt76.phy2;
 486
 487        ieee80211_radar_detected(mphy->hw);
 488        dev->hw_pattern++;
 489}
 490
 491static int
 492mt7915_mcu_tx_rate_parse(struct mt76_phy *mphy, struct mt7915_mcu_ra_info *ra,
 493                         struct rate_info *rate, u16 r)
 494{
 495        struct ieee80211_supported_band *sband;
 496        u16 ru_idx = le16_to_cpu(ra->ru_idx);
 497        bool cck = false;
 498
 499        rate->mcs = FIELD_GET(MT_RA_RATE_MCS, r);
 500        rate->nss = FIELD_GET(MT_RA_RATE_NSS, r) + 1;
 501
 502        switch (FIELD_GET(MT_RA_RATE_TX_MODE, r)) {
 503        case MT_PHY_TYPE_CCK:
 504                cck = true;
 505                fallthrough;
 506        case MT_PHY_TYPE_OFDM:
 507                if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
 508                        sband = &mphy->sband_5g.sband;
 509                else
 510                        sband = &mphy->sband_2g.sband;
 511
 512                rate->mcs = mt76_get_rate(mphy->dev, sband, rate->mcs, cck);
 513                rate->legacy = sband->bitrates[rate->mcs].bitrate;
 514                break;
 515        case MT_PHY_TYPE_HT:
 516        case MT_PHY_TYPE_HT_GF:
 517                rate->mcs += (rate->nss - 1) * 8;
 518                if (rate->mcs > 31)
 519                        return -EINVAL;
 520
 521                rate->flags = RATE_INFO_FLAGS_MCS;
 522                if (ra->gi)
 523                        rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
 524                break;
 525        case MT_PHY_TYPE_VHT:
 526                if (rate->mcs > 9)
 527                        return -EINVAL;
 528
 529                rate->flags = RATE_INFO_FLAGS_VHT_MCS;
 530                if (ra->gi)
 531                        rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
 532                break;
 533        case MT_PHY_TYPE_HE_SU:
 534        case MT_PHY_TYPE_HE_EXT_SU:
 535        case MT_PHY_TYPE_HE_TB:
 536        case MT_PHY_TYPE_HE_MU:
 537                if (ra->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11)
 538                        return -EINVAL;
 539
 540                rate->he_gi = ra->gi;
 541                rate->he_dcm = FIELD_GET(MT_RA_RATE_DCM_EN, r);
 542                rate->flags = RATE_INFO_FLAGS_HE_MCS;
 543                break;
 544        default:
 545                return -EINVAL;
 546        }
 547
 548        if (ru_idx) {
 549                switch (ru_idx) {
 550                case 1 ... 2:
 551                        rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_996;
 552                        break;
 553                case 3 ... 6:
 554                        rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_484;
 555                        break;
 556                case 7 ... 14:
 557                        rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_242;
 558                        break;
 559                default:
 560                        rate->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106;
 561                        break;
 562                }
 563                rate->bw = RATE_INFO_BW_HE_RU;
 564        } else {
 565                u8 bw = mt7915_mcu_chan_bw(&mphy->chandef) -
 566                        FIELD_GET(MT_RA_RATE_BW, r);
 567
 568                switch (bw) {
 569                case IEEE80211_STA_RX_BW_160:
 570                        rate->bw = RATE_INFO_BW_160;
 571                        break;
 572                case IEEE80211_STA_RX_BW_80:
 573                        rate->bw = RATE_INFO_BW_80;
 574                        break;
 575                case IEEE80211_STA_RX_BW_40:
 576                        rate->bw = RATE_INFO_BW_40;
 577                        break;
 578                default:
 579                        rate->bw = RATE_INFO_BW_20;
 580                        break;
 581                }
 582        }
 583
 584        return 0;
 585}
 586
 587static void
 588mt7915_mcu_tx_rate_report(struct mt7915_dev *dev, struct sk_buff *skb)
 589{
 590        struct mt7915_mcu_ra_info *ra = (struct mt7915_mcu_ra_info *)skb->data;
 591        struct rate_info rate = {}, prob_rate = {};
 592        u16 probe = le16_to_cpu(ra->prob_up_rate);
 593        u16 attempts = le16_to_cpu(ra->attempts);
 594        u16 curr = le16_to_cpu(ra->curr_rate);
 595        u16 wcidx = le16_to_cpu(ra->wlan_idx);
 596        struct ieee80211_tx_status status = {};
 597        struct mt76_phy *mphy = &dev->mphy;
 598        struct mt7915_sta_stats *stats;
 599        struct mt7915_sta *msta;
 600        struct mt76_wcid *wcid;
 601
 602        if (wcidx >= MT76_N_WCIDS)
 603                return;
 604
 605        wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
 606        if (!wcid)
 607                return;
 608
 609        msta = container_of(wcid, struct mt7915_sta, wcid);
 610        stats = &msta->stats;
 611
 612        if (msta->wcid.ext_phy && dev->mt76.phy2)
 613                mphy = dev->mt76.phy2;
 614
 615        /* current rate */
 616        if (!mt7915_mcu_tx_rate_parse(mphy, ra, &rate, curr))
 617                stats->tx_rate = rate;
 618
 619        /* probing rate */
 620        if (!mt7915_mcu_tx_rate_parse(mphy, ra, &prob_rate, probe))
 621                stats->prob_rate = prob_rate;
 622
 623        if (attempts) {
 624                u16 success = le16_to_cpu(ra->success);
 625
 626                stats->per = 1000 * (attempts - success) / attempts;
 627        }
 628
 629        status.sta = wcid_to_sta(wcid);
 630        if (!status.sta)
 631                return;
 632
 633        status.rate = &stats->tx_rate;
 634        ieee80211_tx_status_ext(mphy->hw, &status);
 635}
 636
 637static void
 638mt7915_mcu_rx_log_message(struct mt7915_dev *dev, struct sk_buff *skb)
 639{
 640        struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
 641        const char *data = (char *)&rxd[1];
 642        const char *type;
 643
 644        switch (rxd->s2d_index) {
 645        case 0:
 646                type = "WM";
 647                break;
 648        case 2:
 649                type = "WA";
 650                break;
 651        default:
 652                type = "unknown";
 653                break;
 654        }
 655
 656        wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
 657                   (int)(skb->len - sizeof(*rxd)), data);
 658}
 659
 660static void
 661mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
 662{
 663        struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
 664
 665        switch (rxd->ext_eid) {
 666        case MCU_EXT_EVENT_THERMAL_PROTECT:
 667                mt7915_mcu_rx_thermal_notify(dev, skb);
 668                break;
 669        case MCU_EXT_EVENT_RDD_REPORT:
 670                mt7915_mcu_rx_radar_detected(dev, skb);
 671                break;
 672        case MCU_EXT_EVENT_CSA_NOTIFY:
 673                mt7915_mcu_rx_csa_notify(dev, skb);
 674                break;
 675        case MCU_EXT_EVENT_RATE_REPORT:
 676                mt7915_mcu_tx_rate_report(dev, skb);
 677                break;
 678        case MCU_EXT_EVENT_FW_LOG_2_HOST:
 679                mt7915_mcu_rx_log_message(dev, skb);
 680                break;
 681        default:
 682                break;
 683        }
 684}
 685
 686static void
 687mt7915_mcu_rx_unsolicited_event(struct mt7915_dev *dev, struct sk_buff *skb)
 688{
 689        struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
 690
 691        switch (rxd->eid) {
 692        case MCU_EVENT_EXT:
 693                mt7915_mcu_rx_ext_event(dev, skb);
 694                break;
 695        default:
 696                break;
 697        }
 698        dev_kfree_skb(skb);
 699}
 700
 701void mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb)
 702{
 703        struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
 704
 705        if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
 706            rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
 707            rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
 708            rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
 709            rxd->ext_eid == MCU_EXT_EVENT_RATE_REPORT ||
 710            !rxd->seq)
 711                mt7915_mcu_rx_unsolicited_event(dev, skb);
 712        else
 713                mt76_mcu_rx_event(&dev->mt76, skb);
 714}
 715
 716static struct sk_buff *
 717mt7915_mcu_alloc_sta_req(struct mt7915_dev *dev, struct mt7915_vif *mvif,
 718                         struct mt7915_sta *msta, int len)
 719{
 720        struct sta_req_hdr hdr = {
 721                .bss_idx = mvif->idx,
 722                .wlan_idx_lo = msta ? to_wcid_lo(msta->wcid.idx) : 0,
 723                .wlan_idx_hi = msta ? to_wcid_hi(msta->wcid.idx) : 0,
 724                .muar_idx = msta ? mvif->omac_idx : 0,
 725                .is_tlv_append = 1,
 726        };
 727        struct sk_buff *skb;
 728
 729        skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
 730        if (!skb)
 731                return ERR_PTR(-ENOMEM);
 732
 733        skb_put_data(skb, &hdr, sizeof(hdr));
 734
 735        return skb;
 736}
 737
 738static struct wtbl_req_hdr *
 739mt7915_mcu_alloc_wtbl_req(struct mt7915_dev *dev, struct mt7915_sta *msta,
 740                          int cmd, void *sta_wtbl, struct sk_buff **skb)
 741{
 742        struct tlv *sta_hdr = sta_wtbl;
 743        struct wtbl_req_hdr hdr = {
 744                .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
 745                .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
 746                .operation = cmd,
 747        };
 748        struct sk_buff *nskb = *skb;
 749
 750        if (!nskb) {
 751                nskb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
 752                                          MT7915_WTBL_UPDATE_MAX_SIZE);
 753                if (!nskb)
 754                        return ERR_PTR(-ENOMEM);
 755
 756                *skb = nskb;
 757        }
 758
 759        if (sta_hdr)
 760                sta_hdr->len = cpu_to_le16(sizeof(hdr));
 761
 762        return skb_put_data(nskb, &hdr, sizeof(hdr));
 763}
 764
 765static struct tlv *
 766mt7915_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len,
 767                          void *sta_ntlv, void *sta_wtbl)
 768{
 769        struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv;
 770        struct tlv *sta_hdr = sta_wtbl;
 771        struct tlv *ptlv, tlv = {
 772                .tag = cpu_to_le16(tag),
 773                .len = cpu_to_le16(len),
 774        };
 775        u16 ntlv;
 776
 777        ptlv = skb_put(skb, len);
 778        memcpy(ptlv, &tlv, sizeof(tlv));
 779
 780        ntlv = le16_to_cpu(ntlv_hdr->tlv_num);
 781        ntlv_hdr->tlv_num = cpu_to_le16(ntlv + 1);
 782
 783        if (sta_hdr) {
 784                u16 size = le16_to_cpu(sta_hdr->len);
 785
 786                sta_hdr->len = cpu_to_le16(size + len);
 787        }
 788
 789        return ptlv;
 790}
 791
 792static struct tlv *
 793mt7915_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
 794{
 795        return mt7915_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
 796}
 797
 798static struct tlv *
 799mt7915_mcu_add_nested_subtlv(struct sk_buff *skb, int sub_tag, int sub_len,
 800                             __le16 *sub_ntlv, __le16 *len)
 801{
 802        struct tlv *ptlv, tlv = {
 803                .tag = cpu_to_le16(sub_tag),
 804                .len = cpu_to_le16(sub_len),
 805        };
 806
 807        ptlv = skb_put(skb, sub_len);
 808        memcpy(ptlv, &tlv, sizeof(tlv));
 809
 810        le16_add_cpu(sub_ntlv, 1);
 811        le16_add_cpu(len, sub_len);
 812
 813        return ptlv;
 814}
 815
 816/** bss info **/
 817static int
 818mt7915_mcu_bss_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
 819                         struct mt7915_phy *phy, bool enable)
 820{
 821        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 822        struct bss_info_basic *bss;
 823        u16 wlan_idx = mvif->sta.wcid.idx;
 824        u32 type = NETWORK_INFRA;
 825        struct tlv *tlv;
 826
 827        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_BASIC, sizeof(*bss));
 828
 829        switch (vif->type) {
 830        case NL80211_IFTYPE_MESH_POINT:
 831        case NL80211_IFTYPE_AP:
 832        case NL80211_IFTYPE_MONITOR:
 833                break;
 834        case NL80211_IFTYPE_STATION:
 835                /* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */
 836                if (enable) {
 837                        struct ieee80211_sta *sta;
 838                        struct mt7915_sta *msta;
 839
 840                        rcu_read_lock();
 841                        sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
 842                        if (!sta) {
 843                                rcu_read_unlock();
 844                                return -EINVAL;
 845                        }
 846
 847                        msta = (struct mt7915_sta *)sta->drv_priv;
 848                        wlan_idx = msta->wcid.idx;
 849                        rcu_read_unlock();
 850                }
 851                break;
 852        case NL80211_IFTYPE_ADHOC:
 853                type = NETWORK_IBSS;
 854                break;
 855        default:
 856                WARN_ON(1);
 857                break;
 858        }
 859
 860        bss = (struct bss_info_basic *)tlv;
 861        bss->network_type = cpu_to_le32(type);
 862        bss->bmc_wcid_lo = to_wcid_lo(wlan_idx);
 863        bss->bmc_wcid_hi = to_wcid_hi(wlan_idx);
 864        bss->wmm_idx = mvif->wmm_idx;
 865        bss->active = enable;
 866
 867        if (vif->type != NL80211_IFTYPE_MONITOR) {
 868                memcpy(bss->bssid, vif->bss_conf.bssid, ETH_ALEN);
 869                bss->bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int);
 870                bss->dtim_period = vif->bss_conf.dtim_period;
 871                bss->phy_mode = mt7915_get_phy_mode(vif, NULL);
 872        } else {
 873                memcpy(bss->bssid, phy->mt76->macaddr, ETH_ALEN);
 874        }
 875
 876        return 0;
 877}
 878
 879static void
 880mt7915_mcu_bss_omac_tlv(struct sk_buff *skb, struct ieee80211_vif *vif)
 881{
 882        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
 883        struct bss_info_omac *omac;
 884        struct tlv *tlv;
 885        u32 type = 0;
 886        u8 idx;
 887
 888        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_OMAC, sizeof(*omac));
 889
 890        switch (vif->type) {
 891        case NL80211_IFTYPE_MONITOR:
 892        case NL80211_IFTYPE_MESH_POINT:
 893        case NL80211_IFTYPE_AP:
 894                type = CONNECTION_INFRA_AP;
 895                break;
 896        case NL80211_IFTYPE_STATION:
 897                type = CONNECTION_INFRA_STA;
 898                break;
 899        case NL80211_IFTYPE_ADHOC:
 900                type = CONNECTION_IBSS_ADHOC;
 901                break;
 902        default:
 903                WARN_ON(1);
 904                break;
 905        }
 906
 907        omac = (struct bss_info_omac *)tlv;
 908        idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
 909        omac->conn_type = cpu_to_le32(type);
 910        omac->omac_idx = mvif->omac_idx;
 911        omac->band_idx = mvif->band_idx;
 912        omac->hw_bss_idx = idx;
 913}
 914
 915struct mt7915_he_obss_narrow_bw_ru_data {
 916        bool tolerated;
 917};
 918
 919static void mt7915_check_he_obss_narrow_bw_ru_iter(struct wiphy *wiphy,
 920                                                   struct cfg80211_bss *bss,
 921                                                   void *_data)
 922{
 923        struct mt7915_he_obss_narrow_bw_ru_data *data = _data;
 924        const struct element *elem;
 925
 926        elem = ieee80211_bss_get_elem(bss, WLAN_EID_EXT_CAPABILITY);
 927
 928        if (!elem || elem->datalen < 10 ||
 929            !(elem->data[10] &
 930              WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT))
 931                data->tolerated = false;
 932}
 933
 934static bool mt7915_check_he_obss_narrow_bw_ru(struct ieee80211_hw *hw,
 935                                              struct ieee80211_vif *vif)
 936{
 937        struct mt7915_he_obss_narrow_bw_ru_data iter_data = {
 938                .tolerated = true,
 939        };
 940
 941        if (!(vif->bss_conf.chandef.chan->flags & IEEE80211_CHAN_RADAR))
 942                return false;
 943
 944        cfg80211_bss_iter(hw->wiphy, &vif->bss_conf.chandef,
 945                          mt7915_check_he_obss_narrow_bw_ru_iter,
 946                          &iter_data);
 947
 948        /*
 949         * If there is at least one AP on radar channel that cannot
 950         * tolerate 26-tone RU UL OFDMA transmissions using HE TB PPDU.
 951         */
 952        return !iter_data.tolerated;
 953}
 954
 955static void
 956mt7915_mcu_bss_rfch_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
 957                        struct mt7915_phy *phy)
 958{
 959        struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
 960        struct bss_info_rf_ch *ch;
 961        struct tlv *tlv;
 962        int freq1 = chandef->center_freq1;
 963
 964        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_RF_CH, sizeof(*ch));
 965
 966        ch = (struct bss_info_rf_ch *)tlv;
 967        ch->pri_ch = chandef->chan->hw_value;
 968        ch->center_ch0 = ieee80211_frequency_to_channel(freq1);
 969        ch->bw = mt7915_mcu_chan_bw(chandef);
 970
 971        if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
 972                int freq2 = chandef->center_freq2;
 973
 974                ch->center_ch1 = ieee80211_frequency_to_channel(freq2);
 975        }
 976
 977        if (vif->bss_conf.he_support && vif->type == NL80211_IFTYPE_STATION) {
 978                struct mt7915_dev *dev = phy->dev;
 979                struct mt76_phy *mphy = &dev->mt76.phy;
 980                bool ext_phy = phy != &dev->phy;
 981
 982                if (ext_phy && dev->mt76.phy2)
 983                        mphy = dev->mt76.phy2;
 984
 985                ch->he_ru26_block =
 986                        mt7915_check_he_obss_narrow_bw_ru(mphy->hw, vif);
 987                ch->he_all_disable = false;
 988        } else {
 989                ch->he_all_disable = true;
 990        }
 991}
 992
 993static void
 994mt7915_mcu_bss_ra_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
 995                      struct mt7915_phy *phy)
 996{
 997        int max_nss = hweight8(phy->mt76->chainmask);
 998        struct bss_info_ra *ra;
 999        struct tlv *tlv;
1000
1001        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_RA, sizeof(*ra));
1002
1003        ra = (struct bss_info_ra *)tlv;
1004        ra->op_mode = vif->type == NL80211_IFTYPE_AP;
1005        ra->adhoc_en = vif->type == NL80211_IFTYPE_ADHOC;
1006        ra->short_preamble = true;
1007        ra->tx_streams = max_nss;
1008        ra->rx_streams = max_nss;
1009        ra->algo = 4;
1010        ra->train_up_rule = 2;
1011        ra->train_up_high_thres = 110;
1012        ra->train_up_rule_rssi = -70;
1013        ra->low_traffic_thres = 2;
1014        ra->phy_cap = cpu_to_le32(0xfdf);
1015        ra->interval = cpu_to_le32(500);
1016        ra->fast_interval = cpu_to_le32(100);
1017}
1018
1019static void
1020mt7915_mcu_bss_he_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1021                      struct mt7915_phy *phy)
1022{
1023#define DEFAULT_HE_PE_DURATION          4
1024#define DEFAULT_HE_DURATION_RTS_THRES   1023
1025        const struct ieee80211_sta_he_cap *cap;
1026        struct bss_info_he *he;
1027        struct tlv *tlv;
1028
1029        cap = mt7915_get_he_phy_cap(phy, vif);
1030
1031        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_HE_BASIC, sizeof(*he));
1032
1033        he = (struct bss_info_he *)tlv;
1034        he->he_pe_duration = vif->bss_conf.htc_trig_based_pkt_ext;
1035        if (!he->he_pe_duration)
1036                he->he_pe_duration = DEFAULT_HE_PE_DURATION;
1037
1038        he->he_rts_thres = cpu_to_le16(vif->bss_conf.frame_time_rts_th);
1039        if (!he->he_rts_thres)
1040                he->he_rts_thres = cpu_to_le16(DEFAULT_HE_DURATION_RTS_THRES);
1041
1042        he->max_nss_mcs[CMD_HE_MCS_BW80] = cap->he_mcs_nss_supp.tx_mcs_80;
1043        he->max_nss_mcs[CMD_HE_MCS_BW160] = cap->he_mcs_nss_supp.tx_mcs_160;
1044        he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80;
1045}
1046
1047static void
1048mt7915_mcu_bss_hw_amsdu_tlv(struct sk_buff *skb)
1049{
1050#define TXD_CMP_MAP1            GENMASK(15, 0)
1051#define TXD_CMP_MAP2            (GENMASK(31, 0) & ~BIT(23))
1052        struct bss_info_hw_amsdu *amsdu;
1053        struct tlv *tlv;
1054
1055        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_HW_AMSDU, sizeof(*amsdu));
1056
1057        amsdu = (struct bss_info_hw_amsdu *)tlv;
1058        amsdu->cmp_bitmap_0 = cpu_to_le32(TXD_CMP_MAP1);
1059        amsdu->cmp_bitmap_1 = cpu_to_le32(TXD_CMP_MAP2);
1060        amsdu->trig_thres = cpu_to_le16(2);
1061        amsdu->enable = true;
1062}
1063
1064static void
1065mt7915_mcu_bss_ext_tlv(struct sk_buff *skb, struct mt7915_vif *mvif)
1066{
1067/* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */
1068#define BCN_TX_ESTIMATE_TIME    (4096 + 20)
1069        struct bss_info_ext_bss *ext;
1070        int ext_bss_idx, tsf_offset;
1071        struct tlv *tlv;
1072
1073        ext_bss_idx = mvif->omac_idx - EXT_BSSID_START;
1074        if (ext_bss_idx < 0)
1075                return;
1076
1077        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_EXT_BSS, sizeof(*ext));
1078
1079        ext = (struct bss_info_ext_bss *)tlv;
1080        tsf_offset = ext_bss_idx * BCN_TX_ESTIMATE_TIME;
1081        ext->mbss_tsf_offset = cpu_to_le32(tsf_offset);
1082}
1083
1084static void
1085mt7915_mcu_bss_bmc_tlv(struct sk_buff *skb, struct mt7915_phy *phy)
1086{
1087        struct bss_info_bmc_rate *bmc;
1088        struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
1089        enum nl80211_band band = chandef->chan->band;
1090        struct tlv *tlv;
1091
1092        tlv = mt7915_mcu_add_tlv(skb, BSS_INFO_BMC_RATE, sizeof(*bmc));
1093
1094        bmc = (struct bss_info_bmc_rate *)tlv;
1095        if (band == NL80211_BAND_2GHZ) {
1096                bmc->short_preamble = true;
1097        } else {
1098                bmc->bc_trans = cpu_to_le16(0x2000);
1099                bmc->mc_trans = cpu_to_le16(0x2080);
1100        }
1101}
1102
1103static int
1104mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif,
1105                       bool bssid, bool enable)
1106{
1107        struct mt7915_dev *dev = phy->dev;
1108        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1109        u32 idx = mvif->omac_idx - REPEATER_BSSID_START;
1110        u32 mask = phy->omac_mask >> 32 & ~BIT(idx);
1111        const u8 *addr = vif->addr;
1112        struct {
1113                u8 mode;
1114                u8 force_clear;
1115                u8 clear_bitmap[8];
1116                u8 entry_count;
1117                u8 write;
1118                u8 band;
1119
1120                u8 index;
1121                u8 bssid;
1122                u8 addr[ETH_ALEN];
1123        } __packed req = {
1124                .mode = !!mask || enable,
1125                .entry_count = 1,
1126                .write = 1,
1127                .band = phy != &dev->phy,
1128                .index = idx * 2 + bssid,
1129        };
1130
1131        if (bssid)
1132                addr = vif->bss_conf.bssid;
1133
1134        if (enable)
1135                ether_addr_copy(req.addr, addr);
1136
1137        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE), &req,
1138                                 sizeof(req), true);
1139}
1140
1141int mt7915_mcu_add_bss_info(struct mt7915_phy *phy,
1142                            struct ieee80211_vif *vif, int enable)
1143{
1144        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1145        struct sk_buff *skb;
1146
1147        if (mvif->omac_idx >= REPEATER_BSSID_START) {
1148                mt7915_mcu_muar_config(phy, vif, false, enable);
1149                mt7915_mcu_muar_config(phy, vif, true, enable);
1150        }
1151
1152        skb = mt7915_mcu_alloc_sta_req(phy->dev, mvif, NULL,
1153                                       MT7915_BSS_UPDATE_MAX_SIZE);
1154        if (IS_ERR(skb))
1155                return PTR_ERR(skb);
1156
1157        /* bss_omac must be first */
1158        if (enable)
1159                mt7915_mcu_bss_omac_tlv(skb, vif);
1160
1161        mt7915_mcu_bss_basic_tlv(skb, vif, phy, enable);
1162
1163        if (vif->type == NL80211_IFTYPE_MONITOR)
1164                goto out;
1165
1166        if (enable) {
1167                mt7915_mcu_bss_rfch_tlv(skb, vif, phy);
1168                mt7915_mcu_bss_bmc_tlv(skb, phy);
1169                mt7915_mcu_bss_ra_tlv(skb, vif, phy);
1170                mt7915_mcu_bss_hw_amsdu_tlv(skb);
1171
1172                if (vif->bss_conf.he_support)
1173                        mt7915_mcu_bss_he_tlv(skb, vif, phy);
1174
1175                if (mvif->omac_idx >= EXT_BSSID_START &&
1176                    mvif->omac_idx < REPEATER_BSSID_START)
1177                        mt7915_mcu_bss_ext_tlv(skb, mvif);
1178        }
1179out:
1180        return mt76_mcu_skb_send_msg(&phy->dev->mt76, skb,
1181                                     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
1182}
1183
1184/** starec & wtbl **/
1185static int
1186mt7915_mcu_sta_key_tlv(struct mt7915_sta *msta, struct sk_buff *skb,
1187                       struct ieee80211_key_conf *key, enum set_key_cmd cmd)
1188{
1189        struct mt7915_sta_key_conf *bip = &msta->bip;
1190        struct sta_rec_sec *sec;
1191        struct tlv *tlv;
1192        u32 len = sizeof(*sec);
1193
1194        tlv = mt7915_mcu_add_tlv(skb, STA_REC_KEY_V2, sizeof(*sec));
1195
1196        sec = (struct sta_rec_sec *)tlv;
1197        sec->add = cmd;
1198
1199        if (cmd == SET_KEY) {
1200                struct sec_key *sec_key;
1201                u8 cipher;
1202
1203                cipher = mt7915_mcu_get_cipher(key->cipher);
1204                if (cipher == MT_CIPHER_NONE)
1205                        return -EOPNOTSUPP;
1206
1207                sec_key = &sec->key[0];
1208                sec_key->cipher_len = sizeof(*sec_key);
1209
1210                if (cipher == MCU_CIPHER_BIP_CMAC_128) {
1211                        sec_key->cipher_id = MCU_CIPHER_AES_CCMP;
1212                        sec_key->key_id = bip->keyidx;
1213                        sec_key->key_len = 16;
1214                        memcpy(sec_key->key, bip->key, 16);
1215
1216                        sec_key = &sec->key[1];
1217                        sec_key->cipher_id = MCU_CIPHER_BIP_CMAC_128;
1218                        sec_key->cipher_len = sizeof(*sec_key);
1219                        sec_key->key_len = 16;
1220                        memcpy(sec_key->key, key->key, 16);
1221
1222                        sec->n_cipher = 2;
1223                } else {
1224                        sec_key->cipher_id = cipher;
1225                        sec_key->key_id = key->keyidx;
1226                        sec_key->key_len = key->keylen;
1227                        memcpy(sec_key->key, key->key, key->keylen);
1228
1229                        if (cipher == MCU_CIPHER_TKIP) {
1230                                /* Rx/Tx MIC keys are swapped */
1231                                memcpy(sec_key->key + 16, key->key + 24, 8);
1232                                memcpy(sec_key->key + 24, key->key + 16, 8);
1233                        }
1234
1235                        /* store key_conf for BIP batch update */
1236                        if (cipher == MCU_CIPHER_AES_CCMP) {
1237                                memcpy(bip->key, key->key, key->keylen);
1238                                bip->keyidx = key->keyidx;
1239                        }
1240
1241                        len -= sizeof(*sec_key);
1242                        sec->n_cipher = 1;
1243                }
1244        } else {
1245                len -= sizeof(sec->key);
1246                sec->n_cipher = 0;
1247        }
1248        sec->len = cpu_to_le16(len);
1249
1250        return 0;
1251}
1252
1253int mt7915_mcu_add_key(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1254                       struct mt7915_sta *msta, struct ieee80211_key_conf *key,
1255                       enum set_key_cmd cmd)
1256{
1257        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1258        struct sk_buff *skb;
1259        int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_sec);
1260        int ret;
1261
1262        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
1263        if (IS_ERR(skb))
1264                return PTR_ERR(skb);
1265
1266        ret = mt7915_mcu_sta_key_tlv(msta, skb, key, cmd);
1267        if (ret)
1268                return ret;
1269
1270        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1271                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
1272}
1273
1274static void
1275mt7915_mcu_sta_ba_tlv(struct sk_buff *skb,
1276                      struct ieee80211_ampdu_params *params,
1277                      bool enable, bool tx)
1278{
1279        struct sta_rec_ba *ba;
1280        struct tlv *tlv;
1281
1282        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BA, sizeof(*ba));
1283
1284        ba = (struct sta_rec_ba *)tlv;
1285        ba->ba_type = tx ? MT_BA_TYPE_ORIGINATOR : MT_BA_TYPE_RECIPIENT;
1286        ba->winsize = cpu_to_le16(params->buf_size);
1287        ba->ssn = cpu_to_le16(params->ssn);
1288        ba->ba_en = enable << params->tid;
1289        ba->amsdu = params->amsdu;
1290        ba->tid = params->tid;
1291}
1292
1293static void
1294mt7915_mcu_wtbl_ba_tlv(struct sk_buff *skb,
1295                       struct ieee80211_ampdu_params *params,
1296                       bool enable, bool tx, void *sta_wtbl,
1297                       void *wtbl_tlv)
1298{
1299        struct wtbl_ba *ba;
1300        struct tlv *tlv;
1301
1302        tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_BA, sizeof(*ba),
1303                                        wtbl_tlv, sta_wtbl);
1304
1305        ba = (struct wtbl_ba *)tlv;
1306        ba->tid = params->tid;
1307
1308        if (tx) {
1309                ba->ba_type = MT_BA_TYPE_ORIGINATOR;
1310                ba->sn = enable ? cpu_to_le16(params->ssn) : 0;
1311                ba->ba_en = enable;
1312        } else {
1313                memcpy(ba->peer_addr, params->sta->addr, ETH_ALEN);
1314                ba->ba_type = MT_BA_TYPE_RECIPIENT;
1315                ba->rst_ba_tid = params->tid;
1316                ba->rst_ba_sel = RST_BA_MAC_TID_MATCH;
1317                ba->rst_ba_sb = 1;
1318        }
1319
1320        if (enable && tx)
1321                ba->ba_winsize = cpu_to_le16(params->buf_size);
1322}
1323
1324static int
1325mt7915_mcu_sta_ba(struct mt7915_dev *dev,
1326                  struct ieee80211_ampdu_params *params,
1327                  bool enable, bool tx)
1328{
1329        struct mt7915_sta *msta = (struct mt7915_sta *)params->sta->drv_priv;
1330        struct mt7915_vif *mvif = msta->vif;
1331        struct wtbl_req_hdr *wtbl_hdr;
1332        struct tlv *sta_wtbl;
1333        struct sk_buff *skb;
1334        int ret;
1335
1336        if (enable && tx && !params->amsdu)
1337                msta->wcid.amsdu = false;
1338
1339        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1340                                       MT7915_STA_UPDATE_MAX_SIZE);
1341        if (IS_ERR(skb))
1342                return PTR_ERR(skb);
1343
1344        sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1345
1346        wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1347                                             &skb);
1348        if (IS_ERR(wtbl_hdr))
1349                return PTR_ERR(wtbl_hdr);
1350
1351        mt7915_mcu_wtbl_ba_tlv(skb, params, enable, tx, sta_wtbl, wtbl_hdr);
1352
1353        ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
1354                                    MCU_EXT_CMD(STA_REC_UPDATE), true);
1355        if (ret)
1356                return ret;
1357
1358        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1359                                       MT7915_STA_UPDATE_MAX_SIZE);
1360        if (IS_ERR(skb))
1361                return PTR_ERR(skb);
1362
1363        mt7915_mcu_sta_ba_tlv(skb, params, enable, tx);
1364
1365        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1366                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
1367}
1368
1369int mt7915_mcu_add_tx_ba(struct mt7915_dev *dev,
1370                         struct ieee80211_ampdu_params *params,
1371                         bool enable)
1372{
1373        return mt7915_mcu_sta_ba(dev, params, enable, true);
1374}
1375
1376int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
1377                         struct ieee80211_ampdu_params *params,
1378                         bool enable)
1379{
1380        return mt7915_mcu_sta_ba(dev, params, enable, false);
1381}
1382
1383static void
1384mt7915_mcu_wtbl_generic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1385                            struct ieee80211_sta *sta, void *sta_wtbl,
1386                            void *wtbl_tlv)
1387{
1388        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1389        struct wtbl_generic *generic;
1390        struct wtbl_rx *rx;
1391        struct tlv *tlv;
1392
1393        tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_GENERIC, sizeof(*generic),
1394                                        wtbl_tlv, sta_wtbl);
1395
1396        generic = (struct wtbl_generic *)tlv;
1397
1398        if (sta) {
1399                memcpy(generic->peer_addr, sta->addr, ETH_ALEN);
1400                generic->partial_aid = cpu_to_le16(sta->aid);
1401                generic->muar_idx = mvif->omac_idx;
1402                generic->qos = sta->wme;
1403        } else {
1404                /* use BSSID in station mode */
1405                if (vif->type == NL80211_IFTYPE_STATION)
1406                        memcpy(generic->peer_addr, vif->bss_conf.bssid,
1407                               ETH_ALEN);
1408                else
1409                        eth_broadcast_addr(generic->peer_addr);
1410
1411                generic->muar_idx = 0xe;
1412        }
1413
1414        tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_RX, sizeof(*rx),
1415                                        wtbl_tlv, sta_wtbl);
1416
1417        rx = (struct wtbl_rx *)tlv;
1418        rx->rca1 = sta ? vif->type != NL80211_IFTYPE_AP : 1;
1419        rx->rca2 = 1;
1420        rx->rv = 1;
1421}
1422
1423static void
1424mt7915_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1425                         struct ieee80211_sta *sta, bool enable)
1426{
1427#define EXTRA_INFO_VER          BIT(0)
1428#define EXTRA_INFO_NEW          BIT(1)
1429        struct sta_rec_basic *basic;
1430        struct tlv *tlv;
1431
1432        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BASIC, sizeof(*basic));
1433
1434        basic = (struct sta_rec_basic *)tlv;
1435        basic->extra_info = cpu_to_le16(EXTRA_INFO_VER);
1436
1437        if (enable) {
1438                basic->extra_info |= cpu_to_le16(EXTRA_INFO_NEW);
1439                basic->conn_state = CONN_STATE_PORT_SECURE;
1440        } else {
1441                basic->conn_state = CONN_STATE_DISCONNECT;
1442        }
1443
1444        if (!sta) {
1445                basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
1446                eth_broadcast_addr(basic->peer_addr);
1447                return;
1448        }
1449
1450        switch (vif->type) {
1451        case NL80211_IFTYPE_MESH_POINT:
1452        case NL80211_IFTYPE_AP:
1453                basic->conn_type = cpu_to_le32(CONNECTION_INFRA_STA);
1454                break;
1455        case NL80211_IFTYPE_STATION:
1456                basic->conn_type = cpu_to_le32(CONNECTION_INFRA_AP);
1457                break;
1458        case NL80211_IFTYPE_ADHOC:
1459                basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
1460                break;
1461        default:
1462                WARN_ON(1);
1463                break;
1464        }
1465
1466        memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
1467        basic->aid = cpu_to_le16(sta->aid);
1468        basic->qos = sta->wme;
1469}
1470
1471static void
1472mt7915_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1473{
1474        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1475        struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
1476        struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
1477        enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
1478        const u16 *mcs_mask = msta->vif->bitrate_mask.control[band].he_mcs;
1479        struct sta_rec_he *he;
1480        struct tlv *tlv;
1481        u32 cap = 0;
1482
1483        tlv = mt7915_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
1484
1485        he = (struct sta_rec_he *)tlv;
1486
1487        if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
1488                cap |= STA_REC_HE_CAP_HTC;
1489
1490        if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
1491                cap |= STA_REC_HE_CAP_BSR;
1492
1493        if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
1494                cap |= STA_REC_HE_CAP_OM;
1495
1496        if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU)
1497                cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
1498
1499        if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
1500                cap |= STA_REC_HE_CAP_BQR;
1501
1502        if (elem->phy_cap_info[0] &
1503            (IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
1504             IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
1505                cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
1506
1507        if (elem->phy_cap_info[1] &
1508            IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
1509                cap |= STA_REC_HE_CAP_LDPC;
1510
1511        if (elem->phy_cap_info[1] &
1512            IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
1513                cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
1514
1515        if (elem->phy_cap_info[2] &
1516            IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
1517                cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
1518
1519        if (elem->phy_cap_info[2] &
1520            IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
1521                cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
1522
1523        if (elem->phy_cap_info[2] &
1524            IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
1525                cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
1526
1527        if (elem->phy_cap_info[6] &
1528            IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
1529                cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
1530
1531        if (elem->phy_cap_info[7] &
1532            IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
1533                cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
1534
1535        if (elem->phy_cap_info[7] &
1536            IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
1537                cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
1538
1539        if (elem->phy_cap_info[7] &
1540            IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
1541                cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
1542
1543        if (elem->phy_cap_info[8] &
1544            IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
1545                cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
1546
1547        if (elem->phy_cap_info[8] &
1548            IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
1549                cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
1550
1551        if (elem->phy_cap_info[9] &
1552            IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
1553                cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
1554
1555        if (elem->phy_cap_info[9] &
1556            IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
1557                cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
1558
1559        if (elem->phy_cap_info[9] &
1560            IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
1561                cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
1562
1563        he->he_cap = cpu_to_le32(cap);
1564
1565        switch (sta->bandwidth) {
1566        case IEEE80211_STA_RX_BW_160:
1567                if (elem->phy_cap_info[0] &
1568                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
1569                        mt7915_mcu_set_sta_he_mcs(sta,
1570                                                  &he->max_nss_mcs[CMD_HE_MCS_BW8080],
1571                                                  mcs_mask);
1572
1573                mt7915_mcu_set_sta_he_mcs(sta,
1574                                          &he->max_nss_mcs[CMD_HE_MCS_BW160],
1575                                          mcs_mask);
1576                fallthrough;
1577        default:
1578                mt7915_mcu_set_sta_he_mcs(sta,
1579                                          &he->max_nss_mcs[CMD_HE_MCS_BW80],
1580                                          mcs_mask);
1581                break;
1582        }
1583
1584        he->t_frame_dur =
1585                HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
1586        he->max_ampdu_exp =
1587                HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
1588
1589        he->bw_set =
1590                HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
1591        he->device_class =
1592                HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
1593        he->punc_pream_rx =
1594                HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
1595
1596        he->dcm_tx_mode =
1597                HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
1598        he->dcm_tx_max_nss =
1599                HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
1600        he->dcm_rx_mode =
1601                HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
1602        he->dcm_rx_max_nss =
1603                HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
1604        he->dcm_rx_max_nss =
1605                HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
1606
1607        he->pkt_ext = 2;
1608}
1609
1610static void
1611mt7915_mcu_sta_uapsd_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1612                     struct ieee80211_vif *vif)
1613{
1614        struct sta_rec_uapsd *uapsd;
1615        struct tlv *tlv;
1616
1617        if (vif->type != NL80211_IFTYPE_AP || !sta->wme)
1618                return;
1619
1620        tlv = mt7915_mcu_add_tlv(skb, STA_REC_APPS, sizeof(*uapsd));
1621        uapsd = (struct sta_rec_uapsd *)tlv;
1622
1623        if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) {
1624                uapsd->dac_map |= BIT(3);
1625                uapsd->tac_map |= BIT(3);
1626        }
1627        if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) {
1628                uapsd->dac_map |= BIT(2);
1629                uapsd->tac_map |= BIT(2);
1630        }
1631        if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) {
1632                uapsd->dac_map |= BIT(1);
1633                uapsd->tac_map |= BIT(1);
1634        }
1635        if (sta->uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) {
1636                uapsd->dac_map |= BIT(0);
1637                uapsd->tac_map |= BIT(0);
1638        }
1639        uapsd->max_sp = sta->max_sp;
1640}
1641
1642static void
1643mt7915_mcu_sta_muru_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1644{
1645        struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
1646        struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
1647        struct sta_rec_muru *muru;
1648        struct tlv *tlv;
1649
1650        tlv = mt7915_mcu_add_tlv(skb, STA_REC_MURU, sizeof(*muru));
1651
1652        muru = (struct sta_rec_muru *)tlv;
1653        muru->cfg.ofdma_dl_en = true;
1654        muru->cfg.mimo_dl_en = true;
1655
1656        muru->ofdma_dl.punc_pream_rx =
1657                HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
1658        muru->ofdma_dl.he_20m_in_40m_2g =
1659                HE_PHY(CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G, elem->phy_cap_info[8]);
1660        muru->ofdma_dl.he_20m_in_160m =
1661                HE_PHY(CAP8_20MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
1662        muru->ofdma_dl.he_80m_in_160m =
1663                HE_PHY(CAP8_80MHZ_IN_160MHZ_HE_PPDU, elem->phy_cap_info[8]);
1664        muru->ofdma_dl.lt16_sigb = 0;
1665        muru->ofdma_dl.rx_su_comp_sigb = 0;
1666        muru->ofdma_dl.rx_su_non_comp_sigb = 0;
1667
1668        muru->ofdma_ul.t_frame_dur =
1669                HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
1670        muru->ofdma_ul.mu_cascading =
1671                HE_MAC(CAP2_MU_CASCADING, elem->mac_cap_info[2]);
1672        muru->ofdma_ul.uo_ra =
1673                HE_MAC(CAP3_OFDMA_RA, elem->mac_cap_info[3]);
1674        muru->ofdma_ul.he_2x996_tone = 0;
1675        muru->ofdma_ul.rx_t_frame_11ac = 0;
1676
1677        muru->mimo_dl.vht_mu_bfee =
1678                !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
1679        muru->mimo_dl.partial_bw_dl_mimo =
1680                HE_PHY(CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO, elem->phy_cap_info[6]);
1681
1682        muru->mimo_ul.full_ul_mimo =
1683                HE_PHY(CAP2_UL_MU_FULL_MU_MIMO, elem->phy_cap_info[2]);
1684        muru->mimo_ul.partial_ul_mimo =
1685                HE_PHY(CAP2_UL_MU_PARTIAL_MU_MIMO, elem->phy_cap_info[2]);
1686}
1687
1688static void
1689mt7915_mcu_sta_vht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1690{
1691        struct sta_rec_vht *vht;
1692        struct tlv *tlv;
1693
1694        tlv = mt7915_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
1695
1696        vht = (struct sta_rec_vht *)tlv;
1697        vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
1698        vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
1699        vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
1700}
1701
1702static void
1703mt7915_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
1704{
1705        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1706        struct sta_rec_amsdu *amsdu;
1707        struct tlv *tlv;
1708
1709        if (!sta->max_amsdu_len)
1710            return;
1711
1712        tlv = mt7915_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
1713        amsdu = (struct sta_rec_amsdu *)tlv;
1714        amsdu->max_amsdu_num = 8;
1715        amsdu->amsdu_en = true;
1716        amsdu->max_mpdu_size = sta->max_amsdu_len >=
1717                               IEEE80211_MAX_MPDU_LEN_VHT_7991;
1718        msta->wcid.amsdu = true;
1719}
1720
1721static bool
1722mt7915_hw_amsdu_supported(struct ieee80211_vif *vif)
1723{
1724        switch (vif->type) {
1725        case NL80211_IFTYPE_AP:
1726        case NL80211_IFTYPE_STATION:
1727                return true;
1728        default:
1729                return false;
1730        }
1731}
1732
1733static void
1734mt7915_mcu_sta_tlv(struct mt7915_dev *dev, struct sk_buff *skb,
1735                   struct ieee80211_sta *sta, struct ieee80211_vif *vif)
1736{
1737        struct tlv *tlv;
1738
1739        /* starec ht */
1740        if (sta->ht_cap.ht_supported) {
1741                struct sta_rec_ht *ht;
1742
1743                tlv = mt7915_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
1744                ht = (struct sta_rec_ht *)tlv;
1745                ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
1746
1747                if (mt7915_hw_amsdu_supported(vif))
1748                        mt7915_mcu_sta_amsdu_tlv(skb, sta);
1749        }
1750
1751        /* starec he */
1752        if (sta->he_cap.has_he)
1753                mt7915_mcu_sta_he_tlv(skb, sta);
1754
1755        /* starec uapsd */
1756        mt7915_mcu_sta_uapsd_tlv(skb, sta, vif);
1757}
1758
1759static void
1760mt7915_mcu_wtbl_smps_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1761                         void *sta_wtbl, void *wtbl_tlv)
1762{
1763        struct wtbl_smps *smps;
1764        struct tlv *tlv;
1765
1766        tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_SMPS, sizeof(*smps),
1767                                        wtbl_tlv, sta_wtbl);
1768        smps = (struct wtbl_smps *)tlv;
1769
1770        if (sta->smps_mode == IEEE80211_SMPS_DYNAMIC)
1771                smps->smps = true;
1772}
1773
1774static void
1775mt7915_mcu_wtbl_ht_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
1776                       void *sta_wtbl, void *wtbl_tlv)
1777{
1778        struct wtbl_ht *ht = NULL;
1779        struct tlv *tlv;
1780
1781        /* wtbl ht */
1782        if (sta->ht_cap.ht_supported) {
1783                tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
1784                                                wtbl_tlv, sta_wtbl);
1785                ht = (struct wtbl_ht *)tlv;
1786                ht->ldpc = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
1787                ht->af = sta->ht_cap.ampdu_factor;
1788                ht->mm = sta->ht_cap.ampdu_density;
1789                ht->ht = true;
1790        }
1791
1792        /* wtbl vht */
1793        if (sta->vht_cap.vht_supported) {
1794                struct wtbl_vht *vht;
1795                u8 af;
1796
1797                tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_VHT, sizeof(*vht),
1798                                                wtbl_tlv, sta_wtbl);
1799                vht = (struct wtbl_vht *)tlv;
1800                vht->ldpc = !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
1801                vht->vht = true;
1802
1803                af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
1804                               sta->vht_cap.cap);
1805                if (ht)
1806                        ht->af = max_t(u8, ht->af, af);
1807        }
1808
1809        mt7915_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
1810}
1811
1812static void
1813mt7915_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,
1814                              struct ieee80211_sta *sta,
1815                              void *sta_wtbl, void *wtbl_tlv)
1816{
1817        struct mt7915_sta *msta;
1818        struct wtbl_hdr_trans *htr = NULL;
1819        struct tlv *tlv;
1820
1821        tlv = mt7915_mcu_add_nested_tlv(skb, WTBL_HDR_TRANS, sizeof(*htr),
1822                                        wtbl_tlv, sta_wtbl);
1823        htr = (struct wtbl_hdr_trans *)tlv;
1824        htr->no_rx_trans = true;
1825        if (vif->type == NL80211_IFTYPE_STATION)
1826                htr->to_ds = true;
1827        else
1828                htr->from_ds = true;
1829
1830        if (!sta)
1831                return;
1832
1833        msta = (struct mt7915_sta *)sta->drv_priv;
1834        htr->no_rx_trans = !test_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
1835        if (test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags)) {
1836                htr->to_ds = true;
1837                htr->from_ds = true;
1838        }
1839}
1840
1841int mt7915_mcu_sta_update_hdr_trans(struct mt7915_dev *dev,
1842                                    struct ieee80211_vif *vif,
1843                                    struct ieee80211_sta *sta)
1844{
1845        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1846        struct wtbl_req_hdr *wtbl_hdr;
1847        struct sk_buff *skb;
1848
1849        skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, MT7915_WTBL_UPDATE_MAX_SIZE);
1850        if (!skb)
1851                return -ENOMEM;
1852
1853        wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, NULL, &skb);
1854        if (IS_ERR(wtbl_hdr))
1855                return PTR_ERR(wtbl_hdr);
1856
1857        mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, NULL, wtbl_hdr);
1858
1859        return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_EXT_CMD(WTBL_UPDATE),
1860                                     true);
1861}
1862
1863int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
1864                        struct ieee80211_sta *sta)
1865{
1866        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
1867        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
1868        struct wtbl_req_hdr *wtbl_hdr;
1869        struct tlv *sta_wtbl;
1870        struct sk_buff *skb;
1871
1872        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
1873                                       MT7915_STA_UPDATE_MAX_SIZE);
1874        if (IS_ERR(skb))
1875                return PTR_ERR(skb);
1876
1877        sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
1878
1879        wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_SET, sta_wtbl,
1880                                             &skb);
1881        if (IS_ERR(wtbl_hdr))
1882                return PTR_ERR(wtbl_hdr);
1883
1884        mt7915_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_hdr);
1885
1886        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
1887                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
1888}
1889
1890static void
1891mt7915_mcu_sta_sounding_rate(struct sta_rec_bf *bf)
1892{
1893        bf->bf_cap = MT_EBF;
1894        bf->sounding_phy = MT_PHY_TYPE_OFDM;
1895        bf->ndp_rate = 0;                               /* mcs0 */
1896        bf->ndpa_rate = MT7915_CFEND_RATE_DEFAULT;      /* ofdm 24m */
1897        bf->rept_poll_rate = MT7915_CFEND_RATE_DEFAULT; /* ofdm 24m */
1898}
1899
1900static void
1901mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1902                       struct sta_rec_bf *bf)
1903{
1904        struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
1905        u8 n = 0;
1906
1907        bf->tx_mode = MT_PHY_TYPE_HT;
1908        bf->bf_cap = MT_IBF;
1909
1910        if (mcs->tx_params & IEEE80211_HT_MCS_TX_RX_DIFF &&
1911            (mcs->tx_params & IEEE80211_HT_MCS_TX_DEFINED))
1912                n = FIELD_GET(IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK,
1913                              mcs->tx_params);
1914        else if (mcs->rx_mask[3])
1915                n = 3;
1916        else if (mcs->rx_mask[2])
1917                n = 2;
1918        else if (mcs->rx_mask[1])
1919                n = 1;
1920
1921        bf->nr = hweight8(phy->mt76->chainmask) - 1;
1922        bf->nc = min_t(u8, bf->nr, n);
1923        bf->ibf_ncol = n;
1924}
1925
1926static void
1927mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
1928                        struct sta_rec_bf *bf, bool explicit)
1929{
1930        struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
1931        struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
1932        u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
1933        u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1934        u8 tx_ant = hweight8(phy->mt76->chainmask) - 1;
1935
1936        bf->tx_mode = MT_PHY_TYPE_VHT;
1937
1938        if (explicit) {
1939                u8 bfee_nr, bfer_nr;
1940
1941                mt7915_mcu_sta_sounding_rate(bf);
1942                bfee_nr = FIELD_GET(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK,
1943                                    pc->cap);
1944                bfer_nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
1945                                    vc->cap);
1946                bf->nr = min_t(u8, min_t(u8, bfer_nr, bfee_nr), tx_ant);
1947                bf->nc = min_t(u8, nss_mcs, bf->nr);
1948                bf->ibf_ncol = bf->nc;
1949
1950                if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1951                        bf->nr = 1;
1952        } else {
1953                bf->bf_cap = MT_IBF;
1954                bf->nr = tx_ant;
1955                bf->nc = min_t(u8, nss_mcs, bf->nr);
1956                bf->ibf_ncol = nss_mcs;
1957
1958                if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
1959                        bf->ibf_nrow = 1;
1960        }
1961}
1962
1963static void
1964mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
1965                       struct mt7915_phy *phy, struct sta_rec_bf *bf)
1966{
1967        struct ieee80211_sta_he_cap *pc = &sta->he_cap;
1968        struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
1969        const struct ieee80211_sta_he_cap *vc = mt7915_get_he_phy_cap(phy, vif);
1970        const struct ieee80211_he_cap_elem *ve = &vc->he_cap_elem;
1971        u16 mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80);
1972        u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1973        u8 bfee_nr, bfer_nr;
1974
1975        bf->tx_mode = MT_PHY_TYPE_HE_SU;
1976        mt7915_mcu_sta_sounding_rate(bf);
1977        bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB,
1978                                pe->phy_cap_info[6]);
1979        bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB,
1980                                pe->phy_cap_info[6]);
1981        bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
1982                         ve->phy_cap_info[5]);
1983        bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK,
1984                         pe->phy_cap_info[4]);
1985        bf->nr = min_t(u8, bfer_nr, bfee_nr);
1986        bf->nc = min_t(u8, nss_mcs, bf->nr);
1987        bf->ibf_ncol = bf->nc;
1988
1989        if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
1990                return;
1991
1992        /* go over for 160MHz and 80p80 */
1993        if (pe->phy_cap_info[0] &
1994            IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G) {
1995                mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_160);
1996                nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
1997
1998                bf->nc_bw160 = nss_mcs;
1999        }
2000
2001        if (pe->phy_cap_info[0] &
2002            IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
2003                mcs_map = le16_to_cpu(pc->he_mcs_nss_supp.rx_mcs_80p80);
2004                nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
2005
2006                if (bf->nc_bw160)
2007                        bf->nc_bw160 = min_t(u8, bf->nc_bw160, nss_mcs);
2008                else
2009                        bf->nc_bw160 = nss_mcs;
2010        }
2011
2012        bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
2013                         ve->phy_cap_info[5]);
2014        bfee_nr = HE_PHY(CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK,
2015                         pe->phy_cap_info[4]);
2016
2017        bf->nr_bw160 = min_t(int, bfer_nr, bfee_nr);
2018}
2019
2020static void
2021mt7915_mcu_sta_bfer_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
2022                        struct ieee80211_vif *vif, struct mt7915_phy *phy,
2023                        bool enable, bool explicit)
2024{
2025        int tx_ant = hweight8(phy->mt76->chainmask) - 1;
2026        struct sta_rec_bf *bf;
2027        struct tlv *tlv;
2028        const u8 matrix[4][4] = {
2029                {0, 0, 0, 0},
2030                {1, 1, 0, 0},   /* 2x1, 2x2, 2x3, 2x4 */
2031                {2, 4, 4, 0},   /* 3x1, 3x2, 3x3, 3x4 */
2032                {3, 5, 6, 0}    /* 4x1, 4x2, 4x3, 4x4 */
2033        };
2034
2035#define MT_BFER_FREE            cpu_to_le16(GENMASK(15, 0))
2036
2037        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BF, sizeof(*bf));
2038        bf = (struct sta_rec_bf *)tlv;
2039
2040        if (!enable) {
2041                bf->pfmu = MT_BFER_FREE;
2042                return;
2043        }
2044
2045        /* he: eBF only, in accordance with spec
2046         * vht: support eBF and iBF
2047         * ht: iBF only, since mac80211 lacks of eBF support
2048         */
2049        if (sta->he_cap.has_he && explicit)
2050                mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
2051        else if (sta->vht_cap.vht_supported)
2052                mt7915_mcu_sta_bfer_vht(sta, phy, bf, explicit);
2053        else if (sta->ht_cap.ht_supported)
2054                mt7915_mcu_sta_bfer_ht(sta, phy, bf);
2055        else
2056                return;
2057
2058        bf->bw = sta->bandwidth;
2059        bf->ibf_dbw = sta->bandwidth;
2060        bf->ibf_nrow = tx_ant;
2061
2062        if (!explicit && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->nc)
2063                bf->ibf_timeout = 0x48;
2064        else
2065                bf->ibf_timeout = 0x18;
2066
2067        if (explicit && bf->nr != tx_ant)
2068                bf->mem_20m = matrix[tx_ant][bf->nc];
2069        else
2070                bf->mem_20m = matrix[bf->nr][bf->nc];
2071
2072        switch (sta->bandwidth) {
2073        case IEEE80211_STA_RX_BW_160:
2074        case IEEE80211_STA_RX_BW_80:
2075                bf->mem_total = bf->mem_20m * 2;
2076                break;
2077        case IEEE80211_STA_RX_BW_40:
2078                bf->mem_total = bf->mem_20m;
2079                break;
2080        case IEEE80211_STA_RX_BW_20:
2081        default:
2082                break;
2083        }
2084}
2085
2086static void
2087mt7915_mcu_sta_bfee_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
2088                        struct mt7915_phy *phy)
2089{
2090        int tx_ant = hweight8(phy->mt76->chainmask) - 1;
2091        struct sta_rec_bfee *bfee;
2092        struct tlv *tlv;
2093        u8 nr = 0;
2094
2095        tlv = mt7915_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
2096        bfee = (struct sta_rec_bfee *)tlv;
2097
2098        if (sta->he_cap.has_he) {
2099                struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
2100
2101                nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
2102                            pe->phy_cap_info[5]);
2103        } else if (sta->vht_cap.vht_supported) {
2104                struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
2105
2106                nr = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
2107                               pc->cap);
2108        }
2109
2110        /* reply with identity matrix to avoid 2x2 BF negative gain */
2111        bfee->fb_identity_matrix = !!(nr == 1 && tx_ant == 2);
2112}
2113
2114static int
2115mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2116                    struct ieee80211_sta *sta, bool enable)
2117{
2118        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2119        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2120        struct mt7915_phy *phy;
2121        struct sk_buff *skb;
2122        int r, len;
2123        bool ebfee = 0, ebf = 0;
2124
2125        if (vif->type != NL80211_IFTYPE_STATION &&
2126            vif->type != NL80211_IFTYPE_AP)
2127                return 0;
2128
2129        phy = mvif->band_idx ? mt7915_ext_phy(dev) : &dev->phy;
2130
2131        if (sta->he_cap.has_he) {
2132                struct ieee80211_he_cap_elem *pe;
2133                const struct ieee80211_he_cap_elem *ve;
2134                const struct ieee80211_sta_he_cap *vc;
2135
2136                pe = &sta->he_cap.he_cap_elem;
2137                vc = mt7915_get_he_phy_cap(phy, vif);
2138                ve = &vc->he_cap_elem;
2139
2140                ebfee = !!(HE_PHY(CAP3_SU_BEAMFORMER, pe->phy_cap_info[3]) &&
2141                           HE_PHY(CAP4_SU_BEAMFORMEE, ve->phy_cap_info[4]));
2142                ebf = !!(HE_PHY(CAP3_SU_BEAMFORMER, ve->phy_cap_info[3]) &&
2143                         HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]));
2144        } else if (sta->vht_cap.vht_supported) {
2145                struct ieee80211_sta_vht_cap *pc;
2146                struct ieee80211_sta_vht_cap *vc;
2147
2148                pc = &sta->vht_cap;
2149                vc = &phy->mt76->sband_5g.sband.vht_cap;
2150
2151                ebfee = !!((pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
2152                           (vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
2153                ebf = !!((vc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) &&
2154                         (pc->cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
2155        }
2156
2157        /* must keep each tag independent */
2158
2159        /* starec bf */
2160        if (ebf || dev->ibf) {
2161                len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bf);
2162
2163                skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2164                if (IS_ERR(skb))
2165                        return PTR_ERR(skb);
2166
2167                mt7915_mcu_sta_bfer_tlv(skb, sta, vif, phy, enable, ebf);
2168
2169                r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2170                                          MCU_EXT_CMD(STA_REC_UPDATE), true);
2171                if (r)
2172                        return r;
2173        }
2174
2175        /* starec bfee */
2176        if (ebfee) {
2177                len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_bfee);
2178
2179                skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2180                if (IS_ERR(skb))
2181                        return PTR_ERR(skb);
2182
2183                mt7915_mcu_sta_bfee_tlv(skb, sta, phy);
2184
2185                r = mt76_mcu_skb_send_msg(&dev->mt76, skb,
2186                                          MCU_EXT_CMD(STA_REC_UPDATE), true);
2187                if (r)
2188                        return r;
2189        }
2190
2191        return 0;
2192}
2193
2194static void
2195mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
2196                             struct ieee80211_vif *vif, struct ieee80211_sta *sta)
2197{
2198        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2199        struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
2200        struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
2201        enum nl80211_band band = chandef->chan->band;
2202        struct sta_rec_ra *ra;
2203        struct tlv *tlv;
2204        u32 supp_rate = sta->supp_rates[band];
2205        u32 cap = sta->wme ? STA_CAP_WMM : 0;
2206
2207        tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
2208        ra = (struct sta_rec_ra *)tlv;
2209
2210        ra->valid = true;
2211        ra->auto_rate = true;
2212        ra->phy_mode = mt7915_get_phy_mode(vif, sta);
2213        ra->channel = chandef->chan->hw_value;
2214        ra->bw = sta->bandwidth;
2215        ra->phy.bw = sta->bandwidth;
2216
2217        if (supp_rate) {
2218                supp_rate &= mask->control[band].legacy;
2219                ra->rate_len = hweight32(supp_rate);
2220
2221                if (band == NL80211_BAND_2GHZ) {
2222                        ra->supp_mode = MODE_CCK;
2223                        ra->supp_cck_rate = supp_rate & GENMASK(3, 0);
2224
2225                        if (ra->rate_len > 4) {
2226                                ra->supp_mode |= MODE_OFDM;
2227                                ra->supp_ofdm_rate = supp_rate >> 4;
2228                        }
2229                } else {
2230                        ra->supp_mode = MODE_OFDM;
2231                        ra->supp_ofdm_rate = supp_rate;
2232                }
2233        }
2234
2235        if (sta->ht_cap.ht_supported) {
2236                const u8 *mcs_mask = mask->control[band].ht_mcs;
2237
2238                ra->supp_mode |= MODE_HT;
2239                ra->af = sta->ht_cap.ampdu_factor;
2240                ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
2241
2242                cap |= STA_CAP_HT;
2243                if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
2244                        cap |= STA_CAP_SGI_20;
2245                if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
2246                        cap |= STA_CAP_SGI_40;
2247                if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
2248                        cap |= STA_CAP_TX_STBC;
2249                if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
2250                        cap |= STA_CAP_RX_STBC;
2251                if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
2252                        cap |= STA_CAP_LDPC;
2253
2254                mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs, mcs_mask);
2255                ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
2256        }
2257
2258        if (sta->vht_cap.vht_supported) {
2259                const u16 *mcs_mask = mask->control[band].vht_mcs;
2260                u8 af;
2261
2262                ra->supp_mode |= MODE_VHT;
2263                af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
2264                               sta->vht_cap.cap);
2265                ra->af = max_t(u8, ra->af, af);
2266
2267                cap |= STA_CAP_VHT;
2268                if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
2269                        cap |= STA_CAP_VHT_SGI_80;
2270                if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
2271                        cap |= STA_CAP_VHT_SGI_160;
2272                if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
2273                        cap |= STA_CAP_VHT_TX_STBC;
2274                if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
2275                        cap |= STA_CAP_VHT_RX_STBC;
2276                if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
2277                        cap |= STA_CAP_VHT_LDPC;
2278
2279                mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs, mcs_mask);
2280        }
2281
2282        if (sta->he_cap.has_he) {
2283                ra->supp_mode |= MODE_HE;
2284                cap |= STA_CAP_HE;
2285        }
2286
2287        ra->sta_cap = cpu_to_le32(cap);
2288}
2289
2290int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2291                             struct ieee80211_sta *sta)
2292{
2293        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2294        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2295        struct sk_buff *skb;
2296        int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_ra);
2297
2298        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2299        if (IS_ERR(skb))
2300                return PTR_ERR(skb);
2301
2302        mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);
2303
2304        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2305                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
2306}
2307
2308int mt7915_mcu_add_he(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2309                      struct ieee80211_sta *sta)
2310{
2311        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2312        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2313        struct sk_buff *skb;
2314        int len;
2315
2316        if (!sta->he_cap.has_he)
2317                return 0;
2318
2319        len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_he);
2320
2321        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2322        if (IS_ERR(skb))
2323                return PTR_ERR(skb);
2324
2325        mt7915_mcu_sta_he_tlv(skb, sta);
2326
2327        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2328                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
2329}
2330
2331static int
2332mt7915_mcu_add_group(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2333                     struct ieee80211_sta *sta)
2334{
2335#define MT_STA_BSS_GROUP                1
2336        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2337        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2338        struct {
2339                __le32 action;
2340                u8 wlan_idx_lo;
2341                u8 status;
2342                u8 wlan_idx_hi;
2343                u8 rsv0[5];
2344                __le32 val;
2345                u8 rsv1[8];
2346        } __packed req = {
2347                .action = cpu_to_le32(MT_STA_BSS_GROUP),
2348                .wlan_idx_lo = to_wcid_lo(msta->wcid.idx),
2349                .wlan_idx_hi = to_wcid_hi(msta->wcid.idx),
2350                .val = cpu_to_le32(mvif->idx % 16),
2351        };
2352
2353        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_DRR_CTRL), &req,
2354                                 sizeof(req), true);
2355}
2356
2357static int
2358mt7915_mcu_add_mu(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2359                  struct ieee80211_sta *sta)
2360{
2361        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2362        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2363        struct sk_buff *skb;
2364        int ret;
2365
2366        if (!sta->vht_cap.vht_supported && !sta->he_cap.has_he)
2367                return 0;
2368
2369        ret = mt7915_mcu_add_group(dev, vif, sta);
2370        if (ret)
2371                return ret;
2372
2373        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
2374                                       MT7915_STA_UPDATE_MAX_SIZE);
2375        if (IS_ERR(skb))
2376                return PTR_ERR(skb);
2377
2378        /* wait until TxBF and MU ready to update stare vht */
2379
2380        /* starec muru */
2381        mt7915_mcu_sta_muru_tlv(skb, sta);
2382        /* starec vht */
2383        mt7915_mcu_sta_vht_tlv(skb, sta);
2384
2385        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2386                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
2387}
2388
2389int mt7915_mcu_add_sta_adv(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2390                           struct ieee80211_sta *sta, bool enable)
2391{
2392        int ret;
2393
2394        if (!sta)
2395                return 0;
2396
2397        /* must keep the order */
2398        ret = mt7915_mcu_add_txbf(dev, vif, sta, enable);
2399        if (ret || !enable)
2400                return ret;
2401
2402        ret = mt7915_mcu_add_mu(dev, vif, sta);
2403        if (ret)
2404                return ret;
2405
2406        return mt7915_mcu_add_rate_ctrl(dev, vif, sta);
2407}
2408
2409int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
2410                       struct ieee80211_sta *sta, bool enable)
2411{
2412        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2413        struct wtbl_req_hdr *wtbl_hdr;
2414        struct mt7915_sta *msta;
2415        struct tlv *sta_wtbl;
2416        struct sk_buff *skb;
2417
2418        msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
2419
2420        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,
2421                                       MT7915_STA_UPDATE_MAX_SIZE);
2422        if (IS_ERR(skb))
2423                return PTR_ERR(skb);
2424
2425        mt7915_mcu_sta_basic_tlv(skb, vif, sta, enable);
2426        if (enable && sta)
2427                mt7915_mcu_sta_tlv(dev, skb, sta, vif);
2428
2429        sta_wtbl = mt7915_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
2430
2431        wtbl_hdr = mt7915_mcu_alloc_wtbl_req(dev, msta, WTBL_RESET_AND_SET,
2432                                             sta_wtbl, &skb);
2433        if (IS_ERR(wtbl_hdr))
2434                return PTR_ERR(wtbl_hdr);
2435
2436        if (enable) {
2437                mt7915_mcu_wtbl_generic_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
2438                mt7915_mcu_wtbl_hdr_trans_tlv(skb, vif, sta, sta_wtbl, wtbl_hdr);
2439                if (sta)
2440                        mt7915_mcu_wtbl_ht_tlv(skb, sta, sta_wtbl, wtbl_hdr);
2441        }
2442
2443        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2444                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
2445}
2446
2447int mt7915_mcu_set_fixed_rate(struct mt7915_dev *dev,
2448                              struct ieee80211_sta *sta, u32 rate)
2449{
2450        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
2451        struct mt7915_vif *mvif = msta->vif;
2452        struct sta_rec_ra_fixed *ra;
2453        struct sk_buff *skb;
2454        struct tlv *tlv;
2455        int len = sizeof(struct sta_req_hdr) + sizeof(*ra);
2456
2457        skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
2458        if (IS_ERR(skb))
2459                return PTR_ERR(skb);
2460
2461        tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
2462        ra = (struct sta_rec_ra_fixed *)tlv;
2463
2464        if (!rate) {
2465                ra->field = cpu_to_le32(RATE_PARAM_AUTO);
2466                goto out;
2467        } else {
2468                ra->field = cpu_to_le32(RATE_PARAM_FIXED);
2469        }
2470
2471        ra->phy.type = FIELD_GET(RATE_CFG_PHY_TYPE, rate);
2472        ra->phy.bw = FIELD_GET(RATE_CFG_BW, rate);
2473        ra->phy.nss = FIELD_GET(RATE_CFG_NSS, rate);
2474        ra->phy.mcs = FIELD_GET(RATE_CFG_MCS, rate);
2475        ra->phy.stbc = FIELD_GET(RATE_CFG_STBC, rate);
2476
2477        if (ra->phy.bw)
2478                ra->phy.ldpc = 7;
2479        else
2480                ra->phy.ldpc = FIELD_GET(RATE_CFG_LDPC, rate) * 7;
2481
2482        /* HT/VHT - SGI: 1, LGI: 0; HE - SGI: 0, MGI: 1, LGI: 2 */
2483        if (ra->phy.type > MT_PHY_TYPE_VHT)
2484                ra->phy.sgi = ra->phy.mcs * 85;
2485        else
2486                ra->phy.sgi = ra->phy.mcs * 15;
2487
2488out:
2489        return mt76_mcu_skb_send_msg(&dev->mt76, skb,
2490                                     MCU_EXT_CMD(STA_REC_UPDATE), true);
2491}
2492
2493int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
2494                            struct ieee80211_vif *vif, bool enable)
2495{
2496        struct mt7915_dev *dev = phy->dev;
2497        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2498        struct {
2499                struct req_hdr {
2500                        u8 omac_idx;
2501                        u8 dbdc_idx;
2502                        __le16 tlv_num;
2503                        u8 is_tlv_append;
2504                        u8 rsv[3];
2505                } __packed hdr;
2506                struct req_tlv {
2507                        __le16 tag;
2508                        __le16 len;
2509                        u8 active;
2510                        u8 dbdc_idx;
2511                        u8 omac_addr[ETH_ALEN];
2512                } __packed tlv;
2513        } data = {
2514                .hdr = {
2515                        .omac_idx = mvif->omac_idx,
2516                        .dbdc_idx = mvif->band_idx,
2517                        .tlv_num = cpu_to_le16(1),
2518                        .is_tlv_append = 1,
2519                },
2520                .tlv = {
2521                        .tag = cpu_to_le16(DEV_INFO_ACTIVE),
2522                        .len = cpu_to_le16(sizeof(struct req_tlv)),
2523                        .active = enable,
2524                        .dbdc_idx = mvif->band_idx,
2525                },
2526        };
2527
2528        if (mvif->omac_idx >= REPEATER_BSSID_START)
2529                return mt7915_mcu_muar_config(phy, vif, false, enable);
2530
2531        memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
2532        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
2533                                 &data, sizeof(data), true);
2534}
2535
2536static void
2537mt7915_mcu_beacon_csa(struct sk_buff *rskb, struct sk_buff *skb,
2538                      struct bss_info_bcn *bcn,
2539                      struct ieee80211_mutable_offsets *offs)
2540{
2541        if (offs->cntdwn_counter_offs[0]) {
2542                struct tlv *tlv;
2543                struct bss_info_bcn_csa *csa;
2544
2545                tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CSA,
2546                                                   sizeof(*csa), &bcn->sub_ntlv,
2547                                                   &bcn->len);
2548                csa = (struct bss_info_bcn_csa *)tlv;
2549                csa->cnt = skb->data[offs->cntdwn_counter_offs[0]];
2550        }
2551}
2552
2553static void
2554mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct sk_buff *rskb,
2555                       struct sk_buff *skb, struct bss_info_bcn *bcn,
2556                       struct ieee80211_mutable_offsets *offs)
2557{
2558        struct mt76_wcid *wcid = &dev->mt76.global_wcid;
2559        struct bss_info_bcn_cont *cont;
2560        struct tlv *tlv;
2561        u8 *buf;
2562        int len = sizeof(*cont) + MT_TXD_SIZE + skb->len;
2563
2564        tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_CONTENT,
2565                                           len, &bcn->sub_ntlv, &bcn->len);
2566
2567        cont = (struct bss_info_bcn_cont *)tlv;
2568        cont->pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
2569        cont->tim_ofs = cpu_to_le16(offs->tim_offset);
2570
2571        if (offs->cntdwn_counter_offs[0])
2572                cont->csa_ofs = cpu_to_le16(offs->cntdwn_counter_offs[0] - 4);
2573
2574        buf = (u8 *)tlv + sizeof(*cont);
2575        mt7915_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, 0, NULL,
2576                              true);
2577        memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
2578}
2579
2580int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,
2581                          struct ieee80211_vif *vif, int en)
2582{
2583#define MAX_BEACON_SIZE 512
2584        struct mt7915_dev *dev = mt7915_hw_dev(hw);
2585        struct mt7915_phy *phy = mt7915_hw_phy(hw);
2586        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
2587        struct ieee80211_mutable_offsets offs;
2588        struct ieee80211_tx_info *info;
2589        struct sk_buff *skb, *rskb;
2590        struct tlv *tlv;
2591        struct bss_info_bcn *bcn;
2592        int len = MT7915_BEACON_UPDATE_SIZE + MAX_BEACON_SIZE;
2593
2594        rskb = mt7915_mcu_alloc_sta_req(dev, mvif, NULL, len);
2595        if (IS_ERR(rskb))
2596                return PTR_ERR(rskb);
2597
2598        tlv = mt7915_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
2599        bcn = (struct bss_info_bcn *)tlv;
2600        bcn->enable = en;
2601
2602        if (!en)
2603                goto out;
2604
2605        skb = ieee80211_beacon_get_template(hw, vif, &offs);
2606        if (!skb)
2607                return -EINVAL;
2608
2609        if (skb->len > MAX_BEACON_SIZE - MT_TXD_SIZE) {
2610                dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
2611                dev_kfree_skb(skb);
2612                return -EINVAL;
2613        }
2614
2615        if (mvif->band_idx) {
2616                info = IEEE80211_SKB_CB(skb);
2617                info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
2618        }
2619
2620        /* TODO: subtag - bss color count & 11v MBSSID */
2621        mt7915_mcu_beacon_csa(rskb, skb, bcn, &offs);
2622        mt7915_mcu_beacon_cont(dev, rskb, skb, bcn, &offs);
2623        dev_kfree_skb(skb);
2624
2625out:
2626        return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
2627                                     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
2628}
2629
2630static int mt7915_mcu_start_firmware(struct mt7915_dev *dev, u32 addr,
2631                                     u32 option)
2632{
2633        struct {
2634                __le32 option;
2635                __le32 addr;
2636        } req = {
2637                .option = cpu_to_le32(option),
2638                .addr = cpu_to_le32(addr),
2639        };
2640
2641        return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(FW_START_REQ), &req,
2642                                 sizeof(req), true);
2643}
2644
2645static int mt7915_mcu_restart(struct mt76_dev *dev)
2646{
2647        struct {
2648                u8 power_mode;
2649                u8 rsv[3];
2650        } req = {
2651                .power_mode = 1,
2652        };
2653
2654        return mt76_mcu_send_msg(dev, MCU_CMD(NIC_POWER_CTRL), &req,
2655                                 sizeof(req), false);
2656}
2657
2658static int mt7915_mcu_patch_sem_ctrl(struct mt7915_dev *dev, bool get)
2659{
2660        struct {
2661                __le32 op;
2662        } req = {
2663                .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE),
2664        };
2665
2666        return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_SEM_CONTROL), &req,
2667                                 sizeof(req), true);
2668}
2669
2670static int mt7915_mcu_start_patch(struct mt7915_dev *dev)
2671{
2672        struct {
2673                u8 check_crc;
2674                u8 reserved[3];
2675        } req = {
2676                .check_crc = 0,
2677        };
2678
2679        return mt76_mcu_send_msg(&dev->mt76, MCU_CMD(PATCH_FINISH_REQ), &req,
2680                                 sizeof(req), true);
2681}
2682
2683static int mt7915_driver_own(struct mt7915_dev *dev)
2684{
2685        mt76_wr(dev, MT_TOP_LPCR_HOST_BAND0, MT_TOP_LPCR_HOST_DRV_OWN);
2686        if (!mt76_poll_msec(dev, MT_TOP_LPCR_HOST_BAND0,
2687                            MT_TOP_LPCR_HOST_FW_OWN, 0, 500)) {
2688                dev_err(dev->mt76.dev, "Timeout for driver own\n");
2689                return -EIO;
2690        }
2691
2692        return 0;
2693}
2694
2695static int mt7915_mcu_init_download(struct mt7915_dev *dev, u32 addr,
2696                                    u32 len, u32 mode)
2697{
2698        struct {
2699                __le32 addr;
2700                __le32 len;
2701                __le32 mode;
2702        } req = {
2703                .addr = cpu_to_le32(addr),
2704                .len = cpu_to_le32(len),
2705                .mode = cpu_to_le32(mode),
2706        };
2707        int attr;
2708
2709        if (req.addr == cpu_to_le32(MCU_PATCH_ADDRESS))
2710                attr = MCU_CMD(PATCH_START_REQ);
2711        else
2712                attr = MCU_CMD(TARGET_ADDRESS_LEN_REQ);
2713
2714        return mt76_mcu_send_msg(&dev->mt76, attr, &req, sizeof(req), true);
2715}
2716
2717static int mt7915_load_patch(struct mt7915_dev *dev)
2718{
2719        const struct mt7915_patch_hdr *hdr;
2720        const struct firmware *fw = NULL;
2721        int i, ret, sem;
2722
2723        sem = mt7915_mcu_patch_sem_ctrl(dev, 1);
2724        switch (sem) {
2725        case PATCH_IS_DL:
2726                return 0;
2727        case PATCH_NOT_DL_SEM_SUCCESS:
2728                break;
2729        default:
2730                dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
2731                return -EAGAIN;
2732        }
2733
2734        ret = request_firmware(&fw, MT7915_ROM_PATCH, dev->mt76.dev);
2735        if (ret)
2736                goto out;
2737
2738        if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2739                dev_err(dev->mt76.dev, "Invalid firmware\n");
2740                ret = -EINVAL;
2741                goto out;
2742        }
2743
2744        hdr = (const struct mt7915_patch_hdr *)(fw->data);
2745
2746        dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
2747                 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
2748
2749        for (i = 0; i < be32_to_cpu(hdr->desc.n_region); i++) {
2750                struct mt7915_patch_sec *sec;
2751                const u8 *dl;
2752                u32 len, addr;
2753
2754                sec = (struct mt7915_patch_sec *)(fw->data + sizeof(*hdr) +
2755                                                  i * sizeof(*sec));
2756                if ((be32_to_cpu(sec->type) & PATCH_SEC_TYPE_MASK) !=
2757                    PATCH_SEC_TYPE_INFO) {
2758                        ret = -EINVAL;
2759                        goto out;
2760                }
2761
2762                addr = be32_to_cpu(sec->info.addr);
2763                len = be32_to_cpu(sec->info.len);
2764                dl = fw->data + be32_to_cpu(sec->offs);
2765
2766                ret = mt7915_mcu_init_download(dev, addr, len,
2767                                               DL_MODE_NEED_RSP);
2768                if (ret) {
2769                        dev_err(dev->mt76.dev, "Download request failed\n");
2770                        goto out;
2771                }
2772
2773                ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2774                                             dl, len);
2775                if (ret) {
2776                        dev_err(dev->mt76.dev, "Failed to send patch\n");
2777                        goto out;
2778                }
2779        }
2780
2781        ret = mt7915_mcu_start_patch(dev);
2782        if (ret)
2783                dev_err(dev->mt76.dev, "Failed to start patch\n");
2784
2785out:
2786        sem = mt7915_mcu_patch_sem_ctrl(dev, 0);
2787        switch (sem) {
2788        case PATCH_REL_SEM_SUCCESS:
2789                break;
2790        default:
2791                ret = -EAGAIN;
2792                dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
2793                goto out;
2794        }
2795        release_firmware(fw);
2796
2797        return ret;
2798}
2799
2800static u32 mt7915_mcu_gen_dl_mode(u8 feature_set, bool is_wa)
2801{
2802        u32 ret = 0;
2803
2804        ret |= (feature_set & FW_FEATURE_SET_ENCRYPT) ?
2805               (DL_MODE_ENCRYPT | DL_MODE_RESET_SEC_IV) : 0;
2806        ret |= FIELD_PREP(DL_MODE_KEY_IDX,
2807                          FIELD_GET(FW_FEATURE_SET_KEY_IDX, feature_set));
2808        ret |= DL_MODE_NEED_RSP;
2809        ret |= is_wa ? DL_MODE_WORKING_PDA_CR4 : 0;
2810
2811        return ret;
2812}
2813
2814static int
2815mt7915_mcu_send_ram_firmware(struct mt7915_dev *dev,
2816                             const struct mt7915_fw_trailer *hdr,
2817                             const u8 *data, bool is_wa)
2818{
2819        int i, offset = 0;
2820        u32 override = 0, option = 0;
2821
2822        for (i = 0; i < hdr->n_region; i++) {
2823                const struct mt7915_fw_region *region;
2824                int err;
2825                u32 len, addr, mode;
2826
2827                region = (const struct mt7915_fw_region *)((const u8 *)hdr -
2828                         (hdr->n_region - i) * sizeof(*region));
2829                mode = mt7915_mcu_gen_dl_mode(region->feature_set, is_wa);
2830                len = le32_to_cpu(region->len);
2831                addr = le32_to_cpu(region->addr);
2832
2833                if (region->feature_set & FW_FEATURE_OVERRIDE_ADDR)
2834                        override = addr;
2835
2836                err = mt7915_mcu_init_download(dev, addr, len, mode);
2837                if (err) {
2838                        dev_err(dev->mt76.dev, "Download request failed\n");
2839                        return err;
2840                }
2841
2842                err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
2843                                             data + offset, len);
2844                if (err) {
2845                        dev_err(dev->mt76.dev, "Failed to send firmware.\n");
2846                        return err;
2847                }
2848
2849                offset += len;
2850        }
2851
2852        if (override)
2853                option |= FW_START_OVERRIDE;
2854
2855        if (is_wa)
2856                option |= FW_START_WORKING_PDA_CR4;
2857
2858        return mt7915_mcu_start_firmware(dev, override, option);
2859}
2860
2861static int mt7915_load_ram(struct mt7915_dev *dev)
2862{
2863        const struct mt7915_fw_trailer *hdr;
2864        const struct firmware *fw;
2865        int ret;
2866
2867        ret = request_firmware(&fw, MT7915_FIRMWARE_WM, dev->mt76.dev);
2868        if (ret)
2869                return ret;
2870
2871        if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2872                dev_err(dev->mt76.dev, "Invalid firmware\n");
2873                ret = -EINVAL;
2874                goto out;
2875        }
2876
2877        hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2878                                        sizeof(*hdr));
2879
2880        dev_info(dev->mt76.dev, "WM Firmware Version: %.10s, Build Time: %.15s\n",
2881                 hdr->fw_ver, hdr->build_date);
2882
2883        ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, false);
2884        if (ret) {
2885                dev_err(dev->mt76.dev, "Failed to start WM firmware\n");
2886                goto out;
2887        }
2888
2889        release_firmware(fw);
2890
2891        ret = request_firmware(&fw, MT7915_FIRMWARE_WA, dev->mt76.dev);
2892        if (ret)
2893                return ret;
2894
2895        if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
2896                dev_err(dev->mt76.dev, "Invalid firmware\n");
2897                ret = -EINVAL;
2898                goto out;
2899        }
2900
2901        hdr = (const struct mt7915_fw_trailer *)(fw->data + fw->size -
2902                                        sizeof(*hdr));
2903
2904        dev_info(dev->mt76.dev, "WA Firmware Version: %.10s, Build Time: %.15s\n",
2905                 hdr->fw_ver, hdr->build_date);
2906
2907        ret = mt7915_mcu_send_ram_firmware(dev, hdr, fw->data, true);
2908        if (ret) {
2909                dev_err(dev->mt76.dev, "Failed to start WA firmware\n");
2910                goto out;
2911        }
2912
2913        snprintf(dev->mt76.hw->wiphy->fw_version,
2914                 sizeof(dev->mt76.hw->wiphy->fw_version),
2915                 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
2916
2917out:
2918        release_firmware(fw);
2919
2920        return ret;
2921}
2922
2923static int mt7915_load_firmware(struct mt7915_dev *dev)
2924{
2925        int ret;
2926
2927        ret = mt7915_load_patch(dev);
2928        if (ret)
2929                return ret;
2930
2931        ret = mt7915_load_ram(dev);
2932        if (ret)
2933                return ret;
2934
2935        if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
2936                            FIELD_PREP(MT_TOP_MISC_FW_STATE,
2937                                       FW_STATE_WACPU_RDY), 1000)) {
2938                dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
2939                return -EIO;
2940        }
2941
2942        mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
2943
2944        dev_dbg(dev->mt76.dev, "Firmware init done\n");
2945
2946        return 0;
2947}
2948
2949int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 ctrl)
2950{
2951        struct {
2952                u8 ctrl_val;
2953                u8 pad[3];
2954        } data = {
2955                .ctrl_val = ctrl
2956        };
2957
2958        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,
2959                                 sizeof(data), true);
2960}
2961
2962int mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level)
2963{
2964        struct {
2965                u8 ver;
2966                u8 pad;
2967                __le16 len;
2968                u8 level;
2969                u8 rsv[3];
2970                __le32 module_idx;
2971        } data = {
2972                .module_idx = cpu_to_le32(module),
2973                .level = level,
2974        };
2975
2976        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_DBG_CTRL), &data,
2977                                 sizeof(data), false);
2978}
2979
2980static int mt7915_mcu_set_mwds(struct mt7915_dev *dev, bool enabled)
2981{
2982        struct {
2983                u8 enable;
2984                u8 _rsv[3];
2985        } __packed req = {
2986                .enable = enabled
2987        };
2988
2989        return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(MWDS_SUPPORT), &req,
2990                                 sizeof(req), false);
2991}
2992
2993int mt7915_mcu_init(struct mt7915_dev *dev)
2994{
2995        static const struct mt76_mcu_ops mt7915_mcu_ops = {
2996                .headroom = sizeof(struct mt7915_mcu_txd),
2997                .mcu_skb_send_msg = mt7915_mcu_send_message,
2998                .mcu_parse_response = mt7915_mcu_parse_response,
2999                .mcu_restart = mt7915_mcu_restart,
3000        };
3001        int ret;
3002
3003        dev->mt76.mcu_ops = &mt7915_mcu_ops;
3004
3005        ret = mt7915_driver_own(dev);
3006        if (ret)
3007                return ret;
3008
3009        ret = mt7915_load_firmware(dev);
3010        if (ret)
3011                return ret;
3012
3013        set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
3014        mt7915_mcu_fw_log_2_host(dev, 0);
3015        mt7915_mcu_set_mwds(dev, 1);
3016        mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_RED, 0, 0);
3017
3018        return 0;
3019}
3020
3021void mt7915_mcu_exit(struct mt7915_dev *dev)
3022{
3023        __mt76_mcu_restart(&dev->mt76);
3024        if (!mt76_poll_msec(dev, MT_TOP_MISC, MT_TOP_MISC_FW_STATE,
3025                            FIELD_PREP(MT_TOP_MISC_FW_STATE,
3026                                       FW_STATE_FW_DOWNLOAD), 1000)) {
3027                dev_err(dev->mt76.dev, "Failed to exit mcu\n");
3028                return;
3029        }
3030
3031        mt76_wr(dev, MT_TOP_LPCR_HOST_BAND0, MT_TOP_LPCR_HOST_FW_OWN);
3032        skb_queue_purge(&dev->mt76.mcu.res_q);
3033}
3034
3035static int
3036mt7915_mcu_set_rx_hdr_trans_blacklist(struct mt7915_dev *dev, int band)
3037{
3038        struct {
3039                u8 operation;
3040                u8 count;
3041                u8 _rsv[2];
3042                u8 index;
3043                u8 enable;
3044                __le16 etype;
3045        } req = {
3046                .operation = 1,
3047                .count = 1,
3048                .enable = 1,
3049                .etype = cpu_to_le16(ETH_P_PAE),
3050        };
3051
3052        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
3053                                 &req, sizeof(req), false);
3054}
3055
3056int mt7915_mcu_set_mac(struct mt7915_dev *dev, int band,
3057                       bool enable, bool hdr_trans)
3058{
3059        struct {
3060                u8 operation;
3061                u8 enable;
3062                u8 check_bssid;
3063                u8 insert_vlan;
3064                u8 remove_vlan;
3065                u8 tid;
3066                u8 mode;
3067                u8 rsv;
3068        } __packed req_trans = {
3069                .enable = hdr_trans,
3070        };
3071        struct {
3072                u8 enable;
3073                u8 band;
3074                u8 rsv[2];
3075        } __packed req_mac = {
3076                .enable = enable,
3077                .band = band,
3078        };
3079        int ret;
3080
3081        ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
3082                                &req_trans, sizeof(req_trans), false);
3083        if (ret)
3084                return ret;
3085
3086        if (hdr_trans)
3087                mt7915_mcu_set_rx_hdr_trans_blacklist(dev, band);
3088
3089        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MAC_INIT_CTRL),
3090                                 &req_mac, sizeof(req_mac), true);
3091}
3092
3093int mt7915_mcu_set_scs(struct mt7915_dev *dev, u8 band, bool enable)
3094{
3095        struct {
3096                __le32 cmd;
3097                u8 band;
3098                u8 enable;
3099        } __packed req = {
3100                .cmd = cpu_to_le32(SCS_ENABLE),
3101                .band = band,
3102                .enable = enable + 1,
3103        };
3104
3105        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SCS_CTRL), &req,
3106                                 sizeof(req), false);
3107}
3108
3109int mt7915_mcu_set_rts_thresh(struct mt7915_phy *phy, u32 val)
3110{
3111        struct mt7915_dev *dev = phy->dev;
3112        struct {
3113                u8 prot_idx;
3114                u8 band;
3115                u8 rsv[2];
3116                __le32 len_thresh;
3117                __le32 pkt_thresh;
3118        } __packed req = {
3119                .prot_idx = 1,
3120                .band = phy != &dev->phy,
3121                .len_thresh = cpu_to_le32(val),
3122                .pkt_thresh = cpu_to_le32(0x2),
3123        };
3124
3125        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PROTECT_CTRL), &req,
3126                                 sizeof(req), true);
3127}
3128
3129int mt7915_mcu_update_edca(struct mt7915_dev *dev, void *param)
3130{
3131        struct mt7915_mcu_tx *req = (struct mt7915_mcu_tx *)param;
3132        u8 num = req->total;
3133        size_t len = sizeof(*req) -
3134                     (IEEE80211_NUM_ACS - num) * sizeof(struct edca);
3135
3136        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE), req,
3137                                 len, true);
3138}
3139
3140int mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif)
3141{
3142#define TX_CMD_MODE             1
3143        struct mt7915_mcu_tx req = {
3144                .valid = true,
3145                .mode = TX_CMD_MODE,
3146                .total = IEEE80211_NUM_ACS,
3147        };
3148        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3149        int ac;
3150
3151        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3152                struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
3153                struct edca *e = &req.edca[ac];
3154
3155                e->set = WMM_PARAM_SET;
3156                e->queue = ac + mvif->wmm_idx * MT7915_MAX_WMM_SETS;
3157                e->aifs = q->aifs;
3158                e->txop = cpu_to_le16(q->txop);
3159
3160                if (q->cw_min)
3161                        e->cw_min = fls(q->cw_min);
3162                else
3163                        e->cw_min = 5;
3164
3165                if (q->cw_max)
3166                        e->cw_max = cpu_to_le16(fls(q->cw_max));
3167                else
3168                        e->cw_max = cpu_to_le16(10);
3169        }
3170
3171        return mt7915_mcu_update_edca(dev, &req);
3172}
3173
3174int mt7915_mcu_set_pm(struct mt7915_dev *dev, int band, int enter)
3175{
3176#define ENTER_PM_STATE          1
3177#define EXIT_PM_STATE           2
3178        struct {
3179                u8 pm_number;
3180                u8 pm_state;
3181                u8 bssid[ETH_ALEN];
3182                u8 dtim_period;
3183                u8 wlan_idx_lo;
3184                __le16 bcn_interval;
3185                __le32 aid;
3186                __le32 rx_filter;
3187                u8 band_idx;
3188                u8 wlan_idx_hi;
3189                u8 rsv[2];
3190                __le32 feature;
3191                u8 omac_idx;
3192                u8 wmm_idx;
3193                u8 bcn_loss_cnt;
3194                u8 bcn_sp_duration;
3195        } __packed req = {
3196                .pm_number = 5,
3197                .pm_state = (enter) ? ENTER_PM_STATE : EXIT_PM_STATE,
3198                .band_idx = band,
3199        };
3200
3201        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(PM_STATE_CTRL), &req,
3202                                 sizeof(req), true);
3203}
3204
3205int mt7915_mcu_rdd_cmd(struct mt7915_dev *dev,
3206                       enum mt7915_rdd_cmd cmd, u8 index,
3207                       u8 rx_sel, u8 val)
3208{
3209        struct {
3210                u8 ctrl;
3211                u8 rdd_idx;
3212                u8 rdd_rx_sel;
3213                u8 val;
3214                u8 rsv[4];
3215        } __packed req = {
3216                .ctrl = cmd,
3217                .rdd_idx = index,
3218                .rdd_rx_sel = rx_sel,
3219                .val = val,
3220        };
3221
3222        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_CTRL), &req,
3223                                 sizeof(req), true);
3224}
3225
3226int mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val)
3227{
3228        struct {
3229                __le32 tag;
3230                __le16 min_lpn;
3231                u8 rsv[2];
3232        } __packed req = {
3233                .tag = cpu_to_le32(0x1),
3234                .min_lpn = cpu_to_le16(val),
3235        };
3236
3237        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3238                                 sizeof(req), true);
3239}
3240
3241int mt7915_mcu_set_pulse_th(struct mt7915_dev *dev,
3242                            const struct mt7915_dfs_pulse *pulse)
3243{
3244        struct {
3245                __le32 tag;
3246
3247                __le32 max_width;               /* us */
3248                __le32 max_pwr;                 /* dbm */
3249                __le32 min_pwr;                 /* dbm */
3250                __le32 min_stgr_pri;            /* us */
3251                __le32 max_stgr_pri;            /* us */
3252                __le32 min_cr_pri;              /* us */
3253                __le32 max_cr_pri;              /* us */
3254        } __packed req = {
3255                .tag = cpu_to_le32(0x3),
3256
3257#define __req_field(field) .field = cpu_to_le32(pulse->field)
3258                __req_field(max_width),
3259                __req_field(max_pwr),
3260                __req_field(min_pwr),
3261                __req_field(min_stgr_pri),
3262                __req_field(max_stgr_pri),
3263                __req_field(min_cr_pri),
3264                __req_field(max_cr_pri),
3265#undef __req_field
3266        };
3267
3268        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3269                                 sizeof(req), true);
3270}
3271
3272int mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index,
3273                            const struct mt7915_dfs_pattern *pattern)
3274{
3275        struct {
3276                __le32 tag;
3277                __le16 radar_type;
3278
3279                u8 enb;
3280                u8 stgr;
3281                u8 min_crpn;
3282                u8 max_crpn;
3283                u8 min_crpr;
3284                u8 min_pw;
3285                __le32 min_pri;
3286                __le32 max_pri;
3287                u8 max_pw;
3288                u8 min_crbn;
3289                u8 max_crbn;
3290                u8 min_stgpn;
3291                u8 max_stgpn;
3292                u8 min_stgpr;
3293                u8 rsv[2];
3294                __le32 min_stgpr_diff;
3295        } __packed req = {
3296                .tag = cpu_to_le32(0x2),
3297                .radar_type = cpu_to_le16(index),
3298
3299#define __req_field_u8(field) .field = pattern->field
3300#define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
3301                __req_field_u8(enb),
3302                __req_field_u8(stgr),
3303                __req_field_u8(min_crpn),
3304                __req_field_u8(max_crpn),
3305                __req_field_u8(min_crpr),
3306                __req_field_u8(min_pw),
3307                __req_field_u32(min_pri),
3308                __req_field_u32(max_pri),
3309                __req_field_u8(max_pw),
3310                __req_field_u8(min_crbn),
3311                __req_field_u8(max_crbn),
3312                __req_field_u8(min_stgpn),
3313                __req_field_u8(max_stgpn),
3314                __req_field_u8(min_stgpr),
3315                __req_field_u32(min_stgpr_diff),
3316#undef __req_field_u8
3317#undef __req_field_u32
3318        };
3319
3320        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_TH), &req,
3321                                 sizeof(req), true);
3322}
3323
3324int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
3325{
3326        struct mt7915_dev *dev = phy->dev;
3327        struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3328        int freq1 = chandef->center_freq1;
3329        bool ext_phy = phy != &dev->phy;
3330        struct {
3331                u8 control_ch;
3332                u8 center_ch;
3333                u8 bw;
3334                u8 tx_streams_num;
3335                u8 rx_streams;  /* mask or num */
3336                u8 switch_reason;
3337                u8 band_idx;
3338                u8 center_ch2;  /* for 80+80 only */
3339                __le16 cac_case;
3340                u8 channel_band;
3341                u8 rsv0;
3342                __le32 outband_freq;
3343                u8 txpower_drop;
3344                u8 ap_bw;
3345                u8 ap_center_ch;
3346                u8 rsv1[57];
3347        } __packed req = {
3348                .control_ch = chandef->chan->hw_value,
3349                .center_ch = ieee80211_frequency_to_channel(freq1),
3350                .bw = mt7915_mcu_chan_bw(chandef),
3351                .tx_streams_num = hweight8(phy->mt76->antenna_mask),
3352                .rx_streams = phy->mt76->antenna_mask,
3353                .band_idx = ext_phy,
3354                .channel_band = chandef->chan->band,
3355        };
3356
3357#ifdef CONFIG_NL80211_TESTMODE
3358        if (phy->mt76->test.tx_antenna_mask &&
3359            (phy->mt76->test.state == MT76_TM_STATE_TX_FRAMES ||
3360             phy->mt76->test.state == MT76_TM_STATE_RX_FRAMES ||
3361             phy->mt76->test.state == MT76_TM_STATE_TX_CONT)) {
3362                req.tx_streams_num = fls(phy->mt76->test.tx_antenna_mask);
3363                req.rx_streams = phy->mt76->test.tx_antenna_mask;
3364
3365                if (ext_phy) {
3366                        req.tx_streams_num = 2;
3367                        req.rx_streams >>= 2;
3368                }
3369        }
3370#endif
3371
3372        if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
3373                req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
3374        else if ((chandef->chan->flags & IEEE80211_CHAN_RADAR) &&
3375                 chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
3376                req.switch_reason = CH_SWITCH_DFS;
3377        else
3378                req.switch_reason = CH_SWITCH_NORMAL;
3379
3380        if (cmd == MCU_EXT_CMD(CHANNEL_SWITCH))
3381                req.rx_streams = hweight8(req.rx_streams);
3382
3383        if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
3384                int freq2 = chandef->center_freq2;
3385
3386                req.center_ch2 = ieee80211_frequency_to_channel(freq2);
3387        }
3388
3389        return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
3390}
3391
3392static int mt7915_mcu_set_eeprom_flash(struct mt7915_dev *dev)
3393{
3394#define TOTAL_PAGE_MASK         GENMASK(7, 5)
3395#define PAGE_IDX_MASK           GENMASK(4, 2)
3396#define PER_PAGE_SIZE           0x400
3397        struct mt7915_mcu_eeprom req = { .buffer_mode = EE_MODE_BUFFER };
3398        u8 total = MT7915_EEPROM_SIZE / PER_PAGE_SIZE;
3399        u8 *eep = (u8 *)dev->mt76.eeprom.data;
3400        int eep_len;
3401        int i;
3402
3403        for (i = 0; i <= total; i++, eep += eep_len) {
3404                struct sk_buff *skb;
3405                int ret;
3406
3407                if (i == total)
3408                        eep_len = MT7915_EEPROM_SIZE % PER_PAGE_SIZE;
3409                else
3410                        eep_len = PER_PAGE_SIZE;
3411
3412                skb = mt76_mcu_msg_alloc(&dev->mt76, NULL,
3413                                         sizeof(req) + eep_len);
3414                if (!skb)
3415                        return -ENOMEM;
3416
3417                req.format = FIELD_PREP(TOTAL_PAGE_MASK, total) |
3418                             FIELD_PREP(PAGE_IDX_MASK, i) | EE_FORMAT_WHOLE;
3419                req.len = cpu_to_le16(eep_len);
3420
3421                skb_put_data(skb, &req, sizeof(req));
3422                skb_put_data(skb, eep, eep_len);
3423
3424                ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,
3425                                            MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
3426                if (ret)
3427                        return ret;
3428        }
3429
3430        return 0;
3431}
3432
3433int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)
3434{
3435        struct mt7915_mcu_eeprom req = {
3436                .buffer_mode = EE_MODE_EFUSE,
3437                .format = EE_FORMAT_WHOLE,
3438        };
3439
3440        if (dev->flash_mode)
3441                return mt7915_mcu_set_eeprom_flash(dev);
3442
3443        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EFUSE_BUFFER_MODE),
3444                                 &req, sizeof(req), true);
3445}
3446
3447int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)
3448{
3449        struct mt7915_mcu_eeprom_info req = {
3450                .addr = cpu_to_le32(round_down(offset,
3451                                    MT7915_EEPROM_BLOCK_SIZE)),
3452        };
3453        struct mt7915_mcu_eeprom_info *res;
3454        struct sk_buff *skb;
3455        int ret;
3456        u8 *buf;
3457
3458        ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req,
3459                                sizeof(req), true, &skb);
3460        if (ret)
3461                return ret;
3462
3463        res = (struct mt7915_mcu_eeprom_info *)skb->data;
3464        buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);
3465        memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE);
3466        dev_kfree_skb(skb);
3467
3468        return 0;
3469}
3470
3471static int mt7915_mcu_set_pre_cal(struct mt7915_dev *dev, u8 idx,
3472                                  u8 *data, u32 len, int cmd)
3473{
3474        struct {
3475                u8 dir;
3476                u8 valid;
3477                __le16 bitmap;
3478                s8 precal;
3479                u8 action;
3480                u8 band;
3481                u8 idx;
3482                u8 rsv[4];
3483                __le32 len;
3484        } req;
3485        struct sk_buff *skb;
3486
3487        skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req) + len);
3488        if (!skb)
3489                return -ENOMEM;
3490
3491        req.idx = idx;
3492        req.len = cpu_to_le32(len);
3493        skb_put_data(skb, &req, sizeof(req));
3494        skb_put_data(skb, data, len);
3495
3496        return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, false);
3497}
3498
3499int mt7915_mcu_apply_group_cal(struct mt7915_dev *dev)
3500{
3501        u8 idx = 0, *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3502        u32 total = MT_EE_CAL_GROUP_SIZE;
3503
3504        if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_GROUP))
3505                return 0;
3506
3507        /*
3508         * Items: Rx DCOC, RSSI DCOC, Tx TSSI DCOC, Tx LPFG
3509         * Tx FDIQ, Tx DCIQ, Rx FDIQ, Rx FIIQ, ADCDCOC
3510         */
3511        while (total > 0) {
3512                int ret, len;
3513
3514                len = min_t(u32, total, MT_EE_CAL_UNIT);
3515
3516                ret = mt7915_mcu_set_pre_cal(dev, idx, cal, len,
3517                                             MCU_EXT_CMD(GROUP_PRE_CAL_INFO));
3518                if (ret)
3519                        return ret;
3520
3521                total -= len;
3522                cal += len;
3523                idx++;
3524        }
3525
3526        return 0;
3527}
3528
3529static int mt7915_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
3530{
3531        int i;
3532
3533        for (i = 0; i < n_freqs; i++)
3534                if (cur == freqs[i])
3535                        return i;
3536
3537        return -1;
3538}
3539
3540static int mt7915_dpd_freq_idx(u16 freq, u8 bw)
3541{
3542        static const u16 freq_list[] = {
3543                5180, 5200, 5220, 5240,
3544                5260, 5280, 5300, 5320,
3545                5500, 5520, 5540, 5560,
3546                5580, 5600, 5620, 5640,
3547                5660, 5680, 5700, 5745,
3548                5765, 5785, 5805, 5825
3549        };
3550        int offset_2g = ARRAY_SIZE(freq_list);
3551        int idx;
3552
3553        if (freq < 4000) {
3554                if (freq < 2432)
3555                        return offset_2g;
3556                if (freq < 2457)
3557                        return offset_2g + 1;
3558
3559                return offset_2g + 2;
3560        }
3561
3562        if (bw == NL80211_CHAN_WIDTH_80P80 || bw == NL80211_CHAN_WIDTH_160)
3563                return -1;
3564
3565        if (bw != NL80211_CHAN_WIDTH_20) {
3566                idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3567                                           freq + 10);
3568                if (idx >= 0)
3569                        return idx;
3570
3571                idx = mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
3572                                           freq - 10);
3573                if (idx >= 0)
3574                        return idx;
3575        }
3576
3577        return mt7915_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
3578}
3579
3580int mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy)
3581{
3582        struct mt7915_dev *dev = phy->dev;
3583        struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
3584        u16 total = 2, center_freq = chandef->center_freq1;
3585        u8 *cal = dev->cal, *eep = dev->mt76.eeprom.data;
3586        int idx;
3587
3588        if (!(eep[MT_EE_DO_PRE_CAL] & MT_EE_WIFI_CAL_DPD))
3589                return 0;
3590
3591        idx = mt7915_dpd_freq_idx(center_freq, chandef->width);
3592        if (idx < 0)
3593                return -EINVAL;
3594
3595        /* Items: Tx DPD, Tx Flatness */
3596        idx = idx * 2;
3597        cal += MT_EE_CAL_GROUP_SIZE;
3598
3599        while (total--) {
3600                int ret;
3601
3602                cal += (idx * MT_EE_CAL_UNIT);
3603                ret = mt7915_mcu_set_pre_cal(dev, idx, cal, MT_EE_CAL_UNIT,
3604                                             MCU_EXT_CMD(DPD_PRE_CAL_INFO));
3605                if (ret)
3606                        return ret;
3607
3608                idx++;
3609        }
3610
3611        return 0;
3612}
3613
3614int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch)
3615{
3616        /* strict order */
3617        static const enum mt7915_chan_mib_offs offs[] = {
3618                MIB_BUSY_TIME, MIB_TX_TIME, MIB_RX_TIME, MIB_OBSS_AIRTIME
3619        };
3620        struct mt76_channel_state *state = phy->mt76->chan_state;
3621        struct mt76_channel_state *state_ts = &phy->state_ts;
3622        struct mt7915_dev *dev = phy->dev;
3623        struct mt7915_mcu_mib *res, req[4];
3624        struct sk_buff *skb;
3625        int i, ret;
3626
3627        for (i = 0; i < 4; i++) {
3628                req[i].band = cpu_to_le32(phy != &dev->phy);
3629                req[i].offs = cpu_to_le32(offs[i]);
3630        }
3631
3632        ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO),
3633                                        req, sizeof(req), true, &skb);
3634        if (ret)
3635                return ret;
3636
3637        res = (struct mt7915_mcu_mib *)(skb->data + 20);
3638
3639        if (chan_switch)
3640                goto out;
3641
3642#define __res_u64(s) le64_to_cpu(res[s].data)
3643        state->cc_busy += __res_u64(0) - state_ts->cc_busy;
3644        state->cc_tx += __res_u64(1) - state_ts->cc_tx;
3645        state->cc_bss_rx += __res_u64(2) - state_ts->cc_bss_rx;
3646        state->cc_rx += __res_u64(2) + __res_u64(3) - state_ts->cc_rx;
3647
3648out:
3649        state_ts->cc_busy = __res_u64(0);
3650        state_ts->cc_tx = __res_u64(1);
3651        state_ts->cc_bss_rx = __res_u64(2);
3652        state_ts->cc_rx = __res_u64(2) + __res_u64(3);
3653#undef __res_u64
3654
3655        dev_kfree_skb(skb);
3656
3657        return 0;
3658}
3659
3660int mt7915_mcu_get_temperature(struct mt7915_phy *phy)
3661{
3662        struct mt7915_dev *dev = phy->dev;
3663        struct {
3664                u8 ctrl_id;
3665                u8 action;
3666                u8 dbdc_idx;
3667                u8 rsv[5];
3668        } req = {
3669                .ctrl_id = THERMAL_SENSOR_TEMP_QUERY,
3670                .dbdc_idx = phy != &dev->phy,
3671        };
3672
3673        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req,
3674                                 sizeof(req), true);
3675}
3676
3677int mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state)
3678{
3679        struct mt7915_dev *dev = phy->dev;
3680        struct {
3681                struct mt7915_mcu_thermal_ctrl ctrl;
3682
3683                __le32 trigger_temp;
3684                __le32 restore_temp;
3685                __le16 sustain_time;
3686                u8 rsv[2];
3687        } __packed req = {
3688                .ctrl = {
3689                        .band_idx = phy != &dev->phy,
3690                },
3691        };
3692        int level;
3693
3694#define TRIGGER_TEMPERATURE     122
3695#define RESTORE_TEMPERATURE     116
3696#define SUSTAIN_PERIOD          10
3697
3698        if (!state) {
3699                req.ctrl.ctrl_id = THERMAL_PROTECT_DISABLE;
3700                goto out;
3701        }
3702
3703        /* set duty cycle and level */
3704        for (level = 0; level < 4; level++) {
3705                int ret;
3706
3707                req.ctrl.ctrl_id = THERMAL_PROTECT_DUTY_CONFIG;
3708                req.ctrl.duty.duty_level = level;
3709                req.ctrl.duty.duty_cycle = state;
3710                state = state * 4 / 5;
3711
3712                ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3713                                        &req, sizeof(req.ctrl), false);
3714                if (ret)
3715                        return ret;
3716        }
3717
3718        /* currently use fixed values for throttling, and would be better
3719         * to implement thermal zone for dynamic trip in the long run.
3720         */
3721
3722        /* set high-temperature trigger threshold */
3723        req.ctrl.ctrl_id = THERMAL_PROTECT_ENABLE;
3724        req.trigger_temp = cpu_to_le32(TRIGGER_TEMPERATURE);
3725        req.restore_temp = cpu_to_le32(RESTORE_TEMPERATURE);
3726        req.sustain_time = cpu_to_le16(SUSTAIN_PERIOD);
3727
3728out:
3729        req.ctrl.type.protect_type = 1;
3730        req.ctrl.type.trigger_type = 1;
3731
3732        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_PROT),
3733                                 &req, sizeof(req), false);
3734}
3735
3736int mt7915_mcu_get_tx_rate(struct mt7915_dev *dev, u32 cmd, u16 wlan_idx)
3737{
3738        struct {
3739                __le32 cmd;
3740                __le16 wlan_idx;
3741                __le16 ru_idx;
3742                __le16 direction;
3743                __le16 dump_group;
3744        } req = {
3745                .cmd = cpu_to_le32(cmd),
3746                .wlan_idx = cpu_to_le16(wlan_idx),
3747                .dump_group = cpu_to_le16(1),
3748        };
3749
3750        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RATE_CTRL), &req,
3751                                 sizeof(req), false);
3752}
3753
3754int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
3755{
3756        struct mt7915_dev *dev = phy->dev;
3757        struct mt76_phy *mphy = phy->mt76;
3758        struct ieee80211_hw *hw = mphy->hw;
3759        struct mt7915_sku_val {
3760                u8 format_id;
3761                u8 limit_type;
3762                u8 dbdc_idx;
3763                s8 val[MT7915_SKU_RATE_NUM];
3764        } __packed req = {
3765                .format_id = 4,
3766                .dbdc_idx = phy != &dev->phy,
3767        };
3768        struct mt76_power_limits limits_array;
3769        s8 *la = (s8 *)&limits_array;
3770        int i, idx, n_chains = hweight8(mphy->antenna_mask);
3771        int tx_power;
3772
3773        tx_power = hw->conf.power_level * 2 -
3774                   mt76_tx_power_nss_delta(n_chains);
3775
3776        tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
3777                                              &limits_array, tx_power);
3778        mphy->txpower_cur = tx_power;
3779
3780        for (i = 0, idx = 0; i < ARRAY_SIZE(mt7915_sku_group_len); i++) {
3781                u8 mcs_num, len = mt7915_sku_group_len[i];
3782                int j;
3783
3784                if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
3785                        mcs_num = 10;
3786
3787                        if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
3788                                la = (s8 *)&limits_array + 12;
3789                } else {
3790                        mcs_num = len;
3791                }
3792
3793                for (j = 0; j < min_t(u8, mcs_num, len); j++)
3794                        req.val[idx + j] = la[j];
3795
3796                la += mcs_num;
3797                idx += len;
3798        }
3799
3800        return mt76_mcu_send_msg(&dev->mt76,
3801                                 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3802                                 sizeof(req), true);
3803}
3804
3805int mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len)
3806{
3807#define RATE_POWER_INFO 2
3808        struct mt7915_dev *dev = phy->dev;
3809        struct {
3810                u8 format_id;
3811                u8 category;
3812                u8 band;
3813                u8 _rsv;
3814        } __packed req = {
3815                .format_id = 7,
3816                .category = RATE_POWER_INFO,
3817                .band = phy != &dev->phy,
3818        };
3819        s8 res[MT7915_SKU_RATE_NUM][2];
3820        struct sk_buff *skb;
3821        int ret, i;
3822
3823        ret = mt76_mcu_send_and_get_msg(&dev->mt76,
3824                                        MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
3825                                        &req, sizeof(req), true, &skb);
3826        if (ret)
3827                return ret;
3828
3829        memcpy(res, skb->data + 4, sizeof(res));
3830        for (i = 0; i < len; i++)
3831                txpower[i] = res[i][req.band];
3832
3833        dev_kfree_skb(skb);
3834
3835        return 0;
3836}
3837
3838int mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode,
3839                              u8 en)
3840{
3841        struct {
3842                u8 test_mode_en;
3843                u8 param_idx;
3844                u8 _rsv[2];
3845
3846                u8 enable;
3847                u8 _rsv2[3];
3848
3849                u8 pad[8];
3850        } __packed req = {
3851                .test_mode_en = test_mode,
3852                .param_idx = param,
3853                .enable = en,
3854        };
3855
3856        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL), &req,
3857                                 sizeof(req), false);
3858}
3859
3860int mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable)
3861{
3862        struct mt7915_dev *dev = phy->dev;
3863        struct mt7915_sku {
3864                u8 format_id;
3865                u8 sku_enable;
3866                u8 dbdc_idx;
3867                u8 rsv;
3868        } __packed req = {
3869                .format_id = 0,
3870                .dbdc_idx = phy != &dev->phy,
3871                .sku_enable = enable,
3872        };
3873
3874        return mt76_mcu_send_msg(&dev->mt76,
3875                                 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,
3876                                 sizeof(req), true);
3877}
3878
3879int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
3880{
3881        struct {
3882                u8 action;
3883                u8 set;
3884                u8 band;
3885                u8 rsv;
3886        } req = {
3887                .action = action,
3888                .set = set,
3889                .band = band,
3890        };
3891
3892        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SER_TRIGGER),
3893                                 &req, sizeof(req), false);
3894}
3895
3896int mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action)
3897{
3898        struct {
3899                u8 action;
3900                union {
3901                        struct {
3902                                u8 snd_mode;
3903                                u8 sta_num;
3904                                u8 rsv;
3905                                u8 wlan_idx[4];
3906                                __le32 snd_period;      /* ms */
3907                        } __packed snd;
3908                        struct {
3909                                bool ebf;
3910                                bool ibf;
3911                                u8 rsv;
3912                        } __packed type;
3913                        struct {
3914                                u8 bf_num;
3915                                u8 bf_bitmap;
3916                                u8 bf_sel[8];
3917                                u8 rsv[5];
3918                        } __packed mod;
3919                };
3920        } __packed req = {
3921                .action = action,
3922        };
3923
3924#define MT_BF_PROCESSING        4
3925        switch (action) {
3926        case MT_BF_SOUNDING_ON:
3927                req.snd.snd_mode = MT_BF_PROCESSING;
3928                break;
3929        case MT_BF_TYPE_UPDATE:
3930                req.type.ebf = true;
3931                req.type.ibf = dev->ibf;
3932                break;
3933        case MT_BF_MODULE_UPDATE:
3934                req.mod.bf_num = 2;
3935                req.mod.bf_bitmap = GENMASK(1, 0);
3936                break;
3937        default:
3938                return -EINVAL;
3939        }
3940
3941        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
3942                                 sizeof(req), true);
3943}
3944
3945int mt7915_mcu_add_obss_spr(struct mt7915_dev *dev, struct ieee80211_vif *vif,
3946                            bool enable)
3947{
3948#define MT_SPR_ENABLE           1
3949        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3950        struct {
3951                u8 action;
3952                u8 arg_num;
3953                u8 band_idx;
3954                u8 status;
3955                u8 drop_tx_idx;
3956                u8 sta_idx;     /* 256 sta */
3957                u8 rsv[2];
3958                __le32 val;
3959        } __packed req = {
3960                .action = MT_SPR_ENABLE,
3961                .arg_num = 1,
3962                .band_idx = mvif->band_idx,
3963                .val = cpu_to_le32(enable),
3964        };
3965
3966        return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_SPR), &req,
3967                                 sizeof(req), true);
3968}
3969
3970int mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif,
3971                           struct ieee80211_sta *sta, struct rate_info *rate)
3972{
3973        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
3974        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
3975        struct mt7915_dev *dev = phy->dev;
3976        struct mt76_phy *mphy = phy->mt76;
3977        struct {
3978                u8 category;
3979                u8 band;
3980                __le16 wcid;
3981        } __packed req = {
3982                .category = MCU_PHY_STATE_CONTENTION_RX_RATE,
3983                .band = mvif->band_idx,
3984                .wcid = cpu_to_le16(msta->wcid.idx),
3985        };
3986        struct ieee80211_supported_band *sband;
3987        struct mt7915_mcu_phy_rx_info *res;
3988        struct sk_buff *skb;
3989        int ret;
3990        bool cck = false;
3991
3992        ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(PHY_STAT_INFO),
3993                                        &req, sizeof(req), true, &skb);
3994        if (ret)
3995                return ret;
3996
3997        res = (struct mt7915_mcu_phy_rx_info *)skb->data;
3998
3999        rate->mcs = res->rate;
4000        rate->nss = res->nsts + 1;
4001
4002        switch (res->mode) {
4003        case MT_PHY_TYPE_CCK:
4004                cck = true;
4005                fallthrough;
4006        case MT_PHY_TYPE_OFDM:
4007                if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)
4008                        sband = &mphy->sband_5g.sband;
4009                else
4010                        sband = &mphy->sband_2g.sband;
4011
4012                rate->mcs = mt76_get_rate(&dev->mt76, sband, rate->mcs, cck);
4013                rate->legacy = sband->bitrates[rate->mcs].bitrate;
4014                break;
4015        case MT_PHY_TYPE_HT:
4016        case MT_PHY_TYPE_HT_GF:
4017                if (rate->mcs > 31) {
4018                        ret = -EINVAL;
4019                        goto out;
4020                }
4021
4022                rate->flags = RATE_INFO_FLAGS_MCS;
4023                if (res->gi)
4024                        rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
4025                break;
4026        case MT_PHY_TYPE_VHT:
4027                if (rate->mcs > 9) {
4028                        ret = -EINVAL;
4029                        goto out;
4030                }
4031
4032                rate->flags = RATE_INFO_FLAGS_VHT_MCS;
4033                if (res->gi)
4034                        rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
4035                break;
4036        case MT_PHY_TYPE_HE_SU:
4037        case MT_PHY_TYPE_HE_EXT_SU:
4038        case MT_PHY_TYPE_HE_TB:
4039        case MT_PHY_TYPE_HE_MU:
4040                if (res->gi > NL80211_RATE_INFO_HE_GI_3_2 || rate->mcs > 11) {
4041                        ret = -EINVAL;
4042                        goto out;
4043                }
4044                rate->he_gi = res->gi;
4045                rate->flags = RATE_INFO_FLAGS_HE_MCS;
4046                break;
4047        default:
4048                ret = -EINVAL;
4049                goto out;
4050        }
4051
4052        switch (res->bw) {
4053        case IEEE80211_STA_RX_BW_160:
4054                rate->bw = RATE_INFO_BW_160;
4055                break;
4056        case IEEE80211_STA_RX_BW_80:
4057                rate->bw = RATE_INFO_BW_80;
4058                break;
4059        case IEEE80211_STA_RX_BW_40:
4060                rate->bw = RATE_INFO_BW_40;
4061                break;
4062        default:
4063                rate->bw = RATE_INFO_BW_20;
4064                break;
4065        }
4066
4067out:
4068        dev_kfree_skb(skb);
4069
4070        return ret;
4071}
4072