cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mcu.c (62981B)


      1// SPDX-License-Identifier: ISC
      2/* Copyright (C) 2019 MediaTek Inc.
      3 *
      4 * Author: Roy Luo <royluo@google.com>
      5 *         Ryder Lee <ryder.lee@mediatek.com>
      6 */
      7
      8#include <linux/firmware.h>
      9#include "mt7615.h"
     10#include "mcu.h"
     11#include "mac.h"
     12#include "eeprom.h"
     13
     14static bool prefer_offload_fw = true;
     15module_param(prefer_offload_fw, bool, 0644);
     16MODULE_PARM_DESC(prefer_offload_fw,
     17		 "Prefer client mode offload firmware (MT7663)");
     18
     19struct mt7615_patch_hdr {
     20	char build_date[16];
     21	char platform[4];
     22	__be32 hw_sw_ver;
     23	__be32 patch_ver;
     24	__be16 checksum;
     25} __packed;
     26
     27struct mt7615_fw_trailer {
     28	__le32 addr;
     29	u8 chip_id;
     30	u8 feature_set;
     31	u8 eco_code;
     32	char fw_ver[10];
     33	char build_date[15];
     34	__le32 len;
     35} __packed;
     36
     37#define FW_V3_COMMON_TAILER_SIZE	36
     38#define FW_V3_REGION_TAILER_SIZE	40
     39#define FW_START_OVERRIDE		BIT(0)
     40#define FW_START_DLYCAL                 BIT(1)
     41#define FW_START_WORKING_PDA_CR4	BIT(2)
     42
     43struct mt7663_fw_trailer {
     44	u8 chip_id;
     45	u8 eco_code;
     46	u8 n_region;
     47	u8 format_ver;
     48	u8 format_flag;
     49	u8 reserv[2];
     50	char fw_ver[10];
     51	char build_date[15];
     52	__le32 crc;
     53} __packed;
     54
     55struct mt7663_fw_buf {
     56	__le32 crc;
     57	__le32 d_img_size;
     58	__le32 block_size;
     59	u8 rsv[4];
     60	__le32 img_dest_addr;
     61	__le32 img_size;
     62	u8 feature_set;
     63};
     64
     65#define MT7615_PATCH_ADDRESS		0x80000
     66#define MT7622_PATCH_ADDRESS		0x9c000
     67#define MT7663_PATCH_ADDRESS		0xdc000
     68
     69#define N9_REGION_NUM			2
     70#define CR4_REGION_NUM			1
     71
     72#define IMG_CRC_LEN			4
     73
     74void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
     75			 int cmd, int *wait_seq)
     76{
     77	int txd_len, mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
     78	struct mt7615_uni_txd *uni_txd;
     79	struct mt7615_mcu_txd *mcu_txd;
     80	u8 seq, q_idx, pkt_fmt;
     81	__le32 *txd;
     82	u32 val;
     83
     84	/* TODO: make dynamic based on msg type */
     85	dev->mt76.mcu.timeout = 20 * HZ;
     86
     87	seq = ++dev->mt76.mcu.msg_seq & 0xf;
     88	if (!seq)
     89		seq = ++dev->mt76.mcu.msg_seq & 0xf;
     90	if (wait_seq)
     91		*wait_seq = seq;
     92
     93	txd_len = cmd & __MCU_CMD_FIELD_UNI ? sizeof(*uni_txd) : sizeof(*mcu_txd);
     94	txd = (__le32 *)skb_push(skb, txd_len);
     95
     96	if (cmd != MCU_CMD(FW_SCATTER)) {
     97		q_idx = MT_TX_MCU_PORT_RX_Q0;
     98		pkt_fmt = MT_TX_TYPE_CMD;
     99	} else {
    100		q_idx = MT_TX_MCU_PORT_RX_FWDL;
    101		pkt_fmt = MT_TX_TYPE_FW;
    102	}
    103
    104	val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
    105	      FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
    106	      FIELD_PREP(MT_TXD0_Q_IDX, q_idx);
    107	txd[0] = cpu_to_le32(val);
    108
    109	val = MT_TXD1_LONG_FORMAT |
    110	      FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) |
    111	      FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt);
    112	txd[1] = cpu_to_le32(val);
    113
    114	if (cmd & __MCU_CMD_FIELD_UNI) {
    115		uni_txd = (struct mt7615_uni_txd *)txd;
    116		uni_txd->len = cpu_to_le16(skb->len - sizeof(uni_txd->txd));
    117		uni_txd->option = MCU_CMD_UNI_EXT_ACK;
    118		uni_txd->cid = cpu_to_le16(mcu_cmd);
    119		uni_txd->s2d_index = MCU_S2D_H2N;
    120		uni_txd->pkt_type = MCU_PKT_ID;
    121		uni_txd->seq = seq;
    122
    123		return;
    124	}
    125
    126	mcu_txd = (struct mt7615_mcu_txd *)txd;
    127	mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd));
    128	mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx));
    129	mcu_txd->s2d_index = MCU_S2D_H2N;
    130	mcu_txd->pkt_type = MCU_PKT_ID;
    131	mcu_txd->seq = seq;
    132	mcu_txd->cid = mcu_cmd;
    133	mcu_txd->ext_cid = FIELD_GET(__MCU_CMD_FIELD_EXT_ID, cmd);
    134
    135	if (mcu_txd->ext_cid || (cmd & __MCU_CMD_FIELD_CE)) {
    136		if (cmd & __MCU_CMD_FIELD_QUERY)
    137			mcu_txd->set_query = MCU_Q_QUERY;
    138		else
    139			mcu_txd->set_query = MCU_Q_SET;
    140		mcu_txd->ext_cid_ack = !!mcu_txd->ext_cid;
    141	} else {
    142		mcu_txd->set_query = MCU_Q_NA;
    143	}
    144}
    145EXPORT_SYMBOL_GPL(mt7615_mcu_fill_msg);
    146
    147int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
    148			      struct sk_buff *skb, int seq)
    149{
    150	struct mt7615_mcu_rxd *rxd;
    151	int ret = 0;
    152
    153	if (!skb) {
    154		dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
    155			cmd, seq);
    156		return -ETIMEDOUT;
    157	}
    158
    159	rxd = (struct mt7615_mcu_rxd *)skb->data;
    160	if (seq != rxd->seq)
    161		return -EAGAIN;
    162
    163	if (cmd == MCU_CMD(PATCH_SEM_CONTROL)) {
    164		skb_pull(skb, sizeof(*rxd) - 4);
    165		ret = *skb->data;
    166	} else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
    167		skb_pull(skb, sizeof(*rxd));
    168		ret = le32_to_cpu(*(__le32 *)skb->data);
    169	} else if (cmd == MCU_EXT_QUERY(RF_REG_ACCESS)) {
    170		skb_pull(skb, sizeof(*rxd));
    171		ret = le32_to_cpu(*(__le32 *)&skb->data[8]);
    172	} else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
    173		   cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
    174		   cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
    175		   cmd == MCU_UNI_CMD(HIF_CTRL) ||
    176		   cmd == MCU_UNI_CMD(OFFLOAD) ||
    177		   cmd == MCU_UNI_CMD(SUSPEND)) {
    178		struct mt7615_mcu_uni_event *event;
    179
    180		skb_pull(skb, sizeof(*rxd));
    181		event = (struct mt7615_mcu_uni_event *)skb->data;
    182		ret = le32_to_cpu(event->status);
    183	} else if (cmd == MCU_CE_QUERY(REG_READ)) {
    184		struct mt7615_mcu_reg_event *event;
    185
    186		skb_pull(skb, sizeof(*rxd));
    187		event = (struct mt7615_mcu_reg_event *)skb->data;
    188		ret = (int)le32_to_cpu(event->val);
    189	}
    190
    191	return ret;
    192}
    193EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
    194
    195static int
    196mt7615_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
    197			int cmd, int *seq)
    198{
    199	struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
    200	enum mt76_mcuq_id qid;
    201
    202	mt7615_mcu_fill_msg(dev, skb, cmd, seq);
    203	if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
    204		qid = MT_MCUQ_WM;
    205	else
    206		qid = MT_MCUQ_FWDL;
    207
    208	return mt76_tx_queue_skb_raw(dev, dev->mt76.q_mcu[qid], skb, 0);
    209}
    210
    211u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg)
    212{
    213	struct {
    214		__le32 wifi_stream;
    215		__le32 address;
    216		__le32 data;
    217	} req = {
    218		.wifi_stream = cpu_to_le32(wf),
    219		.address = cpu_to_le32(reg),
    220	};
    221
    222	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_QUERY(RF_REG_ACCESS),
    223				 &req, sizeof(req), true);
    224}
    225
    226int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val)
    227{
    228	struct {
    229		__le32 wifi_stream;
    230		__le32 address;
    231		__le32 data;
    232	} req = {
    233		.wifi_stream = cpu_to_le32(wf),
    234		.address = cpu_to_le32(reg),
    235		.data = cpu_to_le32(val),
    236	};
    237
    238	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RF_REG_ACCESS),
    239				 &req, sizeof(req), false);
    240}
    241
    242void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)
    243{
    244	if (!is_mt7622(&dev->mt76))
    245		return;
    246
    247	regmap_update_bits(dev->infracfg, MT_INFRACFG_MISC,
    248			   MT_INFRACFG_MISC_AP2CONN_WAKE,
    249			   !en * MT_INFRACFG_MISC_AP2CONN_WAKE);
    250}
    251EXPORT_SYMBOL_GPL(mt7622_trigger_hif_int);
    252
    253static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
    254{
    255	struct mt76_phy *mphy = &dev->mt76.phy;
    256	struct mt76_connac_pm *pm = &dev->pm;
    257	struct mt76_dev *mdev = &dev->mt76;
    258	u32 addr;
    259	int err;
    260
    261	if (is_mt7663(mdev)) {
    262		/* Clear firmware own via N9 eint */
    263		mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
    264		mt76_poll(dev, MT_CONN_ON_MISC, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
    265
    266		addr = MT_CONN_HIF_ON_LPCTL;
    267	} else {
    268		addr = MT_CFG_LPCR_HOST;
    269	}
    270
    271	mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
    272
    273	mt7622_trigger_hif_int(dev, true);
    274
    275	err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);
    276
    277	mt7622_trigger_hif_int(dev, false);
    278
    279	if (err) {
    280		dev_err(mdev->dev, "driver own failed\n");
    281		return -ETIMEDOUT;
    282	}
    283
    284	clear_bit(MT76_STATE_PM, &mphy->state);
    285
    286	pm->stats.last_wake_event = jiffies;
    287	pm->stats.doze_time += pm->stats.last_wake_event -
    288			       pm->stats.last_doze_event;
    289
    290	return 0;
    291}
    292
    293static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
    294{
    295	struct mt76_phy *mphy = &dev->mt76.phy;
    296	struct mt76_connac_pm *pm = &dev->pm;
    297	int i, err = 0;
    298
    299	mutex_lock(&pm->mutex);
    300
    301	if (!test_bit(MT76_STATE_PM, &mphy->state))
    302		goto out;
    303
    304	for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
    305		mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
    306		if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
    307				   MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
    308			break;
    309	}
    310
    311	if (i == MT7615_DRV_OWN_RETRY_COUNT) {
    312		dev_err(dev->mt76.dev, "driver own failed\n");
    313		err = -EIO;
    314		goto out;
    315	}
    316	clear_bit(MT76_STATE_PM, &mphy->state);
    317
    318	pm->stats.last_wake_event = jiffies;
    319	pm->stats.doze_time += pm->stats.last_wake_event -
    320			       pm->stats.last_doze_event;
    321out:
    322	mutex_unlock(&pm->mutex);
    323
    324	return err;
    325}
    326
    327static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)
    328{
    329	struct mt76_phy *mphy = &dev->mt76.phy;
    330	struct mt76_connac_pm *pm = &dev->pm;
    331	int err = 0;
    332	u32 addr;
    333
    334	mutex_lock(&pm->mutex);
    335
    336	if (mt76_connac_skip_fw_pmctrl(mphy, pm))
    337		goto out;
    338
    339	mt7622_trigger_hif_int(dev, true);
    340
    341	addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
    342	mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN);
    343
    344	if (is_mt7622(&dev->mt76) &&
    345	    !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
    346			    MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
    347		dev_err(dev->mt76.dev, "Timeout for firmware own\n");
    348		clear_bit(MT76_STATE_PM, &mphy->state);
    349		err = -EIO;
    350	}
    351
    352	mt7622_trigger_hif_int(dev, false);
    353
    354	pm->stats.last_doze_event = jiffies;
    355	pm->stats.awake_time += pm->stats.last_doze_event -
    356				pm->stats.last_wake_event;
    357out:
    358	mutex_unlock(&pm->mutex);
    359
    360	return err;
    361}
    362
    363static void
    364mt7615_mcu_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
    365{
    366	if (vif->csa_active)
    367		ieee80211_csa_finish(vif);
    368}
    369
    370static void
    371mt7615_mcu_rx_csa_notify(struct mt7615_dev *dev, struct sk_buff *skb)
    372{
    373	struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
    374	struct mt76_phy *mphy = &dev->mt76.phy;
    375	struct mt7615_mcu_csa_notify *c;
    376
    377	c = (struct mt7615_mcu_csa_notify *)skb->data;
    378
    379	if (c->omac_idx > EXT_BSSID_MAX)
    380		return;
    381
    382	if (ext_phy && ext_phy->omac_mask & BIT_ULL(c->omac_idx))
    383		mphy = dev->mt76.phy2;
    384
    385	ieee80211_iterate_active_interfaces_atomic(mphy->hw,
    386			IEEE80211_IFACE_ITER_RESUME_ALL,
    387			mt7615_mcu_csa_finish, mphy->hw);
    388}
    389
    390static void
    391mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
    392{
    393	struct mt76_phy *mphy = &dev->mt76.phy;
    394	struct mt7615_mcu_rdd_report *r;
    395
    396	r = (struct mt7615_mcu_rdd_report *)skb->data;
    397
    398	if (!dev->radar_pattern.n_pulses && !r->long_detected &&
    399	    !r->constant_prf_detected && !r->staggered_prf_detected)
    400		return;
    401
    402	if (r->band_idx && dev->mt76.phy2)
    403		mphy = dev->mt76.phy2;
    404
    405	ieee80211_radar_detected(mphy->hw);
    406	dev->hw_pattern++;
    407}
    408
    409static void
    410mt7615_mcu_rx_log_message(struct mt7615_dev *dev, struct sk_buff *skb)
    411{
    412	struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
    413	const char *data = (char *)&rxd[1];
    414	const char *type;
    415
    416	switch (rxd->s2d_index) {
    417	case 0:
    418		type = "N9";
    419		break;
    420	case 2:
    421		type = "CR4";
    422		break;
    423	default:
    424		type = "unknown";
    425		break;
    426	}
    427
    428	wiphy_info(mt76_hw(dev)->wiphy, "%s: %.*s", type,
    429		   (int)(skb->len - sizeof(*rxd)), data);
    430}
    431
    432static void
    433mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
    434{
    435	struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
    436
    437	switch (rxd->ext_eid) {
    438	case MCU_EXT_EVENT_RDD_REPORT:
    439		mt7615_mcu_rx_radar_detected(dev, skb);
    440		break;
    441	case MCU_EXT_EVENT_CSA_NOTIFY:
    442		mt7615_mcu_rx_csa_notify(dev, skb);
    443		break;
    444	case MCU_EXT_EVENT_FW_LOG_2_HOST:
    445		mt7615_mcu_rx_log_message(dev, skb);
    446		break;
    447	default:
    448		break;
    449	}
    450}
    451
    452static void
    453mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb)
    454{
    455	u8 *seq_num = skb->data + sizeof(struct mt7615_mcu_rxd);
    456	struct mt7615_phy *phy;
    457	struct mt76_phy *mphy;
    458
    459	if (*seq_num & BIT(7) && dev->mt76.phy2)
    460		mphy = dev->mt76.phy2;
    461	else
    462		mphy = &dev->mt76.phy;
    463
    464	phy = (struct mt7615_phy *)mphy->priv;
    465
    466	spin_lock_bh(&dev->mt76.lock);
    467	__skb_queue_tail(&phy->scan_event_list, skb);
    468	spin_unlock_bh(&dev->mt76.lock);
    469
    470	ieee80211_queue_delayed_work(mphy->hw, &phy->scan_work,
    471				     MT7615_HW_SCAN_TIMEOUT);
    472}
    473
    474static void
    475mt7615_mcu_roc_event(struct mt7615_dev *dev, struct sk_buff *skb)
    476{
    477	struct mt7615_roc_tlv *event;
    478	struct mt7615_phy *phy;
    479	struct mt76_phy *mphy;
    480	int duration;
    481
    482	skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
    483	event = (struct mt7615_roc_tlv *)skb->data;
    484
    485	if (event->dbdc_band && dev->mt76.phy2)
    486		mphy = dev->mt76.phy2;
    487	else
    488		mphy = &dev->mt76.phy;
    489
    490	ieee80211_ready_on_channel(mphy->hw);
    491
    492	phy = (struct mt7615_phy *)mphy->priv;
    493	phy->roc_grant = true;
    494	wake_up(&phy->roc_wait);
    495
    496	duration = le32_to_cpu(event->max_interval);
    497	mod_timer(&phy->roc_timer,
    498		  round_jiffies_up(jiffies + msecs_to_jiffies(duration)));
    499}
    500
    501static void
    502mt7615_mcu_beacon_loss_event(struct mt7615_dev *dev, struct sk_buff *skb)
    503{
    504	struct mt76_connac_beacon_loss_event *event;
    505	struct mt76_phy *mphy;
    506	u8 band_idx = 0; /* DBDC support */
    507
    508	skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
    509	event = (struct mt76_connac_beacon_loss_event *)skb->data;
    510	if (band_idx && dev->mt76.phy2)
    511		mphy = dev->mt76.phy2;
    512	else
    513		mphy = &dev->mt76.phy;
    514
    515	ieee80211_iterate_active_interfaces_atomic(mphy->hw,
    516					IEEE80211_IFACE_ITER_RESUME_ALL,
    517					mt76_connac_mcu_beacon_loss_iter,
    518					event);
    519}
    520
    521static void
    522mt7615_mcu_bss_event(struct mt7615_dev *dev, struct sk_buff *skb)
    523{
    524	struct mt76_connac_mcu_bss_event *event;
    525	struct mt76_phy *mphy;
    526	u8 band_idx = 0; /* DBDC support */
    527
    528	skb_pull(skb, sizeof(struct mt7615_mcu_rxd));
    529	event = (struct mt76_connac_mcu_bss_event *)skb->data;
    530
    531	if (band_idx && dev->mt76.phy2)
    532		mphy = dev->mt76.phy2;
    533	else
    534		mphy = &dev->mt76.phy;
    535
    536	if (event->is_absent)
    537		ieee80211_stop_queues(mphy->hw);
    538	else
    539		ieee80211_wake_queues(mphy->hw);
    540}
    541
    542static void
    543mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)
    544{
    545	struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
    546
    547	switch (rxd->eid) {
    548	case MCU_EVENT_EXT:
    549		mt7615_mcu_rx_ext_event(dev, skb);
    550		break;
    551	case MCU_EVENT_BSS_BEACON_LOSS:
    552		mt7615_mcu_beacon_loss_event(dev, skb);
    553		break;
    554	case MCU_EVENT_ROC:
    555		mt7615_mcu_roc_event(dev, skb);
    556		break;
    557	case MCU_EVENT_SCHED_SCAN_DONE:
    558	case MCU_EVENT_SCAN_DONE:
    559		mt7615_mcu_scan_event(dev, skb);
    560		return;
    561	case MCU_EVENT_BSS_ABSENCE:
    562		mt7615_mcu_bss_event(dev, skb);
    563		break;
    564	case MCU_EVENT_COREDUMP:
    565		mt76_connac_mcu_coredump_event(&dev->mt76, skb,
    566					       &dev->coredump);
    567		return;
    568	default:
    569		break;
    570	}
    571	dev_kfree_skb(skb);
    572}
    573
    574void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb)
    575{
    576	struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
    577
    578	if (rxd->ext_eid == MCU_EXT_EVENT_THERMAL_PROTECT ||
    579	    rxd->ext_eid == MCU_EXT_EVENT_FW_LOG_2_HOST ||
    580	    rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP ||
    581	    rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC ||
    582	    rxd->eid == MCU_EVENT_BSS_BEACON_LOSS ||
    583	    rxd->eid == MCU_EVENT_SCHED_SCAN_DONE ||
    584	    rxd->eid == MCU_EVENT_BSS_ABSENCE ||
    585	    rxd->eid == MCU_EVENT_SCAN_DONE ||
    586	    rxd->eid == MCU_EVENT_COREDUMP ||
    587	    rxd->eid == MCU_EVENT_ROC ||
    588	    !rxd->seq)
    589		mt7615_mcu_rx_unsolicited_event(dev, skb);
    590	else
    591		mt76_mcu_rx_event(&dev->mt76, skb);
    592}
    593
    594static int
    595mt7615_mcu_muar_config(struct mt7615_dev *dev, struct ieee80211_vif *vif,
    596		       bool bssid, bool enable)
    597{
    598	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    599	u32 idx = mvif->mt76.omac_idx - REPEATER_BSSID_START;
    600	u32 mask = dev->omac_mask >> 32 & ~BIT(idx);
    601	const u8 *addr = vif->addr;
    602	struct {
    603		u8 mode;
    604		u8 force_clear;
    605		u8 clear_bitmap[8];
    606		u8 entry_count;
    607		u8 write;
    608
    609		u8 index;
    610		u8 bssid;
    611		u8 addr[ETH_ALEN];
    612	} __packed req = {
    613		.mode = !!mask || enable,
    614		.entry_count = 1,
    615		.write = 1,
    616
    617		.index = idx * 2 + bssid,
    618	};
    619
    620	if (bssid)
    621		addr = vif->bss_conf.bssid;
    622
    623	if (enable)
    624		ether_addr_copy(req.addr, addr);
    625
    626	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(MUAR_UPDATE),
    627				 &req, sizeof(req), true);
    628}
    629
    630static int
    631mt7615_mcu_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
    632		   bool enable)
    633{
    634	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    635	struct mt7615_dev *dev = phy->dev;
    636	struct {
    637		struct req_hdr {
    638			u8 omac_idx;
    639			u8 band_idx;
    640			__le16 tlv_num;
    641			u8 is_tlv_append;
    642			u8 rsv[3];
    643		} __packed hdr;
    644		struct req_tlv {
    645			__le16 tag;
    646			__le16 len;
    647			u8 active;
    648			u8 band_idx;
    649			u8 omac_addr[ETH_ALEN];
    650		} __packed tlv;
    651	} data = {
    652		.hdr = {
    653			.omac_idx = mvif->mt76.omac_idx,
    654			.band_idx = mvif->mt76.band_idx,
    655			.tlv_num = cpu_to_le16(1),
    656			.is_tlv_append = 1,
    657		},
    658		.tlv = {
    659			.tag = cpu_to_le16(DEV_INFO_ACTIVE),
    660			.len = cpu_to_le16(sizeof(struct req_tlv)),
    661			.active = enable,
    662			.band_idx = mvif->mt76.band_idx,
    663		},
    664	};
    665
    666	if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
    667		return mt7615_mcu_muar_config(dev, vif, false, enable);
    668
    669	memcpy(data.tlv.omac_addr, vif->addr, ETH_ALEN);
    670	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DEV_INFO_UPDATE),
    671				 &data, sizeof(data), true);
    672}
    673
    674static int
    675mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
    676			      struct ieee80211_hw *hw,
    677			      struct ieee80211_vif *vif, bool enable)
    678{
    679	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    680	struct mt76_wcid *wcid = &dev->mt76.global_wcid;
    681	struct ieee80211_mutable_offsets offs;
    682	struct ieee80211_tx_info *info;
    683	struct req {
    684		u8 omac_idx;
    685		u8 enable;
    686		u8 wlan_idx;
    687		u8 band_idx;
    688		u8 pkt_type;
    689		u8 need_pre_tbtt_int;
    690		__le16 csa_ie_pos;
    691		__le16 pkt_len;
    692		__le16 tim_ie_pos;
    693		u8 pkt[512];
    694		u8 csa_cnt;
    695		/* bss color change */
    696		u8 bcc_cnt;
    697		__le16 bcc_ie_pos;
    698	} __packed req = {
    699		.omac_idx = mvif->mt76.omac_idx,
    700		.enable = enable,
    701		.wlan_idx = wcid->idx,
    702		.band_idx = mvif->mt76.band_idx,
    703	};
    704	struct sk_buff *skb;
    705
    706	if (!enable)
    707		goto out;
    708
    709	skb = ieee80211_beacon_get_template(hw, vif, &offs);
    710	if (!skb)
    711		return -EINVAL;
    712
    713	if (skb->len > 512 - MT_TXD_SIZE) {
    714		dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
    715		dev_kfree_skb(skb);
    716		return -EINVAL;
    717	}
    718
    719	if (mvif->mt76.band_idx) {
    720		info = IEEE80211_SKB_CB(skb);
    721		info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
    722	}
    723
    724	mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
    725			      0, NULL, true);
    726	memcpy(req.pkt + MT_TXD_SIZE, skb->data, skb->len);
    727	req.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
    728	req.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
    729	if (offs.cntdwn_counter_offs[0]) {
    730		u16 csa_offs;
    731
    732		csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
    733		req.csa_ie_pos = cpu_to_le16(csa_offs);
    734		req.csa_cnt = skb->data[offs.cntdwn_counter_offs[0]];
    735	}
    736	dev_kfree_skb(skb);
    737
    738out:
    739	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(BCN_OFFLOAD), &req,
    740				 sizeof(req), true);
    741}
    742
    743static int
    744mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
    745{
    746	return mt76_connac_mcu_set_pm(&dev->mt76, band, state);
    747}
    748
    749static int
    750mt7615_mcu_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
    751		   struct ieee80211_sta *sta, bool enable)
    752{
    753	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    754	struct mt7615_dev *dev = phy->dev;
    755	struct sk_buff *skb;
    756
    757	if (mvif->mt76.omac_idx >= REPEATER_BSSID_START)
    758		mt7615_mcu_muar_config(dev, vif, true, enable);
    759
    760	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL);
    761	if (IS_ERR(skb))
    762		return PTR_ERR(skb);
    763
    764	if (enable)
    765		mt76_connac_mcu_bss_omac_tlv(skb, vif);
    766
    767	mt76_connac_mcu_bss_basic_tlv(skb, vif, sta, phy->mt76,
    768				      mvif->sta.wcid.idx, enable);
    769
    770	if (enable && mvif->mt76.omac_idx >= EXT_BSSID_START &&
    771	    mvif->mt76.omac_idx < REPEATER_BSSID_START)
    772		mt76_connac_mcu_bss_ext_tlv(skb, &mvif->mt76);
    773
    774	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
    775				     MCU_EXT_CMD(BSS_INFO_UPDATE), true);
    776}
    777
    778static int
    779mt7615_mcu_wtbl_tx_ba(struct mt7615_dev *dev,
    780		      struct ieee80211_ampdu_params *params,
    781		      bool enable)
    782{
    783	struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
    784	struct mt7615_vif *mvif = msta->vif;
    785	struct wtbl_req_hdr *wtbl_hdr;
    786	struct sk_buff *skb = NULL;
    787	int err;
    788
    789	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
    790						  WTBL_SET, NULL, &skb);
    791	if (IS_ERR(wtbl_hdr))
    792		return PTR_ERR(wtbl_hdr);
    793
    794	mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, true,
    795				    NULL, wtbl_hdr);
    796
    797	err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
    798				    MCU_EXT_CMD(WTBL_UPDATE), true);
    799	if (err < 0)
    800		return err;
    801
    802	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
    803					    &msta->wcid);
    804	if (IS_ERR(skb))
    805		return PTR_ERR(skb);
    806
    807	mt76_connac_mcu_sta_ba_tlv(skb, params, enable, true);
    808
    809	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
    810				     MCU_EXT_CMD(STA_REC_UPDATE), true);
    811}
    812
    813static int
    814mt7615_mcu_wtbl_rx_ba(struct mt7615_dev *dev,
    815		      struct ieee80211_ampdu_params *params,
    816		      bool enable)
    817{
    818	struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
    819	struct mt7615_vif *mvif = msta->vif;
    820	struct wtbl_req_hdr *wtbl_hdr;
    821	struct sk_buff *skb;
    822	int err;
    823
    824	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
    825					    &msta->wcid);
    826	if (IS_ERR(skb))
    827		return PTR_ERR(skb);
    828
    829	mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
    830
    831	err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
    832				    MCU_EXT_CMD(STA_REC_UPDATE), true);
    833	if (err < 0 || !enable)
    834		return err;
    835
    836	skb = NULL;
    837	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
    838						  WTBL_SET, NULL, &skb);
    839	if (IS_ERR(wtbl_hdr))
    840		return PTR_ERR(wtbl_hdr);
    841
    842	mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
    843				    NULL, wtbl_hdr);
    844
    845	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
    846				     MCU_EXT_CMD(WTBL_UPDATE), true);
    847}
    848
    849static int
    850mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
    851			struct ieee80211_sta *sta, bool enable)
    852{
    853	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    854	struct sk_buff *skb, *sskb, *wskb = NULL;
    855	struct mt7615_dev *dev = phy->dev;
    856	struct wtbl_req_hdr *wtbl_hdr;
    857	struct mt7615_sta *msta;
    858	int cmd, err;
    859
    860	msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
    861
    862	sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
    863					     &msta->wcid);
    864	if (IS_ERR(sskb))
    865		return PTR_ERR(sskb);
    866
    867	mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable, true);
    868	if (enable && sta)
    869		mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
    870					MT76_STA_INFO_STATE_ASSOC);
    871
    872	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
    873						  WTBL_RESET_AND_SET, NULL,
    874						  &wskb);
    875	if (IS_ERR(wtbl_hdr))
    876		return PTR_ERR(wtbl_hdr);
    877
    878	if (enable) {
    879		mt76_connac_mcu_wtbl_generic_tlv(&dev->mt76, wskb, vif, sta,
    880						 NULL, wtbl_hdr);
    881		if (sta)
    882			mt76_connac_mcu_wtbl_ht_tlv(&dev->mt76, wskb, sta,
    883						    NULL, wtbl_hdr, true, true);
    884		mt76_connac_mcu_wtbl_hdr_trans_tlv(wskb, vif, &msta->wcid,
    885						   NULL, wtbl_hdr);
    886	}
    887
    888	cmd = enable ? MCU_EXT_CMD(WTBL_UPDATE) : MCU_EXT_CMD(STA_REC_UPDATE);
    889	skb = enable ? wskb : sskb;
    890
    891	err = mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
    892	if (err < 0) {
    893		skb = enable ? sskb : wskb;
    894		dev_kfree_skb(skb);
    895
    896		return err;
    897	}
    898
    899	cmd = enable ? MCU_EXT_CMD(STA_REC_UPDATE) : MCU_EXT_CMD(WTBL_UPDATE);
    900	skb = enable ? sskb : wskb;
    901
    902	return mt76_mcu_skb_send_msg(&dev->mt76, skb, cmd, true);
    903}
    904
    905static int
    906mt7615_mcu_wtbl_update_hdr_trans(struct mt7615_dev *dev,
    907				 struct ieee80211_vif *vif,
    908				 struct ieee80211_sta *sta)
    909{
    910	return mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta);
    911}
    912
    913static const struct mt7615_mcu_ops wtbl_update_ops = {
    914	.add_beacon_offload = mt7615_mcu_add_beacon_offload,
    915	.set_pm_state = mt7615_mcu_ctrl_pm_state,
    916	.add_dev_info = mt7615_mcu_add_dev,
    917	.add_bss_info = mt7615_mcu_add_bss,
    918	.add_tx_ba = mt7615_mcu_wtbl_tx_ba,
    919	.add_rx_ba = mt7615_mcu_wtbl_rx_ba,
    920	.sta_add = mt7615_mcu_wtbl_sta_add,
    921	.set_drv_ctrl = mt7615_mcu_drv_pmctrl,
    922	.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
    923	.set_sta_decap_offload = mt7615_mcu_wtbl_update_hdr_trans,
    924};
    925
    926static int
    927mt7615_mcu_sta_ba(struct mt7615_dev *dev,
    928		  struct ieee80211_ampdu_params *params,
    929		  bool enable, bool tx)
    930{
    931	struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
    932	struct mt7615_vif *mvif = msta->vif;
    933	struct wtbl_req_hdr *wtbl_hdr;
    934	struct tlv *sta_wtbl;
    935	struct sk_buff *skb;
    936
    937	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
    938					    &msta->wcid);
    939	if (IS_ERR(skb))
    940		return PTR_ERR(skb);
    941
    942	mt76_connac_mcu_sta_ba_tlv(skb, params, enable, tx);
    943
    944	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL, sizeof(struct tlv));
    945
    946	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
    947						  WTBL_SET, sta_wtbl, &skb);
    948	if (IS_ERR(wtbl_hdr))
    949		return PTR_ERR(wtbl_hdr);
    950
    951	mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, tx,
    952				    sta_wtbl, wtbl_hdr);
    953
    954	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
    955				     MCU_EXT_CMD(STA_REC_UPDATE), true);
    956}
    957
    958static int
    959mt7615_mcu_sta_tx_ba(struct mt7615_dev *dev,
    960		     struct ieee80211_ampdu_params *params,
    961		     bool enable)
    962{
    963	return mt7615_mcu_sta_ba(dev, params, enable, true);
    964}
    965
    966static int
    967mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev,
    968		     struct ieee80211_ampdu_params *params,
    969		     bool enable)
    970{
    971	return mt7615_mcu_sta_ba(dev, params, enable, false);
    972}
    973
    974static int
    975__mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
    976		     struct ieee80211_sta *sta, bool enable, int cmd,
    977		     bool offload_fw)
    978{
    979	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
    980	struct mt76_sta_cmd_info info = {
    981		.sta = sta,
    982		.vif = vif,
    983		.offload_fw = offload_fw,
    984		.enable = enable,
    985		.newly = true,
    986		.cmd = cmd,
    987	};
    988
    989	info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
    990	return mt76_connac_mcu_sta_cmd(phy, &info);
    991}
    992
    993static int
    994mt7615_mcu_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
    995		   struct ieee80211_sta *sta, bool enable)
    996{
    997	return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
    998				    MCU_EXT_CMD(STA_REC_UPDATE), false);
    999}
   1000
   1001static int
   1002mt7615_mcu_sta_update_hdr_trans(struct mt7615_dev *dev,
   1003				struct ieee80211_vif *vif,
   1004				struct ieee80211_sta *sta)
   1005{
   1006	struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
   1007
   1008	return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
   1009						    vif, &msta->wcid,
   1010						    MCU_EXT_CMD(STA_REC_UPDATE));
   1011}
   1012
   1013static const struct mt7615_mcu_ops sta_update_ops = {
   1014	.add_beacon_offload = mt7615_mcu_add_beacon_offload,
   1015	.set_pm_state = mt7615_mcu_ctrl_pm_state,
   1016	.add_dev_info = mt7615_mcu_add_dev,
   1017	.add_bss_info = mt7615_mcu_add_bss,
   1018	.add_tx_ba = mt7615_mcu_sta_tx_ba,
   1019	.add_rx_ba = mt7615_mcu_sta_rx_ba,
   1020	.sta_add = mt7615_mcu_add_sta,
   1021	.set_drv_ctrl = mt7615_mcu_drv_pmctrl,
   1022	.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
   1023	.set_sta_decap_offload = mt7615_mcu_sta_update_hdr_trans,
   1024};
   1025
   1026static int
   1027mt7615_mcu_uni_ctrl_pm_state(struct mt7615_dev *dev, int band, int state)
   1028{
   1029	return 0;
   1030}
   1031
   1032static int
   1033mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev,
   1034				  struct ieee80211_hw *hw,
   1035				  struct ieee80211_vif *vif,
   1036				  bool enable)
   1037{
   1038	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
   1039	struct mt76_wcid *wcid = &dev->mt76.global_wcid;
   1040	struct ieee80211_mutable_offsets offs;
   1041	struct {
   1042		struct req_hdr {
   1043			u8 bss_idx;
   1044			u8 pad[3];
   1045		} __packed hdr;
   1046		struct bcn_content_tlv {
   1047			__le16 tag;
   1048			__le16 len;
   1049			__le16 tim_ie_pos;
   1050			__le16 csa_ie_pos;
   1051			__le16 bcc_ie_pos;
   1052			/* 0: disable beacon offload
   1053			 * 1: enable beacon offload
   1054			 * 2: update probe respond offload
   1055			 */
   1056			u8 enable;
   1057			/* 0: legacy format (TXD + payload)
   1058			 * 1: only cap field IE
   1059			 */
   1060			u8 type;
   1061			__le16 pkt_len;
   1062			u8 pkt[512];
   1063		} __packed beacon_tlv;
   1064	} req = {
   1065		.hdr = {
   1066			.bss_idx = mvif->mt76.idx,
   1067		},
   1068		.beacon_tlv = {
   1069			.tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
   1070			.len = cpu_to_le16(sizeof(struct bcn_content_tlv)),
   1071			.enable = enable,
   1072		},
   1073	};
   1074	struct sk_buff *skb;
   1075
   1076	if (!enable)
   1077		goto out;
   1078
   1079	skb = ieee80211_beacon_get_template(mt76_hw(dev), vif, &offs);
   1080	if (!skb)
   1081		return -EINVAL;
   1082
   1083	if (skb->len > 512 - MT_TXD_SIZE) {
   1084		dev_err(dev->mt76.dev, "beacon size limit exceed\n");
   1085		dev_kfree_skb(skb);
   1086		return -EINVAL;
   1087	}
   1088
   1089	mt7615_mac_write_txwi(dev, (__le32 *)(req.beacon_tlv.pkt), skb,
   1090			      wcid, NULL, 0, NULL, true);
   1091	memcpy(req.beacon_tlv.pkt + MT_TXD_SIZE, skb->data, skb->len);
   1092	req.beacon_tlv.pkt_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
   1093	req.beacon_tlv.tim_ie_pos = cpu_to_le16(MT_TXD_SIZE + offs.tim_offset);
   1094
   1095	if (offs.cntdwn_counter_offs[0]) {
   1096		u16 csa_offs;
   1097
   1098		csa_offs = MT_TXD_SIZE + offs.cntdwn_counter_offs[0] - 4;
   1099		req.beacon_tlv.csa_ie_pos = cpu_to_le16(csa_offs);
   1100	}
   1101	dev_kfree_skb(skb);
   1102
   1103out:
   1104	return mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD(BSS_INFO_UPDATE),
   1105				 &req, sizeof(req), true);
   1106}
   1107
   1108static int
   1109mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
   1110		       bool enable)
   1111{
   1112	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
   1113
   1114	return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
   1115					   enable);
   1116}
   1117
   1118static int
   1119mt7615_mcu_uni_add_bss(struct mt7615_phy *phy, struct ieee80211_vif *vif,
   1120		       struct ieee80211_sta *sta, bool enable)
   1121{
   1122	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
   1123
   1124	return mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
   1125					   enable);
   1126}
   1127
   1128static inline int
   1129mt7615_mcu_uni_add_sta(struct mt7615_phy *phy, struct ieee80211_vif *vif,
   1130		       struct ieee80211_sta *sta, bool enable)
   1131{
   1132	return __mt7615_mcu_add_sta(phy->mt76, vif, sta, enable,
   1133				    MCU_UNI_CMD(STA_REC_UPDATE), true);
   1134}
   1135
   1136static int
   1137mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,
   1138		     struct ieee80211_ampdu_params *params,
   1139		     bool enable)
   1140{
   1141	struct mt7615_sta *sta = (struct mt7615_sta *)params->sta->drv_priv;
   1142
   1143	return mt76_connac_mcu_sta_ba(&dev->mt76, &sta->vif->mt76, params,
   1144				      MCU_UNI_CMD(STA_REC_UPDATE), enable,
   1145				      true);
   1146}
   1147
   1148static int
   1149mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,
   1150		     struct ieee80211_ampdu_params *params,
   1151		     bool enable)
   1152{
   1153	struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv;
   1154	struct mt7615_vif *mvif = msta->vif;
   1155	struct wtbl_req_hdr *wtbl_hdr;
   1156	struct tlv *sta_wtbl;
   1157	struct sk_buff *skb;
   1158	int err;
   1159
   1160	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
   1161					    &msta->wcid);
   1162	if (IS_ERR(skb))
   1163		return PTR_ERR(skb);
   1164
   1165	mt76_connac_mcu_sta_ba_tlv(skb, params, enable, false);
   1166
   1167	err = mt76_mcu_skb_send_msg(&dev->mt76, skb,
   1168				    MCU_UNI_CMD(STA_REC_UPDATE), true);
   1169	if (err < 0 || !enable)
   1170		return err;
   1171
   1172	skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
   1173					    &msta->wcid);
   1174	if (IS_ERR(skb))
   1175		return PTR_ERR(skb);
   1176
   1177	sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
   1178					   sizeof(struct tlv));
   1179
   1180	wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
   1181						  WTBL_SET, sta_wtbl, &skb);
   1182	if (IS_ERR(wtbl_hdr))
   1183		return PTR_ERR(wtbl_hdr);
   1184
   1185	mt76_connac_mcu_wtbl_ba_tlv(&dev->mt76, skb, params, enable, false,
   1186				    sta_wtbl, wtbl_hdr);
   1187
   1188	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
   1189				     MCU_UNI_CMD(STA_REC_UPDATE), true);
   1190}
   1191
   1192static int
   1193mt7615_mcu_sta_uni_update_hdr_trans(struct mt7615_dev *dev,
   1194				    struct ieee80211_vif *vif,
   1195				    struct ieee80211_sta *sta)
   1196{
   1197	struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv;
   1198
   1199	return mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76,
   1200						    vif, &msta->wcid,
   1201						    MCU_UNI_CMD(STA_REC_UPDATE));
   1202}
   1203
   1204static const struct mt7615_mcu_ops uni_update_ops = {
   1205	.add_beacon_offload = mt7615_mcu_uni_add_beacon_offload,
   1206	.set_pm_state = mt7615_mcu_uni_ctrl_pm_state,
   1207	.add_dev_info = mt7615_mcu_uni_add_dev,
   1208	.add_bss_info = mt7615_mcu_uni_add_bss,
   1209	.add_tx_ba = mt7615_mcu_uni_tx_ba,
   1210	.add_rx_ba = mt7615_mcu_uni_rx_ba,
   1211	.sta_add = mt7615_mcu_uni_add_sta,
   1212	.set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
   1213	.set_fw_ctrl = mt7615_mcu_fw_pmctrl,
   1214	.set_sta_decap_offload = mt7615_mcu_sta_uni_update_hdr_trans,
   1215};
   1216
   1217int mt7615_mcu_restart(struct mt76_dev *dev)
   1218{
   1219	return mt76_mcu_send_msg(dev, MCU_CMD(RESTART_DL_REQ), NULL, 0, true);
   1220}
   1221EXPORT_SYMBOL_GPL(mt7615_mcu_restart);
   1222
   1223static int mt7615_load_patch(struct mt7615_dev *dev, u32 addr, const char *name)
   1224{
   1225	const struct mt7615_patch_hdr *hdr;
   1226	const struct firmware *fw = NULL;
   1227	int len, ret, sem;
   1228
   1229	ret = firmware_request_nowarn(&fw, name, dev->mt76.dev);
   1230	if (ret)
   1231		return ret;
   1232
   1233	if (!fw || !fw->data || fw->size < sizeof(*hdr)) {
   1234		dev_err(dev->mt76.dev, "Invalid firmware\n");
   1235		ret = -EINVAL;
   1236		goto release_fw;
   1237	}
   1238
   1239	sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, true);
   1240	switch (sem) {
   1241	case PATCH_IS_DL:
   1242		goto release_fw;
   1243	case PATCH_NOT_DL_SEM_SUCCESS:
   1244		break;
   1245	default:
   1246		dev_err(dev->mt76.dev, "Failed to get patch semaphore\n");
   1247		ret = -EAGAIN;
   1248		goto release_fw;
   1249	}
   1250
   1251	hdr = (const struct mt7615_patch_hdr *)(fw->data);
   1252
   1253	dev_info(dev->mt76.dev, "HW/SW Version: 0x%x, Build Time: %.16s\n",
   1254		 be32_to_cpu(hdr->hw_sw_ver), hdr->build_date);
   1255
   1256	len = fw->size - sizeof(*hdr);
   1257
   1258	ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
   1259					    DL_MODE_NEED_RSP);
   1260	if (ret) {
   1261		dev_err(dev->mt76.dev, "Download request failed\n");
   1262		goto out;
   1263	}
   1264
   1265	ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
   1266				     fw->data + sizeof(*hdr), len);
   1267	if (ret) {
   1268		dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
   1269		goto out;
   1270	}
   1271
   1272	ret = mt76_connac_mcu_start_patch(&dev->mt76);
   1273	if (ret)
   1274		dev_err(dev->mt76.dev, "Failed to start patch\n");
   1275
   1276out:
   1277	sem = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false);
   1278	switch (sem) {
   1279	case PATCH_REL_SEM_SUCCESS:
   1280		break;
   1281	default:
   1282		ret = -EAGAIN;
   1283		dev_err(dev->mt76.dev, "Failed to release patch semaphore\n");
   1284		break;
   1285	}
   1286
   1287release_fw:
   1288	release_firmware(fw);
   1289
   1290	return ret;
   1291}
   1292
   1293static int
   1294mt7615_mcu_send_ram_firmware(struct mt7615_dev *dev,
   1295			     const struct mt7615_fw_trailer *hdr,
   1296			     const u8 *data, bool is_cr4)
   1297{
   1298	int n_region = is_cr4 ? CR4_REGION_NUM : N9_REGION_NUM;
   1299	int err, i, offset = 0;
   1300	u32 len, addr, mode;
   1301
   1302	for (i = 0; i < n_region; i++) {
   1303		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
   1304						   hdr[i].feature_set, is_cr4);
   1305		len = le32_to_cpu(hdr[i].len) + IMG_CRC_LEN;
   1306		addr = le32_to_cpu(hdr[i].addr);
   1307
   1308		err = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
   1309						    mode);
   1310		if (err) {
   1311			dev_err(dev->mt76.dev, "Download request failed\n");
   1312			return err;
   1313		}
   1314
   1315		err = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
   1316					     data + offset, len);
   1317		if (err) {
   1318			dev_err(dev->mt76.dev, "Failed to send firmware to device\n");
   1319			return err;
   1320		}
   1321
   1322		offset += len;
   1323	}
   1324
   1325	return 0;
   1326}
   1327
   1328static int mt7615_load_n9(struct mt7615_dev *dev, const char *name)
   1329{
   1330	const struct mt7615_fw_trailer *hdr;
   1331	const struct firmware *fw;
   1332	int ret;
   1333
   1334	ret = request_firmware(&fw, name, dev->mt76.dev);
   1335	if (ret)
   1336		return ret;
   1337
   1338	if (!fw || !fw->data || fw->size < N9_REGION_NUM * sizeof(*hdr)) {
   1339		dev_err(dev->mt76.dev, "Invalid firmware\n");
   1340		ret = -EINVAL;
   1341		goto out;
   1342	}
   1343
   1344	hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
   1345					N9_REGION_NUM * sizeof(*hdr));
   1346
   1347	dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
   1348		 hdr->fw_ver, hdr->build_date);
   1349
   1350	ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, false);
   1351	if (ret)
   1352		goto out;
   1353
   1354	ret = mt76_connac_mcu_start_firmware(&dev->mt76,
   1355					     le32_to_cpu(hdr->addr),
   1356					     FW_START_OVERRIDE);
   1357	if (ret) {
   1358		dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
   1359		goto out;
   1360	}
   1361
   1362	snprintf(dev->mt76.hw->wiphy->fw_version,
   1363		 sizeof(dev->mt76.hw->wiphy->fw_version),
   1364		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
   1365
   1366	if (!is_mt7615(&dev->mt76)) {
   1367		dev->fw_ver = MT7615_FIRMWARE_V2;
   1368		dev->mcu_ops = &sta_update_ops;
   1369	} else {
   1370		dev->fw_ver = MT7615_FIRMWARE_V1;
   1371		dev->mcu_ops = &wtbl_update_ops;
   1372	}
   1373
   1374out:
   1375	release_firmware(fw);
   1376	return ret;
   1377}
   1378
   1379static int mt7615_load_cr4(struct mt7615_dev *dev, const char *name)
   1380{
   1381	const struct mt7615_fw_trailer *hdr;
   1382	const struct firmware *fw;
   1383	int ret;
   1384
   1385	ret = request_firmware(&fw, name, dev->mt76.dev);
   1386	if (ret)
   1387		return ret;
   1388
   1389	if (!fw || !fw->data || fw->size < CR4_REGION_NUM * sizeof(*hdr)) {
   1390		dev_err(dev->mt76.dev, "Invalid firmware\n");
   1391		ret = -EINVAL;
   1392		goto out;
   1393	}
   1394
   1395	hdr = (const struct mt7615_fw_trailer *)(fw->data + fw->size -
   1396					CR4_REGION_NUM * sizeof(*hdr));
   1397
   1398	dev_info(dev->mt76.dev, "CR4 Firmware Version: %.10s, Build Time: %.15s\n",
   1399		 hdr->fw_ver, hdr->build_date);
   1400
   1401	ret = mt7615_mcu_send_ram_firmware(dev, hdr, fw->data, true);
   1402	if (ret)
   1403		goto out;
   1404
   1405	ret = mt76_connac_mcu_start_firmware(&dev->mt76, 0,
   1406					     FW_START_WORKING_PDA_CR4);
   1407	if (ret) {
   1408		dev_err(dev->mt76.dev, "Failed to start CR4 firmware\n");
   1409		goto out;
   1410	}
   1411
   1412out:
   1413	release_firmware(fw);
   1414
   1415	return ret;
   1416}
   1417
   1418static int mt7615_load_ram(struct mt7615_dev *dev)
   1419{
   1420	int ret;
   1421
   1422	ret = mt7615_load_n9(dev, MT7615_FIRMWARE_N9);
   1423	if (ret)
   1424		return ret;
   1425
   1426	return mt7615_load_cr4(dev, MT7615_FIRMWARE_CR4);
   1427}
   1428
   1429static int mt7615_load_firmware(struct mt7615_dev *dev)
   1430{
   1431	int ret;
   1432	u32 val;
   1433
   1434	val = mt76_get_field(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE);
   1435
   1436	if (val != FW_STATE_FW_DOWNLOAD) {
   1437		dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
   1438		return -EIO;
   1439	}
   1440
   1441	ret = mt7615_load_patch(dev, MT7615_PATCH_ADDRESS, MT7615_ROM_PATCH);
   1442	if (ret)
   1443		return ret;
   1444
   1445	ret = mt7615_load_ram(dev);
   1446	if (ret)
   1447		return ret;
   1448
   1449	if (!mt76_poll_msec(dev, MT_TOP_MISC2, MT_TOP_MISC2_FW_STATE,
   1450			    FIELD_PREP(MT_TOP_MISC2_FW_STATE,
   1451				       FW_STATE_RDY), 500)) {
   1452		dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
   1453		return -EIO;
   1454	}
   1455
   1456	return 0;
   1457}
   1458
   1459static int mt7622_load_firmware(struct mt7615_dev *dev)
   1460{
   1461	int ret;
   1462	u32 val;
   1463
   1464	mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
   1465
   1466	val = mt76_get_field(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE);
   1467	if (val != FW_STATE_FW_DOWNLOAD) {
   1468		dev_err(dev->mt76.dev, "Firmware is not ready for download\n");
   1469		return -EIO;
   1470	}
   1471
   1472	ret = mt7615_load_patch(dev, MT7622_PATCH_ADDRESS, MT7622_ROM_PATCH);
   1473	if (ret)
   1474		return ret;
   1475
   1476	ret = mt7615_load_n9(dev, MT7622_FIRMWARE_N9);
   1477	if (ret)
   1478		return ret;
   1479
   1480	if (!mt76_poll_msec(dev, MT_TOP_OFF_RSV, MT_TOP_OFF_RSV_FW_STATE,
   1481			    FIELD_PREP(MT_TOP_OFF_RSV_FW_STATE,
   1482				       FW_STATE_NORMAL_TRX), 1500)) {
   1483		dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
   1484		return -EIO;
   1485	}
   1486
   1487	mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
   1488
   1489	return 0;
   1490}
   1491
   1492int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)
   1493{
   1494	struct {
   1495		u8 ctrl_val;
   1496		u8 pad[3];
   1497	} data = {
   1498		.ctrl_val = ctrl
   1499	};
   1500
   1501	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST),
   1502				 &data, sizeof(data), true);
   1503}
   1504
   1505static int mt7615_mcu_cal_cache_apply(struct mt7615_dev *dev)
   1506{
   1507	struct {
   1508		bool cache_enable;
   1509		u8 pad[3];
   1510	} data = {
   1511		.cache_enable = true
   1512	};
   1513
   1514	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(CAL_CACHE), &data,
   1515				 sizeof(data), false);
   1516}
   1517
   1518static int mt7663_load_n9(struct mt7615_dev *dev, const char *name)
   1519{
   1520	u32 offset = 0, override_addr = 0, flag = FW_START_DLYCAL;
   1521	const struct mt7663_fw_trailer *hdr;
   1522	const struct mt7663_fw_buf *buf;
   1523	const struct firmware *fw;
   1524	const u8 *base_addr;
   1525	int i, ret;
   1526
   1527	ret = request_firmware(&fw, name, dev->mt76.dev);
   1528	if (ret)
   1529		return ret;
   1530
   1531	if (!fw || !fw->data || fw->size < FW_V3_COMMON_TAILER_SIZE) {
   1532		dev_err(dev->mt76.dev, "Invalid firmware\n");
   1533		ret = -EINVAL;
   1534		goto out;
   1535	}
   1536
   1537	hdr = (const struct mt7663_fw_trailer *)(fw->data + fw->size -
   1538						 FW_V3_COMMON_TAILER_SIZE);
   1539
   1540	dev_info(dev->mt76.dev, "N9 Firmware Version: %.10s, Build Time: %.15s\n",
   1541		 hdr->fw_ver, hdr->build_date);
   1542	dev_info(dev->mt76.dev, "Region number: 0x%x\n", hdr->n_region);
   1543
   1544	base_addr = fw->data + fw->size - FW_V3_COMMON_TAILER_SIZE;
   1545	for (i = 0; i < hdr->n_region; i++) {
   1546		u32 shift = (hdr->n_region - i) * FW_V3_REGION_TAILER_SIZE;
   1547		u32 len, addr, mode;
   1548
   1549		dev_info(dev->mt76.dev, "Parsing tailer Region: %d\n", i);
   1550
   1551		buf = (const struct mt7663_fw_buf *)(base_addr - shift);
   1552		mode = mt76_connac_mcu_gen_dl_mode(&dev->mt76,
   1553						   buf->feature_set, false);
   1554		addr = le32_to_cpu(buf->img_dest_addr);
   1555		len = le32_to_cpu(buf->img_size);
   1556
   1557		ret = mt76_connac_mcu_init_download(&dev->mt76, addr, len,
   1558						    mode);
   1559		if (ret) {
   1560			dev_err(dev->mt76.dev, "Download request failed\n");
   1561			goto out;
   1562		}
   1563
   1564		ret = mt76_mcu_send_firmware(&dev->mt76, MCU_CMD(FW_SCATTER),
   1565					     fw->data + offset, len);
   1566		if (ret) {
   1567			dev_err(dev->mt76.dev, "Failed to send firmware\n");
   1568			goto out;
   1569		}
   1570
   1571		offset += le32_to_cpu(buf->img_size);
   1572		if (buf->feature_set & DL_MODE_VALID_RAM_ENTRY) {
   1573			override_addr = le32_to_cpu(buf->img_dest_addr);
   1574			dev_info(dev->mt76.dev, "Region %d, override_addr = 0x%08x\n",
   1575				 i, override_addr);
   1576		}
   1577	}
   1578
   1579	if (override_addr)
   1580		flag |= FW_START_OVERRIDE;
   1581
   1582	dev_info(dev->mt76.dev, "override_addr = 0x%08x, option = %d\n",
   1583		 override_addr, flag);
   1584
   1585	ret = mt76_connac_mcu_start_firmware(&dev->mt76, override_addr, flag);
   1586	if (ret) {
   1587		dev_err(dev->mt76.dev, "Failed to start N9 firmware\n");
   1588		goto out;
   1589	}
   1590
   1591	snprintf(dev->mt76.hw->wiphy->fw_version,
   1592		 sizeof(dev->mt76.hw->wiphy->fw_version),
   1593		 "%.10s-%.15s", hdr->fw_ver, hdr->build_date);
   1594
   1595out:
   1596	release_firmware(fw);
   1597
   1598	return ret;
   1599}
   1600
   1601static int
   1602mt7663_load_rom_patch(struct mt7615_dev *dev, const char **n9_firmware)
   1603{
   1604	const char *selected_rom, *secondary_rom = MT7663_ROM_PATCH;
   1605	const char *primary_rom = MT7663_OFFLOAD_ROM_PATCH;
   1606	int ret;
   1607
   1608	if (!prefer_offload_fw) {
   1609		secondary_rom = MT7663_OFFLOAD_ROM_PATCH;
   1610		primary_rom = MT7663_ROM_PATCH;
   1611	}
   1612	selected_rom = primary_rom;
   1613
   1614	ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS, primary_rom);
   1615	if (ret) {
   1616		dev_info(dev->mt76.dev, "%s not found, switching to %s",
   1617			 primary_rom, secondary_rom);
   1618		ret = mt7615_load_patch(dev, MT7663_PATCH_ADDRESS,
   1619					secondary_rom);
   1620		if (ret) {
   1621			dev_err(dev->mt76.dev, "failed to load %s",
   1622				secondary_rom);
   1623			return ret;
   1624		}
   1625		selected_rom = secondary_rom;
   1626	}
   1627
   1628	if (!strcmp(selected_rom, MT7663_OFFLOAD_ROM_PATCH)) {
   1629		*n9_firmware = MT7663_OFFLOAD_FIRMWARE_N9;
   1630		dev->fw_ver = MT7615_FIRMWARE_V3;
   1631		dev->mcu_ops = &uni_update_ops;
   1632	} else {
   1633		*n9_firmware = MT7663_FIRMWARE_N9;
   1634		dev->fw_ver = MT7615_FIRMWARE_V2;
   1635		dev->mcu_ops = &sta_update_ops;
   1636	}
   1637
   1638	return 0;
   1639}
   1640
   1641int __mt7663_load_firmware(struct mt7615_dev *dev)
   1642{
   1643	const char *n9_firmware;
   1644	int ret;
   1645
   1646	ret = mt76_get_field(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY);
   1647	if (ret) {
   1648		dev_dbg(dev->mt76.dev, "Firmware is already download\n");
   1649		return -EIO;
   1650	}
   1651
   1652	ret = mt7663_load_rom_patch(dev, &n9_firmware);
   1653	if (ret)
   1654		return ret;
   1655
   1656	ret = mt7663_load_n9(dev, n9_firmware);
   1657	if (ret)
   1658		return ret;
   1659
   1660	if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_N9_RDY,
   1661			    MT_TOP_MISC2_FW_N9_RDY, 1500)) {
   1662		ret = mt76_get_field(dev, MT_CONN_ON_MISC,
   1663				     MT7663_TOP_MISC2_FW_STATE);
   1664		dev_err(dev->mt76.dev, "Timeout for initializing firmware\n");
   1665		return -EIO;
   1666	}
   1667
   1668#ifdef CONFIG_PM
   1669	if (mt7615_firmware_offload(dev))
   1670		dev->mt76.hw->wiphy->wowlan = &mt76_connac_wowlan_support;
   1671#endif /* CONFIG_PM */
   1672
   1673	dev_dbg(dev->mt76.dev, "Firmware init done\n");
   1674
   1675	return 0;
   1676}
   1677EXPORT_SYMBOL_GPL(__mt7663_load_firmware);
   1678
   1679static int mt7663_load_firmware(struct mt7615_dev *dev)
   1680{
   1681	int ret;
   1682
   1683	mt76_set(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
   1684
   1685	ret = __mt7663_load_firmware(dev);
   1686	if (ret)
   1687		return ret;
   1688
   1689	mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_BYPASS_TX_SCH);
   1690
   1691	return 0;
   1692}
   1693
   1694int mt7615_mcu_init(struct mt7615_dev *dev)
   1695{
   1696	static const struct mt76_mcu_ops mt7615_mcu_ops = {
   1697		.headroom = sizeof(struct mt7615_mcu_txd),
   1698		.mcu_skb_send_msg = mt7615_mcu_send_message,
   1699		.mcu_parse_response = mt7615_mcu_parse_response,
   1700		.mcu_restart = mt7615_mcu_restart,
   1701	};
   1702	int ret;
   1703
   1704	dev->mt76.mcu_ops = &mt7615_mcu_ops,
   1705
   1706	ret = mt7615_mcu_drv_pmctrl(dev);
   1707	if (ret)
   1708		return ret;
   1709
   1710	switch (mt76_chip(&dev->mt76)) {
   1711	case 0x7622:
   1712		ret = mt7622_load_firmware(dev);
   1713		break;
   1714	case 0x7663:
   1715		ret = mt7663_load_firmware(dev);
   1716		break;
   1717	default:
   1718		ret = mt7615_load_firmware(dev);
   1719		break;
   1720	}
   1721	if (ret)
   1722		return ret;
   1723
   1724	mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[MT_MCUQ_FWDL], false);
   1725	dev_dbg(dev->mt76.dev, "Firmware init done\n");
   1726	set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
   1727
   1728	if (dev->dbdc_support) {
   1729		ret = mt7615_mcu_cal_cache_apply(dev);
   1730		if (ret)
   1731			return ret;
   1732	}
   1733
   1734	return mt7615_mcu_fw_log_2_host(dev, 0);
   1735}
   1736EXPORT_SYMBOL_GPL(mt7615_mcu_init);
   1737
   1738void mt7615_mcu_exit(struct mt7615_dev *dev)
   1739{
   1740	__mt76_mcu_restart(&dev->mt76);
   1741	mt7615_mcu_set_fw_ctrl(dev);
   1742	skb_queue_purge(&dev->mt76.mcu.res_q);
   1743}
   1744EXPORT_SYMBOL_GPL(mt7615_mcu_exit);
   1745
   1746int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)
   1747{
   1748	struct {
   1749		u8 buffer_mode;
   1750		u8 content_format;
   1751		__le16 len;
   1752	} __packed req_hdr = {
   1753		.buffer_mode = 1,
   1754	};
   1755	u8 *eep = (u8 *)dev->mt76.eeprom.data;
   1756	struct sk_buff *skb;
   1757	int eep_len, offset;
   1758
   1759	switch (mt76_chip(&dev->mt76)) {
   1760	case 0x7622:
   1761		eep_len = MT7622_EE_MAX - MT_EE_NIC_CONF_0;
   1762		offset = MT_EE_NIC_CONF_0;
   1763		break;
   1764	case 0x7663:
   1765		eep_len = MT7663_EE_MAX - MT_EE_CHIP_ID;
   1766		req_hdr.content_format = 1;
   1767		offset = MT_EE_CHIP_ID;
   1768		break;
   1769	default:
   1770		eep_len = MT7615_EE_MAX - MT_EE_NIC_CONF_0;
   1771		offset = MT_EE_NIC_CONF_0;
   1772		break;
   1773	}
   1774
   1775	req_hdr.len = cpu_to_le16(eep_len);
   1776
   1777	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, sizeof(req_hdr) + eep_len);
   1778	if (!skb)
   1779		return -ENOMEM;
   1780
   1781	skb_put_data(skb, &req_hdr, sizeof(req_hdr));
   1782	skb_put_data(skb, eep + offset, eep_len);
   1783
   1784	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
   1785				     MCU_EXT_CMD(EFUSE_BUFFER_MODE), true);
   1786}
   1787
   1788int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
   1789		       const struct ieee80211_tx_queue_params *params)
   1790{
   1791#define WMM_AIFS_SET	BIT(0)
   1792#define WMM_CW_MIN_SET	BIT(1)
   1793#define WMM_CW_MAX_SET	BIT(2)
   1794#define WMM_TXOP_SET	BIT(3)
   1795#define WMM_PARAM_SET	(WMM_AIFS_SET | WMM_CW_MIN_SET | \
   1796			 WMM_CW_MAX_SET | WMM_TXOP_SET)
   1797	struct req_data {
   1798		u8 number;
   1799		u8 rsv[3];
   1800		u8 queue;
   1801		u8 valid;
   1802		u8 aifs;
   1803		u8 cw_min;
   1804		__le16 cw_max;
   1805		__le16 txop;
   1806	} __packed req = {
   1807		.number = 1,
   1808		.queue = queue,
   1809		.valid = WMM_PARAM_SET,
   1810		.aifs = params->aifs,
   1811		.cw_min = 5,
   1812		.cw_max = cpu_to_le16(10),
   1813		.txop = cpu_to_le16(params->txop),
   1814	};
   1815
   1816	if (params->cw_min)
   1817		req.cw_min = fls(params->cw_min);
   1818	if (params->cw_max)
   1819		req.cw_max = cpu_to_le16(fls(params->cw_max));
   1820
   1821	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(EDCA_UPDATE),
   1822				 &req, sizeof(req), true);
   1823}
   1824
   1825int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
   1826{
   1827	struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
   1828	struct dbdc_entry {
   1829		u8 type;
   1830		u8 index;
   1831		u8 band;
   1832		u8 _rsv;
   1833	};
   1834	struct {
   1835		u8 enable;
   1836		u8 num;
   1837		u8 _rsv[2];
   1838		struct dbdc_entry entry[64];
   1839	} req = {
   1840		.enable = !!ext_phy,
   1841	};
   1842	int i;
   1843
   1844	if (!ext_phy)
   1845		goto out;
   1846
   1847#define ADD_DBDC_ENTRY(_type, _idx, _band)		\
   1848	do { \
   1849		req.entry[req.num].type = _type;		\
   1850		req.entry[req.num].index = _idx;		\
   1851		req.entry[req.num++].band = _band;		\
   1852	} while (0)
   1853
   1854	for (i = 0; i < 4; i++) {
   1855		bool band = !!(ext_phy->omac_mask & BIT_ULL(i));
   1856
   1857		ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
   1858	}
   1859
   1860	for (i = 0; i < 14; i++) {
   1861		bool band = !!(ext_phy->omac_mask & BIT_ULL(0x11 + i));
   1862
   1863		ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
   1864	}
   1865
   1866	ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
   1867
   1868	for (i = 0; i < 3; i++)
   1869		ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
   1870
   1871	ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
   1872	ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
   1873	ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
   1874	ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
   1875
   1876	ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
   1877	ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
   1878
   1879out:
   1880	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(DBDC_CTRL), &req,
   1881				 sizeof(req), true);
   1882}
   1883
   1884int mt7615_mcu_del_wtbl_all(struct mt7615_dev *dev)
   1885{
   1886	struct wtbl_req_hdr req = {
   1887		.operation = WTBL_RESET_ALL,
   1888	};
   1889
   1890	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(WTBL_UPDATE),
   1891				 &req, sizeof(req), true);
   1892}
   1893
   1894int mt7615_mcu_set_fcc5_lpn(struct mt7615_dev *dev, int val)
   1895{
   1896	struct {
   1897		__le16 tag;
   1898		__le16 min_lpn;
   1899	} req = {
   1900		.tag = cpu_to_le16(0x1),
   1901		.min_lpn = cpu_to_le16(val),
   1902	};
   1903
   1904	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
   1905				 &req, sizeof(req), true);
   1906}
   1907
   1908int mt7615_mcu_set_pulse_th(struct mt7615_dev *dev,
   1909			    const struct mt7615_dfs_pulse *pulse)
   1910{
   1911	struct {
   1912		__le16 tag;
   1913		__le32 max_width;	/* us */
   1914		__le32 max_pwr;		/* dbm */
   1915		__le32 min_pwr;		/* dbm */
   1916		__le32 min_stgr_pri;	/* us */
   1917		__le32 max_stgr_pri;	/* us */
   1918		__le32 min_cr_pri;	/* us */
   1919		__le32 max_cr_pri;	/* us */
   1920	} req = {
   1921		.tag = cpu_to_le16(0x3),
   1922#define __req_field(field) .field = cpu_to_le32(pulse->field)
   1923		__req_field(max_width),
   1924		__req_field(max_pwr),
   1925		__req_field(min_pwr),
   1926		__req_field(min_stgr_pri),
   1927		__req_field(max_stgr_pri),
   1928		__req_field(min_cr_pri),
   1929		__req_field(max_cr_pri),
   1930#undef  __req_field
   1931	};
   1932
   1933	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
   1934				 &req, sizeof(req), true);
   1935}
   1936
   1937int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,
   1938			    const struct mt7615_dfs_pattern *pattern)
   1939{
   1940	struct {
   1941		__le16 tag;
   1942		__le16 radar_type;
   1943		u8 enb;
   1944		u8 stgr;
   1945		u8 min_crpn;
   1946		u8 max_crpn;
   1947		u8 min_crpr;
   1948		u8 min_pw;
   1949		u8 max_pw;
   1950		__le32 min_pri;
   1951		__le32 max_pri;
   1952		u8 min_crbn;
   1953		u8 max_crbn;
   1954		u8 min_stgpn;
   1955		u8 max_stgpn;
   1956		u8 min_stgpr;
   1957	} req = {
   1958		.tag = cpu_to_le16(0x2),
   1959		.radar_type = cpu_to_le16(index),
   1960#define __req_field_u8(field) .field = pattern->field
   1961#define __req_field_u32(field) .field = cpu_to_le32(pattern->field)
   1962		__req_field_u8(enb),
   1963		__req_field_u8(stgr),
   1964		__req_field_u8(min_crpn),
   1965		__req_field_u8(max_crpn),
   1966		__req_field_u8(min_crpr),
   1967		__req_field_u8(min_pw),
   1968		__req_field_u8(max_pw),
   1969		__req_field_u32(min_pri),
   1970		__req_field_u32(max_pri),
   1971		__req_field_u8(min_crbn),
   1972		__req_field_u8(max_crbn),
   1973		__req_field_u8(min_stgpn),
   1974		__req_field_u8(max_stgpn),
   1975		__req_field_u8(min_stgpr),
   1976#undef __req_field_u8
   1977#undef __req_field_u32
   1978	};
   1979
   1980	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RADAR_TH),
   1981				 &req, sizeof(req), true);
   1982}
   1983
   1984int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev)
   1985{
   1986	struct {
   1987		u8 pulse_num;
   1988		u8 rsv[3];
   1989		struct {
   1990			__le32 start_time;
   1991			__le16 width;
   1992			__le16 power;
   1993		} pattern[32];
   1994	} req = {
   1995		.pulse_num = dev->radar_pattern.n_pulses,
   1996	};
   1997	u32 start_time = ktime_to_ms(ktime_get_boottime());
   1998	int i;
   1999
   2000	if (dev->radar_pattern.n_pulses > ARRAY_SIZE(req.pattern))
   2001		return -EINVAL;
   2002
   2003	/* TODO: add some noise here */
   2004	for (i = 0; i < dev->radar_pattern.n_pulses; i++) {
   2005		u32 ts = start_time + i * dev->radar_pattern.period;
   2006
   2007		req.pattern[i].width = cpu_to_le16(dev->radar_pattern.width);
   2008		req.pattern[i].power = cpu_to_le16(dev->radar_pattern.power);
   2009		req.pattern[i].start_time = cpu_to_le32(ts);
   2010	}
   2011
   2012	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(SET_RDD_PATTERN),
   2013				 &req, sizeof(req), false);
   2014}
   2015
   2016static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku)
   2017{
   2018	struct mt76_phy *mphy = phy->mt76;
   2019	struct ieee80211_hw *hw = mphy->hw;
   2020	struct mt76_power_limits limits;
   2021	s8 *limits_array = (s8 *)&limits;
   2022	int n_chains = hweight8(mphy->antenna_mask);
   2023	int tx_power = hw->conf.power_level * 2;
   2024	int i;
   2025	static const u8 sku_mapping[] = {
   2026#define SKU_FIELD(_type, _field) \
   2027		[MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field)
   2028		SKU_FIELD(CCK_1_2, cck[0]),
   2029		SKU_FIELD(CCK_55_11, cck[2]),
   2030		SKU_FIELD(OFDM_6_9, ofdm[0]),
   2031		SKU_FIELD(OFDM_12_18, ofdm[2]),
   2032		SKU_FIELD(OFDM_24_36, ofdm[4]),
   2033		SKU_FIELD(OFDM_48, ofdm[6]),
   2034		SKU_FIELD(OFDM_54, ofdm[7]),
   2035		SKU_FIELD(HT20_0_8, mcs[0][0]),
   2036		SKU_FIELD(HT20_32, ofdm[0]),
   2037		SKU_FIELD(HT20_1_2_9_10, mcs[0][1]),
   2038		SKU_FIELD(HT20_3_4_11_12, mcs[0][3]),
   2039		SKU_FIELD(HT20_5_13, mcs[0][5]),
   2040		SKU_FIELD(HT20_6_14, mcs[0][6]),
   2041		SKU_FIELD(HT20_7_15, mcs[0][7]),
   2042		SKU_FIELD(HT40_0_8, mcs[1][0]),
   2043		SKU_FIELD(HT40_32, ofdm[0]),
   2044		SKU_FIELD(HT40_1_2_9_10, mcs[1][1]),
   2045		SKU_FIELD(HT40_3_4_11_12, mcs[1][3]),
   2046		SKU_FIELD(HT40_5_13, mcs[1][5]),
   2047		SKU_FIELD(HT40_6_14, mcs[1][6]),
   2048		SKU_FIELD(HT40_7_15, mcs[1][7]),
   2049		SKU_FIELD(VHT20_0, mcs[0][0]),
   2050		SKU_FIELD(VHT20_1_2, mcs[0][1]),
   2051		SKU_FIELD(VHT20_3_4, mcs[0][3]),
   2052		SKU_FIELD(VHT20_5_6, mcs[0][5]),
   2053		SKU_FIELD(VHT20_7, mcs[0][7]),
   2054		SKU_FIELD(VHT20_8, mcs[0][8]),
   2055		SKU_FIELD(VHT20_9, mcs[0][9]),
   2056		SKU_FIELD(VHT40_0, mcs[1][0]),
   2057		SKU_FIELD(VHT40_1_2, mcs[1][1]),
   2058		SKU_FIELD(VHT40_3_4, mcs[1][3]),
   2059		SKU_FIELD(VHT40_5_6, mcs[1][5]),
   2060		SKU_FIELD(VHT40_7, mcs[1][7]),
   2061		SKU_FIELD(VHT40_8, mcs[1][8]),
   2062		SKU_FIELD(VHT40_9, mcs[1][9]),
   2063		SKU_FIELD(VHT80_0, mcs[2][0]),
   2064		SKU_FIELD(VHT80_1_2, mcs[2][1]),
   2065		SKU_FIELD(VHT80_3_4, mcs[2][3]),
   2066		SKU_FIELD(VHT80_5_6, mcs[2][5]),
   2067		SKU_FIELD(VHT80_7, mcs[2][7]),
   2068		SKU_FIELD(VHT80_8, mcs[2][8]),
   2069		SKU_FIELD(VHT80_9, mcs[2][9]),
   2070		SKU_FIELD(VHT160_0, mcs[3][0]),
   2071		SKU_FIELD(VHT160_1_2, mcs[3][1]),
   2072		SKU_FIELD(VHT160_3_4, mcs[3][3]),
   2073		SKU_FIELD(VHT160_5_6, mcs[3][5]),
   2074		SKU_FIELD(VHT160_7, mcs[3][7]),
   2075		SKU_FIELD(VHT160_8, mcs[3][8]),
   2076		SKU_FIELD(VHT160_9, mcs[3][9]),
   2077#undef SKU_FIELD
   2078	};
   2079
   2080	tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan, tx_power);
   2081	tx_power -= mt76_tx_power_nss_delta(n_chains);
   2082	tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
   2083					      &limits, tx_power);
   2084	mphy->txpower_cur = tx_power;
   2085
   2086	if (is_mt7663(mphy->dev)) {
   2087		memset(sku, tx_power, MT_SKU_4SS_DELTA + 1);
   2088		return;
   2089	}
   2090
   2091	for (i = 0; i < MT_SKU_1SS_DELTA; i++)
   2092		sku[i] = limits_array[sku_mapping[i]];
   2093
   2094	for (i = 0; i < 4; i++) {
   2095		int delta = 0;
   2096
   2097		if (i < n_chains - 1)
   2098			delta = mt76_tx_power_nss_delta(n_chains) -
   2099				mt76_tx_power_nss_delta(i + 1);
   2100		sku[MT_SKU_1SS_DELTA + i] = delta;
   2101	}
   2102}
   2103
   2104static u8 mt7615_mcu_chan_bw(struct cfg80211_chan_def *chandef)
   2105{
   2106	static const u8 width_to_bw[] = {
   2107		[NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ,
   2108		[NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ,
   2109		[NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ,
   2110		[NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ,
   2111		[NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ,
   2112		[NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ,
   2113		[NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ,
   2114		[NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ,
   2115	};
   2116
   2117	if (chandef->width >= ARRAY_SIZE(width_to_bw))
   2118		return 0;
   2119
   2120	return width_to_bw[chandef->width];
   2121}
   2122
   2123int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd)
   2124{
   2125	struct mt7615_dev *dev = phy->dev;
   2126	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
   2127	int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2;
   2128	struct {
   2129		u8 control_chan;
   2130		u8 center_chan;
   2131		u8 bw;
   2132		u8 tx_streams;
   2133		u8 rx_streams_mask;
   2134		u8 switch_reason;
   2135		u8 band_idx;
   2136		/* for 80+80 only */
   2137		u8 center_chan2;
   2138		__le16 cac_case;
   2139		u8 channel_band;
   2140		u8 rsv0;
   2141		__le32 outband_freq;
   2142		u8 txpower_drop;
   2143		u8 rsv1[3];
   2144		u8 txpower_sku[53];
   2145		u8 rsv2[3];
   2146	} req = {
   2147		.control_chan = chandef->chan->hw_value,
   2148		.center_chan = ieee80211_frequency_to_channel(freq1),
   2149		.tx_streams = hweight8(phy->mt76->antenna_mask),
   2150		.rx_streams_mask = phy->mt76->chainmask,
   2151		.center_chan2 = ieee80211_frequency_to_channel(freq2),
   2152	};
   2153
   2154	if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
   2155	    dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
   2156		req.switch_reason = CH_SWITCH_NORMAL;
   2157	else if (phy->mt76->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
   2158		req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD;
   2159	else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef,
   2160					  NL80211_IFTYPE_AP))
   2161		req.switch_reason = CH_SWITCH_DFS;
   2162	else
   2163		req.switch_reason = CH_SWITCH_NORMAL;
   2164
   2165	req.band_idx = phy != &dev->phy;
   2166	req.bw = mt7615_mcu_chan_bw(chandef);
   2167
   2168	if (mt76_testmode_enabled(phy->mt76))
   2169		memset(req.txpower_sku, 0x3f, 49);
   2170	else
   2171		mt7615_mcu_set_txpower_sku(phy, req.txpower_sku);
   2172
   2173	return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
   2174}
   2175
   2176int mt7615_mcu_get_temperature(struct mt7615_dev *dev)
   2177{
   2178	struct {
   2179		u8 action;
   2180		u8 rsv[3];
   2181	} req = {};
   2182
   2183	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL),
   2184				 &req, sizeof(req), true);
   2185}
   2186
   2187int mt7615_mcu_set_test_param(struct mt7615_dev *dev, u8 param, bool test_mode,
   2188			      u32 val)
   2189{
   2190	struct {
   2191		u8 test_mode_en;
   2192		u8 param_idx;
   2193		u8 _rsv[2];
   2194
   2195		__le32 value;
   2196
   2197		u8 pad[8];
   2198	} req = {
   2199		.test_mode_en = test_mode,
   2200		.param_idx = param,
   2201		.value = cpu_to_le32(val),
   2202	};
   2203
   2204	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(ATE_CTRL),
   2205				 &req, sizeof(req), false);
   2206}
   2207
   2208int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable)
   2209{
   2210	struct mt7615_dev *dev = phy->dev;
   2211	struct {
   2212		u8 format_id;
   2213		u8 sku_enable;
   2214		u8 band_idx;
   2215		u8 rsv;
   2216	} req = {
   2217		.format_id = 0,
   2218		.band_idx = phy != &dev->phy,
   2219		.sku_enable = enable,
   2220	};
   2221
   2222	return mt76_mcu_send_msg(&dev->mt76,
   2223				 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL),
   2224				 &req, sizeof(req), true);
   2225}
   2226
   2227static int mt7615_find_freq_idx(const u16 *freqs, int n_freqs, u16 cur)
   2228{
   2229	int i;
   2230
   2231	for (i = 0; i < n_freqs; i++)
   2232		if (cur == freqs[i])
   2233			return i;
   2234
   2235	return -1;
   2236}
   2237
   2238static int mt7615_dcoc_freq_idx(u16 freq, u8 bw)
   2239{
   2240	static const u16 freq_list[] = {
   2241		4980, 5805, 5905, 5190,
   2242		5230, 5270, 5310, 5350,
   2243		5390, 5430, 5470, 5510,
   2244		5550, 5590, 5630, 5670,
   2245		5710, 5755, 5795, 5835,
   2246		5875, 5210, 5290, 5370,
   2247		5450, 5530, 5610, 5690,
   2248		5775, 5855
   2249	};
   2250	static const u16 freq_bw40[] = {
   2251		5190, 5230, 5270, 5310,
   2252		5350, 5390, 5430, 5470,
   2253		5510, 5550, 5590, 5630,
   2254		5670, 5710, 5755, 5795,
   2255		5835, 5875
   2256	};
   2257	int offset_2g = ARRAY_SIZE(freq_list);
   2258	int idx;
   2259
   2260	if (freq < 4000) {
   2261		if (freq < 2427)
   2262			return offset_2g;
   2263		if (freq < 2442)
   2264			return offset_2g + 1;
   2265		if (freq < 2457)
   2266			return offset_2g + 2;
   2267
   2268		return offset_2g + 3;
   2269	}
   2270
   2271	switch (bw) {
   2272	case NL80211_CHAN_WIDTH_80:
   2273	case NL80211_CHAN_WIDTH_80P80:
   2274	case NL80211_CHAN_WIDTH_160:
   2275		break;
   2276	default:
   2277		idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
   2278					   freq + 10);
   2279		if (idx >= 0) {
   2280			freq = freq_bw40[idx];
   2281			break;
   2282		}
   2283
   2284		idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
   2285					   freq - 10);
   2286		if (idx >= 0) {
   2287			freq = freq_bw40[idx];
   2288			break;
   2289		}
   2290		fallthrough;
   2291	case NL80211_CHAN_WIDTH_40:
   2292		idx = mt7615_find_freq_idx(freq_bw40, ARRAY_SIZE(freq_bw40),
   2293					   freq);
   2294		if (idx >= 0)
   2295			break;
   2296
   2297		return -1;
   2298
   2299	}
   2300
   2301	return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
   2302}
   2303
   2304int mt7615_mcu_apply_rx_dcoc(struct mt7615_phy *phy)
   2305{
   2306	struct mt7615_dev *dev = phy->dev;
   2307	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
   2308	int freq2 = chandef->center_freq2;
   2309	int ret;
   2310	struct {
   2311		u8 direction;
   2312		u8 runtime_calibration;
   2313		u8 _rsv[2];
   2314
   2315		__le16 center_freq;
   2316		u8 bw;
   2317		u8 band;
   2318		u8 is_freq2;
   2319		u8 success;
   2320		u8 dbdc_en;
   2321
   2322		u8 _rsv2;
   2323
   2324		struct {
   2325			__le32 sx0_i_lna[4];
   2326			__le32 sx0_q_lna[4];
   2327
   2328			__le32 sx2_i_lna[4];
   2329			__le32 sx2_q_lna[4];
   2330		} dcoc_data[4];
   2331	} req = {
   2332		.direction = 1,
   2333
   2334		.bw = mt7615_mcu_chan_bw(chandef),
   2335		.band = chandef->center_freq1 > 4000,
   2336		.dbdc_en = !!dev->mt76.phy2,
   2337	};
   2338	u16 center_freq = chandef->center_freq1;
   2339	int freq_idx;
   2340	u8 *eep = dev->mt76.eeprom.data;
   2341
   2342	if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_RX_CAL))
   2343		return 0;
   2344
   2345	if (chandef->width == NL80211_CHAN_WIDTH_160) {
   2346		freq2 = center_freq + 40;
   2347		center_freq -= 40;
   2348	}
   2349
   2350again:
   2351	req.runtime_calibration = 1;
   2352	freq_idx = mt7615_dcoc_freq_idx(center_freq, chandef->width);
   2353	if (freq_idx < 0)
   2354		goto out;
   2355
   2356	memcpy(req.dcoc_data, eep + MT7615_EEPROM_DCOC_OFFSET +
   2357			      freq_idx * MT7615_EEPROM_DCOC_SIZE,
   2358	       sizeof(req.dcoc_data));
   2359	req.runtime_calibration = 0;
   2360
   2361out:
   2362	req.center_freq = cpu_to_le16(center_freq);
   2363	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RXDCOC_CAL), &req,
   2364				sizeof(req), true);
   2365
   2366	if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
   2367	     chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
   2368		req.is_freq2 = true;
   2369		center_freq = freq2;
   2370		goto again;
   2371	}
   2372
   2373	return ret;
   2374}
   2375
   2376static int mt7615_dpd_freq_idx(u16 freq, u8 bw)
   2377{
   2378	static const u16 freq_list[] = {
   2379		4920, 4940, 4960, 4980,
   2380		5040, 5060, 5080, 5180,
   2381		5200, 5220, 5240, 5260,
   2382		5280, 5300, 5320, 5340,
   2383		5360, 5380, 5400, 5420,
   2384		5440, 5460, 5480, 5500,
   2385		5520, 5540, 5560, 5580,
   2386		5600, 5620, 5640, 5660,
   2387		5680, 5700, 5720, 5745,
   2388		5765, 5785, 5805, 5825,
   2389		5845, 5865, 5885, 5905
   2390	};
   2391	int offset_2g = ARRAY_SIZE(freq_list);
   2392	int idx;
   2393
   2394	if (freq < 4000) {
   2395		if (freq < 2432)
   2396			return offset_2g;
   2397		if (freq < 2457)
   2398			return offset_2g + 1;
   2399
   2400		return offset_2g + 2;
   2401	}
   2402
   2403	if (bw != NL80211_CHAN_WIDTH_20) {
   2404		idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
   2405					   freq + 10);
   2406		if (idx >= 0)
   2407			return idx;
   2408
   2409		idx = mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list),
   2410					   freq - 10);
   2411		if (idx >= 0)
   2412			return idx;
   2413	}
   2414
   2415	return mt7615_find_freq_idx(freq_list, ARRAY_SIZE(freq_list), freq);
   2416}
   2417
   2418
   2419int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)
   2420{
   2421	struct mt7615_dev *dev = phy->dev;
   2422	struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
   2423	int freq2 = chandef->center_freq2;
   2424	int ret;
   2425	struct {
   2426		u8 direction;
   2427		u8 runtime_calibration;
   2428		u8 _rsv[2];
   2429
   2430		__le16 center_freq;
   2431		u8 bw;
   2432		u8 band;
   2433		u8 is_freq2;
   2434		u8 success;
   2435		u8 dbdc_en;
   2436
   2437		u8 _rsv2;
   2438
   2439		struct {
   2440			struct {
   2441				u32 dpd_g0;
   2442				u8 data[32];
   2443			} wf0, wf1;
   2444
   2445			struct {
   2446				u32 dpd_g0_prim;
   2447				u32 dpd_g0_sec;
   2448				u8 data_prim[32];
   2449				u8 data_sec[32];
   2450			} wf2, wf3;
   2451		} dpd_data;
   2452	} req = {
   2453		.direction = 1,
   2454
   2455		.bw = mt7615_mcu_chan_bw(chandef),
   2456		.band = chandef->center_freq1 > 4000,
   2457		.dbdc_en = !!dev->mt76.phy2,
   2458	};
   2459	u16 center_freq = chandef->center_freq1;
   2460	int freq_idx;
   2461	u8 *eep = dev->mt76.eeprom.data;
   2462
   2463	if (!(eep[MT_EE_CALDATA_FLASH] & MT_EE_CALDATA_FLASH_TX_DPD))
   2464		return 0;
   2465
   2466	if (chandef->width == NL80211_CHAN_WIDTH_160) {
   2467		freq2 = center_freq + 40;
   2468		center_freq -= 40;
   2469	}
   2470
   2471again:
   2472	req.runtime_calibration = 1;
   2473	freq_idx = mt7615_dpd_freq_idx(center_freq, chandef->width);
   2474	if (freq_idx < 0)
   2475		goto out;
   2476
   2477	memcpy(&req.dpd_data, eep + MT7615_EEPROM_TXDPD_OFFSET +
   2478			      freq_idx * MT7615_EEPROM_TXDPD_SIZE,
   2479	       sizeof(req.dpd_data));
   2480	req.runtime_calibration = 0;
   2481
   2482out:
   2483	req.center_freq = cpu_to_le16(center_freq);
   2484	ret = mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXDPD_CAL),
   2485				&req, sizeof(req), true);
   2486
   2487	if ((chandef->width == NL80211_CHAN_WIDTH_80P80 ||
   2488	     chandef->width == NL80211_CHAN_WIDTH_160) && !req.is_freq2) {
   2489		req.is_freq2 = true;
   2490		center_freq = freq2;
   2491		goto again;
   2492	}
   2493
   2494	return ret;
   2495}
   2496
   2497int mt7615_mcu_set_rx_hdr_trans_blacklist(struct mt7615_dev *dev)
   2498{
   2499	struct {
   2500		u8 operation;
   2501		u8 count;
   2502		u8 _rsv[2];
   2503		u8 index;
   2504		u8 enable;
   2505		__le16 etype;
   2506	} req = {
   2507		.operation = 1,
   2508		.count = 1,
   2509		.enable = 1,
   2510		.etype = cpu_to_le16(ETH_P_PAE),
   2511	};
   2512
   2513	return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(RX_HDR_TRANS),
   2514				 &req, sizeof(req), false);
   2515}
   2516
   2517int mt7615_mcu_set_bss_pm(struct mt7615_dev *dev, struct ieee80211_vif *vif,
   2518			  bool enable)
   2519{
   2520	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
   2521	struct {
   2522		u8 bss_idx;
   2523		u8 dtim_period;
   2524		__le16 aid;
   2525		__le16 bcn_interval;
   2526		__le16 atim_window;
   2527		u8 uapsd;
   2528		u8 bmc_delivered_ac;
   2529		u8 bmc_triggered_ac;
   2530		u8 pad;
   2531	} req = {
   2532		.bss_idx = mvif->mt76.idx,
   2533		.aid = cpu_to_le16(vif->bss_conf.aid),
   2534		.dtim_period = vif->bss_conf.dtim_period,
   2535		.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
   2536	};
   2537	struct {
   2538		u8 bss_idx;
   2539		u8 pad[3];
   2540	} req_hdr = {
   2541		.bss_idx = mvif->mt76.idx,
   2542	};
   2543	int err;
   2544
   2545	if (vif->type != NL80211_IFTYPE_STATION)
   2546		return 0;
   2547
   2548	err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
   2549				&req_hdr, sizeof(req_hdr), false);
   2550	if (err < 0 || !enable)
   2551		return err;
   2552
   2553	return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_CONNECTED),
   2554				 &req, sizeof(req), false);
   2555}
   2556
   2557int mt7615_mcu_set_roc(struct mt7615_phy *phy, struct ieee80211_vif *vif,
   2558		       struct ieee80211_channel *chan, int duration)
   2559{
   2560	struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
   2561	struct mt7615_dev *dev = phy->dev;
   2562	struct mt7615_roc_tlv req = {
   2563		.bss_idx = mvif->mt76.idx,
   2564		.active = !chan,
   2565		.max_interval = cpu_to_le32(duration),
   2566		.primary_chan = chan ? chan->hw_value : 0,
   2567		.band = chan ? chan->band : 0,
   2568		.req_type = 2,
   2569	};
   2570
   2571	phy->roc_grant = false;
   2572
   2573	return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_ROC),
   2574				 &req, sizeof(req), false);
   2575}