Lines Matching refs:rtwdev
145 struct rtw_dev *rtwdev; member
149 static void rtw_dynamic_csi_rate(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif) in rtw_dynamic_csi_rate() argument
151 struct rtw_bf_info *bf_info = &rtwdev->bf_info; in rtw_dynamic_csi_rate()
159 rtw_chip_cfg_csi_rate(rtwdev, rtwdev->dm_info.min_rssi, in rtw_dynamic_csi_rate()
177 rtw_dynamic_csi_rate(iter_data->rtwdev, rtwvif); in rtw_vif_watch_dog_iter()
190 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, in rtw_watch_dog_work() local
192 struct rtw_traffic_stats *stats = &rtwdev->stats; in rtw_watch_dog_work()
194 bool busy_traffic = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags); in rtw_watch_dog_work()
197 mutex_lock(&rtwdev->mutex); in rtw_watch_dog_work()
199 if (!test_bit(RTW_FLAG_RUNNING, rtwdev->flags)) in rtw_watch_dog_work()
202 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->watch_dog_work, in rtw_watch_dog_work()
205 if (rtwdev->stats.tx_cnt > 100 || rtwdev->stats.rx_cnt > 100) in rtw_watch_dog_work()
206 set_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags); in rtw_watch_dog_work()
208 clear_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags); in rtw_watch_dog_work()
210 rtw_coex_wl_status_check(rtwdev); in rtw_watch_dog_work()
211 rtw_coex_query_bt_hid_list(rtwdev); in rtw_watch_dog_work()
213 if (busy_traffic != test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags)) in rtw_watch_dog_work()
214 rtw_coex_wl_status_change_notify(rtwdev, 0); in rtw_watch_dog_work()
235 if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_watch_dog_work()
239 rtw_leave_lps(rtwdev); in rtw_watch_dog_work()
241 rtw_phy_dynamic_mechanism(rtwdev); in rtw_watch_dog_work()
243 data.rtwdev = rtwdev; in rtw_watch_dog_work()
245 rtw_iterate_vifs_atomic(rtwdev, rtw_vif_watch_dog_iter, &data); in rtw_watch_dog_work()
256 if (rtwdev->ps_enabled && data.rtwvif && !ps_active && in rtw_watch_dog_work()
257 !rtwdev->beacon_loss) in rtw_watch_dog_work()
258 rtw_enter_lps(rtwdev, data.rtwvif->port); in rtw_watch_dog_work()
260 rtwdev->watch_dog_cnt++; in rtw_watch_dog_work()
263 mutex_unlock(&rtwdev->mutex); in rtw_watch_dog_work()
268 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, c2h_work); in rtw_c2h_work() local
271 skb_queue_walk_safe(&rtwdev->c2h_queue, skb, tmp) { in rtw_c2h_work()
272 skb_unlink(skb, &rtwdev->c2h_queue); in rtw_c2h_work()
273 rtw_fw_c2h_cmd_handle(rtwdev, skb); in rtw_c2h_work()
280 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, ips_work); in rtw_ips_work() local
282 mutex_lock(&rtwdev->mutex); in rtw_ips_work()
283 if (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE) in rtw_ips_work()
284 rtw_enter_ips(rtwdev); in rtw_ips_work()
285 mutex_unlock(&rtwdev->mutex); in rtw_ips_work()
288 static u8 rtw_acquire_macid(struct rtw_dev *rtwdev) in rtw_acquire_macid() argument
292 mac_id = find_first_zero_bit(rtwdev->mac_id_map, RTW_MAX_MAC_ID_NUM); in rtw_acquire_macid()
294 set_bit(mac_id, rtwdev->mac_id_map); in rtw_acquire_macid()
299 int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, in rtw_sta_add() argument
305 si->mac_id = rtw_acquire_macid(rtwdev); in rtw_sta_add()
314 rtw_txq_init(rtwdev, sta->txq[i]); in rtw_sta_add()
316 rtw_update_sta_info(rtwdev, si, true); in rtw_sta_add()
317 rtw_fw_media_status_report(rtwdev, si->mac_id, true); in rtw_sta_add()
319 rtwdev->sta_cnt++; in rtw_sta_add()
320 rtwdev->beacon_loss = false; in rtw_sta_add()
321 rtw_dbg(rtwdev, RTW_DBG_STATE, "sta %pM joined with macid %d\n", in rtw_sta_add()
327 void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, in rtw_sta_remove() argument
333 rtw_release_macid(rtwdev, si->mac_id); in rtw_sta_remove()
335 rtw_fw_media_status_report(rtwdev, si->mac_id, false); in rtw_sta_remove()
338 rtw_txq_cleanup(rtwdev, sta->txq[i]); in rtw_sta_remove()
342 rtwdev->sta_cnt--; in rtw_sta_remove()
343 rtw_dbg(rtwdev, RTW_DBG_STATE, "sta %pM with macid %d left\n", in rtw_sta_remove()
354 static int rtw_fwcd_prep(struct rtw_dev *rtwdev) in rtw_fwcd_prep() argument
356 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_fwcd_prep()
357 struct rtw_fwcd_desc *desc = &rtwdev->fw.fwcd_desc; in rtw_fwcd_prep()
379 static u8 *rtw_fwcd_next(struct rtw_dev *rtwdev, u32 item, u32 size) in rtw_fwcd_next() argument
381 struct rtw_fwcd_desc *desc = &rtwdev->fw.fwcd_desc; in rtw_fwcd_next()
386 rtw_dbg(rtwdev, RTW_DBG_FW, "fwcd isn't prepared successfully\n"); in rtw_fwcd_next()
392 rtw_dbg(rtwdev, RTW_DBG_FW, "fwcd isn't prepared enough\n"); in rtw_fwcd_next()
406 static void rtw_fwcd_dump(struct rtw_dev *rtwdev) in rtw_fwcd_dump() argument
408 struct rtw_fwcd_desc *desc = &rtwdev->fw.fwcd_desc; in rtw_fwcd_dump()
410 rtw_dbg(rtwdev, RTW_DBG_FW, "dump fwcd\n"); in rtw_fwcd_dump()
417 dev_coredumpv(rtwdev->dev, desc->data, desc->size, GFP_KERNEL); in rtw_fwcd_dump()
420 static void rtw_fwcd_free(struct rtw_dev *rtwdev, bool free_self) in rtw_fwcd_free() argument
422 struct rtw_fwcd_desc *desc = &rtwdev->fw.fwcd_desc; in rtw_fwcd_free()
425 rtw_dbg(rtwdev, RTW_DBG_FW, "free fwcd by self\n"); in rtw_fwcd_free()
433 static int rtw_fw_dump_crash_log(struct rtw_dev *rtwdev) in rtw_fw_dump_crash_log() argument
435 u32 size = rtwdev->chip->fw_rxff_size; in rtw_fw_dump_crash_log()
439 buf = (u32 *)rtw_fwcd_next(rtwdev, RTW_FWCD_TLV, size); in rtw_fw_dump_crash_log()
443 if (rtw_fw_dump_fifo(rtwdev, RTW_FW_FIFO_SEL_RXBUF_FW, 0, size, buf)) { in rtw_fw_dump_crash_log()
444 rtw_dbg(rtwdev, RTW_DBG_FW, "dump fw fifo fail\n"); in rtw_fw_dump_crash_log()
449 rtw_dbg(rtwdev, RTW_DBG_FW, "fw crash dump's length is 0\n"); in rtw_fw_dump_crash_log()
455 rtw_dbg(rtwdev, RTW_DBG_FW, in rtw_fw_dump_crash_log()
463 int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size, in rtw_dump_fw() argument
466 u32 rxff = rtwdev->chip->fw_rxff_size; in rtw_dump_fw()
471 buf = rtw_fwcd_next(rtwdev, fwcd_item, size); in rtw_dump_fw()
478 ret = rtw_ddma_to_fw_fifo(rtwdev, ocp_src + done_size, in rtw_dump_fw()
481 rtw_err(rtwdev, in rtw_dump_fw()
487 ret = rtw_fw_dump_fifo(rtwdev, RTW_FW_FIFO_SEL_RXBUF_FW, 0, in rtw_dump_fw()
490 rtw_err(rtwdev, in rtw_dump_fw()
504 int rtw_dump_reg(struct rtw_dev *rtwdev, const u32 addr, const u32 size) in rtw_dump_reg() argument
514 buf = rtw_fwcd_next(rtwdev, RTW_FWCD_REG, size); in rtw_dump_reg()
519 *(u32 *)(buf + i) = rtw_read32(rtwdev, addr + i); in rtw_dump_reg()
548 struct rtw_dev *rtwdev = (struct rtw_dev *)data; in rtw_reset_key_iter() local
549 struct rtw_sec_desc *sec = &rtwdev->sec; in rtw_reset_key_iter()
551 rtw_sec_clear_cam(rtwdev, sec, key->hw_key_idx); in rtw_reset_key_iter()
556 struct rtw_dev *rtwdev = (struct rtw_dev *)data; in rtw_reset_sta_iter() local
558 if (rtwdev->sta_cnt == 0) { in rtw_reset_sta_iter()
559 rtw_warn(rtwdev, "sta count before reset should not be 0\n"); in rtw_reset_sta_iter()
562 rtw_sta_remove(rtwdev, sta, false); in rtw_reset_sta_iter()
567 struct rtw_dev *rtwdev = (struct rtw_dev *)data; in rtw_reset_vif_iter() local
570 rtw_bf_disassoc(rtwdev, vif, NULL); in rtw_reset_vif_iter()
572 rtw_txq_cleanup(rtwdev, vif->txq); in rtw_reset_vif_iter()
575 void rtw_fw_recovery(struct rtw_dev *rtwdev) in rtw_fw_recovery() argument
577 if (!test_bit(RTW_FLAG_RESTARTING, rtwdev->flags)) in rtw_fw_recovery()
578 ieee80211_queue_work(rtwdev->hw, &rtwdev->fw_recovery_work); in rtw_fw_recovery()
581 static void __fw_recovery_work(struct rtw_dev *rtwdev) in __fw_recovery_work() argument
585 set_bit(RTW_FLAG_RESTARTING, rtwdev->flags); in __fw_recovery_work()
586 clear_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags); in __fw_recovery_work()
588 ret = rtw_fwcd_prep(rtwdev); in __fw_recovery_work()
591 ret = rtw_fw_dump_crash_log(rtwdev); in __fw_recovery_work()
594 ret = rtw_chip_dump_fw_crash(rtwdev); in __fw_recovery_work()
598 rtw_fwcd_dump(rtwdev); in __fw_recovery_work()
600 rtw_fwcd_free(rtwdev, !!ret); in __fw_recovery_work()
601 rtw_write8(rtwdev, REG_MCU_TST_CFG, 0); in __fw_recovery_work()
606 rtw_iterate_keys_rcu(rtwdev, NULL, rtw_reset_key_iter, rtwdev); in __fw_recovery_work()
608 rtw_iterate_stas_atomic(rtwdev, rtw_reset_sta_iter, rtwdev); in __fw_recovery_work()
609 rtw_iterate_vifs_atomic(rtwdev, rtw_reset_vif_iter, rtwdev); in __fw_recovery_work()
610 rtw_enter_ips(rtwdev); in __fw_recovery_work()
615 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, in rtw_fw_recovery_work() local
618 mutex_lock(&rtwdev->mutex); in rtw_fw_recovery_work()
619 __fw_recovery_work(rtwdev); in rtw_fw_recovery_work()
620 mutex_unlock(&rtwdev->mutex); in rtw_fw_recovery_work()
622 ieee80211_restart_hw(rtwdev->hw); in rtw_fw_recovery_work()
653 struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, ba_work); in rtw_txq_ba_work() local
656 rtw_iterate_stas_atomic(rtwdev, rtw_txq_ba_iter, &data); in rtw_txq_ba_work()
672 void rtw_set_dtim_period(struct rtw_dev *rtwdev, int dtim_period) in rtw_set_dtim_period() argument
674 rtw_write32_set(rtwdev, REG_TCR, BIT_TCR_UPDATE_TIMIE); in rtw_set_dtim_period()
675 rtw_write8(rtwdev, REG_DTIM_COUNTER_ROOT, dtim_period - 1); in rtw_set_dtim_period()
678 void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel, in rtw_update_channel() argument
683 struct rtw_hal *hal = &rtwdev->hal; in rtw_update_channel()
810 void rtw_set_channel(struct rtw_dev *rtwdev) in rtw_set_channel() argument
812 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_set_channel()
813 struct ieee80211_hw *hw = rtwdev->hw; in rtw_set_channel()
814 struct rtw_hal *hal = &rtwdev->hal; in rtw_set_channel()
827 rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth); in rtw_set_channel()
829 chip->ops->set_channel(rtwdev, center_chan, bandwidth, in rtw_set_channel()
833 rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_5G); in rtw_set_channel()
835 if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_set_channel()
836 rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_24G); in rtw_set_channel()
838 rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_24G_NOFORSCAN); in rtw_set_channel()
841 rtw_phy_set_tx_power_level(rtwdev, center_chan); in rtw_set_channel()
847 if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) in rtw_set_channel()
848 rtwdev->need_rfk = true; in rtw_set_channel()
851 void rtw_chip_prepare_tx(struct rtw_dev *rtwdev) in rtw_chip_prepare_tx() argument
853 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_chip_prepare_tx()
855 if (rtwdev->need_rfk) { in rtw_chip_prepare_tx()
856 rtwdev->need_rfk = false; in rtw_chip_prepare_tx()
857 chip->ops->phy_calibration(rtwdev); in rtw_chip_prepare_tx()
861 static void rtw_vif_write_addr(struct rtw_dev *rtwdev, u32 start, u8 *addr) in rtw_vif_write_addr() argument
866 rtw_write8(rtwdev, start + i, addr[i]); in rtw_vif_write_addr()
869 void rtw_vif_port_config(struct rtw_dev *rtwdev, in rtw_vif_port_config() argument
877 rtw_vif_write_addr(rtwdev, addr, rtwvif->mac_addr); in rtw_vif_port_config()
881 rtw_vif_write_addr(rtwdev, addr, rtwvif->bssid); in rtw_vif_port_config()
886 rtw_write32_mask(rtwdev, addr, mask, rtwvif->net_type); in rtw_vif_port_config()
891 rtw_write32_mask(rtwdev, addr, mask, rtwvif->aid); in rtw_vif_port_config()
896 rtw_write8_mask(rtwdev, addr, mask, rtwvif->bcn_ctrl); in rtw_vif_port_config()
920 static void rtw_hw_config_rf_ant_num(struct rtw_dev *rtwdev, u8 hw_ant_num) in rtw_hw_config_rf_ant_num() argument
922 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_hw_config_rf_ant_num()
923 struct rtw_hal *hal = &rtwdev->hal; in rtw_hw_config_rf_ant_num()
1106 static u64 rtw_rate_mask_cfg(struct rtw_dev *rtwdev, struct rtw_sta_info *si, in rtw_rate_mask_cfg() argument
1109 struct rtw_hal *hal = &rtwdev->hal; in rtw_rate_mask_cfg()
1148 void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si, in rtw_update_sta_info() argument
1151 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_update_sta_info()
1153 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_update_sta_info()
1154 struct rtw_hal *hal = &rtwdev->hal; in rtw_update_sta_info()
1183 if (efuse->hw_cap.nss == 1 || rtwdev->hal.txrx_1ss) in rtw_update_sta_info()
1220 rtw_err(rtwdev, "Unknown band type\n"); in rtw_update_sta_info()
1255 ra_mask = rtw_rate_mask_cfg(rtwdev, si, ra_mask, is_vht_enable); in rtw_update_sta_info()
1267 rtw_fw_send_ra_info(rtwdev, si, reset_ra_mask); in rtw_update_sta_info()
1270 static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev) in rtw_wait_firmware_completion() argument
1272 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_wait_firmware_completion()
1275 fw = &rtwdev->fw; in rtw_wait_firmware_completion()
1281 fw = &rtwdev->wow_fw; in rtw_wait_firmware_completion()
1290 static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev, in rtw_update_lps_deep_mode() argument
1293 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_update_lps_deep_mode()
1310 static int rtw_power_on(struct rtw_dev *rtwdev) in rtw_power_on() argument
1312 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_power_on()
1313 struct rtw_fw_state *fw = &rtwdev->fw; in rtw_power_on()
1317 ret = rtw_hci_setup(rtwdev); in rtw_power_on()
1319 rtw_err(rtwdev, "failed to setup hci\n"); in rtw_power_on()
1324 ret = rtw_mac_power_on(rtwdev); in rtw_power_on()
1326 rtw_err(rtwdev, "failed to power on mac\n"); in rtw_power_on()
1330 ret = rtw_wait_firmware_completion(rtwdev); in rtw_power_on()
1332 rtw_err(rtwdev, "failed to wait firmware completion\n"); in rtw_power_on()
1336 ret = rtw_download_firmware(rtwdev, fw); in rtw_power_on()
1338 rtw_err(rtwdev, "failed to download firmware\n"); in rtw_power_on()
1343 ret = rtw_mac_init(rtwdev); in rtw_power_on()
1345 rtw_err(rtwdev, "failed to configure mac\n"); in rtw_power_on()
1349 chip->ops->phy_set_param(rtwdev); in rtw_power_on()
1351 ret = rtw_hci_start(rtwdev); in rtw_power_on()
1353 rtw_err(rtwdev, "failed to start hci\n"); in rtw_power_on()
1358 rtw_fw_send_general_info(rtwdev); in rtw_power_on()
1359 rtw_fw_send_phydm_info(rtwdev); in rtw_power_on()
1361 wifi_only = !rtwdev->efuse.btcoex; in rtw_power_on()
1362 rtw_coex_power_on_setting(rtwdev); in rtw_power_on()
1363 rtw_coex_init_hw_config(rtwdev, wifi_only); in rtw_power_on()
1368 rtw_mac_power_off(rtwdev); in rtw_power_on()
1374 void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start) in rtw_core_fw_scan_notify() argument
1376 if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_NOTIFY_SCAN)) in rtw_core_fw_scan_notify()
1380 rtw_fw_scan_notify(rtwdev, true); in rtw_core_fw_scan_notify()
1382 reinit_completion(&rtwdev->fw_scan_density); in rtw_core_fw_scan_notify()
1383 rtw_fw_scan_notify(rtwdev, false); in rtw_core_fw_scan_notify()
1384 if (!wait_for_completion_timeout(&rtwdev->fw_scan_density, in rtw_core_fw_scan_notify()
1386 rtw_warn(rtwdev, "firmware failed to report density after scan\n"); in rtw_core_fw_scan_notify()
1390 void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif, in rtw_core_scan_start() argument
1396 rtw_leave_lps(rtwdev); in rtw_core_scan_start()
1398 if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE)) { in rtw_core_scan_start()
1399 ret = rtw_leave_ips(rtwdev); in rtw_core_scan_start()
1401 rtw_err(rtwdev, "failed to leave idle state\n"); in rtw_core_scan_start()
1408 rtw_vif_port_config(rtwdev, rtwvif, config); in rtw_core_scan_start()
1410 rtw_coex_scan_notify(rtwdev, COEX_SCAN_START); in rtw_core_scan_start()
1411 rtw_core_fw_scan_notify(rtwdev, true); in rtw_core_scan_start()
1413 set_bit(RTW_FLAG_DIG_DISABLE, rtwdev->flags); in rtw_core_scan_start()
1414 set_bit(RTW_FLAG_SCANNING, rtwdev->flags); in rtw_core_scan_start()
1417 void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, in rtw_core_scan_complete() argument
1426 clear_bit(RTW_FLAG_SCANNING, rtwdev->flags); in rtw_core_scan_complete()
1427 clear_bit(RTW_FLAG_DIG_DISABLE, rtwdev->flags); in rtw_core_scan_complete()
1429 rtw_core_fw_scan_notify(rtwdev, false); in rtw_core_scan_complete()
1433 rtw_vif_port_config(rtwdev, rtwvif, config); in rtw_core_scan_complete()
1435 rtw_coex_scan_notify(rtwdev, COEX_SCAN_FINISH); in rtw_core_scan_complete()
1437 if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE)) in rtw_core_scan_complete()
1438 ieee80211_queue_work(rtwdev->hw, &rtwdev->ips_work); in rtw_core_scan_complete()
1441 int rtw_core_start(struct rtw_dev *rtwdev) in rtw_core_start() argument
1445 ret = rtw_power_on(rtwdev); in rtw_core_start()
1449 rtw_sec_enable_sec_engine(rtwdev); in rtw_core_start()
1451 rtwdev->lps_conf.deep_mode = rtw_update_lps_deep_mode(rtwdev, &rtwdev->fw); in rtw_core_start()
1452 rtwdev->lps_conf.wow_deep_mode = rtw_update_lps_deep_mode(rtwdev, &rtwdev->wow_fw); in rtw_core_start()
1455 rtw_write32(rtwdev, REG_RCR, rtwdev->hal.rcr); in rtw_core_start()
1457 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->watch_dog_work, in rtw_core_start()
1460 set_bit(RTW_FLAG_RUNNING, rtwdev->flags); in rtw_core_start()
1465 static void rtw_power_off(struct rtw_dev *rtwdev) in rtw_power_off() argument
1467 rtw_hci_stop(rtwdev); in rtw_power_off()
1468 rtw_coex_power_off_setting(rtwdev); in rtw_power_off()
1469 rtw_mac_power_off(rtwdev); in rtw_power_off()
1472 void rtw_core_stop(struct rtw_dev *rtwdev) in rtw_core_stop() argument
1474 struct rtw_coex *coex = &rtwdev->coex; in rtw_core_stop()
1476 clear_bit(RTW_FLAG_RUNNING, rtwdev->flags); in rtw_core_stop()
1477 clear_bit(RTW_FLAG_FW_RUNNING, rtwdev->flags); in rtw_core_stop()
1479 mutex_unlock(&rtwdev->mutex); in rtw_core_stop()
1481 cancel_work_sync(&rtwdev->c2h_work); in rtw_core_stop()
1482 cancel_work_sync(&rtwdev->update_beacon_work); in rtw_core_stop()
1483 cancel_delayed_work_sync(&rtwdev->watch_dog_work); in rtw_core_stop()
1493 mutex_lock(&rtwdev->mutex); in rtw_core_stop()
1495 rtw_power_off(rtwdev); in rtw_core_stop()
1498 static void rtw_init_ht_cap(struct rtw_dev *rtwdev, in rtw_init_ht_cap() argument
1501 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_init_ht_cap()
1502 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_init_ht_cap()
1510 if (rtw_chip_has_rx_ldpc(rtwdev)) in rtw_init_ht_cap()
1512 if (rtw_chip_has_tx_stbc(rtwdev)) in rtw_init_ht_cap()
1535 static void rtw_init_vht_cap(struct rtw_dev *rtwdev, in rtw_init_vht_cap() argument
1538 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_init_vht_cap()
1553 if (rtwdev->hal.rf_path_num > 1) in rtw_init_vht_cap()
1557 vht_cap->cap |= (rtwdev->hal.bfee_sts_cap << in rtw_init_vht_cap()
1560 if (rtw_chip_has_rx_ldpc(rtwdev)) in rtw_init_vht_cap()
1584 static u16 rtw_get_max_scan_ie_len(struct rtw_dev *rtwdev) in rtw_get_max_scan_ie_len() argument
1588 len = rtwdev->chip->max_scan_ie_len; in rtw_get_max_scan_ie_len()
1590 if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD) && in rtw_get_max_scan_ie_len()
1591 rtwdev->chip->id == RTW_CHIP_TYPE_8822C) in rtw_get_max_scan_ie_len()
1593 else if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM)) in rtw_get_max_scan_ie_len()
1602 struct rtw_dev *rtwdev = hw->priv; in rtw_set_supported_band() local
1610 rtw_init_ht_cap(rtwdev, &sband->ht_cap); in rtw_set_supported_band()
1619 rtw_init_ht_cap(rtwdev, &sband->ht_cap); in rtw_set_supported_band()
1621 rtw_init_vht_cap(rtwdev, &sband->vht_cap); in rtw_set_supported_band()
1628 rtw_err(rtwdev, "failed to set supported band\n"); in rtw_set_supported_band()
1641 struct rtw_dev *rtwdev = (struct rtw_dev *)data; in rtw_vif_smps_iter() local
1646 if (rtwdev->hal.txrx_1ss) in rtw_vif_smps_iter()
1652 void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool txrx_1ss) in rtw_set_txrx_1ss() argument
1654 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_set_txrx_1ss()
1655 struct rtw_hal *hal = &rtwdev->hal; in rtw_set_txrx_1ss()
1657 if (!chip->ops->config_txrx_mode || rtwdev->hal.txrx_1ss == txrx_1ss) in rtw_set_txrx_1ss()
1660 rtwdev->hal.txrx_1ss = txrx_1ss; in rtw_set_txrx_1ss()
1662 chip->ops->config_txrx_mode(rtwdev, BB_PATH_A, BB_PATH_A, false); in rtw_set_txrx_1ss()
1664 chip->ops->config_txrx_mode(rtwdev, hal->antenna_tx, in rtw_set_txrx_1ss()
1666 rtw_iterate_vifs_atomic(rtwdev, rtw_vif_smps_iter, rtwdev); in rtw_set_txrx_1ss()
1669 static void __update_firmware_feature(struct rtw_dev *rtwdev, in __update_firmware_feature() argument
1679 if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C && in __update_firmware_feature()
1680 RTW_FW_SUIT_VER_CODE(rtwdev->fw) < RTW_FW_VER_CODE(9, 9, 13)) in __update_firmware_feature()
1684 static void __update_firmware_info(struct rtw_dev *rtwdev, in __update_firmware_info() argument
1695 __update_firmware_feature(rtwdev, fw); in __update_firmware_info()
1698 static void __update_firmware_info_legacy(struct rtw_dev *rtwdev, in __update_firmware_info_legacy() argument
1710 static void update_firmware_info(struct rtw_dev *rtwdev, in update_firmware_info() argument
1713 if (rtw_chip_wcpu_11n(rtwdev)) in update_firmware_info()
1714 __update_firmware_info_legacy(rtwdev, fw); in update_firmware_info()
1716 __update_firmware_info(rtwdev, fw); in update_firmware_info()
1722 struct rtw_dev *rtwdev = fw->rtwdev; in rtw_load_firmware_cb() local
1725 rtw_err(rtwdev, "failed to request firmware\n"); in rtw_load_firmware_cb()
1731 update_firmware_info(rtwdev, fw); in rtw_load_firmware_cb()
1734 rtw_info(rtwdev, "Firmware version %u.%u.%u, H2C version %u\n", in rtw_load_firmware_cb()
1738 static int rtw_load_firmware(struct rtw_dev *rtwdev, enum rtw_fw_type type) in rtw_load_firmware() argument
1746 fw = &rtwdev->wow_fw; in rtw_load_firmware()
1747 fw_name = rtwdev->chip->wow_fw_name; in rtw_load_firmware()
1751 fw = &rtwdev->fw; in rtw_load_firmware()
1752 fw_name = rtwdev->chip->fw_name; in rtw_load_firmware()
1756 rtw_warn(rtwdev, "unsupported firmware type\n"); in rtw_load_firmware()
1760 fw->rtwdev = rtwdev; in rtw_load_firmware()
1763 ret = request_firmware_nowait(THIS_MODULE, true, fw_name, rtwdev->dev, in rtw_load_firmware()
1766 rtw_err(rtwdev, "failed to async firmware request\n"); in rtw_load_firmware()
1773 static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) in rtw_chip_parameter_setup() argument
1775 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_chip_parameter_setup()
1776 struct rtw_hal *hal = &rtwdev->hal; in rtw_chip_parameter_setup()
1777 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_chip_parameter_setup()
1779 switch (rtw_hci_type(rtwdev)) { in rtw_chip_parameter_setup()
1781 rtwdev->hci.rpwm_addr = 0x03d9; in rtw_chip_parameter_setup()
1782 rtwdev->hci.cpwm_addr = 0x03da; in rtw_chip_parameter_setup()
1785 rtw_err(rtwdev, "unsupported hci type\n"); in rtw_chip_parameter_setup()
1789 hal->chip_version = rtw_read32(rtwdev, REG_SYS_CFG1); in rtw_chip_parameter_setup()
1811 rtwdev->hal.rcr |= BIT_VHT_DACK; in rtw_chip_parameter_setup()
1818 static int rtw_chip_efuse_enable(struct rtw_dev *rtwdev) in rtw_chip_efuse_enable() argument
1820 struct rtw_fw_state *fw = &rtwdev->fw; in rtw_chip_efuse_enable()
1823 ret = rtw_hci_setup(rtwdev); in rtw_chip_efuse_enable()
1825 rtw_err(rtwdev, "failed to setup hci\n"); in rtw_chip_efuse_enable()
1829 ret = rtw_mac_power_on(rtwdev); in rtw_chip_efuse_enable()
1831 rtw_err(rtwdev, "failed to power on mac\n"); in rtw_chip_efuse_enable()
1835 rtw_write8(rtwdev, REG_C2HEVT, C2H_HW_FEATURE_DUMP); in rtw_chip_efuse_enable()
1840 rtw_err(rtwdev, "failed to load firmware\n"); in rtw_chip_efuse_enable()
1844 ret = rtw_download_firmware(rtwdev, fw); in rtw_chip_efuse_enable()
1846 rtw_err(rtwdev, "failed to download firmware\n"); in rtw_chip_efuse_enable()
1853 rtw_mac_power_off(rtwdev); in rtw_chip_efuse_enable()
1859 static int rtw_dump_hw_feature(struct rtw_dev *rtwdev) in rtw_dump_hw_feature() argument
1861 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_dump_hw_feature()
1867 id = rtw_read8(rtwdev, REG_C2HEVT); in rtw_dump_hw_feature()
1869 rtw_err(rtwdev, "failed to read hw feature report\n"); in rtw_dump_hw_feature()
1874 hw_feature[i] = rtw_read8(rtwdev, REG_C2HEVT + 2 + i); in rtw_dump_hw_feature()
1876 rtw_write8(rtwdev, REG_C2HEVT, 0); in rtw_dump_hw_feature()
1885 rtw_hw_config_rf_ant_num(rtwdev, efuse->hw_cap.ant_num); in rtw_dump_hw_feature()
1888 efuse->hw_cap.nss > rtwdev->hal.rf_path_num) in rtw_dump_hw_feature()
1889 efuse->hw_cap.nss = rtwdev->hal.rf_path_num; in rtw_dump_hw_feature()
1891 rtw_dbg(rtwdev, RTW_DBG_EFUSE, in rtw_dump_hw_feature()
1899 static void rtw_chip_efuse_disable(struct rtw_dev *rtwdev) in rtw_chip_efuse_disable() argument
1901 rtw_hci_stop(rtwdev); in rtw_chip_efuse_disable()
1902 rtw_mac_power_off(rtwdev); in rtw_chip_efuse_disable()
1905 static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev) in rtw_chip_efuse_info_setup() argument
1907 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw_chip_efuse_info_setup()
1910 mutex_lock(&rtwdev->mutex); in rtw_chip_efuse_info_setup()
1913 ret = rtw_chip_efuse_enable(rtwdev); in rtw_chip_efuse_info_setup()
1917 ret = rtw_parse_efuse_map(rtwdev); in rtw_chip_efuse_info_setup()
1921 ret = rtw_dump_hw_feature(rtwdev); in rtw_chip_efuse_info_setup()
1925 ret = rtw_check_supported_rfe(rtwdev); in rtw_chip_efuse_info_setup()
1959 rtw_chip_efuse_disable(rtwdev); in rtw_chip_efuse_info_setup()
1962 mutex_unlock(&rtwdev->mutex); in rtw_chip_efuse_info_setup()
1966 static int rtw_chip_board_info_setup(struct rtw_dev *rtwdev) in rtw_chip_board_info_setup() argument
1968 struct rtw_hal *hal = &rtwdev->hal; in rtw_chip_board_info_setup()
1969 const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev); in rtw_chip_board_info_setup()
1974 rtw_phy_setup_phy_cond(rtwdev, 0); in rtw_chip_board_info_setup()
1976 rtw_phy_init_tx_power(rtwdev); in rtw_chip_board_info_setup()
1978 rtw_load_table(rtwdev, rfe_def->agc_btg_tbl); in rtw_chip_board_info_setup()
1979 rtw_load_table(rtwdev, rfe_def->phy_pg_tbl); in rtw_chip_board_info_setup()
1980 rtw_load_table(rtwdev, rfe_def->txpwr_lmt_tbl); in rtw_chip_board_info_setup()
1987 int rtw_chip_info_setup(struct rtw_dev *rtwdev) in rtw_chip_info_setup() argument
1991 ret = rtw_chip_parameter_setup(rtwdev); in rtw_chip_info_setup()
1993 rtw_err(rtwdev, "failed to setup chip parameters\n"); in rtw_chip_info_setup()
1997 ret = rtw_chip_efuse_info_setup(rtwdev); in rtw_chip_info_setup()
1999 rtw_err(rtwdev, "failed to setup chip efuse info\n"); in rtw_chip_info_setup()
2003 ret = rtw_chip_board_info_setup(rtwdev); in rtw_chip_info_setup()
2005 rtw_err(rtwdev, "failed to setup chip board info\n"); in rtw_chip_info_setup()
2016 static void rtw_stats_init(struct rtw_dev *rtwdev) in rtw_stats_init() argument
2018 struct rtw_traffic_stats *stats = &rtwdev->stats; in rtw_stats_init()
2019 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw_stats_init()
2031 int rtw_core_init(struct rtw_dev *rtwdev) in rtw_core_init() argument
2033 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_core_init()
2034 struct rtw_coex *coex = &rtwdev->coex; in rtw_core_init()
2037 INIT_LIST_HEAD(&rtwdev->rsvd_page_list); in rtw_core_init()
2038 INIT_LIST_HEAD(&rtwdev->txqs); in rtw_core_init()
2040 timer_setup(&rtwdev->tx_report.purge_timer, in rtw_core_init()
2042 rtwdev->tx_wq = alloc_workqueue("rtw_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0); in rtw_core_init()
2043 if (!rtwdev->tx_wq) { in rtw_core_init()
2044 rtw_warn(rtwdev, "alloc_workqueue rtw_tx_wq failed\n"); in rtw_core_init()
2048 INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work); in rtw_core_init()
2058 INIT_WORK(&rtwdev->tx_work, rtw_tx_work); in rtw_core_init()
2059 INIT_WORK(&rtwdev->c2h_work, rtw_c2h_work); in rtw_core_init()
2060 INIT_WORK(&rtwdev->ips_work, rtw_ips_work); in rtw_core_init()
2061 INIT_WORK(&rtwdev->fw_recovery_work, rtw_fw_recovery_work); in rtw_core_init()
2062 INIT_WORK(&rtwdev->update_beacon_work, rtw_fw_update_beacon_work); in rtw_core_init()
2063 INIT_WORK(&rtwdev->ba_work, rtw_txq_ba_work); in rtw_core_init()
2064 skb_queue_head_init(&rtwdev->c2h_queue); in rtw_core_init()
2065 skb_queue_head_init(&rtwdev->coex.queue); in rtw_core_init()
2066 skb_queue_head_init(&rtwdev->tx_report.queue); in rtw_core_init()
2068 spin_lock_init(&rtwdev->rf_lock); in rtw_core_init()
2069 spin_lock_init(&rtwdev->h2c.lock); in rtw_core_init()
2070 spin_lock_init(&rtwdev->txq_lock); in rtw_core_init()
2071 spin_lock_init(&rtwdev->tx_report.q_lock); in rtw_core_init()
2073 mutex_init(&rtwdev->mutex); in rtw_core_init()
2074 mutex_init(&rtwdev->coex.mutex); in rtw_core_init()
2075 mutex_init(&rtwdev->hal.tx_power_mutex); in rtw_core_init()
2077 init_waitqueue_head(&rtwdev->coex.wait); in rtw_core_init()
2078 init_completion(&rtwdev->lps_leave_check); in rtw_core_init()
2079 init_completion(&rtwdev->fw_scan_density); in rtw_core_init()
2081 rtwdev->sec.total_cam_num = 32; in rtw_core_init()
2082 rtwdev->hal.current_channel = 1; in rtw_core_init()
2083 rtwdev->dm_info.fix_rate = U8_MAX; in rtw_core_init()
2084 set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map); in rtw_core_init()
2086 rtw_stats_init(rtwdev); in rtw_core_init()
2089 rtwdev->hal.rcr = BIT_APP_FCS | BIT_APP_MIC | BIT_APP_ICV | in rtw_core_init()
2093 ret = rtw_load_firmware(rtwdev, RTW_NORMAL_FW); in rtw_core_init()
2095 rtw_warn(rtwdev, "no firmware loaded\n"); in rtw_core_init()
2100 ret = rtw_load_firmware(rtwdev, RTW_WOWLAN_FW); in rtw_core_init()
2102 rtw_warn(rtwdev, "no wow firmware loaded\n"); in rtw_core_init()
2103 wait_for_completion(&rtwdev->fw.completion); in rtw_core_init()
2104 if (rtwdev->fw.firmware) in rtw_core_init()
2105 release_firmware(rtwdev->fw.firmware); in rtw_core_init()
2113 destroy_workqueue(rtwdev->tx_wq); in rtw_core_init()
2118 void rtw_core_deinit(struct rtw_dev *rtwdev) in rtw_core_deinit() argument
2120 struct rtw_fw_state *fw = &rtwdev->fw; in rtw_core_deinit()
2121 struct rtw_fw_state *wow_fw = &rtwdev->wow_fw; in rtw_core_deinit()
2125 rtw_wait_firmware_completion(rtwdev); in rtw_core_deinit()
2133 destroy_workqueue(rtwdev->tx_wq); in rtw_core_deinit()
2134 spin_lock_irqsave(&rtwdev->tx_report.q_lock, flags); in rtw_core_deinit()
2135 skb_queue_purge(&rtwdev->tx_report.queue); in rtw_core_deinit()
2136 skb_queue_purge(&rtwdev->coex.queue); in rtw_core_deinit()
2137 spin_unlock_irqrestore(&rtwdev->tx_report.q_lock, flags); in rtw_core_deinit()
2139 list_for_each_entry_safe(rsvd_pkt, tmp, &rtwdev->rsvd_page_list, in rtw_core_deinit()
2145 mutex_destroy(&rtwdev->mutex); in rtw_core_deinit()
2146 mutex_destroy(&rtwdev->coex.mutex); in rtw_core_deinit()
2147 mutex_destroy(&rtwdev->hal.tx_power_mutex); in rtw_core_deinit()
2151 int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) in rtw_register_hw() argument
2153 struct rtw_hal *hal = &rtwdev->hal; in rtw_register_hw()
2158 max_tx_headroom = rtwdev->chip->tx_pkt_desc_sz; in rtw_register_hw()
2191 hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev); in rtw_register_hw()
2198 hw->wiphy->wowlan = rtwdev->chip->wowlan_stub; in rtw_register_hw()
2199 hw->wiphy->max_sched_scan_ssids = rtwdev->chip->max_sched_scan_ssids; in rtw_register_hw()
2201 rtw_set_supported_band(hw, rtwdev->chip); in rtw_register_hw()
2202 SET_IEEE80211_PERM_ADDR(hw, rtwdev->efuse.addr); in rtw_register_hw()
2206 ret = rtw_regd_init(rtwdev); in rtw_register_hw()
2208 rtw_err(rtwdev, "failed to init regd\n"); in rtw_register_hw()
2214 rtw_err(rtwdev, "failed to register hw\n"); in rtw_register_hw()
2218 ret = rtw_regd_hint(rtwdev); in rtw_register_hw()
2220 rtw_err(rtwdev, "failed to hint regd\n"); in rtw_register_hw()
2224 rtw_debugfs_init(rtwdev); in rtw_register_hw()
2226 rtwdev->bf_info.bfer_mu_cnt = 0; in rtw_register_hw()
2227 rtwdev->bf_info.bfer_su_cnt = 0; in rtw_register_hw()
2233 void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) in rtw_unregister_hw() argument
2235 const struct rtw_chip_info *chip = rtwdev->chip; in rtw_unregister_hw()