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