diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-03 16:29:08 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-08-03 16:29:08 -0700 |
commit | f86d1fbbe7858884d6754534a0afbb74fc30bc26 (patch) | |
tree | f61796870edefbe77d495e9d719c68af1d14275b /drivers/net/wireless/realtek | |
parent | 526942b8134cc34d25d27f95dfff98b8ce2f6fcd (diff) | |
parent | 7c6327c77d509e78bff76f2a4551fcfee851682e (diff) | |
download | linux-f86d1fbbe7858884d6754534a0afbb74fc30bc26.tar.gz |
Merge tag 'net-next-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
Pull networking changes from Paolo Abeni:
"Core:
- Refactor the forward memory allocation to better cope with memory
pressure with many open sockets, moving from a per socket cache to
a per-CPU one
- Replace rwlocks with RCU for better fairness in ping, raw sockets
and IP multicast router.
- Network-side support for IO uring zero-copy send.
- A few skb drop reason improvements, including codegen the source
file with string mapping instead of using macro magic.
- Rename reference tracking helpers to a more consistent netdev_*
schema.
- Adapt u64_stats_t type to address load/store tearing issues.
- Refine debug helper usage to reduce the log noise caused by bots.
BPF:
- Improve socket map performance, avoiding skb cloning on read
operation.
- Add support for 64 bits enum, to match types exposed by kernel.
- Introduce support for sleepable uprobes program.
- Introduce support for enum textual representation in libbpf.
- New helpers to implement synproxy with eBPF/XDP.
- Improve loop performances, inlining indirect calls when possible.
- Removed all the deprecated libbpf APIs.
- Implement new eBPF-based LSM flavor.
- Add type match support, which allow accurate queries to the eBPF
used types.
- A few TCP congetsion control framework usability improvements.
- Add new infrastructure to manipulate CT entries via eBPF programs.
- Allow for livepatch (KLP) and BPF trampolines to attach to the same
kernel function.
Protocols:
- Introduce per network namespace lookup tables for unix sockets,
increasing scalability and reducing contention.
- Preparation work for Wi-Fi 7 Multi-Link Operation (MLO) support.
- Add support to forciby close TIME_WAIT TCP sockets via user-space
tools.
- Significant performance improvement for the TLS 1.3 receive path,
both for zero-copy and not-zero-copy.
- Support for changing the initial MTPCP subflow priority/backup
status
- Introduce virtually contingus buffers for sockets over RDMA, to
cope better with memory pressure.
- Extend CAN ethtool support with timestamping capabilities
- Refactor CAN build infrastructure to allow building only the needed
features.
Driver API:
- Remove devlink mutex to allow parallel commands on multiple links.
- Add support for pause stats in distributed switch.
- Implement devlink helpers to query and flash line cards.
- New helper for phy mode to register conversion.
New hardware / drivers:
- Ethernet DSA driver for the rockchip mt7531 on BPI-R2 Pro.
- Ethernet DSA driver for the Renesas RZ/N1 A5PSW switch.
- Ethernet DSA driver for the Microchip LAN937x switch.
- Ethernet PHY driver for the Aquantia AQR113C EPHY.
- CAN driver for the OBD-II ELM327 interface.
- CAN driver for RZ/N1 SJA1000 CAN controller.
- Bluetooth: Infineon CYW55572 Wi-Fi plus Bluetooth combo device.
Drivers:
- Intel Ethernet NICs:
- i40e: add support for vlan pruning
- i40e: add support for XDP framented packets
- ice: improved vlan offload support
- ice: add support for PPPoE offload
- Mellanox Ethernet (mlx5)
- refactor packet steering offload for performance and scalability
- extend support for TC offload
- refactor devlink code to clean-up the locking schema
- support stacked vlans for bridge offloads
- use TLS objects pool to improve connection rate
- Netronome Ethernet NICs (nfp):
- extend support for IPv6 fields mangling offload
- add support for vepa mode in HW bridge
- better support for virtio data path acceleration (VDPA)
- enable TSO by default
- Microsoft vNIC driver (mana)
- add support for XDP redirect
- Others Ethernet drivers:
- bonding: add per-port priority support
- microchip lan743x: extend phy support
- Fungible funeth: support UDP segmentation offload and XDP xmit
- Solarflare EF100: add support for virtual function representors
- MediaTek SoC: add XDP support
- Mellanox Ethernet/IB switch (mlxsw):
- dropped support for unreleased H/W (XM router).
- improved stats accuracy
- unified bridge model coversion improving scalability (parts 1-6)
- support for PTP in Spectrum-2 asics
- Broadcom PHYs
- add PTP support for BCM54210E
- add support for the BCM53128 internal PHY
- Marvell Ethernet switches (prestera):
- implement support for multicast forwarding offload
- Embedded Ethernet switches:
- refactor OcteonTx MAC filter for better scalability
- improve TC H/W offload for the Felix driver
- refactor the Microchip ksz8 and ksz9477 drivers to share the
probe code (parts 1, 2), add support for phylink mac
configuration
- Other WiFi:
- Microchip wilc1000: diable WEP support and enable WPA3
- Atheros ath10k: encapsulation offload support
Old code removal:
- Neterion vxge ethernet driver: this is untouched since more than 10 years"
* tag 'net-next-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (1890 commits)
doc: sfp-phylink: Fix a broken reference
wireguard: selftests: support UML
wireguard: allowedips: don't corrupt stack when detecting overflow
wireguard: selftests: update config fragments
wireguard: ratelimiter: use hrtimer in selftest
net/mlx5e: xsk: Discard unaligned XSK frames on striding RQ
net: usb: ax88179_178a: Bind only to vendor-specific interface
selftests: net: fix IOAM test skip return code
net: usb: make USB_RTL8153_ECM non user configurable
net: marvell: prestera: remove reduntant code
octeontx2-pf: Reduce minimum mtu size to 60
net: devlink: Fix missing mutex_unlock() call
net/tls: Remove redundant workqueue flush before destroy
net: txgbe: Fix an error handling path in txgbe_probe()
net: dsa: Fix spelling mistakes and cleanup code
Documentation: devlink: add add devlink-selftests to the table of contents
dccp: put dccp_qpolicy_full() and dccp_qpolicy_push() in the same lock
net: ionic: fix error check for vlan flags in ionic_set_nic_features()
net: ice: fix error NETIF_F_HW_VLAN_CTAG_FILTER check in ice_vsi_sync_fltr()
nfp: flower: add support for tunnel offload without key ID
...
Diffstat (limited to 'drivers/net/wireless/realtek')
51 files changed, 1094 insertions, 673 deletions
diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c index 025619cd14e8..cdfe08078c57 100644 --- a/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c +++ b/drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c @@ -1300,7 +1300,7 @@ static void rtl8180_beacon_work(struct work_struct *work) goto resched; /* grab a fresh beacon */ - skb = ieee80211_beacon_get(dev, vif); + skb = ieee80211_beacon_get(dev, vif, 0); if (!skb) goto resched; @@ -1424,7 +1424,8 @@ static void rtl8187se_conf_ac_parm(struct ieee80211_hw *dev, u8 queue) } static int rtl8180_conf_tx(struct ieee80211_hw *dev, - struct ieee80211_vif *vif, u16 queue, + struct ieee80211_vif *vif, + unsigned int link_id, u16 queue, const struct ieee80211_tx_queue_params *params) { struct rtl8180_priv *priv = dev->priv; @@ -1500,7 +1501,7 @@ static void rtl8180_conf_erp(struct ieee80211_hw *dev, static void rtl8180_bss_info_changed(struct ieee80211_hw *dev, struct ieee80211_vif *vif, struct ieee80211_bss_conf *info, - u32 changed) + u64 changed) { struct rtl8180_priv *priv = dev->priv; struct rtl8180_vif *vif_priv; diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c index eb68b2d3caa1..c0f6e9c6d03e 100644 --- a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c @@ -1075,7 +1075,7 @@ static void rtl8187_beacon_work(struct work_struct *work) goto resched; /* grab a fresh beacon */ - skb = ieee80211_beacon_get(dev, vif); + skb = ieee80211_beacon_get(dev, vif, 0); if (!skb) goto resched; @@ -1251,7 +1251,7 @@ static void rtl8187_conf_erp(struct rtl8187_priv *priv, bool use_short_slot, static void rtl8187_bss_info_changed(struct ieee80211_hw *dev, struct ieee80211_vif *vif, struct ieee80211_bss_conf *info, - u32 changed) + u64 changed) { struct rtl8187_priv *priv = dev->priv; struct rtl8187_vif *vif_priv; @@ -1338,7 +1338,8 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev, } static int rtl8187_conf_tx(struct ieee80211_hw *dev, - struct ieee80211_vif *vif, u16 queue, + struct ieee80211_vif *vif, + unsigned int link_id, u16 queue, const struct ieee80211_tx_queue_params *params) { struct rtl8187_priv *priv = dev->priv; diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c index 8b2ca9e8eac6..c66f0726b253 100644 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c @@ -4558,7 +4558,7 @@ rtl8xxxu_wireless_mode(struct ieee80211_hw *hw, struct ieee80211_sta *sta) static void rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - struct ieee80211_bss_conf *bss_conf, u32 changed) + struct ieee80211_bss_conf *bss_conf, u64 changed) { struct rtl8xxxu_priv *priv = hw->priv; struct device *dev = &priv->udev->dev; @@ -4570,11 +4570,11 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, rarpt = &priv->ra_report; if (changed & BSS_CHANGED_ASSOC) { - dev_dbg(dev, "Changed ASSOC: %i!\n", bss_conf->assoc); + dev_dbg(dev, "Changed ASSOC: %i!\n", vif->cfg.assoc); rtl8xxxu_set_linktype(priv, vif->type); - if (bss_conf->assoc) { + if (vif->cfg.assoc) { u32 ramask; int sgi = 0; u8 highest_rate; @@ -4639,7 +4639,7 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, /* joinbss sequence */ rtl8xxxu_write16(priv, REG_BCN_PSR_RPT, - 0xc000 | bss_conf->aid); + 0xc000 | vif->cfg.aid); priv->fops->report_connect(priv, 0, true); } else { @@ -5405,7 +5405,7 @@ void rtl8723bu_handle_bt_inquiry(struct rtl8xxxu_priv *priv) vif = priv->vif; btcoex = &priv->bt_coex; - wifi_connected = (vif && vif->bss_conf.assoc); + wifi_connected = (vif && vif->cfg.assoc); if (!wifi_connected) { rtl8723bu_set_ps_tdma(priv, 0x8, 0x0, 0x0, 0x0, 0x0); @@ -5431,7 +5431,7 @@ void rtl8723bu_handle_bt_info(struct rtl8xxxu_priv *priv) vif = priv->vif; btcoex = &priv->bt_coex; - wifi_connected = (vif && vif->bss_conf.assoc); + wifi_connected = (vif && vif->cfg.assoc); if (wifi_connected) { u32 val32 = 0; @@ -5957,7 +5957,8 @@ exit: } static int rtl8xxxu_conf_tx(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, u16 queue, + struct ieee80211_vif *vif, + unsigned int link_id, u16 queue, const struct ieee80211_tx_queue_params *param) { struct rtl8xxxu_priv *priv = hw->priv; @@ -6657,7 +6658,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface, if (!hw) { ret = -ENOMEM; priv = NULL; - goto exit; + goto err_put_dev; } priv = hw->priv; @@ -6679,24 +6680,24 @@ static int rtl8xxxu_probe(struct usb_interface *interface, ret = rtl8xxxu_parse_usb(priv, interface); if (ret) - goto exit; + goto err_set_intfdata; ret = rtl8xxxu_identify_chip(priv); if (ret) { dev_err(&udev->dev, "Fatal - failed to identify chip\n"); - goto exit; + goto err_set_intfdata; } ret = rtl8xxxu_read_efuse(priv); if (ret) { dev_err(&udev->dev, "Fatal - failed to read EFuse\n"); - goto exit; + goto err_set_intfdata; } ret = priv->fops->parse_efuse(priv); if (ret) { dev_err(&udev->dev, "Fatal - failed to parse EFuse\n"); - goto exit; + goto err_set_intfdata; } rtl8xxxu_print_chipinfo(priv); @@ -6704,12 +6705,12 @@ static int rtl8xxxu_probe(struct usb_interface *interface, ret = priv->fops->load_firmware(priv); if (ret) { dev_err(&udev->dev, "Fatal - failed to load firmware\n"); - goto exit; + goto err_set_intfdata; } ret = rtl8xxxu_init_device(hw); if (ret) - goto exit; + goto err_set_intfdata; hw->wiphy->max_scan_ssids = 1; hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; @@ -6759,12 +6760,12 @@ static int rtl8xxxu_probe(struct usb_interface *interface, if (ret) { dev_err(&udev->dev, "%s: Failed to register: %i\n", __func__, ret); - goto exit; + goto err_set_intfdata; } return 0; -exit: +err_set_intfdata: usb_set_intfdata(interface, NULL); if (priv) { @@ -6772,9 +6773,10 @@ exit: mutex_destroy(&priv->usb_buf_mutex); mutex_destroy(&priv->h2c_mutex); } - usb_put_dev(udev); ieee80211_free_hw(hw); +err_put_dev: + usb_put_dev(udev); return ret; } diff --git a/drivers/net/wireless/realtek/rtlwifi/core.c b/drivers/net/wireless/realtek/rtlwifi/core.c index 99a1d91ced5a..ca01270944fe 100644 --- a/drivers/net/wireless/realtek/rtlwifi/core.c +++ b/drivers/net/wireless/realtek/rtlwifi/core.c @@ -671,7 +671,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed) /* *because we should back channel to - *current_network.chan in in scanning, + *current_network.chan in scanning, *So if set_chan == current_network.chan *we should set it. *because mac80211 tell us wrong bw40 @@ -982,7 +982,8 @@ static int _rtl_get_hal_qnum(u16 queue) *for rtl819x BE = 0, BK = 1, VI = 2, VO = 3 */ static int rtl_op_conf_tx(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, u16 queue, + struct ieee80211_vif *vif, + unsigned int link_id, u16 queue, const struct ieee80211_tx_queue_params *param) { struct rtl_priv *rtlpriv = rtl_priv(hw); @@ -1009,7 +1010,7 @@ static void send_beacon_frame(struct ieee80211_hw *hw, struct ieee80211_vif *vif) { struct rtl_priv *rtlpriv = rtl_priv(hw); - struct sk_buff *skb = ieee80211_beacon_get(hw, vif); + struct sk_buff *skb = ieee80211_beacon_get(hw, vif, 0); struct rtl_tcb_desc tcb_desc; if (skb) { @@ -1040,7 +1041,7 @@ EXPORT_SYMBOL_GPL(rtl_update_beacon_work_callback); static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_bss_conf *bss_conf, - u32 changed) + u64 changed) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_hal *rtlhal = rtl_hal(rtlpriv); @@ -1094,7 +1095,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_ASSOC) { u8 mstatus; - if (bss_conf->assoc) { + if (vif->cfg.assoc) { struct ieee80211_sta *sta = NULL; u8 keep_alive = 10; @@ -1111,7 +1112,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, mac->link_state = MAC80211_LINKED; mac->cnt_after_linked = 0; - mac->assoc_id = bss_conf->aid; + mac->assoc_id = vif->cfg.aid; memcpy(mac->bssid, bss_conf->bssid, ETH_ALEN); if (rtlpriv->cfg->ops->linked_set_reg) @@ -1702,7 +1703,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, rtlpriv->sec.key_len[key_idx] = 0; eth_zero_addr(mac_addr); /* - *mac80211 will delete entrys one by one, + *mac80211 will delete entries one by one, *so don't use rtl_cam_reset_all_entry *or clear all entry here. */ diff --git a/drivers/net/wireless/realtek/rtlwifi/debug.c b/drivers/net/wireless/realtek/rtlwifi/debug.c index 901cdfe3723c..0b1bc04cb6ad 100644 --- a/drivers/net/wireless/realtek/rtlwifi/debug.c +++ b/drivers/net/wireless/realtek/rtlwifi/debug.c @@ -329,8 +329,8 @@ static ssize_t rtl_debugfs_set_write_h2c(struct file *filp, tmp_len = (count > sizeof(tmp) - 1 ? sizeof(tmp) - 1 : count); - if (!buffer || copy_from_user(tmp, buffer, tmp_len)) - return count; + if (copy_from_user(tmp, buffer, tmp_len)) + return -EFAULT; tmp[tmp_len] = '\0'; @@ -340,8 +340,8 @@ static ssize_t rtl_debugfs_set_write_h2c(struct file *filp, &h2c_data[4], &h2c_data[5], &h2c_data[6], &h2c_data[7]); - if (h2c_len <= 0) - return count; + if (h2c_len == 0) + return -EINVAL; for (i = 0; i < h2c_len; i++) h2c_data_packed[i] = (u8)h2c_data[i]; diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c index 8e4c15654746..ca79f652fef3 100644 --- a/drivers/net/wireless/realtek/rtlwifi/pci.c +++ b/drivers/net/wireless/realtek/rtlwifi/pci.c @@ -1100,7 +1100,7 @@ static void _rtl_pci_prepare_bcn_tasklet(struct tasklet_struct *t) } /*NB: the beacon data buffer must be 32-bit aligned. */ - pskb = ieee80211_beacon_get(hw, mac->vif); + pskb = ieee80211_beacon_get(hw, mac->vif, 0); if (!pskb) return; hdr = rtl_get_hdr(pskb); diff --git a/drivers/net/wireless/realtek/rtlwifi/regd.c b/drivers/net/wireless/realtek/rtlwifi/regd.c index 4cf8face0bbd..0bc4afa4fda3 100644 --- a/drivers/net/wireless/realtek/rtlwifi/regd.c +++ b/drivers/net/wireless/realtek/rtlwifi/regd.c @@ -178,7 +178,7 @@ static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy, } } -/* Allows active scan scan on Ch 12 and 13 */ +/* Allows active scan on Ch 12 and 13 */ static void _rtl_reg_apply_active_scan_flags(struct wiphy *wiphy, enum nl80211_reg_initiator initiator) diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c index 4ca299c9de77..bd0b7e365edb 100644 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/hw.c @@ -1407,7 +1407,7 @@ static void _rtl92se_power_domain_init(struct ieee80211_hw *hw) tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); /* If IPS we need to turn LED on. So we not - * not disable BIT 3/7 of reg3. */ + * disable BIT 3/7 of reg3. */ if (rtlpriv->psc.rfoff_reason & (RF_CHANGE_BY_IPS | RF_CHANGE_BY_HW)) tmpu1b &= 0xFB; else diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c index e76841d3417b..76c7f3257dd3 100644 --- a/drivers/net/wireless/realtek/rtw88/bf.c +++ b/drivers/net/wireless/realtek/rtw88/bf.c @@ -67,7 +67,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, ether_addr_copy(bfee->mac_addr, bssid); bfee->role = RTW_BFEE_MU; bfee->p_aid = (bssid[5] << 1) | (bssid[4] >> 7); - bfee->aid = bss_conf->aid; + bfee->aid = vif->cfg.aid; bfinfo->bfer_mu_cnt++; rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true); diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c index 1a52ff585fbc..7cde6bcf253b 100644 --- a/drivers/net/wireless/realtek/rtw88/debug.c +++ b/drivers/net/wireless/realtek/rtw88/debug.c @@ -269,11 +269,7 @@ static int rtw_debugfs_get_rsvd_page(struct seq_file *m, void *v) for (i = 0 ; i < buf_size ; i += 8) { if (i % page_size == 0) seq_printf(m, "PAGE %d\n", (i + offset) / page_size); - seq_printf(m, "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", - *(buf + i), *(buf + i + 1), - *(buf + i + 2), *(buf + i + 3), - *(buf + i + 4), *(buf + i + 5), - *(buf + i + 6), *(buf + i + 7)); + seq_printf(m, "%8ph\n", buf + i); } vfree(buf); diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c index c3ae631c2264..4fdab0329695 100644 --- a/drivers/net/wireless/realtek/rtw88/fw.c +++ b/drivers/net/wireless/realtek/rtw88/fw.c @@ -1070,7 +1070,7 @@ static struct sk_buff *rtw_get_rsvd_page_skb(struct ieee80211_hw *hw, switch (rsvd_pkt->type) { case RSVD_BEACON: - skb_new = ieee80211_beacon_get_tim(hw, vif, &tim_offset, NULL); + skb_new = ieee80211_beacon_get_tim(hw, vif, &tim_offset, NULL, 0); rsvd_pkt->tim_offset = tim_offset; break; case RSVD_PS_POLL: diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c index 4310362dc333..c7b98a0599d5 100644 --- a/drivers/net/wireless/realtek/rtw88/mac80211.c +++ b/drivers/net/wireless/realtek/rtw88/mac80211.c @@ -355,7 +355,7 @@ static void rtw_conf_tx(struct rtw_dev *rtwdev, static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf, - u32 changed) + u64 changed) { struct rtw_dev *rtwdev = hw->priv; struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; @@ -369,12 +369,12 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_ASSOC) { rtw_vif_assoc_changed(rtwvif, conf); - if (conf->assoc) { + if (vif->cfg.assoc) { rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_FINISH); rtw_fw_download_rsvd_page(rtwdev); rtw_send_rsvd_page_h2c(rtwdev); - rtw_coex_media_status_notify(rtwdev, conf->assoc); + rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); if (rtw_bf_support) rtw_bf_assoc(rtwdev, vif, conf); rtw_store_op_chan(rtwdev); @@ -429,7 +429,9 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, mutex_unlock(&rtwdev->mutex); } -static int rtw_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +static int rtw_ops_start_ap(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *link_conf) { struct rtw_dev *rtwdev = hw->priv; struct rtw_chip_info *chip = rtwdev->chip; @@ -442,7 +444,8 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif) } static int rtw_ops_conf_tx(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, u16 ac, + struct ieee80211_vif *vif, + unsigned int link_id, u16 ac, const struct ieee80211_tx_queue_params *params) { struct rtw_dev *rtwdev = hw->priv; diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c index efabd5b1bf5b..76dc9da88f6c 100644 --- a/drivers/net/wireless/realtek/rtw88/main.c +++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -171,7 +171,7 @@ static void rtw_vif_watch_dog_iter(void *data, u8 *mac, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; if (vif->type == NL80211_IFTYPE_STATION) - if (vif->bss_conf.assoc) + if (vif->cfg.assoc) iter_data->rtwvif = rtwvif; rtw_dynamic_csi_rate(iter_data->rtwdev, rtwvif); @@ -525,8 +525,13 @@ EXPORT_SYMBOL(rtw_dump_reg); void rtw_vif_assoc_changed(struct rtw_vif *rtwvif, struct ieee80211_bss_conf *conf) { - if (conf && conf->assoc) { - rtwvif->aid = conf->aid; + struct ieee80211_vif *vif = NULL; + + if (conf) + vif = container_of(conf, struct ieee80211_vif, bss_conf); + + if (conf && vif->cfg.assoc) { + rtwvif->aid = vif->cfg.aid; rtwvif->net_type = RTW_NET_MGD_LINKED; } else { rtwvif->aid = 0; @@ -1383,9 +1388,12 @@ void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif, void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, bool hw_scan) { - struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; + struct rtw_vif *rtwvif = vif ? (struct rtw_vif *)vif->drv_priv : NULL; u32 config = 0; + if (!rtwvif) + return; + clear_bit(RTW_FLAG_SCANNING, rtwdev->flags); clear_bit(RTW_FLAG_DIG_DISABLE, rtwdev->flags); @@ -1588,13 +1596,13 @@ static void rtw_vif_smps_iter(void *data, u8 *mac, { struct rtw_dev *rtwdev = (struct rtw_dev *)data; - if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc) + if (vif->type != NL80211_IFTYPE_STATION || !vif->cfg.assoc) return; if (rtwdev->hal.txrx_1ss) - ieee80211_request_smps(vif, IEEE80211_SMPS_STATIC); + ieee80211_request_smps(vif, 0, IEEE80211_SMPS_STATIC); else - ieee80211_request_smps(vif, IEEE80211_SMPS_OFF); + ieee80211_request_smps(vif, 0, IEEE80211_SMPS_OFF); } void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool txrx_1ss) @@ -1984,6 +1992,10 @@ int rtw_core_init(struct rtw_dev *rtwdev) timer_setup(&rtwdev->tx_report.purge_timer, rtw_tx_report_purge_timer, 0); rtwdev->tx_wq = alloc_workqueue("rtw_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0); + if (!rtwdev->tx_wq) { + rtw_warn(rtwdev, "alloc_workqueue rtw_tx_wq failed\n"); + return -ENOMEM; + } INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work); INIT_DELAYED_WORK(&coex->bt_relink_work, rtw_coex_bt_relink_work); diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c index 93cce44df531..993bd6b1d723 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c @@ -2701,7 +2701,7 @@ static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = { {0x953, BIT(1), RTW_REG_DOMAIN_MAC8}, }; -struct rtw_chip_info rtw8723d_hw_spec = { +const struct rtw_chip_info rtw8723d_hw_spec = { .ops = &rtw8723d_ops, .id = RTW_CHIP_TYPE_8723D, .fw_name = "rtw88/rtw8723d_fw.bin", diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h index 41d35174a542..4641f6e047b4 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h @@ -72,6 +72,8 @@ struct rtw8723d_efuse { struct rtw8723de_efuse e; }; +extern const struct rtw_chip_info rtw8723d_hw_spec; + /* phy status page0 */ #define GET_PHY_STAT_P0_PWDB(phy_stat) \ le32_get_bits(*((__le32 *)(phy_stat) + 0x00), GENMASK(15, 8)) diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723de.c b/drivers/net/wireless/realtek/rtw88/rtw8723de.c index 2dd689441e8d..abbaafa32851 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8723de.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8723de.c @@ -5,7 +5,7 @@ #include <linux/module.h> #include <linux/pci.h> #include "pci.h" -#include "rtw8723de.h" +#include "rtw8723d.h" static const struct pci_device_id rtw_8723de_id_table[] = { { diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723de.h b/drivers/net/wireless/realtek/rtw88/rtw8723de.h deleted file mode 100644 index 2b4894846a07..000000000000 --- a/drivers/net/wireless/realtek/rtw88/rtw8723de.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2018-2019 Realtek Corporation - */ - -#ifndef __RTW_8723DE_H_ -#define __RTW_8723DE_H_ - -extern struct rtw_chip_info rtw8723d_hw_spec; - -#endif diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c index 488a7ddd507c..025262a8970e 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c @@ -1879,7 +1879,7 @@ static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = { {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, }; -struct rtw_chip_info rtw8821c_hw_spec = { +const struct rtw_chip_info rtw8821c_hw_spec = { .ops = &rtw8821c_ops, .id = RTW_CHIP_TYPE_8821C, .fw_name = "rtw88/rtw8821c_fw.bin", diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h index d9fbddd7b0f3..2698801fc35d 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h @@ -84,6 +84,8 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data) rtw_write32_mask(rtwdev, addr + 0x200, mask, data); } +extern const struct rtw_chip_info rtw8821c_hw_spec; + #define rtw_write32s_mask(rtwdev, addr, mask, data) \ do { \ BUILD_BUG_ON((addr) < 0xC00 || (addr) >= 0xD00); \ diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821ce.c b/drivers/net/wireless/realtek/rtw88/rtw8821ce.c index 56d22f9de904..f3d971feda04 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8821ce.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8821ce.c @@ -5,7 +5,7 @@ #include <linux/module.h> #include <linux/pci.h> #include "pci.h" -#include "rtw8821ce.h" +#include "rtw8821c.h" static const struct pci_device_id rtw_8821ce_id_table[] = { { diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821ce.h b/drivers/net/wireless/realtek/rtw88/rtw8821ce.h deleted file mode 100644 index 54142acca534..000000000000 --- a/drivers/net/wireless/realtek/rtw88/rtw8821ce.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2018-2019 Realtek Corporation - */ - -#ifndef __RTW_8821CE_H_ -#define __RTW_8821CE_H_ - -extern struct rtw_chip_info rtw8821c_hw_spec; - -#endif diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c index dccd722b8e62..321848870561 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c @@ -2497,7 +2497,7 @@ static struct rtw_hw_reg_offset rtw8822b_edcca_th[] = { [EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset = 0}, }; -struct rtw_chip_info rtw8822b_hw_spec = { +const struct rtw_chip_info rtw8822b_hw_spec = { .ops = &rtw8822b_ops, .id = RTW_CHIP_TYPE_8822B, .fw_name = "rtw88/rtw8822b_fw.bin", diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h index 3fff8b881854..01d3644e0c94 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h @@ -187,4 +187,6 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data) #define REG_ANTWT 0x1904 #define REG_IQKFAILMSK 0x1bf0 +extern const struct rtw_chip_info rtw8822b_hw_spec; + #endif diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822be.c b/drivers/net/wireless/realtek/rtw88/rtw8822be.c index 62ee7e62cac0..4994950776cd 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822be.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822be.c @@ -5,7 +5,7 @@ #include <linux/module.h> #include <linux/pci.h> #include "pci.h" -#include "rtw8822be.h" +#include "rtw8822b.h" static const struct pci_device_id rtw_8822be_id_table[] = { { diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822be.h b/drivers/net/wireless/realtek/rtw88/rtw8822be.h deleted file mode 100644 index 6668460d664d..000000000000 --- a/drivers/net/wireless/realtek/rtw88/rtw8822be.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2018-2019 Realtek Corporation - */ - -#ifndef __RTW_8822BE_H_ -#define __RTW_8822BE_H_ - -extern struct rtw_chip_info rtw8822b_hw_spec; - -#endif diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c index c043b5c520b9..09f9e4adcf34 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c @@ -5310,7 +5310,7 @@ static const struct rtw_reg_domain coex_info_hw_regs_8822c[] = { {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, }; -struct rtw_chip_info rtw8822c_hw_spec = { +const struct rtw_chip_info rtw8822c_hw_spec = { .ops = &rtw8822c_ops, .id = RTW_CHIP_TYPE_8822C, .fw_name = "rtw88/rtw8822c_fw.bin", diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h index 8201955e1f21..479d5d769c52 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h +++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h @@ -118,6 +118,8 @@ enum rtw8822c_dpk_one_shot_action { void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev, const struct rtw_table *tbl); +extern const struct rtw_chip_info rtw8822c_hw_spec; + #define RTW_DECL_TABLE_DPK(name) \ const struct rtw_table name ## _tbl = { \ .data = name, \ diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822ce.c b/drivers/net/wireless/realtek/rtw88/rtw8822ce.c index 3845b1333dc3..e26c6bc82936 100644 --- a/drivers/net/wireless/realtek/rtw88/rtw8822ce.c +++ b/drivers/net/wireless/realtek/rtw88/rtw8822ce.c @@ -5,7 +5,7 @@ #include <linux/module.h> #include <linux/pci.h> #include "pci.h" -#include "rtw8822ce.h" +#include "rtw8822c.h" static const struct pci_device_id rtw_8822ce_id_table[] = { { diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822ce.h b/drivers/net/wireless/realtek/rtw88/rtw8822ce.h deleted file mode 100644 index fee32d7a4504..000000000000 --- a/drivers/net/wireless/realtek/rtw88/rtw8822ce.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2018-2019 Realtek Corporation - */ - -#ifndef __RTW_8822CE_H_ -#define __RTW_8822CE_H_ - -extern struct rtw_chip_info rtw8822c_hw_spec; - -#endif diff --git a/drivers/net/wireless/realtek/rtw89/cam.c b/drivers/net/wireless/realtek/rtw89/cam.c index 8a26adeb23fb..f5301c2bbf13 100644 --- a/drivers/net/wireless/realtek/rtw89/cam.c +++ b/drivers/net/wireless/realtek/rtw89/cam.c @@ -445,15 +445,22 @@ void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev, clear_bit(addr_cam->addr_cam_idx, cam_info->addr_cam_map); } -void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) +void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev, + struct rtw89_bssid_cam_entry *bssid_cam) { struct rtw89_cam_info *cam_info = &rtwdev->cam_info; + + bssid_cam->valid = false; + clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map); +} + +void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) +{ struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam; struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam; rtw89_cam_deinit_addr_cam(rtwdev, addr_cam); - bssid_cam->valid = false; - clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map); + rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam); } void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev) @@ -539,10 +546,11 @@ static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev, return 0; } -static int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, - struct rtw89_vif *rtwvif) +int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, + struct rtw89_vif *rtwvif, + struct rtw89_bssid_cam_entry *bssid_cam, + const u8 *bssid) { - struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam; u8 bssid_cam_idx; int ret; @@ -563,7 +571,7 @@ static int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, bssid_cam->len = BSSID_CAM_ENT_SIZE; bssid_cam->offset = 0; bssid_cam->valid = true; - ether_addr_copy(bssid_cam->bssid, rtwvif->bssid); + ether_addr_copy(bssid_cam->bssid, bssid); return 0; } @@ -581,7 +589,7 @@ int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam; int ret; - ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif); + ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, rtwvif->bssid); if (ret) { rtw89_err(rtwdev, "failed to init bssid cam\n"); return ret; @@ -597,16 +605,24 @@ int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) } int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev, - struct rtw89_vif *rtwvif, u8 *cmd) + struct rtw89_vif *rtwvif, + struct rtw89_sta *rtwsta, u8 *cmd) { struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); - struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam; + struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta); u8 bss_color = vif->bss_conf.he_bss_color.color; + u8 bss_mask; + + if (vif->bss_conf.nontransmitted) + bss_mask = RTW89_BSSID_MATCH_5_BYTES; + else + bss_mask = RTW89_BSSID_MATCH_ALL; FWCMD_SET_ADDR_BSSID_IDX(cmd, bssid_cam->bssid_cam_idx); FWCMD_SET_ADDR_BSSID_OFFSET(cmd, bssid_cam->offset); FWCMD_SET_ADDR_BSSID_LEN(cmd, bssid_cam->len); FWCMD_SET_ADDR_BSSID_VALID(cmd, bssid_cam->valid); + FWCMD_SET_ADDR_BSSID_MASK(cmd, bss_mask); FWCMD_SET_ADDR_BSSID_BB_SEL(cmd, bssid_cam->phy_idx); FWCMD_SET_ADDR_BSSID_BSS_COLOR(cmd, bss_color); @@ -694,7 +710,7 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev, FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif->frm_tgt_ind); FWCMD_SET_ADDR_MACID(cmd, rtwsta ? rtwsta->mac_id : rtwvif->mac_id); if (rtwvif->net_type == RTW89_NET_TYPE_INFRA) - FWCMD_SET_ADDR_AID12(cmd, vif->bss_conf.aid & 0xfff); + FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff); else if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE) FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0); FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif->wowlan_pattern); diff --git a/drivers/net/wireless/realtek/rtw89/cam.h b/drivers/net/wireless/realtek/rtw89/cam.h index a3931d3e40d2..83c160a614e6 100644 --- a/drivers/net/wireless/realtek/rtw89/cam.h +++ b/drivers/net/wireless/realtek/rtw89/cam.h @@ -9,6 +9,9 @@ #define RTW89_SEC_CAM_LEN 20 +#define RTW89_BSSID_MATCH_ALL GENMASK(5, 0) +#define RTW89_BSSID_MATCH_5_BYTES GENMASK(4, 0) + static inline void FWCMD_SET_ADDR_IDX(void *cmd, u32 value) { le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(7, 0)); @@ -309,6 +312,11 @@ static inline void FWCMD_SET_ADDR_BSSID_BB_SEL(void *cmd, u32 value) le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(1)); } +static inline void FWCMD_SET_ADDR_BSSID_MASK(void *cmd, u32 value) +{ + le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(7, 2)); +} + static inline void FWCMD_SET_ADDR_BSSID_BSS_COLOR(void *cmd, u32 value) { le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(13, 8)); @@ -351,6 +359,12 @@ int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev, const struct rtw89_bssid_cam_entry *bssid_cam); void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev, struct rtw89_addr_cam_entry *addr_cam); +int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev, + struct rtw89_vif *rtwvif, + struct rtw89_bssid_cam_entry *bssid_cam, + const u8 *bssid); +void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev, + struct rtw89_bssid_cam_entry *bssid_cam); void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev, struct rtw89_vif *vif, struct rtw89_sta *rtwsta, @@ -360,7 +374,8 @@ void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, u8 *cmd); int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev, - struct rtw89_vif *vif, u8 *cmd); + struct rtw89_vif *rtwvif, + struct rtw89_sta *rtwsta, u8 *cmd); int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, struct ieee80211_sta *sta, diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c index a6a90572e74b..a5880a54812e 100644 --- a/drivers/net/wireless/realtek/rtw89/core.c +++ b/drivers/net/wireless/realtek/rtw89/core.c @@ -155,18 +155,19 @@ static struct ieee80211_rate rtw89_bitrates[] = { { .bitrate = 540, .hw_value = 0x0b, }, }; -u16 rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate) +bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate) { struct ieee80211_rate rate; if (unlikely(rpt_rate >= ARRAY_SIZE(rtw89_bitrates))) { - rtw89_info(rtwdev, "invalid rpt rate %d\n", rpt_rate); - return 0; + rtw89_debug(rtwdev, RTW89_DBG_UNEXP, "invalid rpt rate %d\n", rpt_rate); + return false; } rate = rtw89_bitrates[rpt_rate]; + *bitrate = rate.bitrate; - return rate.bitrate; + return true; } static struct ieee80211_supported_band rtw89_sband_2ghz = { @@ -408,18 +409,30 @@ rtw89_core_get_tx_type(struct rtw89_dev *rtwdev, static void rtw89_core_tx_update_ampdu_info(struct rtw89_dev *rtwdev, - struct rtw89_core_tx_request *tx_req, u8 tid) + struct rtw89_core_tx_request *tx_req, + enum btc_pkt_type pkt_type) { struct ieee80211_sta *sta = tx_req->sta; struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; + struct sk_buff *skb = tx_req->skb; struct rtw89_sta *rtwsta; u8 ampdu_num; + u8 tid; + + if (pkt_type == PACKET_EAPOL) { + desc_info->bk = true; + return; + } + + if (!(IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_AMPDU)) + return; if (!sta) { rtw89_warn(rtwdev, "cannot set ampdu info without sta\n"); return; } + tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; rtwsta = (struct rtw89_sta *)sta->drv_priv; ampdu_num = (u8)((rtwsta->ampdu_params[tid].agg_num ? @@ -720,8 +733,6 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev, /* enable wd_info for AMPDU */ desc_info->en_wd_info = true; - if (IEEE80211_SKB_CB(skb)->flags & IEEE80211_TX_CTL_AMPDU) - rtw89_core_tx_update_ampdu_info(rtwdev, tx_req, tid); if (IEEE80211_SKB_CB(skb)->control.hw_key) rtw89_core_tx_update_sec_key(rtwdev, tx_req); @@ -832,6 +843,7 @@ rtw89_core_tx_update_desc_info(struct rtw89_dev *rtwdev, rtw89_core_tx_update_data_info(rtwdev, tx_req); pkt_type = rtw89_core_tx_btc_spec_pkt_notify(rtwdev, tx_req); rtw89_core_tx_update_he_qos_htc(rtwdev, tx_req, pkt_type); + rtw89_core_tx_update_ampdu_info(rtwdev, tx_req, pkt_type); rtw89_core_tx_update_llc_hdr(rtwdev, desc_info, skb); break; case RTW89_CORE_TX_TYPE_FWCMD: @@ -1232,7 +1244,7 @@ static int rtw89_core_rx_process_phy_ppdu(struct rtw89_dev *rtwdev, struct rtw89_rx_phy_ppdu *phy_ppdu) { if (RTW89_GET_PHY_STS_LEN(phy_ppdu->buf) << 3 != phy_ppdu->len) { - rtw89_warn(rtwdev, "phy ppdu len mismatch\n"); + rtw89_debug(rtwdev, RTW89_DBG_UNEXP, "phy ppdu len mismatch\n"); return -EINVAL; } rtw89_core_update_phy_ppdu(phy_ppdu); @@ -1343,6 +1355,47 @@ struct rtw89_vif_rx_stats_iter_data { const u8 *bssid; }; +static void rtw89_stats_trigger_frame(struct rtw89_dev *rtwdev, + struct ieee80211_vif *vif, + struct sk_buff *skb) +{ + struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; + struct ieee80211_trigger *tf = (struct ieee80211_trigger *)skb->data; + u8 *pos, *end, type; + u16 aid; + + if (!ether_addr_equal(vif->bss_conf.bssid, tf->ta) || + rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION || + rtwvif->net_type == RTW89_NET_TYPE_NO_LINK) + return; + + type = le64_get_bits(tf->common_info, IEEE80211_TRIGGER_TYPE_MASK); + if (type != IEEE80211_TRIGGER_TYPE_BASIC) + return; + + end = (u8 *)tf + skb->len; + pos = tf->variable; + + while (end - pos >= RTW89_TF_BASIC_USER_INFO_SZ) { + aid = RTW89_GET_TF_USER_INFO_AID12(pos); + rtw89_debug(rtwdev, RTW89_DBG_TXRX, + "[TF] aid: %d, ul_mcs: %d, rua: %d\n", + aid, RTW89_GET_TF_USER_INFO_UL_MCS(pos), + RTW89_GET_TF_USER_INFO_RUA(pos)); + + if (aid == RTW89_TF_PAD) + break; + + if (aid == vif->cfg.aid) { + rtwvif->stats.rx_tf_acc++; + rtwdev->stats.rx_tf_acc++; + break; + } + + pos += RTW89_TF_BASIC_USER_INFO_SZ; + } +} + static void rtw89_vif_rx_stats_iter(void *data, u8 *mac, struct ieee80211_vif *vif) { @@ -1355,6 +1408,11 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac, struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; const u8 *bssid = iter_data->bssid; + if (ieee80211_is_trigger(hdr->frame_control)) { + rtw89_stats_trigger_frame(rtwdev, vif, skb); + return; + } + if (!ether_addr_equal(vif->bss_conf.bssid, bssid)) return; @@ -1425,11 +1483,17 @@ static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev, struct sk_buff *skb_ppdu, struct ieee80211_rx_status *rx_status) { + struct napi_struct *napi = &rtwdev->napi; + + /* In low power mode, napi isn't scheduled. Receive it to netif. */ + if (unlikely(!test_bit(NAPI_STATE_SCHED, &napi->state))) + napi = NULL; + rtw89_core_hw_to_sband_rate(rx_status); rtw89_core_rx_stats(rtwdev, phy_ppdu, desc_info, skb_ppdu); /* In low power mode, it does RX in thread context. */ local_bh_disable(); - ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, &rtwdev->napi); + ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, napi); local_bh_enable(); rtwdev->napi_budget_countdown--; } @@ -1608,7 +1672,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev, if (rtwdev->scanning && RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { - u8 chan = hal->current_channel; + u8 chan = hal->current_primary_channel; u8 band = hal->current_band_type; enum nl80211_band nl_band; @@ -1811,6 +1875,55 @@ static void rtw89_core_free_sta_pending_ba(struct rtw89_dev *rtwdev, spin_unlock_bh(&rtwdev->ba_lock); } +static void rtw89_core_free_sta_pending_forbid_ba(struct rtw89_dev *rtwdev, + struct ieee80211_sta *sta) +{ + struct rtw89_txq *rtwtxq, *tmp; + + spin_lock_bh(&rtwdev->ba_lock); + list_for_each_entry_safe(rtwtxq, tmp, &rtwdev->forbid_ba_list, list) { + struct ieee80211_txq *txq = rtw89_txq_to_txq(rtwtxq); + + if (sta == txq->sta) { + clear_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags); + list_del_init(&rtwtxq->list); + } + } + spin_unlock_bh(&rtwdev->ba_lock); +} + +static void rtw89_core_stop_tx_ba_session(struct rtw89_dev *rtwdev, + struct rtw89_txq *rtwtxq) +{ + struct ieee80211_txq *txq = rtw89_txq_to_txq(rtwtxq); + struct ieee80211_sta *sta = txq->sta; + struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); + + if (unlikely(!rtwsta) || unlikely(rtwsta->disassoc)) + return; + + if (!test_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags) || + test_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags)) + return; + + spin_lock_bh(&rtwdev->ba_lock); + if (!list_empty(&rtwtxq->list)) { + list_del_init(&rtwtxq->list); + goto out; + } + + set_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags); + + list_add_tail(&rtwtxq->list, &rtwdev->forbid_ba_list); + ieee80211_stop_tx_ba_session(sta, txq->tid); + cancel_delayed_work(&rtwdev->forbid_ba_work); + ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->forbid_ba_work, + RTW89_FORBID_BA_TIMER); + +out: + spin_unlock_bh(&rtwdev->ba_lock); +} + static void rtw89_core_txq_check_agg(struct rtw89_dev *rtwdev, struct rtw89_txq *rtwtxq, struct sk_buff *skb) @@ -1820,13 +1933,15 @@ static void rtw89_core_txq_check_agg(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta = txq->sta; struct rtw89_sta *rtwsta = sta ? (struct rtw89_sta *)sta->drv_priv : NULL; - if (unlikely(skb_get_queue_mapping(skb) == IEEE80211_AC_VO)) + if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE))) { + rtw89_core_stop_tx_ba_session(rtwdev, rtwtxq); return; + } - if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE))) + if (unlikely(!sta)) return; - if (unlikely(!sta)) + if (test_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags)) return; if (unlikely(test_bit(RTW89_TXQ_F_BLOCK_BA, &rtwtxq->flags))) @@ -1945,6 +2060,10 @@ static void rtw89_core_txq_schedule(struct rtw89_dev *rtwdev, u8 ac, bool *reinv ieee80211_return_txq(hw, txq, sched_txq); if (frame_cnt != 0) rtw89_core_tx_kick_off(rtwdev, rtw89_core_get_qsel(rtwdev, txq->tid)); + + /* bound of tx_resource could get stuck due to burst traffic */ + if (frame_cnt == tx_resource) + *reinvoke = true; } ieee80211_txq_schedule_end(hw, ac); } @@ -1982,6 +2101,20 @@ static void rtw89_core_txq_reinvoke_work(struct work_struct *w) queue_work(rtwdev->txq_wq, &rtwdev->txq_work); } +static void rtw89_forbid_ba_work(struct work_struct *w) +{ + struct rtw89_dev *rtwdev = container_of(w, struct rtw89_dev, + forbid_ba_work.work); + struct rtw89_txq *rtwtxq, *tmp; + + spin_lock_bh(&rtwdev->ba_lock); + list_for_each_entry_safe(rtwtxq, tmp, &rtwdev->forbid_ba_list, list) { + clear_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags); + list_del_init(&rtwtxq->list); + } + spin_unlock_bh(&rtwdev->ba_lock); +} + static enum rtw89_tfc_lv rtw89_get_traffic_level(struct rtw89_dev *rtwdev, u32 throughput, u64 cnt) { @@ -2023,6 +2156,8 @@ static bool rtw89_traffic_stats_calc(struct rtw89_dev *rtwdev, stats->rx_unicast = 0; stats->tx_cnt = 0; stats->rx_cnt = 0; + stats->rx_tf_periodic = stats->rx_tf_acc; + stats->rx_tf_acc = 0; if (tx_tfc_lv != stats->tx_tfc_lv || rx_tfc_lv != stats->rx_tfc_lv) return true; @@ -2238,13 +2373,13 @@ int rtw89_core_sta_add(struct rtw89_dev *rtwdev, ewma_rssi_init(&rtwsta->avg_rssi); - if (vif->type == NL80211_IFTYPE_STATION) { + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { /* for station mode, assign the mac_id from itself */ rtwsta->mac_id = rtwvif->mac_id; rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, BTC_ROLE_MSTS_STA_CONN_START); rtw89_chip_rfk_channel(rtwdev); - } else if (vif->type == NL80211_IFTYPE_AP) { + } else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { rtwsta->mac_id = rtw89_core_acquire_bit_map(rtwdev->mac_id_map, RTW89_MAX_MAC_ID_NUM); } @@ -2275,10 +2410,13 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev, rtw89_mac_bf_monitor_calc(rtwdev, sta, true); rtw89_mac_bf_disassoc(rtwdev, vif, sta); rtw89_core_free_sta_pending_ba(rtwdev, sta); - if (vif->type == NL80211_IFTYPE_AP) + rtw89_core_free_sta_pending_forbid_ba(rtwdev, sta); + if (vif->type == NL80211_IFTYPE_AP || sta->tdls) rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam); + if (sta->tdls) + rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta->bssid_cam); - if (vif->type == NL80211_IFTYPE_STATION) + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) rtw89_vif_type_mapping(vif, false); ret = rtw89_fw_h2c_assoc_cmac_tbl(rtwdev, vif, sta); @@ -2293,7 +2431,7 @@ int rtw89_core_sta_disconnect(struct rtw89_dev *rtwdev, return ret; } - if (vif->type == NL80211_IFTYPE_AP) { + if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta, RTW89_ROLE_REMOVE); if (ret) { rtw89_warn(rtwdev, "failed to send h2c role info\n"); @@ -2317,9 +2455,10 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev, { struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; + struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta); int ret; - if (vif->type == NL80211_IFTYPE_AP) { + if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { ret = rtw89_mac_set_macid_pause(rtwdev, rtwsta->mac_id, false); if (ret) { rtw89_warn(rtwdev, "failed to send h2c macid pause\n"); @@ -2332,7 +2471,15 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev, return ret; } - ret = rtw89_cam_init_addr_cam(rtwdev, &rtwsta->addr_cam, &rtwvif->bssid_cam); + if (sta->tdls) { + ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, sta->addr); + if (ret) { + rtw89_warn(rtwdev, "failed to send h2c init bssid cam for TDLS\n"); + return ret; + } + } + + ret = rtw89_cam_init_addr_cam(rtwdev, &rtwsta->addr_cam, bssid_cam); if (ret) { rtw89_warn(rtwdev, "failed to send h2c init addr cam\n"); return ret; @@ -2369,7 +2516,7 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev, rtw89_mac_bf_assoc(rtwdev, vif, sta); rtw89_mac_bf_monitor_calc(rtwdev, sta, false); - if (vif->type == NL80211_IFTYPE_STATION) { + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, BTC_ROLE_MSTS_STA_CONN_END); rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template); @@ -2385,10 +2532,10 @@ int rtw89_core_sta_remove(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; - if (vif->type == NL80211_IFTYPE_STATION) + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, BTC_ROLE_MSTS_STA_DIS_CONN); - else if (vif->type == NL80211_IFTYPE_AP) + else if (vif->type == NL80211_IFTYPE_AP || sta->tdls) rtw89_core_release_bit_map(rtwdev->mac_id_map, rtwsta->mac_id); return 0; @@ -2776,6 +2923,7 @@ void rtw89_core_stop(struct rtw89_dev *rtwdev) cancel_delayed_work_sync(&rtwdev->coex_bt_devinfo_work); cancel_delayed_work_sync(&rtwdev->coex_rfk_chk_work); cancel_delayed_work_sync(&rtwdev->cfo_track_work); + cancel_delayed_work_sync(&rtwdev->forbid_ba_work); mutex_lock(&rtwdev->mutex); @@ -2795,6 +2943,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev) u8 band; INIT_LIST_HEAD(&rtwdev->ba_list); + INIT_LIST_HEAD(&rtwdev->forbid_ba_list); INIT_LIST_HEAD(&rtwdev->rtwvifs_list); INIT_LIST_HEAD(&rtwdev->early_h2c_list); for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) { @@ -2810,6 +2959,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev) INIT_DELAYED_WORK(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work); INIT_DELAYED_WORK(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work); INIT_DELAYED_WORK(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work); + INIT_DELAYED_WORK(&rtwdev->forbid_ba_work, rtw89_forbid_ba_work); rtwdev->txq_wq = alloc_workqueue("rtw89_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0); spin_lock_init(&rtwdev->ba_lock); spin_lock_init(&rtwdev->rpwm_lock); @@ -2875,7 +3025,10 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, void rtw89_core_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, bool hw_scan) { - struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; + struct rtw89_vif *rtwvif = vif ? (struct rtw89_vif *)vif->drv_priv : NULL; + + if (!rtwvif) + return; ether_addr_copy(rtwvif->mac_addr, vif->addr); rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL); @@ -3008,12 +3161,15 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev) ieee80211_hw_set(hw, SUPPORTS_PS); ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS); ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS); + ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID); hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP); hw->wiphy->available_antennas_tx = BIT(rtwdev->chip->rf_path_num) - 1; hw->wiphy->available_antennas_rx = BIT(rtwdev->chip->rf_path_num) - 1; + hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | + WIPHY_FLAG_TDLS_EXTERNAL_SETUP; hw->wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR; hw->wiphy->max_scan_ssids = RTW89_SCANOFLD_MAX_SSID; diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h index e8a77225a90f..7a9d6f5d8a51 100644 --- a/drivers/net/wireless/realtek/rtw89/core.h +++ b/drivers/net/wireless/realtek/rtw89/core.h @@ -29,6 +29,7 @@ extern const struct ieee80211_ops rtw89_ops; #define INV_RF_DATA 0xffffffff #define RTW89_TRACK_WORK_PERIOD round_jiffies_relative(HZ * 2) +#define RTW89_FORBID_BA_TIMER round_jiffies_relative(HZ * 4) #define CFO_TRACK_MAX_USER 64 #define MAX_RSSI 110 #define RSSI_FACTOR 1 @@ -55,6 +56,16 @@ enum htc_om_channel_width { #define RTW89_HTC_MASK_HTC_OM_DL_MU_MIMO_RR BIT(16) #define RTW89_HTC_MASK_HTC_OM_UL_MU_DATA_DIS BIT(17) +#define RTW89_TF_PAD GENMASK(11, 0) +#define RTW89_TF_BASIC_USER_INFO_SZ 6 + +#define RTW89_GET_TF_USER_INFO_AID12(data) \ + le32_get_bits(*((const __le32 *)(data)), GENMASK(11, 0)) +#define RTW89_GET_TF_USER_INFO_RUA(data) \ + le32_get_bits(*((const __le32 *)(data)), GENMASK(19, 12)) +#define RTW89_GET_TF_USER_INFO_UL_MCS(data) \ + le32_get_bits(*((const __le32 *)(data)), GENMASK(24, 21)) + enum rtw89_subband { RTW89_CH_2G = 0, RTW89_CH_5G_BAND_1 = 1, @@ -134,6 +145,7 @@ enum rtw89_core_rx_type { enum rtw89_txq_flags { RTW89_TXQ_F_AMPDU = 0, RTW89_TXQ_F_BLOCK_BA = 1, + RTW89_TXQ_F_FORBID_BA = 2, }; enum rtw89_net_type { @@ -943,6 +955,10 @@ struct rtw89_traffic_stats { u32 rx_throughput; u32 tx_throughput_raw; u32 rx_throughput_raw; + + u32 rx_tf_acc; + u32 rx_tf_periodic; + enum rtw89_tfc_lv tx_tfc_lv; enum rtw89_tfc_lv rx_tfc_lv; struct ewma_tp tx_ewma_tp; @@ -1961,7 +1977,8 @@ struct rtw89_sta { struct ieee80211_rx_status rx_status; u16 rx_hw_rate; __le32 htc_template; - struct rtw89_addr_cam_entry addr_cam; /* AP mode only */ + struct rtw89_addr_cam_entry addr_cam; /* AP mode or TDLS peer only */ + struct rtw89_bssid_cam_entry bssid_cam; /* TDLS peer only */ bool use_cfg_mask; struct cfg80211_bitrate_mask mask; @@ -2550,9 +2567,24 @@ enum rtw89_sar_sources { RTW89_SAR_SOURCE_NR, }; +enum rtw89_sar_subband { + RTW89_SAR_2GHZ_SUBBAND, + RTW89_SAR_5GHZ_SUBBAND_1_2, /* U-NII-1 and U-NII-2 */ + RTW89_SAR_5GHZ_SUBBAND_2_E, /* U-NII-2-Extended */ + RTW89_SAR_5GHZ_SUBBAND_3, /* U-NII-3 */ + RTW89_SAR_6GHZ_SUBBAND_5_L, /* U-NII-5 lower part */ + RTW89_SAR_6GHZ_SUBBAND_5_H, /* U-NII-5 higher part */ + RTW89_SAR_6GHZ_SUBBAND_6, /* U-NII-6 */ + RTW89_SAR_6GHZ_SUBBAND_7_L, /* U-NII-7 lower part */ + RTW89_SAR_6GHZ_SUBBAND_7_H, /* U-NII-7 higher part */ + RTW89_SAR_6GHZ_SUBBAND_8, /* U-NII-8 */ + + RTW89_SAR_SUBBAND_NR, +}; + struct rtw89_sar_cfg_common { - bool set[RTW89_SUBBAND_NR]; - s32 cfg[RTW89_SUBBAND_NR]; + bool set[RTW89_SAR_SUBBAND_NR]; + s32 cfg[RTW89_SAR_SUBBAND_NR]; }; struct rtw89_sar_info { @@ -2646,6 +2678,10 @@ struct rtw89_lck_info { u8 thermal[RF_PATH_MAX]; }; +struct rtw89_rx_dck_info { + u8 thermal[RF_PATH_MAX]; +}; + struct rtw89_iqk_info { bool lok_cor_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR]; bool lok_fin_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR]; @@ -2776,13 +2812,20 @@ enum rtw89_multi_cfo_mode { enum rtw89_phy_cfo_status { RTW89_PHY_DCFO_STATE_NORMAL = 0, RTW89_PHY_DCFO_STATE_ENHANCE = 1, + RTW89_PHY_DCFO_STATE_HOLD = 2, RTW89_PHY_DCFO_STATE_MAX }; +enum rtw89_phy_cfo_ul_ofdma_acc_mode { + RTW89_CFO_UL_OFDMA_ACC_DISABLE = 0, + RTW89_CFO_UL_OFDMA_ACC_ENABLE = 1 +}; + struct rtw89_cfo_tracking_info { u16 cfo_timer_ms; bool cfo_trig_by_timer_en; enum rtw89_phy_cfo_status phy_cfo_status; + enum rtw89_phy_cfo_ul_ofdma_acc_mode cfo_ul_ofdma_acc_mode; u8 phy_cfo_trk_cnt; bool is_adjust; enum rtw89_multi_cfo_mode rtw89_multi_cfo_mode; @@ -3096,10 +3139,12 @@ struct rtw89_dev { struct workqueue_struct *txq_wq; struct work_struct txq_work; struct delayed_work txq_reinvoke_work; - /* used to protect ba_list */ + /* used to protect ba_list and forbid_ba_list */ spinlock_t ba_lock; /* txqs to setup ba session */ struct list_head ba_list; + /* txqs to forbid ba session */ + struct list_head forbid_ba_list; struct work_struct ba_work; /* used to protect rpwm */ spinlock_t rpwm_lock; @@ -3125,6 +3170,7 @@ struct rtw89_dev { struct rtw89_dpk_info dpk; struct rtw89_mcc_info mcc; struct rtw89_lck_info lck; + struct rtw89_rx_dck_info rx_dck; bool is_tssi_mode[RF_PATH_MAX]; bool is_bt_iqk_timeout; @@ -3145,6 +3191,7 @@ struct rtw89_dev { struct delayed_work coex_bt_devinfo_work; struct delayed_work coex_rfk_chk_work; struct delayed_work cfo_track_work; + struct delayed_work forbid_ba_work; struct rtw89_ppdu_sts_info ppdu_sts; u8 total_sta_assoc; bool scanning; @@ -3517,12 +3564,29 @@ static inline struct rtw89_addr_cam_entry *rtw89_get_addr_cam_of(struct rtw89_vif *rtwvif, struct rtw89_sta *rtwsta) { - if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE && rtwsta) - return &rtwsta->addr_cam; + if (rtwsta) { + struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta); + + if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls) + return &rtwsta->addr_cam; + } return &rtwvif->addr_cam; } static inline +struct rtw89_bssid_cam_entry *rtw89_get_bssid_cam_of(struct rtw89_vif *rtwvif, + struct rtw89_sta *rtwsta) +{ + if (rtwsta) { + struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta); + + if (sta->tdls) + return &rtwsta->bssid_cam; + } + return &rtwvif->bssid_cam; +} + +static inline void rtw89_chip_set_channel_prepare(struct rtw89_dev *rtwdev, struct rtw89_channel_help_params *p) { @@ -3674,7 +3738,7 @@ void rtw89_chip_cfg_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; const struct rtw89_chip_info *chip = rtwdev->chip; - if (!vif->bss_conf.he_support || !vif->bss_conf.assoc) + if (!vif->bss_conf.he_support || !vif->cfg.assoc) return; if (chip->ops->set_txpwr_ul_tb_offset) @@ -3850,7 +3914,7 @@ int rtw89_core_acquire_sta_ba_entry(struct rtw89_sta *rtwsta, u8 tid, u8 *cam_id int rtw89_core_release_sta_ba_entry(struct rtw89_sta *rtwsta, u8 tid, u8 *cam_idx); void rtw89_vif_type_mapping(struct ieee80211_vif *vif, bool assoc); int rtw89_chip_info_setup(struct rtw89_dev *rtwdev); -u16 rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate); +bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate); int rtw89_regd_init(struct rtw89_dev *rtwdev, void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request)); void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request); diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c index 7820bc3ab3b4..829c61da99bb 100644 --- a/drivers/net/wireless/realtek/rtw89/debug.c +++ b/drivers/net/wireless/realtek/rtw89/debug.c @@ -2376,7 +2376,8 @@ static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v) seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d), RX: %u [%u] Mbps (lv: %d)\n", stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv, stats->rx_throughput, stats->rx_throughput_raw, stats->rx_tfc_lv); - seq_printf(m, "Beacon: %u\n", pkt_stat->beacon_nr); + seq_printf(m, "Beacon: %u, TF: %u\n", pkt_stat->beacon_nr, + stats->rx_tf_periodic); seq_printf(m, "Avg packet length: TX=%u, RX=%u\n", stats->tx_avg_len, stats->rx_avg_len); @@ -2437,7 +2438,8 @@ static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta) struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; struct seq_file *m = (struct seq_file *)data; - seq_printf(m, "STA [%d] %pM\n", rtwsta->mac_id, sta->addr); + seq_printf(m, "STA [%d] %pM %s\n", rtwsta->mac_id, sta->addr, + sta->tdls ? "(TDLS)" : ""); rtw89_dump_addr_cam(m, &rtwsta->addr_cam); } diff --git a/drivers/net/wireless/realtek/rtw89/debug.h b/drivers/net/wireless/realtek/rtw89/debug.h index de72155ad1fe..6176152dbf6b 100644 --- a/drivers/net/wireless/realtek/rtw89/debug.h +++ b/drivers/net/wireless/realtek/rtw89/debug.h @@ -24,6 +24,9 @@ enum rtw89_debug_mask { RTW89_DBG_BTC = BIT(13), RTW89_DBG_BF = BIT(14), RTW89_DBG_HW_SCAN = BIT(15), + RTW89_DBG_SAR = BIT(16), + + RTW89_DBG_UNEXP = BIT(31), }; enum rtw89_debug_mac_reg_sel { diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c index 4718aced1428..6473015a6b2a 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.c +++ b/drivers/net/wireless/realtek/rtw89/fw.c @@ -579,7 +579,7 @@ int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, } skb_put(skb, H2C_CAM_LEN); rtw89_cam_fill_addr_cam_info(rtwdev, rtwvif, rtwsta, scan_mac_addr, skb->data); - rtw89_cam_fill_bssid_cam_info(rtwdev, rtwvif, skb->data); + rtw89_cam_fill_bssid_cam_info(rtwdev, rtwvif, rtwsta, skb->data); rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, H2C_CAT_MAC, @@ -1043,7 +1043,8 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev, u16 tim_offset; int bcn_total_len; - skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset, NULL); + skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset, + NULL, 0); if (!skb_beacon) { rtw89_err(rtwdev, "failed to get beacon skb\n"); return -ENOMEM; @@ -2257,7 +2258,7 @@ static int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev, list_add_tail(&ch_info->list, &chan_list); off_chan_time += ch_info->period; } - rtw89_fw_h2c_scan_list_offload(rtwdev, list_len, &chan_list); + ret = rtw89_fw_h2c_scan_list_offload(rtwdev, list_len, &chan_list); out: list_for_each_entry_safe(ch_info, tmp, &chan_list, list) { @@ -2339,6 +2340,9 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, rtwvif->scan_req = NULL; rtwvif->scan_ies = NULL; rtwdev->scan_info.scanning_vif = NULL; + + if (rtwvif->net_type != RTW89_NET_TYPE_NO_LINK) + rtw89_store_op_chan(rtwdev, false); } void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif) @@ -2365,20 +2369,27 @@ int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, if (ret) goto out; } - rtw89_fw_h2c_scan_offload(rtwdev, &opt, rtwvif); + ret = rtw89_fw_h2c_scan_offload(rtwdev, &opt, rtwvif); out: return ret; } -void rtw89_store_op_chan(struct rtw89_dev *rtwdev) +void rtw89_store_op_chan(struct rtw89_dev *rtwdev, bool backup) { struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; struct rtw89_hal *hal = &rtwdev->hal; - scan_info->op_pri_ch = hal->current_primary_channel; - scan_info->op_chan = hal->current_channel; - scan_info->op_bw = hal->current_band_width; - scan_info->op_band = hal->current_band_type; + if (backup) { + scan_info->op_pri_ch = hal->current_primary_channel; + scan_info->op_chan = hal->current_channel; + scan_info->op_bw = hal->current_band_width; + scan_info->op_band = hal->current_band_type; + } else { + hal->current_primary_channel = scan_info->op_pri_ch; + hal->current_channel = scan_info->op_chan; + hal->current_band_width = scan_info->op_bw; + hal->current_band_type = scan_info->op_band; + } } #define H2C_FW_CPU_EXCEPTION_LEN 4 diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h index 95a55c4213db..e75ad22aa85d 100644 --- a/drivers/net/wireless/realtek/rtw89/fw.h +++ b/drivers/net/wireless/realtek/rtw89/fw.h @@ -2633,17 +2633,14 @@ int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev, struct rtw89_mac_c2h_info *c2h_info); int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable); void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev); -void rtw89_store_op_chan(struct rtw89_dev *rtwdev); +void rtw89_store_op_chan(struct rtw89_dev *rtwdev, bool backup); void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, struct ieee80211_scan_request *req); void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, bool aborted); int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, bool enable); -void rtw89_hw_scan_status_report(struct rtw89_dev *rtwdev, struct sk_buff *skb); -void rtw89_hw_scan_chan_switch(struct rtw89_dev *rtwdev, struct sk_buff *skb); void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif); -void rtw89_store_op_chan(struct rtw89_dev *rtwdev); int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev); #endif diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c index 3cf892912c1d..93124b815825 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.c +++ b/drivers/net/wireless/realtek/rtw89/mac.c @@ -3681,17 +3681,20 @@ rtw89_mac_c2h_scanofld_rsp(struct rtw89_dev *rtwdev, struct sk_buff *c2h, rtw89_hw_scan_complete(rtwdev, vif, false); break; case RTW89_SCAN_ENTER_CH_NOTIFY: - if (rtw89_is_op_chan(rtwdev, band, chan)) + hal->prev_band_type = hal->current_band_type; + hal->current_band_type = band; + hal->prev_primary_channel = hal->current_primary_channel; + hal->current_primary_channel = chan; + hal->current_channel = chan; + hal->current_band_width = RTW89_CHANNEL_WIDTH_20; + if (rtw89_is_op_chan(rtwdev, band, chan)) { + rtw89_store_op_chan(rtwdev, false); ieee80211_wake_queues(rtwdev->hw); + } break; default: return; } - - hal->prev_band_type = hal->current_band_type; - hal->prev_primary_channel = hal->current_channel; - hal->current_channel = chan; - hal->current_band_type = band; } static void diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h index 9f511c8d8a37..f66619354734 100644 --- a/drivers/net/wireless/realtek/rtw89/mac.h +++ b/drivers/net/wireless/realtek/rtw89/mac.h @@ -666,6 +666,7 @@ enum mac_ax_err_info { MAC_AX_ERR_L2_ERR_APB_BBRF_TO_RX4281 = 0x2360, MAC_AX_ERR_L2_ERR_APB_BBRF_TO_OTHERS = 0x2370, MAC_AX_ERR_L2_RESET_DONE = 0x2400, + MAC_AX_ERR_L2_ERR_WDT_TIMEOUT_INT = 0x2599, MAC_AX_ERR_CPU_EXCEPTION = 0x3000, MAC_AX_ERR_ASSERTION = 0x4000, MAC_AX_GET_ERR_MAX, diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c index f24e4a208376..cef27e781ae2 100644 --- a/drivers/net/wireless/realtek/rtw89/mac80211.c +++ b/drivers/net/wireless/realtek/rtw89/mac80211.c @@ -336,7 +336,7 @@ static void rtw89_station_mode_sta_assoc(struct rtw89_dev *rtwdev, static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf, - u32 changed) + u64 changed) { struct rtw89_dev *rtwdev = hw->priv; struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; @@ -345,12 +345,12 @@ static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw, rtw89_leave_ps_mode(rtwdev); if (changed & BSS_CHANGED_ASSOC) { - if (conf->assoc) { + if (vif->cfg.assoc) { rtw89_station_mode_sta_assoc(rtwdev, vif, conf); rtw89_phy_set_bss_color(rtwdev, vif); rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, vif); rtw89_mac_port_update(rtwdev, rtwvif); - rtw89_store_op_chan(rtwdev); + rtw89_store_op_chan(rtwdev, true); } else { /* Abort ongoing scan if cancel_scan isn't issued * when disconnected by peer @@ -381,7 +381,9 @@ static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw, mutex_unlock(&rtwdev->mutex); } -static int rtw89_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +static int rtw89_ops_start_ap(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *link_conf) { struct rtw89_dev *rtwdev = hw->priv; struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; @@ -401,7 +403,8 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif } static -void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_bss_conf *link_conf) { struct rtw89_dev *rtwdev = hw->priv; struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; @@ -425,7 +428,8 @@ static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, } static int rtw89_ops_conf_tx(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, u16 ac, + struct ieee80211_vif *vif, + unsigned int link_id, u16 ac, const struct ieee80211_tx_queue_params *params) { struct rtw89_dev *rtwdev = hw->priv; @@ -454,7 +458,7 @@ static int __rtw89_ops_sta_state(struct ieee80211_hw *hw, if (old_state == IEEE80211_STA_AUTH && new_state == IEEE80211_STA_ASSOC) { - if (vif->type == NL80211_IFTYPE_STATION) + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) return 0; /* defer to bss_info_changed to have vif info */ return rtw89_core_sta_assoc(rtwdev, vif, sta); } diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c index 0ef7821b2e0f..c68fec9eb5a6 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.c +++ b/drivers/net/wireless/realtek/rtw89/pci.c @@ -228,7 +228,8 @@ static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev, if (fs) { if (new) { - rtw89_err(rtwdev, "skb should not be ready before first segment start\n"); + rtw89_debug(rtwdev, RTW89_DBG_UNEXP, + "skb should not be ready before first segment start\n"); goto err_sync_device; } if (desc_info->ready) { @@ -251,7 +252,7 @@ static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev, } else { offset = sizeof(struct rtw89_pci_rxbd_info); if (!new) { - rtw89_warn(rtwdev, "no last skb\n"); + rtw89_debug(rtwdev, RTW89_DBG_UNEXP, "no last skb\n"); goto err_sync_device; } } @@ -605,7 +606,7 @@ static void rtw89_pci_isr_rxd_unavail(struct rtw89_dev *rtwdev, hw_idx_next = (hw_idx + 1) % bd_ring->len; if (hw_idx_next == host_idx) - rtw89_warn(rtwdev, "%d RXD unavailable\n", i); + rtw89_debug(rtwdev, RTW89_DBG_UNEXP, "%d RXD unavailable\n", i); rtw89_debug(rtwdev, RTW89_DBG_TXRX, "%d RXD unavailable, idx=0x%08x, len=%d\n", @@ -738,6 +739,9 @@ static irqreturn_t rtw89_pci_interrupt_threadfn(int irq, void *dev) if (unlikely(isrs.halt_c2h_isrs & B_AX_HALT_C2H_INT_EN)) rtw89_ser_notify(rtwdev, rtw89_mac_get_err_status(rtwdev)); + if (unlikely(isrs.halt_c2h_isrs & B_AX_WDT_TIMEOUT_INT_EN)) + rtw89_ser_notify(rtwdev, MAC_AX_ERR_L2_ERR_WDT_TIMEOUT_INT); + if (unlikely(rtwpci->under_recovery)) goto enable_intr; @@ -948,9 +952,10 @@ static u32 __rtw89_pci_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev, if (wd_cnt == 0 || bd_cnt == 0) { cnt = rtw89_pci_rxbd_recalc(rtwdev, rx_ring); - if (!cnt) + if (cnt) + rtw89_pci_release_tx(rtwdev, rx_ring, cnt); + else if (wd_cnt == 0) goto out_unlock; - rtw89_pci_release_tx(rtwdev, rx_ring, cnt); bd_cnt = rtw89_pci_get_avail_txbd_num(tx_ring); if (bd_cnt == 0) @@ -961,7 +966,9 @@ static u32 __rtw89_pci_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev, wd_cnt = wd_ring->curr_num; min_cnt = min(bd_cnt, wd_cnt); if (min_cnt == 0) - rtw89_warn(rtwdev, "still no tx resource after reclaim\n"); + rtw89_debug(rtwdev, rtwpci->low_power ? RTW89_DBG_TXRX : RTW89_DBG_UNEXP, + "still no tx resource after reclaim: wd_cnt=%d bd_cnt=%d\n", + wd_cnt, bd_cnt); out_unlock: spin_unlock_bh(&rtwpci->trx_lock); @@ -3104,7 +3111,7 @@ void rtw89_pci_config_intr_mask(struct rtw89_dev *rtwdev) rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN | 0; if (rtwpci->under_recovery) { - rtwpci->intrs[0] = 0; + rtwpci->intrs[0] = B_AX_HS0ISR_IND_INT_EN; rtwpci->intrs[1] = 0; } else { rtwpci->intrs[0] = B_AX_TXDMA_STUCK_INT_EN | @@ -3126,7 +3133,7 @@ static void rtw89_pci_recovery_intr_mask_v1(struct rtw89_dev *rtwdev) struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; rtwpci->ind_intrs = B_AX_HS0ISR_IND_INT_EN; - rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN; + rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN | B_AX_WDT_TIMEOUT_INT_EN; rtwpci->intrs[0] = 0; rtwpci->intrs[1] = 0; } @@ -3138,7 +3145,7 @@ static void rtw89_pci_default_intr_mask_v1(struct rtw89_dev *rtwdev) rtwpci->ind_intrs = B_AX_HCI_AXIDMA_INT_EN | B_AX_HS1ISR_IND_INT_EN | B_AX_HS0ISR_IND_INT_EN; - rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN; + rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN | B_AX_WDT_TIMEOUT_INT_EN; rtwpci->intrs[0] = B_AX_TXDMA_STUCK_INT_EN | B_AX_RXDMA_INT_EN | B_AX_RXP1DMA_INT_EN | @@ -3155,7 +3162,7 @@ static void rtw89_pci_low_power_intr_mask_v1(struct rtw89_dev *rtwdev) rtwpci->ind_intrs = B_AX_HS1ISR_IND_INT_EN | B_AX_HS0ISR_IND_INT_EN; - rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN; + rtwpci->halt_c2h_intrs = B_AX_HALT_C2H_INT_EN | B_AX_WDT_TIMEOUT_INT_EN; rtwpci->intrs[0] = 0; rtwpci->intrs[1] = B_AX_GPIO18_INT_EN; } diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h index bb585ed19190..a118647213e3 100644 --- a/drivers/net/wireless/realtek/rtw89/pci.h +++ b/drivers/net/wireless/realtek/rtw89/pci.h @@ -94,6 +94,7 @@ /* Interrupts */ #define R_AX_HIMR0 0x01A0 +#define B_AX_WDT_TIMEOUT_INT_EN BIT(22) #define B_AX_HALT_C2H_INT_EN BIT(21) #define R_AX_HISR0 0x01A4 diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c index 762cdba9d3cf..1532c0a6bbc4 100644 --- a/drivers/net/wireless/realtek/rtw89/phy.c +++ b/drivers/net/wireless/realtek/rtw89/phy.c @@ -1918,21 +1918,29 @@ static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta) struct rtw89_ra_report *ra_report = &rtwsta->ra_report; struct sk_buff *c2h = ra_data->c2h; u8 mode, rate, bw, giltf, mac_id; + u16 legacy_bitrate; + bool valid; mac_id = RTW89_GET_PHY_C2H_RA_RPT_MACID(c2h->data); if (mac_id != rtwsta->mac_id) return; - memset(ra_report, 0, sizeof(*ra_report)); - rate = RTW89_GET_PHY_C2H_RA_RPT_MCSNSS(c2h->data); bw = RTW89_GET_PHY_C2H_RA_RPT_BW(c2h->data); giltf = RTW89_GET_PHY_C2H_RA_RPT_GILTF(c2h->data); mode = RTW89_GET_PHY_C2H_RA_RPT_MD_SEL(c2h->data); + if (mode == RTW89_RA_RPT_MODE_LEGACY) { + valid = rtw89_ra_report_to_bitrate(rtwdev, rate, &legacy_bitrate); + if (!valid) + return; + } + + memset(ra_report, 0, sizeof(*ra_report)); + switch (mode) { case RTW89_RA_RPT_MODE_LEGACY: - ra_report->txrate.legacy = rtw89_ra_report_to_bitrate(rtwdev, rate); + ra_report->txrate.legacy = legacy_bitrate; break; case RTW89_RA_RPT_MODE_HT: ra_report->txrate.flags |= RATE_INFO_FLAGS_MCS; @@ -2151,6 +2159,7 @@ static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev) cfo->cfo_trig_by_timer_en = false; cfo->phy_cfo_trk_cnt = 0; cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; + cfo->cfo_ul_ofdma_acc_mode = RTW89_CFO_UL_OFDMA_ACC_ENABLE; } static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev, @@ -2419,6 +2428,13 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev) { struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; struct rtw89_traffic_stats *stats = &rtwdev->stats; + bool is_ul_ofdma = false, ofdma_acc_en = false; + + if (stats->rx_tf_periodic > CFO_TF_CNT_TH) + is_ul_ofdma = true; + if (cfo->cfo_ul_ofdma_acc_mode == RTW89_CFO_UL_OFDMA_ACC_ENABLE && + is_ul_ofdma) + ofdma_acc_en = true; switch (cfo->phy_cfo_status) { case RTW89_PHY_DCFO_STATE_NORMAL: @@ -2430,16 +2446,26 @@ void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev) } break; case RTW89_PHY_DCFO_STATE_ENHANCE: - if (cfo->phy_cfo_trk_cnt >= CFO_PERIOD_CNT) { + if (stats->tx_throughput <= CFO_TP_LOWER) + cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; + else if (ofdma_acc_en && + cfo->phy_cfo_trk_cnt >= CFO_PERIOD_CNT) + cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_HOLD; + else + cfo->phy_cfo_trk_cnt++; + + if (cfo->phy_cfo_status == RTW89_PHY_DCFO_STATE_NORMAL) { cfo->phy_cfo_trk_cnt = 0; cfo->cfo_trig_by_timer_en = false; } - if (cfo->cfo_trig_by_timer_en == 1) - cfo->phy_cfo_trk_cnt++; + break; + case RTW89_PHY_DCFO_STATE_HOLD: if (stats->tx_throughput <= CFO_TP_LOWER) { cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; cfo->phy_cfo_trk_cnt = 0; cfo->cfo_trig_by_timer_en = false; + } else { + cfo->phy_cfo_trk_cnt++; } break; default: @@ -3099,11 +3125,9 @@ static void rtw89_physts_enable_fail_report(struct rtw89_dev *rtwdev, static void rtw89_physts_parsing_init(struct rtw89_dev *rtwdev) { - const struct rtw89_chip_info *chip = rtwdev->chip; u8 i; - if (chip->chip_id == RTL8852A && rtwdev->hal.cv == CHIP_CBV) - rtw89_physts_enable_fail_report(rtwdev, false, RTW89_PHY_0); + rtw89_physts_enable_fail_report(rtwdev, false, RTW89_PHY_0); for (i = 0; i < RTW89_PHYSTS_BITMAP_NUM; i++) { if (i >= RTW89_CCK_PKT) @@ -3612,7 +3636,7 @@ void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif enum rtw89_phy_idx phy_idx = RTW89_PHY_0; u8 bss_color; - if (!vif->bss_conf.he_support || !vif->bss_conf.assoc) + if (!vif->bss_conf.he_support || !vif->cfg.assoc) return; bss_color = vif->bss_conf.he_bss_color.color; @@ -3622,7 +3646,7 @@ void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_TGT, bss_color, phy_idx); rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_STAID, - vif->bss_conf.aid, phy_idx); + vif->cfg.aid, phy_idx); } static void diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h index 291660154d58..e20636f54b55 100644 --- a/drivers/net/wireless/realtek/rtw89/phy.h +++ b/drivers/net/wireless/realtek/rtw89/phy.h @@ -62,6 +62,7 @@ #define CFO_COMP_PERIOD 250 #define CFO_COMP_WEIGHT 8 #define MAX_CFO_TOLERANCE 30 +#define CFO_TF_CNT_TH 300 #define CCX_MAX_PERIOD 2097 #define CCX_MAX_PERIOD_UNIT 32 diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c index e3c2fce32651..3d60feb78312 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c @@ -2330,8 +2330,8 @@ static u8 _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) val2_q = abs(sign_extend32(val2_q, 11)); rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", - (val1_i * val1_i + val1_q * val1_q) / - (val2_i * val2_i + val2_q * val2_q)); + phy_div(val1_i * val1_i + val1_q * val1_q, + val2_i * val2_i + val2_q * val2_q)); } else { for (i = 0; i < 32; i++) { diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a_table.c b/drivers/net/wireless/realtek/rtw89/rtw8852a_table.c index 99479bbb0939..320bcd4852c6 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852a_table.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852a_table.c @@ -1281,7 +1281,6 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x018, 0x00011124}, {0x000, 0x00033C00}, {0x01A, 0x00040004}, - {0x0FE, 0x00000000}, {0x055, 0x00080000}, {0x056, 0x0008FFF0}, {0x057, 0x0000C485}, @@ -20496,7 +20495,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20516,7 +20515,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20542,7 +20541,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20562,7 +20561,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20588,7 +20587,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20608,7 +20607,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20622,17 +20621,17 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0xB0000000, 0x00000000}, {0x033, 0x0000002E}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20644,15 +20643,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20664,21 +20663,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000002F}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20690,15 +20689,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20710,21 +20709,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000030}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20736,15 +20735,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20756,21 +20755,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000031}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20782,15 +20781,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20802,21 +20801,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000032}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20828,15 +20827,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20848,21 +20847,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000033}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20874,15 +20873,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20894,21 +20893,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000034}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20920,15 +20919,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20940,21 +20939,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000035}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -20966,15 +20965,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -20986,21 +20985,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000036}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21012,15 +21011,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21032,21 +21031,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000037}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21058,15 +21057,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21078,21 +21077,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000038}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21104,15 +21103,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21124,21 +21123,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000039}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21150,15 +21149,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21170,21 +21169,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003A}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21196,15 +21195,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21216,21 +21215,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003B}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21242,15 +21241,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21262,21 +21261,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003C}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21288,15 +21287,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21308,21 +21307,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003D}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21334,15 +21333,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21354,21 +21353,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003E}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21380,15 +21379,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21400,21 +21399,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003F}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -21426,15 +21425,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -21446,7 +21445,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x0EF, 0x00000000}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, @@ -21596,8 +21595,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radioa_regs[] = { {0x087, 0x00000427}, {0xB0000000, 0x00000000}, {0x002, 0x00000000}, - {0x067, 0x00000052}, - + {0x067, 0x00000056}, }; static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { @@ -21671,7 +21669,6 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x018, 0x00011124}, {0x000, 0x00033C00}, {0x01A, 0x00040004}, - {0x0FE, 0x00000000}, {0x055, 0x00080000}, {0x056, 0x0008FFF0}, {0x057, 0x0000C485}, @@ -41142,7 +41139,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41162,7 +41159,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41188,7 +41185,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41208,7 +41205,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41234,7 +41231,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41254,7 +41251,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x000001FF}, + {0x03F, 0x000001FB}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x000001FF}, {0x90340002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41268,17 +41265,17 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0xB0000000, 0x00000000}, {0x033, 0x0000002E}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41290,15 +41287,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41310,21 +41307,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000002F}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41336,15 +41333,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41356,21 +41353,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000030}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41382,15 +41379,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41402,21 +41399,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000031}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41428,15 +41425,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41448,21 +41445,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000032}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41474,15 +41471,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41494,21 +41491,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000033}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41520,15 +41517,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41540,21 +41537,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000034}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41566,15 +41563,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41586,21 +41583,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000035}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41612,15 +41609,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41632,21 +41629,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000036}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41658,15 +41655,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41678,21 +41675,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000037}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41704,15 +41701,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41724,21 +41721,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000038}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41750,15 +41747,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41770,21 +41767,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x00000039}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41796,15 +41793,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41816,21 +41813,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003A}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41842,15 +41839,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41862,21 +41859,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003B}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41888,15 +41885,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41908,21 +41905,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003C}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41934,15 +41931,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -41954,21 +41951,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003D}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -41980,15 +41977,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -42000,21 +41997,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003E}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -42026,15 +42023,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -42046,21 +42043,21 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x033, 0x0000003F}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90010001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260001, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330001, 0x00000000}, {0x40000000, 0x00000000}, @@ -42072,15 +42069,15 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360001, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0x90010002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90020002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90030002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90250002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90260002, 0x00000000}, {0x40000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0x90320002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003B}, {0x90330002, 0x00000000}, {0x40000000, 0x00000000}, @@ -42092,7 +42089,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x90360002, 0x00000000}, {0x40000000, 0x00000000}, {0x03F, 0x0000003F}, {0xA0000000, 0x00000000}, - {0x03F, 0x0000003F}, + {0x03F, 0x000000EB}, {0xB0000000, 0x00000000}, {0x0EF, 0x00000000}, {0x80010000, 0x00000000}, {0x40000000, 0x00000000}, @@ -42243,8 +42240,7 @@ static const struct rtw89_reg2_def rtw89_8852a_phy_radiob_regs[] = { {0x087, 0x00000427}, {0xB0000000, 0x00000000}, {0x002, 0x00000000}, - {0x067, 0x00000052}, - + {0x067, 0x00000056}, }; static const struct rtw89_reg2_def rtw89_8852a_phy_nctl_regs[] = { diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c index 64840c8d9efe..b697aef2faf2 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c @@ -1861,6 +1861,7 @@ static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev) { rtw8852c_dpk_track(rtwdev); rtw8852c_lck_track(rtwdev); + rtw8852c_rx_dck_track(rtwdev); } static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev, diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c index dfb9caba9bc4..4186d825d19b 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c @@ -3864,6 +3864,7 @@ void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe) { + struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; u8 path, kpath; u32 rf_reg5; @@ -3883,6 +3884,7 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); _set_rx_dck(rtwdev, phy, path, is_afe); + rx_dck->thermal[path] = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); if (rtwdev->is_tssi_mode[path]) @@ -3891,6 +3893,31 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a } } +#define RTW8852C_RX_DCK_TH 8 + +void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev) +{ + struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; + u8 cur_thermal; + int delta; + int path; + + for (path = 0; path < RF_PATH_NUM_8852C; path++) { + cur_thermal = + ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); + delta = abs((int)cur_thermal - rx_dck->thermal[path]); + + rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, + "[RX_DCK] path=%d current thermal=0x%x delta=0x%x\n", + path, cur_thermal, delta); + + if (delta >= RTW8852C_RX_DCK_TH) { + rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false); + return; + } + } +} + void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) { u32 tx_en; diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h b/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h index c32756f0c01a..5118a49da8d3 100644 --- a/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h +++ b/drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h @@ -12,6 +12,7 @@ void rtw8852c_rck(struct rtw89_dev *rtwdev); void rtw8852c_dack(struct rtw89_dev *rtwdev); void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx); void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool is_afe); +void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev); void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy); void rtw8852c_dpk_track(struct rtw89_dev *rtwdev); void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy); diff --git a/drivers/net/wireless/realtek/rtw89/sar.c b/drivers/net/wireless/realtek/rtw89/sar.c index 097c87899cea..eb2d3ec28775 100644 --- a/drivers/net/wireless/realtek/rtw89/sar.c +++ b/drivers/net/wireless/realtek/rtw89/sar.c @@ -5,15 +5,122 @@ #include "debug.h" #include "sar.h" +static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev, + u32 center_freq) +{ + switch (center_freq) { + default: + rtw89_debug(rtwdev, RTW89_DBG_SAR, + "center freq: %u to SAR subband is unhandled\n", + center_freq); + fallthrough; + case 2412 ... 2484: + return RTW89_SAR_2GHZ_SUBBAND; + case 5180 ... 5320: + return RTW89_SAR_5GHZ_SUBBAND_1_2; + case 5500 ... 5720: + return RTW89_SAR_5GHZ_SUBBAND_2_E; + case 5745 ... 5825: + return RTW89_SAR_5GHZ_SUBBAND_3; + case 5955 ... 6155: + return RTW89_SAR_6GHZ_SUBBAND_5_L; + case 6175 ... 6415: + return RTW89_SAR_6GHZ_SUBBAND_5_H; + case 6435 ... 6515: + return RTW89_SAR_6GHZ_SUBBAND_6; + case 6535 ... 6695: + return RTW89_SAR_6GHZ_SUBBAND_7_L; + case 6715 ... 6855: + return RTW89_SAR_6GHZ_SUBBAND_7_H; + + /* freq 6875 (ch 185, 20MHz) spans RTW89_SAR_6GHZ_SUBBAND_7_H + * and RTW89_SAR_6GHZ_SUBBAND_8, so directly describe it with + * struct rtw89_sar_span in the following. + */ + + case 6895 ... 7115: + return RTW89_SAR_6GHZ_SUBBAND_8; + } +} + +struct rtw89_sar_span { + enum rtw89_sar_subband subband_low; + enum rtw89_sar_subband subband_high; +}; + +#define RTW89_SAR_SPAN_VALID(span) ((span)->subband_high) + +#define RTW89_SAR_6GHZ_SPAN_HEAD 6145 +#define RTW89_SAR_6GHZ_SPAN_IDX(center_freq) \ + ((((int)(center_freq) - RTW89_SAR_6GHZ_SPAN_HEAD) / 5) / 2) + +#define RTW89_DECL_SAR_6GHZ_SPAN(center_freq, subband_l, subband_h) \ + [RTW89_SAR_6GHZ_SPAN_IDX(center_freq)] = { \ + .subband_low = RTW89_SAR_6GHZ_ ## subband_l, \ + .subband_high = RTW89_SAR_6GHZ_ ## subband_h, \ + } + +/* Since 6GHz SAR subbands are not edge aligned, some cases span two SAR + * subbands. In the following, we describe each of them with rtw89_sar_span. + */ +static const struct rtw89_sar_span rtw89_sar_overlapping_6ghz[] = { + RTW89_DECL_SAR_6GHZ_SPAN(6145, SUBBAND_5_L, SUBBAND_5_H), + RTW89_DECL_SAR_6GHZ_SPAN(6165, SUBBAND_5_L, SUBBAND_5_H), + RTW89_DECL_SAR_6GHZ_SPAN(6185, SUBBAND_5_L, SUBBAND_5_H), + RTW89_DECL_SAR_6GHZ_SPAN(6505, SUBBAND_6, SUBBAND_7_L), + RTW89_DECL_SAR_6GHZ_SPAN(6525, SUBBAND_6, SUBBAND_7_L), + RTW89_DECL_SAR_6GHZ_SPAN(6545, SUBBAND_6, SUBBAND_7_L), + RTW89_DECL_SAR_6GHZ_SPAN(6665, SUBBAND_7_L, SUBBAND_7_H), + RTW89_DECL_SAR_6GHZ_SPAN(6705, SUBBAND_7_L, SUBBAND_7_H), + RTW89_DECL_SAR_6GHZ_SPAN(6825, SUBBAND_7_H, SUBBAND_8), + RTW89_DECL_SAR_6GHZ_SPAN(6865, SUBBAND_7_H, SUBBAND_8), + RTW89_DECL_SAR_6GHZ_SPAN(6875, SUBBAND_7_H, SUBBAND_8), + RTW89_DECL_SAR_6GHZ_SPAN(6885, SUBBAND_7_H, SUBBAND_8), +}; + static int rtw89_query_sar_config_common(struct rtw89_dev *rtwdev, s32 *cfg) { struct rtw89_sar_cfg_common *rtwsar = &rtwdev->sar.cfg_common; - enum rtw89_subband subband = rtwdev->hal.current_subband; + struct rtw89_hal *hal = &rtwdev->hal; + enum rtw89_band band = hal->current_band_type; + u32 center_freq = hal->current_freq; + const struct rtw89_sar_span *span = NULL; + enum rtw89_sar_subband subband_l, subband_h; + int idx; + + if (band == RTW89_BAND_6G) { + idx = RTW89_SAR_6GHZ_SPAN_IDX(center_freq); + /* To decrease size of rtw89_sar_overlapping_6ghz[], + * RTW89_SAR_6GHZ_SPAN_IDX() truncates the leading NULLs + * to make first span as index 0 of the table. So, if center + * frequency is less than the first one, it will get netative. + */ + if (idx >= 0 && idx < ARRAY_SIZE(rtw89_sar_overlapping_6ghz)) + span = &rtw89_sar_overlapping_6ghz[idx]; + } + + if (span && RTW89_SAR_SPAN_VALID(span)) { + subband_l = span->subband_low; + subband_h = span->subband_high; + } else { + subband_l = rtw89_sar_get_subband(rtwdev, center_freq); + subband_h = subband_l; + } + + rtw89_debug(rtwdev, RTW89_DBG_SAR, + "for {band %u, center_freq %u}, SAR subband: {%u, %u}\n", + band, center_freq, subband_l, subband_h); - if (!rtwsar->set[subband]) + if (!rtwsar->set[subband_l] && !rtwsar->set[subband_h]) return -ENODATA; - *cfg = rtwsar->cfg[subband]; + if (!rtwsar->set[subband_l]) + *cfg = rtwsar->cfg[subband_h]; + else if (!rtwsar->set[subband_h]) + *cfg = rtwsar->cfg[subband_l]; + else + *cfg = min(rtwsar->cfg[subband_l], rtwsar->cfg[subband_h]); + return 0; } @@ -128,21 +235,20 @@ exit: return ret; } -static const u8 rtw89_common_sar_subband_map[] = { - RTW89_CH_2G, - RTW89_CH_5G_BAND_1, - RTW89_CH_5G_BAND_3, - RTW89_CH_5G_BAND_4, -}; - static const struct cfg80211_sar_freq_ranges rtw89_common_sar_freq_ranges[] = { { .start_freq = 2412, .end_freq = 2484, }, { .start_freq = 5180, .end_freq = 5320, }, { .start_freq = 5500, .end_freq = 5720, }, { .start_freq = 5745, .end_freq = 5825, }, + { .start_freq = 5955, .end_freq = 6155, }, + { .start_freq = 6175, .end_freq = 6415, }, + { .start_freq = 6435, .end_freq = 6515, }, + { .start_freq = 6535, .end_freq = 6695, }, + { .start_freq = 6715, .end_freq = 6875, }, + { .start_freq = 6875, .end_freq = 7115, }, }; -static_assert(ARRAY_SIZE(rtw89_common_sar_subband_map) == +static_assert(RTW89_SAR_SUBBAND_NR == ARRAY_SIZE(rtw89_common_sar_freq_ranges)); const struct cfg80211_sar_capa rtw89_sar_capa = { @@ -159,7 +265,6 @@ int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw, u8 fct; u32 freq_start; u32 freq_end; - u32 band; s32 power; u32 i, idx; @@ -175,15 +280,14 @@ int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw, freq_start = rtw89_common_sar_freq_ranges[idx].start_freq; freq_end = rtw89_common_sar_freq_ranges[idx].end_freq; - band = rtw89_common_sar_subband_map[idx]; power = sar->sub_specs[i].power; - rtw89_info(rtwdev, "On freq %u to %u, ", freq_start, freq_end); - rtw89_info(rtwdev, "set SAR power limit %d (unit: 1/%lu dBm)\n", - power, BIT(fct)); + rtw89_debug(rtwdev, RTW89_DBG_SAR, + "On freq %u to %u, set SAR limit %d (unit: 1/%lu dBm)\n", + freq_start, freq_end, power, BIT(fct)); - sar_common.set[band] = true; - sar_common.cfg[band] = power; + sar_common.set[idx] = true; + sar_common.cfg[idx] = power; } return rtw89_apply_sar_common(rtwdev, &sar_common); diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c index 9e95ed972710..726223f25dc6 100644 --- a/drivers/net/wireless/realtek/rtw89/ser.c +++ b/drivers/net/wireless/realtek/rtw89/ser.c @@ -300,18 +300,21 @@ static void ser_reset_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) static void ser_sta_deinit_addr_cam_iter(void *data, struct ieee80211_sta *sta) { - struct rtw89_dev *rtwdev = (struct rtw89_dev *)data; + struct rtw89_vif *rtwvif = (struct rtw89_vif *)data; + struct rtw89_dev *rtwdev = rtwvif->rtwdev; struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; - rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam); + if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls) + rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam); + if (sta->tdls) + rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta->bssid_cam); } static void ser_deinit_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) { - if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE) - ieee80211_iterate_stations_atomic(rtwdev->hw, - ser_sta_deinit_addr_cam_iter, - rtwdev); + ieee80211_iterate_stations_atomic(rtwdev->hw, + ser_sta_deinit_addr_cam_iter, + rtwvif); rtw89_cam_deinit(rtwdev, rtwvif); } |