162306a36Sopenharmony_ci// SPDX-License-Identifier: ISC
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
462306a36Sopenharmony_ci * Copyright (C) 2018 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "mt76x2.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_civoid mt76x2_mac_stop(struct mt76x02_dev *dev, bool force)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	bool stopped = false;
1262306a36Sopenharmony_ci	u32 rts_cfg;
1362306a36Sopenharmony_ci	int i;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	mt76_clear(dev, MT_TXOP_CTRL_CFG, MT_TXOP_ED_CCA_EN);
1662306a36Sopenharmony_ci	mt76_clear(dev, MT_TXOP_HLDR_ET, MT_TXOP_HLDR_TX40M_BLK_EN);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	mt76_wr(dev, MT_MAC_SYS_CTRL, 0);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	rts_cfg = mt76_rr(dev, MT_TX_RTS_CFG);
2162306a36Sopenharmony_ci	mt76_wr(dev, MT_TX_RTS_CFG, rts_cfg & ~MT_TX_RTS_CFG_RETRY_LIMIT);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	/* Wait for MAC to become idle */
2462306a36Sopenharmony_ci	for (i = 0; i < 300; i++) {
2562306a36Sopenharmony_ci		if ((mt76_rr(dev, MT_MAC_STATUS) &
2662306a36Sopenharmony_ci		     (MT_MAC_STATUS_RX | MT_MAC_STATUS_TX)) ||
2762306a36Sopenharmony_ci		    mt76_rr(dev, MT_BBP(IBI, 12))) {
2862306a36Sopenharmony_ci			udelay(1);
2962306a36Sopenharmony_ci			continue;
3062306a36Sopenharmony_ci		}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci		stopped = true;
3362306a36Sopenharmony_ci		break;
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	if (force && !stopped) {
3762306a36Sopenharmony_ci		mt76_set(dev, MT_BBP(CORE, 4), BIT(1));
3862306a36Sopenharmony_ci		mt76_clear(dev, MT_BBP(CORE, 4), BIT(1));
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci		mt76_set(dev, MT_BBP(CORE, 4), BIT(0));
4162306a36Sopenharmony_ci		mt76_clear(dev, MT_BBP(CORE, 4), BIT(0));
4262306a36Sopenharmony_ci	}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	mt76_wr(dev, MT_TX_RTS_CFG, rts_cfg);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt76x2_mac_stop);
47