18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: ISC
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
48c2ecf20Sopenharmony_ci * Copyright (C) 2018 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include "mt76x2.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_civoid mt76x2_mac_stop(struct mt76x02_dev *dev, bool force)
108c2ecf20Sopenharmony_ci{
118c2ecf20Sopenharmony_ci	bool stopped = false;
128c2ecf20Sopenharmony_ci	u32 rts_cfg;
138c2ecf20Sopenharmony_ci	int i;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci	mt76_clear(dev, MT_TXOP_CTRL_CFG, MT_TXOP_ED_CCA_EN);
168c2ecf20Sopenharmony_ci	mt76_clear(dev, MT_TXOP_HLDR_ET, MT_TXOP_HLDR_TX40M_BLK_EN);
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	mt76_wr(dev, MT_MAC_SYS_CTRL, 0);
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	rts_cfg = mt76_rr(dev, MT_TX_RTS_CFG);
218c2ecf20Sopenharmony_ci	mt76_wr(dev, MT_TX_RTS_CFG, rts_cfg & ~MT_TX_RTS_CFG_RETRY_LIMIT);
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci	/* Wait for MAC to become idle */
248c2ecf20Sopenharmony_ci	for (i = 0; i < 300; i++) {
258c2ecf20Sopenharmony_ci		if ((mt76_rr(dev, MT_MAC_STATUS) &
268c2ecf20Sopenharmony_ci		     (MT_MAC_STATUS_RX | MT_MAC_STATUS_TX)) ||
278c2ecf20Sopenharmony_ci		    mt76_rr(dev, MT_BBP(IBI, 12))) {
288c2ecf20Sopenharmony_ci			udelay(1);
298c2ecf20Sopenharmony_ci			continue;
308c2ecf20Sopenharmony_ci		}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci		stopped = true;
338c2ecf20Sopenharmony_ci		break;
348c2ecf20Sopenharmony_ci	}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	if (force && !stopped) {
378c2ecf20Sopenharmony_ci		mt76_set(dev, MT_BBP(CORE, 4), BIT(1));
388c2ecf20Sopenharmony_ci		mt76_clear(dev, MT_BBP(CORE, 4), BIT(1));
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci		mt76_set(dev, MT_BBP(CORE, 4), BIT(0));
418c2ecf20Sopenharmony_ci		mt76_clear(dev, MT_BBP(CORE, 4), BIT(0));
428c2ecf20Sopenharmony_ci	}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	mt76_wr(dev, MT_TX_RTS_CFG, rts_cfg);
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(mt76x2_mac_stop);
47