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

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

Kalle Valo says:

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

The second pull request for v6.6, this time with both stack and driver
changes. Unusually we have only one major new feature but lots of
small cleanup all over, I guess this is due to people have been on
vacation the last month.

Major changes:

rtw89
- Introduce Time Averaged SAR (TAS) support

* tag 'wireless-next-2023-08-25' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (114 commits)
wifi: rtlwifi: rtl8723: Remove unused function rtl8723_cmd_send_packet()
wifi: rtw88: usb: kill and free rx urbs on probe failure
wifi: rtw89: Fix clang -Wimplicit-fallthrough in rtw89_query_sar()
wifi: rtw89: phy: modify register setting of ENV_MNTR, PHYSTS and DIG
wifi: rtw89: phy: add phy_gen_def::cr_base to support WiFi 7 chips
wifi: rtw89: mac: define register address of rx_filter to generalize code
wifi: rtw89: mac: define internal memory address for WiFi 7 chip
wifi: rtw89: mac: generalize code to indirectly access WiFi internal memory
wifi: rtw89: mac: add mac_gen_def::band1_offset to map MAC band1 register address
wifi: wlcore: sdio: Use module_sdio_driver macro to simplify the code
wifi: rtw89: initialize multi-channel handling
wifi: rtw89: provide functions to configure NoA for beacon update
wifi: rtw89: call rtw89_chan_get() by vif chanctx if aware of vif
wifi: rtw89: sar: let caller decide the center frequency to query
wifi: rtw89: refine rtw89_correct_cck_chan() by rtw89_hw_to_nl80211_band()
wifi: rtw89: add function prototype for coex request duration
Fix nomenclature for USB and PCI wireless devices
wifi: ath: Use is_multicast_ether_addr() to check multicast Ether address
wifi: ath12k: Remove unused declarations
wifi: ath12k: add check max message length while scanning with extraie
...
====================

Link: https://lore.kernel.org/r/20230825132230.A0833C433C8@smtp.kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+2231 -1154
+1 -1
drivers/net/wireless/ath/ath10k/ahb.c
··· 733 733 int ret; 734 734 struct ath10k_bus_params bus_params = {}; 735 735 736 - hw_rev = (enum ath10k_hw_rev)of_device_get_match_data(&pdev->dev); 736 + hw_rev = (uintptr_t)of_device_get_match_data(&pdev->dev); 737 737 if (!hw_rev) { 738 738 dev_err(&pdev->dev, "OF data missing\n"); 739 739 return -EINVAL;
+2 -2
drivers/net/wireless/ath/ath10k/htt.h
··· 69 69 * The HTT tx descriptor is defined in two manners: by a struct with 70 70 * bitfields, and by a series of [dword offset, bit mask, bit shift] 71 71 * definitions. 72 - * The target should use the struct def, for simplicitly and clarity, 72 + * The target should use the struct def, for simplicity and clarity, 73 73 * but the host shall use the bit-mast + bit-shift defs, to be endian- 74 74 * neutral. Specifically, the host shall use the get/set macros built 75 75 * around the mask + shift defs. ··· 2086 2086 * for correctly accessing rx descriptor data. 2087 2087 */ 2088 2088 2089 - /* base struct used for abstracting the rx descritor representation */ 2089 + /* base struct used for abstracting the rx descriptor representation */ 2090 2090 struct htt_rx_desc { 2091 2091 union { 2092 2092 /* This field is filled on the host using the msdu buffer
+2 -2
drivers/net/wireless/ath/ath10k/pci.c
··· 1636 1636 buf, 1637 1637 current_region->len); 1638 1638 1639 - /* No individiual memory sections defined so we can 1639 + /* No individual memory sections defined so we can 1640 1640 * copy the entire memory region. 1641 1641 */ 1642 1642 ret = ath10k_pci_diag_read_mem(ar, ··· 3816 3816 module_exit(ath10k_pci_exit); 3817 3817 3818 3818 MODULE_AUTHOR("Qualcomm Atheros"); 3819 - MODULE_DESCRIPTION("Driver support for Qualcomm Atheros 802.11ac WLAN PCIe/AHB devices"); 3819 + MODULE_DESCRIPTION("Driver support for Qualcomm Atheros PCIe/AHB 802.11ac WLAN devices"); 3820 3820 MODULE_LICENSE("Dual BSD/GPL"); 3821 3821 3822 3822 /* QCA988x 2.0 firmware files */
+1 -1
drivers/net/wireless/ath/ath10k/sdio.c
··· 2389 2389 buf, 2390 2390 current_region->len); 2391 2391 2392 - /* No individiual memory sections defined so we can 2392 + /* No individual memory sections defined so we can 2393 2393 * copy the entire memory region. 2394 2394 */ 2395 2395 if (fast_dump)
+1 -1
drivers/net/wireless/ath/ath10k/usb.c
··· 1126 1126 module_usb_driver(ath10k_usb_driver); 1127 1127 1128 1128 MODULE_AUTHOR("Atheros Communications, Inc."); 1129 - MODULE_DESCRIPTION("Driver support for Qualcomm Atheros 802.11ac WLAN USB devices"); 1129 + MODULE_DESCRIPTION("Driver support for Qualcomm Atheros USB 802.11ac WLAN devices"); 1130 1130 MODULE_LICENSE("Dual BSD/GPL");
+4 -4
drivers/net/wireless/ath/ath10k/wmi.h
··· 3854 3854 * retransmitting frames. 3855 3855 */ 3856 3856 WMI_PDEV_PARAM_DYNAMIC_BW, 3857 - /* Non aggregrate/ 11g sw retry threshold.0-disable */ 3857 + /* Non aggregate/ 11g sw retry threshold.0-disable */ 3858 3858 WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 3859 - /* aggregrate sw retry threshold. 0-disable*/ 3859 + /* aggregate sw retry threshold. 0-disable*/ 3860 3860 WMI_PDEV_PARAM_AGG_SW_RETRY_TH, 3861 3861 /* Station kickout threshold (non of consecutive failures).0-disable */ 3862 3862 WMI_PDEV_PARAM_STA_KICKOUT_TH, ··· 3953 3953 WMI_10X_PDEV_PARAM_PROTECTION_MODE, 3954 3954 /* Dynamic bandwidth 0: disable 1: enable */ 3955 3955 WMI_10X_PDEV_PARAM_DYNAMIC_BW, 3956 - /* Non aggregrate/ 11g sw retry threshold.0-disable */ 3956 + /* Non aggregate/ 11g sw retry threshold.0-disable */ 3957 3957 WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 3958 - /* aggregrate sw retry threshold. 0-disable*/ 3958 + /* aggregate sw retry threshold. 0-disable*/ 3959 3959 WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 3960 3960 /* Station kickout threshold (non of consecutive failures).0-disable */ 3961 3961 WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
+2 -12
drivers/net/wireless/ath/ath11k/ahb.c
··· 1096 1096 return -EINVAL; 1097 1097 } 1098 1098 1099 - hw_rev = (enum ath11k_hw_rev)of_id->data; 1099 + hw_rev = (uintptr_t)of_id->data; 1100 1100 1101 1101 switch (hw_rev) { 1102 1102 case ATH11K_HW_IPQ8074: ··· 1306 1306 .shutdown = ath11k_ahb_shutdown, 1307 1307 }; 1308 1308 1309 - static int ath11k_ahb_init(void) 1310 - { 1311 - return platform_driver_register(&ath11k_ahb_driver); 1312 - } 1313 - module_init(ath11k_ahb_init); 1314 - 1315 - static void ath11k_ahb_exit(void) 1316 - { 1317 - platform_driver_unregister(&ath11k_ahb_driver); 1318 - } 1319 - module_exit(ath11k_ahb_exit); 1309 + module_platform_driver(ath11k_ahb_driver); 1320 1310 1321 1311 MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN AHB devices"); 1322 1312 MODULE_LICENSE("Dual BSD/GPL");
-3
drivers/net/wireless/ath/ath11k/ce.h
··· 203 203 void ath11k_ce_free_pipes(struct ath11k_base *ab); 204 204 int ath11k_ce_get_attr_flags(struct ath11k_base *ab, int ce_id); 205 205 void ath11k_ce_poll_send_completed(struct ath11k_base *ab, u8 pipe_id); 206 - int ath11k_ce_map_service_to_pipe(struct ath11k_base *ab, u16 service_id, 207 - u8 *ul_pipe, u8 *dl_pipe); 208 - int ath11k_ce_attr_attach(struct ath11k_base *ab); 209 206 void ath11k_ce_get_shadow_config(struct ath11k_base *ab, 210 207 u32 **shadow_cfg, u32 *shadow_cfg_len); 211 208 void ath11k_ce_stop_shadow_timers(struct ath11k_base *ab);
+1 -1
drivers/net/wireless/ath/ath11k/dp.h
··· 635 635 * b'24 - status_swap: 1 is to swap status TLV 636 636 * b'25 - pkt_swap: 1 is to swap packet TLV 637 637 * b'26:31 - rsvd1: reserved for future use 638 - * dword1 - b'0:16 - ring_buffer_size: size of bufferes referenced by rx ring, 638 + * dword1 - b'0:16 - ring_buffer_size: size of buffers referenced by rx ring, 639 639 * in byte units. 640 640 * Valid only for HW_TO_SW_RING and SW_TO_HW_RING 641 641 * - b'16:31 - rsvd2: Reserved for future use
+1 -1
drivers/net/wireless/ath/ath11k/dp_rx.c
··· 3423 3423 ath11k_hal_rx_buf_addr_info_set(msdu0, paddr, cookie, 3424 3424 ab->hw_params.hal_params->rx_buf_rbm); 3425 3425 3426 - /* Fill mpdu details into reo entrace ring */ 3426 + /* Fill mpdu details into reo entrance ring */ 3427 3427 srng = &ab->hal.srng_list[ab->dp.reo_reinject_ring.ring_id]; 3428 3428 3429 3429 spin_lock_bh(&srng->lock);
+6 -6
drivers/net/wireless/ath/ath11k/dp_tx.c
··· 238 238 spin_unlock_bh(&tcl_ring->lock); 239 239 ret = -ENOMEM; 240 240 241 - /* Checking for available tcl descritors in another ring in 241 + /* Checking for available tcl descriptors in another ring in 242 242 * case of failure due to full tcl ring now, is better than 243 243 * checking this ring earlier for each pkt tx. 244 244 * Restart ring selection if some rings are not checked yet. ··· 344 344 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); 345 345 346 346 if (!skb_cb->vif) { 347 - dev_kfree_skb_any(msdu); 347 + ieee80211_free_txskb(ar->hw, msdu); 348 348 return; 349 349 } 350 350 ··· 369 369 "dp_tx: failed to find the peer with peer_id %d\n", 370 370 ts->peer_id); 371 371 spin_unlock_bh(&ab->base_lock); 372 - dev_kfree_skb_any(msdu); 372 + ieee80211_free_txskb(ar->hw, msdu); 373 373 return; 374 374 } 375 375 spin_unlock_bh(&ab->base_lock); ··· 566 566 dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); 567 567 568 568 if (unlikely(!rcu_access_pointer(ab->pdevs_active[ar->pdev_idx]))) { 569 - dev_kfree_skb_any(msdu); 569 + ieee80211_free_txskb(ar->hw, msdu); 570 570 return; 571 571 } 572 572 573 573 if (unlikely(!skb_cb->vif)) { 574 - dev_kfree_skb_any(msdu); 574 + ieee80211_free_txskb(ar->hw, msdu); 575 575 return; 576 576 } 577 577 ··· 624 624 "dp_tx: failed to find the peer with peer_id %d\n", 625 625 ts->peer_id); 626 626 spin_unlock_bh(&ab->base_lock); 627 - dev_kfree_skb_any(msdu); 627 + ieee80211_free_txskb(ar->hw, msdu); 628 628 return; 629 629 } 630 630 arsta = (struct ath11k_sta *)peer->sta->drv_priv;
+32 -32
drivers/net/wireless/ath/ath11k/mac.c
··· 566 566 struct ieee80211_vif *vif) 567 567 { 568 568 struct ath11k_vif_iter *arvif_iter = data; 569 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 569 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 570 570 571 571 if (arvif->vdev_id == arvif_iter->vdev_id) 572 572 arvif_iter->arvif = arvif; ··· 1464 1464 u32 params = 0; 1465 1465 u8 i = 0; 1466 1466 1467 - tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; 1467 + tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif); 1468 1468 1469 1469 beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw, 1470 1470 tx_arvif->vif, 0); ··· 1520 1520 struct sk_buff *bcn; 1521 1521 int ret; 1522 1522 1523 - if (arvif->vif->mbssid_tx_vif) { 1524 - tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; 1523 + if (vif->mbssid_tx_vif) { 1524 + tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif); 1525 1525 if (tx_arvif != arvif) { 1526 1526 ar = tx_arvif->ar; 1527 1527 ab = ar->ab; ··· 1562 1562 * non-transmitting interfaces, and results in a crash if sent. 1563 1563 */ 1564 1564 if (vif->mbssid_tx_vif && 1565 - arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) 1565 + arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up) 1566 1566 return 0; 1567 1567 1568 1568 if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif) ··· 1626 1626 ether_addr_copy(arvif->bssid, info->bssid); 1627 1627 1628 1628 if (arvif->vif->mbssid_tx_vif) 1629 - tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv; 1629 + tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif); 1630 1630 1631 1631 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, 1632 1632 arvif->bssid, ··· 1649 1649 { 1650 1650 struct sk_buff *skb = data; 1651 1651 struct ieee80211_mgmt *mgmt = (void *)skb->data; 1652 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 1652 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1653 1653 1654 1654 if (vif->type != NL80211_IFTYPE_STATION) 1655 1655 return; ··· 1672 1672 struct ieee80211_vif *vif) 1673 1673 { 1674 1674 u32 *vdev_id = data; 1675 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 1675 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1676 1676 struct ath11k *ar = arvif->ar; 1677 1677 struct ieee80211_hw *hw = ar->hw; 1678 1678 ··· 1718 1718 struct ieee80211_sta *sta, 1719 1719 struct peer_assoc_params *arg) 1720 1720 { 1721 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 1721 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1722 1722 u32 aid; 1723 1723 1724 1724 lockdep_assert_held(&ar->conf_mutex); ··· 1746 1746 struct ieee80211_bss_conf *info = &vif->bss_conf; 1747 1747 struct cfg80211_chan_def def; 1748 1748 struct cfg80211_bss *bss; 1749 - struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv; 1749 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1750 1750 const u8 *rsnie = NULL; 1751 1751 const u8 *wpaie = NULL; 1752 1752 ··· 1804 1804 struct ieee80211_sta *sta, 1805 1805 struct peer_assoc_params *arg) 1806 1806 { 1807 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 1807 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1808 1808 struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; 1809 1809 struct cfg80211_chan_def def; 1810 1810 const struct ieee80211_supported_band *sband; ··· 1867 1867 struct peer_assoc_params *arg) 1868 1868 { 1869 1869 const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap; 1870 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 1870 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 1871 1871 struct cfg80211_chan_def def; 1872 1872 enum nl80211_band band; 1873 1873 const u8 *ht_mcs_mask; ··· 2064 2064 struct peer_assoc_params *arg) 2065 2065 { 2066 2066 const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap; 2067 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2067 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2068 2068 struct cfg80211_chan_def def; 2069 2069 enum nl80211_band band; 2070 2070 u16 *vht_mcs_mask; ··· 2261 2261 struct ieee80211_sta *sta, 2262 2262 struct peer_assoc_params *arg) 2263 2263 { 2264 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2264 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2265 2265 struct cfg80211_chan_def def; 2266 2266 const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap; 2267 2267 enum nl80211_band band; ··· 2584 2584 struct ieee80211_sta *sta, 2585 2585 struct peer_assoc_params *arg) 2586 2586 { 2587 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2587 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2588 2588 2589 2589 switch (arvif->vdev_type) { 2590 2590 case WMI_VDEV_TYPE_AP: ··· 2747 2747 struct ieee80211_sta *sta, 2748 2748 struct peer_assoc_params *arg) 2749 2749 { 2750 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2750 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2751 2751 struct cfg80211_chan_def def; 2752 2752 enum nl80211_band band; 2753 2753 const u8 *ht_mcs_mask; ··· 2933 2933 struct ieee80211_vif *vif, 2934 2934 struct ieee80211_sta_he_cap *he_cap) 2935 2935 { 2936 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2936 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2937 2937 struct ieee80211_he_cap_elem he_cap_elem = {0}; 2938 2938 struct ieee80211_sta_he_cap *cap_band = NULL; 2939 2939 struct cfg80211_chan_def def; ··· 2995 2995 struct ieee80211_bss_conf *bss_conf) 2996 2996 { 2997 2997 struct ath11k *ar = hw->priv; 2998 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 2998 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 2999 2999 struct peer_assoc_params peer_arg; 3000 3000 struct ieee80211_sta *ap_sta; 3001 3001 struct ath11k_peer *peer; ··· 3111 3111 struct ieee80211_vif *vif) 3112 3112 { 3113 3113 struct ath11k *ar = hw->priv; 3114 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 3114 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 3115 3115 int ret; 3116 3116 3117 3117 lockdep_assert_held(&ar->conf_mutex); ··· 3160 3160 struct ieee80211_vif *vif, 3161 3161 struct cfg80211_chan_def *def) 3162 3162 { 3163 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 3163 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 3164 3164 const struct ieee80211_supported_band *sband; 3165 3165 u8 basic_rate_idx; 3166 3166 int hw_rate_code; ··· 4632 4632 struct ieee80211_vif *vif, 4633 4633 struct ieee80211_sta *sta) 4634 4634 { 4635 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 4635 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 4636 4636 int ret = 0; 4637 4637 4638 4638 lockdep_assert_held(&ar->conf_mutex); ··· 5160 5160 struct ieee80211_sta *sta) 5161 5161 { 5162 5162 struct ath11k *ar = hw->priv; 5163 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 5163 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 5164 5164 int ret = 0; 5165 5165 s16 txpwr; 5166 5166 ··· 5210 5210 { 5211 5211 struct ath11k *ar = hw->priv; 5212 5212 struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv; 5213 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 5213 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 5214 5214 struct ath11k_peer *peer; 5215 5215 u32 bw, smps; 5216 5216 ··· 5337 5337 const struct ieee80211_tx_queue_params *params) 5338 5338 { 5339 5339 struct ath11k *ar = hw->priv; 5340 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 5340 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 5341 5341 struct wmi_wmm_params_arg *p = NULL; 5342 5342 int ret; 5343 5343 ··· 6455 6455 return 0; 6456 6456 } 6457 6457 6458 - tx_arvif = (void *)tx_vif->drv_priv; 6458 + tx_arvif = ath11k_vif_to_arvif(tx_vif); 6459 6459 6460 6460 if (arvif->vif->bss_conf.nontransmitted) { 6461 6461 if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy) ··· 7408 7408 /* TODO: Update ar->rx_channel */ 7409 7409 7410 7410 for (i = 0; i < n_vifs; i++) { 7411 - arvif = (void *)vifs[i].vif->drv_priv; 7411 + arvif = ath11k_vif_to_arvif(vifs[i].vif); 7412 7412 7413 7413 if (WARN_ON(!arvif->is_started)) 7414 7414 continue; ··· 7450 7450 7451 7451 mbssid_tx_vif = arvif->vif->mbssid_tx_vif; 7452 7452 if (mbssid_tx_vif) 7453 - tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv; 7453 + tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif); 7454 7454 7455 7455 ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, 7456 7456 arvif->bssid, ··· 7546 7546 { 7547 7547 struct ath11k *ar = hw->priv; 7548 7548 struct ath11k_base *ab = ar->ab; 7549 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 7549 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 7550 7550 int ret; 7551 7551 7552 7552 if (WARN_ON(arvif->is_started)) ··· 7596 7596 { 7597 7597 struct ath11k *ar = hw->priv; 7598 7598 struct ath11k_base *ab = ar->ab; 7599 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 7599 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 7600 7600 int ret; 7601 7601 struct peer_create_params param; 7602 7602 ··· 7686 7686 { 7687 7687 struct ath11k *ar = hw->priv; 7688 7688 struct ath11k_base *ab = ar->ab; 7689 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 7689 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 7690 7690 struct ath11k_peer *peer; 7691 7691 int ret; 7692 7692 ··· 8307 8307 struct ieee80211_vif *vif, 8308 8308 const struct cfg80211_bitrate_mask *mask) 8309 8309 { 8310 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 8310 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 8311 8311 struct cfg80211_chan_def def; 8312 8312 struct ath11k_pdev_cap *cap; 8313 8313 struct ath11k *ar = arvif->ar; ··· 8904 8904 enum ieee80211_roc_type type) 8905 8905 { 8906 8906 struct ath11k *ar = hw->priv; 8907 - struct ath11k_vif *arvif = (void *)vif->drv_priv; 8907 + struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); 8908 8908 struct scan_req_params arg; 8909 8909 int ret; 8910 8910 u32 scan_time_msec;
+1 -1
drivers/net/wireless/ath/ath11k/pci.c
··· 1036 1036 1037 1037 module_exit(ath11k_pci_exit); 1038 1038 1039 - MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN PCIe devices"); 1039 + MODULE_DESCRIPTION("Driver support for Qualcomm Technologies PCIe 802.11ax WLAN devices"); 1040 1040 MODULE_LICENSE("Dual BSD/GPL"); 1041 1041 1042 1042 /* firmware files */
-2
drivers/net/wireless/ath/ath11k/qmi.h
··· 514 514 int ath11k_qmi_firmware_start(struct ath11k_base *ab, 515 515 u32 mode); 516 516 void ath11k_qmi_firmware_stop(struct ath11k_base *ab); 517 - void ath11k_qmi_event_work(struct work_struct *work); 518 - void ath11k_qmi_msg_recv_work(struct work_struct *work); 519 517 void ath11k_qmi_deinit_service(struct ath11k_base *ab); 520 518 int ath11k_qmi_init_service(struct ath11k_base *ab); 521 519 void ath11k_qmi_free_resource(struct ath11k_base *ab);
+1 -1
drivers/net/wireless/ath/ath11k/testmode.c
··· 350 350 if (ar->ab->fw_mode != ATH11K_FIRMWARE_MODE_FTM && 351 351 (tag == WMI_TAG_VDEV_SET_PARAM_CMD || tag == WMI_TAG_UNIT_TEST_CMD)) { 352 352 if (vif) { 353 - arvif = (struct ath11k_vif *)vif->drv_priv; 353 + arvif = ath11k_vif_to_arvif(vif); 354 354 *ptr = arvif->vdev_id; 355 355 } else { 356 356 ret = -EINVAL;
-3
drivers/net/wireless/ath/ath12k/ce.h
··· 176 176 void ath12k_ce_free_pipes(struct ath12k_base *ab); 177 177 int ath12k_ce_get_attr_flags(struct ath12k_base *ab, int ce_id); 178 178 void ath12k_ce_poll_send_completed(struct ath12k_base *ab, u8 pipe_id); 179 - int ath12k_ce_map_service_to_pipe(struct ath12k_base *ab, u16 service_id, 180 - u8 *ul_pipe, u8 *dl_pipe); 181 - int ath12k_ce_attr_attach(struct ath12k_base *ab); 182 179 void ath12k_ce_get_shadow_config(struct ath12k_base *ab, 183 180 u32 **shadow_cfg, u32 *shadow_cfg_len); 184 181 #endif
-1
drivers/net/wireless/ath/ath12k/core.h
··· 788 788 int ath12k_core_fetch_bdf(struct ath12k_base *ath12k, 789 789 struct ath12k_board_data *bd); 790 790 void ath12k_core_free_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd); 791 - int ath12k_core_check_dt(struct ath12k_base *ath12k); 792 791 793 792 void ath12k_core_halt(struct ath12k *ar); 794 793 int ath12k_core_resume(struct ath12k_base *ab);
+29 -1
drivers/net/wireless/ath/ath12k/dp.c
··· 1129 1129 struct ath12k_dp *dp = &ab->dp; 1130 1130 struct sk_buff *skb; 1131 1131 int i; 1132 + u32 pool_id, tx_spt_page; 1132 1133 1133 1134 if (!dp->spt_info) 1134 1135 return; ··· 1147 1146 dma_unmap_single(ab->dev, ATH12K_SKB_RXCB(skb)->paddr, 1148 1147 skb->len + skb_tailroom(skb), DMA_FROM_DEVICE); 1149 1148 dev_kfree_skb_any(skb); 1149 + } 1150 + 1151 + for (i = 0; i < ATH12K_NUM_RX_SPT_PAGES; i++) { 1152 + if (!dp->spt_info->rxbaddr[i]) 1153 + continue; 1154 + 1155 + kfree(dp->spt_info->rxbaddr[i]); 1156 + dp->spt_info->rxbaddr[i] = NULL; 1150 1157 } 1151 1158 1152 1159 spin_unlock_bh(&dp->rx_desc_lock); ··· 1177 1168 } 1178 1169 1179 1170 spin_unlock_bh(&dp->tx_desc_lock[i]); 1171 + } 1172 + 1173 + for (pool_id = 0; pool_id < ATH12K_HW_MAX_QUEUES; pool_id++) { 1174 + spin_lock_bh(&dp->tx_desc_lock[pool_id]); 1175 + 1176 + for (i = 0; i < ATH12K_TX_SPT_PAGES_PER_POOL; i++) { 1177 + tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL; 1178 + if (!dp->spt_info->txbaddr[tx_spt_page]) 1179 + continue; 1180 + 1181 + kfree(dp->spt_info->txbaddr[tx_spt_page]); 1182 + dp->spt_info->txbaddr[tx_spt_page] = NULL; 1183 + } 1184 + 1185 + spin_unlock_bh(&dp->tx_desc_lock[pool_id]); 1180 1186 } 1181 1187 1182 1188 /* unmap SPT pages */ ··· 1367 1343 return -ENOMEM; 1368 1344 } 1369 1345 1346 + dp->spt_info->rxbaddr[i] = &rx_descs[0]; 1347 + 1370 1348 for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) { 1371 1349 rx_descs[j].cookie = ath12k_dp_cc_cookie_gen(i, j); 1372 1350 rx_descs[j].magic = ATH12K_DP_RX_DESC_MAGIC; ··· 1394 1368 return -ENOMEM; 1395 1369 } 1396 1370 1371 + tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL; 1372 + dp->spt_info->txbaddr[tx_spt_page] = &tx_descs[0]; 1373 + 1397 1374 for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) { 1398 - tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL; 1399 1375 ppt_idx = ATH12K_NUM_RX_SPT_PAGES + tx_spt_page; 1400 1376 tx_descs[j].desc_id = ath12k_dp_cc_cookie_gen(ppt_idx, j); 1401 1377 tx_descs[j].pool_id = pool_id;
+3 -1
drivers/net/wireless/ath/ath12k/dp.h
··· 289 289 struct ath12k_spt_info { 290 290 dma_addr_t paddr; 291 291 u64 *vaddr; 292 + struct ath12k_rx_desc_info *rxbaddr[ATH12K_NUM_RX_SPT_PAGES]; 293 + struct ath12k_tx_desc_info *txbaddr[ATH12K_NUM_TX_SPT_PAGES]; 292 294 }; 293 295 294 296 struct ath12k_reo_queue_ref { ··· 714 712 * b'24 - status_swap: 1 is to swap status TLV 715 713 * b'25 - pkt_swap: 1 is to swap packet TLV 716 714 * b'26:31 - rsvd1: reserved for future use 717 - * dword1 - b'0:16 - ring_buffer_size: size of bufferes referenced by rx ring, 715 + * dword1 - b'0:16 - ring_buffer_size: size of buffers referenced by rx ring, 718 716 * in byte units. 719 717 * Valid only for HW_TO_SW_RING and SW_TO_HW_RING 720 718 * - b'16:31 - rsvd2: Reserved for future use
+1 -1
drivers/net/wireless/ath/ath12k/dp_rx.c
··· 3027 3027 desc_info->cookie, 3028 3028 HAL_RX_BUF_RBM_SW3_BM); 3029 3029 3030 - /* Fill mpdu details into reo entrace ring */ 3030 + /* Fill mpdu details into reo entrance ring */ 3031 3031 srng = &ab->hal.srng_list[dp->reo_reinject_ring.ring_id]; 3032 3032 3033 3033 spin_lock_bh(&srng->lock);
+1 -1
drivers/net/wireless/ath/ath12k/dp_tx.c
··· 301 301 spin_unlock_bh(&tcl_ring->lock); 302 302 ret = -ENOMEM; 303 303 304 - /* Checking for available tcl descritors in another ring in 304 + /* Checking for available tcl descriptors in another ring in 305 305 * case of failure due to full tcl ring now, is better than 306 306 * checking this ring earlier for each pkt tx. 307 307 * Restart ring selection if some rings are not checked yet.
+3 -4
drivers/net/wireless/ath/ath12k/mac.c
··· 5660 5660 5661 5661 mutex_lock(&ar->conf_mutex); 5662 5662 5663 - changed_flags &= SUPPORTED_FILTERS; 5664 5663 *total_flags &= SUPPORTED_FILTERS; 5665 5664 ar->filter_flags = *total_flags; 5666 5665 ··· 5677 5678 "fail to set monitor filter: %d\n", ret); 5678 5679 } 5679 5680 ath12k_dbg(ar->ab, ATH12K_DBG_MAC, 5680 - "changed_flags:0x%x, total_flags:0x%x, reset_flag:%d\n", 5681 - changed_flags, *total_flags, reset_flag); 5681 + "total_flags:0x%x, reset_flag:%d\n", 5682 + *total_flags, reset_flag); 5682 5683 5683 5684 mutex_unlock(&ar->conf_mutex); 5684 5685 } ··· 6770 6771 /* After trigger disconnect, then upper layer will 6771 6772 * trigger connect again, then the PN number of 6772 6773 * upper layer will be reset to keep up with AP 6773 - * side, hence PN number mis-match will not happened. 6774 + * side, hence PN number mismatch will not happen. 6774 6775 */ 6775 6776 if (arvif->is_up && 6776 6777 arvif->vdev_type == WMI_VDEV_TYPE_STA &&
+1 -1
drivers/net/wireless/ath/ath12k/pci.c
··· 1409 1409 1410 1410 module_exit(ath12k_pci_exit); 1411 1411 1412 - MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11be WLAN PCIe devices"); 1412 + MODULE_DESCRIPTION("Driver support for Qualcomm Technologies PCIe 802.11be WLAN devices"); 1413 1413 MODULE_LICENSE("Dual BSD/GPL");
-2
drivers/net/wireless/ath/ath12k/qmi.h
··· 562 562 int ath12k_qmi_firmware_start(struct ath12k_base *ab, 563 563 u32 mode); 564 564 void ath12k_qmi_firmware_stop(struct ath12k_base *ab); 565 - void ath12k_qmi_event_work(struct work_struct *work); 566 - void ath12k_qmi_msg_recv_work(struct work_struct *work); 567 565 void ath12k_qmi_deinit_service(struct ath12k_base *ab); 568 566 int ath12k_qmi_init_service(struct ath12k_base *ab); 569 567
+1 -1
drivers/net/wireless/ath/ath12k/rx_desc.h
··· 221 221 * PPE routing even if RXOLE CCE or flow search indicate 'Use_PPE' 222 222 * This is set by SW for peers which are being handled by a 223 223 * host SW/accelerator subsystem that also handles packet 224 - * uffer management for WiFi-to-PPE routing. 224 + * buffer management for WiFi-to-PPE routing. 225 225 * 226 226 * This is cleared by SW for peers which are being handled 227 227 * by a different subsystem, completely disabling WiFi-to-PPE
+13 -7
drivers/net/wireless/ath/ath12k/wmi.c
··· 2239 2239 if (arg->num_bssid) 2240 2240 len += sizeof(*bssid) * arg->num_bssid; 2241 2241 2242 - len += TLV_HDR_SIZE; 2243 - if (arg->extraie.len) 2244 - extraie_len_with_pad = 2245 - roundup(arg->extraie.len, sizeof(u32)); 2246 - len += extraie_len_with_pad; 2247 - 2248 2242 if (arg->num_hint_bssid) 2249 2243 len += TLV_HDR_SIZE + 2250 2244 arg->num_hint_bssid * sizeof(*hint_bssid); ··· 2246 2252 if (arg->num_hint_s_ssid) 2247 2253 len += TLV_HDR_SIZE + 2248 2254 arg->num_hint_s_ssid * sizeof(*s_ssid); 2255 + 2256 + len += TLV_HDR_SIZE; 2257 + if (arg->extraie.len) 2258 + extraie_len_with_pad = 2259 + roundup(arg->extraie.len, sizeof(u32)); 2260 + if (extraie_len_with_pad <= (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len)) { 2261 + len += extraie_len_with_pad; 2262 + } else { 2263 + ath12k_warn(ar->ab, "discard large size %d bytes extraie for scan start\n", 2264 + arg->extraie.len); 2265 + extraie_len_with_pad = 0; 2266 + } 2249 2267 2250 2268 skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len); 2251 2269 if (!skb) ··· 2348 2342 tlv->header = ath12k_wmi_tlv_hdr(WMI_TAG_ARRAY_BYTE, len); 2349 2343 ptr += TLV_HDR_SIZE; 2350 2344 2351 - if (arg->extraie.len) 2345 + if (extraie_len_with_pad) 2352 2346 memcpy(ptr, arg->extraie.ptr, 2353 2347 arg->extraie.len); 2354 2348
-2
drivers/net/wireless/ath/ath12k/wmi.h
··· 4855 4855 struct wmi_vdev_install_key_arg *arg); 4856 4856 int ath12k_wmi_pdev_bss_chan_info_request(struct ath12k *ar, 4857 4857 enum wmi_bss_chan_info_req_type type); 4858 - int ath12k_wmi_send_stats_request_cmd(struct ath12k *ar, u32 stats_id, 4859 - u32 vdev_id, u32 pdev_id); 4860 4858 int ath12k_wmi_send_pdev_temperature_cmd(struct ath12k *ar); 4861 4859 int ath12k_wmi_send_peer_flush_tids_cmd(struct ath12k *ar, 4862 4860 u8 peer_addr[ETH_ALEN],
-1
drivers/net/wireless/ath/ath5k/ahb.c
··· 115 115 116 116 irq = platform_get_irq(pdev, 0); 117 117 if (irq < 0) { 118 - dev_err(&pdev->dev, "no IRQ resource found: %d\n", irq); 119 118 ret = irq; 120 119 goto err_iounmap; 121 120 }
-1
drivers/net/wireless/ath/ath5k/mac80211-ops.c
··· 382 382 mfilt[1] = multicast >> 32; 383 383 384 384 /* Only deal with supported flags */ 385 - changed_flags &= SUPPORTED_FIF_FLAGS; 386 385 *new_flags &= SUPPORTED_FIF_FLAGS; 387 386 388 387 /* If HW detects any phy or radar errors, leave those filters on.
+12 -15
drivers/net/wireless/ath/ath5k/phy.c
··· 26 26 27 27 #include <linux/delay.h> 28 28 #include <linux/slab.h> 29 + #include <linux/sort.h> 29 30 #include <asm/unaligned.h> 30 31 31 32 #include "ath5k.h" ··· 1555 1554 hist->nfval[hist->index] = noise_floor; 1556 1555 } 1557 1556 1557 + static int cmps16(const void *a, const void *b) 1558 + { 1559 + return *(s16 *)a - *(s16 *)b; 1560 + } 1561 + 1558 1562 /** 1559 1563 * ath5k_hw_get_median_noise_floor() - Get median NF from history buffer 1560 1564 * @ah: The &struct ath5k_hw ··· 1567 1561 static s16 1568 1562 ath5k_hw_get_median_noise_floor(struct ath5k_hw *ah) 1569 1563 { 1570 - s16 sort[ATH5K_NF_CAL_HIST_MAX]; 1571 - s16 tmp; 1572 - int i, j; 1564 + s16 sorted_nfval[ATH5K_NF_CAL_HIST_MAX]; 1565 + int i; 1573 1566 1574 - memcpy(sort, ah->ah_nfcal_hist.nfval, sizeof(sort)); 1575 - for (i = 0; i < ATH5K_NF_CAL_HIST_MAX - 1; i++) { 1576 - for (j = 1; j < ATH5K_NF_CAL_HIST_MAX - i; j++) { 1577 - if (sort[j] > sort[j - 1]) { 1578 - tmp = sort[j]; 1579 - sort[j] = sort[j - 1]; 1580 - sort[j - 1] = tmp; 1581 - } 1582 - } 1583 - } 1567 + memcpy(sorted_nfval, ah->ah_nfcal_hist.nfval, sizeof(sorted_nfval)); 1568 + sort(sorted_nfval, ATH5K_NF_CAL_HIST_MAX, sizeof(s16), cmps16, NULL); 1584 1569 for (i = 0; i < ATH5K_NF_CAL_HIST_MAX; i++) { 1585 1570 ATH5K_DBG(ah, ATH5K_DEBUG_CALIBRATE, 1586 - "cal %d:%d\n", i, sort[i]); 1571 + "cal %d:%d\n", i, sorted_nfval[i]); 1587 1572 } 1588 - return sort[(ATH5K_NF_CAL_HIST_MAX - 1) / 2]; 1573 + return sorted_nfval[(ATH5K_NF_CAL_HIST_MAX - 1) / 2]; 1589 1574 } 1590 1575 1591 1576 /**
-1
drivers/net/wireless/ath/ath9k/ath9k.h
··· 1129 1129 int ath9k_init_device(u16 devid, struct ath_softc *sc, 1130 1130 const struct ath_bus_ops *bus_ops); 1131 1131 void ath9k_deinit_device(struct ath_softc *sc); 1132 - void ath9k_reload_chainmask_settings(struct ath_softc *sc); 1133 1132 u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate); 1134 1133 void ath_start_rfkill_poll(struct ath_softc *sc); 1135 1134 void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
+16 -37
drivers/net/wireless/ath/ath9k/common-spectral.c
··· 855 855 { 856 856 struct ath_spec_scan_priv *spec_priv = file->private_data; 857 857 unsigned long val; 858 - char buf[32]; 859 - ssize_t len; 858 + ssize_t ret; 860 859 861 - len = min(count, sizeof(buf) - 1); 862 - if (copy_from_user(buf, user_buf, len)) 863 - return -EFAULT; 864 - 865 - buf[len] = '\0'; 866 - if (kstrtoul(buf, 0, &val)) 867 - return -EINVAL; 860 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 861 + if (ret) 862 + return ret; 868 863 869 864 if (val > 1) 870 865 return -EINVAL; ··· 898 903 { 899 904 struct ath_spec_scan_priv *spec_priv = file->private_data; 900 905 unsigned long val; 901 - char buf[32]; 902 - ssize_t len; 906 + ssize_t ret; 903 907 904 - len = min(count, sizeof(buf) - 1); 905 - if (copy_from_user(buf, user_buf, len)) 906 - return -EFAULT; 907 - 908 - buf[len] = '\0'; 909 - if (kstrtoul(buf, 0, &val)) 910 - return -EINVAL; 911 - 908 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 909 + if (ret) 910 + return ret; 912 911 if (val > 255) 913 912 return -EINVAL; 914 913 ··· 940 951 { 941 952 struct ath_spec_scan_priv *spec_priv = file->private_data; 942 953 unsigned long val; 943 - char buf[32]; 944 - ssize_t len; 954 + ssize_t ret; 945 955 946 - len = min(count, sizeof(buf) - 1); 947 - if (copy_from_user(buf, user_buf, len)) 948 - return -EFAULT; 949 - 950 - buf[len] = '\0'; 951 - if (kstrtoul(buf, 0, &val)) 952 - return -EINVAL; 956 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 957 + if (ret) 958 + return ret; 953 959 954 960 if (val > 255) 955 961 return -EINVAL; ··· 983 999 { 984 1000 struct ath_spec_scan_priv *spec_priv = file->private_data; 985 1001 unsigned long val; 986 - char buf[32]; 987 - ssize_t len; 1002 + ssize_t ret; 988 1003 989 - len = min(count, sizeof(buf) - 1); 990 - if (copy_from_user(buf, user_buf, len)) 991 - return -EFAULT; 992 - 993 - buf[len] = '\0'; 994 - if (kstrtoul(buf, 0, &val)) 995 - return -EINVAL; 1004 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 1005 + if (ret) 1006 + return ret; 996 1007 997 1008 if (val > 15) 998 1009 return -EINVAL;
-2
drivers/net/wireless/ath/ath9k/common.h
··· 85 85 struct ath_hw *ah, 86 86 struct cfg80211_chan_def *chandef); 87 87 int ath9k_cmn_count_streams(unsigned int chainmask, int max); 88 - void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common, 89 - enum ath_stomp_type stomp_type); 90 88 void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow, 91 89 u16 new_txpow, u16 *txpower); 92 90 void ath9k_cmn_init_crypto(struct ath_hw *ah);
+34 -74
drivers/net/wireless/ath/ath9k/debug.c
··· 96 96 } 97 97 98 98 static ssize_t write_file_debug(struct file *file, const char __user *user_buf, 99 - size_t count, loff_t *ppos) 99 + size_t count, loff_t *ppos) 100 100 { 101 101 struct ath_softc *sc = file->private_data; 102 102 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 103 103 unsigned long mask; 104 - char buf[32]; 105 - ssize_t len; 104 + ssize_t ret; 106 105 107 - len = min(count, sizeof(buf) - 1); 108 - if (copy_from_user(buf, user_buf, len)) 109 - return -EFAULT; 110 - 111 - buf[len] = '\0'; 112 - if (kstrtoul(buf, 0, &mask)) 113 - return -EINVAL; 106 + ret = kstrtoul_from_user(user_buf, count, 0, &mask); 107 + if (ret) 108 + return ret; 114 109 115 110 common->debug_mask = mask; 116 111 return count; ··· 186 191 struct ath_softc *sc = file->private_data; 187 192 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 188 193 unsigned long ani; 189 - char buf[32]; 190 - ssize_t len; 194 + ssize_t ret; 191 195 192 - len = min(count, sizeof(buf) - 1); 193 - if (copy_from_user(buf, user_buf, len)) 194 - return -EFAULT; 195 - 196 - buf[len] = '\0'; 197 - if (kstrtoul(buf, 0, &ani)) 198 - return -EINVAL; 196 + ret = kstrtoul_from_user(user_buf, count, 0, &ani); 197 + if (ret) 198 + return ret; 199 199 200 200 if (ani > 1) 201 201 return -EINVAL; ··· 238 248 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 239 249 struct ath9k_hw_capabilities *pCap = &sc->sc_ah->caps; 240 250 unsigned long bt_ant_diversity; 241 - char buf[32]; 242 - ssize_t len; 251 + ssize_t ret; 243 252 244 - len = min(count, sizeof(buf) - 1); 245 - if (copy_from_user(buf, user_buf, len)) 246 - return -EFAULT; 253 + ret = kstrtoul_from_user(user_buf, count, 0, &bt_ant_diversity); 254 + if (ret) 255 + return ret; 247 256 248 257 if (!(pCap->hw_caps & ATH9K_HW_CAP_BT_ANT_DIV)) 249 258 goto exit; 250 - 251 - buf[len] = '\0'; 252 - if (kstrtoul(buf, 0, &bt_ant_diversity)) 253 - return -EINVAL; 254 259 255 260 common->bt_ant_diversity = !!bt_ant_diversity; 256 261 ath9k_ps_wakeup(sc); ··· 777 792 struct ath_hw *ah = sc->sc_ah; 778 793 struct ath_common *common = ath9k_hw_common(ah); 779 794 unsigned long val; 780 - char buf[32]; 781 - ssize_t len; 795 + ssize_t ret; 782 796 783 - len = min(count, sizeof(buf) - 1); 784 - if (copy_from_user(buf, user_buf, len)) 785 - return -EFAULT; 786 - 787 - buf[len] = '\0'; 788 - if (kstrtoul(buf, 0, &val)) 789 - return -EINVAL; 797 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 798 + if (ret) 799 + return ret; 790 800 791 801 if (val != 1) 792 802 return -EINVAL; ··· 866 886 { 867 887 struct ath_softc *sc = file->private_data; 868 888 unsigned long regidx; 869 - char buf[32]; 870 - ssize_t len; 889 + ssize_t ret; 871 890 872 - len = min(count, sizeof(buf) - 1); 873 - if (copy_from_user(buf, user_buf, len)) 874 - return -EFAULT; 875 - 876 - buf[len] = '\0'; 877 - if (kstrtoul(buf, 0, &regidx)) 878 - return -EINVAL; 891 + ret = kstrtoul_from_user(user_buf, count, 0, &regidx); 892 + if (ret) 893 + return ret; 879 894 880 895 sc->debug.regidx = regidx; 881 896 return count; ··· 906 931 struct ath_softc *sc = file->private_data; 907 932 struct ath_hw *ah = sc->sc_ah; 908 933 unsigned long regval; 909 - char buf[32]; 910 - ssize_t len; 934 + ssize_t ret; 911 935 912 - len = min(count, sizeof(buf) - 1); 913 - if (copy_from_user(buf, user_buf, len)) 914 - return -EFAULT; 915 - 916 - buf[len] = '\0'; 917 - if (kstrtoul(buf, 0, &regval)) 918 - return -EINVAL; 936 + ret = kstrtoul_from_user(user_buf, count, 0, &regval); 937 + if (ret) 938 + return ret; 919 939 920 940 ath9k_ps_wakeup(sc); 921 941 REG_WRITE_D(ah, sc->debug.regidx, regval); ··· 1098 1128 { 1099 1129 struct ath_softc *sc = file->private_data; 1100 1130 unsigned long val; 1101 - char buf[32]; 1102 - ssize_t len; 1131 + ssize_t ret; 1103 1132 1104 - len = min(count, sizeof(buf) - 1); 1105 - if (copy_from_user(buf, user_buf, len)) 1106 - return -EFAULT; 1107 - 1108 - buf[len] = '\0'; 1109 - if (kstrtoul(buf, 0, &val)) 1110 - return -EINVAL; 1133 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 1134 + if (ret) 1135 + return ret; 1111 1136 1112 1137 if (val != 1) 1113 1138 return -EINVAL; ··· 1156 1191 struct ath_softc *sc = file->private_data; 1157 1192 struct ath_hw *ah = sc->sc_ah; 1158 1193 unsigned long val; 1159 - char buf[32]; 1160 - ssize_t len; 1194 + ssize_t ret; 1161 1195 bool tpc_enabled; 1162 1196 1163 - len = min(count, sizeof(buf) - 1); 1164 - if (copy_from_user(buf, user_buf, len)) 1165 - return -EFAULT; 1166 - 1167 - buf[len] = '\0'; 1168 - if (kstrtoul(buf, 0, &val)) 1169 - return -EINVAL; 1197 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 1198 + if (ret) 1199 + return ret; 1170 1200 1171 1201 if (val > 1) 1172 1202 return -EINVAL; ··· 1380 1420 1381 1421 sc->debug.debugfs_phy = debugfs_create_dir("ath9k", 1382 1422 sc->hw->wiphy->debugfsdir); 1383 - if (!sc->debug.debugfs_phy) 1423 + if (IS_ERR(sc->debug.debugfs_phy)) 1384 1424 return -ENOMEM; 1385 1425 1386 1426 #ifdef CONFIG_ATH_DEBUG
+4 -10
drivers/net/wireless/ath/ath9k/dfs_debug.c
··· 99 99 { 100 100 struct ath_softc *sc = file->private_data; 101 101 unsigned long val; 102 - char buf[32]; 103 - ssize_t len; 102 + ssize_t ret; 104 103 105 - len = min(count, sizeof(buf) - 1); 106 - if (copy_from_user(buf, user_buf, len)) 107 - return -EFAULT; 108 - 109 - buf[len] = '\0'; 110 - if (kstrtoul(buf, 0, &val)) 111 - return -EINVAL; 112 - 104 + ret = kstrtoul_from_user(user_buf, count, 0, &val); 105 + if (ret) 106 + return ret; 113 107 if (val == DFS_STATS_RESET_MAGIC) 114 108 memset(&sc->debug.stats.dfs_stats, 0, 115 109 sizeof(sc->debug.stats.dfs_stats));
+1 -2
drivers/net/wireless/ath/ath9k/eeprom_9287.c
··· 572 572 } 573 573 574 574 for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) { 575 - bool isHt40CtlMode = 576 - (pCtlMode[ctlMode] == CTL_2GHT40) ? true : false; 575 + bool isHt40CtlMode = pCtlMode[ctlMode] == CTL_2GHT40; 577 576 578 577 if (isHt40CtlMode) 579 578 freq = centers.synth_center;
+1 -1
drivers/net/wireless/ath/ath9k/hif_usb.c
··· 1432 1432 { 1433 1433 struct usb_device *udev = interface_to_usbdev(interface); 1434 1434 struct hif_device_usb *hif_dev = usb_get_intfdata(interface); 1435 - bool unplugged = (udev->state == USB_STATE_NOTATTACHED) ? true : false; 1435 + bool unplugged = udev->state == USB_STATE_NOTATTACHED; 1436 1436 1437 1437 if (!hif_dev) 1438 1438 return;
+5 -10
drivers/net/wireless/ath/ath9k/htc_drv_debug.c
··· 375 375 struct ath9k_htc_priv *priv = file->private_data; 376 376 struct ath_common *common = ath9k_hw_common(priv->ah); 377 377 unsigned long mask; 378 - char buf[32]; 379 - ssize_t len; 378 + ssize_t ret; 380 379 381 - len = min(count, sizeof(buf) - 1); 382 - if (copy_from_user(buf, user_buf, len)) 383 - return -EFAULT; 384 - 385 - buf[len] = '\0'; 386 - if (kstrtoul(buf, 0, &mask)) 387 - return -EINVAL; 380 + ret = kstrtoul_from_user(user_buf, count, 0, &mask); 381 + if (ret) 382 + return ret; 388 383 389 384 common->debug_mask = mask; 390 385 return count; ··· 486 491 487 492 priv->debug.debugfs_phy = debugfs_create_dir(KBUILD_MODNAME, 488 493 priv->hw->wiphy->debugfsdir); 489 - if (!priv->debug.debugfs_phy) 494 + if (IS_ERR(priv->debug.debugfs_phy)) 490 495 return -ENOMEM; 491 496 492 497 ath9k_cmn_spectral_init_debug(&priv->spec_priv, priv->debug.debugfs_phy);
+1 -2
drivers/net/wireless/ath/ath9k/htc_drv_main.c
··· 719 719 720 720 aggr.sta_index = ista->index; 721 721 aggr.tidno = tid & 0xf; 722 - aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false; 722 + aggr.aggr_enable = action == IEEE80211_AMPDU_TX_START; 723 723 724 724 WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr); 725 725 if (ret) ··· 1264 1264 u32 rfilt; 1265 1265 1266 1266 mutex_lock(&priv->mutex); 1267 - changed_flags &= SUPPORTED_FILTERS; 1268 1267 *total_flags &= SUPPORTED_FILTERS; 1269 1268 1270 1269 if (test_bit(ATH_OP_INVALID, &common->op_flags)) {
-1
drivers/net/wireless/ath/ath9k/main.c
··· 1571 1571 struct ath_chanctx *ctx; 1572 1572 u32 rfilt; 1573 1573 1574 - changed_flags &= SUPPORTED_FILTERS; 1575 1574 *total_flags &= SUPPORTED_FILTERS; 1576 1575 1577 1576 spin_lock_bh(&sc->chan_lock);
+4 -10
drivers/net/wireless/ath/ath9k/tx99.c
··· 172 172 { 173 173 struct ath_softc *sc = file->private_data; 174 174 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 175 - char buf[32]; 176 175 bool start; 177 - ssize_t len; 176 + ssize_t ret; 178 177 int r; 179 178 180 179 if (count < 1) ··· 182 183 if (sc->cur_chan->nvifs > 1) 183 184 return -EOPNOTSUPP; 184 185 185 - len = min(count, sizeof(buf) - 1); 186 - if (copy_from_user(buf, user_buf, len)) 187 - return -EFAULT; 188 - 189 - buf[len] = '\0'; 190 - 191 - if (kstrtobool(buf, &start)) 192 - return -EINVAL; 186 + ret = kstrtobool_from_user(user_buf, count, &start); 187 + if (ret) 188 + return ret; 193 189 194 190 mutex_lock(&sc->mutex); 195 191
+12 -8
drivers/net/wireless/ath/ath9k/wmi.c
··· 242 242 spin_unlock_irqrestore(&wmi->wmi_lock, flags); 243 243 goto free_skb; 244 244 } 245 - spin_unlock_irqrestore(&wmi->wmi_lock, flags); 246 245 247 246 /* WMI command response */ 248 247 ath9k_wmi_rsp_callback(wmi, skb); 248 + spin_unlock_irqrestore(&wmi->wmi_lock, flags); 249 249 250 250 free_skb: 251 251 kfree_skb(skb); ··· 283 283 284 284 static int ath9k_wmi_cmd_issue(struct wmi *wmi, 285 285 struct sk_buff *skb, 286 - enum wmi_cmd_id cmd, u16 len) 286 + enum wmi_cmd_id cmd, u16 len, 287 + u8 *rsp_buf, u32 rsp_len) 287 288 { 288 289 struct wmi_cmd_hdr *hdr; 289 290 unsigned long flags; ··· 294 293 hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); 295 294 296 295 spin_lock_irqsave(&wmi->wmi_lock, flags); 296 + 297 + /* record the rsp buffer and length */ 298 + wmi->cmd_rsp_buf = rsp_buf; 299 + wmi->cmd_rsp_len = rsp_len; 300 + 297 301 wmi->last_seq_id = wmi->tx_seq_id; 298 302 spin_unlock_irqrestore(&wmi->wmi_lock, flags); 299 303 ··· 314 308 struct ath_common *common = ath9k_hw_common(ah); 315 309 u16 headroom = sizeof(struct htc_frame_hdr) + 316 310 sizeof(struct wmi_cmd_hdr); 311 + unsigned long time_left, flags; 317 312 struct sk_buff *skb; 318 - unsigned long time_left; 319 313 int ret = 0; 320 314 321 315 if (ah->ah_flags & AH_UNPLUGGED) ··· 339 333 goto out; 340 334 } 341 335 342 - /* record the rsp buffer and length */ 343 - wmi->cmd_rsp_buf = rsp_buf; 344 - wmi->cmd_rsp_len = rsp_len; 345 - 346 - ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len); 336 + ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len, rsp_buf, rsp_len); 347 337 if (ret) 348 338 goto out; 349 339 ··· 347 345 if (!time_left) { 348 346 ath_dbg(common, WMI, "Timeout waiting for WMI command: %s\n", 349 347 wmi_cmd_to_name(cmd_id)); 348 + spin_lock_irqsave(&wmi->wmi_lock, flags); 350 349 wmi->last_seq_id = 0; 350 + spin_unlock_irqrestore(&wmi->wmi_lock, flags); 351 351 mutex_unlock(&wmi->op_mutex); 352 352 return -ETIMEDOUT; 353 353 }
+1 -1
drivers/net/wireless/ath/key.c
··· 104 104 * Not setting this bit allows the hardware to use the key 105 105 * for multicast frame decryption. 106 106 */ 107 - if (mac[0] & 0x01) 107 + if (is_multicast_ether_addr(mac)) 108 108 unicast_flag = 0; 109 109 110 110 macLo = get_unaligned_le32(mac);
+4 -4
drivers/net/wireless/atmel/at76c50x-usb.c
··· 10 10 * Copyright (c) 2007 Kalle Valo <kalle.valo@iki.fi> 11 11 * Copyright (c) 2010 Sebastian Smolorz <sesmo@gmx.net> 12 12 * 13 - * This file is part of the Berlios driver for WLAN USB devices based on the 13 + * This file is part of the Berlios driver for USB WLAN devices based on the 14 14 * Atmel AT76C503A/505/505A. 15 15 * 16 16 * Some iw_handler code was taken from airo.c, (C) 1999 Benjamin Reed ··· 143 143 { USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861) }, 144 144 /* Dynalink/Askey WLL013 (intersil) */ 145 145 { USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861) }, 146 - /* EZ connect 11Mpbs Wireless USB Adapter SMC2662W v1 */ 146 + /* EZ connect 11Mpbs USB Wireless Adapter SMC2662W v1 */ 147 147 { USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861) }, 148 148 /* BenQ AWL300 */ 149 149 { USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861) }, ··· 195 195 { USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503) }, 196 196 /* 3Com 3CRSHEW696 */ 197 197 { USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503) }, 198 - /* Siemens Santis ADSL WLAN USB adapter WLL 013 */ 198 + /* Siemens Santis ADSL USB WLAN adapter WLL 013 */ 199 199 { USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503) }, 200 200 /* Belkin F5D6050, version 2 */ 201 201 { USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503) }, ··· 238 238 { USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958) }, 239 239 /* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */ 240 240 { USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958) }, 241 - /* Corega WLAN USB Stick 11 */ 241 + /* Corega USB WLAN Stick 11 */ 242 242 { USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) }, 243 243 /* Microstar MSI Box MS6978 */ 244 244 { USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958) },
+12 -27
drivers/net/wireless/intel/ipw2x00/ipw2200.c
··· 1176 1176 static ssize_t debug_level_store(struct device_driver *d, const char *buf, 1177 1177 size_t count) 1178 1178 { 1179 - char *p = (char *)buf; 1180 - u32 val; 1179 + unsigned long val; 1181 1180 1182 - if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') { 1183 - p++; 1184 - if (p[0] == 'x' || p[0] == 'X') 1185 - p++; 1186 - val = simple_strtoul(p, &p, 16); 1187 - } else 1188 - val = simple_strtoul(p, &p, 10); 1189 - if (p == buf) 1181 + int result = kstrtoul(buf, 0, &val); 1182 + 1183 + if (result == -EINVAL) 1190 1184 printk(KERN_INFO DRV_NAME 1191 1185 ": %s is not in hex or decimal form.\n", buf); 1186 + else if (result == -ERANGE) 1187 + printk(KERN_INFO DRV_NAME 1188 + ": %s has overflowed.\n", buf); 1192 1189 else 1193 1190 ipw_debug_level = val; 1194 1191 1195 - return strnlen(buf, count); 1192 + return count; 1196 1193 } 1197 1194 static DRIVER_ATTR_RW(debug_level); 1198 1195 ··· 1458 1461 { 1459 1462 struct ipw_priv *priv = dev_get_drvdata(d); 1460 1463 struct net_device *dev = priv->net_dev; 1461 - char buffer[] = "00000000"; 1462 - unsigned long len = 1463 - (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1; 1464 - unsigned long val; 1465 - char *p = buffer; 1466 1464 1467 1465 IPW_DEBUG_INFO("enter\n"); 1468 1466 1469 - strncpy(buffer, buf, len); 1470 - buffer[len] = 0; 1467 + unsigned long val; 1468 + int result = kstrtoul(buf, 0, &val); 1471 1469 1472 - if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') { 1473 - p++; 1474 - if (p[0] == 'x' || p[0] == 'X') 1475 - p++; 1476 - val = simple_strtoul(p, &p, 16); 1477 - } else 1478 - val = simple_strtoul(p, &p, 10); 1479 - if (p == buffer) { 1470 + if (result == -EINVAL || result == -ERANGE) { 1480 1471 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name); 1481 1472 } else { 1482 1473 priv->ieee->scan_age = val; ··· 1472 1487 } 1473 1488 1474 1489 IPW_DEBUG_INFO("exit\n"); 1475 - return len; 1490 + return count; 1476 1491 } 1477 1492 1478 1493 static DEVICE_ATTR_RW(scan_age);
+5
drivers/net/wireless/intel/iwlwifi/fw/acpi.c
··· 69 69 DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), 70 70 }, 71 71 }, 72 + { .ident = "RAZER", 73 + .matches = { 74 + DMI_MATCH(DMI_SYS_VENDOR, "Razer"), 75 + }, 76 + }, 72 77 {} 73 78 }; 74 79
+7 -2
drivers/net/wireless/intel/iwlwifi/fw/api/debug.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2005-2014, 2018-2022 Intel Corporation 3 + * Copyright (C) 2005-2014, 2018-2023 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 29 29 * &struct iwl_dbg_host_event_cfg_cmd 30 30 */ 31 31 HOST_EVENT_CFG = 0x3, 32 + /** 33 + * @INVALID_WR_PTR_CMD: invalid write pointer, set in the TFD 34 + * when it's not in use 35 + */ 36 + INVALID_WR_PTR_CMD = 0x6, 32 37 /** 33 38 * @DBGC_SUSPEND_RESUME: 34 39 * DBGC suspend/resume commad. Uses a single dword as data: ··· 382 377 #define DRAM_INFO_SECOND_MAGIC_WORD 0x89ABCDEF 383 378 384 379 /** 385 - * struct iwL_dram_info - DRAM fragments allocation struct 380 + * struct iwl_dram_info - DRAM fragments allocation struct 386 381 * 387 382 * Driver will fill in the first 1K(+) of the pointed DRAM fragment 388 383 *
+1 -2
drivers/net/wireless/intel/iwlwifi/fw/dump.c
··· 182 182 base = fwrt->fw->inst_errlog_ptr; 183 183 } 184 184 185 - if ((fwrt->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ && !base) || 186 - (fwrt->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_BZ && base < 0x400000)) { 185 + if (!base) { 187 186 IWL_ERR(fwrt, 188 187 "Not valid error log pointer 0x%08X for %s uCode\n", 189 188 base,
+2
drivers/net/wireless/intel/iwlwifi/iwl-fh.h
··· 565 565 #define RX_QUEUE_MASK 255 566 566 #define RX_QUEUE_SIZE_LOG 8 567 567 568 + #define IWL_DEFAULT_RX_QUEUE 0 569 + 568 570 /** 569 571 * struct iwl_rb_status - reserve buffer status 570 572 * host memory mapped FH registers
+2
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
··· 990 990 case IWL_CFG_RF_TYPE_GF: 991 991 case IWL_CFG_RF_TYPE_MR: 992 992 case IWL_CFG_RF_TYPE_MS: 993 + case IWL_CFG_RF_TYPE_FM: 994 + case IWL_CFG_RF_TYPE_WH: 993 995 iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |= 994 996 IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU; 995 997 if (!is_ap)
+5 -2
drivers/net/wireless/intel/iwlwifi/iwl-trans.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2005-2014, 2018-2022 Intel Corporation 3 + * Copyright (C) 2005-2014, 2018-2023 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 1069 1069 * @mbx_addr_1_step: step address data 1 1070 1070 * @pcie_link_speed: current PCIe link speed (%PCI_EXP_LNKSTA_CLS_*), 1071 1071 * only valid for discrete (not integrated) NICs 1072 + * @invalid_tx_cmd: invalid TX command buffer 1072 1073 */ 1073 1074 struct iwl_trans { 1074 1075 bool csme_own; ··· 1133 1132 u32 mbx_addr_1_step; 1134 1133 1135 1134 u8 pcie_link_speed; 1135 + 1136 + struct iwl_dma_ptr invalid_tx_cmd; 1136 1137 1137 1138 /* pointer to trans specific struct */ 1138 1139 /*Ensure that this pointer will always be aligned to sizeof pointer */ ··· 1493 1490 { 1494 1491 u32 value; 1495 1492 1496 - if (WARN_ON(iwl_trans_read_mem(trans, addr, &value, 1))) 1493 + if (iwl_trans_read_mem(trans, addr, &value, 1)) 1497 1494 return 0xa5a5a5a5; 1498 1495 1499 1496 return value;
+36 -34
drivers/net/wireless/intel/iwlwifi/mei/main.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* 3 - * Copyright (C) 2021-2022 Intel Corporation 3 + * Copyright (C) 2021-2023 Intel Corporation 4 4 */ 5 5 6 6 #include <linux/etherdevice.h> ··· 774 774 iwl_mei_send_sap_msg_payload(mei->cldev, &sar_msg.hdr); 775 775 } 776 776 777 - ether_addr_copy(nic_info_msg.mac_address, iwl_mei_cache.mac_address); 778 - ether_addr_copy(nic_info_msg.nvm_address, iwl_mei_cache.nvm_address); 779 - iwl_mei_send_sap_msg_payload(mei->cldev, &nic_info_msg.hdr); 777 + if (is_valid_ether_addr(iwl_mei_cache.mac_address)) { 778 + ether_addr_copy(nic_info_msg.mac_address, 779 + iwl_mei_cache.mac_address); 780 + ether_addr_copy(nic_info_msg.nvm_address, 781 + iwl_mei_cache.nvm_address); 782 + iwl_mei_send_sap_msg_payload(mei->cldev, &nic_info_msg.hdr); 783 + } 780 784 781 785 iwl_mei_send_sap_msg_payload(mei->cldev, &rfkill_msg.hdr); 782 786 } ··· 1536 1532 1537 1533 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1538 1534 1539 - if (!mei && !mei->amt_enabled) 1535 + if (!mei || !mei->amt_enabled) 1540 1536 goto out; 1541 1537 1542 1538 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr); ··· 1565 1561 1566 1562 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1567 1563 1568 - if (!mei && !mei->amt_enabled) 1564 + if (!mei || !mei->amt_enabled) 1569 1565 goto out; 1570 1566 1571 1567 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr); ··· 1601 1597 1602 1598 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1603 1599 1604 - if (!mei && !mei->amt_enabled) 1600 + if (!mei || !mei->amt_enabled) 1605 1601 goto out; 1606 1602 1607 1603 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr); ··· 1630 1626 1631 1627 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1632 1628 1633 - if (!mei && !mei->amt_enabled) 1629 + if (!mei || !mei->amt_enabled) 1634 1630 goto out; 1635 1631 1636 1632 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr); ··· 1658 1654 1659 1655 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1660 1656 1661 - if (!mei && !mei->amt_enabled) 1657 + if (!mei || !mei->amt_enabled) 1662 1658 goto out; 1663 1659 1664 1660 iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr); ··· 1684 1680 1685 1681 mei = mei_cldev_get_drvdata(iwl_mei_global_cldev); 1686 1682 1687 - if (!mei && !mei->amt_enabled) 1683 + if (!mei || !mei->amt_enabled) 1688 1684 goto out; 1689 1685 1690 1686 memcpy(msg.sar_chain_info_table, power_limit, sizeof(msg.sar_chain_info_table)); ··· 1836 1832 struct iwl_mei *mei = 1837 1833 mei_cldev_get_drvdata(iwl_mei_global_cldev); 1838 1834 1839 - iwl_mei_send_sap_msg(mei->cldev, SAP_MSG_NOTIF_WIFIDR_DOWN); 1835 + if (mei->amt_enabled) 1836 + iwl_mei_send_sap_msg(mei->cldev, 1837 + SAP_MSG_NOTIF_WIFIDR_DOWN); 1840 1838 mei->got_ownership = false; 1841 1839 } 1842 1840 ··· 2076 2070 2077 2071 mutex_lock(&iwl_mei_mutex); 2078 2072 2079 - if (mei->amt_enabled) { 2080 - /* 2081 - * Tell CSME that we are going down so that it won't access the 2082 - * memory anymore, make sure this message goes through immediately. 2083 - */ 2084 - mei->csa_throttled = false; 2085 - iwl_mei_send_sap_msg(mei->cldev, 2086 - SAP_MSG_NOTIF_HOST_GOES_DOWN); 2073 + /* Tell CSME that we are going down so that it won't access the 2074 + * memory anymore, make sure this message goes through immediately. 2075 + */ 2076 + mei->csa_throttled = false; 2077 + iwl_mei_send_sap_msg(mei->cldev, 2078 + SAP_MSG_NOTIF_HOST_GOES_DOWN); 2087 2079 2088 - for (i = 0; i < SEND_SAP_MAX_WAIT_ITERATION; i++) { 2089 - if (!iwl_mei_host_to_me_data_pending(mei)) 2090 - break; 2080 + for (i = 0; i < SEND_SAP_MAX_WAIT_ITERATION; i++) { 2081 + if (!iwl_mei_host_to_me_data_pending(mei)) 2082 + break; 2091 2083 2092 - msleep(20); 2093 - } 2094 - 2095 - /* 2096 - * If we couldn't make sure that CSME saw the HOST_GOES_DOWN 2097 - * message, it means that it will probably keep reading memory 2098 - * that we are going to unmap and free, expect IOMMU error 2099 - * messages. 2100 - */ 2101 - if (i == SEND_SAP_MAX_WAIT_ITERATION) 2102 - dev_err(&mei->cldev->dev, 2103 - "Couldn't get ACK from CSME on HOST_GOES_DOWN message\n"); 2084 + msleep(20); 2104 2085 } 2086 + 2087 + /* If we couldn't make sure that CSME saw the HOST_GOES_DOWN 2088 + * message, it means that it will probably keep reading memory 2089 + * that we are going to unmap and free, expect IOMMU error 2090 + * messages. 2091 + */ 2092 + if (i == SEND_SAP_MAX_WAIT_ITERATION) 2093 + dev_err(&mei->cldev->dev, 2094 + "Couldn't get ACK from CSME on HOST_GOES_DOWN message\n"); 2105 2095 2106 2096 mutex_unlock(&iwl_mei_mutex); 2107 2097
+3 -8
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
··· 315 315 ieee80211_hw_set(hw, STA_MMPDU_TXQ); 316 316 317 317 /* Set this early since we need to have it for the check below */ 318 - if (mvm->mld_api_is_used && 319 - mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ) 318 + if (mvm->mld_api_is_used && mvm->nvm_data->sku_cap_11be_enable && 319 + !iwlwifi_mod_params.disable_11ax && 320 + !iwlwifi_mod_params.disable_11be) 320 321 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO; 321 322 322 323 /* With MLD FW API, it tracks timing by itself, ··· 5605 5604 return; 5606 5605 } 5607 5606 5608 - if (vif->type != NL80211_IFTYPE_STATION) 5609 - return; 5610 - 5611 5607 /* Make sure we're done with the deferred traffic before flushing */ 5612 5608 flush_work(&mvm->add_stream_wk); 5613 5609 ··· 5627 5629 continue; 5628 5630 ap_sta_done = true; 5629 5631 } 5630 - 5631 - /* make sure only TDLS peers or the AP are flushed */ 5632 - WARN_ON_ONCE(sta != mvmvif->ap_sta && !sta->tdls); 5633 5632 5634 5633 if (drop) { 5635 5634 if (iwl_mvm_flush_sta(mvm, mvmsta, false))
+1 -10
drivers/net/wireless/intel/iwlwifi/pcie/drv.c
··· 1132 1132 else 1133 1133 sd_reg_ver_addr = SD_REG_VER; 1134 1134 1135 - if (!iwl_trans_grab_nic_access(iwl_trans)) { 1136 - IWL_ERR(iwl_trans, "Failed to grab nic access before reading crf id\n"); 1137 - ret = -EIO; 1138 - goto out; 1139 - } 1140 - 1141 1135 /* Enable access to peripheral registers */ 1142 1136 val = iwl_read_umac_prph_no_grab(iwl_trans, WFPM_CTRL_REG); 1143 1137 val |= ENABLE_WFPM; ··· 1151 1157 iwl_trans->hw_crf_id, iwl_trans->hw_cnv_id, 1152 1158 iwl_trans->hw_wfpm_id); 1153 1159 1154 - iwl_trans_release_nic_access(iwl_trans); 1155 - 1156 - out: 1157 1160 return ret; 1158 1161 } 1159 1162 ··· 1342 1351 if (ret) 1343 1352 goto out_free_trans; 1344 1353 if (iwl_trans_grab_nic_access(iwl_trans)) { 1354 + get_crf_id(iwl_trans); 1345 1355 /* all good */ 1346 1356 iwl_trans_release_nic_access(iwl_trans); 1347 1357 } else { ··· 1352 1360 } 1353 1361 1354 1362 iwl_trans->hw_rf_id = iwl_read32(iwl_trans, CSR_HW_RF_ID); 1355 - get_crf_id(iwl_trans); 1356 1363 1357 1364 /* 1358 1365 * The RF_ID is set to zero in blank OTP so read version to
+1 -3
drivers/net/wireless/intel/iwlwifi/pcie/internal.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 2 /* 3 - * Copyright (C) 2003-2015, 2018-2022 Intel Corporation 3 + * Copyright (C) 2003-2015, 2018-2023 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 6 */ ··· 315 315 * @ucode_write_complete: indicates that the ucode has been copied. 316 316 * @ucode_write_waitq: wait queue for uCode load 317 317 * @cmd_queue - command queue number 318 - * @def_rx_queue - default rx queue number 319 318 * @rx_buf_size: Rx buffer size 320 319 * @scd_set_active: should the transport configure the SCD for HCMD queue 321 320 * @rx_page_order: page order for receive buffer size ··· 397 398 wait_queue_head_t ucode_write_waitq; 398 399 wait_queue_head_t sx_waitq; 399 400 400 - u8 def_rx_queue; 401 401 u8 n_no_reclaim_cmds; 402 402 u8 no_reclaim_cmds[MAX_NO_RECLAIM_CMDS]; 403 403 u16 num_rx_bufs;
+1 -1
drivers/net/wireless/intel/iwlwifi/pcie/rx.c
··· 1373 1373 } 1374 1374 } 1375 1375 1376 - if (rxq->id == trans_pcie->def_rx_queue) 1376 + if (rxq->id == IWL_DEFAULT_RX_QUEUE) 1377 1377 iwl_op_mode_rx(trans->op_mode, &rxq->napi, 1378 1378 &rxcb); 1379 1379 else
+29 -2
drivers/net/wireless/intel/iwlwifi/pcie/trans.c
··· 2018 2018 memset(desc_dram, 0, sizeof(*desc_dram)); 2019 2019 } 2020 2020 2021 + static void iwl_pcie_free_invalid_tx_cmd(struct iwl_trans *trans) 2022 + { 2023 + iwl_pcie_free_dma_ptr(trans, &trans->invalid_tx_cmd); 2024 + } 2025 + 2026 + static int iwl_pcie_alloc_invalid_tx_cmd(struct iwl_trans *trans) 2027 + { 2028 + struct iwl_cmd_header_wide bad_cmd = { 2029 + .cmd = INVALID_WR_PTR_CMD, 2030 + .group_id = DEBUG_GROUP, 2031 + .sequence = cpu_to_le16(0xffff), 2032 + .length = cpu_to_le16(0), 2033 + .version = 0, 2034 + }; 2035 + int ret; 2036 + 2037 + ret = iwl_pcie_alloc_dma_ptr(trans, &trans->invalid_tx_cmd, 2038 + sizeof(bad_cmd)); 2039 + if (ret) 2040 + return ret; 2041 + memcpy(trans->invalid_tx_cmd.addr, &bad_cmd, sizeof(bad_cmd)); 2042 + return 0; 2043 + } 2044 + 2021 2045 void iwl_trans_pcie_free(struct iwl_trans *trans) 2022 2046 { 2023 2047 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); ··· 2071 2047 } else { 2072 2048 iwl_pcie_free_ict(trans); 2073 2049 } 2050 + 2051 + iwl_pcie_free_invalid_tx_cmd(trans); 2074 2052 2075 2053 iwl_pcie_free_fw_monitor(trans); 2076 2054 ··· 3643 3617 PCIE_LINK_STATE_CLKPM); 3644 3618 } 3645 3619 3646 - trans_pcie->def_rx_queue = 0; 3647 - 3648 3620 pci_set_master(pdev); 3649 3621 3650 3622 addr_size = trans->txqs.tfd.addr_size; ··· 3710 3686 3711 3687 init_waitqueue_head(&trans_pcie->sx_waitq); 3712 3688 3689 + ret = iwl_pcie_alloc_invalid_tx_cmd(trans); 3690 + if (ret) 3691 + goto out_no_pci; 3713 3692 3714 3693 if (trans_pcie->msix_enabled) { 3715 3694 ret = iwl_pcie_init_msix_handler(pdev, trans_pcie);
+6 -18
drivers/net/wireless/intel/iwlwifi/pcie/tx.c
··· 132 132 } 133 133 } 134 134 135 - static inline void iwl_pcie_tfd_set_tb(struct iwl_trans *trans, void *tfd, 136 - u8 idx, dma_addr_t addr, u16 len) 137 - { 138 - struct iwl_tfd *tfd_fh = (void *)tfd; 139 - struct iwl_tfd_tb *tb = &tfd_fh->tbs[idx]; 140 - 141 - u16 hi_n_len = len << 4; 142 - 143 - put_unaligned_le32(addr, &tb->lo); 144 - hi_n_len |= iwl_get_dma_hi_addr(addr); 145 - 146 - tb->hi_n_len = cpu_to_le16(hi_n_len); 147 - 148 - tfd_fh->num_tbs = idx + 1; 149 - } 150 - 151 135 static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq, 152 136 dma_addr_t addr, u16 len, bool reset) 153 137 { ··· 156 172 "Unaligned address = %llx\n", (unsigned long long)addr)) 157 173 return -EINVAL; 158 174 159 - iwl_pcie_tfd_set_tb(trans, tfd, num_tbs, addr, len); 175 + iwl_pcie_gen1_tfd_set_tb(trans, tfd, num_tbs, addr, len); 160 176 161 177 return num_tbs; 162 178 } ··· 1187 1203 group_id = cmd->hdr.group_id; 1188 1204 cmd_id = WIDE_ID(group_id, cmd->hdr.cmd); 1189 1205 1190 - iwl_txq_gen1_tfd_unmap(trans, meta, txq, index); 1206 + if (trans->trans_cfg->gen2) 1207 + iwl_txq_gen2_tfd_unmap(trans, meta, 1208 + iwl_txq_get_tfd(trans, txq, index)); 1209 + else 1210 + iwl_txq_gen1_tfd_unmap(trans, meta, txq, index); 1191 1211 1192 1212 /* Input error checking is done when commands are added to queue. */ 1193 1213 if (meta->flags & CMD_WANT_SKB) {
+78 -64
drivers/net/wireless/intel/iwlwifi/queue/tx.c
··· 10 10 #include "fw/api/commands.h" 11 11 #include "fw/api/tx.h" 12 12 #include "fw/api/datapath.h" 13 + #include "fw/api/debug.h" 13 14 #include "queue/tx.h" 14 15 #include "iwl-fh.h" 15 16 #include "iwl-scd.h" ··· 85 84 return le16_to_cpu(tfd->num_tbs) & 0x1f; 86 85 } 87 86 87 + int iwl_txq_gen2_set_tb(struct iwl_trans *trans, struct iwl_tfh_tfd *tfd, 88 + dma_addr_t addr, u16 len) 89 + { 90 + int idx = iwl_txq_gen2_get_num_tbs(trans, tfd); 91 + struct iwl_tfh_tb *tb; 92 + 93 + /* Only WARN here so we know about the issue, but we mess up our 94 + * unmap path because not every place currently checks for errors 95 + * returned from this function - it can only return an error if 96 + * there's no more space, and so when we know there is enough we 97 + * don't always check ... 98 + */ 99 + WARN(iwl_txq_crosses_4g_boundary(addr, len), 100 + "possible DMA problem with iova:0x%llx, len:%d\n", 101 + (unsigned long long)addr, len); 102 + 103 + if (WARN_ON(idx >= IWL_TFH_NUM_TBS)) 104 + return -EINVAL; 105 + tb = &tfd->tbs[idx]; 106 + 107 + /* Each TFD can point to a maximum max_tbs Tx buffers */ 108 + if (le16_to_cpu(tfd->num_tbs) >= trans->txqs.tfd.max_tbs) { 109 + IWL_ERR(trans, "Error can not send more than %d chunks\n", 110 + trans->txqs.tfd.max_tbs); 111 + return -EINVAL; 112 + } 113 + 114 + put_unaligned_le64(addr, &tb->addr); 115 + tb->tb_len = cpu_to_le16(len); 116 + 117 + tfd->num_tbs = cpu_to_le16(idx + 1); 118 + 119 + return idx; 120 + } 121 + 122 + static void iwl_txq_set_tfd_invalid_gen2(struct iwl_trans *trans, 123 + struct iwl_tfh_tfd *tfd) 124 + { 125 + tfd->num_tbs = 0; 126 + 127 + iwl_txq_gen2_set_tb(trans, tfd, trans->invalid_tx_cmd.dma, 128 + trans->invalid_tx_cmd.size); 129 + } 130 + 88 131 void iwl_txq_gen2_tfd_unmap(struct iwl_trans *trans, struct iwl_cmd_meta *meta, 89 132 struct iwl_tfh_tfd *tfd) 90 133 { ··· 156 111 DMA_TO_DEVICE); 157 112 } 158 113 159 - tfd->num_tbs = 0; 114 + iwl_txq_set_tfd_invalid_gen2(trans, tfd); 160 115 } 161 116 162 117 void iwl_txq_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) ··· 185 140 iwl_op_mode_free_skb(trans->op_mode, skb); 186 141 txq->entries[idx].skb = NULL; 187 142 } 188 - } 189 - 190 - int iwl_txq_gen2_set_tb(struct iwl_trans *trans, struct iwl_tfh_tfd *tfd, 191 - dma_addr_t addr, u16 len) 192 - { 193 - int idx = iwl_txq_gen2_get_num_tbs(trans, tfd); 194 - struct iwl_tfh_tb *tb; 195 - 196 - /* 197 - * Only WARN here so we know about the issue, but we mess up our 198 - * unmap path because not every place currently checks for errors 199 - * returned from this function - it can only return an error if 200 - * there's no more space, and so when we know there is enough we 201 - * don't always check ... 202 - */ 203 - WARN(iwl_txq_crosses_4g_boundary(addr, len), 204 - "possible DMA problem with iova:0x%llx, len:%d\n", 205 - (unsigned long long)addr, len); 206 - 207 - if (WARN_ON(idx >= IWL_TFH_NUM_TBS)) 208 - return -EINVAL; 209 - tb = &tfd->tbs[idx]; 210 - 211 - /* Each TFD can point to a maximum max_tbs Tx buffers */ 212 - if (le16_to_cpu(tfd->num_tbs) >= trans->txqs.tfd.max_tbs) { 213 - IWL_ERR(trans, "Error can not send more than %d chunks\n", 214 - trans->txqs.tfd.max_tbs); 215 - return -EINVAL; 216 - } 217 - 218 - put_unaligned_le64(addr, &tb->addr); 219 - tb->tb_len = cpu_to_le16(len); 220 - 221 - tfd->num_tbs = cpu_to_le16(idx + 1); 222 - 223 - return idx; 224 143 } 225 144 226 145 static struct page *get_workaround_page(struct iwl_trans *trans, ··· 1035 1026 iwl_force_nmi(trans); 1036 1027 } 1037 1028 1029 + static void iwl_txq_set_tfd_invalid_gen1(struct iwl_trans *trans, 1030 + struct iwl_tfd *tfd) 1031 + { 1032 + tfd->num_tbs = 0; 1033 + 1034 + iwl_pcie_gen1_tfd_set_tb(trans, tfd, 0, trans->invalid_tx_cmd.dma, 1035 + trans->invalid_tx_cmd.size); 1036 + } 1037 + 1038 1038 int iwl_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, int slots_num, 1039 1039 bool cmd_queue) 1040 1040 { 1041 - size_t tfd_sz = trans->txqs.tfd.size * 1042 - trans->trans_cfg->base_params->max_tfd_queue_size; 1041 + size_t num_entries = trans->trans_cfg->gen2 ? 1042 + slots_num : trans->trans_cfg->base_params->max_tfd_queue_size; 1043 + size_t tfd_sz; 1043 1044 size_t tb0_buf_sz; 1044 1045 int i; 1045 1046 ··· 1059 1040 if (WARN_ON(txq->entries || txq->tfds)) 1060 1041 return -EINVAL; 1061 1042 1062 - if (trans->trans_cfg->gen2) 1063 - tfd_sz = trans->txqs.tfd.size * slots_num; 1043 + tfd_sz = trans->txqs.tfd.size * num_entries; 1064 1044 1065 1045 timer_setup(&txq->stuck_timer, iwl_txq_stuck_timer, 0); 1066 1046 txq->trans = trans; ··· 1098 1080 GFP_KERNEL); 1099 1081 if (!txq->first_tb_bufs) 1100 1082 goto err_free_tfds; 1083 + 1084 + for (i = 0; i < num_entries; i++) { 1085 + void *tfd = iwl_txq_get_tfd(trans, txq, i); 1086 + 1087 + if (trans->trans_cfg->gen2) 1088 + iwl_txq_set_tfd_invalid_gen2(trans, tfd); 1089 + else 1090 + iwl_txq_set_tfd_invalid_gen1(trans, tfd); 1091 + } 1101 1092 1102 1093 return 0; 1103 1094 err_free_tfds: ··· 1367 1340 } 1368 1341 1369 1342 static inline dma_addr_t iwl_txq_gen1_tfd_tb_get_addr(struct iwl_trans *trans, 1370 - void *_tfd, u8 idx) 1343 + struct iwl_tfd *tfd, u8 idx) 1371 1344 { 1372 - struct iwl_tfd *tfd; 1373 - struct iwl_tfd_tb *tb; 1345 + struct iwl_tfd_tb *tb = &tfd->tbs[idx]; 1374 1346 dma_addr_t addr; 1375 1347 dma_addr_t hi_len; 1376 1348 1377 - if (trans->trans_cfg->gen2) { 1378 - struct iwl_tfh_tfd *tfh_tfd = _tfd; 1379 - struct iwl_tfh_tb *tfh_tb = &tfh_tfd->tbs[idx]; 1380 - 1381 - return (dma_addr_t)(le64_to_cpu(tfh_tb->addr)); 1382 - } 1383 - 1384 - tfd = _tfd; 1385 - tb = &tfd->tbs[idx]; 1386 1349 addr = get_unaligned_le32(&tb->lo); 1387 1350 1388 1351 if (sizeof(dma_addr_t) <= sizeof(u32)) ··· 1393 1376 struct iwl_txq *txq, int index) 1394 1377 { 1395 1378 int i, num_tbs; 1396 - void *tfd = iwl_txq_get_tfd(trans, txq, index); 1379 + struct iwl_tfd *tfd = iwl_txq_get_tfd(trans, txq, index); 1397 1380 1398 1381 /* Sanity check on number of chunks */ 1399 1382 num_tbs = iwl_txq_gen1_tfd_get_num_tbs(trans, tfd); ··· 1425 1408 1426 1409 meta->tbs = 0; 1427 1410 1428 - if (trans->trans_cfg->gen2) { 1429 - struct iwl_tfh_tfd *tfd_fh = (void *)tfd; 1430 - 1431 - tfd_fh->num_tbs = 0; 1432 - } else { 1433 - struct iwl_tfd *tfd_fh = (void *)tfd; 1434 - 1435 - tfd_fh->num_tbs = 0; 1436 - } 1411 + iwl_txq_set_tfd_invalid_gen1(trans, tfd); 1437 1412 } 1438 1413 1439 1414 #define IWL_TX_CRC_SIZE 4 ··· 1529 1520 /* We have only q->n_window txq->entries, but we use 1530 1521 * TFD_QUEUE_SIZE_MAX tfds 1531 1522 */ 1532 - iwl_txq_gen1_tfd_unmap(trans, &txq->entries[idx].meta, txq, rd_ptr); 1523 + if (trans->trans_cfg->gen2) 1524 + iwl_txq_gen2_tfd_unmap(trans, &txq->entries[idx].meta, 1525 + iwl_txq_get_tfd(trans, txq, rd_ptr)); 1526 + else 1527 + iwl_txq_gen1_tfd_unmap(trans, &txq->entries[idx].meta, 1528 + txq, rd_ptr); 1533 1529 1534 1530 /* free SKB */ 1535 1531 skb = txq->entries[idx].skb;
+16 -10
drivers/net/wireless/intel/iwlwifi/queue/tx.h
··· 131 131 struct sk_buff *skb); 132 132 #endif 133 133 static inline u8 iwl_txq_gen1_tfd_get_num_tbs(struct iwl_trans *trans, 134 - void *_tfd) 134 + struct iwl_tfd *tfd) 135 135 { 136 - struct iwl_tfd *tfd; 137 - 138 - if (trans->trans_cfg->gen2) { 139 - struct iwl_tfh_tfd *tfh_tfd = _tfd; 140 - 141 - return le16_to_cpu(tfh_tfd->num_tbs) & 0x1f; 142 - } 143 - 144 - tfd = (struct iwl_tfd *)_tfd; 145 136 return tfd->num_tbs & 0x1f; 146 137 } 147 138 ··· 153 162 tb = &tfd->tbs[idx]; 154 163 155 164 return le16_to_cpu(tb->hi_n_len) >> 4; 165 + } 166 + 167 + static inline void iwl_pcie_gen1_tfd_set_tb(struct iwl_trans *trans, 168 + struct iwl_tfd *tfd, 169 + u8 idx, dma_addr_t addr, u16 len) 170 + { 171 + struct iwl_tfd_tb *tb = &tfd->tbs[idx]; 172 + u16 hi_n_len = len << 4; 173 + 174 + put_unaligned_le32(addr, &tb->lo); 175 + hi_n_len |= iwl_get_dma_hi_addr(addr); 176 + 177 + tb->hi_n_len = cpu_to_le16(hi_n_len); 178 + 179 + tfd->num_tbs = idx + 1; 156 180 } 157 181 158 182 void iwl_txq_gen1_tfd_unmap(struct iwl_trans *trans,
+6 -6
drivers/net/wireless/intersil/orinoco/orinoco_usb.c
··· 129 129 130 130 #define USB_AVAYA8_VENDOR_ID 0x0D98 131 131 #define USB_AVAYAE_VENDOR_ID 0x0D9E 132 - #define USB_AVAYA_WIRELESS_ID 0x0300 /* Avaya Wireless USB Card */ 132 + #define USB_AVAYA_WIRELESS_ID 0x0300 /* Avaya USB Wireless Card */ 133 133 134 134 #define USB_AGERE_VENDOR_ID 0x0D4E /* Agere Systems */ 135 - #define USB_AGERE_MODEL0801_ID 0x1000 /* Wireless USB Card Model 0801 */ 136 - #define USB_AGERE_MODEL0802_ID 0x1001 /* Wireless USB Card Model 0802 */ 137 - #define USB_AGERE_REBRANDED_ID 0x047A /* WLAN USB Card */ 135 + #define USB_AGERE_MODEL0801_ID 0x1000 /* USB Wireless Card Model 0801 */ 136 + #define USB_AGERE_MODEL0802_ID 0x1001 /* USB Wireless Card Model 0802 */ 137 + #define USB_AGERE_REBRANDED_ID 0x047A /* USB WLAN Card */ 138 138 139 139 #define USB_ELSA_VENDOR_ID 0x05CC 140 140 #define USB_ELSA_AIRLANCER_ID 0x3100 /* ELSA AirLancer USB-11 */ 141 141 142 142 #define USB_LEGEND_VENDOR_ID 0x0E7C 143 - #define USB_LEGEND_JOYNET_ID 0x0300 /* Joynet WLAN USB Card */ 143 + #define USB_LEGEND_JOYNET_ID 0x0300 /* Joynet USB WLAN Card */ 144 144 145 145 #define USB_SAMSUNG_VENDOR_ID 0x04E8 146 146 #define USB_SAMSUNG_SEW2001U1_ID 0x5002 /* Samsung SEW-2001u Card */ ··· 154 154 #define USB_FUJITSU_E1100_ID 0x1002 /* connect2AIR WLAN E-1100 USB */ 155 155 156 156 #define USB_2WIRE_VENDOR_ID 0x1630 157 - #define USB_2WIRE_WIRELESS_ID 0xff81 /* 2Wire Wireless USB adapter */ 157 + #define USB_2WIRE_WIRELESS_ID 0xff81 /* 2Wire USB Wireless adapter */ 158 158 159 159 160 160 #define EZUSB_REQUEST_FW_TRANS 0xA0
+1 -1
drivers/net/wireless/legacy/rndis_wlan.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-or-later 2 2 /* 3 - * Driver for RNDIS based wireless USB devices. 3 + * Driver for RNDIS based USB wireless devices. 4 4 * 5 5 * Copyright (C) 2007 by Bjorge Dijkstra <bjd@jooz.net> 6 6 * Copyright (C) 2008-2009 by Jussi Kivilinna <jussi.kivilinna@iki.fi>
+15 -4
drivers/net/wireless/marvell/mwifiex/debugfs.c
··· 253 253 if (!p) 254 254 return -ENOMEM; 255 255 256 - if (!priv || !priv->hist_data) 257 - return -EFAULT; 256 + if (!priv || !priv->hist_data) { 257 + ret = -EFAULT; 258 + goto free_and_exit; 259 + } 260 + 258 261 phist_data = priv->hist_data; 259 262 260 263 p += sprintf(p, "\n" ··· 312 309 ret = simple_read_from_buffer(ubuf, count, ppos, (char *)page, 313 310 (unsigned long)p - page); 314 311 312 + free_and_exit: 313 + free_page(page); 315 314 return ret; 316 315 } 317 316 ··· 425 420 if (IS_ERR(buf)) 426 421 return PTR_ERR(buf); 427 422 428 - sscanf(buf, "%u %x %x", &reg_type, &reg_offset, &reg_value); 423 + if (sscanf(buf, "%u %x %x", &reg_type, &reg_offset, &reg_value) != 3) { 424 + ret = -EINVAL; 425 + goto done; 426 + } 429 427 430 428 if (reg_type == 0 || reg_offset == 0) { 431 429 ret = -EINVAL; ··· 694 686 if (IS_ERR(buf)) 695 687 return PTR_ERR(buf); 696 688 697 - sscanf(buf, "%d %d", &offset, &bytes); 689 + if (sscanf(buf, "%d %d", &offset, &bytes) != 2) { 690 + ret = -EINVAL; 691 + goto done; 692 + } 698 693 699 694 if (offset == -1 || bytes == -1) { 700 695 ret = -EINVAL;
-1
drivers/net/wireless/marvell/mwifiex/decl.h
··· 180 180 }; 181 181 182 182 struct mwifiex_txinfo { 183 - u32 status_code; 184 183 u8 flags; 185 184 u8 bss_num; 186 185 u8 bss_type;
-2
drivers/net/wireless/marvell/mwifiex/init.c
··· 282 282 sleep_cfm_buf->action = cpu_to_le16(SLEEP_CONFIRM); 283 283 sleep_cfm_buf->resp_ctrl = cpu_to_le16(RESP_NEEDED); 284 284 285 - memset(&adapter->sleep_params, 0, sizeof(adapter->sleep_params)); 286 285 memset(&adapter->sleep_period, 0, sizeof(adapter->sleep_period)); 287 286 adapter->tx_lock_flag = false; 288 287 adapter->null_pkt_interval = 0; 289 288 adapter->fw_bands = 0; 290 289 adapter->config_bands = 0; 291 290 adapter->adhoc_start_band = 0; 292 - adapter->scan_channels = NULL; 293 291 adapter->fw_release_number = 0; 294 292 adapter->fw_cap_info = 0; 295 293 memset(&adapter->upld_buf, 0, sizeof(adapter->upld_buf));
+4 -16
drivers/net/wireless/marvell/mwifiex/main.h
··· 444 444 u8 data_rates[MWIFIEX_SUPPORTED_RATES]; 445 445 }; 446 446 447 - struct mwifiex_sleep_params { 448 - u16 sp_error; 449 - u16 sp_offset; 450 - u16 sp_stable_time; 451 - u8 sp_cal_control; 452 - u8 sp_ext_sleep_clk; 453 - u16 sp_reserved; 454 - }; 455 - 456 447 struct mwifiex_sleep_period { 457 448 u16 period; 458 449 u16 reserved; ··· 672 681 struct cfg80211_chan_def dfs_chandef; 673 682 struct workqueue_struct *dfs_cac_workqueue; 674 683 struct delayed_work dfs_cac_work; 675 - struct timer_list dfs_chan_switch_timer; 676 684 struct workqueue_struct *dfs_chan_sw_workqueue; 677 685 struct delayed_work dfs_chan_sw_work; 678 686 struct cfg80211_beacon_data beacon_after; ··· 878 888 struct work_struct main_work; 879 889 struct workqueue_struct *rx_workqueue; 880 890 struct work_struct rx_work; 881 - struct workqueue_struct *dfs_workqueue; 882 - struct work_struct dfs_work; 883 891 bool rx_work_enabled; 884 892 bool rx_processing; 885 893 bool delay_main_work; ··· 941 953 u8 fw_bands; 942 954 u8 adhoc_start_band; 943 955 u8 config_bands; 944 - struct mwifiex_chan_scan_param_set *scan_channels; 945 956 u8 tx_lock_flag; 946 - struct mwifiex_sleep_params sleep_params; 947 957 struct mwifiex_sleep_period sleep_period; 948 958 u16 ps_mode; 949 959 u32 ps_state; ··· 1141 1155 void mwifiex_delete_all_station_list(struct mwifiex_private *priv); 1142 1156 void mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv, 1143 1157 const u8 *ra_addr); 1144 - void *mwifiex_process_sta_txpd(struct mwifiex_private *, struct sk_buff *skb); 1145 - void *mwifiex_process_uap_txpd(struct mwifiex_private *, struct sk_buff *skb); 1158 + void mwifiex_process_sta_txpd(struct mwifiex_private *priv, 1159 + struct sk_buff *skb); 1160 + void mwifiex_process_uap_txpd(struct mwifiex_private *priv, 1161 + struct sk_buff *skb); 1146 1162 int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta, bool init); 1147 1163 int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd, 1148 1164 struct mwifiex_scan_cmd_config *scan_cfg);
+1 -6
drivers/net/wireless/marvell/mwifiex/scan.c
··· 612 612 struct mwifiex_adapter *adapter = priv->adapter; 613 613 int ret = 0; 614 614 struct mwifiex_chan_scan_param_set *tmp_chan_list; 615 - struct mwifiex_chan_scan_param_set *start_chan; 616 615 u32 tlv_idx, rates_size, cmd_no; 617 616 u32 total_scan_time; 618 617 u32 done_early; ··· 642 643 total_scan_time = 0; 643 644 radio_type = 0; 644 645 chan_tlv_out->header.len = 0; 645 - start_chan = tmp_chan_list; 646 646 done_early = false; 647 647 648 648 /* ··· 748 750 rates_size = mwifiex_append_rate_tlv(priv, scan_cfg_out, 749 751 radio_type); 750 752 751 - priv->adapter->scan_channels = start_chan; 752 - 753 753 /* Send the scan command to the firmware with the specified 754 754 cfg */ 755 755 if (priv->adapter->ext_scan) ··· 824 828 u8 ssid_filter; 825 829 struct mwifiex_ie_types_htcap *ht_cap; 826 830 struct mwifiex_ie_types_bss_mode *bss_mode; 827 - const u8 zero_mac[6] = {0, 0, 0, 0, 0, 0}; 828 831 829 832 /* The tlv_buf_len is calculated for each scan command. The TLVs added 830 833 in this routine will be preserved since the routine that sends the ··· 961 966 sizeof(struct mwifiex_ie_types_scan_chan_gap); 962 967 } 963 968 964 - if (!ether_addr_equal(user_scan_in->random_mac, zero_mac)) { 969 + if (!is_zero_ether_addr(user_scan_in->random_mac)) { 965 970 random_mac_tlv = (void *)tlv_pos; 966 971 random_mac_tlv->header.type = 967 972 cpu_to_le16(TLV_TYPE_RANDOM_MAC);
+14 -12
drivers/net/wireless/marvell/mwifiex/sdio.c
··· 1083 1083 "info: SDIO FUNC1 IO port: %#x\n", adapter->ioport); 1084 1084 1085 1085 /* Set Host interrupt reset to read to clear */ 1086 - if (!mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, &reg)) 1087 - mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg, 1088 - reg | card->reg->sdio_int_mask); 1089 - else 1086 + if (mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, &reg)) 1087 + return -1; 1088 + if (mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg, 1089 + reg | card->reg->sdio_int_mask)) 1090 1090 return -1; 1091 1091 1092 1092 /* Dnld/Upld ready set to auto reset */ 1093 - if (!mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, &reg)) 1094 - mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg, 1095 - reg | AUTO_RE_ENABLE_INT); 1096 - else 1093 + if (mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, &reg)) 1094 + return -1; 1095 + if (mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg, 1096 + reg | AUTO_RE_ENABLE_INT)) 1097 1097 return -1; 1098 1098 1099 1099 return 0; ··· 1556 1556 } 1557 1557 1558 1558 /* 1559 - * This function decode sdio aggreation pkt. 1559 + * This function decodes sdio aggregation pkt. 1560 1560 * 1561 1561 * Based on the data block size and pkt_len, 1562 1562 * skb data will be decoded to few packets. ··· 2266 2266 ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf, 2267 2267 card->mpa_tx.buf_len, mport); 2268 2268 2269 - /* Save the last multi port tx aggreagation info to debug log */ 2269 + /* Save the last multi port tx aggregation info to debug log. */ 2270 2270 index = adapter->dbg.last_sdio_mp_index; 2271 2271 index = (index + 1) % MWIFIEX_DBG_SDIO_MP_NUM; 2272 2272 adapter->dbg.last_sdio_mp_index = index; ··· 2525 2525 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); 2526 2526 2527 2527 /* Get SDIO ioport */ 2528 - mwifiex_init_sdio_ioport(adapter); 2528 + if (mwifiex_init_sdio_ioport(adapter)) 2529 + return -EIO; 2529 2530 2530 2531 /* Initialize SDIO variables in card */ 2531 2532 card->mp_rd_bitmap = 0; ··· 3142 3141 */ 3143 3142 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); 3144 3143 3145 - mwifiex_init_sdio_ioport(adapter); 3144 + if (mwifiex_init_sdio_ioport(adapter)) 3145 + dev_err(&card->func->dev, "error enabling SDIO port\n"); 3146 3146 } 3147 3147 3148 3148 static struct mwifiex_if_ops sdio_ops = {
+1
drivers/net/wireless/marvell/mwifiex/sta_rx.c
··· 92 92 skb->len, rx_pkt_off); 93 93 priv->stats.rx_dropped++; 94 94 dev_kfree_skb_any(skb); 95 + return -1; 95 96 } 96 97 97 98 if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
+2 -13
drivers/net/wireless/marvell/mwifiex/sta_tx.c
··· 29 29 * - Priority specific Tx control 30 30 * - Flags 31 31 */ 32 - void *mwifiex_process_sta_txpd(struct mwifiex_private *priv, 33 - struct sk_buff *skb) 32 + void mwifiex_process_sta_txpd(struct mwifiex_private *priv, 33 + struct sk_buff *skb) 34 34 { 35 35 struct mwifiex_adapter *adapter = priv->adapter; 36 36 struct txpd *local_tx_pd; ··· 38 38 unsigned int pad; 39 39 u16 pkt_type, pkt_offset; 40 40 int hroom = adapter->intf_hdr_len; 41 - 42 - if (!skb->len) { 43 - mwifiex_dbg(adapter, ERROR, 44 - "Tx: bad packet length: %d\n", skb->len); 45 - tx_info->status_code = -1; 46 - return skb->data; 47 - } 48 - 49 - BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN); 50 41 51 42 pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0; 52 43 ··· 100 109 if (!local_tx_pd->tx_control) 101 110 /* TxCtrl set by user or default */ 102 111 local_tx_pd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl); 103 - 104 - return skb->data; 105 112 } 106 113 107 114 /*
+26 -18
drivers/net/wireless/marvell/mwifiex/txrx.c
··· 72 72 int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, 73 73 struct mwifiex_tx_param *tx_param) 74 74 { 75 - int hroom, ret = -1; 75 + int hroom, ret; 76 76 struct mwifiex_adapter *adapter = priv->adapter; 77 - u8 *head_ptr; 78 77 struct txpd *local_tx_pd = NULL; 79 78 struct mwifiex_sta_node *dest_node; 80 79 struct ethhdr *hdr = (void *)skb->data; 80 + 81 + if (unlikely(!skb->len || 82 + skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN)) { 83 + ret = -EINVAL; 84 + goto out; 85 + } 81 86 82 87 hroom = adapter->intf_hdr_len; 83 88 ··· 93 88 dest_node->stats.tx_packets++; 94 89 } 95 90 96 - head_ptr = mwifiex_process_uap_txpd(priv, skb); 91 + mwifiex_process_uap_txpd(priv, skb); 97 92 } else { 98 - head_ptr = mwifiex_process_sta_txpd(priv, skb); 93 + mwifiex_process_sta_txpd(priv, skb); 99 94 } 100 95 101 - if ((adapter->data_sent || adapter->tx_lock_flag) && head_ptr) { 96 + if (adapter->data_sent || adapter->tx_lock_flag) { 102 97 skb_queue_tail(&adapter->tx_data_q, skb); 103 98 atomic_inc(&adapter->tx_queued); 104 99 return 0; 105 100 } 106 101 107 - if (head_ptr) { 108 - if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) 109 - local_tx_pd = (struct txpd *)(head_ptr + hroom); 110 - if (adapter->iface_type == MWIFIEX_USB) { 111 - ret = adapter->if_ops.host_to_card(adapter, 112 - priv->usb_port, 113 - skb, tx_param); 114 - } else { 115 - ret = adapter->if_ops.host_to_card(adapter, 116 - MWIFIEX_TYPE_DATA, 117 - skb, tx_param); 118 - } 102 + if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) 103 + local_tx_pd = (struct txpd *)(skb->data + hroom); 104 + if (adapter->iface_type == MWIFIEX_USB) { 105 + ret = adapter->if_ops.host_to_card(adapter, 106 + priv->usb_port, 107 + skb, tx_param); 108 + } else { 109 + ret = adapter->if_ops.host_to_card(adapter, 110 + MWIFIEX_TYPE_DATA, 111 + skb, tx_param); 119 112 } 120 113 mwifiex_dbg_dump(adapter, DAT_D, "tx pkt:", skb->data, 121 114 min_t(size_t, skb->len, DEBUG_DUMP_DATA_MAX_LEN)); 122 - 115 + out: 123 116 switch (ret) { 124 117 case -ENOSR: 125 118 mwifiex_dbg(adapter, DATA, "data: -ENOSR is returned\n"); ··· 140 137 break; 141 138 case -EINPROGRESS: 142 139 break; 140 + case -EINVAL: 141 + mwifiex_dbg(adapter, ERROR, 142 + "malformed skb (length: %u, headroom: %u)\n", 143 + skb->len, skb_headroom(skb)); 144 + fallthrough; 143 145 case 0: 144 146 mwifiex_write_data_complete(adapter, skb, 0, ret); 145 147 break;
+12 -14
drivers/net/wireless/marvell/mwifiex/uap_txrx.c
··· 110 110 skb->len, le16_to_cpu(uap_rx_pd->rx_pkt_offset)); 111 111 priv->stats.rx_dropped++; 112 112 dev_kfree_skb_any(skb); 113 + return; 113 114 } 114 115 115 116 if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header, ··· 253 252 254 253 if (is_multicast_ether_addr(ra)) { 255 254 skb_uap = skb_copy(skb, GFP_ATOMIC); 256 - mwifiex_uap_queue_bridged_pkt(priv, skb_uap); 255 + if (likely(skb_uap)) { 256 + mwifiex_uap_queue_bridged_pkt(priv, skb_uap); 257 + } else { 258 + mwifiex_dbg(adapter, ERROR, 259 + "failed to copy skb for uAP\n"); 260 + priv->stats.rx_dropped++; 261 + dev_kfree_skb_any(skb); 262 + return -1; 263 + } 257 264 } else { 258 265 if (mwifiex_get_sta_entry(priv, ra)) { 259 266 /* Requeue Intra-BSS packet */ ··· 470 461 * - Priority specific Tx control 471 462 * - Flags 472 463 */ 473 - void *mwifiex_process_uap_txpd(struct mwifiex_private *priv, 474 - struct sk_buff *skb) 464 + void mwifiex_process_uap_txpd(struct mwifiex_private *priv, 465 + struct sk_buff *skb) 475 466 { 476 467 struct mwifiex_adapter *adapter = priv->adapter; 477 468 struct uap_txpd *txpd; ··· 479 470 int pad; 480 471 u16 pkt_type, pkt_offset; 481 472 int hroom = adapter->intf_hdr_len; 482 - 483 - if (!skb->len) { 484 - mwifiex_dbg(adapter, ERROR, 485 - "Tx: bad packet length: %d\n", skb->len); 486 - tx_info->status_code = -1; 487 - return skb->data; 488 - } 489 - 490 - BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN); 491 473 492 474 pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0; 493 475 ··· 527 527 if (!txpd->tx_control) 528 528 /* TxCtrl set by user or default */ 529 529 txpd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl); 530 - 531 - return skb->data; 532 530 }
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/Kconfig
··· 5 5 depends on MAC80211 6 6 depends on PCI 7 7 help 8 - This adds support for MT7603E wireless PCIe devices and the WLAN core 8 + This adds support for MT7603E PCIe wireless devices and the WLAN core 9 9 on MT7628/MT7688 SoC devices. This family supports IEEE 802.11n 2x2 10 10 to 300Mbps PHY rate 11 11
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/Kconfig
··· 11 11 depends on MAC80211 12 12 depends on PCI 13 13 help 14 - This adds support for MT7615-based wireless PCIe devices, 14 + This adds support for MT7615-based PCIe wireless devices, 15 15 which support concurrent dual-band operation at both 5GHz 16 16 and 2.4GHz, IEEE 802.11ac 4x4:4SS 1733Mbps PHY rate, wave2 17 17 MU-MIMO up to 4 users/group and 160MHz channels.
+2 -2
drivers/net/wireless/mediatek/mt76/mt76x0/Kconfig
··· 10 10 depends on MAC80211 11 11 depends on USB 12 12 help 13 - This adds support for MT7610U-based wireless USB 2.0 dongles, 13 + This adds support for MT7610U-based USB 2.0 wireless dongles, 14 14 which comply with IEEE 802.11ac standards and support 1x1 15 15 433Mbps PHY rate. 16 16 ··· 22 22 depends on MAC80211 23 23 depends on PCI 24 24 help 25 - This adds support for MT7610/MT7630-based wireless PCIe devices, 25 + This adds support for MT7610/MT7630-based PCIe wireless devices, 26 26 which comply with IEEE 802.11ac standards and support 1x1 27 27 433Mbps PHY rate. 28 28
+2 -2
drivers/net/wireless/mediatek/mt76/mt76x2/Kconfig
··· 9 9 depends on MAC80211 10 10 depends on PCI 11 11 help 12 - This adds support for MT7612/MT7602/MT7662-based wireless PCIe 12 + This adds support for MT7612/MT7602/MT7662-based PCIe wireless 13 13 devices, which comply with IEEE 802.11ac standards and support 14 14 2SS to 866Mbit/s PHY rate. 15 15 ··· 22 22 depends on MAC80211 23 23 depends on USB 24 24 help 25 - This adds support for MT7612U-based wireless USB 3.0 dongles, 25 + This adds support for MT7612U-based USB 3.0 wireless dongles, 26 26 which comply with IEEE 802.11ac standards and support 2SS to 27 27 866Mbit/s PHY rate. 28 28
+1 -1
drivers/net/wireless/mediatek/mt76/mt7915/Kconfig
··· 7 7 depends on PCI 8 8 select RELAY 9 9 help 10 - This adds support for MT7915-based wireless PCIe devices, 10 + This adds support for MT7915-based PCIe wireless devices, 11 11 which support concurrent dual-band operation at both 5GHz 12 12 and 2.4GHz IEEE 802.11ax 4x4:4SS 1024-QAM, 160MHz channels, 13 13 OFDMA, spatial reuse and dual carrier modulation.
+1 -1
drivers/net/wireless/mediatek/mt76/mt7996/Kconfig
··· 7 7 depends on MAC80211 8 8 depends on PCI 9 9 help 10 - This adds support for MT7996-based wireless PCIe devices, 10 + This adds support for MT7996-based PCIe wireless devices, 11 11 which support concurrent tri-band operation at 6GHz, 5GHz, 12 12 and 2.4GHz IEEE 802.11be 4x4:4SS 4096-QAM, 320MHz channels. 13 13
+1 -1
drivers/net/wireless/mediatek/mt7601u/Kconfig
··· 4 4 depends on MAC80211 5 5 depends on USB 6 6 help 7 - This adds support for MT7601U-based wireless USB dongles. 7 + This adds support for MT7601U-based USB wireless dongles.
-4
drivers/net/wireless/microchip/wilc1000/cfg80211.h
··· 8 8 #define WILC_CFG80211_H 9 9 #include "netdev.h" 10 10 11 - struct wiphy *wilc_cfg_alloc(void); 12 11 int wilc_cfg80211_init(struct wilc **wilc, struct device *dev, int io_type, 13 12 const struct wilc_hif_func *ops); 14 13 struct wilc *wilc_create_wiphy(struct device *dev); 15 14 void wilc_deinit_host_int(struct net_device *net); 16 15 int wilc_init_host_int(struct net_device *net); 17 16 void wilc_wfi_monitor_rx(struct net_device *mon_dev, u8 *buff, u32 size); 18 - struct wilc_vif *wilc_netdev_interface(struct wilc *wl, const char *name, 19 - enum nl80211_iftype type); 20 17 void wilc_wfi_deinit_mon_interface(struct wilc *wl, bool rtnl_locked); 21 18 struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl, 22 19 const char *name, ··· 21 24 void wilc_update_mgmt_frame_registrations(struct wiphy *wiphy, 22 25 struct wireless_dev *wdev, 23 26 struct mgmt_frame_regs *upd); 24 - struct wilc_vif *wilc_get_interface(struct wilc *wl); 25 27 struct wilc_vif *wilc_get_wl_to_vif(struct wilc *wl); 26 28 void wlan_deinit_locks(struct wilc *wilc); 27 29 #endif
+1 -1
drivers/net/wireless/purelifi/plfxlc/Kconfig
··· 3 3 tristate "pureLiFi X, XL, XC device support" 4 4 depends on CFG80211 && MAC80211 && USB 5 5 help 6 - This option adds support for pureLiFi LiFi wireless USB 6 + This option adds support for pureLiFi LiFi USB wireless 7 7 adapters. The pureLiFi X, XL, XC USB devices are based on 8 8 802.11 OFDM PHY but uses light as the transmission medium. 9 9 The driver supports common 802.11 encryption/authentication
+1 -1
drivers/net/wireless/ralink/rt2x00/Kconfig
··· 170 170 config RT2800USB_RT3573 171 171 bool "rt2800usb - Include support for rt3573 devices (EXPERIMENTAL)" 172 172 help 173 - This enables support for RT3573 chipset based wireless USB devices 173 + This enables support for RT3573 chipset based USB wireless devices 174 174 in the rt2800usb driver. 175 175 176 176 config RT2800USB_RT53XX
+41 -18
drivers/net/wireless/ralink/rt2x00/rt2800lib.c
··· 3865 3865 } 3866 3866 } 3867 3867 3868 - static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev, 3869 - struct ieee80211_channel *chan, 3870 - int power_level) { 3871 - u16 eeprom, target_power, max_power; 3868 + static void rt2800_config_alc_rt6352(struct rt2x00_dev *rt2x00dev, 3869 + struct ieee80211_channel *chan, 3870 + int power_level) 3871 + { 3872 + int cur_channel = rt2x00dev->rf_channel; 3873 + u16 eeprom, chan_power, rate_power, target_power; 3874 + u16 tx_power[2]; 3875 + s8 *power_group[2]; 3872 3876 u32 mac_sys_ctrl; 3873 - u32 reg; 3877 + u32 cnt, reg; 3874 3878 u8 bbp; 3875 3879 3876 - /* hardware unit is 0.5dBm, limited to 23.5dBm */ 3877 - power_level *= 2; 3878 - if (power_level > 0x2f) 3879 - power_level = 0x2f; 3880 + if (WARN_ON(cur_channel < 1 || cur_channel > 14)) 3881 + return; 3880 3882 3881 - max_power = chan->max_power * 2; 3882 - if (max_power > 0x2f) 3883 - max_power = 0x2f; 3883 + /* get per chain power, 2 chains in total, unit is 0.5dBm */ 3884 + power_level = (power_level - 3) * 2; 3885 + 3886 + /* We can't get the accurate TX power. Based on some tests, the real 3887 + * TX power is approximately equal to channel_power + (max)rate_power. 3888 + * Usually max rate_power is the gain of the OFDM 6M rate. The antenna 3889 + * gain and externel PA gain are not included as we are unable to 3890 + * obtain these values. 3891 + */ 3892 + rate_power = rt2800_eeprom_read_from_array(rt2x00dev, 3893 + EEPROM_TXPOWER_BYRATE, 1); 3894 + rate_power &= 0x3f; 3895 + power_level -= rate_power; 3896 + if (power_level < 1) 3897 + power_level = 1; 3898 + 3899 + power_group[0] = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1); 3900 + power_group[1] = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2); 3901 + for (cnt = 0; cnt < 2; cnt++) { 3902 + chan_power = power_group[cnt][cur_channel - 1]; 3903 + if (chan_power >= 0x20 || chan_power == 0) 3904 + chan_power = 0x10; 3905 + tx_power[cnt] = power_level < chan_power ? power_level : chan_power; 3906 + } 3884 3907 3885 3908 reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_0); 3886 - rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, power_level); 3887 - rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, power_level); 3888 - rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_0, max_power); 3889 - rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_1, max_power); 3909 + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, tx_power[0]); 3910 + rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, tx_power[1]); 3911 + rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_0, 0x2f); 3912 + rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_1, 0x2f); 3890 3913 3891 3914 eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); 3892 3915 if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) { ··· 5291 5268 rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t); 5292 5269 rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg); 5293 5270 5294 - rt2800_config_alc(rt2x00dev, chan, power_level); 5271 + rt2800_config_alc_rt6352(rt2x00dev, chan, power_level); 5295 5272 5296 5273 /* TODO: temperature compensation code! */ 5297 5274 } ··· 8584 8561 rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n"); 8585 8562 8586 8563 maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); 8587 - maccfg &= (~0x04); 8564 + maccfg &= (~0x08); 8588 8565 rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg); 8589 8566 8590 8567 if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX)))
+1 -1
drivers/net/wireless/realtek/rtlwifi/core.c
··· 1656 1656 memcpy(rtlpriv->sec.key_buf[key_idx], 1657 1657 key->key, key->keylen); 1658 1658 rtlpriv->sec.key_len[key_idx] = key->keylen; 1659 - memcpy(mac_addr, bcast_addr, ETH_ALEN); 1659 + eth_broadcast_addr(mac_addr); 1660 1660 } else { /* pairwise key */ 1661 1661 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 1662 1662 "set pairwise key\n");
-28
drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c
··· 215 215 } 216 216 EXPORT_SYMBOL_GPL(rtl8723_download_fw); 217 217 218 - bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw, 219 - struct sk_buff *skb) 220 - { 221 - struct rtl_priv *rtlpriv = rtl_priv(hw); 222 - struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 223 - struct rtl8192_tx_ring *ring; 224 - struct rtl_tx_desc *pdesc; 225 - struct sk_buff *pskb = NULL; 226 - unsigned long flags; 227 - 228 - ring = &rtlpci->tx_ring[BEACON_QUEUE]; 229 - 230 - pskb = __skb_dequeue(&ring->queue); 231 - kfree_skb(pskb); 232 - spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 233 - 234 - pdesc = &ring->desc[0]; 235 - rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb); 236 - 237 - __skb_queue_tail(&ring->queue, skb); 238 - 239 - spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 240 - 241 - rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE); 242 - 243 - return true; 244 - } 245 - EXPORT_SYMBOL_GPL(rtl8723_cmd_send_packet);
-2
drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.h
··· 66 66 u8 *buffer, u32 size, u8 max_page); 67 67 int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be, int count); 68 68 int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be, int count); 69 - bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw, 70 - struct sk_buff *skb); 71 69 72 70 #endif
+1 -1
drivers/net/wireless/realtek/rtw88/pci.c
··· 1828 1828 EXPORT_SYMBOL(rtw_pci_shutdown); 1829 1829 1830 1830 MODULE_AUTHOR("Realtek Corporation"); 1831 - MODULE_DESCRIPTION("Realtek 802.11ac wireless PCI driver"); 1831 + MODULE_DESCRIPTION("Realtek PCI 802.11ac wireless driver"); 1832 1832 MODULE_LICENSE("Dual BSD/GPL");
+5 -2
drivers/net/wireless/realtek/rtw88/usb.c
··· 826 826 827 827 ret = rtw_core_init(rtwdev); 828 828 if (ret) 829 - goto err_release_hw; 829 + goto err_free_rx_bufs; 830 830 831 831 ret = rtw_usb_intf_init(rtwdev, intf); 832 832 if (ret) { ··· 872 872 err_deinit_core: 873 873 rtw_core_deinit(rtwdev); 874 874 875 + err_free_rx_bufs: 876 + rtw_usb_free_rx_bufs(rtwusb); 877 + 875 878 err_release_hw: 876 879 ieee80211_free_hw(hw); 877 880 ··· 912 909 EXPORT_SYMBOL(rtw_usb_disconnect); 913 910 914 911 MODULE_AUTHOR("Realtek Corporation"); 915 - MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver"); 912 + MODULE_DESCRIPTION("Realtek USB 802.11ac wireless driver"); 916 913 MODULE_LICENSE("Dual BSD/GPL");
+124
drivers/net/wireless/realtek/rtw89/chan.c
··· 4 4 5 5 #include "chan.h" 6 6 #include "debug.h" 7 + #include "fw.h" 8 + #include "ps.h" 7 9 #include "util.h" 8 10 9 11 static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band, ··· 118 116 rcd->prev_primary_channel = chan->primary_channel; 119 117 rcd->prev_band_type = chan->band_type; 120 118 band_changed = new->band_type != chan->band_type; 119 + rcd->band_changed = band_changed; 121 120 122 121 *chan = *new; 123 122 return band_changed; ··· 196 193 enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev) 197 194 { 198 195 struct rtw89_hal *hal = &rtwdev->hal; 196 + const struct cfg80211_chan_def *chandef; 199 197 enum rtw89_entity_mode mode; 198 + struct rtw89_chan chan; 200 199 u8 weight; 200 + u8 last; 201 + u8 idx; 201 202 202 203 weight = bitmap_weight(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY); 203 204 switch (weight) { ··· 213 206 rtw89_config_default_chandef(rtwdev); 214 207 fallthrough; 215 208 case 1: 209 + last = RTW89_SUB_ENTITY_0; 216 210 mode = RTW89_ENTITY_MODE_SCC; 217 211 break; 212 + case 2: 213 + last = RTW89_SUB_ENTITY_1; 214 + mode = rtw89_get_entity_mode(rtwdev); 215 + if (mode == RTW89_ENTITY_MODE_MCC) 216 + break; 217 + 218 + mode = RTW89_ENTITY_MODE_MCC_PREPARE; 219 + break; 220 + } 221 + 222 + for (idx = 0; idx <= last; idx++) { 223 + chandef = rtw89_chandef_get(rtwdev, idx); 224 + rtw89_get_channel_params(chandef, &chan); 225 + if (chan.channel == 0) { 226 + WARN(1, "Invalid channel on chanctx %d\n", idx); 227 + return RTW89_ENTITY_MODE_INVALID; 228 + } 229 + 230 + rtw89_assign_entity_chan(rtwdev, idx, &chan); 218 231 } 219 232 220 233 rtw89_set_entity_mode(rtwdev, mode); 221 234 return mode; 235 + } 236 + 237 + static void rtw89_chanctx_notify(struct rtw89_dev *rtwdev, 238 + enum rtw89_chanctx_state state) 239 + { 240 + const struct rtw89_chip_info *chip = rtwdev->chip; 241 + const struct rtw89_chanctx_listener *listener = chip->chanctx_listener; 242 + int i; 243 + 244 + if (!listener) 245 + return; 246 + 247 + for (i = 0; i < NUM_OF_RTW89_CHANCTX_CALLBACKS; i++) { 248 + if (!listener->callbacks[i]) 249 + continue; 250 + 251 + rtw89_debug(rtwdev, RTW89_DBG_CHAN, 252 + "chanctx notify listener: cb %d, state %d\n", 253 + i, state); 254 + 255 + listener->callbacks[i](rtwdev, state); 256 + } 257 + } 258 + 259 + static int rtw89_mcc_start(struct rtw89_dev *rtwdev) 260 + { 261 + if (rtwdev->scanning) 262 + rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif); 263 + 264 + rtw89_leave_lps(rtwdev); 265 + 266 + rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC start\n"); 267 + rtw89_chanctx_notify(rtwdev, RTW89_CHANCTX_STATE_MCC_START); 268 + return 0; 269 + } 270 + 271 + static void rtw89_mcc_stop(struct rtw89_dev *rtwdev) 272 + { 273 + rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop\n"); 274 + rtw89_chanctx_notify(rtwdev, RTW89_CHANCTX_STATE_MCC_STOP); 275 + } 276 + 277 + void rtw89_chanctx_work(struct work_struct *work) 278 + { 279 + struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev, 280 + chanctx_work.work); 281 + enum rtw89_entity_mode mode; 282 + int ret; 283 + 284 + mutex_lock(&rtwdev->mutex); 285 + 286 + mode = rtw89_get_entity_mode(rtwdev); 287 + switch (mode) { 288 + case RTW89_ENTITY_MODE_MCC_PREPARE: 289 + rtw89_set_entity_mode(rtwdev, RTW89_ENTITY_MODE_MCC); 290 + rtw89_set_channel(rtwdev); 291 + 292 + ret = rtw89_mcc_start(rtwdev); 293 + if (ret) 294 + rtw89_warn(rtwdev, "failed to start MCC: %d\n", ret); 295 + break; 296 + default: 297 + break; 298 + } 299 + 300 + mutex_unlock(&rtwdev->mutex); 301 + } 302 + 303 + void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev) 304 + { 305 + enum rtw89_entity_mode mode; 306 + u32 delay; 307 + 308 + mode = rtw89_get_entity_mode(rtwdev); 309 + switch (mode) { 310 + default: 311 + return; 312 + case RTW89_ENTITY_MODE_MCC_PREPARE: 313 + delay = ieee80211_tu_to_usec(RTW89_CHANCTX_TIME_MCC_PREPARE); 314 + break; 315 + } 316 + 317 + rtw89_debug(rtwdev, RTW89_DBG_CHAN, 318 + "queue chanctx work for mode %d with delay %d us\n", 319 + mode, delay); 320 + ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work, 321 + usecs_to_jiffies(delay)); 222 322 } 223 323 224 324 int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev, ··· 352 238 { 353 239 struct rtw89_hal *hal = &rtwdev->hal; 354 240 struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv; 241 + enum rtw89_entity_mode mode; 355 242 struct rtw89_vif *rtwvif; 356 243 u8 drop, roll; 357 244 ··· 382 267 drop = roll; 383 268 384 269 out: 270 + mode = rtw89_get_entity_mode(rtwdev); 271 + switch (mode) { 272 + case RTW89_ENTITY_MODE_MCC: 273 + rtw89_mcc_stop(rtwdev); 274 + break; 275 + default: 276 + break; 277 + } 278 + 385 279 clear_bit(drop, hal->entity_map); 386 280 rtw89_set_channel(rtwdev); 387 281 }
+5
drivers/net/wireless/realtek/rtw89/chan.h
··· 7 7 8 8 #include "core.h" 9 9 10 + /* The dwell time in TU before doing rtw89_chanctx_work(). */ 11 + #define RTW89_CHANCTX_TIME_MCC_PREPARE 100 12 + 10 13 static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev) 11 14 { 12 15 struct rtw89_hal *hal = &rtwdev->hal; ··· 53 50 const struct cfg80211_chan_def *chandef); 54 51 void rtw89_entity_init(struct rtw89_dev *rtwdev); 55 52 enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev); 53 + void rtw89_chanctx_work(struct work_struct *work); 54 + void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev); 56 55 int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev, 57 56 struct ieee80211_chanctx_conf *ctx); 58 57 void rtw89_chanctx_ops_remove(struct rtw89_dev *rtwdev,
+2 -1
drivers/net/wireless/realtek/rtw89/coex.c
··· 5666 5666 void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 5667 5667 struct rtw89_sta *rtwsta, enum btc_role_state state) 5668 5668 { 5669 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 5669 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 5670 + rtwvif->sub_entity_idx); 5670 5671 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); 5671 5672 struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta); 5672 5673 struct rtw89_btc *btc = &rtwdev->btc;
+9
drivers/net/wireless/realtek/rtw89/coex.h
··· 193 193 return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path)); 194 194 } 195 195 196 + /* return bt req len in TU */ 197 + static inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev, 198 + enum rtw89_phy_idx phy_idx) 199 + { 200 + struct rtw89_btc *btc = &rtwdev->btc; 201 + 202 + return btc->bt_req_len; 203 + } 204 + 196 205 #endif
+91 -33
drivers/net/wireless/realtek/rtw89/core.c
··· 256 256 NL80211_CHAN_NO_HT); 257 257 } 258 258 259 - static void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef, 260 - struct rtw89_chan *chan) 259 + void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef, 260 + struct rtw89_chan *chan) 261 261 { 262 262 struct ieee80211_channel *channel = chandef->chan; 263 263 enum nl80211_chan_width width = chandef->width; ··· 318 318 319 319 void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev) 320 320 { 321 + struct rtw89_hal *hal = &rtwdev->hal; 321 322 const struct rtw89_chip_info *chip = rtwdev->chip; 322 323 const struct rtw89_chan *chan; 323 324 enum rtw89_sub_entity_idx sub_entity_idx; 325 + enum rtw89_sub_entity_idx roc_idx; 324 326 enum rtw89_phy_idx phy_idx; 325 327 enum rtw89_entity_mode mode; 326 328 bool entity_active; ··· 332 330 return; 333 331 334 332 mode = rtw89_get_entity_mode(rtwdev); 335 - if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode)) 333 + switch (mode) { 334 + case RTW89_ENTITY_MODE_SCC: 335 + case RTW89_ENTITY_MODE_MCC: 336 + sub_entity_idx = RTW89_SUB_ENTITY_0; 337 + break; 338 + case RTW89_ENTITY_MODE_MCC_PREPARE: 339 + sub_entity_idx = RTW89_SUB_ENTITY_1; 340 + break; 341 + default: 342 + WARN(1, "Invalid ent mode: %d\n", mode); 336 343 return; 344 + } 337 345 338 - sub_entity_idx = RTW89_SUB_ENTITY_0; 346 + roc_idx = atomic_read(&hal->roc_entity_idx); 347 + if (roc_idx != RTW89_SUB_ENTITY_IDLE) 348 + sub_entity_idx = roc_idx; 349 + 339 350 phy_idx = RTW89_PHY_0; 340 351 chan = rtw89_chan_get(rtwdev, sub_entity_idx); 341 352 chip->ops->set_txpwr(rtwdev, chan, phy_idx); ··· 356 341 357 342 void rtw89_set_channel(struct rtw89_dev *rtwdev) 358 343 { 344 + struct rtw89_hal *hal = &rtwdev->hal; 359 345 const struct rtw89_chip_info *chip = rtwdev->chip; 360 - const struct cfg80211_chan_def *chandef; 346 + const struct rtw89_chan_rcd *chan_rcd; 347 + const struct rtw89_chan *chan; 361 348 enum rtw89_sub_entity_idx sub_entity_idx; 349 + enum rtw89_sub_entity_idx roc_idx; 362 350 enum rtw89_mac_idx mac_idx; 363 351 enum rtw89_phy_idx phy_idx; 364 - struct rtw89_chan chan; 365 352 struct rtw89_channel_help_params bak; 366 353 enum rtw89_entity_mode mode; 367 - bool band_changed; 368 354 bool entity_active; 369 355 370 356 entity_active = rtw89_get_entity_state(rtwdev); 371 357 372 358 mode = rtw89_entity_recalc(rtwdev); 373 - if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode)) 359 + switch (mode) { 360 + case RTW89_ENTITY_MODE_SCC: 361 + case RTW89_ENTITY_MODE_MCC: 362 + sub_entity_idx = RTW89_SUB_ENTITY_0; 363 + break; 364 + case RTW89_ENTITY_MODE_MCC_PREPARE: 365 + sub_entity_idx = RTW89_SUB_ENTITY_1; 366 + break; 367 + default: 368 + WARN(1, "Invalid ent mode: %d\n", mode); 374 369 return; 370 + } 375 371 376 - sub_entity_idx = RTW89_SUB_ENTITY_0; 372 + roc_idx = atomic_read(&hal->roc_entity_idx); 373 + if (roc_idx != RTW89_SUB_ENTITY_IDLE) 374 + sub_entity_idx = roc_idx; 375 + 377 376 mac_idx = RTW89_MAC_0; 378 377 phy_idx = RTW89_PHY_0; 379 - chandef = rtw89_chandef_get(rtwdev, sub_entity_idx); 380 - rtw89_get_channel_params(chandef, &chan); 381 - if (WARN(chan.channel == 0, "Invalid channel\n")) 382 - return; 383 378 384 - band_changed = rtw89_assign_entity_chan(rtwdev, sub_entity_idx, &chan); 379 + chan = rtw89_chan_get(rtwdev, sub_entity_idx); 380 + chan_rcd = rtw89_chan_rcd_get(rtwdev, sub_entity_idx); 385 381 386 - rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan, mac_idx, phy_idx); 382 + rtw89_chip_set_channel_prepare(rtwdev, &bak, chan, mac_idx, phy_idx); 387 383 388 - chip->ops->set_channel(rtwdev, &chan, mac_idx, phy_idx); 384 + chip->ops->set_channel(rtwdev, chan, mac_idx, phy_idx); 389 385 390 - chip->ops->set_txpwr(rtwdev, &chan, phy_idx); 386 + chip->ops->set_txpwr(rtwdev, chan, phy_idx); 391 387 392 - rtw89_chip_set_channel_done(rtwdev, &bak, &chan, mac_idx, phy_idx); 388 + rtw89_chip_set_channel_done(rtwdev, &bak, chan, mac_idx, phy_idx); 393 389 394 - if (!entity_active || band_changed) { 395 - rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan.band_type); 390 + if (!entity_active || chan_rcd->band_changed) { 391 + rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan->band_type); 396 392 rtw89_chip_rfk_band_changed(rtwdev, phy_idx); 397 393 } 398 394 ··· 549 523 } 550 524 551 525 static u16 rtw89_core_get_mgmt_rate(struct rtw89_dev *rtwdev, 552 - struct rtw89_core_tx_request *tx_req) 526 + struct rtw89_core_tx_request *tx_req, 527 + const struct rtw89_chan *chan) 553 528 { 554 529 struct sk_buff *skb = tx_req->skb; 555 530 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 556 531 struct ieee80211_vif *vif = tx_info->control.vif; 557 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 558 532 u16 lowest_rate; 559 533 560 534 if (tx_info->flags & IEEE80211_TX_CTL_NO_CCK_RATE || ··· 593 567 struct ieee80211_vif *vif = tx_req->vif; 594 568 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 595 569 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; 596 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 570 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 571 + rtwvif->sub_entity_idx); 597 572 u8 qsel, ch_dma; 598 573 599 574 qsel = desc_info->hiq ? RTW89_TX_QSEL_B0_HI : RTW89_TX_QSEL_B0_MGMT; ··· 611 584 desc_info->en_wd_info = true; 612 585 desc_info->use_rate = true; 613 586 desc_info->dis_data_fb = true; 614 - desc_info->data_rate = rtw89_core_get_mgmt_rate(rtwdev, tx_req); 587 + desc_info->data_rate = rtw89_core_get_mgmt_rate(rtwdev, tx_req, chan); 615 588 616 589 rtw89_debug(rtwdev, RTW89_DBG_TXRX, 617 590 "tx mgmt frame with rate 0x%x on channel %d (band %d, bw %d)\n", ··· 630 603 desc_info->ch_dma = RTW89_DMA_H2C; 631 604 } 632 605 633 - static void rtw89_core_get_no_ul_ofdma_htc(struct rtw89_dev *rtwdev, __le32 *htc) 606 + static void rtw89_core_get_no_ul_ofdma_htc(struct rtw89_dev *rtwdev, __le32 *htc, 607 + const struct rtw89_chan *chan) 634 608 { 635 609 static const u8 rtw89_bandwidth_to_om[] = { 636 610 [RTW89_CHANNEL_WIDTH_20] = HTC_OM_CHANNEL_WIDTH_20, ··· 642 614 }; 643 615 const struct rtw89_chip_info *chip = rtwdev->chip; 644 616 struct rtw89_hal *hal = &rtwdev->hal; 645 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 646 617 u8 om_bandwidth; 647 618 648 619 if (!chip->dis_2g_40m_ul_ofdma || ··· 1686 1659 const struct rtw89_chan_rcd *rcd = 1687 1660 rtw89_chan_rcd_get(rtwdev, RTW89_SUB_ENTITY_0); 1688 1661 u16 chan = rcd->prev_primary_channel; 1689 - u8 band = rcd->prev_band_type == RTW89_BAND_2G ? 1690 - NL80211_BAND_2GHZ : NL80211_BAND_5GHZ; 1662 + u8 band = rtw89_hw_to_nl80211_band(rcd->prev_band_type); 1691 1663 1692 1664 if (status->band != NL80211_BAND_2GHZ && 1693 1665 status->encoding == RX_ENC_LEGACY && ··· 1926 1900 { 1927 1901 const struct cfg80211_chan_def *chandef = 1928 1902 rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0); 1929 - const struct rtw89_chan *cur = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 1930 1903 u16 data_rate; 1931 1904 u8 data_rate_mode; 1932 1905 ··· 1935 1910 1936 1911 if (rtwdev->scanning && 1937 1912 RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) { 1913 + const struct rtw89_chan *cur = rtw89_scan_chan_get(rtwdev); 1938 1914 u8 chan = cur->primary_channel; 1939 1915 u8 band = cur->band_type; 1940 1916 enum nl80211_band nl_band; ··· 2477 2451 2478 2452 void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) 2479 2453 { 2454 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 2480 2455 struct ieee80211_hw *hw = rtwdev->hw; 2481 2456 struct rtw89_roc *roc = &rtwvif->roc; 2482 2457 struct cfg80211_chan_def roc_chan; ··· 2505 2478 rtw89_config_roc_chandef(rtwdev, rtwvif->sub_entity_idx, &roc_chan); 2506 2479 rtw89_set_channel(rtwdev); 2507 2480 rtw89_write32_clr(rtwdev, 2508 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0), 2481 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), 2509 2482 B_AX_A_UC_CAM_MATCH | B_AX_A_BC_CAM_MATCH); 2510 2483 2511 2484 ieee80211_ready_on_channel(hw); ··· 2513 2486 2514 2487 void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) 2515 2488 { 2489 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 2516 2490 struct ieee80211_hw *hw = rtwdev->hw; 2517 2491 struct rtw89_roc *roc = &rtwvif->roc; 2518 2492 struct rtw89_vif *tmp; ··· 2527 2499 rtw89_leave_lps(rtwdev); 2528 2500 2529 2501 rtw89_write32_mask(rtwdev, 2530 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0), 2502 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), 2531 2503 B_AX_RX_FLTR_CFG_MASK, 2532 2504 rtwdev->hal.rx_fltr); 2533 2505 ··· 2710 2682 rtw89_phy_tx_path_div_track(rtwdev); 2711 2683 rtw89_phy_antdiv_track(rtwdev); 2712 2684 rtw89_phy_ul_tb_ctrl_track(rtwdev); 2685 + rtw89_tas_track(rtwdev); 2713 2686 2714 2687 if (rtwdev->lps_enabled && !rtwdev->btc.lps) 2715 2688 rtw89_enter_lps_track(rtwdev); ··· 2999 2970 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 3000 2971 struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv; 3001 2972 struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta); 2973 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 2974 + rtwvif->sub_entity_idx); 3002 2975 int ret; 3003 2976 3004 2977 if (vif->type == NL80211_IFTYPE_AP || sta->tdls) { ··· 3054 3023 3055 3024 rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, 3056 3025 BTC_ROLE_MSTS_STA_CONN_END); 3057 - rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template); 3026 + rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template, chan); 3058 3027 rtw89_phy_ul_tb_assoc(rtwdev, rtwvif); 3059 3028 3060 3029 ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id); ··· 3494 3463 complete(&wait->completion); 3495 3464 } 3496 3465 3466 + void rtw89_core_ntfy_btc_event(struct rtw89_dev *rtwdev, enum rtw89_btc_hmsg event) 3467 + { 3468 + u16 bt_req_len; 3469 + 3470 + switch (event) { 3471 + case RTW89_BTC_HMSG_SET_BT_REQ_SLOT: 3472 + bt_req_len = rtw89_coex_query_bt_req_len(rtwdev, RTW89_PHY_0); 3473 + rtw89_debug(rtwdev, RTW89_DBG_BTC, 3474 + "coex updates BT req len to %d TU\n", bt_req_len); 3475 + break; 3476 + default: 3477 + if (event < NUM_OF_RTW89_BTC_HMSG) 3478 + rtw89_debug(rtwdev, RTW89_DBG_BTC, 3479 + "unhandled BTC HMSG event: %d\n", event); 3480 + else 3481 + rtw89_warn(rtwdev, 3482 + "unrecognized BTC HMSG event: %d\n", event); 3483 + break; 3484 + } 3485 + } 3486 + 3497 3487 int rtw89_core_start(struct rtw89_dev *rtwdev) 3498 3488 { 3499 3489 int ret; ··· 3547 3495 3548 3496 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true); 3549 3497 rtw89_mac_update_rts_threshold(rtwdev, RTW89_MAC_0); 3498 + 3499 + rtw89_tas_reset(rtwdev); 3550 3500 3551 3501 ret = rtw89_hci_start(rtwdev); 3552 3502 if (ret) { ··· 3590 3536 cancel_work_sync(&btc->icmp_notify_work); 3591 3537 cancel_delayed_work_sync(&rtwdev->txq_reinvoke_work); 3592 3538 cancel_delayed_work_sync(&rtwdev->track_work); 3539 + cancel_delayed_work_sync(&rtwdev->chanctx_work); 3593 3540 cancel_delayed_work_sync(&rtwdev->coex_act1_work); 3594 3541 cancel_delayed_work_sync(&rtwdev->coex_bt_devinfo_work); 3595 3542 cancel_delayed_work_sync(&rtwdev->coex_rfk_chk_work); ··· 3627 3572 INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work); 3628 3573 INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work); 3629 3574 INIT_DELAYED_WORK(&rtwdev->track_work, rtw89_track_work); 3575 + INIT_DELAYED_WORK(&rtwdev->chanctx_work, rtw89_chanctx_work); 3630 3576 INIT_DELAYED_WORK(&rtwdev->coex_act1_work, rtw89_coex_act1_work); 3631 3577 INIT_DELAYED_WORK(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work); 3632 3578 INIT_DELAYED_WORK(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work); ··· 3668 3612 3669 3613 rtw89_ser_init(rtwdev); 3670 3614 rtw89_entity_init(rtwdev); 3615 + rtw89_tas_init(rtwdev); 3671 3616 3672 3617 return 0; 3673 3618 } ··· 3689 3632 void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 3690 3633 const u8 *mac_addr, bool hw_scan) 3691 3634 { 3692 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3635 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 3636 + rtwvif->sub_entity_idx); 3693 3637 3694 3638 rtwdev->scanning = true; 3695 3639 rtw89_leave_lps(rtwdev);
+104
drivers/net/wireless/realtek/rtw89/core.h
··· 14 14 15 15 struct rtw89_dev; 16 16 struct rtw89_pci_info; 17 + struct rtw89_mac_gen_def; 18 + struct rtw89_phy_gen_def; 17 19 18 20 extern const struct ieee80211_ops rtw89_ops; 19 21 ··· 791 789 792 790 enum rtw89_sub_entity_idx { 793 791 RTW89_SUB_ENTITY_0 = 0, 792 + RTW89_SUB_ENTITY_1 = 1, 794 793 795 794 NUM_OF_RTW89_SUB_ENTITY, 796 795 RTW89_SUB_ENTITY_IDLE = NUM_OF_RTW89_SUB_ENTITY, ··· 903 900 struct rtw89_chan_rcd { 904 901 u8 prev_primary_channel; 905 902 enum rtw89_band prev_band_type; 903 + bool band_changed; 906 904 }; 907 905 908 906 struct rtw89_channel_help_params { ··· 2660 2656 bool lps; 2661 2657 }; 2662 2658 2659 + enum rtw89_btc_hmsg { 2660 + RTW89_BTC_HMSG_TMR_EN = 0x0, 2661 + RTW89_BTC_HMSG_BT_REG_READBACK = 0x1, 2662 + RTW89_BTC_HMSG_SET_BT_REQ_SLOT = 0x2, 2663 + RTW89_BTC_HMSG_FW_EV = 0x3, 2664 + RTW89_BTC_HMSG_BT_LINK_CHG = 0x4, 2665 + RTW89_BTC_HMSG_SET_BT_REQ_STBC = 0x5, 2666 + 2667 + NUM_OF_RTW89_BTC_HMSG, 2668 + }; 2669 + 2663 2670 enum rtw89_ra_mode { 2664 2671 RTW89_RA_MODE_CCK = BIT(0), 2665 2672 RTW89_RA_MODE_OFDM = BIT(1), ··· 2900 2885 2901 2886 #define RTW89_P2P_MAX_NOA_NUM 2 2902 2887 2888 + struct rtw89_p2p_ie_head { 2889 + u8 eid; 2890 + u8 ie_len; 2891 + u8 oui[3]; 2892 + u8 oui_type; 2893 + } __packed; 2894 + 2895 + struct rtw89_noa_attr_head { 2896 + u8 attr_type; 2897 + __le16 attr_len; 2898 + u8 index; 2899 + u8 oppps_ctwindow; 2900 + } __packed; 2901 + 2902 + struct rtw89_p2p_noa_ie { 2903 + struct rtw89_p2p_ie_head p2p_head; 2904 + struct rtw89_noa_attr_head noa_head; 2905 + struct ieee80211_p2p_noa_desc noa_desc[RTW89_P2P_MAX_NOA_NUM]; 2906 + } __packed; 2907 + 2908 + struct rtw89_p2p_noa_setter { 2909 + struct rtw89_p2p_noa_ie ie; 2910 + u8 noa_count; 2911 + u8 noa_index; 2912 + }; 2913 + 2903 2914 struct rtw89_vif { 2904 2915 struct list_head list; 2905 2916 struct rtw89_dev *rtwdev; ··· 2968 2927 struct cfg80211_scan_request *scan_req; 2969 2928 struct ieee80211_scan_ies *scan_ies; 2970 2929 struct list_head general_pkt_list; 2930 + struct rtw89_p2p_noa_setter p2p_noa; 2971 2931 }; 2972 2932 2973 2933 enum rtw89_lv1_rcvy_step { ··· 3381 3339 u32 seg0_pd_reg; 3382 3340 u32 pd_lower_bound_mask; 3383 3341 u32 pd_spatial_reuse_en; 3342 + u32 bmode_pd_reg; 3343 + u32 bmode_cca_rssi_limit_en; 3344 + u32 bmode_pd_lower_bound_reg; 3345 + u32 bmode_rssi_nocca_low_th_mask; 3384 3346 struct rtw89_reg_def p0_lna_init; 3385 3347 struct rtw89_reg_def p1_lna_init; 3386 3348 struct rtw89_reg_def p0_tia_init; ··· 3421 3375 bool get_stats; 3422 3376 }; 3423 3377 3378 + enum rtw89_chanctx_state { 3379 + RTW89_CHANCTX_STATE_MCC_START, 3380 + RTW89_CHANCTX_STATE_MCC_STOP, 3381 + }; 3382 + 3383 + enum rtw89_chanctx_callbacks { 3384 + RTW89_CHANCTX_CALLBACK_PLACEHOLDER, 3385 + 3386 + NUM_OF_RTW89_CHANCTX_CALLBACKS, 3387 + }; 3388 + 3389 + struct rtw89_chanctx_listener { 3390 + void (*callbacks[NUM_OF_RTW89_CHANCTX_CALLBACKS]) 3391 + (struct rtw89_dev *rtwdev, enum rtw89_chanctx_state state); 3392 + }; 3393 + 3424 3394 struct rtw89_chip_info { 3425 3395 enum rtw89_core_chip_id chip_id; 3426 3396 enum rtw89_chip_gen chip_gen; 3427 3397 const struct rtw89_chip_ops *ops; 3398 + const struct rtw89_mac_gen_def *mac_def; 3399 + const struct rtw89_phy_gen_def *phy_def; 3428 3400 const char *fw_basename; 3429 3401 u8 fw_format_max; 3430 3402 bool try_ce_fw; ··· 3498 3434 /* NULL if no rfe-specific, or a null-terminated array by rfe_parms */ 3499 3435 const struct rtw89_rfe_parms_conf *rfe_parms_conf; 3500 3436 const struct rtw89_rfe_parms *dflt_parms; 3437 + const struct rtw89_chanctx_listener *chanctx_listener; 3501 3438 3502 3439 u8 txpwr_factor_rf; 3503 3440 u8 txpwr_factor_mac; ··· 3755 3690 }; 3756 3691 }; 3757 3692 3693 + enum rtw89_tas_state { 3694 + RTW89_TAS_STATE_DPR_OFF, 3695 + RTW89_TAS_STATE_DPR_ON, 3696 + RTW89_TAS_STATE_DPR_FORBID, 3697 + }; 3698 + 3699 + #define RTW89_TAS_MAX_WINDOW 50 3700 + struct rtw89_tas_info { 3701 + s16 txpwr_history[RTW89_TAS_MAX_WINDOW]; 3702 + s32 total_txpwr; 3703 + u8 cur_idx; 3704 + s8 dpr_gap; 3705 + s8 delta; 3706 + enum rtw89_tas_state state; 3707 + bool enable; 3708 + }; 3709 + 3758 3710 struct rtw89_chanctx_cfg { 3759 3711 enum rtw89_sub_entity_idx idx; 3760 3712 }; 3761 3713 3762 3714 enum rtw89_entity_mode { 3763 3715 RTW89_ENTITY_MODE_SCC, 3716 + RTW89_ENTITY_MODE_MCC_PREPARE, 3717 + RTW89_ENTITY_MODE_MCC, 3718 + 3719 + NUM_OF_RTW89_ENTITY_MODE, 3720 + RTW89_ENTITY_MODE_INVALID = NUM_OF_RTW89_ENTITY_MODE, 3764 3721 }; 3765 3722 3766 3723 struct rtw89_sub_entity { ··· 4439 4352 struct rtw89_antdiv_info antdiv; 4440 4353 4441 4354 struct delayed_work track_work; 4355 + struct delayed_work chanctx_work; 4442 4356 struct delayed_work coex_act1_work; 4443 4357 struct delayed_work coex_bt_devinfo_work; 4444 4358 struct delayed_work coex_rfk_chk_work; ··· 4453 4365 4454 4366 struct rtw89_regulatory_info regulatory; 4455 4367 struct rtw89_sar_info sar; 4368 + struct rtw89_tas_info tas; 4456 4369 4457 4370 struct rtw89_btc btc; 4458 4371 enum rtw89_ps_mode ps_mode; ··· 4989 4900 return &hal->sub[idx].rcd; 4990 4901 } 4991 4902 4903 + static inline 4904 + const struct rtw89_chan *rtw89_scan_chan_get(struct rtw89_dev *rtwdev) 4905 + { 4906 + struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif; 4907 + struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif); 4908 + 4909 + if (rtwvif) 4910 + return rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx); 4911 + else 4912 + return rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 4913 + } 4914 + 4992 4915 static inline void rtw89_chip_fem_setup(struct rtw89_dev *rtwdev) 4993 4916 { 4994 4917 const struct rtw89_chip_info *chip = rtwdev->chip; ··· 5374 5273 void rtw89_free_ieee80211_hw(struct rtw89_dev *rtwdev); 5375 5274 void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev); 5376 5275 void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef); 5276 + void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef, 5277 + struct rtw89_chan *chan); 5377 5278 void rtw89_set_channel(struct rtw89_dev *rtwdev); 5378 5279 void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 5379 5280 struct rtw89_chan *chan); ··· 5410 5307 struct ieee80211_vif *vif, bool hw_scan); 5411 5308 void rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev, 5412 5309 struct rtw89_vif *rtwvif, bool active); 5310 + void rtw89_core_ntfy_btc_event(struct rtw89_dev *rtwdev, enum rtw89_btc_hmsg event); 5413 5311 5414 5312 #endif
+17 -9
drivers/net/wireless/realtek/rtw89/debug.c
··· 572 572 seq_puts(m, #_regd "\n"); \ 573 573 break 574 574 575 - static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev) 575 + static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev, 576 + const struct rtw89_chan *chan) 576 577 { 577 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 578 578 u8 band = chan->band_type; 579 579 u8 regd = rtw89_regd_get(rtwdev, band); 580 580 ··· 604 604 { 605 605 struct rtw89_debugfs_priv *debugfs_priv = m->private; 606 606 struct rtw89_dev *rtwdev = debugfs_priv->rtwdev; 607 + const struct rtw89_chan *chan; 607 608 int ret = 0; 608 609 609 610 mutex_lock(&rtwdev->mutex); 610 611 rtw89_leave_ps_mode(rtwdev); 612 + chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 611 613 612 614 seq_puts(m, "[Regulatory] "); 613 - __print_regd(m, rtwdev); 615 + __print_regd(m, rtwdev, chan); 614 616 615 617 seq_puts(m, "[SAR]\n"); 616 - rtw89_print_sar(m, rtwdev); 618 + rtw89_print_sar(m, rtwdev, chan->freq); 619 + 620 + seq_puts(m, "[TAS]\n"); 621 + rtw89_print_tas(m, rtwdev); 617 622 618 623 seq_puts(m, "\n[TX power byrate]\n"); 619 624 ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_byr); ··· 795 790 struct rtw89_dev *rtwdev, 796 791 u8 sel, u32 start_addr, u32 len) 797 792 { 793 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 794 + u32 filter_model_addr = mac->filter_model_addr; 795 + u32 indir_access_addr = mac->indir_access_addr; 798 796 u32 base_addr, start_page, residue; 799 797 u32 i, j, p, pages; 800 798 u32 dump_len, remain; ··· 807 799 pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1; 808 800 start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE; 809 801 residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE; 810 - base_addr = rtw89_mac_mem_base_addrs[sel]; 802 + base_addr = mac->mem_base_addrs[sel]; 811 803 base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE; 812 804 813 805 for (p = 0; p < pages; p++) { 814 806 dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE); 815 - rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, base_addr); 816 - for (i = R_AX_INDIR_ACCESS_ENTRY + residue; 817 - i < R_AX_INDIR_ACCESS_ENTRY + dump_len;) { 807 + rtw89_write32(rtwdev, filter_model_addr, base_addr); 808 + for (i = indir_access_addr + residue; 809 + i < indir_access_addr + dump_len;) { 818 810 seq_printf(m, "%08xh:", i); 819 811 for (j = 0; 820 - j < 4 && i < R_AX_INDIR_ACCESS_ENTRY + dump_len; 812 + j < 4 && i < indir_access_addr + dump_len; 821 813 j++, i += 4) { 822 814 val = rtw89_read32(rtwdev, i); 823 815 seq_printf(m, " %08x", val);
+19 -5
drivers/net/wireless/realtek/rtw89/fw.c
··· 9 9 #include "fw.h" 10 10 #include "mac.h" 11 11 #include "phy.h" 12 + #include "ps.h" 12 13 #include "reg.h" 13 14 #include "util.h" 14 15 ··· 1166 1165 return; 1167 1166 1168 1167 plain_log: 1169 - rtw89_info(rtwdev, "C2H log: %*s", len, buf); 1168 + rtw89_info(rtwdev, "C2H log: %.*s", len, buf); 1170 1169 1171 1170 } 1172 1171 ··· 1759 1758 const struct rtw89_chip_info *chip = rtwdev->chip; 1760 1759 struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 1761 1760 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 1762 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 1761 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 1762 + rtwvif->sub_entity_idx); 1763 1763 struct sk_buff *skb; 1764 1764 u8 pads[RTW89_PPE_BW_NUM]; 1765 1765 u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id; ··· 1917 1915 struct rtw89_vif *rtwvif) 1918 1916 { 1919 1917 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); 1920 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 1918 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 1919 + rtwvif->sub_entity_idx); 1921 1920 struct sk_buff *skb; 1922 1921 struct sk_buff *skb_beacon; 1923 1922 u16 tim_offset; 1924 1923 int bcn_total_len; 1925 1924 u16 beacon_rate; 1925 + void *noa_data; 1926 + u8 noa_len; 1926 1927 int ret; 1927 1928 1928 1929 if (vif->p2p) ··· 1940 1935 if (!skb_beacon) { 1941 1936 rtw89_err(rtwdev, "failed to get beacon skb\n"); 1942 1937 return -ENOMEM; 1938 + } 1939 + 1940 + noa_len = rtw89_p2p_noa_fetch(rtwvif, &noa_data); 1941 + if (noa_len && 1942 + (noa_len <= skb_tailroom(skb_beacon) || 1943 + pskb_expand_head(skb_beacon, 0, noa_len, GFP_KERNEL) == 0)) { 1944 + skb_put_data(skb_beacon, noa_data, noa_len); 1943 1945 } 1944 1946 1945 1947 bcn_total_len = H2C_BCN_BASE_LEN + skb_beacon->len; ··· 3863 3851 struct ieee80211_scan_request *scan_req) 3864 3852 { 3865 3853 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 3854 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 3866 3855 struct cfg80211_scan_request *req = &scan_req->req; 3867 3856 u32 rx_fltr = rtwdev->hal.rx_fltr; 3868 3857 u8 mac_addr[ETH_ALEN]; ··· 3886 3873 rx_fltr &= ~B_AX_A_BC; 3887 3874 rx_fltr &= ~B_AX_A_A1_MATCH; 3888 3875 rtw89_write32_mask(rtwdev, 3889 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0), 3876 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), 3890 3877 B_AX_RX_FLTR_CFG_MASK, 3891 3878 rx_fltr); 3892 3879 } ··· 3894 3881 void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif, 3895 3882 bool aborted) 3896 3883 { 3884 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 3897 3885 struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info; 3898 3886 struct cfg80211_scan_info info = { 3899 3887 .aborted = aborted, ··· 3905 3891 return; 3906 3892 3907 3893 rtw89_write32_mask(rtwdev, 3908 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0), 3894 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), 3909 3895 B_AX_RX_FLTR_CFG_MASK, 3910 3896 rtwdev->hal.rx_fltr); 3911 3897
+108 -89
drivers/net/wireless/realtek/rtw89/mac.c
··· 12 12 #include "reg.h" 13 13 #include "util.h" 14 14 15 - const u32 rtw89_mac_mem_base_addrs[RTW89_MAC_MEM_NUM] = { 15 + static const u32 rtw89_mac_mem_base_addrs_ax[RTW89_MAC_MEM_NUM] = { 16 16 [RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR, 17 17 [RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR, 18 18 [RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR, ··· 39 39 static void rtw89_mac_mem_write(struct rtw89_dev *rtwdev, u32 offset, 40 40 u32 val, enum rtw89_mac_mem_sel sel) 41 41 { 42 - u32 addr = rtw89_mac_mem_base_addrs[sel] + offset; 42 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 43 + u32 addr = mac->mem_base_addrs[sel] + offset; 43 44 44 - rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, addr); 45 - rtw89_write32(rtwdev, R_AX_INDIR_ACCESS_ENTRY, val); 45 + rtw89_write32(rtwdev, mac->filter_model_addr, addr); 46 + rtw89_write32(rtwdev, mac->indir_access_addr, val); 46 47 } 47 48 48 49 static u32 rtw89_mac_mem_read(struct rtw89_dev *rtwdev, u32 offset, 49 50 enum rtw89_mac_mem_sel sel) 50 51 { 51 - u32 addr = rtw89_mac_mem_base_addrs[sel] + offset; 52 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 53 + u32 addr = mac->mem_base_addrs[sel] + offset; 52 54 53 - rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, addr); 54 - return rtw89_read32(rtwdev, R_AX_INDIR_ACCESS_ENTRY); 55 + rtw89_write32(rtwdev, mac->filter_model_addr, addr); 56 + return rtw89_read32(rtwdev, mac->indir_access_addr); 55 57 } 56 58 57 59 int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 mac_idx, ··· 2084 2082 if (ret) 2085 2083 return ret; 2086 2084 2087 - reg = rtw89_mac_reg_by_idx(R_AX_ADDR_CAM_CTRL, mac_idx); 2085 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_ADDR_CAM_CTRL, mac_idx); 2088 2086 2089 2087 val = rtw89_read32(rtwdev, reg); 2090 2088 val |= u32_encode_bits(0x7f, B_AX_ADDR_CAM_RANGE_MASK) | ··· 2111 2109 if (ret) 2112 2110 return ret; 2113 2111 2114 - reg = rtw89_mac_reg_by_idx(R_AX_PREBKF_CFG_1, mac_idx); 2112 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PREBKF_CFG_1, mac_idx); 2115 2113 if (rtwdev->chip->chip_id == RTL8852C) 2116 2114 rtw89_write32_mask(rtwdev, reg, B_AX_SIFS_MACTXEN_T1_MASK, 2117 2115 SIFS_MACTXEN_T1_V1); ··· 2120 2118 SIFS_MACTXEN_T1); 2121 2119 2122 2120 if (rtwdev->chip->chip_id == RTL8852B || rtwdev->chip->chip_id == RTL8851B) { 2123 - reg = rtw89_mac_reg_by_idx(R_AX_SCH_EXT_CTRL, mac_idx); 2121 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SCH_EXT_CTRL, mac_idx); 2124 2122 rtw89_write32_set(rtwdev, reg, B_AX_PORT_RST_TSF_ADV); 2125 2123 } 2126 2124 2127 - reg = rtw89_mac_reg_by_idx(R_AX_CCA_CFG_0, mac_idx); 2125 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CCA_CFG_0, mac_idx); 2128 2126 rtw89_write32_clr(rtwdev, reg, B_AX_BTCCA_EN); 2129 2127 2130 - reg = rtw89_mac_reg_by_idx(R_AX_PREBKF_CFG_0, mac_idx); 2128 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PREBKF_CFG_0, mac_idx); 2131 2129 if (rtwdev->chip->chip_id == RTL8852C) { 2132 2130 val = rtw89_read32_mask(rtwdev, R_AX_SEC_ENG_CTRL, 2133 2131 B_AX_TX_PARTIAL_MODE); ··· 2167 2165 2168 2166 switch (type) { 2169 2167 case RTW89_MGNT: 2170 - reg = rtw89_mac_reg_by_idx(R_AX_MGNT_FLTR, mac_idx); 2168 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MGNT_FLTR, mac_idx); 2171 2169 break; 2172 2170 case RTW89_CTRL: 2173 - reg = rtw89_mac_reg_by_idx(R_AX_CTRL_FLTR, mac_idx); 2171 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTRL_FLTR, mac_idx); 2174 2172 break; 2175 2173 case RTW89_DATA: 2176 - reg = rtw89_mac_reg_by_idx(R_AX_DATA_FLTR, mac_idx); 2174 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_DATA_FLTR, mac_idx); 2177 2175 break; 2178 2176 default: 2179 2177 rtw89_err(rtwdev, "[ERR]set rx filter type err\n"); ··· 2204 2202 B_AX_LSIG_PARITY_CHK_EN | B_AX_SIGA_CRC_CHK | 2205 2203 B_AX_VHT_SU_SIGB_CRC_CHK | B_AX_VHT_MU_SIGB_CRC_CHK | 2206 2204 B_AX_HE_SIGB_CRC_CHK; 2207 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, mac_idx), 2205 + rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_FLTR_OPT, mac_idx), 2208 2206 mac_ftlr); 2209 - rtw89_write16(rtwdev, rtw89_mac_reg_by_idx(R_AX_PLCP_HDR_FLTR, mac_idx), 2207 + rtw89_write16(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_PLCP_HDR_FLTR, mac_idx), 2210 2208 plcp_ftlr); 2211 2209 2212 2210 return 0; ··· 2226 2224 switch (rtwdev->chip->chip_id) { 2227 2225 case RTL8852A: 2228 2226 case RTL8852B: 2229 - reg = rtw89_mac_reg_by_idx(R_AX_RSP_CHK_SIG, mac_idx); 2227 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RSP_CHK_SIG, mac_idx); 2230 2228 val32 = rtw89_read32(rtwdev, reg) & ~b_rsp_chk_nav; 2231 2229 rtw89_write32(rtwdev, reg, val32); 2232 2230 2233 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx); 2231 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx); 2234 2232 val32 = rtw89_read32(rtwdev, reg) & ~b_rsp_chk_cca; 2235 2233 rtw89_write32(rtwdev, reg, val32); 2236 2234 break; 2237 2235 default: 2238 - reg = rtw89_mac_reg_by_idx(R_AX_RSP_CHK_SIG, mac_idx); 2236 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RSP_CHK_SIG, mac_idx); 2239 2237 val32 = rtw89_read32(rtwdev, reg) | b_rsp_chk_nav; 2240 2238 rtw89_write32(rtwdev, reg, val32); 2241 2239 2242 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx); 2240 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx); 2243 2241 val32 = rtw89_read32(rtwdev, reg) | b_rsp_chk_cca; 2244 2242 rtw89_write32(rtwdev, reg, val32); 2245 2243 break; ··· 2255 2253 if (ret) 2256 2254 return ret; 2257 2255 2258 - reg = rtw89_mac_reg_by_idx(R_AX_CCA_CONTROL, mac_idx); 2256 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CCA_CONTROL, mac_idx); 2259 2257 val = rtw89_read32(rtwdev, reg); 2260 2258 val |= (B_AX_TB_CHK_BASIC_NAV | B_AX_TB_CHK_BTCCA | 2261 2259 B_AX_TB_CHK_EDCCA | B_AX_TB_CHK_CCA_P20 | ··· 2296 2294 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 2297 2295 if (ret) 2298 2296 return ret; 2299 - reg = rtw89_mac_reg_by_idx(R_AX_RX_SR_CTRL, mac_idx); 2297 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_SR_CTRL, mac_idx); 2300 2298 rtw89_write8_clr(rtwdev, reg, B_AX_SR_EN); 2301 2299 2302 2300 return 0; ··· 2311 2309 if (ret) 2312 2310 return ret; 2313 2311 2314 - reg = rtw89_mac_reg_by_idx(R_AX_MAC_LOOPBACK, mac_idx); 2312 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MAC_LOOPBACK, mac_idx); 2315 2313 rtw89_write32_clr(rtwdev, reg, B_AX_MACLBK_EN); 2316 2314 2317 - reg = rtw89_mac_reg_by_idx(R_AX_TCR0, mac_idx); 2315 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TCR0, mac_idx); 2318 2316 rtw89_write32_mask(rtwdev, reg, B_AX_TCR_UDF_THSD_MASK, TCR_UDF_THSD); 2319 2317 2320 - reg = rtw89_mac_reg_by_idx(R_AX_TXD_FIFO_CTRL, mac_idx); 2318 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXD_FIFO_CTRL, mac_idx); 2321 2319 rtw89_write32_mask(rtwdev, reg, B_AX_TXDFIFO_HIGH_MCS_THRE_MASK, TXDFIFO_HIGH_MCS_THRE); 2322 2320 rtw89_write32_mask(rtwdev, reg, B_AX_TXDFIFO_LOW_MCS_THRE_MASK, TXDFIFO_LOW_MCS_THRE); 2323 2321 ··· 2335 2333 if (ret) 2336 2334 return ret; 2337 2335 2338 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx); 2336 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx); 2339 2337 val = rtw89_read32(rtwdev, reg); 2340 2338 val &= ~B_AX_WMAC_SPEC_SIFS_CCK_MASK; 2341 2339 val |= FIELD_PREP(B_AX_WMAC_SPEC_SIFS_CCK_MASK, WMAC_SPEC_SIFS_CCK); ··· 2355 2353 val |= FIELD_PREP(B_AX_WMAC_SPEC_SIFS_OFDM_MASK, sifs); 2356 2354 rtw89_write32(rtwdev, reg, val); 2357 2355 2358 - reg = rtw89_mac_reg_by_idx(R_AX_RXTRIG_TEST_USER_2, mac_idx); 2356 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXTRIG_TEST_USER_2, mac_idx); 2359 2357 rtw89_write32_set(rtwdev, reg, B_AX_RXTRIG_FCSCHK_EN); 2360 2358 2361 - reg = rtw89_mac_reg_by_idx(rrsr->ref_rate.addr, mac_idx); 2359 + reg = rtw89_mac_reg_by_idx(rtwdev, rrsr->ref_rate.addr, mac_idx); 2362 2360 rtw89_write32_mask(rtwdev, reg, rrsr->ref_rate.mask, rrsr->ref_rate.data); 2363 - reg = rtw89_mac_reg_by_idx(rrsr->rsc.addr, mac_idx); 2361 + reg = rtw89_mac_reg_by_idx(rtwdev, rrsr->rsc.addr, mac_idx); 2364 2362 rtw89_write32_mask(rtwdev, reg, rrsr->rsc.mask, rrsr->rsc.data); 2365 2363 2366 2364 return 0; ··· 2399 2397 if (mac_idx == RTW89_MAC_0) 2400 2398 rst_bacam(rtwdev); 2401 2399 2402 - reg = rtw89_mac_reg_by_idx(R_AX_RESPBA_CAM_CTRL, mac_idx); 2400 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RESPBA_CAM_CTRL, mac_idx); 2403 2401 rtw89_write8_set(rtwdev, reg, B_AX_SSN_SEL); 2404 2402 2405 - reg = rtw89_mac_reg_by_idx(R_AX_DLK_PROTECT_CTL, mac_idx); 2403 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_DLK_PROTECT_CTL, mac_idx); 2406 2404 val = rtw89_read16(rtwdev, reg); 2407 2405 val = u16_replace_bits(val, TRXCFG_RMAC_DATA_TO, 2408 2406 B_AX_RX_DLK_DATA_TIME_MASK); ··· 2410 2408 B_AX_RX_DLK_CCA_TIME_MASK); 2411 2409 rtw89_write16(rtwdev, reg, val); 2412 2410 2413 - reg = rtw89_mac_reg_by_idx(R_AX_RCR, mac_idx); 2411 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RCR, mac_idx); 2414 2412 rtw89_write8_mask(rtwdev, reg, B_AX_CH_EN_MASK, 0x1); 2415 2413 2416 - reg = rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, mac_idx); 2414 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_FLTR_OPT, mac_idx); 2417 2415 if (mac_idx == RTW89_MAC_0) 2418 2416 rx_qta = rtwdev->mac.dle_info.c0_rx_qta; 2419 2417 else ··· 2427 2425 if (rtwdev->chip->chip_id == RTL8852A && 2428 2426 rtwdev->hal.cv == CHIP_CBV) { 2429 2427 rtw89_write16_mask(rtwdev, 2430 - rtw89_mac_reg_by_idx(R_AX_DLK_PROTECT_CTL, mac_idx), 2428 + rtw89_mac_reg_by_idx(rtwdev, R_AX_DLK_PROTECT_CTL, mac_idx), 2431 2429 B_AX_RX_DLK_CCA_TIME_MASK, 0); 2432 - rtw89_write16_set(rtwdev, rtw89_mac_reg_by_idx(R_AX_RCR, mac_idx), 2430 + rtw89_write16_set(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_RCR, mac_idx), 2433 2431 BIT(12)); 2434 2432 } 2435 2433 2436 - reg = rtw89_mac_reg_by_idx(R_AX_PLCP_HDR_FLTR, mac_idx); 2434 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PLCP_HDR_FLTR, mac_idx); 2437 2435 rtw89_write8_clr(rtwdev, reg, B_AX_VHT_SU_SIGB_CRC_CHK); 2438 2436 2439 2437 return ret; ··· 2449 2447 if (ret) 2450 2448 return ret; 2451 2449 2452 - reg = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 2450 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 2453 2451 val = rtw89_read32(rtwdev, reg); 2454 2452 val = u32_replace_bits(val, 0, B_AX_TXSC_20M_MASK); 2455 2453 val = u32_replace_bits(val, 0, B_AX_TXSC_40M_MASK); ··· 2457 2455 rtw89_write32(rtwdev, reg, val); 2458 2456 2459 2457 if (chip_id == RTL8852A || chip_id == RTL8852B) { 2460 - reg = rtw89_mac_reg_by_idx(R_AX_PTCL_RRSR1, mac_idx); 2458 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_RRSR1, mac_idx); 2461 2459 rtw89_write32_mask(rtwdev, reg, B_AX_RRSR_RATE_EN_MASK, RRSR_OFDM_CCK_EN); 2462 2460 } 2463 2461 ··· 2487 2485 return ret; 2488 2486 2489 2487 if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) { 2490 - reg = rtw89_mac_reg_by_idx(R_AX_SIFS_SETTING, mac_idx); 2488 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SIFS_SETTING, mac_idx); 2491 2489 val = rtw89_read32(rtwdev, reg); 2492 2490 val = u32_replace_bits(val, S_AX_CTS2S_TH_1K, 2493 2491 B_AX_HW_CTS2SELF_PKT_LEN_TH_MASK); ··· 2496 2494 val |= B_AX_HW_CTS2SELF_EN; 2497 2495 rtw89_write32(rtwdev, reg, val); 2498 2496 2499 - reg = rtw89_mac_reg_by_idx(R_AX_PTCL_FSM_MON, mac_idx); 2497 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_FSM_MON, mac_idx); 2500 2498 val = rtw89_read32(rtwdev, reg); 2501 2499 val = u32_replace_bits(val, S_AX_PTCL_TO_2MS, B_AX_PTCL_TX_ARB_TO_THR_MASK); 2502 2500 val &= ~B_AX_PTCL_TX_ARB_TO_MODE; ··· 2533 2531 if (ret) 2534 2532 return ret; 2535 2533 2536 - reg = rtw89_mac_reg_by_idx(R_AX_RXDMA_CTRL_0, mac_idx); 2534 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXDMA_CTRL_0, mac_idx); 2537 2535 rtw89_write8_clr(rtwdev, reg, RX_FULL_MODE); 2538 2536 2539 2537 return 0; ··· 2727 2725 static int rtw89_set_hw_sch_tx_en(struct rtw89_dev *rtwdev, u8 mac_idx, 2728 2726 u16 tx_en, u16 tx_en_mask) 2729 2727 { 2730 - u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_TXEN, mac_idx); 2728 + u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_TXEN, mac_idx); 2731 2729 u16 val; 2732 2730 int ret; 2733 2731 ··· 2749 2747 static int rtw89_set_hw_sch_tx_en_v1(struct rtw89_dev *rtwdev, u8 mac_idx, 2750 2748 u32 tx_en, u32 tx_en_mask) 2751 2749 { 2752 - u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx); 2750 + u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_DRV_TXEN, mac_idx); 2753 2751 u32 val; 2754 2752 int ret; 2755 2753 ··· 2770 2768 int ret; 2771 2769 2772 2770 *tx_en = rtw89_read16(rtwdev, 2773 - rtw89_mac_reg_by_idx(R_AX_CTN_TXEN, mac_idx)); 2771 + rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_TXEN, mac_idx)); 2774 2772 2775 2773 switch (sel) { 2776 2774 case RTW89_SCH_TX_SEL_ALL: ··· 2811 2809 int ret; 2812 2810 2813 2811 *tx_en = rtw89_read32(rtwdev, 2814 - rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx)); 2812 + rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_DRV_TXEN, mac_idx)); 2815 2813 2816 2814 switch (sel) { 2817 2815 case RTW89_SCH_TX_SEL_ALL: ··· 3018 3016 if (ret) 3019 3017 return ret; 3020 3018 3021 - reg = rtw89_mac_reg_by_idx(R_AX_PTCL_TX_CTN_SEL, mac_idx); 3019 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_TX_CTN_SEL, mac_idx); 3022 3020 3023 3021 ret = read_poll_timeout(rtw89_read8, val, 3024 3022 (val & B_AX_PTCL_TX_ON_STAT) == 0, ··· 3226 3224 { 3227 3225 u32 reg; 3228 3226 3229 - reg = rtw89_mac_reg_by_idx(R_AX_SCHEDULE_ERR_IMR, mac_idx); 3227 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SCHEDULE_ERR_IMR, mac_idx); 3230 3228 rtw89_write32_clr(rtwdev, reg, B_AX_SORT_NON_IDLE_ERR_INT_EN | 3231 3229 B_AX_FSM_TIMEOUT_ERR_INT_EN); 3232 3230 rtw89_write32_set(rtwdev, reg, B_AX_FSM_TIMEOUT_ERR_INT_EN); ··· 3237 3235 const struct rtw89_imr_info *imr = rtwdev->chip->imr_info; 3238 3236 u32 reg; 3239 3237 3240 - reg = rtw89_mac_reg_by_idx(R_AX_PTCL_IMR0, mac_idx); 3238 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_IMR0, mac_idx); 3241 3239 rtw89_write32_clr(rtwdev, reg, imr->ptcl_imr_clr); 3242 3240 rtw89_write32_set(rtwdev, reg, imr->ptcl_imr_set); 3243 3241 } ··· 3248 3246 enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; 3249 3247 u32 reg; 3250 3248 3251 - reg = rtw89_mac_reg_by_idx(imr->cdma_imr_0_reg, mac_idx); 3249 + reg = rtw89_mac_reg_by_idx(rtwdev, imr->cdma_imr_0_reg, mac_idx); 3252 3250 rtw89_write32_clr(rtwdev, reg, imr->cdma_imr_0_clr); 3253 3251 rtw89_write32_set(rtwdev, reg, imr->cdma_imr_0_set); 3254 3252 3255 3253 if (chip_id == RTL8852C) { 3256 - reg = rtw89_mac_reg_by_idx(imr->cdma_imr_1_reg, mac_idx); 3254 + reg = rtw89_mac_reg_by_idx(rtwdev, imr->cdma_imr_1_reg, mac_idx); 3257 3255 rtw89_write32_clr(rtwdev, reg, imr->cdma_imr_1_clr); 3258 3256 rtw89_write32_set(rtwdev, reg, imr->cdma_imr_1_set); 3259 3257 } ··· 3264 3262 const struct rtw89_imr_info *imr = rtwdev->chip->imr_info; 3265 3263 u32 reg; 3266 3264 3267 - reg = rtw89_mac_reg_by_idx(imr->phy_intf_imr_reg, mac_idx); 3265 + reg = rtw89_mac_reg_by_idx(rtwdev, imr->phy_intf_imr_reg, mac_idx); 3268 3266 rtw89_write32_clr(rtwdev, reg, imr->phy_intf_imr_clr); 3269 3267 rtw89_write32_set(rtwdev, reg, imr->phy_intf_imr_set); 3270 3268 } ··· 3274 3272 const struct rtw89_imr_info *imr = rtwdev->chip->imr_info; 3275 3273 u32 reg; 3276 3274 3277 - reg = rtw89_mac_reg_by_idx(imr->rmac_imr_reg, mac_idx); 3275 + reg = rtw89_mac_reg_by_idx(rtwdev, imr->rmac_imr_reg, mac_idx); 3278 3276 rtw89_write32_clr(rtwdev, reg, imr->rmac_imr_clr); 3279 3277 rtw89_write32_set(rtwdev, reg, imr->rmac_imr_set); 3280 3278 } ··· 3284 3282 const struct rtw89_imr_info *imr = rtwdev->chip->imr_info; 3285 3283 u32 reg; 3286 3284 3287 - reg = rtw89_mac_reg_by_idx(imr->tmac_imr_reg, mac_idx); 3285 + reg = rtw89_mac_reg_by_idx(rtwdev, imr->tmac_imr_reg, mac_idx); 3288 3286 rtw89_write32_clr(rtwdev, reg, imr->tmac_imr_clr); 3289 3287 rtw89_write32_set(rtwdev, reg, imr->tmac_imr_set); 3290 3288 } ··· 3663 3661 { 3664 3662 u8 i; 3665 3663 3664 + if (rtwdev->chip->chip_gen != RTW89_CHIP_AX) 3665 + return; 3666 + 3666 3667 for (i = 0; i < 4; i++) { 3667 3668 rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, 3668 3669 DMAC_TBL_BASE_ADDR + (macid << 4) + (i << 2)); ··· 3675 3670 3676 3671 static void rtw89_mac_cmac_tbl_init(struct rtw89_dev *rtwdev, u8 macid) 3677 3672 { 3673 + if (rtwdev->chip->chip_gen != RTW89_CHIP_AX) 3674 + return; 3675 + 3678 3676 rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, 3679 3677 CMAC_TBL_BASE_ADDR + macid * CCTL_INFO_SIZE); 3680 3678 rtw89_write32(rtwdev, R_AX_INDIR_ACCESS_ENTRY, 0x4); ··· 3868 3860 u8 port = rtwvif->port; 3869 3861 u32 reg; 3870 3862 3871 - reg = rtw89_mac_reg_by_idx(hiq_win_addr[port], rtwvif->mac_idx); 3863 + reg = rtw89_mac_reg_by_idx(rtwdev, hiq_win_addr[port], rtwvif->mac_idx); 3872 3864 rtw89_write8(rtwdev, reg, win); 3873 3865 } 3874 3866 ··· 3879 3871 const struct rtw89_port_reg *p = &rtw_port_base; 3880 3872 u32 addr; 3881 3873 3882 - addr = rtw89_mac_reg_by_idx(R_AX_MD_TSFT_STMP_CTL, rtwvif->mac_idx); 3874 + addr = rtw89_mac_reg_by_idx(rtwdev, R_AX_MD_TSFT_STMP_CTL, rtwvif->mac_idx); 3883 3875 rtw89_write8_set(rtwdev, addr, B_AX_UPD_HGQMD | B_AX_UPD_TIMIE); 3884 3876 3885 3877 rtw89_write16_port_mask(rtwdev, rtwvif, p->dtim_ctrl, B_AX_DTIM_NUM_MASK, ··· 3938 3930 3939 3931 bss_color = vif->bss_conf.he_bss_color.color; 3940 3932 reg_base = port >= 4 ? R_AX_PTCL_BSS_COLOR_1 : R_AX_PTCL_BSS_COLOR_0; 3941 - reg = rtw89_mac_reg_by_idx(reg_base, rtwvif->mac_idx); 3933 + reg = rtw89_mac_reg_by_idx(rtwdev, reg_base, rtwvif->mac_idx); 3942 3934 rtw89_write32_mask(rtwdev, reg, masks[port], bss_color); 3943 3935 } 3944 3936 ··· 3952 3944 return; 3953 3945 3954 3946 if (port == 0) { 3955 - reg = rtw89_mac_reg_by_idx(R_AX_MBSSID_CTRL, rtwvif->mac_idx); 3947 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MBSSID_CTRL, rtwvif->mac_idx); 3956 3948 rtw89_write32_clr(rtwdev, reg, B_AX_P0MB_ALL_MASK); 3957 3949 } 3958 3950 } ··· 3964 3956 u32 reg; 3965 3957 u32 val; 3966 3958 3967 - reg = rtw89_mac_reg_by_idx(R_AX_MBSSID_DROP_0, rtwvif->mac_idx); 3959 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MBSSID_DROP_0, rtwvif->mac_idx); 3968 3960 val = rtw89_read32(rtwdev, reg); 3969 3961 val &= ~FIELD_PREP(B_AX_PORT_DROP_4_0_MASK, BIT(port)); 3970 3962 if (port == 0) ··· 4022 4014 u32 val, reg; 4023 4015 4024 4016 val = RTW89_PORT_OFFSET_TU_TO_32US(offset_tu); 4025 - reg = rtw89_mac_reg_by_idx(R_AX_PORT0_TSF_SYNC + rtwvif->port * 4, 4017 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PORT0_TSF_SYNC + rtwvif->port * 4, 4026 4018 rtwvif->mac_idx); 4027 4019 4028 4020 rtw89_write32_mask(rtwdev, reg, B_AX_SYNC_PORT_SRC, rtwvif_src->port); ··· 4212 4204 rtw89_mac_check_he_obss_narrow_bw_ru_iter, 4213 4205 &tolerated); 4214 4206 4215 - reg = rtw89_mac_reg_by_idx(R_AX_RXTRIG_TEST_USER_2, rtwvif->mac_idx); 4207 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXTRIG_TEST_USER_2, rtwvif->mac_idx); 4216 4208 if (tolerated) 4217 4209 rtw89_write32_clr(rtwdev, reg, B_AX_RXTRIG_RU26_DIS); 4218 4210 else ··· 4739 4731 { 4740 4732 const struct rtw89_dle_mem *dle_mem = rtwdev->chip->dle_mem; 4741 4733 enum rtw89_qta_mode mode = dle_mem->mode; 4742 - u32 addr = rtw89_mac_reg_by_idx(reg_base, phy_idx); 4734 + u32 addr = rtw89_mac_reg_by_idx(rtwdev, reg_base, phy_idx); 4743 4735 4744 4736 if (addr < R_AX_PWR_RATE_CTRL || addr > CMAC1_END_ADDR) { 4745 4737 rtw89_err(rtwdev, "[TXPWR] addr=0x%x exceed txpwr cr\n", ··· 4768 4760 4769 4761 int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable) 4770 4762 { 4771 - u32 reg = rtw89_mac_reg_by_idx(R_AX_PPDU_STAT, mac_idx); 4763 + u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PPDU_STAT, mac_idx); 4772 4764 int ret; 4773 4765 4774 4766 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); ··· 4815 4807 time_th = min_t(u32, time_th >> MAC_AX_TIME_TH_SH, MAC_AX_TIME_TH_MAX); 4816 4808 len_th = min_t(u32, len_th >> MAC_AX_LEN_TH_SH, MAC_AX_LEN_TH_MAX); 4817 4809 4818 - reg = rtw89_mac_reg_by_idx(R_AX_AGG_LEN_HT_0, mac_idx); 4810 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AGG_LEN_HT_0, mac_idx); 4819 4811 rtw89_write16_mask(rtwdev, reg, B_AX_RTS_TXTIME_TH_MASK, time_th); 4820 4812 rtw89_write16_mask(rtwdev, reg, B_AX_RTS_LEN_TH_MASK, len_th); 4821 4813 } ··· 5051 5043 if (ret) 5052 5044 return ret; 5053 5045 5054 - reg = rtw89_mac_reg_by_idx(R_AX_BT_PLT, plt->band); 5046 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BT_PLT, plt->band); 5055 5047 val = (plt->tx & RTW89_MAC_AX_PLT_LTE_RX ? B_AX_TX_PLT_GNT_LTE_RX : 0) | 5056 5048 (plt->tx & RTW89_MAC_AX_PLT_GNT_BT_TX ? B_AX_TX_PLT_GNT_BT_TX : 0) | 5057 5049 (plt->tx & RTW89_MAC_AX_PLT_GNT_BT_RX ? B_AX_TX_PLT_GNT_BT_RX : 0) | ··· 5141 5133 u32 reg; 5142 5134 u16 cnt; 5143 5135 5144 - reg = rtw89_mac_reg_by_idx(R_AX_BT_PLT, band); 5136 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BT_PLT, band); 5145 5137 cnt = rtw89_read32_mask(rtwdev, reg, B_AX_BT_PLT_PKT_CNT_MASK); 5146 5138 rtw89_write16_set(rtwdev, reg, B_AX_BT_PLT_RST); 5147 5139 ··· 5154 5146 u32 reg; 5155 5147 5156 5148 rtw89_debug(rtwdev, RTW89_DBG_BF, "set bfee standby_timer to %d\n", keep); 5157 - reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx); 5149 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx); 5158 5150 if (keep) { 5159 5151 set_bit(RTW89_FLAG_BFEE_TIMER_KEEP, rtwdev->flags); 5160 5152 rtw89_write32_mask(rtwdev, reg, B_AX_BFMEE_BFRP_RX_STANDBY_TIMER_MASK, ··· 5173 5165 B_AX_BFMEE_HE_NDPA_EN; 5174 5166 5175 5167 rtw89_debug(rtwdev, RTW89_DBG_BF, "set bfee ndpa_en to %d\n", en); 5176 - reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx); 5168 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx); 5177 5169 if (en) { 5178 5170 set_bit(RTW89_FLAG_BFEE_EN, rtwdev->flags); 5179 5171 rtw89_write32_set(rtwdev, reg, mask); ··· 5195 5187 5196 5188 /* AP mode set tx gid to 63 */ 5197 5189 /* STA mode set tx gid to 0(default) */ 5198 - reg = rtw89_mac_reg_by_idx(R_AX_BFMER_CTRL_0, mac_idx); 5190 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMER_CTRL_0, mac_idx); 5199 5191 rtw89_write32_set(rtwdev, reg, B_AX_BFMER_NDP_BFEN); 5200 5192 5201 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx); 5193 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx); 5202 5194 rtw89_write32(rtwdev, reg, CSI_RRSC_BMAP); 5203 5195 5204 - reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx); 5196 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx); 5205 5197 val32 = FIELD_PREP(B_AX_BFMEE_NDP_RX_STANDBY_TIMER_MASK, NDP_RX_STANDBY_TIMER); 5206 5198 rtw89_write32(rtwdev, reg, val32); 5207 5199 rtw89_mac_bfee_standby_timer(rtwdev, mac_idx, true); 5208 5200 rtw89_mac_bfee_ctrl(rtwdev, mac_idx, true); 5209 5201 5210 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5202 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5211 5203 rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL | 5212 5204 B_AX_BFMEE_USE_NSTS | 5213 5205 B_AX_BFMEE_CSI_GID_SEL | 5214 5206 B_AX_BFMEE_CSI_FORCE_RETE_EN); 5215 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RATE, mac_idx); 5207 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RATE, mac_idx); 5216 5208 rtw89_write32(rtwdev, reg, 5217 5209 u32_encode_bits(CSI_INIT_RATE_HT, B_AX_BFMEE_HT_CSI_RATE_MASK) | 5218 5210 u32_encode_bits(CSI_INIT_RATE_VHT, B_AX_BFMEE_VHT_CSI_RATE_MASK) | 5219 5211 u32_encode_bits(CSI_INIT_RATE_HE, B_AX_BFMEE_HE_CSI_RATE_MASK)); 5220 5212 5221 - reg = rtw89_mac_reg_by_idx(R_AX_CSIRPT_OPTION, mac_idx); 5213 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CSIRPT_OPTION, mac_idx); 5222 5214 rtw89_write32_set(rtwdev, reg, 5223 5215 B_AX_CSIPRT_VHTSU_AID_EN | B_AX_CSIPRT_HESU_AID_EN); 5224 5216 ··· 5262 5254 nc = min(nc, sound_dim); 5263 5255 nr = min(nr, sound_dim); 5264 5256 5265 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5257 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5266 5258 rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL); 5267 5259 5268 5260 val = FIELD_PREP(B_AX_BFMEE_CSIINFO0_NC_MASK, nc) | ··· 5274 5266 FIELD_PREP(B_AX_BFMEE_CSIINFO0_STBC_EN, stbc_en); 5275 5267 5276 5268 if (port_sel == 0) 5277 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5269 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5278 5270 else 5279 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_1, mac_idx); 5271 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_1, mac_idx); 5280 5272 5281 5273 rtw89_write16(rtwdev, reg, val); 5282 5274 ··· 5312 5304 BIT(RTW89_MAC_BF_RRSC_HT_MSC3) | 5313 5305 BIT(RTW89_MAC_BF_RRSC_HT_MSC5)); 5314 5306 } 5315 - reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5307 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 5316 5308 rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL); 5317 5309 rtw89_write32_clr(rtwdev, reg, B_AX_BFMEE_CSI_FORCE_RETE_EN); 5318 5310 rtw89_write32(rtwdev, 5319 - rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx), 5311 + rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx), 5320 5312 rrsc); 5321 5313 5322 5314 return 0; ··· 5354 5346 rtw89_debug(rtwdev, RTW89_DBG_BF, "update bf GID table\n"); 5355 5347 5356 5348 p = (__le32 *)conf->mu_group.membership; 5357 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION_EN0, mac_idx), 5349 + rtw89_write32(rtwdev, 5350 + rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION_EN0, mac_idx), 5358 5351 le32_to_cpu(p[0])); 5359 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION_EN1, mac_idx), 5352 + rtw89_write32(rtwdev, 5353 + rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION_EN1, mac_idx), 5360 5354 le32_to_cpu(p[1])); 5361 5355 5362 5356 p = (__le32 *)conf->mu_group.position; 5363 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION0, mac_idx), 5357 + rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION0, mac_idx), 5364 5358 le32_to_cpu(p[0])); 5365 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION1, mac_idx), 5359 + rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION1, mac_idx), 5366 5360 le32_to_cpu(p[1])); 5367 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION2, mac_idx), 5361 + rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION2, mac_idx), 5368 5362 le32_to_cpu(p[2])); 5369 - rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION3, mac_idx), 5363 + rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION3, mac_idx), 5370 5364 le32_to_cpu(p[3])); 5371 5365 } 5372 5366 ··· 5459 5449 return ret; 5460 5450 } 5461 5451 5462 - reg = rtw89_mac_reg_by_idx(R_AX_AMPDU_AGG_LIMIT, mac_idx); 5452 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx); 5463 5453 rtw89_write32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK, 5464 5454 max_tx_time >> 5); 5465 5455 } ··· 5499 5489 return ret; 5500 5490 } 5501 5491 5502 - reg = rtw89_mac_reg_by_idx(R_AX_AMPDU_AGG_LIMIT, mac_idx); 5492 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx); 5503 5493 *tx_time = rtw89_read32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK) << 5; 5504 5494 } 5505 5495 ··· 5541 5531 return ret; 5542 5532 } 5543 5533 5544 - reg = rtw89_mac_reg_by_idx(R_AX_TXCNT, mac_idx); 5534 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXCNT, mac_idx); 5545 5535 *tx_retry = rtw89_read32_mask(rtwdev, reg, B_AX_L_TXCNT_LMT_MASK); 5546 5536 } 5547 5537 ··· 5560 5550 if (ret) 5561 5551 return ret; 5562 5552 5563 - reg = rtw89_mac_reg_by_idx(R_AX_MUEDCA_EN, mac_idx); 5553 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MUEDCA_EN, mac_idx); 5564 5554 if (en) 5565 5555 rtw89_write16_set(rtwdev, reg, set); 5566 5556 else ··· 5683 5673 } 5684 5674 return ret; 5685 5675 } 5676 + 5677 + const struct rtw89_mac_gen_def rtw89_mac_gen_ax = { 5678 + .band1_offset = RTW89_MAC_AX_BAND_REG_OFFSET, 5679 + .filter_model_addr = R_AX_FILTER_MODEL_ADDR, 5680 + .indir_access_addr = R_AX_INDIR_ACCESS_ENTRY, 5681 + .mem_base_addrs = rtw89_mac_mem_base_addrs_ax, 5682 + .rx_fltr = R_AX_RX_FLTR_OPT, 5683 + }; 5684 + EXPORT_SYMBOL(rtw89_mac_gen_ax);
+55 -14
drivers/net/wireless/realtek/rtw89/mac.h
··· 275 275 276 276 /* SRAM mem dump */ 277 277 #define R_AX_INDIR_ACCESS_ENTRY 0x40000 278 + #define R_BE_INDIR_ACCESS_ENTRY 0x80000 278 279 279 280 #define AXIDMA_BASE_ADDR 0x18006000 280 281 #define STA_SCHED_BASE_ADDR 0x18808000 ··· 298 297 #define TXDATA_FIFO_0_BASE_ADDR 0x18856000 299 298 #define TXDATA_FIFO_1_BASE_ADDR 0x188A1000 300 299 #define CPU_LOCAL_BASE_ADDR 0x18003000 300 + 301 + #define WD_PAGE_BASE_ADDR_BE 0x0 302 + #define CPU_LOCAL_BASE_ADDR_BE 0x18003000 303 + #define AXIDMA_BASE_ADDR_BE 0x18006000 304 + #define SHARED_BUF_BASE_ADDR_BE 0x18700000 305 + #define DMAC_TBL_BASE_ADDR_BE 0x18800000 306 + #define SHCUT_MACHDR_BASE_ADDR_BE 0x18800800 307 + #define STA_SCHED_BASE_ADDR_BE 0x18818000 308 + #define NAT25_CAM_BASE_ADDR_BE 0x18820000 309 + #define RXPLD_FLTR_CAM_BASE_ADDR_BE 0x18823000 310 + #define SEC_CAM_BASE_ADDR_BE 0x18824000 311 + #define WOW_CAM_BASE_ADDR_BE 0x18828000 312 + #define MLD_TBL_BASE_ADDR_BE 0x18829000 313 + #define RX_CLSF_CAM_BASE_ADDR_BE 0x1882A000 314 + #define CMAC_TBL_BASE_ADDR_BE 0x18840000 315 + #define ADDR_CAM_BASE_ADDR_BE 0x18850000 316 + #define BSSID_CAM_BASE_ADDR_BE 0x18858000 317 + #define BA_CAM_BASE_ADDR_BE 0x18859000 318 + #define BCN_IE_CAM0_BASE_ADDR_BE 0x18860000 319 + #define TXDATA_FIFO_0_BASE_ADDR_BE 0x18861000 320 + #define TXD_FIFO_0_BASE_ADDR_BE 0x18862000 321 + #define BCN_IE_CAM1_BASE_ADDR_BE 0x18880000 322 + #define TXDATA_FIFO_1_BASE_ADDR_BE 0x18881000 323 + #define TXD_FIFO_1_BASE_ADDR_BE 0x18881800 324 + #define DCPU_LOCAL_BASE_ADDR_BE 0x19C02000 301 325 302 326 #define CCTL_INFO_SIZE 32 303 327 ··· 348 322 RTW89_MAC_MEM_BSSID_CAM, 349 323 RTW89_MAC_MEM_TXD_FIFO_0_V1, 350 324 RTW89_MAC_MEM_TXD_FIFO_1_V1, 325 + RTW89_MAC_MEM_WD_PAGE, 351 326 352 327 /* keep last */ 353 328 RTW89_MAC_MEM_NUM, 354 329 }; 355 - 356 - extern const u32 rtw89_mac_mem_base_addrs[]; 357 330 358 331 enum rtw89_rpwm_req_pwr_state { 359 332 RTW89_MAC_RPWM_REQ_PWR_STATE_ACTIVE = 0, ··· 503 478 ({typeof(_addr) __addr = (_addr); \ 504 479 __addr >= R_AX_CMAC_REG_START && __addr <= R_AX_CMAC_REG_END; }) 505 480 #define RTW89_MAC_AX_BAND_REG_OFFSET 0x2000 481 + #define RTW89_MAC_BE_BAND_REG_OFFSET 0x4000 506 482 507 483 #define PTCL_IDLE_POLL_CNT 10000 508 484 #define SW_CVR_DUR_US 8 ··· 852 826 853 827 extern const struct rtw89_mac_size_set rtw89_mac_size; 854 828 855 - static inline u32 rtw89_mac_reg_by_idx(u32 reg_base, u8 band) 829 + struct rtw89_mac_gen_def { 830 + u32 band1_offset; 831 + u32 filter_model_addr; 832 + u32 indir_access_addr; 833 + const u32 *mem_base_addrs; 834 + u32 rx_fltr; 835 + }; 836 + 837 + extern const struct rtw89_mac_gen_def rtw89_mac_gen_ax; 838 + extern const struct rtw89_mac_gen_def rtw89_mac_gen_be; 839 + 840 + static inline 841 + u32 rtw89_mac_reg_by_idx(struct rtw89_dev *rtwdev, u32 reg_base, u8 band) 856 842 { 857 - return band == 0 ? reg_base : (reg_base + 0x2000); 843 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 844 + 845 + return band == 0 ? reg_base : (reg_base + mac->band1_offset); 858 846 } 859 847 860 - static inline u32 rtw89_mac_reg_by_port(u32 base, u8 port, u8 mac_idx) 848 + static inline 849 + u32 rtw89_mac_reg_by_port(struct rtw89_dev *rtwdev, u32 base, u8 port, u8 mac_idx) 861 850 { 862 - return rtw89_mac_reg_by_idx(base + port * 0x40, mac_idx); 851 + return rtw89_mac_reg_by_idx(rtwdev, base + port * 0x40, mac_idx); 863 852 } 864 853 865 854 static inline u32 ··· 882 841 { 883 842 u32 reg; 884 843 885 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 844 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 886 845 return rtw89_read32(rtwdev, reg); 887 846 } 888 847 ··· 892 851 { 893 852 u32 reg; 894 853 895 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 854 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 896 855 return rtw89_read32_mask(rtwdev, reg, mask); 897 856 } 898 857 ··· 902 861 { 903 862 u32 reg; 904 863 905 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 864 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 906 865 rtw89_write32(rtwdev, reg, data); 907 866 } 908 867 ··· 912 871 { 913 872 u32 reg; 914 873 915 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 874 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 916 875 rtw89_write32_mask(rtwdev, reg, mask, data); 917 876 } 918 877 ··· 922 881 { 923 882 u32 reg; 924 883 925 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 884 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 926 885 rtw89_write16_mask(rtwdev, reg, mask, data); 927 886 } 928 887 ··· 932 891 { 933 892 u32 reg; 934 893 935 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 894 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 936 895 rtw89_write32_clr(rtwdev, reg, bit); 937 896 } 938 897 ··· 942 901 { 943 902 u32 reg; 944 903 945 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 904 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 946 905 rtw89_write16_clr(rtwdev, reg, bit); 947 906 } 948 907 ··· 952 911 { 953 912 u32 reg; 954 913 955 - reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx); 914 + reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx); 956 915 rtw89_write32_set(rtwdev, reg, bit); 957 916 } 958 917
+10 -4
drivers/net/wireless/realtek/rtw89/mac80211.c
··· 224 224 u64 multicast) 225 225 { 226 226 struct rtw89_dev *rtwdev = hw->priv; 227 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 227 228 228 229 mutex_lock(&rtwdev->mutex); 229 230 rtw89_leave_ps_mode(rtwdev); ··· 272 271 } 273 272 274 273 rtw89_write32_mask(rtwdev, 275 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0), 274 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0), 276 275 B_AX_RX_FLTR_CFG_MASK, 277 276 rtwdev->hal.rx_fltr); 278 277 if (!rtwdev->dbcc_en) 279 278 goto out; 280 279 rtw89_write32_mask(rtwdev, 281 - rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_1), 280 + rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_1), 282 281 B_AX_RX_FLTR_CFG_MASK, 283 282 rtwdev->hal.rx_fltr); 284 283 ··· 297 296 struct rtw89_vif *rtwvif, u8 aifsn) 298 297 { 299 298 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); 300 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 299 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 300 + rtwvif->sub_entity_idx); 301 301 u8 slot_time; 302 302 u8 sifs; 303 303 ··· 355 353 val = FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_TIMER_MASK, timer_32us) | 356 354 FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_CW_MASK, mu_edca->ecw_min_max) | 357 355 FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_AIFS_MASK, aifs); 358 - reg = rtw89_mac_reg_by_idx(ac_to_mu_edca_param[ac], rtwvif->mac_idx); 356 + reg = rtw89_mac_reg_by_idx(rtwdev, ac_to_mu_edca_param[ac], rtwvif->mac_idx); 359 357 rtw89_write32(rtwdev, reg, val); 360 358 361 359 rtw89_mac_set_hw_muedca_ctrl(rtwdev, rtwvif, true); ··· 415 413 rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, vif); 416 414 rtw89_mac_port_update(rtwdev, rtwvif); 417 415 rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, vif); 416 + 417 + rtw89_queue_chanctx_work(rtwdev); 418 418 } else { 419 419 /* Abort ongoing scan if cancel_scan isn't issued 420 420 * when disconnected by peer ··· 480 476 rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true); 481 477 rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL); 482 478 rtw89_chip_rfk_channel(rtwdev); 479 + 480 + rtw89_queue_chanctx_work(rtwdev); 483 481 mutex_unlock(&rtwdev->mutex); 484 482 485 483 return 0;
+38
drivers/net/wireless/realtek/rtw89/mac_be.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 + /* Copyright(c) 2019-2020 Realtek Corporation 3 + */ 4 + 5 + #include "mac.h" 6 + #include "reg.h" 7 + 8 + static const u32 rtw89_mac_mem_base_addrs_be[RTW89_MAC_MEM_NUM] = { 9 + [RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR_BE, 10 + [RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR_BE, 11 + [RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR_BE, 12 + [RTW89_MAC_MEM_SHCUT_MACHDR] = SHCUT_MACHDR_BASE_ADDR_BE, 13 + [RTW89_MAC_MEM_STA_SCHED] = STA_SCHED_BASE_ADDR_BE, 14 + [RTW89_MAC_MEM_RXPLD_FLTR_CAM] = RXPLD_FLTR_CAM_BASE_ADDR_BE, 15 + [RTW89_MAC_MEM_SECURITY_CAM] = SEC_CAM_BASE_ADDR_BE, 16 + [RTW89_MAC_MEM_WOW_CAM] = WOW_CAM_BASE_ADDR_BE, 17 + [RTW89_MAC_MEM_CMAC_TBL] = CMAC_TBL_BASE_ADDR_BE, 18 + [RTW89_MAC_MEM_ADDR_CAM] = ADDR_CAM_BASE_ADDR_BE, 19 + [RTW89_MAC_MEM_BA_CAM] = BA_CAM_BASE_ADDR_BE, 20 + [RTW89_MAC_MEM_BCN_IE_CAM0] = BCN_IE_CAM0_BASE_ADDR_BE, 21 + [RTW89_MAC_MEM_BCN_IE_CAM1] = BCN_IE_CAM1_BASE_ADDR_BE, 22 + [RTW89_MAC_MEM_TXD_FIFO_0] = TXD_FIFO_0_BASE_ADDR_BE, 23 + [RTW89_MAC_MEM_TXD_FIFO_1] = TXD_FIFO_1_BASE_ADDR_BE, 24 + [RTW89_MAC_MEM_TXDATA_FIFO_0] = TXDATA_FIFO_0_BASE_ADDR_BE, 25 + [RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR_BE, 26 + [RTW89_MAC_MEM_CPU_LOCAL] = CPU_LOCAL_BASE_ADDR_BE, 27 + [RTW89_MAC_MEM_BSSID_CAM] = BSSID_CAM_BASE_ADDR_BE, 28 + [RTW89_MAC_MEM_WD_PAGE] = WD_PAGE_BASE_ADDR_BE, 29 + }; 30 + 31 + const struct rtw89_mac_gen_def rtw89_mac_gen_be = { 32 + .band1_offset = RTW89_MAC_BE_BAND_REG_OFFSET, 33 + .filter_model_addr = R_BE_FILTER_MODEL_ADDR, 34 + .indir_access_addr = R_BE_INDIR_ACCESS_ENTRY, 35 + .mem_base_addrs = rtw89_mac_mem_base_addrs_be, 36 + .rx_fltr = R_BE_RX_FLTR_OPT, 37 + }; 38 + EXPORT_SYMBOL(rtw89_mac_gen_be);
+1 -1
drivers/net/wireless/realtek/rtw89/pci.c
··· 3939 3939 EXPORT_SYMBOL(rtw89_pci_remove); 3940 3940 3941 3941 MODULE_AUTHOR("Realtek Corporation"); 3942 - MODULE_DESCRIPTION("Realtek 802.11ax wireless PCI driver"); 3942 + MODULE_DESCRIPTION("Realtek PCI 802.11ax wireless driver"); 3943 3943 MODULE_LICENSE("Dual BSD/GPL");
+188 -78
drivers/net/wireless/realtek/rtw89/phy.c
··· 133 133 return ra_mask; 134 134 } 135 135 136 - static u64 rtw89_phy_ra_mask_cfg(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta) 136 + static u64 rtw89_phy_ra_mask_cfg(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, 137 + const struct rtw89_chan *chan) 137 138 { 138 139 struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta); 139 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 140 140 struct cfg80211_bitrate_mask *mask = &rtwsta->mask; 141 141 enum nl80211_band band; 142 142 u64 cfg_mask; ··· 197 197 198 198 static void rtw89_phy_ra_gi_ltf(struct rtw89_dev *rtwdev, 199 199 struct rtw89_sta *rtwsta, 200 + const struct rtw89_chan *chan, 200 201 bool *fix_giltf_en, u8 *fix_giltf) 201 202 { 202 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 203 203 struct cfg80211_bitrate_mask *mask = &rtwsta->mask; 204 204 u8 band = chan->band_type; 205 205 enum nl80211_band nl_band = rtw89_hw_to_nl80211_band(band); ··· 236 236 struct rtw89_vif *rtwvif = rtwsta->rtwvif; 237 237 struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern; 238 238 struct rtw89_ra_info *ra = &rtwsta->ra; 239 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 239 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 240 + rtwvif->sub_entity_idx); 240 241 struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif); 241 242 const u64 *high_rate_masks = rtw89_ra_mask_ht_rates; 242 243 u8 rssi = ewma_rssi_read(&rtwsta->avg_rssi); ··· 266 265 if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[1] & 267 266 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD) 268 267 ldpc_en = 1; 269 - rtw89_phy_ra_gi_ltf(rtwdev, rtwsta, &fix_giltf_en, &fix_giltf); 268 + rtw89_phy_ra_gi_ltf(rtwdev, rtwsta, chan, &fix_giltf_en, &fix_giltf); 270 269 } else if (sta->deflink.vht_cap.vht_supported) { 271 270 u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map); 272 271 ··· 333 332 ra_mask &= rtw89_phy_ra_mask_rssi(rtwdev, rssi, 0); 334 333 335 334 ra_mask = rtw89_phy_ra_mask_recover(ra_mask, ra_mask_bak); 336 - ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta); 335 + ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta, chan); 337 336 338 337 switch (sta->deflink.bandwidth) { 339 338 case IEEE80211_STA_RX_BW_160: ··· 363 362 ra->dcm_cap = 1; 364 363 365 364 if (rate_pattern->enable && !vif->p2p) { 366 - ra_mask = rtw89_phy_ra_mask_cfg(rtwdev, rtwsta); 365 + ra_mask = rtw89_phy_ra_mask_cfg(rtwdev, rtwsta, chan); 367 366 ra_mask &= rate_pattern->ra_mask; 368 367 mode = rate_pattern->ra_mode; 369 368 } ··· 458 457 struct ieee80211_supported_band *sband; 459 458 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 460 459 struct rtw89_phy_rate_pattern next_pattern = {0}; 461 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 460 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 461 + rtwvif->sub_entity_idx); 462 462 static const u16 hw_rate_he[][RTW89_CHIP_GEN_NUM] = { 463 463 RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS1_MCS0), 464 464 RTW89_HW_RATE_BY_CHIP_GEN(HE_NSS2_MCS0), ··· 1448 1446 u32 phy_page = addr >> 8; 1449 1447 u32 ofst = 0; 1450 1448 1449 + if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) 1450 + return addr < 0x10000 ? 0x20000 : 0; 1451 + 1451 1452 switch (phy_page) { 1452 1453 case 0x6: 1453 1454 case 0x7: ··· 1652 1647 const struct rtw89_txpwr_rule_5ghz *rule_5ghz = &rfe_parms->rule_5ghz; 1653 1648 const struct rtw89_txpwr_rule_6ghz *rule_6ghz = &rfe_parms->rule_6ghz; 1654 1649 struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory; 1650 + enum nl80211_band nl_band = rtw89_hw_to_nl80211_band(band); 1651 + u32 freq = ieee80211_channel_to_frequency(ch, nl_band); 1655 1652 u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch); 1656 1653 u8 regd = rtw89_regd_get(rtwdev, band); 1657 1654 u8 reg6 = regulatory->reg_6ghz_power; ··· 1689 1682 } 1690 1683 1691 1684 lmt = _phy_txpwr_rf_to_mac(rtwdev, lmt); 1692 - sar = rtw89_query_sar(rtwdev); 1685 + sar = rtw89_query_sar(rtwdev, freq); 1693 1686 1694 1687 return min(lmt, sar); 1695 1688 } ··· 1909 1902 const struct rtw89_txpwr_rule_5ghz *rule_5ghz = &rfe_parms->rule_5ghz; 1910 1903 const struct rtw89_txpwr_rule_6ghz *rule_6ghz = &rfe_parms->rule_6ghz; 1911 1904 struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory; 1905 + enum nl80211_band nl_band = rtw89_hw_to_nl80211_band(band); 1906 + u32 freq = ieee80211_channel_to_frequency(ch, nl_band); 1912 1907 u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch); 1913 1908 u8 regd = rtw89_regd_get(rtwdev, band); 1914 1909 u8 reg6 = regulatory->reg_6ghz_power; ··· 1946 1937 } 1947 1938 1948 1939 lmt_ru = _phy_txpwr_rf_to_mac(rtwdev, lmt_ru); 1949 - sar = rtw89_query_sar(rtwdev); 1940 + sar = rtw89_query_sar(rtwdev, freq); 1950 1941 1951 1942 return min(lmt_ru, sar); 1952 1943 } ··· 2894 2885 void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif) 2895 2886 { 2896 2887 const struct rtw89_chip_info *chip = rtwdev->chip; 2897 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2888 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, 2889 + rtwvif->sub_entity_idx); 2898 2890 struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; 2899 2891 2900 2892 if (!chip->support_ul_tb_ctrl) ··· 3237 3227 3238 3228 static void rtw89_phy_ccx_top_setting_init(struct rtw89_dev *rtwdev) 3239 3229 { 3230 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3240 3231 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3232 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3241 3233 3242 3234 env->ccx_manual_ctrl = false; 3243 3235 env->ccx_ongoing = false; ··· 3247 3235 env->ccx_period = 0; 3248 3236 env->ccx_unit_idx = RTW89_CCX_32_US; 3249 3237 3250 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_EN_MSK, 1); 3251 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_TRIG_OPT_MSK, 1); 3252 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 1); 3253 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_EDCCA_OPT_MSK, 3238 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->en_mask, 1); 3239 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->trig_opt_mask, 1); 3240 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1); 3241 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->edcca_opt_mask, 3254 3242 RTW89_CCX_EDCCA_BW20_0); 3255 3243 } 3256 3244 ··· 3365 3353 3366 3354 static void rtw89_phy_ifs_clm_set_th_reg(struct rtw89_dev *rtwdev) 3367 3355 { 3356 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3368 3357 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3358 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3369 3359 u8 i = 0; 3370 3360 3371 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_TH_LOW_MSK, 3361 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_l_mask, 3372 3362 env->ifs_clm_th_l[0]); 3373 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_TH_LOW_MSK, 3363 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_l_mask, 3374 3364 env->ifs_clm_th_l[1]); 3375 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_TH_LOW_MSK, 3365 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_l_mask, 3376 3366 env->ifs_clm_th_l[2]); 3377 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_TH_LOW_MSK, 3367 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_l_mask, 3378 3368 env->ifs_clm_th_l[3]); 3379 3369 3380 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_TH_HIGH_MSK, 3370 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_h_mask, 3381 3371 env->ifs_clm_th_h[0]); 3382 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_TH_HIGH_MSK, 3372 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_h_mask, 3383 3373 env->ifs_clm_th_h[1]); 3384 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_TH_HIGH_MSK, 3374 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_h_mask, 3385 3375 env->ifs_clm_th_h[2]); 3386 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_TH_HIGH_MSK, 3376 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_h_mask, 3387 3377 env->ifs_clm_th_h[3]); 3388 3378 3389 3379 for (i = 0; i < RTW89_IFS_CLM_NUM; i++) ··· 3396 3382 3397 3383 static void rtw89_phy_ifs_clm_setting_init(struct rtw89_dev *rtwdev) 3398 3384 { 3385 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3399 3386 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3387 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3400 3388 struct rtw89_ccx_para_info para = {0}; 3401 3389 3402 3390 env->ifs_clm_app = RTW89_IFS_CLM_BACKGROUND; ··· 3408 3392 if (rtw89_phy_ifs_clm_th_update_check(rtwdev, &para)) 3409 3393 rtw89_phy_ifs_clm_set_th_reg(rtwdev); 3410 3394 3411 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COLLECT_EN, 3412 - true); 3413 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_EN_MSK, true); 3414 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_EN_MSK, true); 3415 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_EN_MSK, true); 3416 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_EN_MSK, true); 3395 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_collect_en_mask, true); 3396 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_en_mask, true); 3397 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_en_mask, true); 3398 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_en_mask, true); 3399 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_en_mask, true); 3417 3400 } 3418 3401 3419 3402 static int rtw89_phy_ccx_racing_ctrl(struct rtw89_dev *rtwdev, ··· 3449 3434 3450 3435 static void rtw89_phy_ccx_trigger(struct rtw89_dev *rtwdev) 3451 3436 { 3437 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3452 3438 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3439 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3453 3440 3454 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COUNTER_CLR_MSK, 0); 3455 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 0); 3456 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COUNTER_CLR_MSK, 1); 3457 - rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 1); 3441 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 0); 3442 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 0); 3443 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 1); 3444 + rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1); 3458 3445 3459 3446 env->ccx_ongoing = true; 3460 3447 } ··· 3528 3511 3529 3512 static bool rtw89_phy_ifs_clm_get_result(struct rtw89_dev *rtwdev) 3530 3513 { 3514 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3531 3515 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3516 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3532 3517 u8 i = 0; 3533 3518 3534 - if (rtw89_phy_read32_mask(rtwdev, R_IFSCNT, B_IFSCNT_DONE_MSK) == 0) { 3519 + if (rtw89_phy_read32_mask(rtwdev, ccx->ifs_total_addr, 3520 + ccx->ifs_cnt_done_mask) == 0) { 3535 3521 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, 3536 3522 "Get IFS_CLM report Fail\n"); 3537 3523 return false; 3538 3524 } 3539 3525 3540 3526 env->ifs_clm_tx = 3541 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_TX_CNT, 3542 - B_IFS_CLM_TX_CNT_MSK); 3527 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_tx_cnt_addr, 3528 + ccx->ifs_clm_tx_cnt_msk); 3543 3529 env->ifs_clm_edcca_excl_cca = 3544 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_TX_CNT, 3545 - B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK); 3530 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_tx_cnt_addr, 3531 + ccx->ifs_clm_edcca_excl_cca_fa_mask); 3546 3532 env->ifs_clm_cckcca_excl_fa = 3547 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_CCA, 3548 - B_IFS_CLM_CCKCCA_EXCLUDE_FA_MSK); 3533 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_cca_addr, 3534 + ccx->ifs_clm_cckcca_excl_fa_mask); 3549 3535 env->ifs_clm_ofdmcca_excl_fa = 3550 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_CCA, 3551 - B_IFS_CLM_OFDMCCA_EXCLUDE_FA_MSK); 3536 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_cca_addr, 3537 + ccx->ifs_clm_ofdmcca_excl_fa_mask); 3552 3538 env->ifs_clm_cckfa = 3553 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_FA, 3554 - B_IFS_CLM_CCK_FA_MSK); 3539 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_fa_addr, 3540 + ccx->ifs_clm_cck_fa_mask); 3555 3541 env->ifs_clm_ofdmfa = 3556 - rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_FA, 3557 - B_IFS_CLM_OFDM_FA_MSK); 3542 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_fa_addr, 3543 + ccx->ifs_clm_ofdm_fa_mask); 3558 3544 3559 3545 env->ifs_clm_his[0] = 3560 - rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T1_HIS_MSK); 3546 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr, 3547 + ccx->ifs_t1_his_mask); 3561 3548 env->ifs_clm_his[1] = 3562 - rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T2_HIS_MSK); 3549 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr, 3550 + ccx->ifs_t2_his_mask); 3563 3551 env->ifs_clm_his[2] = 3564 - rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T3_HIS_MSK); 3552 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr, 3553 + ccx->ifs_t3_his_mask); 3565 3554 env->ifs_clm_his[3] = 3566 - rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T4_HIS_MSK); 3555 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr, 3556 + ccx->ifs_t4_his_mask); 3567 3557 3568 3558 env->ifs_clm_avg[0] = 3569 - rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_L, B_IFS_T1_AVG_MSK); 3559 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_l_addr, 3560 + ccx->ifs_t1_avg_mask); 3570 3561 env->ifs_clm_avg[1] = 3571 - rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_L, B_IFS_T2_AVG_MSK); 3562 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_l_addr, 3563 + ccx->ifs_t2_avg_mask); 3572 3564 env->ifs_clm_avg[2] = 3573 - rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_H, B_IFS_T3_AVG_MSK); 3565 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_h_addr, 3566 + ccx->ifs_t3_avg_mask); 3574 3567 env->ifs_clm_avg[3] = 3575 - rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_H, B_IFS_T4_AVG_MSK); 3568 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_h_addr, 3569 + ccx->ifs_t4_avg_mask); 3576 3570 3577 3571 env->ifs_clm_cca[0] = 3578 - rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_L, B_IFS_T1_CCA_MSK); 3572 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_l_addr, 3573 + ccx->ifs_t1_cca_mask); 3579 3574 env->ifs_clm_cca[1] = 3580 - rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_L, B_IFS_T2_CCA_MSK); 3575 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_l_addr, 3576 + ccx->ifs_t2_cca_mask); 3581 3577 env->ifs_clm_cca[2] = 3582 - rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_H, B_IFS_T3_CCA_MSK); 3578 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_h_addr, 3579 + ccx->ifs_t3_cca_mask); 3583 3580 env->ifs_clm_cca[3] = 3584 - rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_H, B_IFS_T4_CCA_MSK); 3581 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_h_addr, 3582 + ccx->ifs_t4_cca_mask); 3585 3583 3586 3584 env->ifs_clm_total_ifs = 3587 - rtw89_phy_read32_mask(rtwdev, R_IFSCNT, B_IFSCNT_TOTAL_CNT_MSK); 3585 + rtw89_phy_read32_mask(rtwdev, ccx->ifs_total_addr, 3586 + ccx->ifs_total_mask); 3588 3587 3589 3588 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "IFS-CLM total_ifs = %d\n", 3590 3589 env->ifs_clm_total_ifs); ··· 3628 3595 static int rtw89_phy_ifs_clm_set(struct rtw89_dev *rtwdev, 3629 3596 struct rtw89_ccx_para_info *para) 3630 3597 { 3598 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3631 3599 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 3600 + const struct rtw89_ccx_regs *ccx = phy->ccx; 3632 3601 u32 period = 0; 3633 3602 u32 unit_idx = 0; 3634 3603 ··· 3646 3611 if (para->mntr_time != env->ifs_clm_mntr_time) { 3647 3612 rtw89_phy_ccx_ms_to_period_unit(rtwdev, para->mntr_time, 3648 3613 &period, &unit_idx); 3649 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, 3650 - B_IFS_CLM_PERIOD_MSK, period); 3651 - rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, 3652 - B_IFS_CLM_COUNTER_UNIT_MSK, unit_idx); 3614 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, 3615 + ccx->ifs_clm_period_mask, period); 3616 + rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, 3617 + ccx->ifs_clm_cnt_unit_mask, 3618 + unit_idx); 3653 3619 3654 3620 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, 3655 3621 "Update IFS-CLM time ((%d)) -> ((%d))\n", ··· 3768 3732 bool enable, 3769 3733 enum rtw89_phy_idx phy_idx) 3770 3734 { 3735 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 3736 + const struct rtw89_physts_regs *physts = phy->physts; 3737 + 3771 3738 if (enable) { 3772 - rtw89_phy_write32_clr(rtwdev, R_PLCP_HISTOGRAM, 3773 - B_STS_DIS_TRIG_BY_FAIL); 3774 - rtw89_phy_write32_clr(rtwdev, R_PLCP_HISTOGRAM, 3775 - B_STS_DIS_TRIG_BY_BRK); 3739 + rtw89_phy_write32_clr(rtwdev, physts->setting_addr, 3740 + physts->dis_trigger_fail_mask); 3741 + rtw89_phy_write32_clr(rtwdev, physts->setting_addr, 3742 + physts->dis_trigger_brk_mask); 3776 3743 } else { 3777 - rtw89_phy_write32_set(rtwdev, R_PLCP_HISTOGRAM, 3778 - B_STS_DIS_TRIG_BY_FAIL); 3779 - rtw89_phy_write32_set(rtwdev, R_PLCP_HISTOGRAM, 3780 - B_STS_DIS_TRIG_BY_BRK); 3744 + rtw89_phy_write32_set(rtwdev, physts->setting_addr, 3745 + physts->dis_trigger_fail_mask); 3746 + rtw89_phy_write32_set(rtwdev, physts->setting_addr, 3747 + physts->dis_trigger_brk_mask); 3781 3748 } 3782 3749 } 3783 3750 ··· 4208 4169 "igi=%d, cck_ccaTH=%d, backoff=%d, cck_PD_low=((%d))dB\n", 4209 4170 final_rssi, cck_cca_th, under_region, pd_val); 4210 4171 4211 - rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_EN_V1, 4212 - B_BMODE_PDTH_LIMIT_EN_MSK_V1, enable); 4213 - rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_V1, 4214 - B_BMODE_PDTH_LOWER_BOUND_MSK_V1, pd_val); 4172 + rtw89_phy_write32_mask(rtwdev, dig_regs->bmode_pd_reg, 4173 + dig_regs->bmode_cca_rssi_limit_en, enable); 4174 + rtw89_phy_write32_mask(rtwdev, dig_regs->bmode_pd_lower_bound_reg, 4175 + dig_regs->bmode_rssi_nocca_low_th_mask, pd_val); 4215 4176 } 4216 4177 4217 4178 void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev) ··· 4600 4561 regs = rtw89_tssi_fastmode_regs_level; 4601 4562 4602 4563 for (i = 0; i < RTW89_TSSI_FAST_MODE_NUM; i++) { 4603 - reg = rtw89_mac_reg_by_idx(regs[i].addr, mac_idx); 4564 + reg = rtw89_mac_reg_by_idx(rtwdev, regs[i].addr, mac_idx); 4604 4565 rtw89_write32_mask(rtwdev, reg, regs[i].mask, val); 4605 4566 } 4606 4567 } ··· 4662 4623 data = chip->tssi_dbw_table->data[bandedge_cfg]; 4663 4624 4664 4625 for (i = 0; i < RTW89_TSSI_SBW_NUM; i++) { 4665 - reg = rtw89_mac_reg_by_idx(regs[i].addr, mac_idx); 4626 + reg = rtw89_mac_reg_by_idx(rtwdev, regs[i].addr, mac_idx); 4666 4627 rtw89_write32_mask(rtwdev, reg, regs[i].mask, data[i]); 4667 4628 } 4668 4629 4669 - reg = rtw89_mac_reg_by_idx(R_AX_BANDEDGE_CFG, mac_idx); 4630 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BANDEDGE_CFG, mac_idx); 4670 4631 rtw89_write32_mask(rtwdev, reg, B_AX_BANDEDGE_CFG_IDX_MASK, bandedge_cfg); 4671 4632 4672 4633 rtw89_phy_tssi_ctrl_set_fast_mode_cfg(rtwdev, mac_idx, bandedge_cfg, ··· 4764 4725 rtw89_phy_write32(rtwdev, reg, hal->edcca_bak); 4765 4726 } 4766 4727 } 4728 + 4729 + static const struct rtw89_ccx_regs rtw89_ccx_regs_ax = { 4730 + .setting_addr = R_CCX, 4731 + .edcca_opt_mask = B_CCX_EDCCA_OPT_MSK, 4732 + .measurement_trig_mask = B_MEASUREMENT_TRIG_MSK, 4733 + .trig_opt_mask = B_CCX_TRIG_OPT_MSK, 4734 + .en_mask = B_CCX_EN_MSK, 4735 + .ifs_cnt_addr = R_IFS_COUNTER, 4736 + .ifs_clm_period_mask = B_IFS_CLM_PERIOD_MSK, 4737 + .ifs_clm_cnt_unit_mask = B_IFS_CLM_COUNTER_UNIT_MSK, 4738 + .ifs_clm_cnt_clear_mask = B_IFS_COUNTER_CLR_MSK, 4739 + .ifs_collect_en_mask = B_IFS_COLLECT_EN, 4740 + .ifs_t1_addr = R_IFS_T1, 4741 + .ifs_t1_th_h_mask = B_IFS_T1_TH_HIGH_MSK, 4742 + .ifs_t1_en_mask = B_IFS_T1_EN_MSK, 4743 + .ifs_t1_th_l_mask = B_IFS_T1_TH_LOW_MSK, 4744 + .ifs_t2_addr = R_IFS_T2, 4745 + .ifs_t2_th_h_mask = B_IFS_T2_TH_HIGH_MSK, 4746 + .ifs_t2_en_mask = B_IFS_T2_EN_MSK, 4747 + .ifs_t2_th_l_mask = B_IFS_T2_TH_LOW_MSK, 4748 + .ifs_t3_addr = R_IFS_T3, 4749 + .ifs_t3_th_h_mask = B_IFS_T3_TH_HIGH_MSK, 4750 + .ifs_t3_en_mask = B_IFS_T3_EN_MSK, 4751 + .ifs_t3_th_l_mask = B_IFS_T3_TH_LOW_MSK, 4752 + .ifs_t4_addr = R_IFS_T4, 4753 + .ifs_t4_th_h_mask = B_IFS_T4_TH_HIGH_MSK, 4754 + .ifs_t4_en_mask = B_IFS_T4_EN_MSK, 4755 + .ifs_t4_th_l_mask = B_IFS_T4_TH_LOW_MSK, 4756 + .ifs_clm_tx_cnt_addr = R_IFS_CLM_TX_CNT, 4757 + .ifs_clm_edcca_excl_cca_fa_mask = B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK, 4758 + .ifs_clm_tx_cnt_msk = B_IFS_CLM_TX_CNT_MSK, 4759 + .ifs_clm_cca_addr = R_IFS_CLM_CCA, 4760 + .ifs_clm_ofdmcca_excl_fa_mask = B_IFS_CLM_OFDMCCA_EXCLUDE_FA_MSK, 4761 + .ifs_clm_cckcca_excl_fa_mask = B_IFS_CLM_CCKCCA_EXCLUDE_FA_MSK, 4762 + .ifs_clm_fa_addr = R_IFS_CLM_FA, 4763 + .ifs_clm_ofdm_fa_mask = B_IFS_CLM_OFDM_FA_MSK, 4764 + .ifs_clm_cck_fa_mask = B_IFS_CLM_CCK_FA_MSK, 4765 + .ifs_his_addr = R_IFS_HIS, 4766 + .ifs_t4_his_mask = B_IFS_T4_HIS_MSK, 4767 + .ifs_t3_his_mask = B_IFS_T3_HIS_MSK, 4768 + .ifs_t2_his_mask = B_IFS_T2_HIS_MSK, 4769 + .ifs_t1_his_mask = B_IFS_T1_HIS_MSK, 4770 + .ifs_avg_l_addr = R_IFS_AVG_L, 4771 + .ifs_t2_avg_mask = B_IFS_T2_AVG_MSK, 4772 + .ifs_t1_avg_mask = B_IFS_T1_AVG_MSK, 4773 + .ifs_avg_h_addr = R_IFS_AVG_H, 4774 + .ifs_t4_avg_mask = B_IFS_T4_AVG_MSK, 4775 + .ifs_t3_avg_mask = B_IFS_T3_AVG_MSK, 4776 + .ifs_cca_l_addr = R_IFS_CCA_L, 4777 + .ifs_t2_cca_mask = B_IFS_T2_CCA_MSK, 4778 + .ifs_t1_cca_mask = B_IFS_T1_CCA_MSK, 4779 + .ifs_cca_h_addr = R_IFS_CCA_H, 4780 + .ifs_t4_cca_mask = B_IFS_T4_CCA_MSK, 4781 + .ifs_t3_cca_mask = B_IFS_T3_CCA_MSK, 4782 + .ifs_total_addr = R_IFSCNT, 4783 + .ifs_cnt_done_mask = B_IFSCNT_DONE_MSK, 4784 + .ifs_total_mask = B_IFSCNT_TOTAL_CNT_MSK, 4785 + }; 4786 + 4787 + static const struct rtw89_physts_regs rtw89_physts_regs_ax = { 4788 + .setting_addr = R_PLCP_HISTOGRAM, 4789 + .dis_trigger_fail_mask = B_STS_DIS_TRIG_BY_FAIL, 4790 + .dis_trigger_brk_mask = B_STS_DIS_TRIG_BY_BRK, 4791 + }; 4792 + 4793 + const struct rtw89_phy_gen_def rtw89_phy_gen_ax = { 4794 + .cr_base = 0x10000, 4795 + .ccx = &rtw89_ccx_regs_ax, 4796 + .physts = &rtw89_physts_regs_ax, 4797 + }; 4798 + EXPORT_SYMBOL(rtw89_phy_gen_ax);
+103 -11
drivers/net/wireless/realtek/rtw89/phy.h
··· 7 7 8 8 #include "core.h" 9 9 10 - #define RTW89_PHY_ADDR_OFFSET 0x10000 11 10 #define RTW89_RF_ADDR_ADSEL_MASK BIT(16) 12 11 13 12 #define get_phy_headline(addr) FIELD_GET(GENMASK(31, 28), addr) ··· 336 337 struct rtw89_reg_def notch2_en; 337 338 }; 338 339 340 + struct rtw89_ccx_regs { 341 + u32 setting_addr; 342 + u32 edcca_opt_mask; 343 + u32 measurement_trig_mask; 344 + u32 trig_opt_mask; 345 + u32 en_mask; 346 + u32 ifs_cnt_addr; 347 + u32 ifs_clm_period_mask; 348 + u32 ifs_clm_cnt_unit_mask; 349 + u32 ifs_clm_cnt_clear_mask; 350 + u32 ifs_collect_en_mask; 351 + u32 ifs_t1_addr; 352 + u32 ifs_t1_th_h_mask; 353 + u32 ifs_t1_en_mask; 354 + u32 ifs_t1_th_l_mask; 355 + u32 ifs_t2_addr; 356 + u32 ifs_t2_th_h_mask; 357 + u32 ifs_t2_en_mask; 358 + u32 ifs_t2_th_l_mask; 359 + u32 ifs_t3_addr; 360 + u32 ifs_t3_th_h_mask; 361 + u32 ifs_t3_en_mask; 362 + u32 ifs_t3_th_l_mask; 363 + u32 ifs_t4_addr; 364 + u32 ifs_t4_th_h_mask; 365 + u32 ifs_t4_en_mask; 366 + u32 ifs_t4_th_l_mask; 367 + u32 ifs_clm_tx_cnt_addr; 368 + u32 ifs_clm_edcca_excl_cca_fa_mask; 369 + u32 ifs_clm_tx_cnt_msk; 370 + u32 ifs_clm_cca_addr; 371 + u32 ifs_clm_ofdmcca_excl_fa_mask; 372 + u32 ifs_clm_cckcca_excl_fa_mask; 373 + u32 ifs_clm_fa_addr; 374 + u32 ifs_clm_ofdm_fa_mask; 375 + u32 ifs_clm_cck_fa_mask; 376 + u32 ifs_his_addr; 377 + u32 ifs_t4_his_mask; 378 + u32 ifs_t3_his_mask; 379 + u32 ifs_t2_his_mask; 380 + u32 ifs_t1_his_mask; 381 + u32 ifs_avg_l_addr; 382 + u32 ifs_t2_avg_mask; 383 + u32 ifs_t1_avg_mask; 384 + u32 ifs_avg_h_addr; 385 + u32 ifs_t4_avg_mask; 386 + u32 ifs_t3_avg_mask; 387 + u32 ifs_cca_l_addr; 388 + u32 ifs_t2_cca_mask; 389 + u32 ifs_t1_cca_mask; 390 + u32 ifs_cca_h_addr; 391 + u32 ifs_t4_cca_mask; 392 + u32 ifs_t3_cca_mask; 393 + u32 ifs_total_addr; 394 + u32 ifs_cnt_done_mask; 395 + u32 ifs_total_mask; 396 + }; 397 + 398 + struct rtw89_physts_regs { 399 + u32 setting_addr; 400 + u32 dis_trigger_fail_mask; 401 + u32 dis_trigger_brk_mask; 402 + }; 403 + 404 + struct rtw89_phy_gen_def { 405 + u32 cr_base; 406 + const struct rtw89_ccx_regs *ccx; 407 + const struct rtw89_physts_regs *physts; 408 + }; 409 + 410 + extern const struct rtw89_phy_gen_def rtw89_phy_gen_ax; 411 + extern const struct rtw89_phy_gen_def rtw89_phy_gen_be; 412 + 339 413 static inline void rtw89_phy_write8(struct rtw89_dev *rtwdev, 340 414 u32 addr, u8 data) 341 415 { 342 - rtw89_write8(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data); 416 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 417 + 418 + rtw89_write8(rtwdev, addr + phy->cr_base, data); 343 419 } 344 420 345 421 static inline void rtw89_phy_write16(struct rtw89_dev *rtwdev, 346 422 u32 addr, u16 data) 347 423 { 348 - rtw89_write16(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data); 424 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 425 + 426 + rtw89_write16(rtwdev, addr + phy->cr_base, data); 349 427 } 350 428 351 429 static inline void rtw89_phy_write32(struct rtw89_dev *rtwdev, 352 430 u32 addr, u32 data) 353 431 { 354 - rtw89_write32(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, data); 432 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 433 + 434 + rtw89_write32(rtwdev, addr + phy->cr_base, data); 355 435 } 356 436 357 437 static inline void rtw89_phy_write32_set(struct rtw89_dev *rtwdev, 358 438 u32 addr, u32 bits) 359 439 { 360 - rtw89_write32_set(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, bits); 440 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 441 + 442 + rtw89_write32_set(rtwdev, addr + phy->cr_base, bits); 361 443 } 362 444 363 445 static inline void rtw89_phy_write32_clr(struct rtw89_dev *rtwdev, 364 446 u32 addr, u32 bits) 365 447 { 366 - rtw89_write32_clr(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, bits); 448 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 449 + 450 + rtw89_write32_clr(rtwdev, addr + phy->cr_base, bits); 367 451 } 368 452 369 453 static inline void rtw89_phy_write32_mask(struct rtw89_dev *rtwdev, 370 454 u32 addr, u32 mask, u32 data) 371 455 { 372 - rtw89_write32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask, data); 456 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 457 + 458 + rtw89_write32_mask(rtwdev, addr + phy->cr_base, mask, data); 373 459 } 374 460 375 461 static inline u8 rtw89_phy_read8(struct rtw89_dev *rtwdev, u32 addr) 376 462 { 377 - return rtw89_read8(rtwdev, addr | RTW89_PHY_ADDR_OFFSET); 463 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 464 + 465 + return rtw89_read8(rtwdev, addr + phy->cr_base); 378 466 } 379 467 380 468 static inline u16 rtw89_phy_read16(struct rtw89_dev *rtwdev, u32 addr) 381 469 { 382 - return rtw89_read16(rtwdev, addr | RTW89_PHY_ADDR_OFFSET); 470 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 471 + 472 + return rtw89_read16(rtwdev, addr + phy->cr_base); 383 473 } 384 474 385 475 static inline u32 rtw89_phy_read32(struct rtw89_dev *rtwdev, u32 addr) 386 476 { 387 - return rtw89_read32(rtwdev, addr | RTW89_PHY_ADDR_OFFSET); 477 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 478 + 479 + return rtw89_read32(rtwdev, addr + phy->cr_base); 388 480 } 389 481 390 482 static inline u32 rtw89_phy_read32_mask(struct rtw89_dev *rtwdev, 391 483 u32 addr, u32 mask) 392 484 { 393 - return rtw89_read32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask); 485 + const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; 486 + 487 + return rtw89_read32_mask(rtwdev, addr + phy->cr_base, mask); 394 488 } 395 489 396 490 static inline
+77
drivers/net/wireless/realtek/rtw89/phy_be.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 + /* Copyright(c) 2023 Realtek Corporation 3 + */ 4 + 5 + #include "phy.h" 6 + #include "reg.h" 7 + 8 + static const struct rtw89_ccx_regs rtw89_ccx_regs_be = { 9 + .setting_addr = R_CCX, 10 + .edcca_opt_mask = B_CCX_EDCCA_OPT_MSK_V1, 11 + .measurement_trig_mask = B_MEASUREMENT_TRIG_MSK, 12 + .trig_opt_mask = B_CCX_TRIG_OPT_MSK, 13 + .en_mask = B_CCX_EN_MSK, 14 + .ifs_cnt_addr = R_IFS_COUNTER, 15 + .ifs_clm_period_mask = B_IFS_CLM_PERIOD_MSK, 16 + .ifs_clm_cnt_unit_mask = B_IFS_CLM_COUNTER_UNIT_MSK, 17 + .ifs_clm_cnt_clear_mask = B_IFS_COUNTER_CLR_MSK, 18 + .ifs_collect_en_mask = B_IFS_COLLECT_EN, 19 + .ifs_t1_addr = R_IFS_T1, 20 + .ifs_t1_th_h_mask = B_IFS_T1_TH_HIGH_MSK, 21 + .ifs_t1_en_mask = B_IFS_T1_EN_MSK, 22 + .ifs_t1_th_l_mask = B_IFS_T1_TH_LOW_MSK, 23 + .ifs_t2_addr = R_IFS_T2, 24 + .ifs_t2_th_h_mask = B_IFS_T2_TH_HIGH_MSK, 25 + .ifs_t2_en_mask = B_IFS_T2_EN_MSK, 26 + .ifs_t2_th_l_mask = B_IFS_T2_TH_LOW_MSK, 27 + .ifs_t3_addr = R_IFS_T3, 28 + .ifs_t3_th_h_mask = B_IFS_T3_TH_HIGH_MSK, 29 + .ifs_t3_en_mask = B_IFS_T3_EN_MSK, 30 + .ifs_t3_th_l_mask = B_IFS_T3_TH_LOW_MSK, 31 + .ifs_t4_addr = R_IFS_T4, 32 + .ifs_t4_th_h_mask = B_IFS_T4_TH_HIGH_MSK, 33 + .ifs_t4_en_mask = B_IFS_T4_EN_MSK, 34 + .ifs_t4_th_l_mask = B_IFS_T4_TH_LOW_MSK, 35 + .ifs_clm_tx_cnt_addr = R_IFS_CLM_TX_CNT_V1, 36 + .ifs_clm_edcca_excl_cca_fa_mask = B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK, 37 + .ifs_clm_tx_cnt_msk = B_IFS_CLM_TX_CNT_MSK, 38 + .ifs_clm_cca_addr = R_IFS_CLM_CCA_V1, 39 + .ifs_clm_ofdmcca_excl_fa_mask = B_IFS_CLM_OFDMCCA_EXCLUDE_FA_MSK, 40 + .ifs_clm_cckcca_excl_fa_mask = B_IFS_CLM_CCKCCA_EXCLUDE_FA_MSK, 41 + .ifs_clm_fa_addr = R_IFS_CLM_FA_V1, 42 + .ifs_clm_ofdm_fa_mask = B_IFS_CLM_OFDM_FA_MSK, 43 + .ifs_clm_cck_fa_mask = B_IFS_CLM_CCK_FA_MSK, 44 + .ifs_his_addr = R_IFS_HIS_V1, 45 + .ifs_t4_his_mask = B_IFS_T4_HIS_MSK, 46 + .ifs_t3_his_mask = B_IFS_T3_HIS_MSK, 47 + .ifs_t2_his_mask = B_IFS_T2_HIS_MSK, 48 + .ifs_t1_his_mask = B_IFS_T1_HIS_MSK, 49 + .ifs_avg_l_addr = R_IFS_AVG_L_V1, 50 + .ifs_t2_avg_mask = B_IFS_T2_AVG_MSK, 51 + .ifs_t1_avg_mask = B_IFS_T1_AVG_MSK, 52 + .ifs_avg_h_addr = R_IFS_AVG_H_V1, 53 + .ifs_t4_avg_mask = B_IFS_T4_AVG_MSK, 54 + .ifs_t3_avg_mask = B_IFS_T3_AVG_MSK, 55 + .ifs_cca_l_addr = R_IFS_CCA_L_V1, 56 + .ifs_t2_cca_mask = B_IFS_T2_CCA_MSK, 57 + .ifs_t1_cca_mask = B_IFS_T1_CCA_MSK, 58 + .ifs_cca_h_addr = R_IFS_CCA_H_V1, 59 + .ifs_t4_cca_mask = B_IFS_T4_CCA_MSK, 60 + .ifs_t3_cca_mask = B_IFS_T3_CCA_MSK, 61 + .ifs_total_addr = R_IFSCNT_V1, 62 + .ifs_cnt_done_mask = B_IFSCNT_DONE_MSK, 63 + .ifs_total_mask = B_IFSCNT_TOTAL_CNT_MSK, 64 + }; 65 + 66 + static const struct rtw89_physts_regs rtw89_physts_regs_be = { 67 + .setting_addr = R_PLCP_HISTOGRAM, 68 + .dis_trigger_fail_mask = B_STS_DIS_TRIG_BY_FAIL, 69 + .dis_trigger_brk_mask = B_STS_DIS_TRIG_BY_BRK, 70 + }; 71 + 72 + const struct rtw89_phy_gen_def rtw89_phy_gen_be = { 73 + .cr_base = 0x20000, 74 + .ccx = &rtw89_ccx_regs_be, 75 + .physts = &rtw89_physts_regs_be, 76 + }; 77 + EXPORT_SYMBOL(rtw89_phy_gen_be);
+72 -3
drivers/net/wireless/realtek/rtw89/ps.c
··· 2 2 /* Copyright(c) 2019-2020 Realtek Corporation 3 3 */ 4 4 5 + #include "chan.h" 5 6 #include "coex.h" 6 7 #include "core.h" 7 8 #include "debug.h" ··· 258 257 { 259 258 struct ieee80211_vif *vif, *found_vif = NULL; 260 259 struct rtw89_vif *rtwvif; 260 + enum rtw89_entity_mode mode; 261 261 int count = 0; 262 + 263 + mode = rtw89_get_entity_mode(rtwdev); 264 + if (mode == RTW89_ENTITY_MODE_MCC) 265 + goto disable_lps; 262 266 263 267 rtw89_for_each_rtwvif(rtwdev, rtwvif) { 264 268 vif = rtwvif_to_vif(rtwvif); ··· 279 273 280 274 if (count == 1 && found_vif->cfg.ps) { 281 275 rtwdev->lps_enabled = true; 282 - } else { 283 - rtw89_leave_lps(rtwdev); 284 - rtwdev->lps_enabled = false; 276 + return; 285 277 } 278 + 279 + disable_lps: 280 + rtw89_leave_lps(rtwdev); 281 + rtwdev->lps_enabled = false; 282 + } 283 + 284 + void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif) 285 + { 286 + struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa; 287 + struct rtw89_p2p_noa_ie *ie = &setter->ie; 288 + struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head; 289 + struct rtw89_noa_attr_head *noa_head = &ie->noa_head; 290 + 291 + if (setter->noa_count) { 292 + setter->noa_index++; 293 + setter->noa_count = 0; 294 + } 295 + 296 + memset(ie, 0, sizeof(*ie)); 297 + 298 + p2p_head->eid = WLAN_EID_VENDOR_SPECIFIC; 299 + p2p_head->ie_len = 4 + sizeof(*noa_head); 300 + p2p_head->oui[0] = (WLAN_OUI_WFA >> 16) & 0xff; 301 + p2p_head->oui[1] = (WLAN_OUI_WFA >> 8) & 0xff; 302 + p2p_head->oui[2] = (WLAN_OUI_WFA >> 0) & 0xff; 303 + p2p_head->oui_type = WLAN_OUI_TYPE_WFA_P2P; 304 + 305 + noa_head->attr_type = IEEE80211_P2P_ATTR_ABSENCE_NOTICE; 306 + noa_head->attr_len = cpu_to_le16(2); 307 + noa_head->index = setter->noa_index; 308 + noa_head->oppps_ctwindow = 0; 309 + } 310 + 311 + void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif, 312 + const struct ieee80211_p2p_noa_desc *desc) 313 + { 314 + struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa; 315 + struct rtw89_p2p_noa_ie *ie = &setter->ie; 316 + struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head; 317 + struct rtw89_noa_attr_head *noa_head = &ie->noa_head; 318 + 319 + if (!desc->count || !desc->duration) 320 + return; 321 + 322 + if (setter->noa_count >= RTW89_P2P_MAX_NOA_NUM) 323 + return; 324 + 325 + p2p_head->ie_len += sizeof(*desc); 326 + le16_add_cpu(&noa_head->attr_len, sizeof(*desc)); 327 + 328 + ie->noa_desc[setter->noa_count++] = *desc; 329 + } 330 + 331 + u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data) 332 + { 333 + struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa; 334 + struct rtw89_p2p_noa_ie *ie = &setter->ie; 335 + void *tail; 336 + 337 + if (!setter->noa_count) 338 + return 0; 339 + 340 + *data = ie; 341 + tail = ie->noa_desc + setter->noa_count; 342 + return tail - *data; 286 343 }
+4
drivers/net/wireless/realtek/rtw89/ps.h
··· 16 16 void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl); 17 17 void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif); 18 18 void rtw89_recalc_lps(struct rtw89_dev *rtwdev); 19 + void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif); 20 + void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif, 21 + const struct ieee80211_p2p_noa_desc *desc); 22 + u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data); 19 23 20 24 static inline void rtw89_leave_ips_by_hwflags(struct rtw89_dev *rtwdev) 21 25 {
+38
drivers/net/wireless/realtek/rtw89/reg.h
··· 3625 3625 #define B_AX_GNT_BT_TX_SW_VAL BIT(1) 3626 3626 #define B_AX_GNT_BT_TX_SW_CTRL BIT(0) 3627 3627 3628 + #define R_BE_FILTER_MODEL_ADDR 0x0C04 3629 + 3630 + #define R_BE_RX_FLTR_OPT 0x11420 3631 + #define R_BE_RX_FLTR_OPT_C1 0x15420 3632 + #define B_BE_UID_FILTER_MASK GENMASK(31, 24) 3633 + #define B_BE_UNSPT_TYPE BIT(22) 3634 + #define B_BE_RX_MPDU_MAX_LEN_MASK GENMASK(21, 16) 3635 + #define B_BE_A_FTM_REQ BIT(14) 3636 + #define B_BE_A_ERR_PKT BIT(13) 3637 + #define B_BE_A_UNSUP_PKT BIT(12) 3638 + #define B_BE_A_CRC32_ERR BIT(11) 3639 + #define B_BE_A_BCN_CHK_RULE_MASK GENMASK(9, 8) 3640 + #define B_BE_A_BCN_CHK_EN BIT(7) 3641 + #define B_BE_A_MC_LIST_CAM_MATCH BIT(6) 3642 + #define B_BE_A_BC_CAM_MATCH BIT(5) 3643 + #define B_BE_A_UC_CAM_MATCH BIT(4) 3644 + #define B_BE_A_MC BIT(3) 3645 + #define B_BE_A_BC BIT(2) 3646 + #define B_BE_A_A1_MATCH BIT(1) 3647 + #define B_BE_SNIFFER_MODE BIT(0) 3648 + 3628 3649 #define RR_MOD 0x00 3629 3650 #define RR_MOD_V1 0x10000 3630 3651 #define RR_MOD_IQK GENMASK(19, 4) ··· 3998 3977 #define B_DBCC_80P80_SEL_EVM_RPT_EN BIT(0) 3999 3978 #define R_CCX 0x0C00 4000 3979 #define B_CCX_EDCCA_OPT_MSK GENMASK(6, 4) 3980 + #define B_CCX_EDCCA_OPT_MSK_V1 GENMASK(7, 4) 4001 3981 #define B_MEASUREMENT_TRIG_MSK BIT(2) 4002 3982 #define B_CCX_TRIG_OPT_MSK BIT(1) 4003 3983 #define B_CCX_EN_MSK BIT(0) ··· 4090 4068 #define B_SWSI_R_DATA_DONE_V1 BIT(26) 4091 4069 #define R_TX_COUNTER 0x1A40 4092 4070 #define R_IFS_CLM_TX_CNT 0x1ACC 4071 + #define R_IFS_CLM_TX_CNT_V1 0x0ECC 4093 4072 #define B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK GENMASK(31, 16) 4094 4073 #define B_IFS_CLM_TX_CNT_MSK GENMASK(15, 0) 4095 4074 #define R_IFS_CLM_CCA 0x1AD0 4075 + #define R_IFS_CLM_CCA_V1 0x0ED0 4096 4076 #define B_IFS_CLM_OFDMCCA_EXCLUDE_FA_MSK GENMASK(31, 16) 4097 4077 #define B_IFS_CLM_CCKCCA_EXCLUDE_FA_MSK GENMASK(15, 0) 4098 4078 #define R_IFS_CLM_FA 0x1AD4 4079 + #define R_IFS_CLM_FA_V1 0x0ED4 4099 4080 #define B_IFS_CLM_OFDM_FA_MSK GENMASK(31, 16) 4100 4081 #define B_IFS_CLM_CCK_FA_MSK GENMASK(15, 0) 4101 4082 #define R_IFS_HIS 0x1AD8 4083 + #define R_IFS_HIS_V1 0x0ED8 4102 4084 #define B_IFS_T4_HIS_MSK GENMASK(31, 24) 4103 4085 #define B_IFS_T3_HIS_MSK GENMASK(23, 16) 4104 4086 #define B_IFS_T2_HIS_MSK GENMASK(15, 8) 4105 4087 #define B_IFS_T1_HIS_MSK GENMASK(7, 0) 4106 4088 #define R_IFS_AVG_L 0x1ADC 4089 + #define R_IFS_AVG_L_V1 0x0EDC 4107 4090 #define B_IFS_T2_AVG_MSK GENMASK(31, 16) 4108 4091 #define B_IFS_T1_AVG_MSK GENMASK(15, 0) 4109 4092 #define R_IFS_AVG_H 0x1AE0 4093 + #define R_IFS_AVG_H_V1 0x0EE0 4110 4094 #define B_IFS_T4_AVG_MSK GENMASK(31, 16) 4111 4095 #define B_IFS_T3_AVG_MSK GENMASK(15, 0) 4112 4096 #define R_IFS_CCA_L 0x1AE4 4097 + #define R_IFS_CCA_L_V1 0x0EE4 4113 4098 #define B_IFS_T2_CCA_MSK GENMASK(31, 16) 4114 4099 #define B_IFS_T1_CCA_MSK GENMASK(15, 0) 4115 4100 #define R_IFS_CCA_H 0x1AE8 4101 + #define R_IFS_CCA_H_V1 0x0EE8 4116 4102 #define B_IFS_T4_CCA_MSK GENMASK(31, 16) 4117 4103 #define B_IFS_T3_CCA_MSK GENMASK(15, 0) 4118 4104 #define R_IFSCNT 0x1AEC 4105 + #define R_IFSCNT_V1 0x0EEC 4119 4106 #define B_IFSCNT_DONE_MSK BIT(16) 4120 4107 #define B_IFSCNT_TOTAL_CNT_MSK GENMASK(15, 0) 4121 4108 #define R_TXAGC_TP 0x1C04 ··· 4140 4109 #define B_TXAGC_BB_OFT GENMASK(31, 16) 4141 4110 #define B_TXAGC_BB GENMASK(31, 24) 4142 4111 #define B_TXAGC_RF GENMASK(5, 0) 4112 + #define R_PATH0_TXPWR 0x1C78 4113 + #define B_PATH0_TXPWR GENMASK(8, 0) 4143 4114 #define R_S0_ADDCK 0x1E00 4144 4115 #define B_S0_ADDCK_I GENMASK(9, 0) 4145 4116 #define B_S0_ADDCK_Q GENMASK(19, 10) ··· 4217 4184 #define R_TXAGC_BB_S1 0x3C60 4218 4185 #define B_TXAGC_BB_S1_OFT GENMASK(31, 16) 4219 4186 #define B_TXAGC_BB_S1 GENMASK(31, 24) 4187 + #define R_PATH1_TXPWR 0x3C78 4188 + #define B_PATH1_TXPWR GENMASK(8, 0) 4220 4189 #define R_S1_ADDCK 0x3E00 4221 4190 #define B_S1_ADDCK_I GENMASK(9, 0) 4222 4191 #define B_S1_ADDCK_Q GENMASK(19, 10) ··· 4395 4360 #define B_PKT_POP_EN BIT(8) 4396 4361 #define R_SEG0R_PD 0x481C 4397 4362 #define R_SEG0R_PD_V1 0x4860 4363 + #define R_SEG0R_PD_V2 0x6A74 4398 4364 #define R_SEG0R_EDCCA_LVL 0x4840 4399 4365 #define R_SEG0R_EDCCA_LVL_V1 0x4884 4400 4366 #define B_SEG0R_PPDU_LVL_MSK GENMASK(31, 24) ··· 4514 4478 #define R_DCFO_COMP_S0_V1 0x4A40 4515 4479 #define B_DCFO_COMP_S0_V1_MSK GENMASK(13, 0) 4516 4480 #define R_BMODE_PDTH_V1 0x4B64 4481 + #define R_BMODE_PDTH_V2 0x6708 4517 4482 #define B_BMODE_PDTH_LOWER_BOUND_MSK_V1 GENMASK(31, 24) 4518 4483 #define R_BMODE_PDTH_EN_V1 0x4B74 4484 + #define R_BMODE_PDTH_EN_V2 0x6718 4519 4485 #define B_BMODE_PDTH_LIMIT_EN_MSK_V1 BIT(30) 4520 4486 #define R_CFO_COMP_SEG1_L 0x5384 4521 4487 #define R_CFO_COMP_SEG1_H 0x5388
+14 -13
drivers/net/wireless/realtek/rtw89/regd.c
··· 13 13 } 14 14 15 15 static const struct rtw89_regd rtw89_ww_regd = 16 - COUNTRY_REGD("00", RTW89_WW, RTW89_WW); 16 + COUNTRY_REGD("00", RTW89_WW, RTW89_WW, RTW89_WW); 17 17 18 18 static const struct rtw89_regd rtw89_regd_map[] = { 19 - COUNTRY_REGD("AR", RTW89_MEXICO, RTW89_MEXICO, RTW89_NA), 19 + COUNTRY_REGD("AR", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC), 20 20 COUNTRY_REGD("BO", RTW89_FCC, RTW89_FCC, RTW89_FCC), 21 21 COUNTRY_REGD("BR", RTW89_FCC, RTW89_FCC, RTW89_FCC), 22 22 COUNTRY_REGD("CL", RTW89_CHILE, RTW89_CHILE, RTW89_CHILE), ··· 26 26 COUNTRY_REGD("SV", RTW89_FCC, RTW89_FCC, RTW89_FCC), 27 27 COUNTRY_REGD("GT", RTW89_FCC, RTW89_FCC, RTW89_FCC), 28 28 COUNTRY_REGD("HN", RTW89_FCC, RTW89_FCC, RTW89_FCC), 29 - COUNTRY_REGD("MX", RTW89_MEXICO, RTW89_MEXICO, RTW89_NA), 29 + COUNTRY_REGD("MX", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC), 30 30 COUNTRY_REGD("NI", RTW89_FCC, RTW89_FCC, RTW89_NA), 31 31 COUNTRY_REGD("PA", RTW89_FCC, RTW89_FCC, RTW89_NA), 32 32 COUNTRY_REGD("PY", RTW89_FCC, RTW89_FCC, RTW89_NA), ··· 81 81 COUNTRY_REGD("KE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 82 82 COUNTRY_REGD("KW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 83 83 COUNTRY_REGD("KG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 84 - COUNTRY_REGD("LB", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 84 + COUNTRY_REGD("LB", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 85 85 COUNTRY_REGD("LS", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 86 86 COUNTRY_REGD("MK", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 87 87 COUNTRY_REGD("MA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), ··· 96 96 COUNTRY_REGD("SN", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 97 97 COUNTRY_REGD("RS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 98 98 COUNTRY_REGD("ME", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 99 - COUNTRY_REGD("ZA", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 99 + COUNTRY_REGD("ZA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 100 100 COUNTRY_REGD("TR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 101 101 COUNTRY_REGD("UA", RTW89_UKRAINE, RTW89_UKRAINE, RTW89_UKRAINE), 102 102 COUNTRY_REGD("AE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), ··· 115 115 COUNTRY_REGD("SG", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 116 116 COUNTRY_REGD("LK", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 117 117 COUNTRY_REGD("TW", RTW89_FCC, RTW89_FCC, RTW89_NA), 118 - COUNTRY_REGD("TH", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 118 + COUNTRY_REGD("TH", RTW89_WW, RTW89_WW, RTW89_WW), 119 119 COUNTRY_REGD("VN", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 120 120 COUNTRY_REGD("AU", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA), 121 121 COUNTRY_REGD("NZ", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA), ··· 148 148 COUNTRY_REGD("IO", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 149 149 COUNTRY_REGD("VG", RTW89_FCC, RTW89_FCC, RTW89_FCC), 150 150 COUNTRY_REGD("BN", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 151 - COUNTRY_REGD("BF", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 151 + COUNTRY_REGD("BF", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 152 152 COUNTRY_REGD("MM", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 153 153 COUNTRY_REGD("BI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 154 154 COUNTRY_REGD("CM", RTW89_ETSI, RTW89_ETSI, RTW89_NA), ··· 164 164 COUNTRY_REGD("CK", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 165 165 COUNTRY_REGD("CI", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 166 166 COUNTRY_REGD("DJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 167 - COUNTRY_REGD("DM", RTW89_FCC, RTW89_FCC, RTW89_FCC), 167 + COUNTRY_REGD("DM", RTW89_FCC, RTW89_FCC, RTW89_NA), 168 168 COUNTRY_REGD("GQ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 169 169 COUNTRY_REGD("ER", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 170 170 COUNTRY_REGD("ET", RTW89_ETSI, RTW89_ETSI, RTW89_NA), ··· 179 179 COUNTRY_REGD("GE", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 180 180 COUNTRY_REGD("GI", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 181 181 COUNTRY_REGD("GL", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 182 - COUNTRY_REGD("GD", RTW89_FCC, RTW89_FCC, RTW89_FCC), 182 + COUNTRY_REGD("GD", RTW89_FCC, RTW89_FCC, RTW89_NA), 183 183 COUNTRY_REGD("GP", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 184 184 COUNTRY_REGD("GU", RTW89_FCC, RTW89_FCC, RTW89_NA), 185 185 COUNTRY_REGD("GG", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 186 186 COUNTRY_REGD("GN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 187 187 COUNTRY_REGD("GW", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 188 - COUNTRY_REGD("GY", RTW89_FCC, RTW89_FCC, RTW89_FCC), 189 - COUNTRY_REGD("HT", RTW89_FCC, RTW89_FCC, RTW89_NA), 188 + COUNTRY_REGD("GY", RTW89_FCC, RTW89_FCC, RTW89_NA), 189 + COUNTRY_REGD("HT", RTW89_FCC, RTW89_FCC, RTW89_FCC), 190 190 COUNTRY_REGD("HM", RTW89_ACMA, RTW89_ACMA, RTW89_NA), 191 191 COUNTRY_REGD("VA", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 192 192 COUNTRY_REGD("IM", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 193 193 COUNTRY_REGD("JE", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 194 194 COUNTRY_REGD("KI", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 195 - COUNTRY_REGD("LA", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 195 + COUNTRY_REGD("XK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 196 + COUNTRY_REGD("LA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 196 197 COUNTRY_REGD("LR", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 197 198 COUNTRY_REGD("LY", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 198 199 COUNTRY_REGD("MO", RTW89_ETSI, RTW89_ETSI, RTW89_NA), ··· 208 207 COUNTRY_REGD("YT", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 209 208 COUNTRY_REGD("FM", RTW89_FCC, RTW89_FCC, RTW89_NA), 210 209 COUNTRY_REGD("MD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 211 - COUNTRY_REGD("MN", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 210 + COUNTRY_REGD("MN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI), 212 211 COUNTRY_REGD("MS", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 213 212 COUNTRY_REGD("NR", RTW89_ETSI, RTW89_ETSI, RTW89_NA), 214 213 COUNTRY_REGD("NP", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
+12 -6
drivers/net/wireless/realtek/rtw89/rtw8851b.c
··· 185 185 .seg0_pd_reg = R_SEG0R_PD_V1, 186 186 .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK, 187 187 .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1, 188 + .bmode_pd_reg = R_BMODE_PDTH_EN_V1, 189 + .bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1, 190 + .bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1, 191 + .bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1, 188 192 .p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK}, 189 193 .p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK}, 190 194 .p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1}, ··· 760 756 const struct rtw89_chan *chan, 761 757 u8 mac_idx) 762 758 { 763 - u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 764 - u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx); 765 - u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx); 759 + u32 sub_carr = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 760 + u32 chk_rate = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXRATE_CHK, mac_idx); 761 + u32 rf_mod = rtw89_mac_reg_by_idx(rtwdev, R_AX_WMAC_RFMOD, mac_idx); 766 762 u8 txsc20 = 0, txsc40 = 0; 767 763 768 764 switch (chan->band_width) { ··· 1744 1740 return; 1745 1741 } 1746 1742 1747 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx); 1743 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_CTRL, mac_idx); 1748 1744 rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN); 1749 1745 1750 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 1746 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, mac_idx); 1751 1747 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst); 1752 1748 1753 1749 pw_ofst = max_t(s8, pw_ofst - 3, -16); 1754 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); 1750 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, mac_idx); 1755 1751 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_2T_MASK, pw_ofst); 1756 1752 } 1757 1753 ··· 2340 2336 .chip_id = RTL8851B, 2341 2337 .chip_gen = RTW89_CHIP_AX, 2342 2338 .ops = &rtw8851b_chip_ops, 2339 + .mac_def = &rtw89_mac_gen_ax, 2340 + .phy_def = &rtw89_phy_gen_ax, 2343 2341 .fw_basename = RTW8851B_FW_BASENAME, 2344 2342 .fw_format_max = RTW8851B_FW_FORMAT_MAX, 2345 2343 .try_ce_fw = true,
+12 -7
drivers/net/wireless/realtek/rtw89/rtw8852a.c
··· 478 478 .seg0_pd_reg = R_SEG0R_PD, 479 479 .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK, 480 480 .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK, 481 + .bmode_pd_reg = R_BMODE_PDTH_EN_V1, 482 + .bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1, 483 + .bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1, 484 + .bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1, 481 485 .p0_lna_init = {R_PATH0_LNA_INIT, B_PATH0_LNA_INIT_IDX_MSK}, 482 486 .p1_lna_init = {R_PATH1_LNA_INIT, B_PATH1_LNA_INIT_IDX_MSK}, 483 487 .p0_tia_init = {R_PATH0_TIA_INIT, B_PATH0_TIA_INIT_IDX_MSK}, ··· 708 704 const struct rtw89_chan *chan, 709 705 u8 mac_idx) 710 706 { 711 - u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx); 712 - u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, 713 - mac_idx); 714 - u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx); 707 + u32 rf_mod = rtw89_mac_reg_by_idx(rtwdev, R_AX_WMAC_RFMOD, mac_idx); 708 + u32 sub_carr = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 709 + u32 chk_rate = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXRATE_CHK, mac_idx); 715 710 u8 txsc20 = 0, txsc40 = 0; 716 711 717 712 switch (chan->band_width) { ··· 1383 1380 pw_ofst); 1384 1381 return; 1385 1382 } 1386 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx); 1383 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_CTRL, mac_idx); 1387 1384 rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN); 1388 1385 val_1t = pw_ofst; 1389 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 1386 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, mac_idx); 1390 1387 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, val_1t); 1391 1388 val_2t = max(val_1t - 3, -16); 1392 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); 1389 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, mac_idx); 1393 1390 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_2T_MASK, val_2t); 1394 1391 rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[ULTB] Set TB pwr_offset=(%d, %d)\n", 1395 1392 val_1t, val_2t); ··· 2076 2073 .chip_id = RTL8852A, 2077 2074 .chip_gen = RTW89_CHIP_AX, 2078 2075 .ops = &rtw8852a_chip_ops, 2076 + .mac_def = &rtw89_mac_gen_ax, 2077 + .phy_def = &rtw89_phy_gen_ax, 2079 2078 .fw_basename = RTW8852A_FW_BASENAME, 2080 2079 .fw_format_max = RTW8852A_FW_FORMAT_MAX, 2081 2080 .try_ce_fw = false,
+12 -6
drivers/net/wireless/realtek/rtw89/rtw8852b.c
··· 310 310 .seg0_pd_reg = R_SEG0R_PD_V1, 311 311 .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK, 312 312 .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1, 313 + .bmode_pd_reg = R_BMODE_PDTH_EN_V1, 314 + .bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1, 315 + .bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1, 316 + .bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1, 313 317 .p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK}, 314 318 .p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK}, 315 319 .p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1}, ··· 847 843 const struct rtw89_chan *chan, 848 844 u8 mac_idx) 849 845 { 850 - u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx); 851 - u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 852 - u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx); 846 + u32 rf_mod = rtw89_mac_reg_by_idx(rtwdev, R_AX_WMAC_RFMOD, mac_idx); 847 + u32 sub_carr = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 848 + u32 chk_rate = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXRATE_CHK, mac_idx); 853 849 u8 txsc20 = 0, txsc40 = 0; 854 850 855 851 switch (chan->band_width) { ··· 1729 1725 return; 1730 1726 } 1731 1727 1732 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx); 1728 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_CTRL, mac_idx); 1733 1729 rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN); 1734 1730 1735 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 1731 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, mac_idx); 1736 1732 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst); 1737 1733 1738 1734 pw_ofst = max_t(s8, pw_ofst - 3, -16); 1739 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); 1735 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, mac_idx); 1740 1736 rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_2T_MASK, pw_ofst); 1741 1737 } 1742 1738 ··· 2509 2505 .chip_id = RTL8852B, 2510 2506 .chip_gen = RTW89_CHIP_AX, 2511 2507 .ops = &rtw8852b_chip_ops, 2508 + .mac_def = &rtw89_mac_gen_ax, 2509 + .phy_def = &rtw89_phy_gen_ax, 2512 2510 .fw_basename = RTW8852B_FW_BASENAME, 2513 2511 .fw_format_max = RTW8852B_FW_FORMAT_MAX, 2514 2512 .try_ce_fw = true,
+2 -2
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c
··· 846 846 case ID_NBTXK: 847 847 rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 848 848 rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x011); 849 - iqk_cmd = 0x308 | (1 << (4 + path)); 849 + iqk_cmd = 0x408 | (1 << (4 + path)); 850 850 break; 851 851 case ID_NBRXK: 852 852 rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); ··· 1078 1078 { 1079 1079 struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1080 1080 bool kfail; 1081 - u8 gp = 0x3; 1081 + u8 gp = 0x2; 1082 1082 1083 1083 switch (iqk_info->iqk_band[path]) { 1084 1084 case RTW89_BAND_2G:
+14 -10
drivers/net/wireless/realtek/rtw89/rtw8852c.c
··· 146 146 .seg0_pd_reg = R_SEG0R_PD, 147 147 .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK, 148 148 .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK, 149 + .bmode_pd_reg = R_BMODE_PDTH_EN_V1, 150 + .bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1, 151 + .bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1, 152 + .bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1, 149 153 .p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK}, 150 154 .p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK}, 151 155 .p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1}, ··· 610 606 const struct rtw89_chan *chan, 611 607 u8 mac_idx) 612 608 { 613 - u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx); 614 - u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, 615 - mac_idx); 616 - u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx); 609 + u32 rf_mod = rtw89_mac_reg_by_idx(rtwdev, R_AX_WMAC_RFMOD, mac_idx); 610 + u32 sub_carr = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx); 611 + u32 chk_rate = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXRATE_CHK, mac_idx); 617 612 u8 txsc20 = 0, txsc40 = 0, txsc80 = 0; 618 613 u8 rf_mod_val = 0, chk_rate_mask = 0; 619 614 u32 txsc; ··· 1657 1654 rtwdev->hal.cv != CHIP_CAV) { 1658 1655 rtw89_phy_write32_idx(rtwdev, R_P80_AT_HIGH_FREQ, 1659 1656 B_P80_AT_HIGH_FREQ, 0x0, phy_idx); 1660 - reg = rtw89_mac_reg_by_idx(R_P80_AT_HIGH_FREQ_BB_WRP, 1661 - phy_idx); 1657 + reg = rtw89_mac_reg_by_idx(rtwdev, R_P80_AT_HIGH_FREQ_BB_WRP, phy_idx); 1662 1658 if (chan->primary_channel > chan->channel) { 1663 1659 rtw89_phy_write32_mask(rtwdev, 1664 1660 R_P80_AT_HIGH_FREQ_RU_ALLOC, ··· 1861 1859 1862 1860 for (i = 0; i < 4; i++) { 1863 1861 /* 1TX */ 1864 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx); 1862 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, mac_idx); 1865 1863 rtw89_write32_mask(rtwdev, reg, 1866 1864 B_AX_PWR_UL_TB_1T_V1_MASK << (8 * i), 1867 1865 val_1t); 1868 1866 /* 2TX */ 1869 - reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx); 1867 + reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, mac_idx); 1870 1868 rtw89_write32_mask(rtwdev, reg, 1871 1869 B_AX_PWR_UL_TB_2T_V1_MASK << (8 * i), 1872 1870 val_2t); ··· 2183 2181 2184 2182 for (addr = R_AX_MACID_ANT_TABLE; 2185 2183 addr <= R_AX_MACID_ANT_TABLE_LAST; addr += 4) { 2186 - reg = rtw89_mac_reg_by_idx(addr, mac_idx); 2184 + reg = rtw89_mac_reg_by_idx(rtwdev, addr, mac_idx); 2187 2185 rtw89_write32(rtwdev, reg, 0); 2188 2186 } 2189 2187 ··· 2213 2211 for (i = 0; i < cr_size; i++) { 2214 2212 rtw89_debug(rtwdev, RTW89_DBG_TSSI, "0x%x = 0x%x\n", 2215 2213 path_com[i].addr, path_com[i].data); 2216 - reg = rtw89_mac_reg_by_idx(path_com[i].addr, mac_idx); 2214 + reg = rtw89_mac_reg_by_idx(rtwdev, path_com[i].addr, mac_idx); 2217 2215 rtw89_write32(rtwdev, reg, path_com[i].data); 2218 2216 } 2219 2217 } ··· 2806 2804 .chip_id = RTL8852C, 2807 2805 .chip_gen = RTW89_CHIP_AX, 2808 2806 .ops = &rtw8852c_chip_ops, 2807 + .mac_def = &rtw89_mac_gen_ax, 2808 + .phy_def = &rtw89_phy_gen_ax, 2809 2809 .fw_basename = RTW8852C_FW_BASENAME, 2810 2810 .fw_format_max = RTW8852C_FW_FORMAT_MAX, 2811 2811 .try_ce_fw = false,
+209 -11
drivers/net/wireless/realtek/rtw89/sar.c
··· 2 2 /* Copyright(c) 2019-2020 Realtek Corporation 3 3 */ 4 4 5 + #include "acpi.h" 5 6 #include "debug.h" 7 + #include "phy.h" 8 + #include "reg.h" 6 9 #include "sar.h" 10 + 11 + #define RTW89_TAS_FACTOR 2 /* unit: 0.25 dBm */ 12 + #define RTW89_TAS_DPR_GAP (1 << RTW89_TAS_FACTOR) 13 + #define RTW89_TAS_DELTA (2 << RTW89_TAS_FACTOR) 7 14 8 15 static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev, 9 16 u32 center_freq) ··· 85 78 RTW89_DECL_SAR_6GHZ_SPAN(6885, SUBBAND_7_H, SUBBAND_8), 86 79 }; 87 80 88 - static int rtw89_query_sar_config_common(struct rtw89_dev *rtwdev, s32 *cfg) 81 + static int rtw89_query_sar_config_common(struct rtw89_dev *rtwdev, 82 + u32 center_freq, s32 *cfg) 89 83 { 90 84 struct rtw89_sar_cfg_common *rtwsar = &rtwdev->sar.cfg_common; 91 - const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 92 - enum rtw89_band band = chan->band_type; 93 - u32 center_freq = chan->freq; 94 85 const struct rtw89_sar_span *span = NULL; 95 86 enum rtw89_sar_subband subband_l, subband_h; 96 87 int idx; 97 88 98 - if (band == RTW89_BAND_6G) { 89 + if (center_freq >= RTW89_SAR_6GHZ_SPAN_HEAD) { 99 90 idx = RTW89_SAR_6GHZ_SPAN_IDX(center_freq); 100 91 /* To decrease size of rtw89_sar_overlapping_6ghz[], 101 92 * RTW89_SAR_6GHZ_SPAN_IDX() truncates the leading NULLs ··· 113 108 } 114 109 115 110 rtw89_debug(rtwdev, RTW89_DBG_SAR, 116 - "for {band %u, center_freq %u}, SAR subband: {%u, %u}\n", 117 - band, center_freq, subband_l, subband_h); 111 + "center_freq %u: SAR subband {%u, %u}\n", 112 + center_freq, subband_l, subband_h); 118 113 119 114 if (!rtwsar->set[subband_l] && !rtwsar->set[subband_h]) 120 115 return -ENODATA; ··· 162 157 RTW89_SAR_TXPWR_MAC_MAX); 163 158 } 164 159 165 - s8 rtw89_query_sar(struct rtw89_dev *rtwdev) 160 + static s8 rtw89_txpwr_tas_to_sar(const struct rtw89_sar_handler *sar_hdl, 161 + s8 cfg) 162 + { 163 + const u8 fct = sar_hdl->txpwr_factor_sar; 164 + 165 + if (fct > RTW89_TAS_FACTOR) 166 + return cfg << (fct - RTW89_TAS_FACTOR); 167 + else 168 + return cfg >> (RTW89_TAS_FACTOR - fct); 169 + } 170 + 171 + static s8 rtw89_txpwr_sar_to_tas(const struct rtw89_sar_handler *sar_hdl, 172 + s8 cfg) 173 + { 174 + const u8 fct = sar_hdl->txpwr_factor_sar; 175 + 176 + if (fct > RTW89_TAS_FACTOR) 177 + return cfg >> (fct - RTW89_TAS_FACTOR); 178 + else 179 + return cfg << (RTW89_TAS_FACTOR - fct); 180 + } 181 + 182 + s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq) 166 183 { 167 184 const enum rtw89_sar_sources src = rtwdev->sar.src; 168 185 /* its members are protected by rtw89_sar_set_src() */ 169 186 const struct rtw89_sar_handler *sar_hdl = &rtw89_sar_handlers[src]; 187 + struct rtw89_tas_info *tas = &rtwdev->tas; 188 + s8 delta; 170 189 int ret; 171 190 s32 cfg; 172 191 u8 fct; ··· 200 171 if (src == RTW89_SAR_SOURCE_NONE) 201 172 return RTW89_SAR_TXPWR_MAC_MAX; 202 173 203 - ret = sar_hdl->query_sar_config(rtwdev, &cfg); 174 + ret = sar_hdl->query_sar_config(rtwdev, center_freq, &cfg); 204 175 if (ret) 205 176 return RTW89_SAR_TXPWR_MAC_MAX; 177 + 178 + if (tas->enable) { 179 + switch (tas->state) { 180 + case RTW89_TAS_STATE_DPR_OFF: 181 + return RTW89_SAR_TXPWR_MAC_MAX; 182 + case RTW89_TAS_STATE_DPR_ON: 183 + delta = rtw89_txpwr_tas_to_sar(sar_hdl, tas->delta); 184 + cfg -= delta; 185 + break; 186 + case RTW89_TAS_STATE_DPR_FORBID: 187 + default: 188 + break; 189 + } 190 + } 206 191 207 192 fct = sar_hdl->txpwr_factor_sar; 208 193 209 194 return rtw89_txpwr_sar_to_mac(rtwdev, fct, cfg); 210 195 } 211 196 212 - void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev) 197 + void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev, u32 center_freq) 213 198 { 214 199 const enum rtw89_sar_sources src = rtwdev->sar.src; 215 200 /* its members are protected by rtw89_sar_set_src() */ ··· 242 199 243 200 seq_printf(m, "source: %d (%s)\n", src, sar_hdl->descr_sar_source); 244 201 245 - ret = sar_hdl->query_sar_config(rtwdev, &cfg); 202 + ret = sar_hdl->query_sar_config(rtwdev, center_freq, &cfg); 246 203 if (ret) { 247 204 seq_printf(m, "config: return code: %d\n", ret); 248 205 seq_printf(m, "assign: max setting: %d (unit: 1/%lu dBm)\n", ··· 253 210 fct = sar_hdl->txpwr_factor_sar; 254 211 255 212 seq_printf(m, "config: %d (unit: 1/%lu dBm)\n", cfg, BIT(fct)); 213 + } 214 + 215 + void rtw89_print_tas(struct seq_file *m, struct rtw89_dev *rtwdev) 216 + { 217 + struct rtw89_tas_info *tas = &rtwdev->tas; 218 + 219 + if (!tas->enable) { 220 + seq_puts(m, "no TAS is applied\n"); 221 + return; 222 + } 223 + 224 + seq_printf(m, "DPR gap: %d\n", tas->dpr_gap); 225 + seq_printf(m, "TAS delta: %d\n", tas->delta); 256 226 } 257 227 258 228 static int rtw89_apply_sar_common(struct rtw89_dev *rtwdev, ··· 347 291 } 348 292 349 293 return rtw89_apply_sar_common(rtwdev, &sar_common); 294 + } 295 + 296 + static void rtw89_tas_state_update(struct rtw89_dev *rtwdev) 297 + { 298 + const enum rtw89_sar_sources src = rtwdev->sar.src; 299 + /* its members are protected by rtw89_sar_set_src() */ 300 + const struct rtw89_sar_handler *sar_hdl = &rtw89_sar_handlers[src]; 301 + struct rtw89_tas_info *tas = &rtwdev->tas; 302 + s32 txpwr_avg = tas->total_txpwr / RTW89_TAS_MAX_WINDOW / PERCENT; 303 + s32 dpr_on_threshold, dpr_off_threshold, cfg; 304 + enum rtw89_tas_state state = tas->state; 305 + const struct rtw89_chan *chan; 306 + int ret; 307 + 308 + lockdep_assert_held(&rtwdev->mutex); 309 + 310 + if (src == RTW89_SAR_SOURCE_NONE) 311 + return; 312 + 313 + chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 314 + ret = sar_hdl->query_sar_config(rtwdev, chan->freq, &cfg); 315 + if (ret) 316 + return; 317 + 318 + cfg = rtw89_txpwr_sar_to_tas(sar_hdl, cfg); 319 + 320 + if (tas->delta >= cfg) { 321 + rtw89_debug(rtwdev, RTW89_DBG_SAR, 322 + "TAS delta exceed SAR limit\n"); 323 + state = RTW89_TAS_STATE_DPR_FORBID; 324 + goto out; 325 + } 326 + 327 + dpr_on_threshold = cfg; 328 + dpr_off_threshold = cfg - tas->dpr_gap; 329 + rtw89_debug(rtwdev, RTW89_DBG_SAR, 330 + "DPR_ON thold: %d, DPR_OFF thold: %d, txpwr_avg: %d\n", 331 + dpr_on_threshold, dpr_off_threshold, txpwr_avg); 332 + 333 + if (txpwr_avg >= dpr_on_threshold) 334 + state = RTW89_TAS_STATE_DPR_ON; 335 + else if (txpwr_avg < dpr_off_threshold) 336 + state = RTW89_TAS_STATE_DPR_OFF; 337 + 338 + out: 339 + if (tas->state == state) 340 + return; 341 + 342 + rtw89_debug(rtwdev, RTW89_DBG_SAR, 343 + "TAS old state: %d, new state: %d\n", tas->state, state); 344 + tas->state = state; 345 + rtw89_core_set_chip_txpwr(rtwdev); 346 + } 347 + 348 + void rtw89_tas_init(struct rtw89_dev *rtwdev) 349 + { 350 + struct rtw89_tas_info *tas = &rtwdev->tas; 351 + int ret; 352 + u8 val; 353 + 354 + ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_TAS_EN, &val); 355 + if (ret) { 356 + rtw89_debug(rtwdev, RTW89_DBG_SAR, 357 + "acpi: cannot get TAS: %d\n", ret); 358 + return; 359 + } 360 + 361 + switch (val) { 362 + case 0: 363 + tas->enable = false; 364 + break; 365 + case 1: 366 + tas->enable = true; 367 + break; 368 + default: 369 + break; 370 + } 371 + 372 + if (!tas->enable) { 373 + rtw89_debug(rtwdev, RTW89_DBG_SAR, "TAS not enable\n"); 374 + return; 375 + } 376 + 377 + tas->dpr_gap = RTW89_TAS_DPR_GAP; 378 + tas->delta = RTW89_TAS_DELTA; 379 + } 380 + 381 + void rtw89_tas_reset(struct rtw89_dev *rtwdev) 382 + { 383 + struct rtw89_tas_info *tas = &rtwdev->tas; 384 + 385 + if (!tas->enable) 386 + return; 387 + 388 + memset(&tas->txpwr_history, 0, sizeof(tas->txpwr_history)); 389 + tas->total_txpwr = 0; 390 + tas->cur_idx = 0; 391 + tas->state = RTW89_TAS_STATE_DPR_OFF; 392 + } 393 + 394 + static const struct rtw89_reg_def txpwr_regs[] = { 395 + {R_PATH0_TXPWR, B_PATH0_TXPWR}, 396 + {R_PATH1_TXPWR, B_PATH1_TXPWR}, 397 + }; 398 + 399 + void rtw89_tas_track(struct rtw89_dev *rtwdev) 400 + { 401 + struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; 402 + const enum rtw89_sar_sources src = rtwdev->sar.src; 403 + u8 max_nss_num = rtwdev->chip->rf_path_num; 404 + struct rtw89_tas_info *tas = &rtwdev->tas; 405 + s16 tmp, txpwr, instant_txpwr = 0; 406 + u32 val; 407 + int i; 408 + 409 + if (!tas->enable || src == RTW89_SAR_SOURCE_NONE) 410 + return; 411 + 412 + if (env->ccx_watchdog_result != RTW89_PHY_ENV_MON_IFS_CLM) 413 + return; 414 + 415 + for (i = 0; i < max_nss_num; i++) { 416 + val = rtw89_phy_read32_mask(rtwdev, txpwr_regs[i].addr, 417 + txpwr_regs[i].mask); 418 + tmp = sign_extend32(val, 8); 419 + if (tmp <= 0) 420 + return; 421 + instant_txpwr += tmp; 422 + } 423 + 424 + instant_txpwr /= max_nss_num; 425 + /* in unit of 0.25 dBm multiply by percentage */ 426 + txpwr = instant_txpwr * env->ifs_clm_tx_ratio; 427 + tas->total_txpwr += txpwr - tas->txpwr_history[tas->cur_idx]; 428 + tas->txpwr_history[tas->cur_idx] = txpwr; 429 + rtw89_debug(rtwdev, RTW89_DBG_SAR, 430 + "instant_txpwr: %d, tx_ratio: %d, txpwr: %d\n", 431 + instant_txpwr, env->ifs_clm_tx_ratio, txpwr); 432 + 433 + tas->cur_idx = (tas->cur_idx + 1) % RTW89_TAS_MAX_WINDOW; 434 + 435 + rtw89_tas_state_update(rtwdev); 350 436 }
+7 -3
drivers/net/wireless/realtek/rtw89/sar.h
··· 13 13 struct rtw89_sar_handler { 14 14 const char *descr_sar_source; 15 15 u8 txpwr_factor_sar; 16 - int (*query_sar_config)(struct rtw89_dev *rtwdev, s32 *cfg); 16 + int (*query_sar_config)(struct rtw89_dev *rtwdev, u32 center_freq, s32 *cfg); 17 17 }; 18 18 19 19 extern const struct cfg80211_sar_capa rtw89_sar_capa; 20 20 21 - s8 rtw89_query_sar(struct rtw89_dev *rtwdev); 22 - void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev); 21 + s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq); 22 + void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev, u32 center_freq); 23 + void rtw89_print_tas(struct seq_file *m, struct rtw89_dev *rtwdev); 23 24 int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw, 24 25 const struct cfg80211_sar_specs *sar); 26 + void rtw89_tas_init(struct rtw89_dev *rtwdev); 27 + void rtw89_tas_reset(struct rtw89_dev *rtwdev); 28 + void rtw89_tas_track(struct rtw89_dev *rtwdev); 25 29 26 30 #endif
+13 -7
drivers/net/wireless/realtek/rtw89/ser.c
··· 529 529 static void ser_mac_mem_dump(struct rtw89_dev *rtwdev, u8 *buf, 530 530 u8 sel, u32 start_addr, u32 len) 531 531 { 532 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 533 + u32 filter_model_addr = mac->filter_model_addr; 534 + u32 indir_access_addr = mac->indir_access_addr; 532 535 u32 *ptr = (u32 *)buf; 533 536 u32 base_addr, start_page, residue; 534 537 u32 cnt = 0; ··· 539 536 540 537 start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE; 541 538 residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE; 542 - base_addr = rtw89_mac_mem_base_addrs[sel]; 539 + base_addr = mac->mem_base_addrs[sel]; 543 540 base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE; 544 541 545 542 while (cnt < len) { 546 - rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, base_addr); 543 + rtw89_write32(rtwdev, filter_model_addr, base_addr); 547 544 548 - for (i = R_AX_INDIR_ACCESS_ENTRY + residue; 549 - i < R_AX_INDIR_ACCESS_ENTRY + MAC_MEM_DUMP_PAGE_SIZE; 545 + for (i = indir_access_addr + residue; 546 + i < indir_access_addr + MAC_MEM_DUMP_PAGE_SIZE; 550 547 i += 4, ptr++) { 551 548 *ptr = rtw89_read32(rtwdev, i); 552 549 cnt += 4; ··· 588 585 const struct __fw_backtrace_entry *ent) 589 586 { 590 587 struct __fw_backtrace_info *ptr = (struct __fw_backtrace_info *)buf; 588 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 589 + u32 filter_model_addr = mac->filter_model_addr; 590 + u32 indir_access_addr = mac->indir_access_addr; 591 591 u32 fwbt_addr = ent->wcpu_addr & RTW89_WCPU_BASE_MASK; 592 592 u32 fwbt_size = ent->size; 593 593 u32 fwbt_key = ent->key; ··· 616 610 } 617 611 618 612 rtw89_debug(rtwdev, RTW89_DBG_SER, "dump fw backtrace start\n"); 619 - rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, fwbt_addr); 613 + rtw89_write32(rtwdev, filter_model_addr, fwbt_addr); 620 614 621 - for (i = R_AX_INDIR_ACCESS_ENTRY; 622 - i < R_AX_INDIR_ACCESS_ENTRY + fwbt_size; 615 + for (i = indir_access_addr; 616 + i < indir_access_addr + fwbt_size; 623 617 i += RTW89_FW_BACKTRACE_INFO_SIZE, ptr++) { 624 618 *ptr = (struct __fw_backtrace_info){ 625 619 .ra = rtw89_read32(rtwdev, i),
+2 -1
drivers/net/wireless/realtek/rtw89/wow.c
··· 40 40 41 41 static int rtw89_wow_config_mac(struct rtw89_dev *rtwdev, bool enable_wow) 42 42 { 43 + const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def; 43 44 int ret; 44 45 45 46 if (enable_wow) { ··· 50 49 return ret; 51 50 } 52 51 rtw89_write32_set(rtwdev, R_AX_RX_FUNCTION_STOP, B_AX_HDR_RX_STOP); 53 - rtw89_write32_clr(rtwdev, R_AX_RX_FLTR_OPT, B_AX_SNIFFER_MODE); 52 + rtw89_write32_clr(rtwdev, mac->rx_fltr, B_AX_SNIFFER_MODE); 54 53 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); 55 54 rtw89_write32(rtwdev, R_AX_ACTION_FWD0, 0); 56 55 rtw89_write32(rtwdev, R_AX_ACTION_FWD1, 0);
+4 -7
drivers/net/wireless/rsi/rsi_91x_coex.c
··· 52 52 53 53 static void rsi_coex_scheduler_thread(struct rsi_common *common) 54 54 { 55 - struct rsi_coex_ctrl_block *coex_cb = 56 - (struct rsi_coex_ctrl_block *)common->coex_cb; 55 + struct rsi_coex_ctrl_block *coex_cb = common->coex_cb; 57 56 u32 timeout = EVENT_WAIT_FOREVER; 58 57 59 58 do { ··· 99 100 100 101 int rsi_coex_send_pkt(void *priv, struct sk_buff *skb, u8 hal_queue) 101 102 { 102 - struct rsi_common *common = (struct rsi_common *)priv; 103 - struct rsi_coex_ctrl_block *coex_cb = 104 - (struct rsi_coex_ctrl_block *)common->coex_cb; 103 + struct rsi_common *common = priv; 104 + struct rsi_coex_ctrl_block *coex_cb = common->coex_cb; 105 105 struct skb_info *tx_params = NULL; 106 106 enum rsi_coex_queues coex_q; 107 107 int status; ··· 166 168 167 169 void rsi_coex_detach(struct rsi_common *common) 168 170 { 169 - struct rsi_coex_ctrl_block *coex_cb = 170 - (struct rsi_coex_ctrl_block *)common->coex_cb; 171 + struct rsi_coex_ctrl_block *coex_cb = common->coex_cb; 171 172 int cnt; 172 173 173 174 rsi_kill_thread(&coex_cb->coex_tx_thread);
+1 -2
drivers/net/wireless/rsi/rsi_91x_debugfs.c
··· 28 28 { 29 29 struct rsi_common *common = seq->private; 30 30 struct rsi_hw *adapter = common->priv; 31 - struct rsi_91x_sdiodev *dev = 32 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 31 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 33 32 34 33 seq_printf(seq, "total_sdio_interrupts: %d\n", 35 34 dev->rx_info.sdio_int_counter);
+1 -1
drivers/net/wireless/rsi/rsi_91x_hal.c
··· 424 424 425 425 int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb) 426 426 { 427 - struct rsi_hw *adapter = (struct rsi_hw *)common->priv; 427 + struct rsi_hw *adapter = common->priv; 428 428 struct rsi_data_desc *bcn_frm; 429 429 struct ieee80211_hw *hw = common->priv->hw; 430 430 struct ieee80211_conf *conf = &hw->conf;
+2 -2
drivers/net/wireless/rsi/rsi_91x_mac80211.c
··· 1763 1763 struct ieee80211_channel *chan, int duration, 1764 1764 enum ieee80211_roc_type type) 1765 1765 { 1766 - struct rsi_hw *adapter = (struct rsi_hw *)hw->priv; 1767 - struct rsi_common *common = (struct rsi_common *)adapter->priv; 1766 + struct rsi_hw *adapter = hw->priv; 1767 + struct rsi_common *common = adapter->priv; 1768 1768 int status = 0; 1769 1769 1770 1770 rsi_dbg(INFO_ZONE, "***** Remain on channel *****\n");
+2 -2
drivers/net/wireless/rsi/rsi_91x_main.c
··· 270 270 #ifdef CONFIG_RSI_COEX 271 271 enum rsi_host_intf rsi_get_host_intf(void *priv) 272 272 { 273 - struct rsi_common *common = (struct rsi_common *)priv; 273 + struct rsi_common *common = priv; 274 274 275 275 return common->priv->rsi_host_intf; 276 276 } 277 277 278 278 void rsi_set_bt_context(void *priv, void *bt_context) 279 279 { 280 - struct rsi_common *common = (struct rsi_common *)priv; 280 + struct rsi_common *common = priv; 281 281 282 282 common->bt_adapter = bt_context; 283 283 }
+14 -25
drivers/net/wireless/rsi/rsi_91x_sdio.c
··· 144 144 static void rsi_handle_interrupt(struct sdio_func *function) 145 145 { 146 146 struct rsi_hw *adapter = sdio_get_drvdata(function); 147 - struct rsi_91x_sdiodev *dev = 148 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 147 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 149 148 150 149 if (adapter->priv->fsm_state == FSM_FW_NOT_LOADED) 151 150 return; ··· 336 337 */ 337 338 static void rsi_setclock(struct rsi_hw *adapter, u32 freq) 338 339 { 339 - struct rsi_91x_sdiodev *dev = 340 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 340 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 341 341 struct mmc_host *host = dev->pfunction->card->host; 342 342 u32 clock; 343 343 ··· 356 358 */ 357 359 static int rsi_setblocklength(struct rsi_hw *adapter, u32 length) 358 360 { 359 - struct rsi_91x_sdiodev *dev = 360 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 361 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 361 362 int status; 362 363 rsi_dbg(INIT_ZONE, "%s: Setting the block length\n", __func__); 363 364 ··· 377 380 */ 378 381 static int rsi_setupcard(struct rsi_hw *adapter) 379 382 { 380 - struct rsi_91x_sdiodev *dev = 381 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 383 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 382 384 int status = 0; 383 385 384 386 rsi_setclock(adapter, 50000); ··· 403 407 u32 addr, 404 408 u8 *data) 405 409 { 406 - struct rsi_91x_sdiodev *dev = 407 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 410 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 408 411 u8 fun_num = 0; 409 412 int status; 410 413 ··· 436 441 u32 addr, 437 442 u8 *data) 438 443 { 439 - struct rsi_91x_sdiodev *dev = 440 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 444 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 441 445 int status = 0; 442 446 443 447 if (likely(dev->sdio_irq_task != current)) ··· 489 495 u8 *data, 490 496 u16 count) 491 497 { 492 - struct rsi_91x_sdiodev *dev = 493 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 498 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 494 499 u32 status; 495 500 496 501 if (likely(dev->sdio_irq_task != current)) ··· 520 527 u8 *data, 521 528 u16 count) 522 529 { 523 - struct rsi_91x_sdiodev *dev = 524 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 530 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 525 531 int status; 526 532 527 533 if (dev->write_fail > 1) { ··· 754 762 u8 *pkt, 755 763 u32 len) 756 764 { 757 - struct rsi_91x_sdiodev *dev = 758 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 765 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 759 766 u32 block_size = dev->tx_blk_size; 760 767 u32 num_blocks, address, length; 761 768 u32 queueno; ··· 1036 1045 goto fail_free_adapter; 1037 1046 } 1038 1047 1039 - sdev = (struct rsi_91x_sdiodev *)adapter->rsi_dev; 1048 + sdev = adapter->rsi_dev; 1040 1049 rsi_init_event(&sdev->rx_thread.event); 1041 1050 status = rsi_create_kthread(adapter->priv, &sdev->rx_thread, 1042 1051 rsi_sdio_rx_thread, "SDIO-RX-Thread"); ··· 1212 1221 if (!adapter) 1213 1222 return; 1214 1223 1215 - dev = (struct rsi_91x_sdiodev *)adapter->rsi_dev; 1224 + dev = adapter->rsi_dev; 1216 1225 1217 1226 rsi_kill_thread(&dev->rx_thread); 1218 1227 sdio_claim_host(pfunction); ··· 1246 1255 #ifdef CONFIG_PM 1247 1256 static int rsi_set_sdio_pm_caps(struct rsi_hw *adapter) 1248 1257 { 1249 - struct rsi_91x_sdiodev *dev = 1250 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 1258 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 1251 1259 struct sdio_func *func = dev->pfunction; 1252 1260 int ret; 1253 1261 ··· 1397 1407 return -ENODEV; 1398 1408 } 1399 1409 common = adapter->priv; 1400 - sdev = (struct rsi_91x_sdiodev *)adapter->rsi_dev; 1410 + sdev = adapter->rsi_dev; 1401 1411 1402 1412 if ((common->wow_flags & RSI_WOW_ENABLED) && 1403 1413 (common->wow_flags & RSI_WOW_NO_CONNECTION)) ··· 1447 1457 { 1448 1458 struct sdio_func *pfunction = dev_to_sdio_func(dev); 1449 1459 struct rsi_hw *adapter = sdio_get_drvdata(pfunction); 1450 - struct rsi_91x_sdiodev *sdev = 1451 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 1460 + struct rsi_91x_sdiodev *sdev = adapter->rsi_dev; 1452 1461 struct ieee80211_hw *hw = adapter->hw; 1453 1462 1454 1463 rsi_dbg(ERR_ZONE, "SDIO Bus shutdown =====>\n");
+5 -10
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
··· 88 88 static int rsi_process_pkt(struct rsi_common *common) 89 89 { 90 90 struct rsi_hw *adapter = common->priv; 91 - struct rsi_91x_sdiodev *dev = 92 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 91 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 93 92 u8 num_blks = 0; 94 93 u32 rcv_pkt_len = 0; 95 94 int status = 0; ··· 146 147 */ 147 148 int rsi_init_sdio_slave_regs(struct rsi_hw *adapter) 148 149 { 149 - struct rsi_91x_sdiodev *dev = 150 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 150 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 151 151 u8 function = 0; 152 152 u8 byte; 153 153 int status = 0; ··· 231 233 static void rsi_rx_handler(struct rsi_hw *adapter) 232 234 { 233 235 struct rsi_common *common = adapter->priv; 234 - struct rsi_91x_sdiodev *dev = 235 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 236 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 236 237 int status; 237 238 u8 isr_status = 0; 238 239 u8 fw_status = 0; ··· 336 339 int rsi_sdio_check_buffer_status(struct rsi_hw *adapter, u8 q_num) 337 340 { 338 341 struct rsi_common *common = adapter->priv; 339 - struct rsi_91x_sdiodev *dev = 340 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 342 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 341 343 u8 buf_status = 0; 342 344 int status = 0; 343 345 static int counter = 4; ··· 405 409 */ 406 410 int rsi_sdio_determine_event_timeout(struct rsi_hw *adapter) 407 411 { 408 - struct rsi_91x_sdiodev *dev = 409 - (struct rsi_91x_sdiodev *)adapter->rsi_dev; 412 + struct rsi_91x_sdiodev *dev = adapter->rsi_dev; 410 413 411 414 /* Once buffer full is seen, event timeout to occur every 2 msecs */ 412 415 if (dev->rx_info.buffer_full)
+10 -10
drivers/net/wireless/rsi/rsi_91x_usb.c
··· 43 43 u16 len, 44 44 u8 endpoint) 45 45 { 46 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 46 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 47 47 int status; 48 48 u8 *seg = dev->tx_buffer; 49 49 int transfer; ··· 91 91 if (endpoint == 0) 92 92 return -EINVAL; 93 93 94 - dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 94 + dev = adapter->rsi_dev; 95 95 if (dev->write_fail) 96 96 return -ENETDOWN; 97 97 ··· 109 109 static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface, 110 110 struct rsi_hw *adapter) 111 111 { 112 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 112 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 113 113 struct usb_host_interface *iface_desc; 114 114 struct usb_endpoint_descriptor *endpoint; 115 115 __le16 buffer_size; ··· 306 306 307 307 static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num) 308 308 { 309 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 309 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 310 310 struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; 311 311 struct urb *urb = rx_cb->rx_urb; 312 312 ··· 323 323 */ 324 324 static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t mem_flags) 325 325 { 326 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 326 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 327 327 struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; 328 328 struct urb *urb = rx_cb->rx_urb; 329 329 int status; ··· 362 362 static int rsi_usb_read_register_multiple(struct rsi_hw *adapter, u32 addr, 363 363 u8 *data, u16 count) 364 364 { 365 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 365 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 366 366 u8 *buf; 367 367 u16 transfer; 368 368 int status; ··· 412 412 static int rsi_usb_write_register_multiple(struct rsi_hw *adapter, u32 addr, 413 413 u8 *data, u16 count) 414 414 { 415 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 415 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 416 416 u8 *buf; 417 417 u16 transfer; 418 418 int status = 0; ··· 559 559 */ 560 560 static void rsi_deinit_usb_interface(struct rsi_hw *adapter) 561 561 { 562 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 562 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 563 563 564 564 rsi_kill_thread(&dev->rx_thread); 565 565 ··· 572 572 573 573 static int rsi_usb_init_rx(struct rsi_hw *adapter) 574 574 { 575 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 575 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 576 576 struct rx_usb_ctrl_block *rx_cb; 577 577 u8 idx, num_rx_cb; 578 578 ··· 822 822 goto err1; 823 823 } 824 824 825 - dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 825 + dev = adapter->rsi_dev; 826 826 827 827 status = rsi_usb_reg_read(dev->usbdev, FW_STATUS_REG, &fw_status, 2); 828 828 if (status < 0)
+1 -1
drivers/net/wireless/rsi/rsi_91x_usb_ops.c
··· 28 28 void rsi_usb_rx_thread(struct rsi_common *common) 29 29 { 30 30 struct rsi_hw *adapter = common->priv; 31 - struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; 31 + struct rsi_91x_usbdev *dev = adapter->rsi_dev; 32 32 int status; 33 33 struct sk_buff *skb; 34 34
+3 -4
drivers/net/wireless/silabs/wfx/main.c
··· 293 293 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; 294 294 hw->wiphy->n_iface_combinations = ARRAY_SIZE(wfx_iface_combinations); 295 295 hw->wiphy->iface_combinations = wfx_iface_combinations; 296 - hw->wiphy->bands[NL80211_BAND_2GHZ] = devm_kmalloc(dev, sizeof(wfx_band_2ghz), GFP_KERNEL); 296 + /* FIXME: also copy wfx_rates and wfx_2ghz_chantable */ 297 + hw->wiphy->bands[NL80211_BAND_2GHZ] = devm_kmemdup(dev, &wfx_band_2ghz, 298 + sizeof(wfx_band_2ghz), GFP_KERNEL); 297 299 if (!hw->wiphy->bands[NL80211_BAND_2GHZ]) 298 300 goto err; 299 - 300 - /* FIXME: also copy wfx_rates and wfx_2ghz_chantable */ 301 - memcpy(hw->wiphy->bands[NL80211_BAND_2GHZ], &wfx_band_2ghz, sizeof(wfx_band_2ghz)); 302 301 303 302 wdev = hw->priv; 304 303 wdev->hw = hw;
+1 -12
drivers/net/wireless/ti/wlcore/sdio.c
··· 442 442 #endif 443 443 }; 444 444 445 - static int __init wl1271_init(void) 446 - { 447 - return sdio_register_driver(&wl1271_sdio_driver); 448 - } 449 - 450 - static void __exit wl1271_exit(void) 451 - { 452 - sdio_unregister_driver(&wl1271_sdio_driver); 453 - } 454 - 455 - module_init(wl1271_init); 456 - module_exit(wl1271_exit); 445 + module_sdio_driver(wl1271_sdio_driver); 457 446 458 447 module_param(dump, bool, 0600); 459 448 MODULE_PARM_DESC(dump, "Enable sdio read/write dumps.");
+9 -9
drivers/net/wireless/virtual/mac80211_hwsim.c
··· 582 582 */ 583 583 584 584 /* Add vendor data */ 585 - err = nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 1); 586 - if (err) 587 - return err; 585 + nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 1); 586 + 588 587 /* Send the event - this will call nla_nest_end() */ 589 588 cfg80211_vendor_event(skb, GFP_KERNEL); 590 589 } ··· 5625 5626 frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]); 5626 5627 frame_data = (void *)nla_data(info->attrs[HWSIM_ATTR_FRAME]); 5627 5628 5629 + if (frame_data_len < sizeof(struct ieee80211_hdr_3addr) || 5630 + frame_data_len > IEEE80211_MAX_DATA_LEN) 5631 + goto err; 5632 + 5628 5633 /* Allocate new skb here */ 5629 5634 skb = alloc_skb(frame_data_len, GFP_KERNEL); 5630 5635 if (skb == NULL) 5631 - goto err; 5632 - 5633 - if (frame_data_len > IEEE80211_MAX_DATA_LEN) 5634 5636 goto err; 5635 5637 5636 5638 /* Copy the data */ ··· 6314 6314 6315 6315 spin_lock_irqsave(&hwsim_virtio_lock, flags); 6316 6316 while ((skb = virtqueue_get_buf(vq, &len))) 6317 - nlmsg_free(skb); 6317 + dev_kfree_skb_irq(skb); 6318 6318 spin_unlock_irqrestore(&hwsim_virtio_lock, flags); 6319 6319 } 6320 6320 ··· 6383 6383 6384 6384 spin_lock_irqsave(&hwsim_virtio_lock, flags); 6385 6385 if (!hwsim_virtio_enabled) { 6386 - nlmsg_free(skb); 6386 + dev_kfree_skb_irq(skb); 6387 6387 goto out_unlock; 6388 6388 } 6389 6389 vq = hwsim_vqs[HWSIM_VQ_RX]; 6390 6390 sg_init_one(sg, skb->head, skb_end_offset(skb)); 6391 6391 err = virtqueue_add_inbuf(vq, sg, 1, skb, GFP_ATOMIC); 6392 6392 if (WARN(err, "virtqueue_add_inbuf returned %d\n", err)) 6393 - nlmsg_free(skb); 6393 + dev_kfree_skb_irq(skb); 6394 6394 else 6395 6395 virtqueue_kick(vq); 6396 6396 schedule_work(&hwsim_virtio_rx);
+3 -3
drivers/net/wireless/zydas/zd1201.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* 3 - * Driver for ZyDAS zd1201 based wireless USB devices. 3 + * Driver for ZyDAS zd1201 based USB wireless devices. 4 4 * 5 5 * Copyright (c) 2004, 2005 Jeroen Vreeken (pe1rxq@amsat.org) 6 6 * ··· 23 23 #include "zd1201.h" 24 24 25 25 static const struct usb_device_id zd1201_table[] = { 26 - {USB_DEVICE(0x0586, 0x3400)}, /* Peabird Wireless USB Adapter */ 27 - {USB_DEVICE(0x0ace, 0x1201)}, /* ZyDAS ZD1201 Wireless USB Adapter */ 26 + {USB_DEVICE(0x0586, 0x3400)}, /* Peabird USB Wireless Adapter */ 27 + {USB_DEVICE(0x0ace, 0x1201)}, /* ZyDAS ZD1201 USB Wireless Adapter */ 28 28 {USB_DEVICE(0x050d, 0x6051)}, /* Belkin F5D6051 usb adapter */ 29 29 {USB_DEVICE(0x0db0, 0x6823)}, /* MSI UB11B usb adapter */ 30 30 {USB_DEVICE(0x1044, 0x8004)}, /* Gigabyte GN-WLBZ101 */
+1 -1
drivers/platform/x86/eeepc-laptop.c
··· 1394 1394 * and machine-specific scripts find the fixed name convenient. But 1395 1395 * It's also good for us to exclude multiple instances because both 1396 1396 * our hwmon and our wlan rfkill subdevice use global ACPI objects 1397 - * (the EC and the wlan PCI slot respectively). 1397 + * (the EC and the PCI wlan slot respectively). 1398 1398 */ 1399 1399 result = eeepc_platform_init(eeepc); 1400 1400 if (result)
+24 -24
drivers/staging/wlan-ng/prism2usb.c
··· 11 11 12 12 static const struct usb_device_id usb_prism_tbl[] = { 13 13 PRISM_DEV(0x04bb, 0x0922, "IOData AirPort WN-B11/USBS"), 14 - PRISM_DEV(0x07aa, 0x0012, "Corega Wireless LAN USB Stick-11"), 15 - PRISM_DEV(0x09aa, 0x3642, "Prism2.x 11Mbps WLAN USB Adapter"), 16 - PRISM_DEV(0x1668, 0x0408, "Actiontec Prism2.5 11Mbps WLAN USB Adapter"), 17 - PRISM_DEV(0x1668, 0x0421, "Actiontec Prism2.5 11Mbps WLAN USB Adapter"), 18 - PRISM_DEV(0x1915, 0x2236, "Linksys WUSB11v3.0 11Mbps WLAN USB Adapter"), 19 - PRISM_DEV(0x066b, 0x2212, "Linksys WUSB11v2.5 11Mbps WLAN USB Adapter"), 20 - PRISM_DEV(0x066b, 0x2213, "Linksys WUSB12v1.1 11Mbps WLAN USB Adapter"), 14 + PRISM_DEV(0x07aa, 0x0012, "Corega USB Wireless LAN Stick-11"), 15 + PRISM_DEV(0x09aa, 0x3642, "Prism2.x 11Mbps USB WLAN Adapter"), 16 + PRISM_DEV(0x1668, 0x0408, "Actiontec Prism2.5 11Mbps USB WLAN Adapter"), 17 + PRISM_DEV(0x1668, 0x0421, "Actiontec Prism2.5 11Mbps USB WLAN Adapter"), 18 + PRISM_DEV(0x1915, 0x2236, "Linksys WUSB11v3.0 11Mbps USB WLAN Adapter"), 19 + PRISM_DEV(0x066b, 0x2212, "Linksys WUSB11v2.5 11Mbps USB WLAN Adapter"), 20 + PRISM_DEV(0x066b, 0x2213, "Linksys WUSB12v1.1 11Mbps USB WLAN Adapter"), 21 21 PRISM_DEV(0x0411, 0x0016, "Melco WLI-USB-S11 11Mbps WLAN Adapter"), 22 - PRISM_DEV(0x08de, 0x7a01, "PRISM25 IEEE 802.11 Mini USB Adapter"), 23 - PRISM_DEV(0x8086, 0x1111, "Intel PRO/Wireless 2011B LAN USB Adapter"), 22 + PRISM_DEV(0x08de, 0x7a01, "PRISM25 USB IEEE 802.11 Mini Adapter"), 23 + PRISM_DEV(0x8086, 0x1111, "Intel PRO/Wireless 2011B USB LAN Adapter"), 24 24 PRISM_DEV(0x0d8e, 0x7a01, "PRISM25 IEEE 802.11 Mini USB Adapter"), 25 - PRISM_DEV(0x045e, 0x006e, "Microsoft MN510 Wireless USB Adapter"), 25 + PRISM_DEV(0x045e, 0x006e, "Microsoft MN510 USB Wireless Adapter"), 26 26 PRISM_DEV(0x0967, 0x0204, "Acer Warplink USB Adapter"), 27 27 PRISM_DEV(0x0cde, 0x0002, "Z-Com 725/726 Prism2.5 USB/USB Integrated"), 28 - PRISM_DEV(0x0cde, 0x0005, "Z-Com Xl735 Wireless 802.11b USB Adapter"), 29 - PRISM_DEV(0x413c, 0x8100, "Dell TrueMobile 1180 Wireless USB Adapter"), 30 - PRISM_DEV(0x0b3b, 0x1601, "ALLNET 0193 11Mbps WLAN USB Adapter"), 31 - PRISM_DEV(0x0b3b, 0x1602, "ZyXEL ZyAIR B200 Wireless USB Adapter"), 32 - PRISM_DEV(0x0baf, 0x00eb, "USRobotics USR1120 Wireless USB Adapter"), 28 + PRISM_DEV(0x0cde, 0x0005, "Z-Com Xl735 USB Wireless 802.11b Adapter"), 29 + PRISM_DEV(0x413c, 0x8100, "Dell TrueMobile 1180 USB Wireless Adapter"), 30 + PRISM_DEV(0x0b3b, 0x1601, "ALLNET 0193 11Mbps USB WLAN Adapter"), 31 + PRISM_DEV(0x0b3b, 0x1602, "ZyXEL ZyAIR B200 USB Wireless Adapter"), 32 + PRISM_DEV(0x0baf, 0x00eb, "USRobotics USR1120 USB Wireless Adapter"), 33 33 PRISM_DEV(0x0411, 0x0027, "Melco WLI-USB-KS11G 11Mbps WLAN Adapter"), 34 34 PRISM_DEV(0x04f1, 0x3009, "JVC MP-XP7250 Builtin USB WLAN Adapter"), 35 35 PRISM_DEV(0x0846, 0x4110, "NetGear MA111"), 36 36 PRISM_DEV(0x03f3, 0x0020, "Adaptec AWN-8020 USB WLAN Adapter"), 37 - PRISM_DEV(0x2821, 0x3300, "ASUS-WL140 / Hawking HighDB Wireless USB Adapter"), 38 - PRISM_DEV(0x2001, 0x3700, "DWL-122 Wireless USB Adapter"), 39 - PRISM_DEV(0x2001, 0x3702, "DWL-120 Rev F Wireless USB Adapter"), 37 + PRISM_DEV(0x2821, 0x3300, "ASUS-WL140 / Hawking HighDB USB Wireless Adapter"), 38 + PRISM_DEV(0x2001, 0x3700, "DWL-122 USB Wireless Adapter"), 39 + PRISM_DEV(0x2001, 0x3702, "DWL-120 Rev F USB Wireless Adapter"), 40 40 PRISM_DEV(0x50c2, 0x4013, "Averatec USB WLAN Adapter"), 41 - PRISM_DEV(0x2c02, 0x14ea, "Planex GW-US11H WLAN USB Adapter"), 42 - PRISM_DEV(0x124a, 0x168b, "Airvast PRISM3 WLAN USB Adapter"), 41 + PRISM_DEV(0x2c02, 0x14ea, "Planex GW-US11H USB WLAN Adapter"), 42 + PRISM_DEV(0x124a, 0x168b, "Airvast PRISM3 USB WLAN Adapter"), 43 43 PRISM_DEV(0x083a, 0x3503, "T-Sinus 111 USB WLAN Adapter"), 44 44 PRISM_DEV(0x0411, 0x0044, "Melco WLI-USB-KB11 11Mbps WLAN Adapter"), 45 - PRISM_DEV(0x1668, 0x6106, "ROPEX FreeLan 802.11b USB Adapter"), 46 - PRISM_DEV(0x124a, 0x4017, "Pheenet WL-503IA 802.11b USB Adapter"), 45 + PRISM_DEV(0x1668, 0x6106, "ROPEX FreeLan USB 802.11b Adapter"), 46 + PRISM_DEV(0x124a, 0x4017, "Pheenet WL-503IA USB 802.11b Adapter"), 47 47 PRISM_DEV(0x0bb2, 0x0302, "Ambit Microsystems Corp."), 48 - PRISM_DEV(0x9016, 0x182d, "Sitecom WL-022 802.11b USB Adapter"), 48 + PRISM_DEV(0x9016, 0x182d, "Sitecom WL-022 USB 802.11b Adapter"), 49 49 PRISM_DEV(0x0543, 0x0f01, 50 50 "ViewSonic Airsync USB Adapter 11Mbps (Prism2.5)"), 51 51 PRISM_DEV(0x067c, 0x1022, 52 - "Siemens SpeedStream 1022 11Mbps WLAN USB Adapter"), 52 + "Siemens SpeedStream 1022 11Mbps USB WLAN Adapter"), 53 53 PRISM_DEV(0x049f, 0x0033, 54 54 "Compaq/Intel W100 PRO/Wireless 11Mbps multiport WLAN Adapter"), 55 55 { } /* terminator */
+177 -58
include/linux/ieee80211.h
··· 836 836 }; 837 837 838 838 /** 839 - * struct ieee80211_quiet_ie 839 + * struct ieee80211_quiet_ie - Quiet element 840 + * @count: Quiet Count 841 + * @period: Quiet Period 842 + * @duration: Quiet Duration 843 + * @offset: Quiet Offset 840 844 * 841 - * This structure refers to "Quiet information element" 845 + * This structure represents the payload of the "Quiet element" as 846 + * described in IEEE Std 802.11-2020 section 9.4.2.22. 842 847 */ 843 848 struct ieee80211_quiet_ie { 844 849 u8 count; ··· 853 848 } __packed; 854 849 855 850 /** 856 - * struct ieee80211_msrment_ie 851 + * struct ieee80211_msrment_ie - Measurement element 852 + * @token: Measurement Token 853 + * @mode: Measurement Report Mode 854 + * @type: Measurement Type 855 + * @request: Measurement Request or Measurement Report 857 856 * 858 - * This structure refers to "Measurement Request/Report information element" 857 + * This structure represents the payload of both the "Measurement 858 + * Request element" and the "Measurement Report element" as described 859 + * in IEEE Std 802.11-2020 sections 9.4.2.20 and 9.4.2.21. 859 860 */ 860 861 struct ieee80211_msrment_ie { 861 862 u8 token; ··· 871 860 } __packed; 872 861 873 862 /** 874 - * struct ieee80211_channel_sw_ie 863 + * struct ieee80211_channel_sw_ie - Channel Switch Announcement element 864 + * @mode: Channel Switch Mode 865 + * @new_ch_num: New Channel Number 866 + * @count: Channel Switch Count 875 867 * 876 - * This structure refers to "Channel Switch Announcement information element" 868 + * This structure represents the payload of the "Channel Switch 869 + * Announcement element" as described in IEEE Std 802.11-2020 section 870 + * 9.4.2.18. 877 871 */ 878 872 struct ieee80211_channel_sw_ie { 879 873 u8 mode; ··· 887 871 } __packed; 888 872 889 873 /** 890 - * struct ieee80211_ext_chansw_ie 874 + * struct ieee80211_ext_chansw_ie - Extended Channel Switch Announcement element 875 + * @mode: Channel Switch Mode 876 + * @new_operating_class: New Operating Class 877 + * @new_ch_num: New Channel Number 878 + * @count: Channel Switch Count 891 879 * 892 - * This structure represents the "Extended Channel Switch Announcement element" 880 + * This structure represents the "Extended Channel Switch Announcement 881 + * element" as described in IEEE Std 802.11-2020 section 9.4.2.52. 893 882 */ 894 883 struct ieee80211_ext_chansw_ie { 895 884 u8 mode; ··· 915 894 916 895 /** 917 896 * struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE 897 + * @mesh_ttl: Time To Live 898 + * @mesh_flags: Flags 899 + * @mesh_reason: Reason Code 900 + * @mesh_pre_value: Precedence Value 918 901 * 919 - * This structure represents the "Mesh Channel Switch Paramters element" 902 + * This structure represents the payload of the "Mesh Channel Switch 903 + * Parameters element" as described in IEEE Std 802.11-2020 section 904 + * 9.4.2.102. 920 905 */ 921 906 struct ieee80211_mesh_chansw_params_ie { 922 907 u8 mesh_ttl; ··· 933 906 934 907 /** 935 908 * struct ieee80211_wide_bw_chansw_ie - wide bandwidth channel switch IE 909 + * @new_channel_width: New Channel Width 910 + * @new_center_freq_seg0: New Channel Center Frequency Segment 0 911 + * @new_center_freq_seg1: New Channel Center Frequency Segment 1 912 + * 913 + * This structure represents the payload of the "Wide Bandwidth 914 + * Channel Switch element" as described in IEEE Std 802.11-2020 915 + * section 9.4.2.160. 936 916 */ 937 917 struct ieee80211_wide_bw_chansw_ie { 938 918 u8 new_channel_width; ··· 947 913 } __packed; 948 914 949 915 /** 950 - * struct ieee80211_tim 916 + * struct ieee80211_tim_ie - Traffic Indication Map information element 917 + * @dtim_count: DTIM Count 918 + * @dtim_period: DTIM Period 919 + * @bitmap_ctrl: Bitmap Control 920 + * @virtual_map: Partial Virtual Bitmap 951 921 * 952 - * This structure refers to "Traffic Indication Map information element" 922 + * This structure represents the payload of the "TIM element" as 923 + * described in IEEE Std 802.11-2020 section 9.4.2.5. 953 924 */ 954 925 struct ieee80211_tim_ie { 955 926 u8 dtim_count; ··· 965 926 } __packed; 966 927 967 928 /** 968 - * struct ieee80211_meshconf_ie 929 + * struct ieee80211_meshconf_ie - Mesh Configuration element 930 + * @meshconf_psel: Active Path Selection Protocol Identifier 931 + * @meshconf_pmetric: Active Path Selection Metric Identifier 932 + * @meshconf_congest: Congestion Control Mode Identifier 933 + * @meshconf_synch: Synchronization Method Identifier 934 + * @meshconf_auth: Authentication Protocol Identifier 935 + * @meshconf_form: Mesh Formation Info 936 + * @meshconf_cap: Mesh Capability (see &enum mesh_config_capab_flags) 969 937 * 970 - * This structure refers to "Mesh Configuration information element" 938 + * This structure represents the payload of the "Mesh Configuration 939 + * element" as described in IEEE Std 802.11-2020 section 9.4.2.97. 971 940 */ 972 941 struct ieee80211_meshconf_ie { 973 942 u8 meshconf_psel; ··· 997 950 * is ongoing 998 951 * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL: STA is in deep sleep mode or has 999 952 * neighbors in deep sleep mode 953 + * 954 + * Enumerates the "Mesh Capability" as described in IEEE Std 955 + * 802.11-2020 section 9.4.2.97.7. 1000 956 */ 1001 957 enum mesh_config_capab_flags { 1002 958 IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS = 0x01, ··· 1010 960 1011 961 #define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1 1012 962 1013 - /** 963 + /* 1014 964 * mesh channel switch parameters element's flag indicator 1015 965 * 1016 966 */ ··· 1019 969 #define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2) 1020 970 1021 971 /** 1022 - * struct ieee80211_rann_ie 972 + * struct ieee80211_rann_ie - RANN (root announcement) element 973 + * @rann_flags: Flags 974 + * @rann_hopcount: Hop Count 975 + * @rann_ttl: Element TTL 976 + * @rann_addr: Root Mesh STA Address 977 + * @rann_seq: HWMP Sequence Number 978 + * @rann_interval: Interval 979 + * @rann_metric: Metric 1023 980 * 1024 - * This structure refers to "Root Announcement information element" 981 + * This structure represents the payload of the "RANN element" as 982 + * described in IEEE Std 802.11-2020 section 9.4.2.111. 1025 983 */ 1026 984 struct ieee80211_rann_ie { 1027 985 u8 rann_flags; ··· 1051 993 }; 1052 994 1053 995 /** 1054 - * enum ieee80211_opmode_bits - VHT operating mode field bits 996 + * enum ieee80211_vht_opmode_bits - VHT operating mode field bits 1055 997 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask 1056 998 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width 1057 999 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width ··· 1100 1042 #define WLAN_USER_POSITION_LEN 16 1101 1043 1102 1044 /** 1103 - * struct ieee80211_tpc_report_ie 1045 + * struct ieee80211_tpc_report_ie - TPC Report element 1046 + * @tx_power: Transmit Power 1047 + * @link_margin: Link Margin 1104 1048 * 1105 - * This structure refers to "TPC Report element" 1049 + * This structure represents the payload of the "TPC Report element" as 1050 + * described in IEEE Std 802.11-2020 section 9.4.2.16. 1106 1051 */ 1107 1052 struct ieee80211_tpc_report_ie { 1108 1053 u8 tx_power; ··· 1123 1062 } __packed; 1124 1063 1125 1064 /** 1126 - * struct ieee80211_s1g_bcn_compat_ie 1065 + * struct ieee80211_s1g_bcn_compat_ie - S1G Beacon Compatibility element 1066 + * @compat_info: Compatibility Information 1067 + * @beacon_int: Beacon Interval 1068 + * @tsf_completion: TSF Completion 1127 1069 * 1128 - * S1G Beacon Compatibility element 1070 + * This structure represents the payload of the "S1G Beacon 1071 + * Compatibility element" as described in IEEE Std 802.11-2020 section 1072 + * 9.4.2.196. 1129 1073 */ 1130 1074 struct ieee80211_s1g_bcn_compat_ie { 1131 1075 __le16 compat_info; ··· 1139 1073 } __packed; 1140 1074 1141 1075 /** 1142 - * struct ieee80211_s1g_oper_ie 1076 + * struct ieee80211_s1g_oper_ie - S1G Operation element 1077 + * @ch_width: S1G Operation Information Channel Width 1078 + * @oper_class: S1G Operation Information Operating Class 1079 + * @primary_ch: S1G Operation Information Primary Channel Number 1080 + * @oper_ch: S1G Operation Information Channel Center Frequency 1081 + * @basic_mcs_nss: Basic S1G-MCS and NSS Set 1143 1082 * 1144 - * S1G Operation element 1083 + * This structure represents the payload of the "S1G Operation 1084 + * element" as described in IEEE Std 802.11-2020 section 9.4.2.212. 1145 1085 */ 1146 1086 struct ieee80211_s1g_oper_ie { 1147 1087 u8 ch_width; ··· 1158 1086 } __packed; 1159 1087 1160 1088 /** 1161 - * struct ieee80211_aid_response_ie 1089 + * struct ieee80211_aid_response_ie - AID Response element 1090 + * @aid: AID/Group AID 1091 + * @switch_count: AID Switch Count 1092 + * @response_int: AID Response Interval 1162 1093 * 1163 - * AID Response element 1094 + * This structure represents the payload of the "AID Response element" 1095 + * as described in IEEE Std 802.11-2020 section 9.4.2.194. 1164 1096 */ 1165 1097 struct ieee80211_aid_response_ie { 1166 1098 __le16 aid; ··· 1565 1489 /* 1566 1490 * Peer-to-Peer IE attribute related definitions. 1567 1491 */ 1568 - /** 1492 + /* 1569 1493 * enum ieee80211_p2p_attr_id - identifies type of peer-to-peer attribute. 1570 1494 */ 1571 1495 enum ieee80211_p2p_attr_id { ··· 1615 1539 #define IEEE80211_P2P_OPPPS_CTWINDOW_MASK 0x7F 1616 1540 1617 1541 /** 1618 - * struct ieee80211_bar - HT Block Ack Request 1542 + * struct ieee80211_bar - Block Ack Request frame format 1543 + * @frame_control: Frame Control 1544 + * @duration: Duration 1545 + * @ra: RA 1546 + * @ta: TA 1547 + * @control: BAR Control 1548 + * @start_seq_num: Starting Sequence Number (see Figure 9-37) 1619 1549 * 1620 - * This structure refers to "HT BlockAckReq" as 1621 - * described in 802.11n draft section 7.2.1.7.1 1622 - */ 1550 + * This structure represents the "BlockAckReq frame format" 1551 + * as described in IEEE Std 802.11-2020 section 9.3.1.7. 1552 + */ 1623 1553 struct ieee80211_bar { 1624 1554 __le16 frame_control; 1625 1555 __le16 duration; ··· 1645 1563 #define IEEE80211_HT_MCS_MASK_LEN 10 1646 1564 1647 1565 /** 1648 - * struct ieee80211_mcs_info - MCS information 1566 + * struct ieee80211_mcs_info - Supported MCS Set field 1649 1567 * @rx_mask: RX mask 1650 1568 * @rx_highest: highest supported RX rate. If set represents 1651 1569 * the highest supported RX data rate in units of 1 Mbps. 1652 1570 * If this field is 0 this value should not be used to 1653 1571 * consider the highest RX data rate supported. 1654 1572 * @tx_params: TX parameters 1573 + * @reserved: Reserved bits 1574 + * 1575 + * This structure represents the "Supported MCS Set field" as 1576 + * described in IEEE Std 802.11-2020 section 9.4.2.55.4. 1655 1577 */ 1656 1578 struct ieee80211_mcs_info { 1657 1579 u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN]; ··· 1686 1600 (IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8) 1687 1601 1688 1602 /** 1689 - * struct ieee80211_ht_cap - HT capabilities 1603 + * struct ieee80211_ht_cap - HT capabilities element 1604 + * @cap_info: HT Capability Information 1605 + * @ampdu_params_info: A-MPDU Parameters 1606 + * @mcs: Supported MCS Set 1607 + * @extended_ht_cap_info: HT Extended Capabilities 1608 + * @tx_BF_cap_info: Transmit Beamforming Capabilities 1609 + * @antenna_selection_info: ASEL Capability 1690 1610 * 1691 - * This structure is the "HT capabilities element" as 1692 - * described in 802.11n D5.0 7.3.2.57 1611 + * This structure represents the payload of the "HT Capabilities 1612 + * element" as described in IEEE Std 802.11-2020 section 9.4.2.55. 1693 1613 */ 1694 1614 struct ieee80211_ht_cap { 1695 1615 __le16 cap_info; ··· 1783 1691 1784 1692 /** 1785 1693 * struct ieee80211_ht_operation - HT operation IE 1694 + * @primary_chan: Primary Channel 1695 + * @ht_param: HT Operation Information parameters 1696 + * @operation_mode: HT Operation Information operation mode 1697 + * @stbc_param: HT Operation Information STBC params 1698 + * @basic_set: Basic HT-MCS Set 1786 1699 * 1787 - * This structure is the "HT operation element" as 1788 - * described in 802.11n-2009 7.3.2.57 1700 + * This structure represents the payload of the "HT Operation 1701 + * element" as described in IEEE Std 802.11-2020 section 9.4.2.56. 1789 1702 */ 1790 1703 struct ieee80211_ht_operation { 1791 1704 u8 primary_chan; ··· 1959 1862 1960 1863 /** 1961 1864 * struct ieee80211_he_cap_elem - HE capabilities element 1865 + * @mac_cap_info: HE MAC Capabilities Information 1866 + * @phy_cap_info: HE PHY Capabilities Information 1962 1867 * 1963 - * This structure is the "HE capabilities element" fixed fields as 1964 - * described in P802.11ax_D4.0 section 9.4.2.242.2 and 9.4.2.242.3 1868 + * This structure represents the fixed fields of the payload of the 1869 + * "HE capabilities element" as described in IEEE Std 802.11ax-2021 1870 + * sections 9.4.2.248.2 and 9.4.2.248.3. 1965 1871 */ 1966 1872 struct ieee80211_he_cap_elem { 1967 1873 u8 mac_cap_info[6]; ··· 2023 1923 } __packed; 2024 1924 2025 1925 /** 2026 - * struct ieee80211_he_operation - HE capabilities element 1926 + * struct ieee80211_he_operation - HE Operation element 1927 + * @he_oper_params: HE Operation Parameters + BSS Color Information 1928 + * @he_mcs_nss_set: Basic HE-MCS And NSS Set 1929 + * @optional: Optional fields VHT Operation Information, Max Co-Hosted 1930 + * BSSID Indicator, and 6 GHz Operation Information 2027 1931 * 2028 - * This structure is the "HE operation element" fields as 2029 - * described in P802.11ax_D4.0 section 9.4.2.243 1932 + * This structure represents the payload of the "HE Operation 1933 + * element" as described in IEEE Std 802.11ax-2021 section 9.4.2.249. 2030 1934 */ 2031 1935 struct ieee80211_he_operation { 2032 1936 __le32 he_oper_params; 2033 1937 __le16 he_mcs_nss_set; 2034 - /* Optional 0,1,3,4,5,7 or 8 bytes: depends on @he_oper_params */ 2035 1938 u8 optional[]; 2036 1939 } __packed; 2037 1940 2038 1941 /** 2039 - * struct ieee80211_he_spr - HE spatial reuse element 1942 + * struct ieee80211_he_spr - Spatial Reuse Parameter Set element 1943 + * @he_sr_control: SR Control 1944 + * @optional: Optional fields Non-SRG OBSS PD Max Offset, SRG OBSS PD 1945 + * Min Offset, SRG OBSS PD Max Offset, SRG BSS Color 1946 + * Bitmap, and SRG Partial BSSID Bitmap 2040 1947 * 2041 - * This structure is the "HE spatial reuse element" element as 2042 - * described in P802.11ax_D4.0 section 9.4.2.241 1948 + * This structure represents the payload of the "Spatial Reuse 1949 + * Parameter Set element" as described in IEEE Std 802.11ax-2021 1950 + * section 9.4.2.252. 2043 1951 */ 2044 1952 struct ieee80211_he_spr { 2045 1953 u8 he_sr_control; 2046 - /* Optional 0 to 19 bytes: depends on @he_sr_control */ 2047 1954 u8 optional[]; 2048 1955 } __packed; 2049 1956 2050 1957 /** 2051 1958 * struct ieee80211_he_mu_edca_param_ac_rec - MU AC Parameter Record field 1959 + * @aifsn: ACI/AIFSN 1960 + * @ecw_min_max: ECWmin/ECWmax 1961 + * @mu_edca_timer: MU EDCA Timer 2052 1962 * 2053 - * This structure is the "MU AC Parameter Record" fields as 2054 - * described in P802.11ax_D4.0 section 9.4.2.245 1963 + * This structure represents the "MU AC Parameter Record" as described 1964 + * in IEEE Std 802.11ax-2021 section 9.4.2.251, Figure 9-788p. 2055 1965 */ 2056 1966 struct ieee80211_he_mu_edca_param_ac_rec { 2057 1967 u8 aifsn; ··· 2071 1961 2072 1962 /** 2073 1963 * struct ieee80211_mu_edca_param_set - MU EDCA Parameter Set element 1964 + * @mu_qos_info: QoS Info 1965 + * @ac_be: MU AC_BE Parameter Record 1966 + * @ac_bk: MU AC_BK Parameter Record 1967 + * @ac_vi: MU AC_VI Parameter Record 1968 + * @ac_vo: MU AC_VO Parameter Record 2074 1969 * 2075 - * This structure is the "MU EDCA Parameter Set element" fields as 2076 - * described in P802.11ax_D4.0 section 9.4.2.245 1970 + * This structure represents the payload of the "MU EDCA Parameter Set 1971 + * element" as described in IEEE Std 802.11ax-2021 section 9.4.2.251. 2077 1972 */ 2078 1973 struct ieee80211_mu_edca_param_set { 2079 1974 u8 mu_qos_info; ··· 2292 2177 * enum ieee80211_ap_reg_power - regulatory power for a Access Point 2293 2178 * 2294 2179 * @IEEE80211_REG_UNSET_AP: Access Point has no regulatory power mode 2295 - * @IEEE80211_REG_LPI: Indoor Access Point 2296 - * @IEEE80211_REG_SP: Standard power Access Point 2297 - * @IEEE80211_REG_VLP: Very low power Access Point 2180 + * @IEEE80211_REG_LPI_AP: Indoor Access Point 2181 + * @IEEE80211_REG_SP_AP: Standard power Access Point 2182 + * @IEEE80211_REG_VLP_AP: Very low power Access Point 2298 2183 * @IEEE80211_REG_AP_POWER_AFTER_LAST: internal 2299 2184 * @IEEE80211_REG_AP_POWER_MAX: maximum value 2300 2185 */ ··· 2682 2567 #define IEEE80211_6GHZ_CTRL_REG_SP_AP 1 2683 2568 2684 2569 /** 2685 - * ieee80211_he_6ghz_oper - HE 6 GHz operation Information field 2570 + * struct ieee80211_he_6ghz_oper - HE 6 GHz operation Information field 2686 2571 * @primary: primary channel 2687 2572 * @control: control flags 2688 2573 * @ccfs0: channel center frequency segment 0 ··· 2729 2614 }; 2730 2615 2731 2616 /** 2732 - * struct ieee80211_tx_pwr_env 2617 + * struct ieee80211_tx_pwr_env - Transmit Power Envelope 2618 + * @tx_power_info: Transmit Power Information field 2619 + * @tx_power: Maximum Transmit Power field 2733 2620 * 2734 - * This structure represents the "Transmit Power Envelope element" 2621 + * This structure represents the payload of the "Transmit Power 2622 + * Envelope element" as described in IEEE Std 802.11ax-2021 section 2623 + * 9.4.2.161 2735 2624 */ 2736 2625 struct ieee80211_tx_pwr_env { 2737 2626 u8 tx_power_info; ··· 4597 4478 return (const u8 *)element == (const u8 *)data + datalen; 4598 4479 } 4599 4480 4600 - /** 4481 + /* 4601 4482 * RSNX Capabilities: 4602 4483 * bits 0-3: Field length (n-1) 4603 4484 */ ··· 4840 4721 } 4841 4722 4842 4723 /** 4843 - * ieee80211_mle_get_eml_sync_delay - returns the medium sync delay 4724 + * ieee80211_mle_get_eml_med_sync_delay - returns the medium sync delay 4844 4725 * @data: pointer to the multi link EHT IE 4845 4726 * 4846 4727 * The element is assumed to be of the correct type (BASIC) and big enough,
+12 -13
include/net/cfg80211.h
··· 263 263 * are only for driver use when pointers to this structure are 264 264 * passed around. 265 265 * 266 - * @flags: rate-specific flags 266 + * @flags: rate-specific flags from &enum ieee80211_rate_flags 267 267 * @bitrate: bitrate in units of 100 Kbps 268 268 * @hw_value: driver/hardware value for this rate 269 269 * @hw_value_short: driver/hardware value for this rate when ··· 811 811 struct cfg80211_tid_config { 812 812 const u8 *peer; 813 813 u32 n_tid_conf; 814 - struct cfg80211_tid_cfg tid_conf[]; 814 + struct cfg80211_tid_cfg tid_conf[] __counted_by(n_tid_conf); 815 815 }; 816 816 817 817 /** ··· 1187 1187 struct { 1188 1188 const u8 *data; 1189 1189 size_t len; 1190 - } elem[]; 1190 + } elem[] __counted_by(cnt); 1191 1191 }; 1192 1192 1193 1193 /** ··· 1204 1204 struct { 1205 1205 const u8 *data; 1206 1206 size_t len; 1207 - } elem[]; 1207 + } elem[] __counted_by(cnt); 1208 1208 }; 1209 1209 1210 1210 /** ··· 1282 1282 int n_acl_entries; 1283 1283 1284 1284 /* Keep it last */ 1285 - struct mac_address mac_addrs[]; 1285 + struct mac_address mac_addrs[] __counted_by(n_acl_entries); 1286 1286 }; 1287 1287 1288 1288 /** ··· 1353 1353 * @twt_responder: Enable Target Wait Time 1354 1354 * @he_required: stations must support HE 1355 1355 * @sae_h2e_required: stations must support direct H2E technique in SAE 1356 - * @flags: flags, as defined in enum cfg80211_ap_settings_flags 1356 + * @flags: flags, as defined in &enum nl80211_ap_settings_flags 1357 1357 * @he_obss_pd: OBSS Packet Detection settings 1358 1358 * @he_oper: HE operation IE (or %NULL if HE isn't enabled) 1359 1359 * @fils_discovery: FILS discovery transmission parameters ··· 1482 1482 * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp) 1483 1483 * @STATION_PARAM_APPLY_CAPABILITY: apply new capability 1484 1484 * @STATION_PARAM_APPLY_PLINK_STATE: apply new plink state 1485 - * @STATION_PARAM_APPLY_STA_TXPOWER: apply tx power for STA 1486 1485 * 1487 1486 * Not all station parameters have in-band "no change" signalling, 1488 1487 * for those that don't these flags will are used. ··· 2155 2156 * @sn: target sequence number 2156 2157 * @metric: metric (cost) of this mesh path 2157 2158 * @exptime: expiration time for the mesh path from now, in msecs 2158 - * @flags: mesh path flags 2159 + * @flags: mesh path flags from &enum mesh_path_flags 2159 2160 * @discovery_timeout: total mesh path discovery timeout, in msecs 2160 2161 * @discovery_retries: mesh path discovery retries 2161 2162 * @generation: generation number for nl80211 dumps. ··· 2495 2496 * the actual dwell time may be shorter. 2496 2497 * @duration_mandatory: if set, the scan duration must be as specified by the 2497 2498 * %duration field. 2498 - * @flags: bit field of flags controlling operation 2499 + * @flags: control flags from &enum nl80211_scan_flags 2499 2500 * @rates: bitmap of rates to advertise for each band 2500 2501 * @wiphy: the wiphy this was for 2501 2502 * @scan_start: time (in jiffies) when the scan started ··· 2543 2544 struct cfg80211_scan_6ghz_params *scan_6ghz_params; 2544 2545 2545 2546 /* keep last */ 2546 - struct ieee80211_channel *channels[]; 2547 + struct ieee80211_channel *channels[] __counted_by(n_channels); 2547 2548 }; 2548 2549 2549 2550 static inline void get_random_mask_addr(u8 *buf, const u8 *addr, const u8 *mask) ··· 2615 2616 * @scan_width: channel width for scanning 2616 2617 * @ie: optional information element(s) to add into Probe Request or %NULL 2617 2618 * @ie_len: length of ie in octets 2618 - * @flags: bit field of flags controlling operation 2619 + * @flags: control flags from &enum nl80211_scan_flags 2619 2620 * @match_sets: sets of parameters to be matched for a scan result 2620 2621 * entry to be considered valid and to be passed to the host 2621 2622 * (others are filtered out). ··· 3947 3948 3948 3949 struct list_head list; 3949 3950 3950 - struct cfg80211_pmsr_request_peer peers[]; 3951 + struct cfg80211_pmsr_request_peer peers[] __counted_by(n_peers); 3951 3952 }; 3952 3953 3953 3954 /** ··· 8117 8118 * @link_id: the ID of the link the frame was received on 8118 8119 * @buf: Management frame (header + body) 8119 8120 * @len: length of the frame data 8120 - * @flags: flags, as defined in enum nl80211_rxmgmt_flags 8121 + * @flags: flags, as defined in &enum nl80211_rxmgmt_flags 8121 8122 * @rx_tstamp: Hardware timestamp of frame RX in nanoseconds 8122 8123 * @ack_tstamp: Hardware timestamp of ack TX in nanoseconds 8123 8124 */
+2 -1
include/net/ieee80211_radiotap.h
··· 21 21 #include <asm/unaligned.h> 22 22 23 23 /** 24 - * struct ieee82011_radiotap_header - base radiotap header 24 + * struct ieee80211_radiotap_header - base radiotap header 25 25 */ 26 26 struct ieee80211_radiotap_header { 27 27 /** ··· 575 575 576 576 /** 577 577 * ieee80211_get_radiotap_len - get radiotap header length 578 + * @data: pointer to the header 578 579 */ 579 580 static inline u16 ieee80211_get_radiotap_len(const char *data) 580 581 {
+2 -9
include/net/iw_handler.h
··· 426 426 427 427 /**************************** PROTOTYPES ****************************/ 428 428 /* 429 - * Functions part of the Wireless Extensions (defined in net/core/wireless.c). 430 - * Those may be called only within the kernel. 429 + * Functions part of the Wireless Extensions (defined in net/wireless/wext-core.c). 430 + * Those may be called by driver modules. 431 431 */ 432 - 433 - /* First : function strictly used inside the kernel */ 434 - 435 - /* Handle /proc/net/wireless, called in net/code/dev.c */ 436 - int dev_get_wireless_info(char *buffer, char **start, off_t offset, int length); 437 - 438 - /* Second : functions that may be called by driver modules */ 439 432 440 433 /* Send a single event to user space */ 441 434 void wireless_send_event(struct net_device *dev, unsigned int cmd,
+4 -1
include/net/mac80211.h
··· 1192 1192 u8 ampdu_ack_len; 1193 1193 u8 ampdu_len; 1194 1194 u8 antenna; 1195 + u8 pad; 1195 1196 u16 tx_time; 1196 1197 u8 flags; 1197 - void *status_driver_data[18 / sizeof(void *)]; 1198 + u8 pad2; 1199 + void *status_driver_data[16 / sizeof(void *)]; 1198 1200 } status; 1199 1201 struct { 1200 1202 struct ieee80211_tx_rate driver_rates[ ··· 2261 2259 * @he_cap: HE capabilities of this STA 2262 2260 * @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities 2263 2261 * @eht_cap: EHT capabilities of this STA 2262 + * @agg: per-link data for multi-link aggregation 2264 2263 * @bandwidth: current bandwidth the station can receive with 2265 2264 * @rx_nss: in HT/VHT, the maximum number of spatial streams the 2266 2265 * station can receive at the moment, changed by operating mode
+14 -13
net/mac80211/cfg.c
··· 3648 3648 lockdep_assert_held(&local->mtx); 3649 3649 lockdep_assert_held(&local->chanctx_mtx); 3650 3650 3651 - if (sdata->vif.bss_conf.eht_puncturing != sdata->vif.bss_conf.csa_punct_bitmap) { 3652 - sdata->vif.bss_conf.eht_puncturing = 3653 - sdata->vif.bss_conf.csa_punct_bitmap; 3654 - changed |= BSS_CHANGED_EHT_PUNCTURING; 3655 - } 3656 - 3657 3651 /* 3658 3652 * using reservation isn't immediate as it may be deferred until later 3659 3653 * with multi-vif. once reservation is complete it will re-schedule the ··· 3676 3682 err = ieee80211_set_after_csa_beacon(sdata, &changed); 3677 3683 if (err) 3678 3684 return err; 3685 + 3686 + if (sdata->vif.bss_conf.eht_puncturing != sdata->vif.bss_conf.csa_punct_bitmap) { 3687 + sdata->vif.bss_conf.eht_puncturing = 3688 + sdata->vif.bss_conf.csa_punct_bitmap; 3689 + changed |= BSS_CHANGED_EHT_PUNCTURING; 3690 + } 3679 3691 3680 3692 ieee80211_link_info_change_notify(sdata, &sdata->deflink, changed); 3681 3693 ··· 4133 4133 mutex_lock(&local->mtx); 4134 4134 4135 4135 rcu_read_lock(); 4136 + sta = sta_info_get_bss(sdata, peer); 4137 + if (!sta) { 4138 + ret = -ENOLINK; 4139 + goto unlock; 4140 + } 4141 + 4142 + qos = sta->sta.wme; 4143 + 4136 4144 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf); 4137 4145 if (WARN_ON(!chanctx_conf)) { 4138 4146 ret = -EINVAL; 4139 4147 goto unlock; 4140 4148 } 4141 4149 band = chanctx_conf->def.chan->band; 4142 - sta = sta_info_get_bss(sdata, peer); 4143 - if (sta) { 4144 - qos = sta->sta.wme; 4145 - } else { 4146 - ret = -ENOLINK; 4147 - goto unlock; 4148 - } 4149 4150 4150 4151 if (qos) { 4151 4152 fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
+1 -1
net/mac80211/fils_aead.c
··· 5 5 */ 6 6 7 7 #include <crypto/aes.h> 8 - #include <crypto/algapi.h> 9 8 #include <crypto/hash.h> 10 9 #include <crypto/skcipher.h> 10 + #include <crypto/utils.h> 11 11 12 12 #include "ieee80211_i.h" 13 13 #include "aes_cmac.h"
-2
net/mac80211/ieee80211_i.h
··· 1872 1872 struct ieee80211_sub_if_data *sdata); 1873 1873 void ieee80211_recalc_ps(struct ieee80211_local *local); 1874 1874 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata); 1875 - int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata); 1876 1875 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); 1877 1876 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 1878 1877 struct sk_buff *skb); ··· 2563 2564 struct ieee80211_link_data *rsvd_for); 2564 2565 bool ieee80211_is_radar_required(struct ieee80211_local *local); 2565 2566 2566 - void ieee80211_dfs_cac_timer(unsigned long data); 2567 2567 void ieee80211_dfs_cac_timer_work(struct work_struct *work); 2568 2568 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local); 2569 2569 void ieee80211_dfs_radar_detected_work(struct work_struct *work);
+1 -1
net/mac80211/key.c
··· 9 9 * Copyright 2018-2020, 2022-2023 Intel Corporation 10 10 */ 11 11 12 + #include <crypto/utils.h> 12 13 #include <linux/if_ether.h> 13 14 #include <linux/etherdevice.h> 14 15 #include <linux/list.h> ··· 18 17 #include <linux/slab.h> 19 18 #include <linux/export.h> 20 19 #include <net/mac80211.h> 21 - #include <crypto/algapi.h> 22 20 #include <asm/unaligned.h> 23 21 #include "ieee80211_i.h" 24 22 #include "driver-ops.h"
-1
net/mac80211/mesh.h
··· 212 212 const u8 *addr, struct ieee80211s_hdr *mesh_hdr); 213 213 bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, 214 214 struct ieee802_11_elems *ie); 215 - void mesh_ids_set_default(struct ieee80211_if_mesh *mesh); 216 215 int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, 217 216 struct sk_buff *skb); 218 217 int mesh_add_meshid_ie(struct ieee80211_sub_if_data *sdata,
+4
net/mac80211/rx.c
··· 3734 3734 break; 3735 3735 goto queue; 3736 3736 case WLAN_CATEGORY_S1G: 3737 + if (len < offsetofend(typeof(*mgmt), 3738 + u.action.u.s1g.action_code)) 3739 + break; 3740 + 3737 3741 switch (mgmt->u.action.u.s1g.action_code) { 3738 3742 case WLAN_S1G_TWT_SETUP: 3739 3743 case WLAN_S1G_TWT_TEARDOWN:
+1 -1
net/mac80211/wpa.c
··· 15 15 #include <asm/unaligned.h> 16 16 #include <net/mac80211.h> 17 17 #include <crypto/aes.h> 18 - #include <crypto/algapi.h> 18 + #include <crypto/utils.h> 19 19 20 20 #include "ieee80211_i.h" 21 21 #include "michael.h"
+1 -1
net/wireless/core.h
··· 298 298 u32 rssi_hyst; 299 299 s32 last_rssi_event_value; 300 300 int n_rssi_thresholds; 301 - s32 rssi_thresholds[]; 301 + s32 rssi_thresholds[] __counted_by(n_rssi_thresholds); 302 302 }; 303 303 304 304 void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev);
+13
net/wireless/mlme.c
··· 281 281 ether_addr_equal(req->bss->bssid, wdev->u.client.connected_addr)) 282 282 return -EALREADY; 283 283 284 + if (ether_addr_equal(req->bss->bssid, dev->dev_addr) || 285 + (req->link_id >= 0 && 286 + ether_addr_equal(req->ap_mld_addr, dev->dev_addr))) 287 + return -EINVAL; 288 + 284 289 return rdev_auth(rdev, dev, req); 285 290 } 286 291 ··· 340 335 if (req->links[i].bss == req->links[j].bss) 341 336 return -EINVAL; 342 337 } 338 + 339 + if (ether_addr_equal(req->links[i].bss->bssid, dev->dev_addr)) 340 + return -EINVAL; 343 341 } 344 342 345 343 if (wdev->connected && 346 344 (!req->prev_bssid || 347 345 !ether_addr_equal(wdev->u.client.connected_addr, req->prev_bssid))) 348 346 return -EALREADY; 347 + 348 + if ((req->bss && ether_addr_equal(req->bss->bssid, dev->dev_addr)) || 349 + (req->link_id >= 0 && 350 + ether_addr_equal(req->ap_mld_addr, dev->dev_addr))) 351 + return -EINVAL; 349 352 350 353 cfg80211_oper_and_ht_capa(&req->ht_capa_mask, 351 354 rdev->wiphy.ht_capa_mod_mask);
+4 -4
net/wireless/nl80211.c
··· 323 323 [NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED] = { .type = NLA_FLAG }, 324 324 [NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED] = { .type = NLA_FLAG }, 325 325 [NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK] = { .type = NLA_FLAG }, 326 + [NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR] = { .type = NLA_U8 }, 326 327 }; 327 328 328 329 static const struct nla_policy ··· 4890 4889 acl = kzalloc(struct_size(acl, mac_addrs, n_entries), GFP_KERNEL); 4891 4890 if (!acl) 4892 4891 return ERR_PTR(-ENOMEM); 4892 + acl->n_acl_entries = n_entries; 4893 4893 4894 4894 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) { 4895 4895 memcpy(acl->mac_addrs[i].addr, nla_data(attr), ETH_ALEN); 4896 4896 i++; 4897 4897 } 4898 - 4899 - acl->n_acl_entries = n_entries; 4900 4898 acl->acl_policy = acl_policy; 4901 4899 4902 4900 return acl; ··· 5439 5439 elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL); 5440 5440 if (!elems) 5441 5441 return ERR_PTR(-ENOMEM); 5442 + elems->cnt = num_elems; 5442 5443 5443 5444 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5444 5445 elems->elem[i].data = nla_data(nl_elems); 5445 5446 elems->elem[i].len = nla_len(nl_elems); 5446 5447 i++; 5447 5448 } 5448 - elems->cnt = num_elems; 5449 5449 return elems; 5450 5450 } 5451 5451 ··· 5471 5471 elems = kzalloc(struct_size(elems, elem, num_elems), GFP_KERNEL); 5472 5472 if (!elems) 5473 5473 return ERR_PTR(-ENOMEM); 5474 + elems->cnt = num_elems; 5474 5475 5475 5476 nla_for_each_nested(nl_elems, attrs, rem_elems) { 5476 5477 elems->elem[i].data = nla_data(nl_elems); 5477 5478 elems->elem[i].len = nla_len(nl_elems); 5478 5479 i++; 5479 5480 } 5480 - elems->cnt = num_elems; 5481 5481 return elems; 5482 5482 } 5483 5483
-1
net/wireless/nl80211.h
··· 120 120 121 121 /* peer measurement */ 122 122 int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info); 123 - int nl80211_pmsr_dump_results(struct sk_buff *skb, struct netlink_callback *cb); 124 123 125 124 #endif /* __NET_WIRELESS_NL80211_H */
+3
net/wireless/ocb.c
··· 68 68 if (!rdev->ops->leave_ocb) 69 69 return -EOPNOTSUPP; 70 70 71 + if (!wdev->u.ocb.chandef.chan) 72 + return -ENOTCONN; 73 + 71 74 err = rdev_leave_ocb(rdev, dev); 72 75 if (!err) 73 76 memset(&wdev->u.ocb.chandef, 0, sizeof(wdev->u.ocb.chandef));
+1 -2
net/wireless/pmsr.c
··· 291 291 req = kzalloc(struct_size(req, peers, count), GFP_KERNEL); 292 292 if (!req) 293 293 return -ENOMEM; 294 + req->n_peers = count; 294 295 295 296 if (info->attrs[NL80211_ATTR_TIMEOUT]) 296 297 req->timeout = nla_get_u32(info->attrs[NL80211_ATTR_TIMEOUT]); ··· 322 321 goto out_err; 323 322 idx++; 324 323 } 325 - 326 - req->n_peers = count; 327 324 req->cookie = cfg80211_assign_cookie(rdev); 328 325 req->nl_portid = info->snd_portid; 329 326