Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'wireless-next-2023-12-22' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next

Kalle Valo says:

====================
wireless-next patches for v6.8

The third "new features" pull request for v6.8. This is a smaller one
to clear up our tree before the break and nothing really noteworthy
this time.

Major changes:

stack

* cfg80211: introduce cfg80211_ssid_eq() for SSID matching

* cfg80211: support P2P operation on DFS channels

* mac80211: allow 64-bit radiotap timestamps

iwlwifi

* AX210: allow concurrent P2P operation on DFS channels
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+2733 -419
+1 -1
drivers/net/wireless/ath/ath10k/htt_rx.c
··· 1295 1295 status->encoding = RX_ENC_LEGACY; 1296 1296 status->bw = RATE_INFO_BW_20; 1297 1297 1298 - status->flag &= ~RX_FLAG_MACTIME_END; 1298 + status->flag &= ~RX_FLAG_MACTIME; 1299 1299 status->flag |= RX_FLAG_NO_SIGNAL_VAL; 1300 1300 1301 1301 status->flag &= ~(RX_FLAG_AMPDU_IS_LAST);
+6
drivers/net/wireless/intel/iwlwifi/fw/api/debug.h
··· 60 60 */ 61 61 FW_DUMP_COMPLETE_CMD = 0xB, 62 62 /** 63 + * @FW_CLEAR_BUFFER: 64 + * clears the firmware's internal buffer 65 + * no payload 66 + */ 67 + FW_CLEAR_BUFFER = 0xD, 68 + /** 63 69 * @MFU_ASSERT_DUMP_NTF: 64 70 * &struct iwl_mfu_assert_dump_notif 65 71 */
+3
drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
··· 269 269 __le32 reserved; 270 270 } __packed; /* NVM_ACCESS_COMPLETE_CMD_API_S_VER_1 */ 271 271 272 + #define IWL_MCC_US 0x5553 273 + #define IWL_MCC_CANADA 0x4341 274 + 272 275 /** 273 276 * struct iwl_mcc_update_cmd - Request the device to update geographic 274 277 * regulatory profile according to the given MCC (Mobile Country Code).
+9
drivers/net/wireless/intel/iwlwifi/fw/dbg.c
··· 3401 3401 struct iwl_fw_dbg_params params = {0}; 3402 3402 3403 3403 iwl_fw_dbg_stop_sync(fwrt); 3404 + 3405 + if (fw_has_api(&fwrt->fw->ucode_capa, 3406 + IWL_UCODE_TLV_API_INT_DBG_BUF_CLEAR)) { 3407 + struct iwl_host_cmd hcmd = { 3408 + .id = WIDE_ID(DEBUG_GROUP, FW_CLEAR_BUFFER), 3409 + }; 3410 + iwl_trans_send_cmd(fwrt->trans, &hcmd); 3411 + } 3412 + 3404 3413 iwl_dbg_tlv_init_cfg(fwrt); 3405 3414 iwl_fw_dbg_stop_restart_recording(fwrt, &params, false); 3406 3415 }
+4
drivers/net/wireless/intel/iwlwifi/fw/file.h
··· 245 245 * SCAN_CONFIG_DB_CMD_API_S. 246 246 * @IWL_UCODE_TLV_API_NO_HOST_DISABLE_TX: Firmware offloaded the station disable tx 247 247 * logic. 248 + * @IWL_UCODE_TLV_API_INT_DBG_BUF_CLEAR: Firmware supports clearing the debug 249 + * internal buffer 248 250 * 249 251 * @NUM_IWL_UCODE_TLV_API: number of bits used 250 252 */ ··· 284 282 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP = (__force iwl_ucode_tlv_api_t)57, 285 283 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER = (__force iwl_ucode_tlv_api_t)58, 286 284 IWL_UCODE_TLV_API_BAND_IN_RX_DATA = (__force iwl_ucode_tlv_api_t)59, 285 + /* API Set 2 */ 287 286 IWL_UCODE_TLV_API_NO_HOST_DISABLE_TX = (__force iwl_ucode_tlv_api_t)66, 287 + IWL_UCODE_TLV_API_INT_DBG_BUF_CLEAR = (__force iwl_ucode_tlv_api_t)67, 288 288 289 289 NUM_IWL_UCODE_TLV_API 290 290 /*
-1
drivers/net/wireless/intel/iwlwifi/iwl-config.h
··· 377 377 u16 nvm_calib_ver; 378 378 u32 rx_with_siso_diversity:1, 379 379 tx_with_siso_diversity:1, 380 - bt_shared_single_ant:1, 381 380 internal_wimax_coex:1, 382 381 host_interrupt_operation_mode:1, 383 382 high_temp:1,
+2
drivers/net/wireless/intel/iwlwifi/iwl-csr.h
··· 354 354 #define CSR_HW_RF_ID_TYPE_GF (0x0010D000) 355 355 #define CSR_HW_RF_ID_TYPE_GF4 (0x0010E000) 356 356 #define CSR_HW_RF_ID_TYPE_MS (0x00111000) 357 + #define CSR_HW_RF_ID_TYPE_FM (0x00112000) 358 + #define CSR_HW_RF_ID_TYPE_WP (0x00113000) 357 359 358 360 /* HW_RF CHIP STEP */ 359 361 #define CSR_HW_RF_STEP(_val) (((_val) >> 8) & 0xF)
+11 -4
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
··· 1609 1609 /* Set the GO concurrent flag only in case that NO_IR is set. 1610 1610 * Otherwise it is meaningless 1611 1611 */ 1612 - if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) && 1613 - (flags & NL80211_RRF_NO_IR)) 1614 - flags |= NL80211_RRF_GO_CONCURRENT; 1615 - 1612 + if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT)) { 1613 + if (flags & NL80211_RRF_NO_IR) 1614 + flags |= NL80211_RRF_GO_CONCURRENT; 1615 + if (flags & NL80211_RRF_DFS) { 1616 + flags |= NL80211_RRF_DFS_CONCURRENT; 1617 + /* Our device doesn't set active bit for DFS channels 1618 + * however, once marked as DFS no-ir is not needed. 1619 + */ 1620 + flags &= ~NL80211_RRF_NO_IR; 1621 + } 1622 + } 1616 1623 /* 1617 1624 * reg_capa is per regulatory domain so apply it for every channel 1618 1625 */
+4 -4
drivers/net/wireless/intel/iwlwifi/iwl-trans.h
··· 1316 1316 struct iwl_trans_rxq_dma_data *data) 1317 1317 { 1318 1318 if (WARN_ON_ONCE(!trans->ops->rxq_dma_data)) 1319 - return -ENOTSUPP; 1319 + return -EOPNOTSUPP; 1320 1320 1321 1321 return trans->ops->rxq_dma_data(trans, queue, data); 1322 1322 } ··· 1338 1338 might_sleep(); 1339 1339 1340 1340 if (WARN_ON_ONCE(!trans->ops->txq_alloc)) 1341 - return -ENOTSUPP; 1341 + return -EOPNOTSUPP; 1342 1342 1343 1343 if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) { 1344 1344 IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state); ··· 1404 1404 u32 txqs) 1405 1405 { 1406 1406 if (WARN_ON_ONCE(!trans->ops->wait_tx_queues_empty)) 1407 - return -ENOTSUPP; 1407 + return -EOPNOTSUPP; 1408 1408 1409 1409 /* No need to wait if the firmware is not alive */ 1410 1410 if (trans->state != IWL_TRANS_FW_ALIVE) { ··· 1418 1418 static inline int iwl_trans_wait_txq_empty(struct iwl_trans *trans, int queue) 1419 1419 { 1420 1420 if (WARN_ON_ONCE(!trans->ops->wait_txq_empty)) 1421 - return -ENOTSUPP; 1421 + return -EOPNOTSUPP; 1422 1422 1423 1423 if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) { 1424 1424 IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+4 -18
drivers/net/wireless/intel/iwlwifi/mvm/coex.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 2 /* 3 - * Copyright (C) 2013-2014, 2018-2020, 2022 Intel Corporation 3 + * Copyright (C) 2013-2014, 2018-2020, 2022-2023 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 */ 6 6 #include <linux/ieee80211.h> ··· 115 115 } 116 116 117 117 ret = BT_COEX_TX_DIS_LUT; 118 - 119 - if (mvm->cfg->bt_shared_single_ant) { 120 - rcu_read_unlock(); 121 - return ret; 122 - } 123 118 124 119 phy_ctx_id = *((u16 *)chanctx_conf->drv_priv); 125 120 primary_ch_phy_id = le32_to_cpu(mvm->last_bt_ci_cmd.primary_ch_phy_id); ··· 378 383 /* 379 384 * don't reduce the Tx power if one of these is true: 380 385 * we are in LOOSE 381 - * single share antenna product 382 386 * BT is inactive 383 387 * we are not associated 384 388 */ 385 389 if (iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT || 386 - mvm->cfg->bt_shared_single_ant || !vif->cfg.assoc || 387 - le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) == BT_OFF) { 390 + le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) == BT_OFF || 391 + !vif->cfg.assoc) { 388 392 iwl_mvm_bt_coex_reduced_txp(mvm, link_info->ap_sta_id, false); 389 393 /* FIXME: should this be per link? */ 390 394 iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0); ··· 564 570 * Check if rssi is good enough for reduced Tx power, but not in loose 565 571 * scheme. 566 572 */ 567 - if (rssi_event == RSSI_EVENT_LOW || mvm->cfg->bt_shared_single_ant || 573 + if (rssi_event == RSSI_EVENT_LOW || 568 574 iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT) 569 575 ret = iwl_mvm_bt_coex_reduced_txp(mvm, 570 576 mvmvif->deflink.ap_sta_id, ··· 633 639 634 640 bool iwl_mvm_bt_coex_is_ant_avail(struct iwl_mvm *mvm, u8 ant) 635 641 { 636 - /* there is no other antenna, shared antenna is always available */ 637 - if (mvm->cfg->bt_shared_single_ant) 638 - return true; 639 - 640 642 if (ant & mvm->cfg->non_shared_ant) 641 643 return true; 642 644 ··· 642 652 643 653 bool iwl_mvm_bt_coex_is_shared_ant_avail(struct iwl_mvm *mvm) 644 654 { 645 - /* there is no other antenna, shared antenna is always available */ 646 - if (mvm->cfg->bt_shared_single_ant) 647 - return true; 648 - 649 655 return le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) < BT_HIGH_TRAFFIC; 650 656 } 651 657
+2 -15
drivers/net/wireless/intel/iwlwifi/mvm/d3.c
··· 1130 1130 return ret; 1131 1131 } 1132 1132 1133 - /* 1134 - * This needs to be unlocked due to lock ordering 1135 - * constraints. Since we're in the suspend path 1136 - * that isn't really a problem though. 1137 - */ 1138 - mutex_unlock(&mvm->mutex); 1139 1133 ret = iwl_mvm_wowlan_config_key_params(mvm, vif); 1140 - mutex_lock(&mvm->mutex); 1141 1134 if (ret) 1142 1135 return ret; 1143 1136 ··· 2490 2497 struct iwl_wowlan_status_data *status) 2491 2498 { 2492 2499 int i; 2493 - bool keep; 2500 + bool keep = false; 2494 2501 struct iwl_mvm_sta *mvm_ap_sta; 2495 2502 2496 2503 if (!status) ··· 2518 2525 mvm_ap_sta->tid_data[i].seq_number >> 4); 2519 2526 } 2520 2527 2521 - /* now we have all the data we need, unlock to avoid mac80211 issues */ 2522 - mutex_unlock(&mvm->mutex); 2523 - 2524 2528 iwl_mvm_report_wakeup_reasons(mvm, vif, status); 2525 2529 2526 2530 keep = iwl_mvm_setup_connection_keep(mvm, vif, status); 2527 - 2528 - return keep; 2529 - 2530 2531 out_unlock: 2531 2532 mutex_unlock(&mvm->mutex); 2532 - return false; 2533 + return keep; 2533 2534 } 2534 2535 2535 2536 #define ND_QUERY_BUF_LEN (sizeof(struct iwl_scan_offload_profile_match) * \
+2 -2
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
··· 1521 1521 1522 1522 /* supporting only MQ RX */ 1523 1523 if (!mvm->trans->trans_cfg->mq_rx_supported) 1524 - return -ENOTSUPP; 1524 + return -EOPNOTSUPP; 1525 1525 1526 1526 rxb._page = alloc_pages(GFP_ATOMIC, 0); 1527 1527 if (!rxb._page) ··· 1829 1829 char buf[buflen] = {}; \ 1830 1830 size_t buf_size = min(count, sizeof(buf) - 1); \ 1831 1831 \ 1832 - if (copy_from_user(buf, user_buf, sizeof(buf))) \ 1832 + if (copy_from_user(buf, user_buf, buf_size)) \ 1833 1833 return -EFAULT; \ 1834 1834 \ 1835 1835 return _iwl_dbgfs_link_sta_wrap_write(iwl_dbgfs_##name##_write, \
+4 -4
drivers/net/wireless/intel/iwlwifi/mvm/ftm-responder.c
··· 39 39 *ctrl_ch_position = iwl_mvm_get_ctrl_pos(chandef); 40 40 break; 41 41 default: 42 - return -ENOTSUPP; 42 + return -EOPNOTSUPP; 43 43 } 44 44 45 45 return 0; ··· 77 77 } 78 78 fallthrough; 79 79 default: 80 - return -ENOTSUPP; 80 + return -EOPNOTSUPP; 81 81 } 82 82 83 83 return 0; ··· 291 291 default: 292 292 IWL_ERR(mvm, "Unsupported DYN_CONFIG_CMD version %u\n", 293 293 cmd_ver); 294 - ret = -ENOTSUPP; 294 + ret = -EOPNOTSUPP; 295 295 } 296 296 297 297 return ret; ··· 333 333 334 334 if (cmd_ver < 3) { 335 335 IWL_ERR(mvm, "Adding PASN station not supported by FW\n"); 336 - return -ENOTSUPP; 336 + return -EOPNOTSUPP; 337 337 } 338 338 339 339 if ((!hltk || !hltk_len) && (!tk || !tk_len)) {
+2 -5
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
··· 27 27 #define MVM_UCODE_ALIVE_TIMEOUT (2 * HZ) 28 28 #define MVM_UCODE_CALIB_TIMEOUT (2 * HZ) 29 29 30 - #define IWL_TAS_US_MCC 0x5553 31 - #define IWL_TAS_CANADA_MCC 0x4341 32 - 33 30 #define IWL_UATS_VLP_AP_SUPPORTED BIT(29) 34 31 #define IWL_UATS_AFC_AP_SUPPORTED BIT(30) 35 32 ··· 1231 1234 dmi_get_system_info(DMI_SYS_VENDOR)); 1232 1235 if ((!iwl_mvm_add_to_tas_block_list(cmd.v4.block_list_array, 1233 1236 &cmd.v4.block_list_size, 1234 - IWL_TAS_US_MCC)) || 1237 + IWL_MCC_US)) || 1235 1238 (!iwl_mvm_add_to_tas_block_list(cmd.v4.block_list_array, 1236 1239 &cmd.v4.block_list_size, 1237 - IWL_TAS_CANADA_MCC))) { 1240 + IWL_MCC_CANADA))) { 1238 1241 IWL_DEBUG_RADIO(mvm, 1239 1242 "Unable to add US/Canada to TAS block list, disabling TAS\n"); 1240 1243 return;
+15 -1
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
··· 152 152 mvm->lar_regdom_set = true; 153 153 mvm->mcc_src = src_id; 154 154 155 + /* Some kind of regulatory mess means we need to currently disallow 156 + * puncturing in the US and Canada. Do that here, at least until we 157 + * figure out the new chanctx APIs for puncturing. 158 + */ 159 + if (resp->mcc == cpu_to_le16(IWL_MCC_US) || 160 + resp->mcc == cpu_to_le16(IWL_MCC_CANADA)) 161 + ieee80211_hw_set(mvm->hw, DISALLOW_PUNCTURING); 162 + else 163 + __clear_bit(IEEE80211_HW_DISALLOW_PUNCTURING, mvm->hw->flags); 164 + 155 165 iwl_mei_set_country_code(__le16_to_cpu(resp->mcc)); 156 166 157 167 out: ··· 298 288 /* This has been tested on those devices only */ 299 289 if (mvm->trans->trans_cfg->device_family != IWL_DEVICE_FAMILY_9000 && 300 290 mvm->trans->trans_cfg->device_family != IWL_DEVICE_FAMILY_22000) 301 - return -ENOTSUPP; 291 + return -EOPNOTSUPP; 302 292 303 293 if (!mvm->nvm_data) 304 294 return -EBUSY; ··· 526 516 else 527 517 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | 528 518 REGULATORY_DISABLE_BEACON_HINTS; 519 + 520 + if (mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) 521 + wiphy_ext_feature_set(hw->wiphy, 522 + NL80211_EXT_FEATURE_DFS_CONCURRENT); 529 523 530 524 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 531 525 hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
+4 -4
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
··· 271 271 } 272 272 } 273 273 274 + mvmvif->link[link_id]->phy_ctxt = phy_ctxt; 275 + 274 276 if (iwl_mvm_is_esr_supported(mvm->fwrt.trans) && n_active > 1) { 275 277 mvmvif->link[link_id]->listen_lmac = true; 276 278 ret = iwl_mvm_esr_mode_active(mvm, vif); 277 279 if (ret) { 278 280 IWL_ERR(mvm, "failed to activate ESR mode (%d)\n", ret); 279 - return ret; 281 + goto out; 280 282 } 281 283 } 282 - 283 - mvmvif->link[link_id]->phy_ctxt = phy_ctxt; 284 284 285 285 if (switching_chanctx) { 286 286 /* reactivate if we turned this off during channel switch */ ··· 716 716 } 717 717 } 718 718 719 - if (WARN_ON(!new_active_links)) 719 + if (!new_active_links) 720 720 return; 721 721 722 722 if (vif->active_links != new_active_links)
-11
drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
··· 99 99 active_cnt = 2; 100 100 } 101 101 102 - /* 103 - * If the firmware requested it, then we know that it supports 104 - * getting zero for the values to indicate "use one, but pick 105 - * which one yourself", which means it can dynamically pick one 106 - * that e.g. has better RSSI. 107 - */ 108 - if (mvm->fw_static_smps_request && active_cnt == 1 && idle_cnt == 1) { 109 - idle_cnt = 0; 110 - active_cnt = 0; 111 - } 112 - 113 102 *rxchain_info = cpu_to_le32(iwl_mvm_get_valid_rx_ant(mvm) << 114 103 PHY_RX_CHAIN_VALID_POS); 115 104 *rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS);
+2 -2
drivers/net/wireless/intel/iwlwifi/mvm/sta.c
··· 2550 2550 2551 2551 if (WARN_ON(vif->type != NL80211_IFTYPE_AP && 2552 2552 vif->type != NL80211_IFTYPE_ADHOC)) 2553 - return -ENOTSUPP; 2553 + return -EOPNOTSUPP; 2554 2554 2555 2555 /* 2556 2556 * In IBSS, ieee80211_check_queues() sets the cab_queue to be ··· 3234 3234 * should be updated as well. 3235 3235 */ 3236 3236 if (buf_size < IWL_FRAME_LIMIT) 3237 - return -ENOTSUPP; 3237 + return -EOPNOTSUPP; 3238 3238 3239 3239 ret = iwl_mvm_sta_tx_agg(mvm, sta, tid, queue, true); 3240 3240 if (ret)
+1 -1
drivers/net/wireless/intel/iwlwifi/mvm/tx.c
··· 2256 2256 WARN_ON(!iwl_mvm_has_new_tx_api(mvm)); 2257 2257 2258 2258 if (iwl_fw_lookup_notif_ver(mvm->fw, LONG_GROUP, TXPATH_FLUSH, 0) > 0) 2259 - cmd.flags |= CMD_WANT_SKB; 2259 + cmd.flags |= CMD_WANT_SKB | CMD_SEND_IN_RFKILL; 2260 2260 2261 2261 IWL_DEBUG_TX_QUEUES(mvm, "flush for sta id %d tid mask 0x%x\n", 2262 2262 sta_id, tids);
+10
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c
··· 290 290 case CSR_HW_RFID_TYPE(CSR_HW_RF_ID_TYPE_MS): 291 291 pos = scnprintf(buf, buflen, "MS"); 292 292 break; 293 + case CSR_HW_RFID_TYPE(CSR_HW_RF_ID_TYPE_FM): 294 + pos = scnprintf(buf, buflen, "FM"); 295 + break; 296 + case CSR_HW_RFID_TYPE(CSR_HW_RF_ID_TYPE_WP): 297 + if (SILICON_Z_STEP == 298 + CSR_HW_RFID_STEP(trans->hw_rf_id)) 299 + pos = scnprintf(buf, buflen, "WHTC"); 300 + else 301 + pos = scnprintf(buf, buflen, "WH"); 302 + break; 293 303 default: 294 304 return; 295 305 }
+2 -2
drivers/net/wireless/marvell/mwifiex/join.c
··· 1427 1427 1428 1428 /* Check if the requested SSID is already joined */ 1429 1429 if (priv->curr_bss_params.bss_descriptor.ssid.ssid_len && 1430 - !mwifiex_ssid_cmp(&bss_desc->ssid, 1431 - &priv->curr_bss_params.bss_descriptor.ssid) && 1430 + cfg80211_ssid_eq(&bss_desc->ssid, 1431 + &priv->curr_bss_params.bss_descriptor.ssid) && 1432 1432 (priv->curr_bss_params.bss_descriptor.bss_mode == 1433 1433 NL80211_IFTYPE_ADHOC)) { 1434 1434 mwifiex_dbg(priv->adapter, INFO,
-1
drivers/net/wireless/marvell/mwifiex/main.h
··· 1152 1152 struct cmd_ctrl_node *cmd_node); 1153 1153 int mwifiex_ret_802_11_scan(struct mwifiex_private *priv, 1154 1154 struct host_cmd_ds_command *resp); 1155 - s32 mwifiex_ssid_cmp(struct cfg80211_ssid *ssid1, struct cfg80211_ssid *ssid2); 1156 1155 int mwifiex_associate(struct mwifiex_private *priv, 1157 1156 struct mwifiex_bssdescriptor *bss_desc); 1158 1157 int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
-11
drivers/net/wireless/marvell/mwifiex/scan.c
··· 180 180 } 181 181 182 182 /* 183 - * This function compares two SSIDs and checks if they match. 184 - */ 185 - s32 186 - mwifiex_ssid_cmp(struct cfg80211_ssid *ssid1, struct cfg80211_ssid *ssid2) 187 - { 188 - if (!ssid1 || !ssid2 || (ssid1->ssid_len != ssid2->ssid_len)) 189 - return -1; 190 - return memcmp(ssid1->ssid, ssid2->ssid, ssid1->ssid_len); 191 - } 192 - 193 - /* 194 183 * This function checks if wapi is enabled in driver and scanned network is 195 184 * compatible with it. 196 185 */
+1 -1
drivers/net/wireless/marvell/mwifiex/sdio.c
··· 779 779 { 780 780 struct sdio_mmc_card *card = adapter->card; 781 781 int ret = 0; 782 - u16 firmware_stat; 782 + u16 firmware_stat = 0; 783 783 u32 tries; 784 784 785 785 for (tries = 0; tries < poll_num; tries++) {
+2 -2
drivers/net/wireless/marvell/mwifiex/sta_ioctl.c
··· 345 345 /* Adhoc mode */ 346 346 /* If the requested SSID matches current SSID, return */ 347 347 if (bss_desc && bss_desc->ssid.ssid_len && 348 - (!mwifiex_ssid_cmp(&priv->curr_bss_params.bss_descriptor. 349 - ssid, &bss_desc->ssid))) { 348 + cfg80211_ssid_eq(&priv->curr_bss_params.bss_descriptor.ssid, 349 + &bss_desc->ssid)) { 350 350 ret = 0; 351 351 goto done; 352 352 }
+12
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
··· 7961 7961 .driver_info = (unsigned long)&rtl8192eu_fops}, 7962 7962 {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818c, 0xff, 0xff, 0xff), 7963 7963 .driver_info = (unsigned long)&rtl8192eu_fops}, 7964 + /* D-Link DWA-131 rev C1 */ 7965 + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3312, 0xff, 0xff, 0xff), 7966 + .driver_info = (unsigned long)&rtl8192eu_fops}, 7967 + /* TP-Link TL-WN8200ND V2 */ 7968 + {USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0126, 0xff, 0xff, 0xff), 7969 + .driver_info = (unsigned long)&rtl8192eu_fops}, 7970 + /* Mercusys MW300UM */ 7971 + {USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0100, 0xff, 0xff, 0xff), 7972 + .driver_info = (unsigned long)&rtl8192eu_fops}, 7973 + /* Mercusys MW300UH */ 7974 + {USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0104, 0xff, 0xff, 0xff), 7975 + .driver_info = (unsigned long)&rtl8192eu_fops}, 7964 7976 #endif 7965 7977 { } 7966 7978 };
+4 -10
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/phy.c
··· 16 16 static void _rtl88e_phy_rf_serial_write(struct ieee80211_hw *hw, 17 17 enum radio_path rfpath, u32 offset, 18 18 u32 data); 19 - static u32 _rtl88e_phy_calculate_bit_shift(u32 bitmask) 20 - { 21 - u32 i = ffs(bitmask); 22 - 23 - return i ? i - 1 : 32; 24 - } 25 19 static bool _rtl88e_phy_bb8188e_config_parafile(struct ieee80211_hw *hw); 26 20 static bool _rtl88e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); 27 21 static bool phy_config_bb_with_headerfile(struct ieee80211_hw *hw, ··· 45 51 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 46 52 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); 47 53 originalvalue = rtl_read_dword(rtlpriv, regaddr); 48 - bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); 54 + bitshift = calculate_bit_shift(bitmask); 49 55 returnvalue = (originalvalue & bitmask) >> bitshift; 50 56 51 57 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 68 74 69 75 if (bitmask != MASKDWORD) { 70 76 originalvalue = rtl_read_dword(rtlpriv, regaddr); 71 - bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); 77 + bitshift = calculate_bit_shift(bitmask); 72 78 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 73 79 } 74 80 ··· 93 99 94 100 95 101 original_value = _rtl88e_phy_rf_serial_read(hw, rfpath, regaddr); 96 - bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); 102 + bitshift = calculate_bit_shift(bitmask); 97 103 readback_value = (original_value & bitmask) >> bitshift; 98 104 99 105 spin_unlock(&rtlpriv->locks.rf_lock); ··· 121 127 original_value = _rtl88e_phy_rf_serial_read(hw, 122 128 rfpath, 123 129 regaddr); 124 - bitshift = _rtl88e_phy_calculate_bit_shift(bitmask); 130 + bitshift = calculate_bit_shift(bitmask); 125 131 data = 126 132 ((original_value & (~bitmask)) | 127 133 (data << bitshift));
+2 -10
drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.c
··· 17 17 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n", 18 18 regaddr, bitmask); 19 19 originalvalue = rtl_read_dword(rtlpriv, regaddr); 20 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 20 + bitshift = calculate_bit_shift(bitmask); 21 21 returnvalue = (originalvalue & bitmask) >> bitshift; 22 22 23 23 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 40 40 41 41 if (bitmask != MASKDWORD) { 42 42 originalvalue = rtl_read_dword(rtlpriv, regaddr); 43 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 43 + bitshift = calculate_bit_shift(bitmask); 44 44 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 45 45 } 46 46 ··· 142 142 data_and_addr); 143 143 } 144 144 EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write); 145 - 146 - u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask) 147 - { 148 - u32 i = ffs(bitmask); 149 - 150 - return i ? i - 1 : 32; 151 - } 152 - EXPORT_SYMBOL(_rtl92c_phy_calculate_bit_shift); 153 145 154 146 static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw) 155 147 {
-1
drivers/net/wireless/realtek/rtlwifi/rtl8192c/phy_common.h
··· 196 196 void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw); 197 197 void rtl92c_phy_set_io(struct ieee80211_hw *hw); 198 198 void rtl92c_bb_block_on(struct ieee80211_hw *hw); 199 - u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask); 200 199 long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 201 200 enum wireless_mode wirelessmode, 202 201 u8 txpwridx);
+3 -3
drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.c
··· 39 39 rfpath, regaddr); 40 40 } 41 41 42 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 42 + bitshift = calculate_bit_shift(bitmask); 43 43 readback_value = (original_value & bitmask) >> bitshift; 44 44 45 45 spin_unlock(&rtlpriv->locks.rf_lock); ··· 110 110 original_value = _rtl92c_phy_rf_serial_read(hw, 111 111 rfpath, 112 112 regaddr); 113 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 113 + bitshift = calculate_bit_shift(bitmask); 114 114 data = 115 115 ((original_value & (~bitmask)) | 116 116 (data << bitshift)); ··· 122 122 original_value = _rtl92c_phy_fw_rf_serial_read(hw, 123 123 rfpath, 124 124 regaddr); 125 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 125 + bitshift = calculate_bit_shift(bitmask); 126 126 data = 127 127 ((original_value & (~bitmask)) | 128 128 (data << bitshift));
-1
drivers/net/wireless/realtek/rtlwifi/rtl8192ce/phy.h
··· 94 94 u32 offset); 95 95 u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw, 96 96 enum radio_path rfpath, u32 offset); 97 - u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask); 98 97 void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw, 99 98 enum radio_path rfpath, u32 offset, u32 data); 100 99 void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
+3 -3
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/phy.c
··· 32 32 original_value = _rtl92c_phy_fw_rf_serial_read(hw, 33 33 rfpath, regaddr); 34 34 } 35 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 35 + bitshift = calculate_bit_shift(bitmask); 36 36 readback_value = (original_value & bitmask) >> bitshift; 37 37 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 38 38 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n", ··· 56 56 original_value = _rtl92c_phy_rf_serial_read(hw, 57 57 rfpath, 58 58 regaddr); 59 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 59 + bitshift = calculate_bit_shift(bitmask); 60 60 data = 61 61 ((original_value & (~bitmask)) | 62 62 (data << bitshift)); ··· 67 67 original_value = _rtl92c_phy_fw_rf_serial_read(hw, 68 68 rfpath, 69 69 regaddr); 70 - bitshift = _rtl92c_phy_calculate_bit_shift(bitmask); 70 + bitshift = calculate_bit_shift(bitmask); 71 71 data = 72 72 ((original_value & (~bitmask)) | 73 73 (data << bitshift));
+4 -11
drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
··· 169 169 157, 159, 161, 163, 165 170 170 }; 171 171 172 - static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask) 173 - { 174 - u32 i = ffs(bitmask); 175 - 176 - return i ? i - 1 : 32; 177 - } 178 - 179 172 u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 180 173 { 181 174 struct rtl_priv *rtlpriv = rtl_priv(hw); ··· 191 198 } else { 192 199 originalvalue = rtl_read_dword(rtlpriv, regaddr); 193 200 } 194 - bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); 201 + bitshift = calculate_bit_shift(bitmask); 195 202 returnvalue = (originalvalue & bitmask) >> bitshift; 196 203 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 197 204 "BBR MASK=0x%x Addr[0x%x]=0x%x\n", ··· 223 230 dbi_direct); 224 231 else 225 232 originalvalue = rtl_read_dword(rtlpriv, regaddr); 226 - bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); 233 + bitshift = calculate_bit_shift(bitmask); 227 234 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 228 235 } 229 236 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) ··· 310 317 regaddr, rfpath, bitmask); 311 318 spin_lock(&rtlpriv->locks.rf_lock); 312 319 original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr); 313 - bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); 320 + bitshift = calculate_bit_shift(bitmask); 314 321 readback_value = (original_value & bitmask) >> bitshift; 315 322 spin_unlock(&rtlpriv->locks.rf_lock); 316 323 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 336 343 if (bitmask != RFREG_OFFSET_MASK) { 337 344 original_value = _rtl92d_phy_rf_serial_read(hw, 338 345 rfpath, regaddr); 339 - bitshift = _rtl92d_phy_calculate_bit_shift(bitmask); 346 + bitshift = calculate_bit_shift(bitmask); 340 347 data = ((original_value & (~bitmask)) | 341 348 (data << bitshift)); 342 349 }
+4 -12
drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c
··· 16 16 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw, 17 17 enum radio_path rfpath, u32 offset, 18 18 u32 data); 19 - static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask); 20 19 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw); 21 20 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); 22 21 static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw, ··· 45 46 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 46 47 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); 47 48 originalvalue = rtl_read_dword(rtlpriv, regaddr); 48 - bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); 49 + bitshift = calculate_bit_shift(bitmask); 49 50 returnvalue = (originalvalue & bitmask) >> bitshift; 50 51 51 52 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 67 68 68 69 if (bitmask != MASKDWORD) { 69 70 originalvalue = rtl_read_dword(rtlpriv, regaddr); 70 - bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); 71 + bitshift = calculate_bit_shift(bitmask); 71 72 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 72 73 } 73 74 ··· 91 92 spin_lock(&rtlpriv->locks.rf_lock); 92 93 93 94 original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr); 94 - bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); 95 + bitshift = calculate_bit_shift(bitmask); 95 96 readback_value = (original_value & bitmask) >> bitshift; 96 97 97 98 spin_unlock(&rtlpriv->locks.rf_lock); ··· 118 119 119 120 if (bitmask != RFREG_OFFSET_MASK) { 120 121 original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr); 121 - bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask); 122 + bitshift = calculate_bit_shift(bitmask); 122 123 data = (original_value & (~bitmask)) | (data << bitshift); 123 124 } 124 125 ··· 198 199 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 199 200 "RFW-%d Addr[0x%x]=0x%x\n", rfpath, 200 201 pphyreg->rf3wire_offset, data_and_addr); 201 - } 202 - 203 - static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask) 204 - { 205 - u32 i = ffs(bitmask); 206 - 207 - return i ? i - 1 : 32; 208 202 } 209 203 210 204 bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
+4 -11
drivers/net/wireless/realtek/rtlwifi/rtl8192se/phy.c
··· 14 14 #include "hw.h" 15 15 #include "table.h" 16 16 17 - static u32 _rtl92s_phy_calculate_bit_shift(u32 bitmask) 18 - { 19 - u32 i = ffs(bitmask); 20 - 21 - return i ? i - 1 : 32; 22 - } 23 - 24 17 u32 rtl92s_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 25 18 { 26 19 struct rtl_priv *rtlpriv = rtl_priv(hw); ··· 23 30 regaddr, bitmask); 24 31 25 32 originalvalue = rtl_read_dword(rtlpriv, regaddr); 26 - bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); 33 + bitshift = calculate_bit_shift(bitmask); 27 34 returnvalue = (originalvalue & bitmask) >> bitshift; 28 35 29 36 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "BBR MASK=0x%x Addr[0x%x]=0x%x\n", ··· 45 52 46 53 if (bitmask != MASKDWORD) { 47 54 originalvalue = rtl_read_dword(rtlpriv, regaddr); 48 - bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); 55 + bitshift = calculate_bit_shift(bitmask); 49 56 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 50 57 } 51 58 ··· 150 157 151 158 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, regaddr); 152 159 153 - bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); 160 + bitshift = calculate_bit_shift(bitmask); 154 161 readback_value = (original_value & bitmask) >> bitshift; 155 162 156 163 spin_unlock(&rtlpriv->locks.rf_lock); ··· 181 188 if (bitmask != RFREG_OFFSET_MASK) { 182 189 original_value = _rtl92s_phy_rf_serial_read(hw, rfpath, 183 190 regaddr); 184 - bitshift = _rtl92s_phy_calculate_bit_shift(bitmask); 191 + bitshift = calculate_bit_shift(bitmask); 185 192 data = ((original_value & (~bitmask)) | (data << bitshift)); 186 193 } 187 194
+3 -3
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c
··· 49 49 rfpath, regaddr); 50 50 } 51 51 52 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 52 + bitshift = calculate_bit_shift(bitmask); 53 53 readback_value = (original_value & bitmask) >> bitshift; 54 54 55 55 spin_unlock(&rtlpriv->locks.rf_lock); ··· 80 80 original_value = rtl8723_phy_rf_serial_read(hw, 81 81 rfpath, 82 82 regaddr); 83 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 83 + bitshift = calculate_bit_shift(bitmask); 84 84 data = 85 85 ((original_value & (~bitmask)) | 86 86 (data << bitshift)); ··· 89 89 rtl8723_phy_rf_serial_write(hw, rfpath, regaddr, data); 90 90 } else { 91 91 if (bitmask != RFREG_OFFSET_MASK) { 92 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 92 + bitshift = calculate_bit_shift(bitmask); 93 93 data = 94 94 ((original_value & (~bitmask)) | 95 95 (data << bitshift));
+2 -2
drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c
··· 41 41 spin_lock(&rtlpriv->locks.rf_lock); 42 42 43 43 original_value = rtl8723_phy_rf_serial_read(hw, rfpath, regaddr); 44 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 44 + bitshift = calculate_bit_shift(bitmask); 45 45 readback_value = (original_value & bitmask) >> bitshift; 46 46 47 47 spin_unlock(&rtlpriv->locks.rf_lock); ··· 68 68 if (bitmask != RFREG_OFFSET_MASK) { 69 69 original_value = rtl8723_phy_rf_serial_read(hw, path, 70 70 regaddr); 71 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 71 + bitshift = calculate_bit_shift(bitmask); 72 72 data = ((original_value & (~bitmask)) | 73 73 (data << bitshift)); 74 74 }
+2 -10
drivers/net/wireless/realtek/rtlwifi/rtl8723com/phy_common.c
··· 17 17 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 18 18 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); 19 19 originalvalue = rtl_read_dword(rtlpriv, regaddr); 20 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 20 + bitshift = calculate_bit_shift(bitmask); 21 21 returnvalue = (originalvalue & bitmask) >> bitshift; 22 22 23 23 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 39 39 40 40 if (bitmask != MASKDWORD) { 41 41 originalvalue = rtl_read_dword(rtlpriv, regaddr); 42 - bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 42 + bitshift = calculate_bit_shift(bitmask); 43 43 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 44 44 } 45 45 ··· 50 50 regaddr, bitmask, data); 51 51 } 52 52 EXPORT_SYMBOL_GPL(rtl8723_phy_set_bb_reg); 53 - 54 - u32 rtl8723_phy_calculate_bit_shift(u32 bitmask) 55 - { 56 - u32 i = ffs(bitmask); 57 - 58 - return i ? i - 1 : 32; 59 - } 60 - EXPORT_SYMBOL_GPL(rtl8723_phy_calculate_bit_shift); 61 53 62 54 u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw, 63 55 enum radio_path rfpath, u32 offset)
-1
drivers/net/wireless/realtek/rtlwifi/rtl8723com/phy_common.h
··· 27 27 u32 regaddr, u32 bitmask); 28 28 void rtl8723_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, 29 29 u32 bitmask, u32 data); 30 - u32 rtl8723_phy_calculate_bit_shift(u32 bitmask); 31 30 u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw, 32 31 enum radio_path rfpath, u32 offset); 33 32 void rtl8723_phy_rf_serial_write(struct ieee80211_hw *hw,
+4 -11
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
··· 27 27 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw, 28 28 enum radio_path rfpath, u32 offset, 29 29 u32 data); 30 - static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask) 31 - { 32 - if (WARN_ON_ONCE(!bitmask)) 33 - return 0; 34 - 35 - return __ffs(bitmask); 36 - } 37 30 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw); 38 31 /*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/ 39 32 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); ··· 99 106 "regaddr(%#x), bitmask(%#x)\n", 100 107 regaddr, bitmask); 101 108 originalvalue = rtl_read_dword(rtlpriv, regaddr); 102 - bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 109 + bitshift = calculate_bit_shift(bitmask); 103 110 returnvalue = (originalvalue & bitmask) >> bitshift; 104 111 105 112 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, ··· 120 127 121 128 if (bitmask != MASKDWORD) { 122 129 originalvalue = rtl_read_dword(rtlpriv, regaddr); 123 - bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 130 + bitshift = calculate_bit_shift(bitmask); 124 131 data = ((originalvalue & (~bitmask)) | 125 132 ((data << bitshift) & bitmask)); 126 133 } ··· 146 153 spin_lock(&rtlpriv->locks.rf_lock); 147 154 148 155 original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr); 149 - bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 156 + bitshift = calculate_bit_shift(bitmask); 150 157 readback_value = (original_value & bitmask) >> bitshift; 151 158 152 159 spin_unlock(&rtlpriv->locks.rf_lock); ··· 174 181 if (bitmask != RFREG_OFFSET_MASK) { 175 182 original_value = 176 183 _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr); 177 - bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 184 + bitshift = calculate_bit_shift(bitmask); 178 185 data = ((original_value & (~bitmask)) | (data << bitshift)); 179 186 } 180 187
+7
drivers/net/wireless/realtek/rtlwifi/wifi.h
··· 3052 3052 return ieee80211_find_sta(mac->vif, mac_addr); 3053 3053 } 3054 3054 3055 + static inline u32 calculate_bit_shift(u32 bitmask) 3056 + { 3057 + if (WARN_ON_ONCE(!bitmask)) 3058 + return 0; 3059 + 3060 + return __ffs(bitmask); 3061 + } 3055 3062 #endif
+2 -2
drivers/net/wireless/realtek/rtw88/fw.c
··· 998 998 if (rsvd_pkt->type != RSVD_PROBE_REQ) 999 999 continue; 1000 1000 if ((!ssid && !rsvd_pkt->ssid) || 1001 - rtw_ssid_equal(rsvd_pkt->ssid, ssid)) 1001 + cfg80211_ssid_eq(rsvd_pkt->ssid, ssid)) 1002 1002 location = rsvd_pkt->page; 1003 1003 } 1004 1004 ··· 1015 1015 if (rsvd_pkt->type != RSVD_PROBE_REQ) 1016 1016 continue; 1017 1017 if ((!ssid && !rsvd_pkt->ssid) || 1018 - rtw_ssid_equal(rsvd_pkt->ssid, ssid)) 1018 + cfg80211_ssid_eq(rsvd_pkt->ssid, ssid)) 1019 1019 size = rsvd_pkt->probe_req_size; 1020 1020 } 1021 1021
-12
drivers/net/wireless/realtek/rtw88/main.h
··· 2090 2090 return container_of(p, struct ieee80211_vif, drv_priv); 2091 2091 } 2092 2092 2093 - static inline bool rtw_ssid_equal(struct cfg80211_ssid *a, 2094 - struct cfg80211_ssid *b) 2095 - { 2096 - if (!a || !b || a->ssid_len != b->ssid_len) 2097 - return false; 2098 - 2099 - if (memcmp(a->ssid, b->ssid, a->ssid_len)) 2100 - return false; 2101 - 2102 - return true; 2103 - } 2104 - 2105 2093 static inline void rtw_chip_efuse_grant_on(struct rtw_dev *rtwdev) 2106 2094 { 2107 2095 if (rtwdev->chip->ops->efuse_grant)
+496 -144
drivers/net/wireless/realtek/rtw89/coex.c
··· 6 6 #include "debug.h" 7 7 #include "fw.h" 8 8 #include "mac.h" 9 + #include "phy.h" 9 10 #include "ps.h" 10 11 #include "reg.h" 11 12 ··· 123 122 0xea55556a, /* 21 */ 124 123 0xaafafafa, /* 22 */ 125 124 0xfafaaafa, /* 23 */ 126 - 0xfafffaff /* 24 */ 125 + 0xfafffaff, /* 24 */ 126 + 0xea6a5a5a, /* 25 */ 127 127 }; 128 128 129 129 static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = { ··· 133 131 .fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5, 134 132 .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 2, .fcxgpiodbg = 1, 135 133 .fcxbtver = 1, .fcxbtscan = 2, .fcxbtafh = 2, .fcxbtdevinfo = 1, 136 - .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, 134 + .fwlrole = 2, .frptmap = 3, .fcxctrl = 1, 137 135 .info_buf = 1800, .max_role_num = 6, 138 136 }, 139 137 {RTL8852C, RTW89_FW_VER_CODE(0, 27, 57, 0), ··· 161 159 .fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5, 162 160 .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 2, .fcxgpiodbg = 1, 163 161 .fcxbtver = 1, .fcxbtscan = 2, .fcxbtafh = 2, .fcxbtdevinfo = 1, 164 - .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, 162 + .fwlrole = 2, .frptmap = 3, .fcxctrl = 1, 165 163 .info_buf = 1800, .max_role_num = 6, 166 164 }, 167 165 {RTL8852B, RTW89_FW_VER_CODE(0, 29, 14, 0), ··· 248 246 struct rtw89_btc_fbtc_mreg regs[] __counted_by(reg_num); 249 247 } __packed; 250 248 249 + struct _wl_rinfo_now { 250 + u8 link_mode; 251 + u32 dbcc_2g_phy: 2; 252 + }; 253 + 251 254 enum btc_btf_set_cx_policy { 252 255 CXPOLICY_TDMA = 0x0, 253 256 CXPOLICY_SLOT = 0x1, ··· 269 262 BTC_BSCB_RFK_RUN = BIT(5), 270 263 BTC_BSCB_RFK_REQ = BIT(6), 271 264 BTC_BSCB_LPS = BIT(7), 265 + BTC_BSCB_BT_LNAB0 = BIT(8), 266 + BTC_BSCB_BT_LNAB1 = BIT(10), 272 267 BTC_BSCB_WLRFK = BIT(11), 273 268 BTC_BSCB_BT_HILNA = BIT(13), 274 269 BTC_BSCB_BT_CONNECT = BIT(16), ··· 414 405 /* TDMA Fix slot-8: W1:B1 = user-define */ 415 406 BTC_CXP_FIX_TDW1B1 = (BTC_CXP_FIX << 8) | 8, 416 407 417 - /* TDMA Fix slot-9: W1:B1 = 40:20 */ 418 - BTC_CXP_FIX_TD4020 = (BTC_CXP_FIX << 8) | 9, 419 - 420 408 /* TDMA Fix slot-9: W1:B1 = 40:10 */ 421 - BTC_CXP_FIX_TD4010ISO = (BTC_CXP_FIX << 8) | 10, 409 + BTC_CXP_FIX_TD4010ISO = (BTC_CXP_FIX << 8) | 9, 410 + 411 + /* TDMA Fix slot-10: W1:B1 = 40:10 */ 412 + BTC_CXP_FIX_TD4010ISO_DL = (BTC_CXP_FIX << 8) | 10, 413 + 414 + /* TDMA Fix slot-11: W1:B1 = 40:10 */ 415 + BTC_CXP_FIX_TD4010ISO_UL = (BTC_CXP_FIX << 8) | 11, 422 416 423 417 /* PS-TDMA Fix slot-0: W1:B1 = 30:30 */ 424 418 BTC_CXP_PFIX_TD3030 = (BTC_CXP_PFIX << 8) | 0, ··· 722 710 723 711 if (type & BTC_RESET_CX) 724 712 memset(cx, 0, sizeof(*cx)); 725 - else if (type & BTC_RESET_BTINFO) /* only for BT enable */ 713 + 714 + if (type & BTC_RESET_BTINFO) /* only for BT enable */ 726 715 memset(bt, 0, sizeof(*bt)); 727 716 728 717 if (type & BTC_RESET_CTRL) { ··· 752 739 btc->dm.coex_info_map = BTC_COEX_INFO_ALL; 753 740 btc->dm.wl_tx_limit.tx_time = BTC_MAX_TX_TIME_DEF; 754 741 btc->dm.wl_tx_limit.tx_retry = BTC_MAX_TX_RETRY_DEF; 742 + btc->dm.wl_pre_agc_rb = BTC_PREAGC_NOTFOUND; 743 + btc->dm.wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_NOTFOUND; 755 744 } 756 745 757 746 if (type & BTC_RESET_MDINFO) 758 747 memset(&btc->mdinfo, 0, sizeof(btc->mdinfo)); 748 + } 749 + 750 + static u8 _search_reg_index(struct rtw89_dev *rtwdev, u8 mreg_num, u16 reg_type, u32 target) 751 + { 752 + const struct rtw89_chip_info *chip = rtwdev->chip; 753 + u8 i; 754 + 755 + for (i = 0; i < mreg_num; i++) 756 + if (le16_to_cpu(chip->mon_reg[i].type) == reg_type && 757 + le32_to_cpu(chip->mon_reg[i].offset) == target) { 758 + return i; 759 + } 760 + return BTC_REG_NOTFOUND; 761 + } 762 + 763 + static void _get_reg_status(struct rtw89_dev *rtwdev, u8 type, u8 *val) 764 + { 765 + struct rtw89_btc *btc = &rtwdev->btc; 766 + const struct rtw89_btc_ver *ver = btc->ver; 767 + struct rtw89_btc_module *md = &btc->mdinfo; 768 + union rtw89_btc_fbtc_mreg_val *pmreg; 769 + u32 pre_agc_addr = R_BTC_BB_PRE_AGC_S1; 770 + u32 reg_val; 771 + u8 idx; 772 + 773 + if (md->ant.btg_pos == RF_PATH_A) 774 + pre_agc_addr = R_BTC_BB_PRE_AGC_S0; 775 + 776 + switch (type) { 777 + case BTC_CSTATUS_TXDIV_POS: 778 + if (md->switch_type == BTC_SWITCH_INTERNAL) 779 + *val = BTC_ANT_DIV_MAIN; 780 + break; 781 + case BTC_CSTATUS_RXDIV_POS: 782 + if (md->switch_type == BTC_SWITCH_INTERNAL) 783 + *val = BTC_ANT_DIV_MAIN; 784 + break; 785 + case BTC_CSTATUS_BB_GNT_MUX: 786 + reg_val = rtw89_phy_read32(rtwdev, R_BTC_BB_BTG_RX); 787 + *val = !(reg_val & B_BTC_BB_GNT_MUX); 788 + break; 789 + case BTC_CSTATUS_BB_GNT_MUX_MON: 790 + if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) 791 + return; 792 + 793 + pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; 794 + if (ver->fcxmreg == 1) { 795 + idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, 796 + REG_BB, R_BTC_BB_BTG_RX); 797 + if (idx == BTC_REG_NOTFOUND) { 798 + *val = BTC_BTGCTRL_BB_GNT_NOTFOUND; 799 + } else { 800 + reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]); 801 + *val = !(reg_val & B_BTC_BB_GNT_MUX); 802 + } 803 + } else if (ver->fcxmreg == 2) { 804 + idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, 805 + REG_BB, R_BTC_BB_BTG_RX); 806 + if (idx == BTC_REG_NOTFOUND) { 807 + *val = BTC_BTGCTRL_BB_GNT_NOTFOUND; 808 + } else { 809 + reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]); 810 + *val = !(reg_val & B_BTC_BB_GNT_MUX); 811 + } 812 + } 813 + break; 814 + case BTC_CSTATUS_BB_PRE_AGC: 815 + reg_val = rtw89_phy_read32(rtwdev, pre_agc_addr); 816 + reg_val &= B_BTC_BB_PRE_AGC_MASK; 817 + *val = (reg_val == B_BTC_BB_PRE_AGC_VAL); 818 + break; 819 + case BTC_CSTATUS_BB_PRE_AGC_MON: 820 + if (!btc->fwinfo.rpt_fbtc_mregval.cinfo.valid) 821 + return; 822 + 823 + pmreg = &btc->fwinfo.rpt_fbtc_mregval.finfo; 824 + if (ver->fcxmreg == 1) { 825 + idx = _search_reg_index(rtwdev, pmreg->v1.reg_num, 826 + REG_BB, pre_agc_addr); 827 + if (idx == BTC_REG_NOTFOUND) { 828 + *val = BTC_PREAGC_NOTFOUND; 829 + } else { 830 + reg_val = le32_to_cpu(pmreg->v1.mreg_val[idx]) & 831 + B_BTC_BB_PRE_AGC_MASK; 832 + *val = (reg_val == B_BTC_BB_PRE_AGC_VAL); 833 + } 834 + } else if (ver->fcxmreg == 2) { 835 + idx = _search_reg_index(rtwdev, pmreg->v2.reg_num, 836 + REG_BB, pre_agc_addr); 837 + if (idx == BTC_REG_NOTFOUND) { 838 + *val = BTC_PREAGC_NOTFOUND; 839 + } else { 840 + reg_val = le32_to_cpu(pmreg->v2.mreg_val[idx]) & 841 + B_BTC_BB_PRE_AGC_MASK; 842 + *val = (reg_val == B_BTC_BB_PRE_AGC_VAL); 843 + } 844 + } 845 + break; 846 + default: 847 + break; 848 + } 759 849 } 760 850 761 851 #define BTC_RPT_HDR_SIZE 3 ··· 1119 1003 u16 wl_slot_set = 0, wl_slot_real = 0; 1120 1004 u32 trace_step = btc->ctrl.trace_step, rpt_len = 0, diff_t = 0; 1121 1005 u32 cnt_leak_slot, bt_slot_real, bt_slot_set, cnt_rx_imr; 1122 - u8 i; 1006 + u8 i, val = 0; 1123 1007 1124 1008 rtw89_debug(rtwdev, RTW89_DBG_BTC, 1125 1009 "[BTC], %s(): index:%d\n", ··· 1623 1507 } else { 1624 1508 goto err; 1625 1509 } 1510 + break; 1511 + case BTC_RPT_TYPE_MREG: 1512 + _get_reg_status(rtwdev, BTC_CSTATUS_BB_GNT_MUX_MON, &val); 1513 + if (dm->wl_btg_rx == BTC_BTGCTRL_BB_GNT_FWCTRL) 1514 + dm->wl_btg_rx_rb = BTC_BTGCTRL_BB_GNT_FWCTRL; 1515 + else 1516 + dm->wl_btg_rx_rb = val; 1517 + 1518 + _get_reg_status(rtwdev, BTC_CSTATUS_BB_PRE_AGC_MON, &val); 1519 + if (dm->wl_pre_agc == BTC_PREAGC_BB_FWCTRL) 1520 + dm->wl_pre_agc_rb = BTC_PREAGC_BB_FWCTRL; 1521 + else 1522 + dm->wl_pre_agc_rb = val; 1626 1523 break; 1627 1524 case BTC_RPT_TYPE_BT_VER: 1628 1525 case BTC_RPT_TYPE_BT_SCAN: ··· 2284 2155 struct rtw89_btc *btc = &rtwdev->btc; 2285 2156 struct rtw89_btc_bt_info *bt = &btc->cx.bt; 2286 2157 2287 - if (bt->rf_para.rx_gain_freerun == level || 2288 - level > BTC_BT_RX_NORMAL_LVL) 2158 + if ((bt->rf_para.rx_gain_freerun == level || 2159 + level > BTC_BT_RX_NORMAL_LVL) && 2160 + (!rtwdev->chip->scbd || bt->lna_constrain == level)) 2289 2161 return; 2290 2162 2291 2163 bt->rf_para.rx_gain_freerun = level; ··· 2301 2171 else 2302 2172 _write_scbd(rtwdev, BTC_WSCB_RXGAIN, true); 2303 2173 2304 - _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_LNA_CONSTRAIN, &level, 1); 2174 + _send_fw_cmd(rtwdev, BTFC_SET, SET_BT_LNA_CONSTRAIN, &level, sizeof(level)); 2305 2175 } 2306 2176 2307 2177 static void _set_rf_trx_para(struct rtw89_dev *rtwdev) 2308 2178 { 2309 2179 const struct rtw89_chip_info *chip = rtwdev->chip; 2310 2180 struct rtw89_btc *btc = &rtwdev->btc; 2181 + const struct rtw89_btc_ver *ver = btc->ver; 2311 2182 struct rtw89_btc_dm *dm = &btc->dm; 2312 2183 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 2313 2184 struct rtw89_btc_bt_info *bt = &btc->cx.bt; 2314 2185 struct rtw89_btc_bt_link_info *b = &bt->link_info; 2186 + struct rtw89_btc_wl_smap *wl_smap = &wl->status.map; 2315 2187 struct rtw89_btc_rf_trx_para para; 2316 2188 u32 wl_stb_chg = 0; 2317 - u8 level_id = 0; 2189 + u8 level_id = 0, link_mode = 0, i, dbcc_2g_phy = 0; 2318 2190 2319 - if (!dm->freerun) { 2320 - /* fix LNA2 = level-5 for BT ACI issue at BTG */ 2321 - if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) || 2322 - dm->bt_only == 1) 2323 - dm->trx_para_level = 1; 2324 - else 2325 - dm->trx_para_level = 0; 2191 + if (ver->fwlrole == 0) { 2192 + link_mode = wl->role_info.link_mode; 2193 + for (i = 0; i < RTW89_PHY_MAX; i++) { 2194 + if (wl->dbcc_info.real_band[i] == RTW89_BAND_2G) 2195 + dbcc_2g_phy = i; 2196 + } 2197 + } else if (ver->fwlrole == 1) { 2198 + link_mode = wl->role_info_v1.link_mode; 2199 + dbcc_2g_phy = wl->role_info_v1.dbcc_2g_phy; 2200 + } else if (ver->fwlrole == 2) { 2201 + link_mode = wl->role_info_v2.link_mode; 2202 + dbcc_2g_phy = wl->role_info_v2.dbcc_2g_phy; 2326 2203 } 2327 2204 2328 - level_id = (u8)dm->trx_para_level; 2205 + /* decide trx_para_level */ 2206 + if (btc->mdinfo.ant.type == BTC_ANT_SHARED) { 2207 + /* fix LNA2 + TIA gain not change by GNT_BT */ 2208 + if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) || 2209 + dm->bt_only == 1) 2210 + dm->trx_para_level = 1; /* for better BT ACI issue */ 2211 + else 2212 + dm->trx_para_level = 0; 2213 + } else { /* non-shared antenna */ 2214 + dm->trx_para_level = 5; 2215 + /* modify trx_para if WK 2.4G-STA-DL + bt link */ 2216 + if (b->profile_cnt.now != 0 && 2217 + link_mode == BTC_WLINK_2G_STA && 2218 + wl->status.map.traffic_dir & BIT(RTW89_TFC_UL)) { /* uplink */ 2219 + if (wl->rssi_level == 4 && bt->rssi_level > 2) 2220 + dm->trx_para_level = 6; 2221 + else if (wl->rssi_level == 3 && bt->rssi_level > 3) 2222 + dm->trx_para_level = 7; 2223 + } 2224 + } 2329 2225 2226 + level_id = dm->trx_para_level; 2330 2227 if (level_id >= chip->rf_para_dlink_num || 2331 2228 level_id >= chip->rf_para_ulink_num) { 2332 2229 rtw89_debug(rtwdev, RTW89_DBG_BTC, ··· 2367 2210 else 2368 2211 para = chip->rf_para_dlink[level_id]; 2369 2212 2370 - if (para.wl_tx_power != RTW89_BTC_WL_DEF_TX_PWR) 2371 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 2372 - "[BTC], %s(): wl_tx_power=%d\n", 2373 - __func__, para.wl_tx_power); 2374 - _set_wl_tx_power(rtwdev, para.wl_tx_power); 2375 - _set_wl_rx_gain(rtwdev, para.wl_rx_gain); 2376 - _set_bt_tx_power(rtwdev, para.bt_tx_power); 2377 - _set_bt_rx_gain(rtwdev, para.bt_rx_gain); 2213 + if (dm->fddt_train) { 2214 + _set_wl_rx_gain(rtwdev, 1); 2215 + _write_scbd(rtwdev, BTC_WSCB_RXGAIN, true); 2216 + } else { 2217 + _set_wl_tx_power(rtwdev, para.wl_tx_power); 2218 + _set_wl_rx_gain(rtwdev, para.wl_rx_gain); 2219 + _set_bt_tx_power(rtwdev, para.bt_tx_power); 2220 + _set_bt_rx_gain(rtwdev, para.bt_rx_gain); 2221 + } 2378 2222 2379 - if (bt->enable.now == 0 || wl->status.map.rf_off == 1 || 2380 - wl->status.map.lps == BTC_LPS_RF_OFF) 2223 + if (!bt->enable.now || dm->wl_only || wl_smap->rf_off || 2224 + wl_smap->lps == BTC_LPS_RF_OFF || 2225 + link_mode == BTC_WLINK_5G || 2226 + link_mode == BTC_WLINK_NOLINK || 2227 + (rtwdev->dbcc_en && dbcc_2g_phy != RTW89_PHY_1)) 2381 2228 wl_stb_chg = 0; 2382 2229 else 2383 2230 wl_stb_chg = 1; 2384 2231 2385 2232 if (wl_stb_chg != dm->wl_stb_chg) { 2386 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 2387 - "[BTC], %s(): wl_stb_chg=%d\n", 2388 - __func__, wl_stb_chg); 2389 2233 dm->wl_stb_chg = wl_stb_chg; 2390 2234 chip->ops->btc_wl_s1_standby(rtwdev, dm->wl_stb_chg); 2391 2235 } ··· 2819 2661 _slot_set(btc, CXST_W1, 40, tbl_w1, SLOT_ISO); 2820 2662 _slot_set(btc, CXST_B1, 10, tbl_b1, SLOT_MIX); 2821 2663 break; 2822 - case BTC_CXP_FIX_TD4020: 2823 - _slot_set(btc, CXST_W1, 40, cxtbl[1], SLOT_MIX); 2824 - _slot_set(btc, CXST_B1, 20, tbl_b1, SLOT_MIX); 2664 + case BTC_CXP_FIX_TD4010ISO: 2665 + _slot_set(btc, CXST_W1, 40, cxtbl[1], SLOT_ISO); 2666 + _slot_set(btc, CXST_B1, 10, tbl_b1, SLOT_MIX); 2667 + break; 2668 + case BTC_CXP_FIX_TD4010ISO_DL: 2669 + _slot_set(btc, CXST_W1, 40, cxtbl[25], SLOT_ISO); 2670 + _slot_set(btc, CXST_B1, 10, cxtbl[25], SLOT_ISO); 2671 + break; 2672 + case BTC_CXP_FIX_TD4010ISO_UL: 2673 + _slot_set(btc, CXST_W1, 40, cxtbl[20], SLOT_ISO); 2674 + _slot_set(btc, CXST_B1, 10, cxtbl[25], SLOT_MIX); 2825 2675 break; 2826 2676 case BTC_CXP_FIX_TD7010: 2827 2677 _slot_set(btc, CXST_W1, 70, tbl_w1, SLOT_ISO); ··· 3168 3002 _slot_set(btc, CXST_W1, 40, cxtbl[1], SLOT_ISO); 3169 3003 _slot_set(btc, CXST_B1, 10, tbl_b1, SLOT_MIX); 3170 3004 break; 3171 - case BTC_CXP_FIX_TD4020: 3172 - _slot_set(btc, CXST_W1, 40, cxtbl[1], SLOT_MIX); 3173 - _slot_set(btc, CXST_B1, 20, tbl_b1, SLOT_MIX); 3005 + case BTC_CXP_FIX_TD4010ISO_DL: 3006 + _slot_set(btc, CXST_W1, 40, cxtbl[25], SLOT_ISO); 3007 + _slot_set(btc, CXST_B1, 10, cxtbl[25], SLOT_ISO); 3008 + break; 3009 + case BTC_CXP_FIX_TD4010ISO_UL: 3010 + _slot_set(btc, CXST_W1, 40, cxtbl[20], SLOT_ISO); 3011 + _slot_set(btc, CXST_B1, 10, cxtbl[25], SLOT_MIX); 3174 3012 break; 3175 3013 case BTC_CXP_FIX_TD7010: 3176 3014 _slot_set(btc, CXST_W1, 70, tbl_w1, SLOT_ISO); ··· 3551 3381 _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_WL_INIT); 3552 3382 } 3553 3383 3554 - static void _action_wl_off(struct rtw89_dev *rtwdev) 3384 + static void _action_wl_off(struct rtw89_dev *rtwdev, u8 mode) 3555 3385 { 3556 3386 struct rtw89_btc *btc = &rtwdev->btc; 3557 3387 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3558 3388 3559 3389 rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s(): !!\n", __func__); 3560 3390 3561 - if (wl->status.map.rf_off || btc->dm.bt_only) 3391 + if (wl->status.map.rf_off || btc->dm.bt_only) { 3562 3392 _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_WOFF); 3393 + } else if (wl->status.map.lps == BTC_LPS_RF_ON) { 3394 + if (wl->role_info.link_mode == BTC_WLINK_5G) 3395 + _set_ant(rtwdev, FC_EXEC, BTC_PHY_ALL, BTC_ANT_W5G); 3396 + else 3397 + _set_ant(rtwdev, FC_EXEC, BTC_PHY_ALL, BTC_ANT_W2G); 3398 + } 3563 3399 3564 - _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_WL_OFF); 3400 + if (mode == BTC_WLINK_5G) { 3401 + _set_policy(rtwdev, BTC_CXP_OFF_EQ0, BTC_ACT_WL_OFF); 3402 + } else if (wl->status.map.lps == BTC_LPS_RF_ON) { 3403 + if (btc->cx.bt.link_info.a2dp_desc.active) 3404 + _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_WL_OFF); 3405 + else 3406 + _set_policy(rtwdev, BTC_CXP_OFF_BWB1, BTC_ACT_WL_OFF); 3407 + } else { 3408 + _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_WL_OFF); 3409 + } 3565 3410 } 3566 3411 3567 3412 static void _action_freerun(struct rtw89_dev *rtwdev) ··· 3611 3426 { 3612 3427 struct rtw89_btc *btc = &rtwdev->btc; 3613 3428 struct rtw89_btc_bt_link_info *b = &btc->cx.bt.link_info; 3429 + struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3614 3430 3615 3431 _set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W2G); 3616 3432 3617 3433 if (btc->mdinfo.ant.type == BTC_ANT_SHARED) { /* shared-antenna */ 3618 3434 switch (btc->cx.state_map) { 3619 3435 case BTC_WBUSY_BNOSCAN: /*wl-busy + bt idle*/ 3620 - if (b->profile_cnt.now > 0) 3621 - _set_policy(rtwdev, BTC_CXP_FIX_TD4010, 3622 - BTC_ACT_BT_IDLE); 3436 + case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-idle */ 3437 + if (b->status.map.connect) 3438 + _set_policy(rtwdev, BTC_CXP_FIX_TD4010, BTC_ACT_BT_IDLE); 3439 + else if (wl->status.map.traffic_dir & BIT(RTW89_TFC_DL)) 3440 + _set_policy(rtwdev, BTC_CXP_FIX_TD4010ISO_DL, BTC_ACT_BT_IDLE); 3623 3441 else 3624 - _set_policy(rtwdev, BTC_CXP_FIX_TD4020, 3625 - BTC_ACT_BT_IDLE); 3442 + _set_policy(rtwdev, BTC_CXP_FIX_TD4010ISO_UL, BTC_ACT_BT_IDLE); 3626 3443 break; 3627 3444 case BTC_WBUSY_BSCAN: /*wl-busy + bt-inq */ 3628 3445 _set_policy(rtwdev, BTC_CXP_PFIX_TD5050, 3629 3446 BTC_ACT_BT_IDLE); 3630 - break; 3631 - case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-idle */ 3632 - if (b->profile_cnt.now > 0) 3633 - _set_policy(rtwdev, BTC_CXP_FIX_TD4010, 3634 - BTC_ACT_BT_IDLE); 3635 - else 3636 - _set_policy(rtwdev, BTC_CXP_FIX_TD4020, 3637 - BTC_ACT_BT_IDLE); 3638 3447 break; 3639 3448 case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq */ 3640 3449 _set_policy(rtwdev, BTC_CXP_FIX_TD5050, ··· 3796 3617 _set_policy(rtwdev, BTC_CXP_FIX_TD3060, BTC_ACT_BT_PAN); 3797 3618 break; 3798 3619 case BTC_WLINKING: /* wl-connecting + bt-PAN */ 3799 - _set_policy(rtwdev, BTC_CXP_FIX_TD4020, BTC_ACT_BT_PAN); 3620 + _set_policy(rtwdev, BTC_CXP_FIX_TD4010ISO, BTC_ACT_BT_PAN); 3800 3621 break; 3801 3622 case BTC_WIDLE: /* wl-idle + bt-pan */ 3802 3623 _set_policy(rtwdev, BTC_CXP_PFIX_TD2080, BTC_ACT_BT_PAN); ··· 3977 3798 static void _set_btg_ctrl(struct rtw89_dev *rtwdev) 3978 3799 { 3979 3800 struct rtw89_btc *btc = &rtwdev->btc; 3980 - const struct rtw89_btc_ver *ver = btc->ver; 3981 3801 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3982 - struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; 3983 3802 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; 3984 3803 struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2; 3804 + struct rtw89_btc_wl_role_info *wl_rinfo_v0 = &wl->role_info; 3985 3805 struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info; 3986 - bool is_btg; 3987 - u8 mode; 3806 + const struct rtw89_chip_info *chip = rtwdev->chip; 3807 + const struct rtw89_btc_ver *ver = btc->ver; 3808 + struct rtw89_btc_bt_info *bt = &btc->cx.bt; 3809 + struct rtw89_btc_dm *dm = &btc->dm; 3810 + struct _wl_rinfo_now wl_rinfo; 3811 + u32 run_reason = btc->dm.run_reason; 3812 + u32 is_btg; 3813 + u8 i, val; 3988 3814 3989 3815 if (btc->ctrl.manual) 3990 3816 return; 3991 3817 3992 3818 if (ver->fwlrole == 0) 3993 - mode = wl_rinfo->link_mode; 3819 + wl_rinfo.link_mode = wl_rinfo_v0->link_mode; 3994 3820 else if (ver->fwlrole == 1) 3995 - mode = wl_rinfo_v1->link_mode; 3821 + wl_rinfo.link_mode = wl_rinfo_v1->link_mode; 3996 3822 else if (ver->fwlrole == 2) 3997 - mode = wl_rinfo_v2->link_mode; 3823 + wl_rinfo.link_mode = wl_rinfo_v2->link_mode; 3998 3824 else 3999 3825 return; 4000 3826 4001 - /* notify halbb ignore GNT_BT or not for WL BB Rx-AGC control */ 4002 - if (mode == BTC_WLINK_5G) /* always 0 if 5G */ 4003 - is_btg = false; 4004 - else if (mode == BTC_WLINK_25G_DBCC && 4005 - wl_dinfo->real_band[RTW89_PHY_1] != RTW89_BAND_2G) 4006 - is_btg = false; 3827 + if (rtwdev->dbcc_en) { 3828 + if (ver->fwlrole == 0) { 3829 + for (i = 0; i < RTW89_PHY_MAX; i++) { 3830 + if (wl_dinfo->real_band[i] == RTW89_BAND_2G) 3831 + wl_rinfo.dbcc_2g_phy = i; 3832 + } 3833 + } else if (ver->fwlrole == 1) { 3834 + wl_rinfo.dbcc_2g_phy = wl_rinfo_v1->dbcc_2g_phy; 3835 + } else if (ver->fwlrole == 2) { 3836 + wl_rinfo.dbcc_2g_phy = wl_rinfo_v2->dbcc_2g_phy; 3837 + } else { 3838 + return; 3839 + } 3840 + } 3841 + 3842 + if (wl_rinfo.link_mode == BTC_WLINK_25G_MCC) 3843 + is_btg = BTC_BTGCTRL_BB_GNT_FWCTRL; 3844 + else if (!(bt->run_patch_code && bt->enable.now)) 3845 + is_btg = BTC_BTGCTRL_DISABLE; 3846 + else if (wl_rinfo.link_mode == BTC_WLINK_5G) 3847 + is_btg = BTC_BTGCTRL_DISABLE; 3848 + else if (dm->freerun) 3849 + is_btg = BTC_BTGCTRL_DISABLE; 3850 + else if (rtwdev->dbcc_en && wl_rinfo.dbcc_2g_phy != RTW89_PHY_1) 3851 + is_btg = BTC_BTGCTRL_DISABLE; 4007 3852 else 4008 - is_btg = true; 3853 + is_btg = BTC_BTGCTRL_ENABLE; 4009 3854 4010 - if (btc->dm.run_reason != BTC_RSN_NTFY_INIT && 4011 - is_btg == btc->dm.wl_btg_rx) 3855 + if (dm->wl_btg_rx_rb != dm->wl_btg_rx && 3856 + dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) { 3857 + _get_reg_status(rtwdev, BTC_CSTATUS_BB_GNT_MUX, &val); 3858 + dm->wl_btg_rx_rb = val; 3859 + } 3860 + 3861 + if (run_reason == BTC_RSN_NTFY_INIT || 3862 + run_reason == BTC_RSN_NTFY_SWBAND || 3863 + dm->wl_btg_rx_rb != dm->wl_btg_rx || 3864 + is_btg != dm->wl_btg_rx) { 3865 + 3866 + dm->wl_btg_rx = is_btg; 3867 + 3868 + if (is_btg > BTC_BTGCTRL_ENABLE) 3869 + return; 3870 + 3871 + chip->ops->ctrl_btg_bt_rx(rtwdev, is_btg, RTW89_PHY_0); 3872 + } 3873 + } 3874 + 3875 + static void _set_wl_preagc_ctrl(struct rtw89_dev *rtwdev) 3876 + { 3877 + struct rtw89_btc *btc = &rtwdev->btc; 3878 + struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info; 3879 + struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3880 + struct rtw89_btc_wl_role_info_v2 *wl_rinfo = &wl->role_info_v2; 3881 + const struct rtw89_chip_info *chip = rtwdev->chip; 3882 + const struct rtw89_btc_ver *ver = btc->ver; 3883 + struct rtw89_btc_bt_info *bt = &btc->cx.bt; 3884 + struct rtw89_btc_dm *dm = &btc->dm; 3885 + u8 is_preagc, val; 3886 + 3887 + if (btc->ctrl.manual) 4012 3888 return; 4013 3889 4014 - btc->dm.wl_btg_rx = is_btg; 3890 + if (wl_rinfo->link_mode == BTC_WLINK_25G_MCC) 3891 + is_preagc = BTC_PREAGC_BB_FWCTRL; 3892 + else if (!(bt->run_patch_code && bt->enable.now)) 3893 + is_preagc = BTC_PREAGC_DISABLE; 3894 + else if (wl_rinfo->link_mode == BTC_WLINK_5G) 3895 + is_preagc = BTC_PREAGC_DISABLE; 3896 + else if (wl_rinfo->link_mode == BTC_WLINK_NOLINK || 3897 + btc->cx.bt.link_info.profile_cnt.now == 0) 3898 + is_preagc = BTC_PREAGC_DISABLE; 3899 + else if (dm->tdma_now.type != CXTDMA_OFF && 3900 + !bt_linfo->hfp_desc.exist && 3901 + !bt_linfo->hid_desc.exist && 3902 + dm->fddt_train == BTC_FDDT_DISABLE) 3903 + is_preagc = BTC_PREAGC_DISABLE; 3904 + else if (ver->fwlrole == 2 && wl_rinfo->dbcc_en && 3905 + wl_rinfo->dbcc_2g_phy != RTW89_PHY_1) 3906 + is_preagc = BTC_PREAGC_DISABLE; 3907 + else if (btc->mdinfo.ant.type == BTC_ANT_SHARED) 3908 + is_preagc = BTC_PREAGC_DISABLE; 3909 + else 3910 + is_preagc = BTC_PREAGC_ENABLE; 4015 3911 4016 - if (mode == BTC_WLINK_25G_MCC) 4017 - return; 3912 + if (dm->wl_pre_agc_rb != dm->wl_pre_agc && 3913 + dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND) { 3914 + _get_reg_status(rtwdev, BTC_CSTATUS_BB_PRE_AGC, &val); 3915 + dm->wl_pre_agc_rb = val; 3916 + } 4018 3917 4019 - rtw89_ctrl_btg_bt_rx(rtwdev, is_btg, RTW89_PHY_0); 3918 + if ((wl->coex_mode == BTC_MODE_NORMAL && 3919 + (dm->run_reason == BTC_RSN_NTFY_INIT || 3920 + dm->run_reason == BTC_RSN_NTFY_SWBAND || 3921 + dm->wl_pre_agc_rb != dm->wl_pre_agc)) || 3922 + is_preagc != dm->wl_pre_agc) { 3923 + dm->wl_pre_agc = is_preagc; 3924 + 3925 + if (is_preagc > BTC_PREAGC_ENABLE) 3926 + return; 3927 + chip->ops->ctrl_nbtg_bt_tx(rtwdev, dm->wl_pre_agc, RTW89_PHY_0); 3928 + } 4020 3929 } 4021 3930 4022 3931 struct rtw89_txtime_data { ··· 4291 4024 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 4292 4025 4293 4026 _set_btg_ctrl(rtwdev); 4027 + _set_wl_preagc_ctrl(rtwdev); 4294 4028 _set_wl_tx_limit(rtwdev); 4295 4029 _set_bt_afh_info(rtwdev); 4296 4030 _set_bt_rx_agc(rtwdev); ··· 5276 5008 return; 5277 5009 } 5278 5010 5279 - if (!(val & BTC_BSCB_ON) || 5280 - btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] >= BTC_CHK_HANG_MAX) 5011 + if (!(val & BTC_BSCB_ON)) 5281 5012 bt->enable.now = 0; 5282 5013 else 5283 5014 bt->enable.now = 1; ··· 5301 5034 bt->whql_test = !!(val & BTC_BSCB_WHQL); 5302 5035 bt->btg_type = val & BTC_BSCB_BT_S1 ? BTC_BT_BTG : BTC_BT_ALONE; 5303 5036 bt->link_info.a2dp_desc.exist = !!(val & BTC_BSCB_A2DP_ACT); 5037 + 5038 + bt->lna_constrain = !!(val & BTC_BSCB_BT_LNAB0) + 5039 + !!(val & BTC_BSCB_BT_LNAB1) * 2 + 4; 5304 5040 5305 5041 /* if rfk run 1->0 */ 5306 5042 if (bt->rfk_info.map.run && !(val & BTC_BSCB_RFK_RUN)) ··· 5398 5128 } 5399 5129 5400 5130 if (wl->status.map.rf_off_pre == wl->status.map.rf_off && 5401 - wl->status.map.lps_pre == wl->status.map.lps && 5402 - (reason == BTC_RSN_NTFY_POWEROFF || 5403 - reason == BTC_RSN_NTFY_RADIO_STATE)) { 5404 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 5405 - "[BTC], %s(): return for WL rf off state no change!!\n", 5406 - __func__); 5407 - return; 5131 + wl->status.map.lps_pre == wl->status.map.lps) { 5132 + if (reason == BTC_RSN_NTFY_POWEROFF || 5133 + reason == BTC_RSN_NTFY_RADIO_STATE) { 5134 + rtw89_debug(rtwdev, RTW89_DBG_BTC, 5135 + "[BTC], %s(): return for WL rf off state no change!!\n", 5136 + __func__); 5137 + return; 5138 + } 5139 + if (wl->status.map.rf_off == 1 || 5140 + wl->status.map.lps == BTC_LPS_RF_OFF) { 5141 + rtw89_debug(rtwdev, RTW89_DBG_BTC, 5142 + "[BTC], %s(): return for WL rf off state!!\n", 5143 + __func__); 5144 + return; 5145 + } 5408 5146 } 5409 5147 5148 + dm->freerun = false; 5410 5149 dm->cnt_dm[BTC_DCNT_RUN]++; 5411 5150 dm->fddt_train = BTC_FDDT_DISABLE; 5151 + btc->ctrl.igno_bt = false; 5152 + bt->scan_rx_low_pri = false; 5412 5153 5413 5154 if (btc->ctrl.always_freerun) { 5414 5155 _action_freerun(rtwdev); ··· 5434 5153 } 5435 5154 5436 5155 if (wl->status.map.rf_off || wl->status.map.lps || dm->bt_only) { 5437 - _action_wl_off(rtwdev); 5156 + _action_wl_off(rtwdev, mode); 5438 5157 btc->ctrl.igno_bt = true; 5439 5158 goto exit; 5440 5159 } 5441 - 5442 - btc->ctrl.igno_bt = false; 5443 - dm->freerun = false; 5444 - bt->scan_rx_low_pri = false; 5445 5160 5446 5161 if (reason == BTC_RSN_NTFY_INIT) { 5447 5162 _action_wl_init(rtwdev); ··· 5463 5186 if (mode == BTC_WLINK_NOLINK || mode == BTC_WLINK_2G_STA || 5464 5187 mode == BTC_WLINK_5G) { 5465 5188 _action_wl_scan(rtwdev); 5189 + bt->scan_rx_low_pri = false; 5466 5190 goto exit; 5467 5191 } 5468 5192 } 5469 5193 5470 5194 if (wl->status.map.scan) { 5471 5195 _action_wl_scan(rtwdev); 5196 + bt->scan_rx_low_pri = false; 5472 5197 goto exit; 5473 5198 } 5474 5199 ··· 5587 5308 rtw89_debug(rtwdev, RTW89_DBG_BTC, 5588 5309 "[BTC], %s(): mode=%d\n", __func__, mode); 5589 5310 5311 + wl->coex_mode = mode; 5590 5312 dm->cnt_notify[BTC_NCNT_INIT_COEX]++; 5591 5313 dm->wl_only = mode == BTC_MODE_WL ? 1 : 0; 5592 5314 dm->bt_only = mode == BTC_MODE_BT ? 1 : 0; ··· 5805 5525 mutex_unlock(&rtwdev->mutex); 5806 5526 } 5807 5527 5528 + static u8 _update_bt_rssi_level(struct rtw89_dev *rtwdev, u8 rssi) 5529 + { 5530 + const struct rtw89_chip_info *chip = rtwdev->chip; 5531 + struct rtw89_btc *btc = &rtwdev->btc; 5532 + struct rtw89_btc_bt_info *bt = &btc->cx.bt; 5533 + u8 *rssi_st, rssi_th, rssi_level = 0; 5534 + u8 i; 5535 + 5536 + /* for rssi locate in which {40, 36, 31, 28} 5537 + * if rssi >= 40% (-60dBm) --> rssi_level = 4 5538 + * if 36% <= rssi < 40% --> rssi_level = 3 5539 + * if 31% <= rssi < 36% --> rssi_level = 2 5540 + * if 28% <= rssi < 31% --> rssi_level = 1 5541 + * if rssi < 28% --> rssi_level = 0 5542 + */ 5543 + 5544 + /* check if rssi across bt_rssi_thres boundary */ 5545 + for (i = 0; i < BTC_BT_RSSI_THMAX; i++) { 5546 + rssi_th = chip->bt_rssi_thres[i]; 5547 + rssi_st = &bt->link_info.rssi_state[i]; 5548 + 5549 + *rssi_st = _update_rssi_state(rtwdev, *rssi_st, rssi, rssi_th); 5550 + 5551 + if (BTC_RSSI_HIGH(*rssi_st)) { 5552 + rssi_level = BTC_BT_RSSI_THMAX - i; 5553 + break; 5554 + } 5555 + } 5556 + return rssi_level; 5557 + } 5558 + 5808 5559 #define BT_PROFILE_PROTOCOL_MASK GENMASK(7, 4) 5809 5560 5810 5561 static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len) ··· 5911 5600 btinfo.val = bt->raw_info[BTC_BTINFO_H0]; 5912 5601 /* raw val is dBm unit, translate from -100~ 0dBm to 0~100%*/ 5913 5602 b->rssi = chip->ops->btc_get_bt_rssi(rtwdev, btinfo.hb0.rssi); 5914 - btc->dm.trx_info.bt_rssi = b->rssi; 5603 + bt->rssi_level = _update_bt_rssi_level(rtwdev, b->rssi); 5604 + btc->dm.trx_info.bt_rssi = bt->rssi_level; 5915 5605 5916 5606 /* parse raw info high-Byte1 */ 5917 5607 btinfo.val = bt->raw_info[BTC_BTINFO_H1]; ··· 6116 5804 chip->ops->btc_init_cfg(rtwdev); 6117 5805 } else { 6118 5806 rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_ALL, false); 6119 - if (rf_state == BTC_RFCTRL_WL_OFF) 5807 + if (rf_state == BTC_RFCTRL_FW_CTRL) 5808 + _write_scbd(rtwdev, BTC_WSCB_ACTIVE, false); 5809 + else if (rf_state == BTC_RFCTRL_WL_OFF) 6120 5810 _write_scbd(rtwdev, BTC_WSCB_ALL, false); 6121 - else if (rf_state == BTC_RFCTRL_LPS_WL_ON && 6122 - wl->status.map.lps_pre != BTC_LPS_OFF) 5811 + else 5812 + _write_scbd(rtwdev, BTC_WSCB_ACTIVE, false); 5813 + 5814 + if (rf_state == BTC_RFCTRL_LPS_WL_ON && 5815 + wl->status.map.lps_pre != BTC_LPS_OFF) 6123 5816 _update_bt_scbd(rtwdev, true); 6124 5817 } 6125 5818 6126 5819 btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] = 0; 6127 - if (wl->status.map.lps_pre == BTC_LPS_OFF && 6128 - wl->status.map.lps_pre != wl->status.map.lps) 6129 - btc->dm.tdma_instant_excute = 1; 6130 - else 6131 - btc->dm.tdma_instant_excute = 0; 5820 + btc->dm.tdma_instant_excute = 1; 6132 5821 6133 5822 _run_coex(rtwdev, BTC_RSN_NTFY_RADIO_STATE); 6134 - btc->dm.tdma_instant_excute = 0; 6135 5823 wl->status.map.rf_off_pre = wl->status.map.rf_off; 6136 5824 wl->status.map.lps_pre = wl->status.map.lps; 6137 5825 } ··· 6369 6057 6370 6058 dm->trx_info.tx_tp = link_info_t->tx_throughput; 6371 6059 dm->trx_info.rx_tp = link_info_t->rx_throughput; 6060 + 6061 + /* Trigger coex-run if 0x10980 reg-value is diff with coex setup */ 6062 + if ((dm->wl_btg_rx_rb != dm->wl_btg_rx && 6063 + dm->wl_btg_rx_rb != BTC_BTGCTRL_BB_GNT_NOTFOUND) || 6064 + (dm->wl_pre_agc_rb != dm->wl_pre_agc && 6065 + dm->wl_pre_agc_rb != BTC_PREAGC_NOTFOUND)) 6066 + iter_data->is_sta_change = true; 6372 6067 6373 6068 if (is_sta_change) 6374 6069 iter_data->is_sta_change = true; ··· 6762 6443 bt_linfo->pan_desc.active ? "Y" : "N"); 6763 6444 6764 6445 seq_printf(m, 6765 - " %-15s : rssi:%ddBm, tx_rate:%dM, %s%s%s", 6446 + " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s", 6766 6447 "[link]", bt_linfo->rssi - 100, 6448 + bt->rssi_level, 6767 6449 bt_linfo->tx_3m ? 3 : 2, 6768 6450 bt_linfo->status.map.inq_pag ? " inq-page!!" : "", 6769 6451 bt_linfo->status.map.acl_busy ? " acl_busy!!" : "", ··· 6873 6553 case BTC_CXP_ ## e | BTC_POLICY_EXT_BIT: return #e 6874 6554 #define CASE_BTC_SLOT_STR(e) case CXST_ ## e: return #e 6875 6555 #define CASE_BTC_EVT_STR(e) case CXEVNT_## e: return #e 6556 + #define CASE_BTC_INIT(e) case BTC_MODE_## e: return #e 6557 + #define CASE_BTC_ANTPATH_STR(e) case BTC_ANT_##e: return #e 6876 6558 6877 6559 static const char *steps_to_str(u16 step) 6878 6560 { ··· 6955 6633 CASE_BTC_POLICY_STR(FIX_TD3060); 6956 6634 CASE_BTC_POLICY_STR(FIX_TD2080); 6957 6635 CASE_BTC_POLICY_STR(FIX_TDW1B1); 6958 - CASE_BTC_POLICY_STR(FIX_TD4020); 6959 6636 CASE_BTC_POLICY_STR(FIX_TD4010ISO); 6637 + CASE_BTC_POLICY_STR(FIX_TD4010ISO_DL); 6638 + CASE_BTC_POLICY_STR(FIX_TD4010ISO_UL); 6960 6639 CASE_BTC_POLICY_STR(PFIX_TD3030); 6961 6640 CASE_BTC_POLICY_STR(PFIX_TD5050); 6962 6641 CASE_BTC_POLICY_STR(PFIX_TD2030); ··· 7050 6727 } 7051 6728 } 7052 6729 6730 + static const char *id_to_mode(u8 id) 6731 + { 6732 + switch (id) { 6733 + CASE_BTC_INIT(NORMAL); 6734 + CASE_BTC_INIT(WL); 6735 + CASE_BTC_INIT(BT); 6736 + CASE_BTC_INIT(WLOFF); 6737 + default: 6738 + return "unknown"; 6739 + } 6740 + } 6741 + 6742 + static const char *id_to_ant(u32 id) 6743 + { 6744 + switch (id) { 6745 + CASE_BTC_ANTPATH_STR(WPOWERON); 6746 + CASE_BTC_ANTPATH_STR(WINIT); 6747 + CASE_BTC_ANTPATH_STR(WONLY); 6748 + CASE_BTC_ANTPATH_STR(WOFF); 6749 + CASE_BTC_ANTPATH_STR(W2G); 6750 + CASE_BTC_ANTPATH_STR(W5G); 6751 + CASE_BTC_ANTPATH_STR(W25G); 6752 + CASE_BTC_ANTPATH_STR(FREERUN); 6753 + CASE_BTC_ANTPATH_STR(WRFK); 6754 + CASE_BTC_ANTPATH_STR(BRFK); 6755 + CASE_BTC_ANTPATH_STR(MAX); 6756 + default: 6757 + return "unknown"; 6758 + } 6759 + } 6760 + 7053 6761 static 7054 6762 void seq_print_segment(struct seq_file *m, const char *prefix, u16 *data, 7055 6763 u8 len, u8 seg_len, u8 start_idx, u8 ring_len) ··· 7135 6781 (btc->ctrl.manual ? "(Manual)" : "(Auto)")); 7136 6782 7137 6783 seq_printf(m, 7138 - " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%ld, run_cnt:%d\n", 6784 + " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n", 7139 6785 "[status]", 7140 6786 module->ant.type == BTC_ANT_SHARED ? "shared" : "dedicated", 7141 6787 steps_to_str(dm->run_reason), 7142 6788 steps_to_str(dm->run_action | BTC_ACT_EXT_BIT), 7143 - FIELD_GET(GENMASK(7, 0), dm->set_ant_path), 6789 + id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)), 6790 + id_to_mode(wl->coex_mode), 7144 6791 dm->cnt_dm[BTC_DCNT_RUN]); 7145 6792 7146 6793 _show_dm_step(rtwdev, m); ··· 8044 7689 struct rtw89_mac_ax_gnt *gnt; 8045 7690 u32 val, status; 8046 7691 8047 - if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B) { 7692 + if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || 7693 + chip->chip_id == RTL8851B) { 8048 7694 rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_1, &val); 8049 7695 rtw89_mac_read_lte(rtwdev, R_AX_GNT_VAL, &status); 8050 7696 ··· 8107 7751 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], 8108 7752 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); 8109 7753 8110 - /* To avoid I/O if WL LPS or power-off */ 8111 - if (!wl->status.map.lps && !wl->status.map.rf_off) { 8112 - btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7754 + btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7755 + _get_gnt(rtwdev, &gnt_cfg); 8113 7756 8114 - _get_gnt(rtwdev, &gnt_cfg); 8115 - gnt = gnt_cfg.band[0]; 8116 - seq_printf(m, 8117 - " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", 8118 - "[gnt_status]", 8119 - chip->chip_id == RTL8852C ? "HW" : 8120 - btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", 8121 - gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl, 8122 - gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt); 7757 + gnt = gnt_cfg.band[0]; 7758 + seq_printf(m, 7759 + " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", 7760 + "[gnt_status]", 7761 + chip->chip_id == RTL8852C ? "HW" : 7762 + btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", 7763 + gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl, 7764 + gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt); 8123 7765 8124 - gnt = gnt_cfg.band[1]; 8125 - seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", 8126 - gnt.gnt_wl_sw_en ? "SW" : "HW", 8127 - gnt.gnt_wl, 8128 - gnt.gnt_bt_sw_en ? "SW" : "HW", 8129 - gnt.gnt_bt); 8130 - } 7766 + gnt = gnt_cfg.band[1]; 7767 + seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", 7768 + gnt.gnt_wl_sw_en ? "SW" : "HW", 7769 + gnt.gnt_wl, 7770 + gnt.gnt_bt_sw_en ? "SW" : "HW", 7771 + gnt.gnt_bt); 7772 + 8131 7773 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; 8132 7774 if (!pcinfo->valid) { 8133 7775 rtw89_debug(rtwdev, RTW89_DBG_BTC, ··· 8209 7855 bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD], 8210 7856 cx->cnt_bt[BTC_BCNT_SCBDUPDATE]); 8211 7857 8212 - /* To avoid I/O if WL LPS or power-off */ 8213 - if (!wl->status.map.lps && !wl->status.map.rf_off) { 8214 - btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7858 + btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7859 + _get_gnt(rtwdev, &gnt_cfg); 8215 7860 8216 - _get_gnt(rtwdev, &gnt_cfg); 8217 - gnt = gnt_cfg.band[0]; 8218 - seq_printf(m, 8219 - " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", 8220 - "[gnt_status]", 8221 - chip->chip_id == RTL8852C ? "HW" : 8222 - btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", 8223 - gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl, 8224 - gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt); 7861 + gnt = gnt_cfg.band[0]; 7862 + seq_printf(m, 7863 + " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ", 7864 + "[gnt_status]", 7865 + chip->chip_id == RTL8852C ? "HW" : 7866 + btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT", 7867 + gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl, 7868 + gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt); 8225 7869 8226 - gnt = gnt_cfg.band[1]; 8227 - seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", 8228 - gnt.gnt_wl_sw_en ? "SW" : "HW", 8229 - gnt.gnt_wl, 8230 - gnt.gnt_bt_sw_en ? "SW" : "HW", 8231 - gnt.gnt_bt); 8232 - } 7870 + gnt = gnt_cfg.band[1]; 7871 + seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n", 7872 + gnt.gnt_wl_sw_en ? "SW" : "HW", 7873 + gnt.gnt_wl, 7874 + gnt.gnt_bt_sw_en ? "SW" : "HW", 7875 + gnt.gnt_bt); 7876 + 8233 7877 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; 8234 7878 if (!pcinfo->valid) { 8235 7879 rtw89_debug(rtwdev, RTW89_DBG_BTC,
+38
drivers/net/wireless/realtek/rtw89/coex.h
··· 142 142 BTC_LPS_RF_ON = 2 143 143 }; 144 144 145 + #define R_BTC_BB_BTG_RX 0x980 146 + #define R_BTC_BB_PRE_AGC_S1 0x476C 147 + #define R_BTC_BB_PRE_AGC_S0 0x4688 148 + 149 + #define B_BTC_BB_GNT_MUX GENMASK(20, 17) 150 + #define B_BTC_BB_PRE_AGC_MASK GENMASK(31, 24) 151 + #define B_BTC_BB_PRE_AGC_VAL BIT(31) 152 + 153 + #define BTC_REG_NOTFOUND 0xff 154 + 155 + enum btc_ant_div_pos { 156 + BTC_ANT_DIV_MAIN = 0, 157 + BTC_ANT_DIV_AUX = 1, 158 + }; 159 + 160 + enum btc_get_reg_status { 161 + BTC_CSTATUS_TXDIV_POS = 0, 162 + BTC_CSTATUS_RXDIV_POS = 1, 163 + BTC_CSTATUS_BB_GNT_MUX = 2, 164 + BTC_CSTATUS_BB_GNT_MUX_MON = 3, 165 + BTC_CSTATUS_BB_PRE_AGC = 4, 166 + BTC_CSTATUS_BB_PRE_AGC_MON = 5, 167 + }; 168 + 169 + enum btc_preagc_type { 170 + BTC_PREAGC_DISABLE, 171 + BTC_PREAGC_ENABLE, 172 + BTC_PREAGC_BB_FWCTRL, 173 + BTC_PREAGC_NOTFOUND, 174 + }; 175 + 176 + enum btc_btgctrl_type { 177 + BTC_BTGCTRL_DISABLE, 178 + BTC_BTGCTRL_ENABLE, 179 + BTC_BTGCTRL_BB_GNT_FWCTRL, 180 + BTC_BTGCTRL_BB_GNT_NOTFOUND, 181 + }; 182 + 145 183 void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev); 146 184 void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev); 147 185 void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode);
+12 -11
drivers/net/wireless/realtek/rtw89/core.h
··· 1706 1706 u8 port_id[RTW89_WIFI_ROLE_MLME_MAX]; 1707 1707 u8 rssi_level; 1708 1708 u8 cn_report; 1709 + u8 coex_mode; 1709 1710 1710 1711 bool scbd_change; 1711 1712 u32 scbd; ··· 1814 1813 union rtw89_btc_bt_rfk_info_map rfk_info; 1815 1814 1816 1815 u8 raw_info[BTC_BTINFO_MAX]; /* raw bt info from mailbox */ 1816 + u8 rssi_level; 1817 1817 1818 1818 u32 scbd; 1819 1819 u32 feature; ··· 1831 1829 u32 hi_lna_rx: 1; 1832 1830 u32 scan_rx_low_pri: 1; 1833 1831 u32 scan_info_update: 1; 1834 - u32 rsvd: 20; 1832 + u32 lna_constrain: 3; 1833 + u32 rsvd: 17; 1835 1834 }; 1836 1835 1837 1836 struct rtw89_btc_cx { ··· 2310 2307 u8 state_phase; /* [0:3] train state, [4:7] train phase */ 2311 2308 } __packed; 2312 2309 2313 - struct rtw89_btc_fbtc_fddt_cell_status_v5 { 2314 - s8 wl_tx_pwr; 2315 - s8 bt_tx_pwr; 2316 - s8 bt_rx_gain; 2317 - } __packed; 2318 - 2319 2310 struct rtw89_btc_fbtc_cysta_v3 { /* statistics for cycles */ 2320 2311 u8 fver; 2321 2312 u8 rsvd; ··· 2373 2376 struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept; 2374 2377 struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX]; 2375 2378 struct rtw89_btc_fbtc_cycle_fddt_info_v5 fddt_trx[BTC_CYCLE_SLOT_MAX]; 2376 - struct rtw89_btc_fbtc_fddt_cell_status_v5 fddt_cells[FDD_TRAIN_WL_DIRECTION] 2377 - [FDD_TRAIN_WL_RSSI_LEVEL] 2378 - [FDD_TRAIN_BT_RSSI_LEVEL]; 2379 + struct rtw89_btc_fbtc_fddt_cell_status fddt_cells[FDD_TRAIN_WL_DIRECTION] 2380 + [FDD_TRAIN_WL_RSSI_LEVEL] 2381 + [FDD_TRAIN_BT_RSSI_LEVEL]; 2379 2382 __le32 except_map; 2380 2383 } __packed; 2381 2384 ··· 2508 2511 u32 noisy_level: 3; 2509 2512 u32 coex_info_map: 8; 2510 2513 u32 bt_only: 1; 2511 - u32 wl_btg_rx: 1; 2514 + u32 wl_btg_rx: 2; 2512 2515 u32 trx_para_level: 8; 2513 2516 u32 wl_stb_chg: 1; 2514 2517 u32 pta_owner: 1; 2518 + 2515 2519 u32 tdma_instant_excute: 1; 2520 + u32 wl_btg_rx_rb: 2; 2516 2521 2517 2522 u16 slot_dur[CXST_MAX]; 2518 2523 2519 2524 u8 run_reason; 2520 2525 u8 run_action; 2521 2526 2527 + u8 wl_pre_agc: 2; 2522 2528 u8 wl_lna2: 1; 2529 + u8 wl_pre_agc_rb: 2; 2523 2530 }; 2524 2531 2525 2532 struct rtw89_btc_ctrl {
+2 -1
drivers/net/wireless/realtek/rtw89/mac.c
··· 5507 5507 5508 5508 if (chip->chip_id == RTL8852C) 5509 5509 return false; 5510 - else if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B) 5510 + else if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B || 5511 + chip->chip_id == RTL8851B) 5511 5512 val = rtw89_read8_mask(rtwdev, R_AX_SYS_SDIO_CTRL + 3, 5512 5513 B_AX_LTE_MUX_CTRL_PATH >> 24); 5513 5514
+1072
drivers/net/wireless/realtek/rtw89/mac_be.c
··· 73 73 return -EFAULT; 74 74 } 75 75 76 + static bool is_qta_poh(struct rtw89_dev *rtwdev) 77 + { 78 + return rtwdev->hci.type == RTW89_HCI_TYPE_PCIE; 79 + } 80 + 76 81 static void hfc_get_mix_info_be(struct rtw89_dev *rtwdev) 77 82 { 78 83 struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param; ··· 571 566 rtwdev, R_BE_WCPU_FW_CTRL); 572 567 } 573 568 569 + static int dmac_func_en_be(struct rtw89_dev *rtwdev) 570 + { 571 + return 0; 572 + } 573 + 574 + static int cmac_func_en_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool en) 575 + { 576 + u32 reg; 577 + 578 + if (mac_idx > RTW89_MAC_1) 579 + return -EINVAL; 580 + 581 + if (mac_idx == RTW89_MAC_0) 582 + return 0; 583 + 584 + if (en) { 585 + rtw89_write32_set(rtwdev, R_BE_AFE_CTRL1, B_BE_AFE_CTRL1_SET); 586 + rtw89_write32_clr(rtwdev, R_BE_SYS_ISO_CTRL_EXTEND, B_BE_R_SYM_ISO_CMAC12PP); 587 + rtw89_write32_set(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_CMAC1_FEN); 588 + 589 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CK_EN, mac_idx); 590 + rtw89_write32_set(rtwdev, reg, B_BE_CK_EN_SET); 591 + 592 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CMAC_FUNC_EN, mac_idx); 593 + rtw89_write32_set(rtwdev, reg, B_BE_CMAC_FUNC_EN_SET); 594 + 595 + set_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags); 596 + } else { 597 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CMAC_FUNC_EN, mac_idx); 598 + rtw89_write32_clr(rtwdev, reg, B_BE_CMAC_FUNC_EN_SET); 599 + 600 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CK_EN, mac_idx); 601 + rtw89_write32_clr(rtwdev, reg, B_BE_CK_EN_SET); 602 + 603 + rtw89_write32_clr(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_CMAC1_FEN); 604 + rtw89_write32_set(rtwdev, R_BE_SYS_ISO_CTRL_EXTEND, B_BE_R_SYM_ISO_CMAC12PP); 605 + rtw89_write32_clr(rtwdev, R_BE_AFE_CTRL1, B_BE_AFE_CTRL1_SET); 606 + 607 + clear_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags); 608 + } 609 + 610 + return 0; 611 + } 612 + 613 + static int chip_func_en_be(struct rtw89_dev *rtwdev) 614 + { 615 + return 0; 616 + } 617 + 618 + static int sys_init_be(struct rtw89_dev *rtwdev) 619 + { 620 + int ret; 621 + 622 + ret = dmac_func_en_be(rtwdev); 623 + if (ret) 624 + return ret; 625 + 626 + ret = cmac_func_en_be(rtwdev, RTW89_MAC_0, true); 627 + if (ret) 628 + return ret; 629 + 630 + ret = chip_func_en_be(rtwdev); 631 + if (ret) 632 + return ret; 633 + 634 + return ret; 635 + } 636 + 637 + static int sta_sch_init_be(struct rtw89_dev *rtwdev) 638 + { 639 + u32 p_val; 640 + int ret; 641 + 642 + ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 643 + if (ret) 644 + return ret; 645 + 646 + rtw89_write8_set(rtwdev, R_BE_SS_CTRL, B_BE_SS_EN); 647 + 648 + ret = read_poll_timeout(rtw89_read32, p_val, p_val & B_BE_SS_INIT_DONE, 649 + 1, TRXCFG_WAIT_CNT, false, rtwdev, R_BE_SS_CTRL); 650 + if (ret) { 651 + rtw89_err(rtwdev, "[ERR]STA scheduler init\n"); 652 + return ret; 653 + } 654 + 655 + rtw89_write32_set(rtwdev, R_BE_SS_CTRL, B_BE_WARM_INIT); 656 + rtw89_write32_clr(rtwdev, R_BE_SS_CTRL, B_BE_BAND_TRIG_EN | B_BE_BAND1_TRIG_EN); 657 + 658 + return 0; 659 + } 660 + 661 + static int mpdu_proc_init_be(struct rtw89_dev *rtwdev) 662 + { 663 + u32 val32; 664 + int ret; 665 + 666 + ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 667 + if (ret) 668 + return ret; 669 + 670 + rtw89_write32_set(rtwdev, R_BE_MPDU_PROC, B_BE_APPEND_FCS); 671 + rtw89_write32(rtwdev, R_BE_CUT_AMSDU_CTRL, TRXCFG_MPDU_PROC_CUT_CTRL); 672 + 673 + val32 = rtw89_read32(rtwdev, R_BE_HDR_SHCUT_SETTING); 674 + val32 |= (B_BE_TX_HW_SEQ_EN | B_BE_TX_HW_ACK_POLICY_EN | B_BE_TX_MAC_MPDU_PROC_EN); 675 + val32 &= ~B_BE_TX_ADDR_MLD_TO_LIK; 676 + rtw89_write32_set(rtwdev, R_BE_HDR_SHCUT_SETTING, val32); 677 + 678 + rtw89_write32(rtwdev, R_BE_RX_HDRTRNS, TRXCFG_MPDU_PROC_RX_HDR_CONV); 679 + 680 + val32 = rtw89_read32(rtwdev, R_BE_DISP_FWD_WLAN_0); 681 + val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_DATA_MASK); 682 + val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_MNG_MASK); 683 + val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_CTL_MASK); 684 + val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_1_MASK); 685 + rtw89_write32(rtwdev, R_BE_DISP_FWD_WLAN_0, val32); 686 + 687 + return 0; 688 + } 689 + 690 + static int sec_eng_init_be(struct rtw89_dev *rtwdev) 691 + { 692 + u32 val32; 693 + int ret; 694 + 695 + ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 696 + if (ret) 697 + return ret; 698 + 699 + val32 = rtw89_read32(rtwdev, R_BE_SEC_ENG_CTRL); 700 + val32 |= B_BE_CLK_EN_CGCMP | B_BE_CLK_EN_WAPI | B_BE_CLK_EN_WEP_TKIP | 701 + B_BE_SEC_TX_ENC | B_BE_SEC_RX_DEC | 702 + B_BE_MC_DEC | B_BE_BC_DEC | 703 + B_BE_BMC_MGNT_DEC | B_BE_UC_MGNT_DEC; 704 + val32 &= ~B_BE_SEC_PRE_ENQUE_TX; 705 + rtw89_write32(rtwdev, R_BE_SEC_ENG_CTRL, val32); 706 + 707 + rtw89_write32_set(rtwdev, R_BE_SEC_MPDU_PROC, B_BE_APPEND_ICV | B_BE_APPEND_MIC); 708 + 709 + return 0; 710 + } 711 + 712 + static int txpktctrl_init_be(struct rtw89_dev *rtwdev) 713 + { 714 + struct rtw89_mac_dle_rsvd_qt_cfg qt_cfg; 715 + u32 val32; 716 + int ret; 717 + 718 + ret = rtw89_mac_get_dle_rsvd_qt_cfg(rtwdev, DLE_RSVD_QT_MPDU_INFO, &qt_cfg); 719 + if (ret) { 720 + rtw89_err(rtwdev, "get dle rsvd qt %d cfg fail %d\n", 721 + DLE_RSVD_QT_MPDU_INFO, ret); 722 + return ret; 723 + } 724 + 725 + val32 = rtw89_read32(rtwdev, R_BE_TXPKTCTL_MPDUINFO_CFG); 726 + val32 = u32_replace_bits(val32, qt_cfg.pktid, B_BE_MPDUINFO_PKTID_MASK); 727 + val32 = u32_replace_bits(val32, MPDU_INFO_B1_OFST, B_BE_MPDUINFO_B1_BADDR_MASK); 728 + val32 |= B_BE_MPDUINFO_FEN; 729 + rtw89_write32(rtwdev, R_BE_TXPKTCTL_MPDUINFO_CFG, val32); 730 + 731 + return 0; 732 + } 733 + 734 + static int mlo_init_be(struct rtw89_dev *rtwdev) 735 + { 736 + u32 val32; 737 + int ret; 738 + 739 + val32 = rtw89_read32(rtwdev, R_BE_MLO_INIT_CTL); 740 + 741 + val32 |= B_BE_MLO_TABLE_REINIT; 742 + rtw89_write32(rtwdev, R_BE_MLO_INIT_CTL, val32); 743 + val32 &= ~B_BE_MLO_TABLE_REINIT; 744 + rtw89_write32(rtwdev, R_BE_MLO_INIT_CTL, val32); 745 + 746 + ret = read_poll_timeout_atomic(rtw89_read32, val32, 747 + val32 & B_BE_MLO_TABLE_INIT_DONE, 748 + 1, 1000, false, rtwdev, R_BE_MLO_INIT_CTL); 749 + if (ret) 750 + rtw89_err(rtwdev, "[MLO]%s: MLO init polling timeout\n", __func__); 751 + 752 + rtw89_write32_set(rtwdev, R_BE_SS_CTRL, B_BE_MLO_HW_CHGLINK_EN); 753 + rtw89_write32_set(rtwdev, R_BE_CMAC_SHARE_ACQCHK_CFG_0, B_BE_R_MACID_ACQ_CHK_EN); 754 + 755 + return ret; 756 + } 757 + 758 + static int dmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 759 + { 760 + int ret; 761 + 762 + ret = rtw89_mac_dle_init(rtwdev, rtwdev->mac.qta_mode, RTW89_QTA_INVALID); 763 + if (ret) { 764 + rtw89_err(rtwdev, "[ERR]DLE init %d\n", ret); 765 + return ret; 766 + } 767 + 768 + ret = rtw89_mac_preload_init(rtwdev, RTW89_MAC_0, rtwdev->mac.qta_mode); 769 + if (ret) { 770 + rtw89_err(rtwdev, "[ERR]preload init %d\n", ret); 771 + return ret; 772 + } 773 + 774 + ret = rtw89_mac_hfc_init(rtwdev, true, true, true); 775 + if (ret) { 776 + rtw89_err(rtwdev, "[ERR]HCI FC init %d\n", ret); 777 + return ret; 778 + } 779 + 780 + ret = sta_sch_init_be(rtwdev); 781 + if (ret) { 782 + rtw89_err(rtwdev, "[ERR]STA SCH init %d\n", ret); 783 + return ret; 784 + } 785 + 786 + ret = mpdu_proc_init_be(rtwdev); 787 + if (ret) { 788 + rtw89_err(rtwdev, "[ERR]MPDU Proc init %d\n", ret); 789 + return ret; 790 + } 791 + 792 + ret = sec_eng_init_be(rtwdev); 793 + if (ret) { 794 + rtw89_err(rtwdev, "[ERR]Security Engine init %d\n", ret); 795 + return ret; 796 + } 797 + 798 + ret = txpktctrl_init_be(rtwdev); 799 + if (ret) { 800 + rtw89_err(rtwdev, "[ERR]TX pkt ctrl init %d\n", ret); 801 + return ret; 802 + } 803 + 804 + ret = mlo_init_be(rtwdev); 805 + if (ret) { 806 + rtw89_err(rtwdev, "[ERR]MLO init %d\n", ret); 807 + return ret; 808 + } 809 + 810 + return ret; 811 + } 812 + 813 + static int scheduler_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 814 + { 815 + u32 val32; 816 + u32 reg; 817 + int ret; 818 + 819 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 820 + if (ret) 821 + return ret; 822 + 823 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_HE_CTN_CHK_CCA_NAV, mac_idx); 824 + val32 = B_BE_HE_CTN_CHK_CCA_P20 | B_BE_HE_CTN_CHK_EDCCA_P20 | 825 + B_BE_HE_CTN_CHK_CCA_BITMAP | B_BE_HE_CTN_CHK_EDCCA_BITMAP | 826 + B_BE_HE_CTN_CHK_NO_GNT_WL | B_BE_HE_CTN_CHK_BASIC_NAV | 827 + B_BE_HE_CTN_CHK_INTRA_NAV | B_BE_HE_CTN_CHK_TX_NAV; 828 + rtw89_write32(rtwdev, reg, val32); 829 + 830 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_HE_SIFS_CHK_CCA_NAV, mac_idx); 831 + val32 = B_BE_HE_SIFS_CHK_EDCCA_P20 | B_BE_HE_SIFS_CHK_EDCCA_BITMAP | 832 + B_BE_HE_SIFS_CHK_NO_GNT_WL; 833 + rtw89_write32(rtwdev, reg, val32); 834 + 835 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TB_CHK_CCA_NAV, mac_idx); 836 + val32 = B_BE_TB_CHK_EDCCA_BITMAP | B_BE_TB_CHK_NO_GNT_WL | B_BE_TB_CHK_BASIC_NAV; 837 + rtw89_write32(rtwdev, reg, val32); 838 + 839 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CCA_CFG_0, mac_idx); 840 + rtw89_write32_clr(rtwdev, reg, B_BE_NO_GNT_WL_EN); 841 + 842 + if (is_qta_poh(rtwdev)) { 843 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PREBKF_CFG_0, mac_idx); 844 + rtw89_write32_mask(rtwdev, reg, B_BE_PREBKF_TIME_MASK, 845 + SCH_PREBKF_24US); 846 + 847 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CTN_CFG_0, mac_idx); 848 + rtw89_write32_mask(rtwdev, reg, B_BE_PREBKF_TIME_NONAC_MASK, 849 + SCH_PREBKF_24US); 850 + } 851 + 852 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_EDCA_BCNQ_PARAM, mac_idx); 853 + rtw89_write32_mask(rtwdev, reg, B_BE_BCNQ_CW_MASK, 0x32); 854 + rtw89_write32_mask(rtwdev, reg, B_BE_BCNQ_AIFS_MASK, BCN_IFS_25US); 855 + 856 + return 0; 857 + } 858 + 859 + static int addr_cam_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 860 + { 861 + u32 val32; 862 + u16 val16; 863 + u32 reg; 864 + int ret; 865 + 866 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 867 + if (ret) 868 + return ret; 869 + 870 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_ADDR_CAM_CTRL, mac_idx); 871 + val32 = rtw89_read32(rtwdev, reg); 872 + val32 = u32_replace_bits(val32, ADDR_CAM_SERCH_RANGE, B_BE_ADDR_CAM_RANGE_MASK); 873 + val32 |= B_BE_ADDR_CAM_EN; 874 + if (mac_idx == RTW89_MAC_0) 875 + val32 |= B_BE_ADDR_CAM_CLR; 876 + rtw89_write32(rtwdev, reg, val32); 877 + 878 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_ADDR_CAM_CTRL, mac_idx); 879 + ret = read_poll_timeout_atomic(rtw89_read16, val16, !(val16 & B_BE_ADDR_CAM_CLR), 880 + 1, TRXCFG_WAIT_CNT, false, rtwdev, reg); 881 + if (ret) 882 + rtw89_err(rtwdev, "[ERR]ADDR_CAM reset\n"); 883 + 884 + return ret; 885 + } 886 + 887 + static int rtw89_mac_typ_fltr_opt_be(struct rtw89_dev *rtwdev, 888 + enum rtw89_machdr_frame_type type, 889 + enum rtw89_mac_fwd_target fwd_target, 890 + u8 mac_idx) 891 + { 892 + u32 reg; 893 + u32 val; 894 + 895 + switch (fwd_target) { 896 + case RTW89_FWD_DONT_CARE: 897 + val = RX_FLTR_FRAME_DROP_BE; 898 + break; 899 + case RTW89_FWD_TO_HOST: 900 + case RTW89_FWD_TO_WLAN_CPU: 901 + val = RX_FLTR_FRAME_ACCEPT_BE; 902 + break; 903 + default: 904 + rtw89_err(rtwdev, "[ERR]set rx filter fwd target err\n"); 905 + return -EINVAL; 906 + } 907 + 908 + switch (type) { 909 + case RTW89_MGNT: 910 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_MGNT_FLTR, mac_idx); 911 + break; 912 + case RTW89_CTRL: 913 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CTRL_FLTR, mac_idx); 914 + break; 915 + case RTW89_DATA: 916 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DATA_FLTR, mac_idx); 917 + break; 918 + default: 919 + rtw89_err(rtwdev, "[ERR]set rx filter type err\n"); 920 + return -EINVAL; 921 + } 922 + rtw89_write32(rtwdev, reg, val); 923 + 924 + return 0; 925 + } 926 + 927 + static int rx_fltr_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 928 + { 929 + u32 reg; 930 + u32 val; 931 + 932 + rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_MGNT, RTW89_FWD_TO_HOST, mac_idx); 933 + rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_CTRL, RTW89_FWD_TO_HOST, mac_idx); 934 + rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_DATA, RTW89_FWD_TO_HOST, mac_idx); 935 + 936 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_FLTR_OPT, mac_idx); 937 + val = B_BE_A_BC_CAM_MATCH | B_BE_A_UC_CAM_MATCH | B_BE_A_MC | 938 + B_BE_A_BC | B_BE_A_A1_MATCH | B_BE_SNIFFER_MODE | 939 + u32_encode_bits(15, B_BE_UID_FILTER_MASK); 940 + rtw89_write32(rtwdev, reg, val); 941 + u32p_replace_bits(&rtwdev->hal.rx_fltr, 15, B_BE_UID_FILTER_MASK); 942 + 943 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PLCP_HDR_FLTR, mac_idx); 944 + val = B_BE_HE_SIGB_CRC_CHK | B_BE_VHT_MU_SIGB_CRC_CHK | 945 + B_BE_VHT_SU_SIGB_CRC_CHK | B_BE_SIGA_CRC_CHK | 946 + B_BE_LSIG_PARITY_CHK_EN | B_BE_CCK_SIG_CHK | B_BE_CCK_CRC_CHK; 947 + rtw89_write16(rtwdev, reg, val); 948 + 949 + return 0; 950 + } 951 + 952 + static int cca_ctrl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 953 + { 954 + return 0; 955 + } 956 + 957 + static int nav_ctrl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 958 + { 959 + u32 val32; 960 + u32 reg; 961 + 962 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_NAV_CTL, mac_idx); 963 + 964 + val32 = rtw89_read32(rtwdev, reg); 965 + val32 &= ~B_BE_WMAC_PLCP_UP_NAV_EN; 966 + val32 |= B_BE_WMAC_TF_UP_NAV_EN | B_BE_WMAC_NAV_UPPER_EN; 967 + val32 = u32_replace_bits(val32, NAV_25MS, B_BE_WMAC_NAV_UPPER_MASK); 968 + 969 + rtw89_write32(rtwdev, reg, val32); 970 + 971 + return 0; 972 + } 973 + 974 + static int spatial_reuse_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 975 + { 976 + u32 reg; 977 + int ret; 978 + 979 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 980 + if (ret) 981 + return ret; 982 + 983 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_SR_CTRL, mac_idx); 984 + rtw89_write8_clr(rtwdev, reg, B_BE_SR_EN | B_BE_SR_CTRL_PLCP_EN); 985 + 986 + return 0; 987 + } 988 + 989 + static int tmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 990 + { 991 + u32 reg; 992 + 993 + rtw89_write32_clr(rtwdev, R_BE_TB_PPDU_CTRL, B_BE_QOSNULL_UPD_MUEDCA_EN); 994 + 995 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMTX_TCR_BE_4, mac_idx); 996 + rtw89_write32_mask(rtwdev, reg, B_BE_EHT_HE_PPDU_4XLTF_ZLD_USTIMER_MASK, 0x12); 997 + rtw89_write32_mask(rtwdev, reg, B_BE_EHT_HE_PPDU_2XLTF_ZLD_USTIMER_MASK, 0xe); 998 + 999 + return 0; 1000 + } 1001 + 1002 + static int trxptcl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1003 + { 1004 + const struct rtw89_chip_info *chip = rtwdev->chip; 1005 + const struct rtw89_rrsr_cfgs *rrsr = chip->rrsr_cfgs; 1006 + struct rtw89_hal *hal = &rtwdev->hal; 1007 + u32 val32; 1008 + u32 reg; 1009 + int ret; 1010 + 1011 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1012 + if (ret) 1013 + return ret; 1014 + 1015 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_MAC_LOOPBACK, mac_idx); 1016 + val32 = rtw89_read32(rtwdev, reg); 1017 + val32 = u32_replace_bits(val32, S_BE_MACLBK_PLCP_DLY_DEF, 1018 + B_BE_MACLBK_PLCP_DLY_MASK); 1019 + val32 &= ~B_BE_MACLBK_EN; 1020 + rtw89_write32(rtwdev, reg, val32); 1021 + 1022 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_0, mac_idx); 1023 + val32 = rtw89_read32(rtwdev, reg); 1024 + val32 = u32_replace_bits(val32, WMAC_SPEC_SIFS_CCK, 1025 + B_BE_WMAC_SPEC_SIFS_CCK_MASK); 1026 + val32 = u32_replace_bits(val32, WMAC_SPEC_SIFS_OFDM_1115E, 1027 + B_BE_WMAC_SPEC_SIFS_OFDM_MASK); 1028 + rtw89_write32(rtwdev, reg, val32); 1029 + 1030 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_LEGACY, mac_idx); 1031 + rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_RESP_LEGACY_CHK_EDCCA); 1032 + 1033 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_HE, mac_idx); 1034 + rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_RESP_HE_CHK_EDCCA); 1035 + 1036 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_EHT_LEG_PUNC, mac_idx); 1037 + rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_EHT_LEG_PUNC_CHK_EDCCA); 1038 + 1039 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RXTRIG_TEST_USER_2, mac_idx); 1040 + rtw89_write32_set(rtwdev, reg, B_BE_RXTRIG_FCSCHK_EN); 1041 + 1042 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_1, mac_idx); 1043 + val32 = rtw89_read32(rtwdev, reg); 1044 + val32 &= B_BE_FTM_RRSR_RATE_EN_MASK | B_BE_WMAC_RESP_DOPPLEB_BE_EN | 1045 + B_BE_WMAC_RESP_DCM_EN | B_BE_WMAC_RESP_REF_RATE_MASK; 1046 + rtw89_write32(rtwdev, reg, val32); 1047 + rtw89_write32_mask(rtwdev, reg, rrsr->ref_rate.mask, rrsr->ref_rate.data); 1048 + 1049 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR1, mac_idx); 1050 + val32 = rtw89_read32(rtwdev, reg); 1051 + val32 &= B_BE_RRSR_RATE_EN_MASK | B_BE_RRSR_CCK_MASK | B_BE_RSC_MASK; 1052 + rtw89_write32(rtwdev, reg, val32); 1053 + 1054 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR0, mac_idx); 1055 + val32 = rtw89_read32(rtwdev, reg); 1056 + val32 &= B_BE_RRSR_OFDM_MASK | B_BE_RRSR_HT_MASK | B_BE_RRSR_VHT_MASK | 1057 + B_BE_RRSR_HE_MASK; 1058 + rtw89_write32(rtwdev, reg, val32); 1059 + 1060 + if (chip->chip_id == RTL8922A && hal->cv == CHIP_CAV) { 1061 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR1, mac_idx); 1062 + rtw89_write32_mask(rtwdev, reg, B_BE_RSC_MASK, 1); 1063 + } 1064 + 1065 + return 0; 1066 + } 1067 + 1068 + static int rst_bacam_be(struct rtw89_dev *rtwdev) 1069 + { 1070 + u32 val; 1071 + int ret; 1072 + 1073 + rtw89_write32_mask(rtwdev, R_BE_RESPBA_CAM_CTRL, B_BE_BACAM_RST_MASK, 1074 + S_BE_BACAM_RST_ALL); 1075 + 1076 + ret = read_poll_timeout_atomic(rtw89_read32_mask, val, val == S_BE_BACAM_RST_DONE, 1077 + 1, 1000, false, 1078 + rtwdev, R_BE_RESPBA_CAM_CTRL, B_BE_BACAM_RST_MASK); 1079 + if (ret) 1080 + rtw89_err(rtwdev, "[ERR]bacam rst timeout\n"); 1081 + 1082 + return ret; 1083 + } 1084 + 1085 + #define PLD_RLS_MAX_PG 127 1086 + #define RX_MAX_LEN_UNIT 512 1087 + #define RX_SPEC_MAX_LEN (11454 + RX_MAX_LEN_UNIT) 1088 + 1089 + static int rmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1090 + { 1091 + u32 rx_min_qta, rx_max_len, rx_max_pg; 1092 + u16 val16; 1093 + u32 reg; 1094 + int ret; 1095 + 1096 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1097 + if (ret) 1098 + return ret; 1099 + 1100 + if (mac_idx == RTW89_MAC_0) { 1101 + ret = rst_bacam_be(rtwdev); 1102 + if (ret) 1103 + return ret; 1104 + } 1105 + 1106 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DLK_PROTECT_CTL, mac_idx); 1107 + val16 = rtw89_read16(rtwdev, reg); 1108 + val16 = u16_replace_bits(val16, TRXCFG_RMAC_DATA_TO, B_BE_RX_DLK_DATA_TIME_MASK); 1109 + val16 = u16_replace_bits(val16, TRXCFG_RMAC_CCA_TO, B_BE_RX_DLK_CCA_TIME_MASK); 1110 + val16 |= B_BE_RX_DLK_RST_EN; 1111 + rtw89_write16(rtwdev, reg, val16); 1112 + 1113 + if (mac_idx == RTW89_MAC_0) 1114 + rx_min_qta = rtwdev->mac.dle_info.c0_rx_qta; 1115 + else 1116 + rx_min_qta = rtwdev->mac.dle_info.c1_rx_qta; 1117 + rx_max_pg = min_t(u32, rx_min_qta, PLD_RLS_MAX_PG); 1118 + rx_max_len = rx_max_pg * rtwdev->mac.dle_info.ple_pg_size; 1119 + rx_max_len = min_t(u32, rx_max_len, RX_SPEC_MAX_LEN); 1120 + rx_max_len /= RX_MAX_LEN_UNIT; 1121 + 1122 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_FLTR_OPT, mac_idx); 1123 + rtw89_write32_mask(rtwdev, reg, B_BE_RX_MPDU_MAX_LEN_MASK, rx_max_len); 1124 + 1125 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PLCP_HDR_FLTR, mac_idx); 1126 + rtw89_write8_clr(rtwdev, reg, B_BE_VHT_SU_SIGB_CRC_CHK); 1127 + 1128 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RCR, mac_idx); 1129 + rtw89_write16_set(rtwdev, reg, B_BE_BUSY_CHKSN); 1130 + 1131 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_PLCP_EXT_OPTION_1, mac_idx); 1132 + rtw89_write16_set(rtwdev, reg, B_BE_PLCP_SU_PSDU_LEN_SRC); 1133 + 1134 + return 0; 1135 + } 1136 + 1137 + static int resp_pktctl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1138 + { 1139 + struct rtw89_mac_dle_rsvd_qt_cfg qt_cfg; 1140 + enum rtw89_mac_dle_rsvd_qt_type type; 1141 + u32 reg; 1142 + int ret; 1143 + 1144 + if (mac_idx == RTW89_MAC_1) 1145 + type = DLE_RSVD_QT_B1_CSI; 1146 + else 1147 + type = DLE_RSVD_QT_B0_CSI; 1148 + 1149 + ret = rtw89_mac_get_dle_rsvd_qt_cfg(rtwdev, type, &qt_cfg); 1150 + if (ret) { 1151 + rtw89_err(rtwdev, "get dle rsvd qt %d cfg fail %d\n", type, ret); 1152 + return ret; 1153 + } 1154 + 1155 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RESP_CSI_RESERVED_PAGE, mac_idx); 1156 + rtw89_write32_mask(rtwdev, reg, B_BE_CSI_RESERVED_START_PAGE_MASK, qt_cfg.pktid); 1157 + rtw89_write32_mask(rtwdev, reg, B_BE_CSI_RESERVED_PAGE_NUM_MASK, qt_cfg.pg_num); 1158 + 1159 + return 0; 1160 + } 1161 + 1162 + static int cmac_com_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1163 + { 1164 + u32 val32; 1165 + int ret; 1166 + 1167 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1168 + if (ret) 1169 + return ret; 1170 + 1171 + if (mac_idx == RTW89_MAC_0) { 1172 + val32 = rtw89_read32(rtwdev, R_BE_TX_SUB_BAND_VALUE); 1173 + val32 = u32_replace_bits(val32, S_BE_TXSB_20M_8, B_BE_TXSB_20M_MASK); 1174 + val32 = u32_replace_bits(val32, S_BE_TXSB_40M_4, B_BE_TXSB_40M_MASK); 1175 + val32 = u32_replace_bits(val32, S_BE_TXSB_80M_2, B_BE_TXSB_80M_MASK); 1176 + val32 = u32_replace_bits(val32, S_BE_TXSB_160M_1, B_BE_TXSB_160M_MASK); 1177 + rtw89_write32(rtwdev, R_BE_TX_SUB_BAND_VALUE, val32); 1178 + } else { 1179 + val32 = rtw89_read32(rtwdev, R_BE_TX_SUB_BAND_VALUE_C1); 1180 + val32 = u32_replace_bits(val32, S_BE_TXSB_20M_2, B_BE_TXSB_20M_MASK); 1181 + val32 = u32_replace_bits(val32, S_BE_TXSB_40M_1, B_BE_TXSB_40M_MASK); 1182 + val32 = u32_replace_bits(val32, S_BE_TXSB_80M_0, B_BE_TXSB_80M_MASK); 1183 + val32 = u32_replace_bits(val32, S_BE_TXSB_160M_0, B_BE_TXSB_160M_MASK); 1184 + rtw89_write32(rtwdev, R_BE_TX_SUB_BAND_VALUE_C1, val32); 1185 + } 1186 + 1187 + return 0; 1188 + } 1189 + 1190 + static int ptcl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1191 + { 1192 + u32 val32; 1193 + u8 val8; 1194 + u32 reg; 1195 + int ret; 1196 + 1197 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1198 + if (ret) 1199 + return ret; 1200 + 1201 + if (is_qta_poh(rtwdev)) { 1202 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_SIFS_SETTING, mac_idx); 1203 + val32 = rtw89_read32(rtwdev, reg); 1204 + val32 = u32_replace_bits(val32, S_AX_CTS2S_TH_1K, 1205 + B_BE_HW_CTS2SELF_PKT_LEN_TH_MASK); 1206 + val32 = u32_replace_bits(val32, S_AX_CTS2S_TH_SEC_256B, 1207 + B_BE_HW_CTS2SELF_PKT_LEN_TH_TWW_MASK); 1208 + val32 |= B_BE_HW_CTS2SELF_EN; 1209 + rtw89_write32(rtwdev, reg, val32); 1210 + 1211 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_FSM_MON, mac_idx); 1212 + val32 = rtw89_read32(rtwdev, reg); 1213 + val32 = u32_replace_bits(val32, S_AX_PTCL_TO_2MS, 1214 + B_BE_PTCL_TX_ARB_TO_THR_MASK); 1215 + val32 &= ~B_BE_PTCL_TX_ARB_TO_MODE; 1216 + rtw89_write32(rtwdev, reg, val32); 1217 + } 1218 + 1219 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_COMMON_SETTING_0, mac_idx); 1220 + val8 = rtw89_read8(rtwdev, reg); 1221 + val8 |= B_BE_CMAC_TX_MODE_0 | B_BE_CMAC_TX_MODE_1; 1222 + val8 &= ~(B_BE_PTCL_TRIGGER_SS_EN_0 | 1223 + B_BE_PTCL_TRIGGER_SS_EN_1 | 1224 + B_BE_PTCL_TRIGGER_SS_EN_UL); 1225 + rtw89_write8(rtwdev, reg, val8); 1226 + 1227 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_AMPDU_AGG_LIMIT, mac_idx); 1228 + rtw89_write32_mask(rtwdev, reg, B_BE_AMPDU_MAX_TIME_MASK, AMPDU_MAX_TIME); 1229 + 1230 + return 0; 1231 + } 1232 + 1233 + static int cmac_dma_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1234 + { 1235 + u32 val32; 1236 + u32 reg; 1237 + int ret; 1238 + 1239 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1240 + if (ret) 1241 + return ret; 1242 + 1243 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_CTRL_1, mac_idx); 1244 + 1245 + val32 = rtw89_read32(rtwdev, reg); 1246 + val32 = u32_replace_bits(val32, WLCPU_RXCH2_QID, 1247 + B_BE_RXDMA_TXRPT_QUEUE_ID_SW_MASK); 1248 + val32 = u32_replace_bits(val32, WLCPU_RXCH2_QID, 1249 + B_BE_RXDMA_F2PCMDRPT_QUEUE_ID_SW_MASK); 1250 + rtw89_write32(rtwdev, reg, val32); 1251 + 1252 + return 0; 1253 + } 1254 + 1255 + static int cmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1256 + { 1257 + int ret; 1258 + 1259 + ret = scheduler_init_be(rtwdev, mac_idx); 1260 + if (ret) { 1261 + rtw89_err(rtwdev, "[ERR]CMAC%d SCH init %d\n", mac_idx, ret); 1262 + return ret; 1263 + } 1264 + 1265 + ret = addr_cam_init_be(rtwdev, mac_idx); 1266 + if (ret) { 1267 + rtw89_err(rtwdev, "[ERR]CMAC%d ADDR_CAM reset %d\n", mac_idx, 1268 + ret); 1269 + return ret; 1270 + } 1271 + 1272 + ret = rx_fltr_init_be(rtwdev, mac_idx); 1273 + if (ret) { 1274 + rtw89_err(rtwdev, "[ERR]CMAC%d RX filter init %d\n", mac_idx, 1275 + ret); 1276 + return ret; 1277 + } 1278 + 1279 + ret = cca_ctrl_init_be(rtwdev, mac_idx); 1280 + if (ret) { 1281 + rtw89_err(rtwdev, "[ERR]CMAC%d CCA CTRL init %d\n", mac_idx, 1282 + ret); 1283 + return ret; 1284 + } 1285 + 1286 + ret = nav_ctrl_init_be(rtwdev, mac_idx); 1287 + if (ret) { 1288 + rtw89_err(rtwdev, "[ERR]CMAC%d NAV CTRL init %d\n", mac_idx, 1289 + ret); 1290 + return ret; 1291 + } 1292 + 1293 + ret = spatial_reuse_init_be(rtwdev, mac_idx); 1294 + if (ret) { 1295 + rtw89_err(rtwdev, "[ERR]CMAC%d Spatial Reuse init %d\n", 1296 + mac_idx, ret); 1297 + return ret; 1298 + } 1299 + 1300 + ret = tmac_init_be(rtwdev, mac_idx); 1301 + if (ret) { 1302 + rtw89_err(rtwdev, "[ERR]CMAC%d TMAC init %d\n", mac_idx, ret); 1303 + return ret; 1304 + } 1305 + 1306 + ret = trxptcl_init_be(rtwdev, mac_idx); 1307 + if (ret) { 1308 + rtw89_err(rtwdev, "[ERR]CMAC%d TRXPTCL init %d\n", mac_idx, ret); 1309 + return ret; 1310 + } 1311 + 1312 + ret = rmac_init_be(rtwdev, mac_idx); 1313 + if (ret) { 1314 + rtw89_err(rtwdev, "[ERR]CMAC%d RMAC init %d\n", mac_idx, ret); 1315 + return ret; 1316 + } 1317 + 1318 + ret = resp_pktctl_init_be(rtwdev, mac_idx); 1319 + if (ret) { 1320 + rtw89_err(rtwdev, "[ERR]CMAC%d resp pktctl init %d\n", mac_idx, ret); 1321 + return ret; 1322 + } 1323 + 1324 + ret = cmac_com_init_be(rtwdev, mac_idx); 1325 + if (ret) { 1326 + rtw89_err(rtwdev, "[ERR]CMAC%d Com init %d\n", mac_idx, ret); 1327 + return ret; 1328 + } 1329 + 1330 + ret = ptcl_init_be(rtwdev, mac_idx); 1331 + if (ret) { 1332 + rtw89_err(rtwdev, "[ERR]CMAC%d PTCL init %d\n", mac_idx, ret); 1333 + return ret; 1334 + } 1335 + 1336 + ret = cmac_dma_init_be(rtwdev, mac_idx); 1337 + if (ret) { 1338 + rtw89_err(rtwdev, "[ERR]CMAC%d DMA init %d\n", mac_idx, ret); 1339 + return ret; 1340 + } 1341 + 1342 + return ret; 1343 + } 1344 + 1345 + static int tx_idle_poll_band_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1346 + { 1347 + u32 reg; 1348 + u8 val8; 1349 + int ret; 1350 + 1351 + ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1352 + if (ret) 1353 + return ret; 1354 + 1355 + reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_TX_CTN_SEL, mac_idx); 1356 + 1357 + ret = read_poll_timeout_atomic(rtw89_read8, val8, !(val8 & B_BE_PTCL_BUSY), 1358 + 30, 66000, false, rtwdev, reg); 1359 + 1360 + return ret; 1361 + } 1362 + 574 1363 static int dle_buf_req_be(struct rtw89_dev *rtwdev, u16 buf_len, bool wd, u16 *pkt_id) 575 1364 { 576 1365 u32 val, reg; ··· 1445 646 if (cmd_type == CPUIO_OP_CMD_GET_NEXT_PID || 1446 647 cmd_type == CPUIO_OP_CMD_GET_1ST_PID) 1447 648 ctrl_para->pktid = u32_get_bits(val, B_BE_WD_CPUQ_OP_PKTID_MASK); 649 + 650 + return 0; 651 + } 652 + 653 + static int preload_init_be(struct rtw89_dev *rtwdev, u8 mac_idx, 654 + enum rtw89_qta_mode mode) 655 + { 656 + u32 max_preld_size, min_rsvd_size; 657 + u32 val32; 658 + u32 reg; 659 + 660 + max_preld_size = mac_idx == RTW89_MAC_0 ? 661 + PRELD_B0_ENT_NUM : PRELD_B1_ENT_NUM; 662 + max_preld_size *= PRELD_AMSDU_SIZE; 663 + 664 + reg = mac_idx == RTW89_MAC_0 ? R_BE_TXPKTCTL_B0_PRELD_CFG0 : 665 + R_BE_TXPKTCTL_B1_PRELD_CFG0; 666 + val32 = rtw89_read32(rtwdev, reg); 667 + val32 = u32_replace_bits(val32, max_preld_size, B_BE_B0_PRELD_USEMAXSZ_MASK); 668 + val32 |= B_BE_B0_PRELD_FEN; 669 + rtw89_write32(rtwdev, reg, val32); 670 + 671 + min_rsvd_size = PRELD_AMSDU_SIZE; 672 + reg = mac_idx == RTW89_MAC_0 ? R_BE_TXPKTCTL_B0_PRELD_CFG1 : 673 + R_BE_TXPKTCTL_B1_PRELD_CFG1; 674 + val32 = rtw89_read32(rtwdev, reg); 675 + val32 = u32_replace_bits(val32, PRELD_NEXT_WND, B_BE_B0_PRELD_NXT_TXENDWIN_MASK); 676 + val32 = u32_replace_bits(val32, min_rsvd_size, B_BE_B0_PRELD_NXT_RSVMINSZ_MASK); 677 + rtw89_write32(rtwdev, reg, val32); 678 + 679 + return 0; 680 + } 681 + 682 + static int dbcc_bb_ctrl_be(struct rtw89_dev *rtwdev, bool bb1_en) 683 + { 684 + return 0; 685 + } 686 + 687 + static int enable_imr_be(struct rtw89_dev *rtwdev, u8 mac_idx, 688 + enum rtw89_mac_hwmod_sel sel) 689 + { 690 + const struct rtw89_chip_info *chip = rtwdev->chip; 691 + const struct rtw89_imr_table *table; 692 + const struct rtw89_reg_imr *reg; 693 + u32 addr; 694 + u32 val; 695 + int i; 696 + 697 + if (sel == RTW89_DMAC_SEL) 698 + table = chip->imr_dmac_table; 699 + else if (sel == RTW89_CMAC_SEL) 700 + table = chip->imr_cmac_table; 701 + else 702 + return -EINVAL; 703 + 704 + for (i = 0; i < table->n_regs; i++) { 705 + reg = &table->regs[i]; 706 + addr = rtw89_mac_reg_by_idx(rtwdev, reg->addr, mac_idx); 707 + 708 + val = rtw89_read32(rtwdev, addr); 709 + val &= ~reg->clr; 710 + val |= reg->set; 711 + rtw89_write32(rtwdev, addr, val); 712 + } 713 + 714 + return 0; 715 + } 716 + 717 + static void err_imr_ctrl_be(struct rtw89_dev *rtwdev, bool en) 718 + { 719 + u32 v32_dmac = en ? DMAC_ERR_IMR_EN : DMAC_ERR_IMR_DIS; 720 + u32 v32_cmac0 = en ? CMAC0_ERR_IMR_EN : CMAC0_ERR_IMR_DIS; 721 + u32 v32_cmac1 = en ? CMAC1_ERR_IMR_EN : CMAC1_ERR_IMR_DIS; 722 + 723 + v32_dmac &= ~B_BE_DMAC_NOTX_ERR_INT_EN; 724 + 725 + rtw89_write32(rtwdev, R_BE_DMAC_ERR_IMR, v32_dmac); 726 + rtw89_write32(rtwdev, R_BE_CMAC_ERR_IMR, v32_cmac0); 727 + 728 + if (rtwdev->dbcc_en) 729 + rtw89_write32(rtwdev, R_BE_CMAC_ERR_IMR_C1, v32_cmac1); 730 + } 731 + 732 + static int band1_enable_be(struct rtw89_dev *rtwdev) 733 + { 734 + int ret; 735 + 736 + ret = tx_idle_poll_band_be(rtwdev, RTW89_MAC_0); 737 + if (ret) { 738 + rtw89_err(rtwdev, "[ERR]tx idle poll %d\n", ret); 739 + return ret; 740 + } 741 + 742 + ret = rtw89_mac_dle_quota_change(rtwdev, rtwdev->mac.qta_mode); 743 + if (ret) { 744 + rtw89_err(rtwdev, "[ERR]DLE quota change %d\n", ret); 745 + return ret; 746 + } 747 + 748 + ret = preload_init_be(rtwdev, RTW89_MAC_1, rtwdev->mac.qta_mode); 749 + if (ret) { 750 + rtw89_err(rtwdev, "[ERR]preload init B1 %d\n", ret); 751 + return ret; 752 + } 753 + 754 + ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, true); 755 + if (ret) { 756 + rtw89_err(rtwdev, "[ERR]CMAC%d func en %d\n", RTW89_MAC_1, ret); 757 + return ret; 758 + } 759 + 760 + ret = cmac_init_be(rtwdev, RTW89_MAC_1); 761 + if (ret) { 762 + rtw89_err(rtwdev, "[ERR]CMAC%d init %d\n", RTW89_MAC_1, ret); 763 + return ret; 764 + } 765 + 766 + ret = dbcc_bb_ctrl_be(rtwdev, true); 767 + if (ret) { 768 + rtw89_err(rtwdev, "[ERR]enable bb 1 %d\n", ret); 769 + return ret; 770 + } 771 + 772 + ret = enable_imr_be(rtwdev, RTW89_MAC_1, RTW89_CMAC_SEL); 773 + if (ret) { 774 + rtw89_err(rtwdev, "[ERR] enable CMAC1 IMR %d\n", ret); 775 + return ret; 776 + } 777 + 778 + return 0; 779 + } 780 + 781 + static int band1_disable_be(struct rtw89_dev *rtwdev) 782 + { 783 + int ret; 784 + 785 + ret = dbcc_bb_ctrl_be(rtwdev, false); 786 + if (ret) { 787 + rtw89_err(rtwdev, "[ERR]disable bb 1 %d\n", ret); 788 + return ret; 789 + } 790 + 791 + ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, false); 792 + if (ret) { 793 + rtw89_err(rtwdev, "[ERR]CMAC%d func dis %d\n", RTW89_MAC_1, ret); 794 + return ret; 795 + } 796 + 797 + ret = rtw89_mac_dle_quota_change(rtwdev, rtwdev->mac.qta_mode); 798 + if (ret) { 799 + rtw89_err(rtwdev, "[ERR]DLE quota change %d\n", ret); 800 + return ret; 801 + } 802 + 803 + return 0; 804 + } 805 + 806 + static int dbcc_enable_be(struct rtw89_dev *rtwdev, bool enable) 807 + { 808 + int ret; 809 + 810 + if (enable) { 811 + ret = band1_enable_be(rtwdev); 812 + if (ret) { 813 + rtw89_err(rtwdev, "[ERR] band1_enable %d\n", ret); 814 + return ret; 815 + } 816 + 817 + if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags)) { 818 + ret = rtw89_fw_h2c_notify_dbcc(rtwdev, true); 819 + if (ret) { 820 + rtw89_err(rtwdev, "%s:[ERR]notfify dbcc1 fail %d\n", 821 + __func__, ret); 822 + return ret; 823 + } 824 + } 825 + } else { 826 + if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags)) { 827 + ret = rtw89_fw_h2c_notify_dbcc(rtwdev, false); 828 + if (ret) { 829 + rtw89_err(rtwdev, "%s:[ERR]notfify dbcc1 fail %d\n", 830 + __func__, ret); 831 + return ret; 832 + } 833 + } 834 + 835 + ret = band1_disable_be(rtwdev); 836 + if (ret) { 837 + rtw89_err(rtwdev, "[ERR] band1_disable %d\n", ret); 838 + return ret; 839 + } 840 + } 841 + 842 + return 0; 843 + } 844 + 845 + static int set_host_rpr_be(struct rtw89_dev *rtwdev) 846 + { 847 + u32 val32; 848 + u32 mode; 849 + u32 fltr; 850 + bool poh; 851 + 852 + poh = is_qta_poh(rtwdev); 853 + 854 + if (poh) { 855 + mode = RTW89_RPR_MODE_POH; 856 + fltr = S_BE_WDRLS_FLTR_TXOK | S_BE_WDRLS_FLTR_RTYLMT | 857 + S_BE_WDRLS_FLTR_LIFTIM | S_BE_WDRLS_FLTR_MACID; 858 + } else { 859 + mode = RTW89_RPR_MODE_STF; 860 + fltr = 0; 861 + } 862 + 863 + rtw89_write32_mask(rtwdev, R_BE_WDRLS_CFG, B_BE_WDRLS_MODE_MASK, mode); 864 + 865 + val32 = rtw89_read32(rtwdev, R_BE_RLSRPT0_CFG1); 866 + val32 = u32_replace_bits(val32, fltr, B_BE_RLSRPT0_FLTR_MAP_MASK); 867 + val32 = u32_replace_bits(val32, 30, B_BE_RLSRPT0_AGGNUM_MASK); 868 + val32 = u32_replace_bits(val32, 255, B_BE_RLSRPT0_TO_MASK); 869 + rtw89_write32(rtwdev, R_BE_RLSRPT0_CFG1, val32); 870 + 871 + return 0; 872 + } 873 + 874 + static int trx_init_be(struct rtw89_dev *rtwdev) 875 + { 876 + enum rtw89_qta_mode qta_mode = rtwdev->mac.qta_mode; 877 + int ret; 878 + 879 + ret = dmac_init_be(rtwdev, 0); 880 + if (ret) { 881 + rtw89_err(rtwdev, "[ERR]DMAC init %d\n", ret); 882 + return ret; 883 + } 884 + 885 + ret = cmac_init_be(rtwdev, 0); 886 + if (ret) { 887 + rtw89_err(rtwdev, "[ERR]CMAC%d init %d\n", 0, ret); 888 + return ret; 889 + } 890 + 891 + if (rtw89_mac_is_qta_dbcc(rtwdev, qta_mode)) { 892 + ret = dbcc_enable_be(rtwdev, true); 893 + if (ret) { 894 + rtw89_err(rtwdev, "[ERR]dbcc_enable init %d\n", ret); 895 + return ret; 896 + } 897 + } 898 + 899 + ret = enable_imr_be(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 900 + if (ret) { 901 + rtw89_err(rtwdev, "[ERR] enable DMAC IMR %d\n", ret); 902 + return ret; 903 + } 904 + 905 + ret = enable_imr_be(rtwdev, RTW89_MAC_0, RTW89_CMAC_SEL); 906 + if (ret) { 907 + rtw89_err(rtwdev, "[ERR] to enable CMAC0 IMR %d\n", ret); 908 + return ret; 909 + } 910 + 911 + err_imr_ctrl_be(rtwdev, true); 912 + 913 + ret = set_host_rpr_be(rtwdev); 914 + if (ret) { 915 + rtw89_err(rtwdev, "[ERR] set host rpr %d\n", ret); 916 + return ret; 917 + } 1448 918 1449 919 return 0; 1450 920 } ··· 2230 1162 }, 2231 1163 2232 1164 .check_mac_en = rtw89_mac_check_mac_en_be, 1165 + .sys_init = sys_init_be, 1166 + .trx_init = trx_init_be, 2233 1167 .hci_func_en = rtw89_mac_hci_func_en_be, 2234 1168 .dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_be, 2235 1169 .dle_func_en = dle_func_en_be, 2236 1170 .dle_clk_en = dle_clk_en_be, 2237 1171 .bf_assoc = rtw89_mac_bf_assoc_be, 1172 + 1173 + .typ_fltr_opt = rtw89_mac_typ_fltr_opt_be, 2238 1174 2239 1175 .dle_mix_cfg = dle_mix_cfg_be, 2240 1176 .chk_dle_rdy = chk_dle_rdy_be,
+541
drivers/net/wireless/realtek/rtw89/reg.h
··· 4924 4924 B_BE_CR_WRFF_OVERFLOW_ERR_INT_EN | \ 4925 4925 B_BE_CR_WRFF_UNDERFLOW_ERR_INT_EN) 4926 4926 4927 + #define R_BE_DISP_FWD_WLAN_0 0x8938 4928 + #define B_BE_FWD_WLAN_CPU_TYPE_13_MASK GENMASK(31, 30) 4929 + #define B_BE_FWD_WLAN_CPU_TYPE_12_MASK GENMASK(29, 28) 4930 + #define B_BE_FWD_WLAN_CPU_TYPE_11_MASK GENMASK(27, 26) 4931 + #define B_BE_FWD_WLAN_CPU_TYPE_10_MASK GENMASK(25, 24) 4932 + #define B_BE_FWD_WLAN_CPU_TYPE_9_MASK GENMASK(23, 22) 4933 + #define B_BE_FWD_WLAN_CPU_TYPE_8_MASK GENMASK(21, 20) 4934 + #define B_BE_FWD_WLAN_CPU_TYPE_7_MASK GENMASK(19, 18) 4935 + #define B_BE_FWD_WLAN_CPU_TYPE_6_MASK GENMASK(17, 16) 4936 + #define B_BE_FWD_WLAN_CPU_TYPE_5_MASK GENMASK(15, 14) 4937 + #define B_BE_FWD_WLAN_CPU_TYPE_4_MASK GENMASK(13, 12) 4938 + #define B_BE_FWD_WLAN_CPU_TYPE_3_MASK GENMASK(11, 10) 4939 + #define B_BE_FWD_WLAN_CPU_TYPE_2_MASK GENMASK(9, 8) 4940 + #define B_BE_FWD_WLAN_CPU_TYPE_1_MASK GENMASK(7, 6) 4941 + #define B_BE_FWD_WLAN_CPU_TYPE_0_CTL_MASK GENMASK(5, 4) 4942 + #define B_BE_FWD_WLAN_CPU_TYPE_0_MNG_MASK GENMASK(3, 2) 4943 + #define B_BE_FWD_WLAN_CPU_TYPE_0_DATA_MASK GENMASK(1, 0) 4944 + 4927 4945 #define R_BE_WDE_PKTBUF_CFG 0x8C08 4928 4946 #define B_BE_WDE_FREE_PAGE_NUM_MASK GENMASK(28, 16) 4929 4947 #define B_BE_WDE_START_BOUND_MASK GENMASK(14, 8) ··· 5405 5387 #define B_BE_PKTIN_ERR_IMR_SET (B_BE_SW_MERGE_ERR_INT_EN | \ 5406 5388 B_BE_GET_NULL_PKTID_ERR_INT_EN) 5407 5389 5390 + #define R_BE_HDR_SHCUT_SETTING 0x9B00 5391 + #define B_BE_TX_ADDR_MLD_TO_LIK BIT(4) 5392 + #define B_BE_TX_HW_SEC_HDR_EN BIT(3) 5393 + #define B_BE_TX_MAC_MPDU_PROC_EN BIT(2) 5394 + #define B_BE_TX_HW_ACK_POLICY_EN BIT(1) 5395 + #define B_BE_TX_HW_SEQ_EN BIT(0) 5396 + 5408 5397 #define R_BE_MPDU_TX_ERR_IMR 0x9BF4 5409 5398 #define B_BE_TX_TIMEOUT_ERR_EN BIT(0) 5410 5399 #define B_BE_MPDU_TX_ERR_IMR_CLR B_BE_TX_TIMEOUT_ERR_EN 5411 5400 #define B_BE_MPDU_TX_ERR_IMR_SET 0 5401 + 5402 + #define R_BE_MPDU_PROC 0x9C00 5403 + #define B_BE_PORT_SEL BIT(29) 5404 + #define B_BE_WPKT_WLANCPU_QSEL_MASK GENMASK(28, 27) 5405 + #define B_BE_WPKT_DATACPU_QSEL_MASK GENMASK(26, 25) 5406 + #define B_BE_WPKT_FW_RLS BIT(24) 5407 + #define B_BE_FWD_RPKT_MASK GENMASK(23, 16) 5408 + #define B_BE_FWD_WPKT_MASK GENMASK(15, 8) 5409 + #define B_BE_RXFWD_PRIO_MASK GENMASK(5, 4) 5410 + #define B_BE_RXFWD_EN BIT(3) 5411 + #define B_BE_DROP_NONDMA_PPDU BIT(2) 5412 + #define B_BE_APPEND_FCS BIT(0) 5413 + 5414 + #define R_BE_CUT_AMSDU_CTRL 0x9C94 5415 + #define B_BE_EN_CUT_AMSDU BIT(31) 5416 + #define B_BE_CUT_AMSDU_CHKLEN_EN BIT(30) 5417 + #define B_BE_CA_CHK_ADDRCAM_EN BIT(29) 5418 + #define B_BE_MPDU_CUT_CTRL_EN BIT(24) 5419 + #define B_BE_CUT_AMSDU_CHKLEN_L_TH_MASK GENMASK(23, 16) 5420 + #define B_BE_CUT_AMSDU_CHKLEN_H_TH_MASK GENMASK(15, 0) 5421 + 5422 + #define R_BE_RX_HDRTRNS 0x9CC0 5423 + #define B_BE_RX_MGN_MLD_ADDR_EN BIT(6) 5424 + #define B_BE_HDR_INFO_MASK GENMASK(5, 4) 5425 + #define B_BE_HC_ADDR_HIT_EN BIT(3) 5426 + #define B_BE_RX_ADDR_LINK_TO_MLO BIT(2) 5427 + #define B_BE_HDR_CNV BIT(1) 5428 + #define B_BE_RX_HDR_CNV_EN BIT(0) 5429 + #define TRXCFG_MPDU_PROC_RX_HDR_CONV 0x00000000 5412 5430 5413 5431 #define R_BE_MPDU_RX_ERR_IMR 0x9CF4 5414 5432 #define B_BE_LEN_ERR_IMR BIT(3) ··· 5526 5472 #define B_BE_RX_HANG_ERROR BIT(1) 5527 5473 #define B_BE_TX_HANG_ERROR BIT(0) 5528 5474 5475 + #define R_BE_TXPKTCTL_MPDUINFO_CFG 0x9F10 5476 + #define B_BE_MPDUINFO_FEN BIT(31) 5477 + #define B_BE_MPDUINFO_PKTID_MASK GENMASK(27, 16) 5478 + #define B_BE_MPDUINFO_B1_BADDR_MASK GENMASK(5, 0) 5479 + #define MPDU_INFO_B1_OFST 18 5480 + 5481 + #define R_BE_TXPKTCTL_B0_PRELD_CFG0 0x9F48 5482 + #define B_BE_B0_PRELD_FEN BIT(31) 5483 + #define B_BE_B0_PRELD_USEMAXSZ_MASK GENMASK(25, 16) 5484 + #define B_BE_B0_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8) 5485 + #define B_BE_B0_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0) 5486 + 5487 + #define R_BE_TXPKTCTL_B0_PRELD_CFG1 0x9F4C 5488 + #define B_BE_B0_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8) 5489 + #define B_BE_B0_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0) 5490 + 5529 5491 #define R_BE_TXPKTCTL_B0_ERRFLAG_IMR 0x9F78 5530 5492 #define B_BE_B0_IMR_DBG_USRCTL_RLSBMPLEN BIT(25) 5531 5493 #define B_BE_B0_IMR_DBG_USRCTL_RDNRLSCMD BIT(24) ··· 5571 5501 B_BE_B0_IMR_ERR_CMDPSR_TBLSZ | \ 5572 5502 B_BE_B0_IMR_ERR_PRELD_RLSPKTSZERR | \ 5573 5503 B_BE_B0_IMR_ERR_PRELD_ENTNUMCFG) 5504 + 5505 + #define R_BE_TXPKTCTL_B1_PRELD_CFG0 0x9F88 5506 + #define B_BE_B1_PRELD_FEN BIT(31) 5507 + #define B_BE_B1_PRELD_USEMAXSZ_MASK GENMASK(25, 16) 5508 + #define B_BE_B1_PRELD_CAM_G1ENTNUM_MASK GENMASK(12, 8) 5509 + #define B_BE_B1_PRELD_CAM_G0ENTNUM_MASK GENMASK(4, 0) 5510 + 5511 + #define R_BE_TXPKTCTL_B1_PRELD_CFG1 0x9F8C 5512 + #define B_BE_B1_PRELD_NXT_TXENDWIN_MASK GENMASK(11, 8) 5513 + #define B_BE_B1_PRELD_NXT_RSVMINSZ_MASK GENMASK(7, 0) 5574 5514 5575 5515 #define R_BE_TXPKTCTL_B1_ERRFLAG_IMR 0x9FB8 5576 5516 #define B_BE_B1_IMR_DBG_USRCTL_RLSBMPLEN BIT(25) ··· 5612 5532 B_BE_B1_IMR_ERR_PRELD_RLSPKTSZERR | \ 5613 5533 B_BE_B1_IMR_ERR_PRELD_ENTNUMCFG) 5614 5534 5535 + #define R_BE_MLO_INIT_CTL 0xA114 5536 + #define B_BE_MLO_TABLE_INIT_DONE BIT(31) 5537 + #define B_BE_MLO_TABLE_CLR_DONE BIT(30) 5538 + #define B_BE_MLO_TABLE_REINIT BIT(23) 5539 + #define B_BE_MLO_TABLE_HW_FLAG_CLR BIT(22) 5540 + 5615 5541 #define R_BE_MLO_ERR_IDCT_IMR 0xA128 5616 5542 #define B_BE_MLO_ERR_IDCT_IMR_0 BIT(31) 5617 5543 #define B_BE_MLO_ERR_IDCT_IMR_1 BIT(30) ··· 5646 5560 #define B_BE_PLRLS_CTL_EVT02_ISR BIT(2) 5647 5561 #define B_BE_PLRLS_CTL_EVT01_ISR BIT(1) 5648 5562 #define B_BE_PLRLS_CTL_FRZTO_ISR BIT(0) 5563 + 5564 + #define R_BE_SS_CTRL 0xA310 5565 + #define B_BE_SS_INIT_DONE BIT(31) 5566 + #define B_BE_WDE_STA_DIS BIT(30) 5567 + #define B_BE_WARM_INIT BIT(29) 5568 + #define B_BE_BAND_TRIG_EN BIT(28) 5569 + #define B_BE_RMAC_REQ_DIS BIT(27) 5570 + #define B_BE_DLYTX_SEL_MASK GENMASK(25, 24) 5571 + #define B_BE_WMM3_SWITCH_MASK GENMASK(23, 22) 5572 + #define B_BE_WMM2_SWITCH_MASK GENMASK(21, 20) 5573 + #define B_BE_WMM1_SWITCH_MASK GENMASK(19, 18) 5574 + #define B_BE_WMM0_SWITCH_MASK GENMASK(17, 16) 5575 + #define B_BE_STA_OPTION_CR BIT(15) 5576 + #define B_BE_EMLSR_STA_EMPTY_EN BIT(11) 5577 + #define B_BE_MLO_HW_CHGLINK_EN BIT(10) 5578 + #define B_BE_BAND1_TRIG_EN BIT(9) 5579 + #define B_BE_RMAC1_REQ_DIS BIT(8) 5580 + #define B_BE_MRT_SRAM_EN BIT(7) 5581 + #define B_BE_MRT_INIT_EN BIT(6) 5582 + #define B_BE_AVG_LENG_EN BIT(5) 5583 + #define B_BE_AVG_INIT_EN BIT(4) 5584 + #define B_BE_LENG_INIT_EN BIT(2) 5585 + #define B_BE_PMPA_INIT_EN BIT(1) 5586 + #define B_BE_SS_EN BIT(0) 5649 5587 5650 5588 #define R_BE_INTERRUPT_MASK_REG 0xA3F0 5651 5589 #define B_BE_PLE_B_PKTID_ERR_IMR BIT(2) ··· 5815 5705 #define B_BE_ADDRSRCH_EN BIT(1) 5816 5706 #define B_BE_BTCOEX_EN BIT(0) 5817 5707 5708 + #define R_BE_CMAC_SHARE_ACQCHK_CFG_0 0x0E010 5709 + #define B_BE_ACQCHK_ERR_FLAG_MASK GENMASK(31, 24) 5710 + #define B_BE_R_ACQCHK_ENTRY_IDX_SEL_MASK GENMASK(7, 4) 5711 + #define B_BE_MACID_ACQ_GRP1_CLR_P BIT(3) 5712 + #define B_BE_MACID_ACQ_GRP0_CLR_P BIT(2) 5713 + #define B_BE_R_MACID_ACQ_CHK_EN BIT(0) 5714 + 5818 5715 #define R_BE_CMAC_FUNC_EN 0x10000 5819 5716 #define R_BE_CMAC_FUNC_EN_C1 0x14000 5820 5717 #define B_BE_CMAC_CRPRT BIT(31) ··· 5872 5755 B_BE_PTCLTOP_CKEN | B_BE_SCHEDULER_CKEN | B_BE_TMAC_CKEN | \ 5873 5756 B_BE_RMAC_CKEN | B_BE_TXTIME_CKEN | B_BE_RESP_PKTCTL_CKEN | \ 5874 5757 B_BE_SIGB_CKEN) 5758 + 5759 + #define R_BE_TX_SUB_BAND_VALUE 0x10088 5760 + #define R_BE_TX_SUB_BAND_VALUE_C1 0x14088 5761 + #define B_BE_PRI20_BITMAP_MASK GENMASK(31, 16) 5762 + #define BE_PRI20_BITMAP_MAX 15 5763 + #define B_BE_TXSB_160M_MASK GENMASK(15, 12) 5764 + #define S_BE_TXSB_160M_0 0 5765 + #define S_BE_TXSB_160M_1 1 5766 + #define B_BE_TXSB_80M_MASK GENMASK(11, 8) 5767 + #define S_BE_TXSB_80M_0 0 5768 + #define S_BE_TXSB_80M_2 2 5769 + #define S_BE_TXSB_80M_4 4 5770 + #define B_BE_TXSB_40M_MASK GENMASK(7, 4) 5771 + #define S_BE_TXSB_40M_0 0 5772 + #define S_BE_TXSB_40M_1 1 5773 + #define S_BE_TXSB_40M_4 4 5774 + #define B_BE_TXSB_20M_MASK GENMASK(3, 0) 5775 + #define S_BE_TXSB_20M_8 8 5776 + #define S_BE_TXSB_20M_4 4 5777 + #define S_BE_TXSB_20M_2 2 5778 + 5779 + #define R_BE_PTCL_RRSR0 0x1008C 5780 + #define R_BE_PTCL_RRSR0_C1 0x1408C 5781 + #define B_BE_RRSR_HE_MASK GENMASK(31, 24) 5782 + #define B_BE_RRSR_VHT_MASK GENMASK(23, 16) 5783 + #define B_BE_RRSR_HT_MASK GENMASK(15, 8) 5784 + #define B_BE_RRSR_OFDM_MASK GENMASK(7, 0) 5785 + 5786 + #define R_BE_PTCL_RRSR1 0x10090 5787 + #define R_BE_PTCL_RRSR1_C1 0x14090 5788 + #define B_BE_RRSR_EHT_MASK GENMASK(23, 16) 5789 + #define B_BE_RRSR_RATE_EN_MASK GENMASK(12, 8) 5790 + #define B_BE_RSC_MASK GENMASK(7, 6) 5791 + #define B_BE_RRSR_CCK_MASK GENMASK(3, 0) 5875 5792 5876 5793 #define R_BE_CMAC_ERR_IMR 0x10160 5877 5794 #define R_BE_CMAC_ERR_IMR_C1 0x14160 ··· 5994 5843 #define B_BE_P0_SYNC_PORT_SRC_SEL_MASK GENMASK(26, 24) 5995 5844 #define B_BE_P0_TSFTR_SYNC_OFFSET_MASK GENMASK(18, 0) 5996 5845 5846 + #define R_BE_EDCA_BCNQ_PARAM 0x10324 5847 + #define R_BE_EDCA_BCNQ_PARAM_C1 0x14324 5848 + #define B_BE_BCNQ_CW_MASK GENMASK(31, 24) 5849 + #define B_BE_BCNQ_AIFS_MASK GENMASK(23, 16) 5850 + #define BCN_IFS_25US 0x19 5851 + #define B_BE_PIFS_MASK GENMASK(15, 8) 5852 + #define B_BE_FORCE_BCN_IFS_MASK GENMASK(7, 0) 5853 + 5854 + #define R_BE_PREBKF_CFG_0 0x10338 5855 + #define R_BE_PREBKF_CFG_0_C1 0x14338 5856 + #define B_BE_100NS_TIME_MASK GENMASK(28, 24) 5857 + #define B_BE_RX_AIR_END_TIME_MASK GENMASK(22, 16) 5858 + #define B_BE_MACTX_LATENCY_MASK GENMASK(10, 8) 5859 + #define B_BE_PREBKF_TIME_MASK GENMASK(4, 0) 5860 + 5861 + #define R_BE_CCA_CFG_0 0x10340 5862 + #define R_BE_CCA_CFG_0_C1 0x14340 5863 + #define B_BE_R_SIFS_AGGR_TIME_V1_MASK GENMASK(31, 24) 5864 + #define B_BE_EDCCA_SEC160_EN BIT(23) 5865 + #define B_BE_EDCCA_SEC80_EN BIT(22) 5866 + #define B_BE_EDCCA_SEC40_EN BIT(21) 5867 + #define B_BE_EDCCA_SEC20_EN BIT(20) 5868 + #define B_BE_SEC160_EN BIT(19) 5869 + #define B_BE_CCA_BITMAP_EN BIT(18) 5870 + #define B_BE_TXPKTCTL_RST_EDCA_EN BIT(17) 5871 + #define B_BE_WMAC_RST_EDCA_EN BIT(16) 5872 + #define B_BE_TXFAIL_BRK_TXOP_EN BIT(11) 5873 + #define B_BE_EDCCA_PER20_BITMAP_SIFS_EN BIT(10) 5874 + #define B_BE_NO_GNT_WL_BRK_TXOP_EN BIT(9) 5875 + #define B_BE_NAV_BRK_TXOP_EN BIT(8) 5876 + #define B_BE_TX_NAV_EN BIT(7) 5877 + #define B_BE_BCN_IGNORE_EDCCA BIT(6) 5878 + #define B_BE_NO_GNT_WL_EN BIT(5) 5879 + #define B_BE_EDCCA_EN BIT(4) 5880 + #define B_BE_SEC80_EN BIT(3) 5881 + #define B_BE_SEC40_EN BIT(2) 5882 + #define B_BE_SEC20_EN BIT(1) 5883 + #define B_BE_CCA_EN BIT(0) 5884 + 5885 + #define R_BE_CTN_CFG_0 0x1034C 5886 + #define R_BE_CTN_CFG_0_C1 0x1434C 5887 + #define B_BE_OTHER_LINK_BKF_BLK_TX_THD_MASK GENMASK(30, 24) 5888 + #define B_BE_CCK_SIFS_COMP_MASK GENMASK(22, 16) 5889 + #define B_BE_PIFS_TIMEUNIT_MASK GENMASK(15, 14) 5890 + #define B_BE_PREBKF_TIME_NONAC_MASK GENMASK(12, 8) 5891 + #define B_BE_SR_TX_EN BIT(2) 5892 + #define B_BE_NAV_BLK_MGQ BIT(1) 5893 + #define B_BE_NAV_BLK_HGQ BIT(0) 5894 + 5997 5895 #define R_BE_MUEDCA_BE_PARAM_0 0x10350 5998 5896 #define R_BE_MUEDCA_BK_PARAM_0 0x10354 5999 5897 #define R_BE_MUEDCA_VI_PARAM_0 0x10358 ··· 6054 5854 #define B_BE_SET_MUEDCATIMER_TF_1 BIT(5) 6055 5855 #define B_BE_SET_MUEDCATIMER_TF_0 BIT(4) 6056 5856 #define B_BE_MUEDCA_EN_0 BIT(0) 5857 + 5858 + #define R_BE_TB_CHK_CCA_NAV 0x103AC 5859 + #define R_BE_TB_CHK_CCA_NAV_C1 0x143AC 5860 + #define B_BE_TB_CHK_TX_NAV BIT(15) 5861 + #define B_BE_TB_CHK_INTRA_NAV BIT(14) 5862 + #define B_BE_TB_CHK_BASIC_NAV BIT(13) 5863 + #define B_BE_TB_CHK_NO_GNT_WL BIT(12) 5864 + #define B_BE_TB_CHK_EDCCA_S160 BIT(11) 5865 + #define B_BE_TB_CHK_EDCCA_S80 BIT(10) 5866 + #define B_BE_TB_CHK_EDCCA_S40 BIT(9) 5867 + #define B_BE_TB_CHK_EDCCA_S20 BIT(8) 5868 + #define B_BE_TB_CHK_CCA_S160 BIT(7) 5869 + #define B_BE_TB_CHK_CCA_S80 BIT(6) 5870 + #define B_BE_TB_CHK_CCA_S40 BIT(5) 5871 + #define B_BE_TB_CHK_CCA_S20 BIT(4) 5872 + #define B_BE_TB_CHK_EDCCA_BITMAP BIT(3) 5873 + #define B_BE_TB_CHK_CCA_BITMAP BIT(2) 5874 + #define B_BE_TB_CHK_EDCCA_P20 BIT(1) 5875 + #define B_BE_TB_CHK_CCA_P20 BIT(0) 5876 + 5877 + #define R_BE_HE_SIFS_CHK_CCA_NAV 0x103B4 5878 + #define R_BE_HE_SIFS_CHK_CCA_NAV_C1 0x143B4 5879 + #define B_BE_HE_SIFS_CHK_TX_NAV BIT(15) 5880 + #define B_BE_HE_SIFS_CHK_INTRA_NAV BIT(14) 5881 + #define B_BE_HE_SIFS_CHK_BASIC_NAV BIT(13) 5882 + #define B_BE_HE_SIFS_CHK_NO_GNT_WL BIT(12) 5883 + #define B_BE_HE_SIFS_CHK_EDCCA_S160 BIT(11) 5884 + #define B_BE_HE_SIFS_CHK_EDCCA_S80 BIT(10) 5885 + #define B_BE_HE_SIFS_CHK_EDCCA_S40 BIT(9) 5886 + #define B_BE_HE_SIFS_CHK_EDCCA_S20 BIT(8) 5887 + #define B_BE_HE_SIFS_CHK_CCA_S160 BIT(7) 5888 + #define B_BE_HE_SIFS_CHK_CCA_S80 BIT(6) 5889 + #define B_BE_HE_SIFS_CHK_CCA_S40 BIT(5) 5890 + #define B_BE_HE_SIFS_CHK_CCA_S20 BIT(4) 5891 + #define B_BE_HE_SIFS_CHK_EDCCA_BITMAP BIT(3) 5892 + #define B_BE_HE_SIFS_CHK_CCA_BITMAP BIT(2) 5893 + #define B_BE_HE_SIFS_CHK_EDCCA_P20 BIT(1) 5894 + #define B_BE_HE_SIFS_CHK_CCA_P20 BIT(0) 5895 + 5896 + #define R_BE_HE_CTN_CHK_CCA_NAV 0x103C4 5897 + #define R_BE_HE_CTN_CHK_CCA_NAV_C1 0x143C4 5898 + #define B_BE_HE_CTN_CHK_TX_NAV BIT(15) 5899 + #define B_BE_HE_CTN_CHK_INTRA_NAV BIT(14) 5900 + #define B_BE_HE_CTN_CHK_BASIC_NAV BIT(13) 5901 + #define B_BE_HE_CTN_CHK_NO_GNT_WL BIT(12) 5902 + #define B_BE_HE_CTN_CHK_EDCCA_S160 BIT(11) 5903 + #define B_BE_HE_CTN_CHK_EDCCA_S80 BIT(10) 5904 + #define B_BE_HE_CTN_CHK_EDCCA_S40 BIT(9) 5905 + #define B_BE_HE_CTN_CHK_EDCCA_S20 BIT(8) 5906 + #define B_BE_HE_CTN_CHK_CCA_S160 BIT(7) 5907 + #define B_BE_HE_CTN_CHK_CCA_S80 BIT(6) 5908 + #define B_BE_HE_CTN_CHK_CCA_S40 BIT(5) 5909 + #define B_BE_HE_CTN_CHK_CCA_S20 BIT(4) 5910 + #define B_BE_HE_CTN_CHK_EDCCA_BITMAP BIT(3) 5911 + #define B_BE_HE_CTN_CHK_CCA_BITMAP BIT(2) 5912 + #define B_BE_HE_CTN_CHK_EDCCA_P20 BIT(1) 5913 + #define B_BE_HE_CTN_CHK_CCA_P20 BIT(0) 6057 5914 6058 5915 #define R_BE_SCHEDULE_ERR_IMR 0x103E8 6059 5916 #define R_BE_SCHEDULE_ERR_IMR_C1 0x143E8 ··· 6237 5980 #define R_BE_PORT_HGQ_WINDOW_CFG 0x105A0 6238 5981 #define R_BE_PORT_HGQ_WINDOW_CFG_C1 0x145A0 6239 5982 5983 + #define R_BE_PTCL_COMMON_SETTING_0 0x10800 5984 + #define R_BE_PTCL_COMMON_SETTING_0_C1 0x14800 5985 + #define B_BE_PCIE_MODE_MASK GENMASK(15, 14) 5986 + #define B_BE_CPUMGQ_LIFETIME_EN BIT(8) 5987 + #define B_BE_MGQ_LIFETIME_EN BIT(7) 5988 + #define B_BE_LIFETIME_EN BIT(6) 5989 + #define B_BE_DIS_PTCL_CLK_GATING BIT(5) 5990 + #define B_BE_PTCL_TRIGGER_SS_EN_UL BIT(4) 5991 + #define B_BE_PTCL_TRIGGER_SS_EN_1 BIT(3) 5992 + #define B_BE_PTCL_TRIGGER_SS_EN_0 BIT(2) 5993 + #define B_BE_CMAC_TX_MODE_1 BIT(1) 5994 + #define B_BE_CMAC_TX_MODE_0 BIT(0) 5995 + 5996 + #define R_BE_TB_PPDU_CTRL 0x1080C 5997 + #define R_BE_TB_PPDU_CTRL_C1 0x1480C 5998 + #define B_BE_TB_PPDU_BK_DIS BIT(15) 5999 + #define B_BE_TB_PPDU_BE_DIS BIT(14) 6000 + #define B_BE_TB_PPDU_VI_DIS BIT(13) 6001 + #define B_BE_TB_PPDU_VO_DIS BIT(12) 6002 + #define B_BE_QOSNULL_UPD_MUEDCA_EN BIT(3) 6003 + #define B_BE_TB_BYPASS_TXPWR BIT(2) 6004 + #define B_BE_SW_PREFER_AC_MASK GENMASK(1, 0) 6005 + 6006 + #define R_BE_AMPDU_AGG_LIMIT 0x10810 6007 + #define R_BE_AMPDU_AGG_LIMIT_C1 0x14810 6008 + #define B_BE_AMPDU_MAX_TIME_MASK GENMASK(31, 24) 6009 + #define AMPDU_MAX_TIME 0x9E 6010 + #define B_BE_RA_TRY_RATE_AGG_LMT_MASK GENMASK(23, 16) 6011 + #define B_BE_RTS_MAX_AGG_NUM_MASK GENMASK(15, 8) 6012 + #define B_BE_MAX_AGG_NUM_MASK GENMASK(7, 0) 6013 + 6240 6014 #define R_BE_AGG_LEN_HT_0 0x10814 6241 6015 #define R_BE_AGG_LEN_HT_0_C1 0x14814 6242 6016 #define B_BE_AMPDU_MAX_LEN_HT_MASK GENMASK(31, 16) 6243 6017 #define B_BE_RTS_TXTIME_TH_MASK GENMASK(15, 8) 6244 6018 #define B_BE_RTS_LEN_TH_MASK GENMASK(7, 0) 6019 + 6020 + #define R_BE_SIFS_SETTING 0x10824 6021 + #define R_BE_SIFS_SETTING_C1 0x14824 6022 + #define B_BE_HW_CTS2SELF_PKT_LEN_TH_MASK GENMASK(31, 24) 6023 + #define B_BE_HW_CTS2SELF_PKT_LEN_TH_TWW_MASK GENMASK(23, 18) 6024 + #define B_BE_HW_CTS2SELF_EN BIT(16) 6025 + #define B_BE_SPEC_SIFS_OFDM_PTCL_MASK GENMASK(15, 8) 6026 + #define B_BE_SPEC_SIFS_CCK_PTCL_MASK GENMASK(7, 0) 6245 6027 6246 6028 #define R_BE_MBSSID_DROP_0 0x1083C 6247 6029 #define R_BE_MBSSID_DROP_0_C1 0x1483C ··· 6379 6083 #define B_BE_D_PKTID_ERR BIT(10) 6380 6084 #define B_BE_TXPRT_FULL_DROP_ERR BIT(9) 6381 6085 #define B_BE_F2PCMDRPT_FULL_DROP_ERR BIT(8) 6086 + 6087 + #define R_BE_PTCL_FSM_MON 0x108E8 6088 + #define R_BE_PTCL_FSM_MON_C1 0x148E8 6089 + #define B_BE_PTCL_FSM2_TO_MODE BIT(30) 6090 + #define B_BE_PTCL_FSM2_TO_THR_MASK GENMASK(29, 24) 6091 + #define B_BE_PTCL_FSM1_TO_MODE BIT(22) 6092 + #define B_BE_PTCL_FSM1_TO_THR_MASK GENMASK(21, 16) 6093 + #define B_BE_PTCL_FSM0_TO_MODE BIT(14) 6094 + #define B_BE_PTCL_FSM0_TO_THR_MASK GENMASK(13, 8) 6095 + #define B_BE_PTCL_TX_ARB_TO_MODE BIT(6) 6096 + #define B_BE_PTCL_TX_ARB_TO_THR_MASK GENMASK(5, 0) 6097 + 6098 + #define R_BE_PTCL_TX_CTN_SEL 0x108EC 6099 + #define R_BE_PTCL_TX_CTN_SEL_C1 0x148EC 6100 + #define B_BE_PTCL_TXOP_STAT BIT(8) 6101 + #define B_BE_PTCL_BUSY BIT(7) 6102 + #define B_BE_PTCL_DROP BIT(5) 6103 + #define B_BE_PTCL_TX_QUEUE_IDX_MASK GENMASK(4, 0) 6382 6104 6383 6105 #define R_BE_RX_ERROR_FLAG 0x10C00 6384 6106 #define R_BE_RX_ERROR_FLAG_C1 0x14C00 ··· 6511 6197 B_BE_RX_RU1_FSM_HANG_ERROR_IMR | \ 6512 6198 B_BE_RX_RU0_FSM_HANG_ERROR_IMR | \ 6513 6199 B_BE_RX_GET_NULL_PKT_ERROR_IMR) 6200 + 6201 + #define R_BE_RX_CTRL_1 0x10C0C 6202 + #define R_BE_RX_CTRL_1_C1 0x14C0C 6203 + #define B_BE_RXDMA_TXRPT_QUEUE_ID_SW_MASK GENMASK(30, 25) 6204 + #define B_BE_RXDMA_F2PCMDRPT_QUEUE_ID_SW_MASK GENMASK(23, 18) 6205 + #define B_BE_RXDMA_TXRPT_PORT_ID_SW_MASK GENMASK(17, 14) 6206 + #define B_BE_RXDMA_F2PCMDRPT_PORT_ID_SW_MASK GENMASK(13, 10) 6207 + #define B_BE_DBG_SEL_MASK GENMASK(1, 0) 6208 + #define WLCPU_RXCH2_QID 0xA 6514 6209 6515 6210 #define R_BE_TX_ERROR_FLAG 0x10C6C 6516 6211 #define R_BE_TX_ERROR_FLAG_C1 0x14C6C ··· 6676 6353 #define B_BE_UPD_HGQMD BIT(1) 6677 6354 #define B_BE_UPD_TIMIE BIT(0) 6678 6355 6356 + #define R_BE_WMTX_TCR_BE_4 0x10E2C 6357 + #define R_BE_WMTX_TCR_BE_4_C1 0x14E2C 6358 + #define B_BE_UL_EHT_MUMIMO_LTF_MODE BIT(30) 6359 + #define B_BE_UL_HE_MUMIMO_LTF_MODE BIT(29) 6360 + #define B_BE_EHT_HE_PPDU_4XLTF_ZLD_USTIMER_MASK GENMASK(28, 24) 6361 + #define B_BE_EHT_HE_PPDU_2XLTF_ZLD_USTIMER_MASK GENMASK(20, 16) 6362 + #define B_BE_NON_LEGACY_PPDU_ZLD_USTIMER_MASK GENMASK(12, 8) 6363 + #define B_BE_LEGACY_PPDU_ZLD_USTIMER_MASK GENMASK(4, 0) 6364 + 6679 6365 #define R_BE_RSP_CHK_SIG 0x11000 6680 6366 #define R_BE_RSP_CHK_SIG_C1 0x15000 6681 6367 #define B_BE_RSP_STATIC_RTS_CHK_SERV_BW_EN BIT(30) ··· 6716 6384 #define B_BE_WMAC_SPEC_SIFS_OFDM_MASK GENMASK(15, 8) 6717 6385 #define WMAC_SPEC_SIFS_OFDM_1115E 0x11 6718 6386 #define B_BE_WMAC_SPEC_SIFS_CCK_MASK GENMASK(7, 0) 6387 + 6388 + #define R_BE_TRXPTCL_RESP_1 0x11008 6389 + #define R_BE_TRXPTCL_RESP_1_C1 0x15008 6390 + #define B_BE_WMAC_RESP_SR_MODE_EN BIT(31) 6391 + #define B_BE_FTM_RRSR_RATE_EN_MASK GENMASK(28, 24) 6392 + #define B_BE_NESS_MASK GENMASK(23, 22) 6393 + #define B_BE_WMAC_RESP_DOPPLEB_BE_EN BIT(21) 6394 + #define B_BE_WMAC_RESP_DCM_EN BIT(20) 6395 + #define B_BE_WMAC_CLR_ABORT_RESP_TX_CNT BIT(15) 6396 + #define B_BE_WMAC_RESP_REF_RATE_SEL BIT(12) 6397 + #define B_BE_WMAC_RESP_REF_RATE_MASK GENMASK(11, 0) 6398 + 6399 + #define R_BE_MAC_LOOPBACK 0x11020 6400 + #define R_BE_MAC_LOOPBACK_C1 0x15020 6401 + #define B_BE_MACLBK_DIS_GCLK BIT(30) 6402 + #define B_BE_MACLBK_STS_EN BIT(29) 6403 + #define B_BE_MACLBK_RDY_PERIOD_MASK GENMASK(28, 17) 6404 + #define B_BE_MACLBK_PLCP_DLY_MASK GENMASK(16, 8) 6405 + #define S_BE_MACLBK_PLCP_DLY_DEF 0x28 6406 + #define B_BE_MACLBK_RDY_NUM_MASK GENMASK(7, 3) 6407 + #define B_BE_MACLBK_EN BIT(0) 6408 + 6409 + #define R_BE_WMAC_NAV_CTL 0x11080 6410 + #define R_BE_WMAC_NAV_CTL_C1 0x15080 6411 + #define B_BE_WMAC_NAV_UPPER_EN BIT(26) 6412 + #define B_BE_WMAC_0P125US_TIMER_MASK GENMASK(25, 18) 6413 + #define B_BE_WMAC_PLCP_UP_NAV_EN BIT(17) 6414 + #define B_BE_WMAC_TF_UP_NAV_EN BIT(16) 6415 + #define B_BE_WMAC_NAV_UPPER_MASK GENMASK(15, 8) 6416 + #define NAV_25MS 0xC4 6417 + #define B_BE_WMAC_RTS_RST_DUR_MASK GENMASK(7, 0) 6418 + 6419 + #define R_BE_RXTRIG_TEST_USER_2 0x110B0 6420 + #define R_BE_RXTRIG_TEST_USER_2_C1 0x150B0 6421 + #define B_BE_RXTRIG_MACID_MASK GENMASK(31, 24) 6422 + #define B_BE_RXTRIG_RU26_DIS BIT(21) 6423 + #define B_BE_RXTRIG_FCSCHK_EN BIT(20) 6424 + #define B_BE_RXTRIG_PORT_SEL_MASK GENMASK(19, 17) 6425 + #define B_BE_RXTRIG_EN BIT(16) 6426 + #define B_BE_RXTRIG_USERINFO_2_MASK GENMASK(15, 0) 6719 6427 6720 6428 #define R_BE_TRXPTCL_ERROR_INDICA_MASK 0x110BC 6721 6429 #define R_BE_TRXPTCL_ERROR_INDICA_MASK_C1 0x150BC ··· 6898 6526 #define B_BE_BFMEE_HT_CSI_RATE_MASK GENMASK(7, 0) 6899 6527 #define CSI_INIT_RATE_EHT 0x3 6900 6528 6529 + #define R_BE_WMAC_ACK_BA_RESP_LEGACY 0x11200 6530 + #define R_BE_WMAC_ACK_BA_RESP_LEGACY_C1 0x15200 6531 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_NSTR BIT(16) 6532 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_TX_NAV BIT(15) 6533 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_INTRA_NAV BIT(14) 6534 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_BASIC_NAV BIT(13) 6535 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_BTCCA BIT(12) 6536 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_EDCCA160 BIT(11) 6537 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_EDCCA80 BIT(10) 6538 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_EDCCA40 BIT(9) 6539 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_EDCCA20 BIT(8) 6540 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_EDCCA_PER20_BMP BIT(7) 6541 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_CCA_PER20_BMP BIT(6) 6542 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_CCA160 BIT(5) 6543 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_CCA80 BIT(4) 6544 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_CCA40 BIT(3) 6545 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_SEC_CCA20 BIT(2) 6546 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_EDCCA BIT(1) 6547 + #define B_BE_ACK_BA_RESP_LEGACY_CHK_CCA BIT(0) 6548 + 6549 + #define R_BE_WMAC_ACK_BA_RESP_HE 0x11204 6550 + #define R_BE_WMAC_ACK_BA_RESP_HE_C1 0x15204 6551 + #define B_BE_ACK_BA_RESP_HE_CHK_NSTR BIT(16) 6552 + #define B_BE_ACK_BA_RESP_HE_CHK_TX_NAV BIT(15) 6553 + #define B_BE_ACK_BA_RESP_HE_CHK_INTRA_NAV BIT(14) 6554 + #define B_BE_ACK_BA_RESP_HE_CHK_BASIC_NAV BIT(13) 6555 + #define B_BE_ACK_BA_RESP_HE_CHK_BTCCA BIT(12) 6556 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_EDCCA160 BIT(11) 6557 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_EDCCA80 BIT(10) 6558 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_EDCCA40 BIT(9) 6559 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_EDCCA20 BIT(8) 6560 + #define B_BE_ACK_BA_RESP_HE_CHK_EDCCA_PER20_BMP BIT(7) 6561 + #define B_BE_ACK_BA_RESP_HE_CHK_CCA_PER20_BMP BIT(6) 6562 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_CCA160 BIT(5) 6563 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_CCA80 BIT(4) 6564 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_CCA40 BIT(3) 6565 + #define B_BE_ACK_BA_RESP_HE_CHK_SEC_CCA20 BIT(2) 6566 + #define B_BE_ACK_BA_RESP_HE_CHK_EDCCA BIT(1) 6567 + #define B_BE_ACK_BA_RESP_HE_CHK_CCA BIT(0) 6568 + 6569 + #define R_BE_WMAC_ACK_BA_RESP_EHT_LEG_PUNC 0x11208 6570 + #define R_BE_WMAC_ACK_BA_RESP_EHT_LEG_PUNC_C1 0x15208 6571 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_NSTR BIT(16) 6572 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_TX_NAV BIT(15) 6573 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_INTRA_NAV BIT(14) 6574 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_BASIC_NAV BIT(13) 6575 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_BTCCA BIT(12) 6576 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_EDCCA160 BIT(11) 6577 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_EDCCA80 BIT(10) 6578 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_EDCCA40 BIT(9) 6579 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_EDCCA20 BIT(8) 6580 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_EDCCA_PER20_BMP BIT(7) 6581 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_CCA_PER20_BMP BIT(6) 6582 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_CCA160 BIT(5) 6583 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_CCA80 BIT(4) 6584 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_CCA40 BIT(3) 6585 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_SEC_CCA20 BIT(2) 6586 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_EDCCA BIT(1) 6587 + #define B_BE_ACK_BA_EHT_LEG_PUNC_CHK_CCA BIT(0) 6588 + 6589 + #define R_BE_RCR 0x11400 6590 + #define R_BE_RCR_C1 0x15400 6591 + #define B_BE_BUSY_CHKSN BIT(15) 6592 + #define B_BE_DYN_CHEN BIT(14) 6593 + #define B_BE_AUTO_RST BIT(13) 6594 + #define B_BE_TIMER_SEL BIT(12) 6595 + #define B_BE_STOP_RX_IN BIT(11) 6596 + #define B_BE_PSR_RDY_CHKDIS BIT(10) 6597 + #define B_BE_DRV_INFO_SZ_MASK GENMASK(9, 8) 6598 + #define B_BE_HDR_CNV_SZ_MASK GENMASK(7, 6) 6599 + #define B_BE_PHY_RPT_SZ_MASK GENMASK(5, 4) 6600 + #define B_BE_CH_EN BIT(0) 6601 + 6602 + #define R_BE_DLK_PROTECT_CTL 0x11402 6603 + #define R_BE_DLK_PROTECT_CTL_C1 0x15402 6604 + #define B_BE_RX_DLK_CCA_TIME_MASK GENMASK(15, 8) 6605 + #define TRXCFG_RMAC_CCA_TO 32 6606 + #define B_BE_RX_DLK_DATA_TIME_MASK GENMASK(7, 4) 6607 + #define TRXCFG_RMAC_DATA_TO 15 6608 + #define B_BE_RX_DLK_RST_FSM BIT(3) 6609 + #define B_BE_RX_DLK_RST_SKIPDMA BIT(2) 6610 + #define B_BE_RX_DLK_RST_EN BIT(1) 6611 + #define B_BE_RX_DLK_INT_EN BIT(0) 6612 + 6613 + #define R_BE_PLCP_HDR_FLTR 0x11404 6614 + #define R_BE_PLCP_HDR_FLTR_C1 0x15404 6615 + #define B_BE_PLCP_RXFA_RESET_TYPE_MASK GENMASK(15, 12) 6616 + #define B_BE_PLCP_RXFA_RESET_EN BIT(11) 6617 + #define B_BE_DIS_CHK_MIN_LEN BIT(8) 6618 + #define B_BE_HE_SIGB_CRC_CHK BIT(6) 6619 + #define B_BE_VHT_MU_SIGB_CRC_CHK BIT(5) 6620 + #define B_BE_VHT_SU_SIGB_CRC_CHK BIT(4) 6621 + #define B_BE_SIGA_CRC_CHK BIT(3) 6622 + #define B_BE_LSIG_PARITY_CHK_EN BIT(2) 6623 + #define B_BE_CCK_SIG_CHK BIT(1) 6624 + #define B_BE_CCK_CRC_CHK BIT(0) 6625 + 6901 6626 #define R_BE_RX_FLTR_OPT 0x11420 6902 6627 #define R_BE_RX_FLTR_OPT_C1 0x15420 6903 6628 #define B_BE_UID_FILTER_MASK GENMASK(31, 24) ··· 7013 6544 #define B_BE_A_BC BIT(2) 7014 6545 #define B_BE_A_A1_MATCH BIT(1) 7015 6546 #define B_BE_SNIFFER_MODE BIT(0) 6547 + 6548 + #define R_BE_CTRL_FLTR 0x11424 6549 + #define R_BE_CTRL_FLTR_C1 0x15424 6550 + #define B_BE_CTRL_STYPE_MASK GENMASK(15, 0) 6551 + #define RX_FLTR_FRAME_DROP_BE 0x0000 6552 + #define RX_FLTR_FRAME_ACCEPT_BE 0xFFFF 6553 + 6554 + #define R_BE_MGNT_FLTR 0x11428 6555 + #define R_BE_MGNT_FLTR_C1 0x15428 6556 + #define B_BE_MGNT_STYPE_MASK GENMASK(15, 0) 6557 + 6558 + #define R_BE_DATA_FLTR 0x1142C 6559 + #define R_BE_DATA_FLTR_C1 0x1542C 6560 + #define B_BE_DATA_STYPE_MASK GENMASK(15, 0) 6561 + 6562 + #define R_BE_ADDR_CAM_CTRL 0x11434 6563 + #define R_BE_ADDR_CAM_CTRL_C1 0x15434 6564 + #define B_BE_ADDR_CAM_RANGE_MASK GENMASK(23, 16) 6565 + #define ADDR_CAM_SERCH_RANGE 0x7f 6566 + #define B_BE_ADDR_CAM_CMPLIMT_MASK GENMASK(15, 12) 6567 + #define B_BE_ADDR_CAM_IORST BIT(10) 6568 + #define B_BE_DIS_ADDR_CLK_GATED BIT(9) 6569 + #define B_BE_ADDR_CAM_CLR BIT(8) 6570 + #define B_BE_ADDR_CAM_A2_B0_CHK BIT(2) 6571 + #define B_BE_ADDR_CAM_SRCH_PERPKT BIT(1) 6572 + #define B_BE_ADDR_CAM_EN BIT(0) 6573 + 6574 + #define R_BE_RESPBA_CAM_CTRL 0x1143C 6575 + #define R_BE_RESPBA_CAM_CTRL_C1 0x1543C 6576 + #define B_BE_BACAM_SKIP_ALL_QOSNULL BIT(24) 6577 + #define B_BE_BACAM_STD_SSN_SEL BIT(20) 6578 + #define B_BE_BACAM_TEMP_SZ_MASK GENMASK(17, 16) 6579 + #define B_BE_BACAM_RST_IDX_MASK GENMASK(15, 8) 6580 + #define B_BE_BACAM_SHIFT_POLL BIT(7) 6581 + #define B_BE_BACAM_IORST BIT(6) 6582 + #define B_BE_BACAM_GCK_DIS BIT(5) 6583 + #define B_BE_COMPL_VAL BIT(3) 6584 + #define B_BE_SSN_SEL BIT(2) 6585 + #define B_BE_BACAM_RST_MASK GENMASK(1, 0) 6586 + #define S_BE_BACAM_RST_DONE 0 6587 + #define S_BE_BACAM_RST_ENT 1 6588 + #define S_BE_BACAM_RST_ALL 2 6589 + 6590 + #define R_BE_RX_SR_CTRL 0x1144A 6591 + #define R_BE_RX_SR_CTRL_C1 0x1544A 6592 + #define B_BE_SR_OP_MODE_MASK GENMASK(5, 4) 6593 + #define B_BE_SRG_CHK_EN BIT(2) 6594 + #define B_BE_SR_CTRL_PLCP_EN BIT(1) 6595 + #define B_BE_SR_EN BIT(0) 7016 6596 7017 6597 #define R_BE_CSIRPT_OPTION 0x11464 7018 6598 #define R_BE_CSIRPT_OPTION_C1 0x15464 ··· 7107 6589 #define B_BE_RX_ERR_IMR_SET (B_BE_RX_ERR_ACT_TO_MSK | \ 7108 6590 B_BE_RX_ERR_STS_ACT_TO_MSK | \ 7109 6591 B_BE_RX_ERR_TRIG_ACT_TO_MSK) 6592 + 6593 + #define R_BE_RX_PLCP_EXT_OPTION_1 0x11514 6594 + #define R_BE_RX_PLCP_EXT_OPTION_1_C1 0x15514 6595 + #define B_BE_PLCP_CLOSE_RX_UNSPUUORT BIT(19) 6596 + #define B_BE_PLCP_CLOSE_RX_BB_BRK BIT(18) 6597 + #define B_BE_PLCP_CLOSE_RX_PSDU_PRES BIT(17) 6598 + #define B_BE_PLCP_CLOSE_RX_NDP BIT(16) 6599 + #define B_BE_PLCP_NSS_SRC BIT(11) 6600 + #define B_BE_PLCP_DOPPLEB_BE_SRC BIT(10) 6601 + #define B_BE_PLCP_STBC_SRC BIT(9) 6602 + #define B_BE_PLCP_SU_PSDU_LEN_SRC BIT(8) 6603 + #define B_BE_PLCP_RXSB_SRC BIT(7) 6604 + #define B_BE_PLCP_BW_SRC_MASK GENMASK(6, 5) 6605 + #define B_BE_PLCP_GILTF_SRC BIT(4) 6606 + #define B_BE_PLCP_NSTS_SRC BIT(3) 6607 + #define B_BE_PLCP_MCS_SRC BIT(2) 6608 + #define B_BE_PLCP_CH20_WIDATA_SRC BIT(1) 6609 + #define B_BE_PLCP_PPDU_TYPE_SRC BIT(0) 6610 + 6611 + #define R_BE_RESP_CSI_RESERVED_PAGE 0x11810 6612 + #define R_BE_RESP_CSI_RESERVED_PAGE_C1 0x15810 6613 + #define B_BE_CSI_RESERVED_PAGE_NUM_MASK GENMASK(27, 16) 6614 + #define B_BE_CSI_RESERVED_START_PAGE_MASK GENMASK(11, 0) 7110 6615 7111 6616 #define R_BE_RESP_IMR 0x11884 7112 6617 #define R_BE_RESP_IMR_C1 0x15884
+25
drivers/net/wireless/virtual/mac80211_hwsim.c
··· 190 190 } 191 191 }; 192 192 193 + static const struct ieee80211_regdomain hwsim_world_regdom_custom_04 = { 194 + .n_reg_rules = 6, 195 + .alpha2 = "99", 196 + .reg_rules = { 197 + REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0), 198 + REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, 0), 199 + REG_RULE(5150 - 10, 5240 + 10, 80, 0, 30, 0), 200 + REG_RULE(5260 - 10, 5320 + 10, 80, 0, 30, 201 + NL80211_RRF_DFS_CONCURRENT | NL80211_RRF_DFS), 202 + REG_RULE(5745 - 10, 5825 + 10, 80, 0, 30, 0), 203 + REG_RULE(5855 - 10, 5925 + 10, 80, 0, 33, 0), 204 + } 205 + }; 206 + 193 207 static const struct ieee80211_regdomain *hwsim_world_regdom_custom[] = { 194 208 &hwsim_world_regdom_custom_01, 195 209 &hwsim_world_regdom_custom_02, 196 210 &hwsim_world_regdom_custom_03, 211 + &hwsim_world_regdom_custom_04, 197 212 }; 198 213 199 214 struct hwsim_vif_priv { ··· 4044 4029 IEEE80211_HE_MAC_CAP3_OMI_CONTROL | 4045 4030 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, 4046 4031 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, 4032 + .phy_cap_info[0] = 4033 + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G, 4047 4034 .phy_cap_info[1] = 4048 4035 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | 4049 4036 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | ··· 4151 4134 IEEE80211_HE_MAC_CAP3_OMI_CONTROL | 4152 4135 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, 4153 4136 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, 4137 + .phy_cap_info[0] = 4138 + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G, 4154 4139 .phy_cap_info[1] = 4155 4140 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | 4156 4141 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | ··· 4256 4237 IEEE80211_HE_MAC_CAP3_OMI_CONTROL | 4257 4238 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, 4258 4239 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, 4240 + .phy_cap_info[0] = 4241 + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G, 4259 4242 .phy_cap_info[1] = 4260 4243 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | 4261 4244 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | ··· 5308 5287 /* give the regulatory workqueue a chance to run */ 5309 5288 schedule_timeout_interruptible(1); 5310 5289 } 5290 + 5291 + /* TODO: Add param */ 5292 + wiphy_ext_feature_set(hw->wiphy, 5293 + NL80211_EXT_FEATURE_DFS_CONCURRENT); 5311 5294 5312 5295 if (param->no_vif) 5313 5296 ieee80211_hw_set(hw, NO_AUTO_VIF);
+1
include/linux/ieee80211.h
··· 2720 2720 2721 2721 #define IEEE80211_6GHZ_CTRL_REG_LPI_AP 0 2722 2722 #define IEEE80211_6GHZ_CTRL_REG_SP_AP 1 2723 + #define IEEE80211_6GHZ_CTRL_REG_VLP_AP 2 2723 2724 2724 2725 /** 2725 2726 * struct ieee80211_he_6ghz_oper - HE 6 GHz operation Information field
+39 -7
include/net/cfg80211.h
··· 117 117 * This may be due to the driver or due to regulatory bandwidth 118 118 * restrictions. 119 119 * @IEEE80211_CHAN_NO_EHT: EHT operation is not permitted on this channel. 120 + * @IEEE80211_CHAN_DFS_CONCURRENT: See %NL80211_RRF_DFS_CONCURRENT 121 + * @IEEE80211_CHAN_NO_UHB_VLP_CLIENT: Client connection with VLP AP 122 + * not permitted using this channel 123 + * @IEEE80211_CHAN_NO_UHB_AFC_CLIENT: Client connection with AFC AP 124 + * not permitted using this channel 120 125 */ 121 126 enum ieee80211_channel_flags { 122 127 IEEE80211_CHAN_DISABLED = 1<<0, ··· 145 140 IEEE80211_CHAN_16MHZ = 1<<18, 146 141 IEEE80211_CHAN_NO_320MHZ = 1<<19, 147 142 IEEE80211_CHAN_NO_EHT = 1<<20, 143 + IEEE80211_CHAN_DFS_CONCURRENT = 1<<21, 144 + IEEE80211_CHAN_NO_UHB_VLP_CLIENT= 1<<22, 145 + IEEE80211_CHAN_NO_UHB_AFC_CLIENT= 1<<23, 148 146 }; 149 147 150 148 #define IEEE80211_CHAN_NO_HT40 \ ··· 3233 3225 * 3234 3226 * @behaviour: requested BSS selection behaviour. 3235 3227 * @param: parameters for requestion behaviour. 3236 - * @band_pref: preferred band for %NL80211_BSS_SELECT_ATTR_BAND_PREF. 3237 - * @adjust: parameters for %NL80211_BSS_SELECT_ATTR_RSSI_ADJUST. 3228 + * @param.band_pref: preferred band for %NL80211_BSS_SELECT_ATTR_BAND_PREF. 3229 + * @param.adjust: parameters for %NL80211_BSS_SELECT_ATTR_RSSI_ADJUST. 3238 3230 */ 3239 3231 struct cfg80211_bss_selection { 3240 3232 enum nl80211_bss_select_attr behaviour; ··· 6071 6063 * wireless device if it has no netdev 6072 6064 * @u: union containing data specific to @iftype 6073 6065 * @connected: indicates if connected or not (STA mode) 6074 - * @bssid: (private) Used by the internal configuration code 6075 6066 * @wext: (private) Used by the internal wireless extensions compat code 6076 6067 * @wext.ibss: (private) IBSS data part of wext handling 6077 6068 * @wext.connect: (private) connection handling data ··· 6090 6083 * @mgmt_registrations: list of registrations for management frames 6091 6084 * @mgmt_registrations_need_update: mgmt registrations were updated, 6092 6085 * need to propagate the update to the driver 6093 - * @beacon_interval: beacon interval used on this device for transmitting 6094 - * beacons, 0 when not valid 6095 6086 * @address: The address for this device, valid only if @netdev is %NULL 6096 6087 * @is_running: true if this is a non-netdev device that has been started, e.g. 6097 6088 * the P2P Device. ··· 7171 7166 enum nl80211_band band); 7172 7167 7173 7168 /** 7169 + * cfg80211_ssid_eq - compare two SSIDs 7170 + * @a: first SSID 7171 + * @b: second SSID 7172 + * 7173 + * Return: %true if SSIDs are equal, %false otherwise. 7174 + */ 7175 + static inline bool 7176 + cfg80211_ssid_eq(struct cfg80211_ssid *a, struct cfg80211_ssid *b) 7177 + { 7178 + if (WARN_ON(!a || !b)) 7179 + return false; 7180 + if (a->ssid_len != b->ssid_len) 7181 + return false; 7182 + return memcmp(a->ssid, b->ssid, a->ssid_len) ? false : true; 7183 + } 7184 + 7185 + /** 7174 7186 * cfg80211_inform_bss_data - inform cfg80211 of a new BSS 7175 7187 * 7176 7188 * @wiphy: the wiphy reporting the BSS ··· 7368 7346 7369 7347 /** 7370 7348 * struct cfg80211_rx_assoc_resp_data - association response data 7371 - * @bss: the BSS that association was requested with, ownership of the pointer 7372 - * moves to cfg80211 in the call to cfg80211_rx_assoc_resp() 7373 7349 * @buf: (Re)Association Response frame (header + body) 7374 7350 * @len: length of the frame data 7375 7351 * @uapsd_queues: bitmap of queues configured for uapsd. Same format ··· 7377 7357 * @ap_mld_addr: AP MLD address (in case of MLO) 7378 7358 * @links: per-link information indexed by link ID, use links[0] for 7379 7359 * non-MLO connections 7360 + * @links.bss: the BSS that association was requested with, ownership of the 7361 + * pointer moves to cfg80211 in the call to cfg80211_rx_assoc_resp() 7380 7362 * @links.status: Set this (along with a BSS pointer) for links that 7381 7363 * were rejected by the AP. 7382 7364 */ ··· 9396 9374 * Also note that the wdev mutex must be held. 9397 9375 */ 9398 9376 void cfg80211_links_removed(struct net_device *dev, u16 link_mask); 9377 + 9378 + /** 9379 + * cfg80211_schedule_channels_check - schedule regulatory check if needed 9380 + * @wdev: the wireless device to check 9381 + * 9382 + * In case the device supports NO_IR or DFS relaxations, schedule regulatory 9383 + * channels check, as previous concurrent operation conditions may not 9384 + * hold anymore. 9385 + */ 9386 + void cfg80211_schedule_channels_check(struct wireless_dev *wdev); 9399 9387 9400 9388 #ifdef CONFIG_CFG80211_DEBUGFS 9401 9389 /**
+22 -16
include/net/mac80211.h
··· 476 476 /** 477 477 * struct ieee80211_event - event to be sent to the driver 478 478 * @type: The event itself. See &enum ieee80211_event_type. 479 - * @rssi: relevant if &type is %RSSI_EVENT 480 - * @mlme: relevant if &type is %AUTH_EVENT 481 - * @ba: relevant if &type is %BAR_RX_EVENT or %BA_FRAME_TIMEOUT 479 + * @u.rssi: relevant if &type is %RSSI_EVENT 480 + * @u.mlme: relevant if &type is %AUTH_EVENT 481 + * @u.ba: relevant if &type is %BAR_RX_EVENT or %BA_FRAME_TIMEOUT 482 482 * @u:union holding the fields above 483 483 */ 484 484 struct ieee80211_event { ··· 541 541 * @link_id: link ID, or 0 for non-MLO 542 542 * @htc_trig_based_pkt_ext: default PE in 4us units, if BSS supports HE 543 543 * @uora_exists: is the UORA element advertised by AP 544 - * @ack_enabled: indicates support to receive a multi-TID that solicits either 545 - * ACK, BACK or both 546 544 * @uora_ocw_range: UORA element's OCW Range field 547 545 * @frame_time_rts_th: HE duration RTS threshold, in units of 32us 548 546 * @he_support: does this BSS support HE ··· 1148 1150 * @ack: union part for pure ACK data 1149 1151 * @ack.cookie: cookie for the ACK 1150 1152 * @driver_data: array of driver_data pointers 1151 - * @ampdu_ack_len: number of acked aggregated frames. 1152 - * relevant only if IEEE80211_TX_STAT_AMPDU was set. 1153 - * @ampdu_len: number of aggregated frames. 1154 - * relevant only if IEEE80211_TX_STAT_AMPDU was set. 1155 - * @ack_signal: signal strength of the ACK frame 1156 1153 */ 1157 1154 struct ieee80211_tx_info { 1158 1155 /* common information */ ··· 1355 1362 * the frame. 1356 1363 * @RX_FLAG_FAILED_PLCP_CRC: Set this flag if the PCLP check failed on 1357 1364 * the frame. 1365 + * @RX_FLAG_MACTIME: The timestamp passed in the RX status (@mactime 1366 + * field) is valid if this field is non-zero, and the position 1367 + * where the timestamp was sampled depends on the value. 1358 1368 * @RX_FLAG_MACTIME_START: The timestamp passed in the RX status (@mactime 1359 1369 * field) is valid and contains the time the first symbol of the MPDU 1360 1370 * was received. This is useful in monitor mode and for proper IBSS ··· 1367 1371 * (including FCS) was received. 1368 1372 * @RX_FLAG_MACTIME_PLCP_START: The timestamp passed in the RX status (@mactime 1369 1373 * field) is valid and contains the time the SYNC preamble was received. 1374 + * @RX_FLAG_MACTIME_IS_RTAP_TS64: The timestamp passed in the RX status @mactime 1375 + * is only for use in the radiotap timestamp header, not otherwise a valid 1376 + * @mactime value. Note this is a separate flag so that we continue to see 1377 + * %RX_FLAG_MACTIME as unset. Also note that in this case the timestamp is 1378 + * reported to be 64 bits wide, not just 32. 1370 1379 * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present. 1371 1380 * Valid only for data frames (mainly A-MPDU) 1372 1381 * @RX_FLAG_AMPDU_DETAILS: A-MPDU details are known, in particular the reference ··· 1442 1441 enum mac80211_rx_flags { 1443 1442 RX_FLAG_MMIC_ERROR = BIT(0), 1444 1443 RX_FLAG_DECRYPTED = BIT(1), 1445 - RX_FLAG_MACTIME_PLCP_START = BIT(2), 1444 + RX_FLAG_ONLY_MONITOR = BIT(2), 1446 1445 RX_FLAG_MMIC_STRIPPED = BIT(3), 1447 1446 RX_FLAG_IV_STRIPPED = BIT(4), 1448 1447 RX_FLAG_FAILED_FCS_CRC = BIT(5), 1449 1448 RX_FLAG_FAILED_PLCP_CRC = BIT(6), 1450 - RX_FLAG_MACTIME_START = BIT(7), 1449 + RX_FLAG_MACTIME_IS_RTAP_TS64 = BIT(7), 1451 1450 RX_FLAG_NO_SIGNAL_VAL = BIT(8), 1452 1451 RX_FLAG_AMPDU_DETAILS = BIT(9), 1453 1452 RX_FLAG_PN_VALIDATED = BIT(10), ··· 1456 1455 RX_FLAG_AMPDU_IS_LAST = BIT(13), 1457 1456 RX_FLAG_AMPDU_DELIM_CRC_ERROR = BIT(14), 1458 1457 RX_FLAG_AMPDU_DELIM_CRC_KNOWN = BIT(15), 1459 - RX_FLAG_MACTIME_END = BIT(16), 1460 - RX_FLAG_ONLY_MONITOR = BIT(17), 1458 + RX_FLAG_MACTIME = BIT(16) | BIT(17), 1459 + RX_FLAG_MACTIME_PLCP_START = 1 << 16, 1460 + RX_FLAG_MACTIME_START = 2 << 16, 1461 + RX_FLAG_MACTIME_END = 3 << 16, 1461 1462 RX_FLAG_SKIP_MONITOR = BIT(18), 1462 1463 RX_FLAG_AMSDU_MORE = BIT(19), 1463 1464 RX_FLAG_RADIOTAP_TLV_AT_END = BIT(20), ··· 2837 2834 * @radiotap_vht_details: lists which VHT MCS information the HW reports, 2838 2835 * the default is _GI | _BANDWIDTH. 2839 2836 * Use the %IEEE80211_RADIOTAP_VHT_KNOWN_\* values. 2840 - * 2841 - * @radiotap_he: HE radiotap validity flags 2842 2837 * 2843 2838 * @radiotap_timestamp: Information for the radiotap timestamp field; if the 2844 2839 * @units_pos member is set to a non-negative value then the timestamp ··· 4272 4271 * disable background CAC/radar detection. 4273 4272 * @net_fill_forward_path: Called from .ndo_fill_forward_path in order to 4274 4273 * resolve a path for hardware flow offloading 4274 + * @can_activate_links: Checks if a specific active_links bitmap is 4275 + * supported by the driver. 4275 4276 * @change_vif_links: Change the valid links on an interface, note that while 4276 4277 * removing the old link information is still valid (link_conf pointer), 4277 4278 * but may immediately disappear after the function returns. The old or ··· 4654 4651 struct ieee80211_sta *sta, 4655 4652 struct net_device_path_ctx *ctx, 4656 4653 struct net_device_path *path); 4654 + bool (*can_activate_links)(struct ieee80211_hw *hw, 4655 + struct ieee80211_vif *vif, 4656 + u16 active_links); 4657 4657 int (*change_vif_links)(struct ieee80211_hw *hw, 4658 4658 struct ieee80211_vif *vif, 4659 4659 u16 old_links, u16 new_links,
+29
include/uapi/linux/nl80211.h
··· 4256 4256 * in current regulatory domain. 4257 4257 * @NL80211_FREQUENCY_ATTR_PSD: Power spectral density (in dBm) that 4258 4258 * is allowed on this channel in current regulatory domain. 4259 + * @NL80211_FREQUENCY_ATTR_DFS_CONCURRENT: Operation on this channel is 4260 + * allowed for peer-to-peer or adhoc communication under the control 4261 + * of a DFS master which operates on the same channel (FCC-594280 D01 4262 + * Section B.3). Should be used together with %NL80211_RRF_DFS only. 4263 + * @NL80211_FREQUENCY_ATTR_NO_UHB_VLP_CLIENT: Client connection to VLP AP 4264 + * not allowed using this channel 4265 + * @NL80211_FREQUENCY_ATTR_NO_UHB_AFC_CLIENT: Client connection to AFC AP 4266 + * not allowed using this channel 4259 4267 * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number 4260 4268 * currently defined 4261 4269 * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use ··· 4303 4295 NL80211_FREQUENCY_ATTR_NO_320MHZ, 4304 4296 NL80211_FREQUENCY_ATTR_NO_EHT, 4305 4297 NL80211_FREQUENCY_ATTR_PSD, 4298 + NL80211_FREQUENCY_ATTR_DFS_CONCURRENT, 4299 + NL80211_FREQUENCY_ATTR_NO_UHB_VLP_CLIENT, 4300 + NL80211_FREQUENCY_ATTR_NO_UHB_AFC_CLIENT, 4306 4301 4307 4302 /* keep last */ 4308 4303 __NL80211_FREQUENCY_ATTR_AFTER_LAST, ··· 4511 4500 * @NL80211_RRF_NO_320MHZ: 320MHz operation not allowed 4512 4501 * @NL80211_RRF_NO_EHT: EHT operation not allowed 4513 4502 * @NL80211_RRF_PSD: Ruleset has power spectral density value 4503 + * @NL80211_RRF_DFS_CONCURRENT: Operation on this channel is allowed for 4504 + peer-to-peer or adhoc communication under the control of a DFS master 4505 + which operates on the same channel (FCC-594280 D01 Section B.3). 4506 + Should be used together with %NL80211_RRF_DFS only. 4507 + * @NL80211_RRF_NO_UHB_VLP_CLIENT: Client connection to VLP AP not allowed 4508 + * @NL80211_RRF_NO_UHB_AFC_CLIENT: Client connection to AFC AP not allowed 4514 4509 */ 4515 4510 enum nl80211_reg_rule_flags { 4516 4511 NL80211_RRF_NO_OFDM = 1<<0, ··· 4538 4521 NL80211_RRF_NO_320MHZ = 1<<18, 4539 4522 NL80211_RRF_NO_EHT = 1<<19, 4540 4523 NL80211_RRF_PSD = 1<<20, 4524 + NL80211_RRF_DFS_CONCURRENT = 1<<21, 4525 + NL80211_RRF_NO_UHB_VLP_CLIENT = 1<<22, 4526 + NL80211_RRF_NO_UHB_AFC_CLIENT = 1<<23, 4541 4527 }; 4542 4528 4543 4529 #define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR ··· 5096 5076 * BSS isn't possible 5097 5077 * @NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY: NSTR nonprimary links aren't 5098 5078 * supported by the device, and this BSS entry represents one. 5079 + * @NL80211_BSS_CANNOT_USE_UHB_PWR_MISMATCH: STA is not supporting 5080 + * the AP power type (SP, VLP, AP) that the AP uses. 5099 5081 */ 5100 5082 enum nl80211_bss_cannot_use_reasons { 5101 5083 NL80211_BSS_CANNOT_USE_NSTR_NONPRIMARY = 1 << 0, 5084 + NL80211_BSS_CANNOT_USE_UHB_PWR_MISMATCH = 1 << 1, 5102 5085 }; 5103 5086 5104 5087 /** ··· 6515 6492 * @NL80211_EXT_FEATURE_OWE_OFFLOAD_AP: Driver/Device wants to do OWE DH IE 6516 6493 * handling in AP mode. 6517 6494 * 6495 + * @NL80211_EXT_FEATURE_DFS_CONCURRENT: The device supports peer-to-peer or 6496 + * ad hoc operation on DFS channels under the control of a concurrent 6497 + * DFS master on the same channel as described in FCC-594280 D01 6498 + * (Section B.3). This, for example, allows P2P GO and P2P clients to 6499 + * operate on DFS channels as long as there's a concurrent BSS connection. 6518 6500 * @NUM_NL80211_EXT_FEATURES: number of extended features. 6519 6501 * @MAX_NL80211_EXT_FEATURES: highest extended feature index. 6520 6502 */ ··· 6593 6565 NL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA, 6594 6566 NL80211_EXT_FEATURE_OWE_OFFLOAD, 6595 6567 NL80211_EXT_FEATURE_OWE_OFFLOAD_AP, 6568 + NL80211_EXT_FEATURE_DFS_CONCURRENT, 6596 6569 6597 6570 /* add new features before the definition below */ 6598 6571 NUM_NL80211_EXT_FEATURES,
+20
net/mac80211/driver-ops.h
··· 1666 1666 return ret; 1667 1667 } 1668 1668 1669 + static inline bool drv_can_activate_links(struct ieee80211_local *local, 1670 + struct ieee80211_sub_if_data *sdata, 1671 + u16 active_links) 1672 + { 1673 + bool ret = true; 1674 + 1675 + lockdep_assert_wiphy(local->hw.wiphy); 1676 + 1677 + if (!check_sdata_in_driver(sdata)) 1678 + return false; 1679 + 1680 + trace_drv_can_activate_links(local, sdata, active_links); 1681 + if (local->ops->can_activate_links) 1682 + ret = local->ops->can_activate_links(&local->hw, &sdata->vif, 1683 + active_links); 1684 + trace_drv_return_bool(local, ret); 1685 + 1686 + return ret; 1687 + } 1688 + 1669 1689 int drv_change_vif_links(struct ieee80211_local *local, 1670 1690 struct ieee80211_sub_if_data *sdata, 1671 1691 u16 old_links, u16 new_links,
+2 -4
net/mac80211/ieee80211_i.h
··· 439 439 bool need_beacon; 440 440 bool synced; 441 441 bool timeout_started; 442 + bool comeback; /* whether the AP has requested association comeback */ 442 443 bool s1g; 443 444 444 445 unsigned int assoc_link_id; ··· 1776 1775 static inline bool 1777 1776 ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status) 1778 1777 { 1779 - WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START && 1780 - status->flag & RX_FLAG_MACTIME_END); 1781 - return !!(status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END | 1782 - RX_FLAG_MACTIME_PLCP_START)); 1778 + return status->flag & RX_FLAG_MACTIME; 1783 1779 } 1784 1780 1785 1781 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata);
+3
net/mac80211/link.c
··· 444 444 445 445 lockdep_assert_wiphy(local->hw.wiphy); 446 446 447 + if (!drv_can_activate_links(local, sdata, active_links)) 448 + return -EINVAL; 449 + 447 450 old_active = sdata->vif.active_links; 448 451 if (old_active & active_links) { 449 452 /*
+52 -9
net/mac80211/mlme.c
··· 43 43 #define IEEE80211_ASSOC_TIMEOUT_SHORT (HZ / 10) 44 44 #define IEEE80211_ASSOC_MAX_TRIES 3 45 45 46 + #define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS msecs_to_jiffies(100) 47 + #define IEEE80211_ADV_TTLM_ST_UNDERFLOW 0xff00 48 + 46 49 static int max_nullfunc_tries = 2; 47 50 module_param(max_nullfunc_tries, int, 0644); 48 51 MODULE_PARM_DESC(max_nullfunc_tries, ··· 601 598 return ret; 602 599 } 603 600 601 + cfg80211_schedule_channels_check(&sdata->wdev); 604 602 return 0; 605 603 } 606 604 ··· 5385 5381 assoc_data->ap_addr, tu, ms); 5386 5382 assoc_data->timeout = jiffies + msecs_to_jiffies(ms); 5387 5383 assoc_data->timeout_started = true; 5384 + assoc_data->comeback = true; 5388 5385 if (ms > IEEE80211_ASSOC_TIMEOUT) 5389 5386 run_again(sdata, assoc_data->timeout); 5390 5387 goto notify_driver; ··· 5969 5964 pos++; 5970 5965 5971 5966 ttlm_info->switch_time = get_unaligned_le16(pos); 5967 + 5968 + /* Since ttlm_info->switch_time == 0 means no switch time, bump it 5969 + * by 1. 5970 + */ 5971 + if (!ttlm_info->switch_time) 5972 + ttlm_info->switch_time = 1; 5973 + 5972 5974 pos += 2; 5973 5975 5974 5976 if (control & IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT) { ··· 6070 6058 } 6071 6059 6072 6060 if (ttlm_info.switch_time) { 6073 - u32 st_us, delay = 0; 6074 - u32 ts_l26 = beacon_ts & GENMASK(25, 0); 6061 + u16 beacon_ts_tu, st_tu, delay; 6062 + u32 delay_jiffies; 6063 + u64 mask; 6075 6064 6076 6065 /* The t2l map switch time is indicated with a partial 6077 - * TSF value, convert it to TSF and calc the delay 6078 - * to the start time. 6066 + * TSF value (bits 10 to 25), get the partial beacon TS 6067 + * as well, and calc the delay to the start time. 6079 6068 */ 6080 - st_us = ieee80211_tu_to_usec(ttlm_info.switch_time); 6081 - if (st_us > ts_l26) 6082 - delay = st_us - ts_l26; 6069 + mask = GENMASK_ULL(25, 10); 6070 + beacon_ts_tu = (beacon_ts & mask) >> 10; 6071 + st_tu = ttlm_info.switch_time; 6072 + delay = st_tu - beacon_ts_tu; 6073 + 6074 + /* 6075 + * If the switch time is far in the future, then it 6076 + * could also be the previous switch still being 6077 + * announced. 6078 + * We can simply ignore it for now, if it is a future 6079 + * switch the AP will continue to announce it anyway. 6080 + */ 6081 + if (delay > IEEE80211_ADV_TTLM_ST_UNDERFLOW) 6082 + return; 6083 + 6084 + delay_jiffies = TU_TO_JIFFIES(delay); 6085 + 6086 + /* Link switching can take time, so schedule it 6087 + * 100ms before to be ready on time 6088 + */ 6089 + if (delay_jiffies > IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS) 6090 + delay_jiffies -= 6091 + IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS; 6083 6092 else 6084 - continue; 6093 + delay_jiffies = 0; 6085 6094 6086 6095 sdata->u.mgd.ttlm_info = ttlm_info; 6087 6096 wiphy_delayed_work_cancel(sdata->local->hw.wiphy, 6088 6097 &sdata->u.mgd.ttlm_work); 6089 6098 wiphy_delayed_work_queue(sdata->local->hw.wiphy, 6090 6099 &sdata->u.mgd.ttlm_work, 6091 - usecs_to_jiffies(delay)); 6100 + delay_jiffies); 6092 6101 return; 6093 6102 } 6094 6103 } ··· 6753 6720 } 6754 6721 ifmgd->auth_data->timeout_started = true; 6755 6722 } else if (ifmgd->assoc_data && 6723 + !ifmgd->assoc_data->comeback && 6756 6724 (ieee80211_is_assoc_req(fc) || 6757 6725 ieee80211_is_reassoc_req(fc))) { 6726 + /* 6727 + * Update association timeout based on the TX status 6728 + * for the (Re)Association Request frame. Skip this if 6729 + * we have already processed a (Re)Association Response 6730 + * frame that indicated need for association comeback 6731 + * at a specific time in the future. This could happen 6732 + * if the TX status information is delayed enough for 6733 + * the response to be received and processed first. 6734 + */ 6758 6735 if (status_acked) { 6759 6736 ifmgd->assoc_data->timeout = 6760 6737 jiffies + IEEE80211_ASSOC_TIMEOUT_SHORT;
+11 -2
net/mac80211/rx.c
··· 566 566 567 567 if (local->hw.radiotap_timestamp.units_pos >= 0) { 568 568 u16 accuracy = 0; 569 - u8 flags = IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT; 569 + u8 flags; 570 + u64 ts; 570 571 571 572 rthdr->it_present |= 572 573 cpu_to_le32(BIT(IEEE80211_RADIOTAP_TIMESTAMP)); ··· 576 575 while ((pos - (u8 *)rthdr) & 7) 577 576 pos++; 578 577 579 - put_unaligned_le64(status->device_timestamp, pos); 578 + if (status->flag & RX_FLAG_MACTIME_IS_RTAP_TS64) { 579 + flags = IEEE80211_RADIOTAP_TIMESTAMP_FLAG_64BIT; 580 + ts = status->mactime; 581 + } else { 582 + flags = IEEE80211_RADIOTAP_TIMESTAMP_FLAG_32BIT; 583 + ts = status->device_timestamp; 584 + } 585 + 586 + put_unaligned_le64(ts, pos); 580 587 pos += sizeof(u64); 581 588 582 589 if (local->hw.radiotap_timestamp.accuracy >= 0) {
+25
net/mac80211/trace.h
··· 2512 2512 ) 2513 2513 ); 2514 2514 2515 + TRACE_EVENT(drv_can_activate_links, 2516 + TP_PROTO(struct ieee80211_local *local, 2517 + struct ieee80211_sub_if_data *sdata, 2518 + u16 active_links), 2519 + 2520 + TP_ARGS(local, sdata, active_links), 2521 + 2522 + TP_STRUCT__entry( 2523 + LOCAL_ENTRY 2524 + VIF_ENTRY 2525 + __field(u16, active_links) 2526 + ), 2527 + 2528 + TP_fast_assign( 2529 + LOCAL_ASSIGN; 2530 + VIF_ASSIGN; 2531 + __entry->active_links = active_links; 2532 + ), 2533 + 2534 + TP_printk( 2535 + LOCAL_PR_FMT VIF_PR_FMT " requested active_links:0x%04x\n", 2536 + LOCAL_PR_ARG, VIF_PR_ARG, __entry->active_links 2537 + ) 2538 + ); 2539 + 2515 2540 TRACE_EVENT(drv_change_vif_links, 2516 2541 TP_PROTO(struct ieee80211_local *local, 2517 2542 struct ieee80211_sub_if_data *sdata,
+10 -6
net/mac80211/util.c
··· 4176 4176 unsigned int mpdu_offset) 4177 4177 { 4178 4178 u64 ts = status->mactime; 4179 + bool mactime_plcp_start; 4179 4180 struct rate_info ri; 4180 4181 u16 rate; 4181 4182 u8 n_ltf; 4182 4183 4183 4184 if (WARN_ON(!ieee80211_have_rx_timestamp(status))) 4184 4185 return 0; 4186 + 4187 + mactime_plcp_start = (status->flag & RX_FLAG_MACTIME) == 4188 + RX_FLAG_MACTIME_PLCP_START; 4185 4189 4186 4190 memset(&ri, 0, sizeof(ri)); 4187 4191 ··· 4201 4197 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4202 4198 ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4203 4199 /* TODO/FIXME: is this right? handle other PPDUs */ 4204 - if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4200 + if (mactime_plcp_start) { 4205 4201 mpdu_offset += 2; 4206 4202 ts += 36; 4207 4203 } ··· 4218 4214 * See P802.11ax_D6.0, section 27.3.4 for 4219 4215 * VHT PPDU format. 4220 4216 */ 4221 - if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4217 + if (mactime_plcp_start) { 4222 4218 mpdu_offset += 2; 4223 4219 ts += 36; 4224 4220 ··· 4242 4238 * See P802.11REVmd_D3.0, section 19.3.2 for 4243 4239 * HT PPDU format. 4244 4240 */ 4245 - if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4241 + if (mactime_plcp_start) { 4246 4242 mpdu_offset += 2; 4247 4243 if (status->enc_flags & RX_ENC_FLAG_HT_GF) 4248 4244 ts += 24; ··· 4270 4266 * See P802.11REVmd_D3.0, section 21.3.2 for 4271 4267 * VHT PPDU format. 4272 4268 */ 4273 - if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4269 + if (mactime_plcp_start) { 4274 4270 mpdu_offset += 2; 4275 4271 ts += 36; 4276 4272 ··· 4292 4288 sband = local->hw.wiphy->bands[status->band]; 4293 4289 ri.legacy = sband->bitrates[status->rate_idx].bitrate; 4294 4290 4295 - if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4291 + if (mactime_plcp_start) { 4296 4292 if (status->band == NL80211_BAND_5GHZ) { 4297 4293 ts += 20; 4298 4294 mpdu_offset += 2; ··· 4314 4310 return 0; 4315 4311 4316 4312 /* rewind from end of MPDU */ 4317 - if (status->flag & RX_FLAG_MACTIME_END) 4313 + if ((status->flag & RX_FLAG_MACTIME) == RX_FLAG_MACTIME_END) 4318 4314 ts -= mpdu_len * 8 * 10 / rate; 4319 4315 4320 4316 ts += mpdu_offset * 8 * 10 / rate;
+87 -7
net/wireless/chan.c
··· 515 515 return end_freq; 516 516 } 517 517 518 + static bool 519 + cfg80211_dfs_permissive_check_wdev(struct cfg80211_registered_device *rdev, 520 + enum nl80211_iftype iftype, 521 + struct wireless_dev *wdev, 522 + struct ieee80211_channel *chan) 523 + { 524 + unsigned int link_id; 525 + 526 + for_each_valid_link(wdev, link_id) { 527 + struct ieee80211_channel *other_chan = NULL; 528 + struct cfg80211_chan_def chandef = {}; 529 + int ret; 530 + 531 + /* In order to avoid daisy chaining only allow BSS STA */ 532 + if (wdev->iftype != NL80211_IFTYPE_STATION || 533 + !wdev->links[link_id].client.current_bss) 534 + continue; 535 + 536 + other_chan = 537 + wdev->links[link_id].client.current_bss->pub.channel; 538 + 539 + if (!other_chan) 540 + continue; 541 + 542 + if (chan == other_chan) 543 + return true; 544 + 545 + /* continue if we can't get the channel */ 546 + ret = rdev_get_channel(rdev, wdev, link_id, &chandef); 547 + if (ret) 548 + continue; 549 + 550 + if (cfg80211_is_sub_chan(&chandef, chan, false)) 551 + return true; 552 + } 553 + 554 + return false; 555 + } 556 + 557 + /* 558 + * Check if P2P GO is allowed to operate on a DFS channel 559 + */ 560 + static bool cfg80211_dfs_permissive_chan(struct wiphy *wiphy, 561 + enum nl80211_iftype iftype, 562 + struct ieee80211_channel *chan) 563 + { 564 + struct wireless_dev *wdev; 565 + struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); 566 + 567 + lockdep_assert_held(&rdev->wiphy.mtx); 568 + 569 + if (!wiphy_ext_feature_isset(&rdev->wiphy, 570 + NL80211_EXT_FEATURE_DFS_CONCURRENT) || 571 + !(chan->flags & IEEE80211_CHAN_DFS_CONCURRENT)) 572 + return false; 573 + 574 + /* only valid for P2P GO */ 575 + if (iftype != NL80211_IFTYPE_P2P_GO) 576 + return false; 577 + 578 + /* 579 + * Allow only if there's a concurrent BSS 580 + */ 581 + list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { 582 + bool ret = cfg80211_dfs_permissive_check_wdev(rdev, iftype, 583 + wdev, chan); 584 + if (ret) 585 + return ret; 586 + } 587 + 588 + return false; 589 + } 590 + 518 591 static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy, 519 592 u32 center_freq, 520 - u32 bandwidth) 593 + u32 bandwidth, 594 + enum nl80211_iftype iftype) 521 595 { 522 596 struct ieee80211_channel *c; 523 597 u32 freq, start_freq, end_freq; ··· 604 530 if (!c) 605 531 return -EINVAL; 606 532 607 - if (c->flags & IEEE80211_CHAN_RADAR) 533 + if (c->flags & IEEE80211_CHAN_RADAR && 534 + !cfg80211_dfs_permissive_chan(wiphy, iftype, c)) 608 535 return 1; 609 536 } 537 + 610 538 return 0; 611 539 } 612 540 ··· 634 558 635 559 ret = cfg80211_get_chans_dfs_required(wiphy, 636 560 ieee80211_chandef_to_khz(chandef), 637 - width); 561 + width, iftype); 638 562 if (ret < 0) 639 563 return ret; 640 564 else if (ret > 0) ··· 645 569 646 570 ret = cfg80211_get_chans_dfs_required(wiphy, 647 571 MHZ_TO_KHZ(chandef->center_freq2), 648 - width); 572 + width, iftype); 649 573 if (ret < 0) 650 574 return ret; 651 575 else if (ret > 0) ··· 1413 1337 bool check_no_ir) 1414 1338 { 1415 1339 bool res; 1416 - u32 prohibited_flags = IEEE80211_CHAN_DISABLED | 1417 - IEEE80211_CHAN_RADAR; 1340 + u32 prohibited_flags = IEEE80211_CHAN_DISABLED; 1341 + int dfs_required; 1418 1342 1419 1343 trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir); 1420 1344 1421 1345 if (check_no_ir) 1422 1346 prohibited_flags |= IEEE80211_CHAN_NO_IR; 1423 1347 1424 - if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 && 1348 + dfs_required = cfg80211_chandef_dfs_required(wiphy, chandef, iftype); 1349 + if (dfs_required != 0) 1350 + prohibited_flags |= IEEE80211_CHAN_RADAR; 1351 + 1352 + if (dfs_required > 0 && 1425 1353 cfg80211_chandef_dfs_available(wiphy, chandef)) { 1426 1354 /* We can skip IEEE80211_CHAN_NO_IR if chandef dfs available */ 1427 1355 prohibited_flags = IEEE80211_CHAN_DISABLED;
+24
net/wireless/nl80211.c
··· 1201 1201 if ((chan->flags & IEEE80211_CHAN_NO_EHT) && 1202 1202 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_EHT)) 1203 1203 goto nla_put_failure; 1204 + if ((chan->flags & IEEE80211_CHAN_DFS_CONCURRENT) && 1205 + nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DFS_CONCURRENT)) 1206 + goto nla_put_failure; 1207 + if ((chan->flags & IEEE80211_CHAN_NO_UHB_VLP_CLIENT) && 1208 + nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHB_VLP_CLIENT)) 1209 + goto nla_put_failure; 1210 + if ((chan->flags & IEEE80211_CHAN_NO_UHB_AFC_CLIENT) && 1211 + nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHB_AFC_CLIENT)) 1212 + goto nla_put_failure; 1204 1213 } 1205 1214 1206 1215 if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER, ··· 19480 19471 break; 19481 19472 } 19482 19473 19474 + cfg80211_schedule_channels_check(wdev); 19483 19475 cfg80211_sched_dfs_chan_update(rdev); 19484 19476 19485 19477 nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL, ··· 20237 20227 nlmsg_free(msg); 20238 20228 } 20239 20229 EXPORT_SYMBOL(cfg80211_update_owe_info_event); 20230 + 20231 + void cfg80211_schedule_channels_check(struct wireless_dev *wdev) 20232 + { 20233 + struct wiphy *wiphy = wdev->wiphy; 20234 + 20235 + /* Schedule channels check if NO_IR or DFS relaxations are supported */ 20236 + if (wdev->iftype == NL80211_IFTYPE_STATION && 20237 + (wiphy_ext_feature_isset(wiphy, 20238 + NL80211_EXT_FEATURE_DFS_CONCURRENT) || 20239 + (IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) && 20240 + wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))) 20241 + reg_check_channels(); 20242 + } 20243 + EXPORT_SYMBOL(cfg80211_schedule_channels_check); 20240 20244 20241 20245 /* initialisation/exit functions */ 20242 20246
+7 -1
net/wireless/reg.c
··· 1593 1593 channel_flags |= IEEE80211_CHAN_NO_320MHZ; 1594 1594 if (rd_flags & NL80211_RRF_NO_EHT) 1595 1595 channel_flags |= IEEE80211_CHAN_NO_EHT; 1596 + if (rd_flags & NL80211_RRF_DFS_CONCURRENT) 1597 + channel_flags |= IEEE80211_CHAN_DFS_CONCURRENT; 1598 + if (rd_flags & NL80211_RRF_NO_UHB_VLP_CLIENT) 1599 + channel_flags |= IEEE80211_CHAN_NO_UHB_VLP_CLIENT; 1600 + if (rd_flags & NL80211_RRF_NO_UHB_AFC_CLIENT) 1601 + channel_flags |= IEEE80211_CHAN_NO_UHB_AFC_CLIENT; 1596 1602 if (rd_flags & NL80211_RRF_PSD) 1597 1603 channel_flags |= IEEE80211_CHAN_PSD; 1598 1604 return channel_flags; ··· 2484 2478 rtnl_unlock(); 2485 2479 } 2486 2480 2487 - static void reg_check_channels(void) 2481 + void reg_check_channels(void) 2488 2482 { 2489 2483 /* 2490 2484 * Give usermode a chance to do something nicer (move to another
+5
net/wireless/reg.h
··· 181 181 */ 182 182 int reg_reload_regdb(void); 183 183 184 + /** 185 + * reg_check_channels - schedule regulatory enforcement 186 + */ 187 + void reg_check_channels(void); 188 + 184 189 extern const u8 shipped_regdb_certs[]; 185 190 extern unsigned int shipped_regdb_certs_len; 186 191 extern const u8 extra_regdb_certs[];
+61 -18
net/wireless/scan.c
··· 1818 1818 bool signal_valid, unsigned long ts) 1819 1819 { 1820 1820 struct cfg80211_internal_bss *found = NULL; 1821 + struct cfg80211_bss_ies *ies; 1821 1822 1822 1823 if (WARN_ON(!tmp->pub.channel)) 1823 - return NULL; 1824 + goto free_ies; 1824 1825 1825 1826 tmp->ts = ts; 1826 1827 1827 - if (WARN_ON(!rcu_access_pointer(tmp->pub.ies))) { 1828 - return NULL; 1829 - } 1828 + if (WARN_ON(!rcu_access_pointer(tmp->pub.ies))) 1829 + goto free_ies; 1830 1830 1831 1831 found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR); 1832 1832 ··· 1836 1836 } else { 1837 1837 struct cfg80211_internal_bss *new; 1838 1838 struct cfg80211_internal_bss *hidden; 1839 - struct cfg80211_bss_ies *ies; 1840 1839 1841 1840 /* 1842 1841 * create a copy -- the "res" variable that is passed in ··· 1844 1845 */ 1845 1846 new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size, 1846 1847 GFP_ATOMIC); 1847 - if (!new) { 1848 - ies = (void *)rcu_dereference(tmp->pub.beacon_ies); 1849 - if (ies) 1850 - kfree_rcu(ies, rcu_head); 1851 - ies = (void *)rcu_dereference(tmp->pub.proberesp_ies); 1852 - if (ies) 1853 - kfree_rcu(ies, rcu_head); 1854 - return NULL; 1855 - } 1848 + if (!new) 1849 + goto free_ies; 1856 1850 memcpy(new, tmp, sizeof(*new)); 1857 1851 new->refcount = 1; 1858 1852 INIT_LIST_HEAD(&new->hidden_list); ··· 1863 1871 list_add(&new->hidden_list, 1864 1872 &hidden->hidden_list); 1865 1873 hidden->refcount++; 1874 + 1875 + ies = (void *)rcu_dereference(new->pub.beacon_ies); 1866 1876 rcu_assign_pointer(new->pub.beacon_ies, 1867 1877 hidden->pub.beacon_ies); 1878 + if (ies) 1879 + kfree_rcu(ies, rcu_head); 1868 1880 } 1869 1881 } else { 1870 1882 /* ··· 1905 1909 bss_ref_get(rdev, found); 1906 1910 1907 1911 return found; 1912 + 1913 + free_ies: 1914 + ies = (void *)rcu_dereference(tmp->pub.beacon_ies); 1915 + if (ies) 1916 + kfree_rcu(ies, rcu_head); 1917 + ies = (void *)rcu_dereference(tmp->pub.proberesp_ies); 1918 + if (ies) 1919 + kfree_rcu(ies, rcu_head); 1920 + 1921 + return NULL; 1908 1922 } 1909 1923 1910 1924 struct cfg80211_internal_bss * ··· 2854 2848 } 2855 2849 EXPORT_SYMBOL(cfg80211_inform_bss_data); 2856 2850 2851 + static bool cfg80211_uhb_power_type_valid(const u8 *ie, 2852 + size_t ielen, 2853 + const u32 flags) 2854 + { 2855 + const struct element *tmp; 2856 + struct ieee80211_he_operation *he_oper; 2857 + 2858 + tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie, ielen); 2859 + if (tmp && tmp->datalen >= sizeof(*he_oper) + 1) { 2860 + const struct ieee80211_he_6ghz_oper *he_6ghz_oper; 2861 + 2862 + he_oper = (void *)&tmp->data[1]; 2863 + he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper); 2864 + 2865 + if (!he_6ghz_oper) 2866 + return false; 2867 + 2868 + switch (u8_get_bits(he_6ghz_oper->control, 2869 + IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) { 2870 + case IEEE80211_6GHZ_CTRL_REG_LPI_AP: 2871 + return true; 2872 + case IEEE80211_6GHZ_CTRL_REG_SP_AP: 2873 + return !(flags & IEEE80211_CHAN_NO_UHB_AFC_CLIENT); 2874 + case IEEE80211_6GHZ_CTRL_REG_VLP_AP: 2875 + return !(flags & IEEE80211_CHAN_NO_UHB_VLP_CLIENT); 2876 + } 2877 + } 2878 + return false; 2879 + } 2880 + 2857 2881 /* cfg80211_inform_bss_width_frame helper */ 2858 2882 static struct cfg80211_bss * 2859 2883 cfg80211_inform_single_bss_frame_data(struct wiphy *wiphy, ··· 2941 2905 channel = cfg80211_get_bss_channel(wiphy, variable, ielen, data->chan); 2942 2906 if (!channel) 2943 2907 return NULL; 2908 + 2909 + if (channel->band == NL80211_BAND_6GHZ && 2910 + !cfg80211_uhb_power_type_valid(variable, ielen, channel->flags)) { 2911 + data->restrict_use = 1; 2912 + data->use_for = 0; 2913 + data->cannot_use_reasons = 2914 + NL80211_BSS_CANNOT_USE_UHB_PWR_MISMATCH; 2915 + } 2944 2916 2945 2917 if (ext) { 2946 2918 const struct ieee80211_s1g_bcn_compat_ie *compat; ··· 3194 3150 3195 3151 if (new) { 3196 3152 /* to save time, update IEs for transmitting bss only */ 3197 - if (cfg80211_update_known_bss(rdev, cbss, new, false)) { 3198 - new->pub.proberesp_ies = NULL; 3199 - new->pub.beacon_ies = NULL; 3200 - } 3153 + cfg80211_update_known_bss(rdev, cbss, new, false); 3154 + new->pub.proberesp_ies = NULL; 3155 + new->pub.beacon_ies = NULL; 3201 3156 3202 3157 list_for_each_entry_safe(nontrans_bss, tmp, 3203 3158 &new->pub.nontrans_list,
+2
net/wireless/sme.c
··· 1394 1394 #endif 1395 1395 1396 1396 schedule_work(&cfg80211_disconnect_work); 1397 + 1398 + cfg80211_schedule_channels_check(wdev); 1397 1399 } 1398 1400 1399 1401 void cfg80211_disconnected(struct net_device *dev, u16 reason,