mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 15:11:31 +00:00
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 -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEiBjanGPFTz4PRfLobhckVSbrbZsFAmToqosRHGt2YWxvQGtl cm5lbC5vcmcACgkQbhckVSbrbZv9XQf9HDq9smbuWLvwzNjbbS31hHFLmnfhN8Zp +Zzn47gpMCle9ahGLQyw8lcfNPWCMyqOu4sGQ6hyyuH+YXoxZryuq9QDwWo9L/b1 5Cpm4IaBYBMm0ZoOkWw2lQSzGyNrXgvCEKRVC+pYQMvr5V2aEWxT/kT4guiou9D5 OXPRFN2iqZP0Q3TKcfKWRnWn3S0Ok3kZCFuXcWkL0sgwjqP/wbAPO1XNI1IImKNM xUd0zT4vK/layYq7i20y8blglI5kcp/aKCFEwYpQC2WPeZ3Wtl1G9PQ8eze5Gc2Q NTw3xfr6tENIcAmYoLdBdKbUq6e6pwLwXlojlZ2beR6s7LHM30AinQ== =2Hja -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
1fa6ffad12
@ -733,7 +733,7 @@ static int ath10k_ahb_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
struct ath10k_bus_params bus_params = {};
|
||||
|
||||
hw_rev = (enum ath10k_hw_rev)of_device_get_match_data(&pdev->dev);
|
||||
hw_rev = (uintptr_t)of_device_get_match_data(&pdev->dev);
|
||||
if (!hw_rev) {
|
||||
dev_err(&pdev->dev, "OF data missing\n");
|
||||
return -EINVAL;
|
||||
|
@ -69,7 +69,7 @@ struct htt_ver_req {
|
||||
* The HTT tx descriptor is defined in two manners: by a struct with
|
||||
* bitfields, and by a series of [dword offset, bit mask, bit shift]
|
||||
* definitions.
|
||||
* The target should use the struct def, for simplicitly and clarity,
|
||||
* The target should use the struct def, for simplicity and clarity,
|
||||
* but the host shall use the bit-mast + bit-shift defs, to be endian-
|
||||
* neutral. Specifically, the host shall use the get/set macros built
|
||||
* around the mask + shift defs.
|
||||
@ -2086,7 +2086,7 @@ static inline bool ath10k_htt_rx_proc_rx_frag_ind(struct ath10k_htt *htt,
|
||||
* for correctly accessing rx descriptor data.
|
||||
*/
|
||||
|
||||
/* base struct used for abstracting the rx descritor representation */
|
||||
/* base struct used for abstracting the rx descriptor representation */
|
||||
struct htt_rx_desc {
|
||||
union {
|
||||
/* This field is filled on the host using the msdu buffer
|
||||
|
@ -1636,7 +1636,7 @@ static int ath10k_pci_dump_memory_generic(struct ath10k *ar,
|
||||
buf,
|
||||
current_region->len);
|
||||
|
||||
/* No individiual memory sections defined so we can
|
||||
/* No individual memory sections defined so we can
|
||||
* copy the entire memory region.
|
||||
*/
|
||||
ret = ath10k_pci_diag_read_mem(ar,
|
||||
@ -3816,7 +3816,7 @@ static void __exit ath10k_pci_exit(void)
|
||||
module_exit(ath10k_pci_exit);
|
||||
|
||||
MODULE_AUTHOR("Qualcomm Atheros");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Atheros 802.11ac WLAN PCIe/AHB devices");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Atheros PCIe/AHB 802.11ac WLAN devices");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
/* QCA988x 2.0 firmware files */
|
||||
|
@ -2389,7 +2389,7 @@ static int ath10k_sdio_dump_memory_generic(struct ath10k *ar,
|
||||
buf,
|
||||
current_region->len);
|
||||
|
||||
/* No individiual memory sections defined so we can
|
||||
/* No individual memory sections defined so we can
|
||||
* copy the entire memory region.
|
||||
*/
|
||||
if (fast_dump)
|
||||
|
@ -1126,5 +1126,5 @@ static struct usb_driver ath10k_usb_driver = {
|
||||
module_usb_driver(ath10k_usb_driver);
|
||||
|
||||
MODULE_AUTHOR("Atheros Communications, Inc.");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Atheros 802.11ac WLAN USB devices");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Atheros USB 802.11ac WLAN devices");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -3854,9 +3854,9 @@ enum wmi_pdev_param {
|
||||
* retransmitting frames.
|
||||
*/
|
||||
WMI_PDEV_PARAM_DYNAMIC_BW,
|
||||
/* Non aggregrate/ 11g sw retry threshold.0-disable */
|
||||
/* Non aggregate/ 11g sw retry threshold.0-disable */
|
||||
WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
|
||||
/* aggregrate sw retry threshold. 0-disable*/
|
||||
/* aggregate sw retry threshold. 0-disable*/
|
||||
WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
|
||||
/* Station kickout threshold (non of consecutive failures).0-disable */
|
||||
WMI_PDEV_PARAM_STA_KICKOUT_TH,
|
||||
@ -3953,9 +3953,9 @@ enum wmi_10x_pdev_param {
|
||||
WMI_10X_PDEV_PARAM_PROTECTION_MODE,
|
||||
/* Dynamic bandwidth 0: disable 1: enable */
|
||||
WMI_10X_PDEV_PARAM_DYNAMIC_BW,
|
||||
/* Non aggregrate/ 11g sw retry threshold.0-disable */
|
||||
/* Non aggregate/ 11g sw retry threshold.0-disable */
|
||||
WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
|
||||
/* aggregrate sw retry threshold. 0-disable*/
|
||||
/* aggregate sw retry threshold. 0-disable*/
|
||||
WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
|
||||
/* Station kickout threshold (non of consecutive failures).0-disable */
|
||||
WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
|
||||
|
@ -1096,7 +1096,7 @@ static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_rev = (enum ath11k_hw_rev)of_id->data;
|
||||
hw_rev = (uintptr_t)of_id->data;
|
||||
|
||||
switch (hw_rev) {
|
||||
case ATH11K_HW_IPQ8074:
|
||||
@ -1306,17 +1306,7 @@ static struct platform_driver ath11k_ahb_driver = {
|
||||
.shutdown = ath11k_ahb_shutdown,
|
||||
};
|
||||
|
||||
static int ath11k_ahb_init(void)
|
||||
{
|
||||
return platform_driver_register(&ath11k_ahb_driver);
|
||||
}
|
||||
module_init(ath11k_ahb_init);
|
||||
|
||||
static void ath11k_ahb_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&ath11k_ahb_driver);
|
||||
}
|
||||
module_exit(ath11k_ahb_exit);
|
||||
module_platform_driver(ath11k_ahb_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN AHB devices");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -203,9 +203,6 @@ int ath11k_ce_alloc_pipes(struct ath11k_base *ab);
|
||||
void ath11k_ce_free_pipes(struct ath11k_base *ab);
|
||||
int ath11k_ce_get_attr_flags(struct ath11k_base *ab, int ce_id);
|
||||
void ath11k_ce_poll_send_completed(struct ath11k_base *ab, u8 pipe_id);
|
||||
int ath11k_ce_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe);
|
||||
int ath11k_ce_attr_attach(struct ath11k_base *ab);
|
||||
void ath11k_ce_get_shadow_config(struct ath11k_base *ab,
|
||||
u32 **shadow_cfg, u32 *shadow_cfg_len);
|
||||
void ath11k_ce_stop_shadow_timers(struct ath11k_base *ab);
|
||||
|
@ -635,7 +635,7 @@ enum htt_ppdu_stats_tag_type {
|
||||
* b'24 - status_swap: 1 is to swap status TLV
|
||||
* b'25 - pkt_swap: 1 is to swap packet TLV
|
||||
* b'26:31 - rsvd1: reserved for future use
|
||||
* dword1 - b'0:16 - ring_buffer_size: size of bufferes referenced by rx ring,
|
||||
* dword1 - b'0:16 - ring_buffer_size: size of buffers referenced by rx ring,
|
||||
* in byte units.
|
||||
* Valid only for HW_TO_SW_RING and SW_TO_HW_RING
|
||||
* - b'16:31 - rsvd2: Reserved for future use
|
||||
|
@ -3423,7 +3423,7 @@ static int ath11k_dp_rx_h_defrag_reo_reinject(struct ath11k *ar, struct dp_rx_ti
|
||||
ath11k_hal_rx_buf_addr_info_set(msdu0, paddr, cookie,
|
||||
ab->hw_params.hal_params->rx_buf_rbm);
|
||||
|
||||
/* Fill mpdu details into reo entrace ring */
|
||||
/* Fill mpdu details into reo entrance ring */
|
||||
srng = &ab->hal.srng_list[ab->dp.reo_reinject_ring.ring_id];
|
||||
|
||||
spin_lock_bh(&srng->lock);
|
||||
|
@ -238,7 +238,7 @@ tcl_ring_sel:
|
||||
spin_unlock_bh(&tcl_ring->lock);
|
||||
ret = -ENOMEM;
|
||||
|
||||
/* Checking for available tcl descritors in another ring in
|
||||
/* Checking for available tcl descriptors in another ring in
|
||||
* case of failure due to full tcl ring now, is better than
|
||||
* checking this ring earlier for each pkt tx.
|
||||
* Restart ring selection if some rings are not checked yet.
|
||||
@ -344,7 +344,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct ath11k_base *ab,
|
||||
dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
|
||||
|
||||
if (!skb_cb->vif) {
|
||||
dev_kfree_skb_any(msdu);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -369,7 +369,7 @@ ath11k_dp_tx_htt_tx_complete_buf(struct ath11k_base *ab,
|
||||
"dp_tx: failed to find the peer with peer_id %d\n",
|
||||
ts->peer_id);
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
dev_kfree_skb_any(msdu);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
@ -566,12 +566,12 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar,
|
||||
dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
|
||||
|
||||
if (unlikely(!rcu_access_pointer(ab->pdevs_active[ar->pdev_idx]))) {
|
||||
dev_kfree_skb_any(msdu);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(!skb_cb->vif)) {
|
||||
dev_kfree_skb_any(msdu);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -624,7 +624,7 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar,
|
||||
"dp_tx: failed to find the peer with peer_id %d\n",
|
||||
ts->peer_id);
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
dev_kfree_skb_any(msdu);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|
||||
|
@ -566,7 +566,7 @@ static void ath11k_get_arvif_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath11k_vif_iter *arvif_iter = data;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
|
||||
if (arvif->vdev_id == arvif_iter->vdev_id)
|
||||
arvif_iter->arvif = arvif;
|
||||
@ -1464,7 +1464,7 @@ static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif)
|
||||
u32 params = 0;
|
||||
u8 i = 0;
|
||||
|
||||
tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
|
||||
tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
|
||||
|
||||
beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw,
|
||||
tx_arvif->vif, 0);
|
||||
@ -1520,8 +1520,8 @@ static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif)
|
||||
struct sk_buff *bcn;
|
||||
int ret;
|
||||
|
||||
if (arvif->vif->mbssid_tx_vif) {
|
||||
tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv;
|
||||
if (vif->mbssid_tx_vif) {
|
||||
tx_arvif = ath11k_vif_to_arvif(vif->mbssid_tx_vif);
|
||||
if (tx_arvif != arvif) {
|
||||
ar = tx_arvif->ar;
|
||||
ab = ar->ab;
|
||||
@ -1562,7 +1562,7 @@ static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif)
|
||||
* non-transmitting interfaces, and results in a crash if sent.
|
||||
*/
|
||||
if (vif->mbssid_tx_vif &&
|
||||
arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up)
|
||||
arvif != ath11k_vif_to_arvif(vif->mbssid_tx_vif) && arvif->is_up)
|
||||
return 0;
|
||||
|
||||
if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif)
|
||||
@ -1626,7 +1626,7 @@ static void ath11k_control_beaconing(struct ath11k_vif *arvif,
|
||||
ether_addr_copy(arvif->bssid, info->bssid);
|
||||
|
||||
if (arvif->vif->mbssid_tx_vif)
|
||||
tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv;
|
||||
tx_arvif = ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
|
||||
|
||||
ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
|
||||
arvif->bssid,
|
||||
@ -1649,7 +1649,7 @@ static void ath11k_mac_handle_beacon_iter(void *data, u8 *mac,
|
||||
{
|
||||
struct sk_buff *skb = data;
|
||||
struct ieee80211_mgmt *mgmt = (void *)skb->data;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
@ -1672,7 +1672,7 @@ static void ath11k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
u32 *vdev_id = data;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k *ar = arvif->ar;
|
||||
struct ieee80211_hw *hw = ar->hw;
|
||||
|
||||
@ -1718,7 +1718,7 @@ static void ath11k_peer_assoc_h_basic(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
u32 aid;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
@ -1746,7 +1746,7 @@ static void ath11k_peer_assoc_h_crypto(struct ath11k *ar,
|
||||
struct ieee80211_bss_conf *info = &vif->bss_conf;
|
||||
struct cfg80211_chan_def def;
|
||||
struct cfg80211_bss *bss;
|
||||
struct ath11k_vif *arvif = (struct ath11k_vif *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
const u8 *rsnie = NULL;
|
||||
const u8 *wpaie = NULL;
|
||||
|
||||
@ -1804,7 +1804,7 @@ static void ath11k_peer_assoc_h_rates(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
|
||||
struct cfg80211_chan_def def;
|
||||
const struct ieee80211_supported_band *sband;
|
||||
@ -1867,7 +1867,7 @@ static void ath11k_peer_assoc_h_ht(struct ath11k *ar,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
const u8 *ht_mcs_mask;
|
||||
@ -2064,7 +2064,7 @@ static void ath11k_peer_assoc_h_vht(struct ath11k *ar,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
u16 *vht_mcs_mask;
|
||||
@ -2261,7 +2261,7 @@ static void ath11k_peer_assoc_h_he(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
enum nl80211_band band;
|
||||
@ -2584,7 +2584,7 @@ static void ath11k_peer_assoc_h_qos(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
|
||||
switch (arvif->vdev_type) {
|
||||
case WMI_VDEV_TYPE_AP:
|
||||
@ -2747,7 +2747,7 @@ static void ath11k_peer_assoc_h_phymode(struct ath11k *ar,
|
||||
struct ieee80211_sta *sta,
|
||||
struct peer_assoc_params *arg)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
const u8 *ht_mcs_mask;
|
||||
@ -2933,7 +2933,7 @@ static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta_he_cap *he_cap)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ieee80211_he_cap_elem he_cap_elem = {0};
|
||||
struct ieee80211_sta_he_cap *cap_band = NULL;
|
||||
struct cfg80211_chan_def def;
|
||||
@ -2995,7 +2995,7 @@ static void ath11k_bss_assoc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct peer_assoc_params peer_arg;
|
||||
struct ieee80211_sta *ap_sta;
|
||||
struct ath11k_peer *peer;
|
||||
@ -3111,7 +3111,7 @@ static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
@ -3160,7 +3160,7 @@ static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct cfg80211_chan_def *def)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
const struct ieee80211_supported_band *sband;
|
||||
u8 basic_rate_idx;
|
||||
int hw_rate_code;
|
||||
@ -4632,7 +4632,7 @@ static int ath11k_station_disassoc(struct ath11k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
@ -5160,7 +5160,7 @@ static int ath11k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
int ret = 0;
|
||||
s16 txpwr;
|
||||
|
||||
@ -5210,7 +5210,7 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
u32 bw, smps;
|
||||
|
||||
@ -5337,7 +5337,7 @@ static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
|
||||
const struct ieee80211_tx_queue_params *params)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct wmi_wmm_params_arg *p = NULL;
|
||||
int ret;
|
||||
|
||||
@ -6455,7 +6455,7 @@ static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif,
|
||||
return 0;
|
||||
}
|
||||
|
||||
tx_arvif = (void *)tx_vif->drv_priv;
|
||||
tx_arvif = ath11k_vif_to_arvif(tx_vif);
|
||||
|
||||
if (arvif->vif->bss_conf.nontransmitted) {
|
||||
if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy)
|
||||
@ -7408,7 +7408,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
|
||||
/* TODO: Update ar->rx_channel */
|
||||
|
||||
for (i = 0; i < n_vifs; i++) {
|
||||
arvif = (void *)vifs[i].vif->drv_priv;
|
||||
arvif = ath11k_vif_to_arvif(vifs[i].vif);
|
||||
|
||||
if (WARN_ON(!arvif->is_started))
|
||||
continue;
|
||||
@ -7450,7 +7450,7 @@ ath11k_mac_update_vif_chan(struct ath11k *ar,
|
||||
|
||||
mbssid_tx_vif = arvif->vif->mbssid_tx_vif;
|
||||
if (mbssid_tx_vif)
|
||||
tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv;
|
||||
tx_arvif = ath11k_vif_to_arvif(mbssid_tx_vif);
|
||||
|
||||
ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
|
||||
arvif->bssid,
|
||||
@ -7546,7 +7546,7 @@ static int ath11k_start_vdev_delay(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(arvif->is_started))
|
||||
@ -7596,7 +7596,7 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
struct peer_create_params param;
|
||||
|
||||
@ -7686,7 +7686,7 @@ ath11k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
int ret;
|
||||
|
||||
@ -8307,7 +8307,7 @@ ath11k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
const struct cfg80211_bitrate_mask *mask)
|
||||
{
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
struct ath11k_pdev_cap *cap;
|
||||
struct ath11k *ar = arvif->ar;
|
||||
@ -8904,7 +8904,7 @@ static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
|
||||
enum ieee80211_roc_type type)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct scan_req_params arg;
|
||||
int ret;
|
||||
u32 scan_time_msec;
|
||||
|
@ -1036,7 +1036,7 @@ static void ath11k_pci_exit(void)
|
||||
|
||||
module_exit(ath11k_pci_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN PCIe devices");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Technologies PCIe 802.11ax WLAN devices");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
/* firmware files */
|
||||
|
@ -514,8 +514,6 @@ struct qmi_wlanfw_wlan_ini_resp_msg_v01 {
|
||||
int ath11k_qmi_firmware_start(struct ath11k_base *ab,
|
||||
u32 mode);
|
||||
void ath11k_qmi_firmware_stop(struct ath11k_base *ab);
|
||||
void ath11k_qmi_event_work(struct work_struct *work);
|
||||
void ath11k_qmi_msg_recv_work(struct work_struct *work);
|
||||
void ath11k_qmi_deinit_service(struct ath11k_base *ab);
|
||||
int ath11k_qmi_init_service(struct ath11k_base *ab);
|
||||
void ath11k_qmi_free_resource(struct ath11k_base *ab);
|
||||
|
@ -350,7 +350,7 @@ static int ath11k_tm_cmd_wmi(struct ath11k *ar, struct nlattr *tb[],
|
||||
if (ar->ab->fw_mode != ATH11K_FIRMWARE_MODE_FTM &&
|
||||
(tag == WMI_TAG_VDEV_SET_PARAM_CMD || tag == WMI_TAG_UNIT_TEST_CMD)) {
|
||||
if (vif) {
|
||||
arvif = (struct ath11k_vif *)vif->drv_priv;
|
||||
arvif = ath11k_vif_to_arvif(vif);
|
||||
*ptr = arvif->vdev_id;
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
|
@ -176,9 +176,6 @@ int ath12k_ce_alloc_pipes(struct ath12k_base *ab);
|
||||
void ath12k_ce_free_pipes(struct ath12k_base *ab);
|
||||
int ath12k_ce_get_attr_flags(struct ath12k_base *ab, int ce_id);
|
||||
void ath12k_ce_poll_send_completed(struct ath12k_base *ab, u8 pipe_id);
|
||||
int ath12k_ce_map_service_to_pipe(struct ath12k_base *ab, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe);
|
||||
int ath12k_ce_attr_attach(struct ath12k_base *ab);
|
||||
void ath12k_ce_get_shadow_config(struct ath12k_base *ab,
|
||||
u32 **shadow_cfg, u32 *shadow_cfg_len);
|
||||
#endif
|
||||
|
@ -788,7 +788,6 @@ int ath12k_core_fetch_board_data_api_1(struct ath12k_base *ab,
|
||||
int ath12k_core_fetch_bdf(struct ath12k_base *ath12k,
|
||||
struct ath12k_board_data *bd);
|
||||
void ath12k_core_free_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd);
|
||||
int ath12k_core_check_dt(struct ath12k_base *ath12k);
|
||||
|
||||
void ath12k_core_halt(struct ath12k *ar);
|
||||
int ath12k_core_resume(struct ath12k_base *ab);
|
||||
|
@ -1129,6 +1129,7 @@ static void ath12k_dp_cc_cleanup(struct ath12k_base *ab)
|
||||
struct ath12k_dp *dp = &ab->dp;
|
||||
struct sk_buff *skb;
|
||||
int i;
|
||||
u32 pool_id, tx_spt_page;
|
||||
|
||||
if (!dp->spt_info)
|
||||
return;
|
||||
@ -1148,6 +1149,14 @@ static void ath12k_dp_cc_cleanup(struct ath12k_base *ab)
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
|
||||
for (i = 0; i < ATH12K_NUM_RX_SPT_PAGES; i++) {
|
||||
if (!dp->spt_info->rxbaddr[i])
|
||||
continue;
|
||||
|
||||
kfree(dp->spt_info->rxbaddr[i]);
|
||||
dp->spt_info->rxbaddr[i] = NULL;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&dp->rx_desc_lock);
|
||||
|
||||
/* TX Descriptor cleanup */
|
||||
@ -1170,6 +1179,21 @@ static void ath12k_dp_cc_cleanup(struct ath12k_base *ab)
|
||||
spin_unlock_bh(&dp->tx_desc_lock[i]);
|
||||
}
|
||||
|
||||
for (pool_id = 0; pool_id < ATH12K_HW_MAX_QUEUES; pool_id++) {
|
||||
spin_lock_bh(&dp->tx_desc_lock[pool_id]);
|
||||
|
||||
for (i = 0; i < ATH12K_TX_SPT_PAGES_PER_POOL; i++) {
|
||||
tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL;
|
||||
if (!dp->spt_info->txbaddr[tx_spt_page])
|
||||
continue;
|
||||
|
||||
kfree(dp->spt_info->txbaddr[tx_spt_page]);
|
||||
dp->spt_info->txbaddr[tx_spt_page] = NULL;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&dp->tx_desc_lock[pool_id]);
|
||||
}
|
||||
|
||||
/* unmap SPT pages */
|
||||
for (i = 0; i < dp->num_spt_pages; i++) {
|
||||
if (!dp->spt_info[i].vaddr)
|
||||
@ -1343,6 +1367,8 @@ static int ath12k_dp_cc_desc_init(struct ath12k_base *ab)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dp->spt_info->rxbaddr[i] = &rx_descs[0];
|
||||
|
||||
for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) {
|
||||
rx_descs[j].cookie = ath12k_dp_cc_cookie_gen(i, j);
|
||||
rx_descs[j].magic = ATH12K_DP_RX_DESC_MAGIC;
|
||||
@ -1368,8 +1394,10 @@ static int ath12k_dp_cc_desc_init(struct ath12k_base *ab)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL;
|
||||
dp->spt_info->txbaddr[tx_spt_page] = &tx_descs[0];
|
||||
|
||||
for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) {
|
||||
tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL;
|
||||
ppt_idx = ATH12K_NUM_RX_SPT_PAGES + tx_spt_page;
|
||||
tx_descs[j].desc_id = ath12k_dp_cc_cookie_gen(ppt_idx, j);
|
||||
tx_descs[j].pool_id = pool_id;
|
||||
|
@ -289,6 +289,8 @@ struct ath12k_tx_desc_info {
|
||||
struct ath12k_spt_info {
|
||||
dma_addr_t paddr;
|
||||
u64 *vaddr;
|
||||
struct ath12k_rx_desc_info *rxbaddr[ATH12K_NUM_RX_SPT_PAGES];
|
||||
struct ath12k_tx_desc_info *txbaddr[ATH12K_NUM_TX_SPT_PAGES];
|
||||
};
|
||||
|
||||
struct ath12k_reo_queue_ref {
|
||||
@ -712,7 +714,7 @@ enum htt_stats_internal_ppdu_frametype {
|
||||
* b'24 - status_swap: 1 is to swap status TLV
|
||||
* b'25 - pkt_swap: 1 is to swap packet TLV
|
||||
* b'26:31 - rsvd1: reserved for future use
|
||||
* dword1 - b'0:16 - ring_buffer_size: size of bufferes referenced by rx ring,
|
||||
* dword1 - b'0:16 - ring_buffer_size: size of buffers referenced by rx ring,
|
||||
* in byte units.
|
||||
* Valid only for HW_TO_SW_RING and SW_TO_HW_RING
|
||||
* - b'16:31 - rsvd2: Reserved for future use
|
||||
|
@ -3027,7 +3027,7 @@ static int ath12k_dp_rx_h_defrag_reo_reinject(struct ath12k *ar,
|
||||
desc_info->cookie,
|
||||
HAL_RX_BUF_RBM_SW3_BM);
|
||||
|
||||
/* Fill mpdu details into reo entrace ring */
|
||||
/* Fill mpdu details into reo entrance ring */
|
||||
srng = &ab->hal.srng_list[dp->reo_reinject_ring.ring_id];
|
||||
|
||||
spin_lock_bh(&srng->lock);
|
||||
|
@ -301,7 +301,7 @@ tcl_ring_sel:
|
||||
spin_unlock_bh(&tcl_ring->lock);
|
||||
ret = -ENOMEM;
|
||||
|
||||
/* Checking for available tcl descritors in another ring in
|
||||
/* Checking for available tcl descriptors in another ring in
|
||||
* case of failure due to full tcl ring now, is better than
|
||||
* checking this ring earlier for each pkt tx.
|
||||
* Restart ring selection if some rings are not checked yet.
|
||||
|
@ -5660,7 +5660,6 @@ static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
changed_flags &= SUPPORTED_FILTERS;
|
||||
*total_flags &= SUPPORTED_FILTERS;
|
||||
ar->filter_flags = *total_flags;
|
||||
|
||||
@ -5678,8 +5677,8 @@ static void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
|
||||
"fail to set monitor filter: %d\n", ret);
|
||||
}
|
||||
ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
|
||||
"changed_flags:0x%x, total_flags:0x%x, reset_flag:%d\n",
|
||||
changed_flags, *total_flags, reset_flag);
|
||||
"total_flags:0x%x, reset_flag:%d\n",
|
||||
*total_flags, reset_flag);
|
||||
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
}
|
||||
@ -6771,7 +6770,7 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
|
||||
/* After trigger disconnect, then upper layer will
|
||||
* trigger connect again, then the PN number of
|
||||
* upper layer will be reset to keep up with AP
|
||||
* side, hence PN number mis-match will not happened.
|
||||
* side, hence PN number mismatch will not happen.
|
||||
*/
|
||||
if (arvif->is_up &&
|
||||
arvif->vdev_type == WMI_VDEV_TYPE_STA &&
|
||||
|
@ -1409,5 +1409,5 @@ static void ath12k_pci_exit(void)
|
||||
|
||||
module_exit(ath12k_pci_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11be WLAN PCIe devices");
|
||||
MODULE_DESCRIPTION("Driver support for Qualcomm Technologies PCIe 802.11be WLAN devices");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -562,8 +562,6 @@ struct qmi_wlanfw_wlan_cfg_resp_msg_v01 {
|
||||
int ath12k_qmi_firmware_start(struct ath12k_base *ab,
|
||||
u32 mode);
|
||||
void ath12k_qmi_firmware_stop(struct ath12k_base *ab);
|
||||
void ath12k_qmi_event_work(struct work_struct *work);
|
||||
void ath12k_qmi_msg_recv_work(struct work_struct *work);
|
||||
void ath12k_qmi_deinit_service(struct ath12k_base *ab);
|
||||
int ath12k_qmi_init_service(struct ath12k_base *ab);
|
||||
|
||||
|
@ -221,7 +221,7 @@ struct rx_mpdu_start_qcn9274 {
|
||||
* PPE routing even if RXOLE CCE or flow search indicate 'Use_PPE'
|
||||
* This is set by SW for peers which are being handled by a
|
||||
* host SW/accelerator subsystem that also handles packet
|
||||
* uffer management for WiFi-to-PPE routing.
|
||||
* buffer management for WiFi-to-PPE routing.
|
||||
*
|
||||
* This is cleared by SW for peers which are being handled
|
||||
* by a different subsystem, completely disabling WiFi-to-PPE
|
||||
|
@ -2239,12 +2239,6 @@ int ath12k_wmi_send_scan_start_cmd(struct ath12k *ar,
|
||||
if (arg->num_bssid)
|
||||
len += sizeof(*bssid) * arg->num_bssid;
|
||||
|
||||
len += TLV_HDR_SIZE;
|
||||
if (arg->extraie.len)
|
||||
extraie_len_with_pad =
|
||||
roundup(arg->extraie.len, sizeof(u32));
|
||||
len += extraie_len_with_pad;
|
||||
|
||||
if (arg->num_hint_bssid)
|
||||
len += TLV_HDR_SIZE +
|
||||
arg->num_hint_bssid * sizeof(*hint_bssid);
|
||||
@ -2253,6 +2247,18 @@ int ath12k_wmi_send_scan_start_cmd(struct ath12k *ar,
|
||||
len += TLV_HDR_SIZE +
|
||||
arg->num_hint_s_ssid * sizeof(*s_ssid);
|
||||
|
||||
len += TLV_HDR_SIZE;
|
||||
if (arg->extraie.len)
|
||||
extraie_len_with_pad =
|
||||
roundup(arg->extraie.len, sizeof(u32));
|
||||
if (extraie_len_with_pad <= (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len)) {
|
||||
len += extraie_len_with_pad;
|
||||
} else {
|
||||
ath12k_warn(ar->ab, "discard large size %d bytes extraie for scan start\n",
|
||||
arg->extraie.len);
|
||||
extraie_len_with_pad = 0;
|
||||
}
|
||||
|
||||
skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
@ -2342,7 +2348,7 @@ int ath12k_wmi_send_scan_start_cmd(struct ath12k *ar,
|
||||
tlv->header = ath12k_wmi_tlv_hdr(WMI_TAG_ARRAY_BYTE, len);
|
||||
ptr += TLV_HDR_SIZE;
|
||||
|
||||
if (arg->extraie.len)
|
||||
if (extraie_len_with_pad)
|
||||
memcpy(ptr, arg->extraie.ptr,
|
||||
arg->extraie.len);
|
||||
|
||||
|
@ -4855,8 +4855,6 @@ int ath12k_wmi_vdev_install_key(struct ath12k *ar,
|
||||
struct wmi_vdev_install_key_arg *arg);
|
||||
int ath12k_wmi_pdev_bss_chan_info_request(struct ath12k *ar,
|
||||
enum wmi_bss_chan_info_req_type type);
|
||||
int ath12k_wmi_send_stats_request_cmd(struct ath12k *ar, u32 stats_id,
|
||||
u32 vdev_id, u32 pdev_id);
|
||||
int ath12k_wmi_send_pdev_temperature_cmd(struct ath12k *ar);
|
||||
int ath12k_wmi_send_peer_flush_tids_cmd(struct ath12k *ar,
|
||||
u8 peer_addr[ETH_ALEN],
|
||||
|
@ -115,7 +115,6 @@ static int ath_ahb_probe(struct platform_device *pdev)
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
dev_err(&pdev->dev, "no IRQ resource found: %d\n", irq);
|
||||
ret = irq;
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
@ -382,7 +382,6 @@ ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
||||
mfilt[1] = multicast >> 32;
|
||||
|
||||
/* Only deal with supported flags */
|
||||
changed_flags &= SUPPORTED_FIF_FLAGS;
|
||||
*new_flags &= SUPPORTED_FIF_FLAGS;
|
||||
|
||||
/* If HW detects any phy or radar errors, leave those filters on.
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sort.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "ath5k.h"
|
||||
@ -1554,6 +1555,11 @@ static void ath5k_hw_update_nfcal_hist(struct ath5k_hw *ah, s16 noise_floor)
|
||||
hist->nfval[hist->index] = noise_floor;
|
||||
}
|
||||
|
||||
static int cmps16(const void *a, const void *b)
|
||||
{
|
||||
return *(s16 *)a - *(s16 *)b;
|
||||
}
|
||||
|
||||
/**
|
||||
* ath5k_hw_get_median_noise_floor() - Get median NF from history buffer
|
||||
* @ah: The &struct ath5k_hw
|
||||
@ -1561,25 +1567,16 @@ static void ath5k_hw_update_nfcal_hist(struct ath5k_hw *ah, s16 noise_floor)
|
||||
static s16
|
||||
ath5k_hw_get_median_noise_floor(struct ath5k_hw *ah)
|
||||
{
|
||||
s16 sort[ATH5K_NF_CAL_HIST_MAX];
|
||||
s16 tmp;
|
||||
int i, j;
|
||||
s16 sorted_nfval[ATH5K_NF_CAL_HIST_MAX];
|
||||
int i;
|
||||
|
||||
memcpy(sort, ah->ah_nfcal_hist.nfval, sizeof(sort));
|
||||
for (i = 0; i < ATH5K_NF_CAL_HIST_MAX - 1; i++) {
|
||||
for (j = 1; j < ATH5K_NF_CAL_HIST_MAX - i; j++) {
|
||||
if (sort[j] > sort[j - 1]) {
|
||||
tmp = sort[j];
|
||||
sort[j] = sort[j - 1];
|
||||
sort[j - 1] = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
memcpy(sorted_nfval, ah->ah_nfcal_hist.nfval, sizeof(sorted_nfval));
|
||||
sort(sorted_nfval, ATH5K_NF_CAL_HIST_MAX, sizeof(s16), cmps16, NULL);
|
||||
for (i = 0; i < ATH5K_NF_CAL_HIST_MAX; i++) {
|
||||
ATH5K_DBG(ah, ATH5K_DEBUG_CALIBRATE,
|
||||
"cal %d:%d\n", i, sort[i]);
|
||||
"cal %d:%d\n", i, sorted_nfval[i]);
|
||||
}
|
||||
return sort[(ATH5K_NF_CAL_HIST_MAX - 1) / 2];
|
||||
return sorted_nfval[(ATH5K_NF_CAL_HIST_MAX - 1) / 2];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1129,7 +1129,6 @@ void ath_restart_work(struct ath_softc *sc);
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
const struct ath_bus_ops *bus_ops);
|
||||
void ath9k_deinit_device(struct ath_softc *sc);
|
||||
void ath9k_reload_chainmask_settings(struct ath_softc *sc);
|
||||
u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate);
|
||||
void ath_start_rfkill_poll(struct ath_softc *sc);
|
||||
void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
|
||||
|
@ -855,16 +855,11 @@ static ssize_t write_file_spectral_short_repeat(struct file *file,
|
||||
{
|
||||
struct ath_spec_scan_priv *spec_priv = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val > 1)
|
||||
return -EINVAL;
|
||||
@ -903,17 +898,11 @@ static ssize_t write_file_spectral_count(struct file *file,
|
||||
{
|
||||
struct ath_spec_scan_priv *spec_priv = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ssize_t ret;
|
||||
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (val > 255)
|
||||
return -EINVAL;
|
||||
|
||||
@ -951,16 +940,11 @@ static ssize_t write_file_spectral_period(struct file *file,
|
||||
{
|
||||
struct ath_spec_scan_priv *spec_priv = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val > 255)
|
||||
return -EINVAL;
|
||||
@ -999,16 +983,11 @@ static ssize_t write_file_spectral_fft_period(struct file *file,
|
||||
{
|
||||
struct ath_spec_scan_priv *spec_priv = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val > 15)
|
||||
return -EINVAL;
|
||||
|
@ -85,8 +85,6 @@ struct ath9k_channel *ath9k_cmn_get_channel(struct ieee80211_hw *hw,
|
||||
struct ath_hw *ah,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
int ath9k_cmn_count_streams(unsigned int chainmask, int max);
|
||||
void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common,
|
||||
enum ath_stomp_type stomp_type);
|
||||
void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow,
|
||||
u16 new_txpow, u16 *txpower);
|
||||
void ath9k_cmn_init_crypto(struct ath_hw *ah);
|
||||
|
@ -96,21 +96,16 @@ static ssize_t read_file_debug(struct file *file, char __user *user_buf,
|
||||
}
|
||||
|
||||
static ssize_t write_file_debug(struct file *file, const char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
unsigned long mask;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &mask))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
common->debug_mask = mask;
|
||||
return count;
|
||||
@ -191,16 +186,11 @@ static ssize_t write_file_ani(struct file *file,
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
unsigned long ani;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &ani))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &ani);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ani > 1)
|
||||
return -EINVAL;
|
||||
@ -248,20 +238,15 @@ static ssize_t write_file_bt_ant_diversity(struct file *file,
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ath9k_hw_capabilities *pCap = &sc->sc_ah->caps;
|
||||
unsigned long bt_ant_diversity;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &bt_ant_diversity);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!(pCap->hw_caps & ATH9K_HW_CAP_BT_ANT_DIV))
|
||||
goto exit;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &bt_ant_diversity))
|
||||
return -EINVAL;
|
||||
|
||||
common->bt_ant_diversity = !!bt_ant_diversity;
|
||||
ath9k_ps_wakeup(sc);
|
||||
ath9k_hw_set_bt_ant_diversity(sc->sc_ah, common->bt_ant_diversity);
|
||||
@ -792,16 +777,11 @@ static ssize_t write_file_reset(struct file *file,
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val != 1)
|
||||
return -EINVAL;
|
||||
@ -886,16 +866,11 @@ static ssize_t write_file_regidx(struct file *file, const char __user *user_buf,
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
unsigned long regidx;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, ®idx))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, ®idx);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sc->debug.regidx = regidx;
|
||||
return count;
|
||||
@ -931,16 +906,11 @@ static ssize_t write_file_regval(struct file *file, const char __user *user_buf,
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
unsigned long regval;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, ®val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, ®val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
REG_WRITE_D(ah, sc->debug.regidx, regval);
|
||||
@ -1128,16 +1098,11 @@ static ssize_t write_file_wow(struct file *file, const char __user *user_buf,
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val != 1)
|
||||
return -EINVAL;
|
||||
@ -1191,17 +1156,12 @@ static ssize_t write_file_tpc(struct file *file, const char __user *user_buf,
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
bool tpc_enabled;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val > 1)
|
||||
return -EINVAL;
|
||||
@ -1420,7 +1380,7 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
|
||||
sc->debug.debugfs_phy = debugfs_create_dir("ath9k",
|
||||
sc->hw->wiphy->debugfsdir);
|
||||
if (!sc->debug.debugfs_phy)
|
||||
if (IS_ERR(sc->debug.debugfs_phy))
|
||||
return -ENOMEM;
|
||||
|
||||
#ifdef CONFIG_ATH_DEBUG
|
||||
|
@ -99,17 +99,11 @@ static ssize_t write_file_dfs(struct file *file, const char __user *user_buf,
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
unsigned long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
ssize_t ret;
|
||||
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (val == DFS_STATS_RESET_MAGIC)
|
||||
memset(&sc->debug.stats.dfs_stats, 0,
|
||||
sizeof(sc->debug.stats.dfs_stats));
|
||||
|
@ -572,8 +572,7 @@ static void ath9k_hw_set_ar9287_power_per_rate_table(struct ath_hw *ah,
|
||||
}
|
||||
|
||||
for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) {
|
||||
bool isHt40CtlMode =
|
||||
(pCtlMode[ctlMode] == CTL_2GHT40) ? true : false;
|
||||
bool isHt40CtlMode = pCtlMode[ctlMode] == CTL_2GHT40;
|
||||
|
||||
if (isHt40CtlMode)
|
||||
freq = centers.synth_center;
|
||||
|
@ -1432,7 +1432,7 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(interface);
|
||||
struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
|
||||
bool unplugged = (udev->state == USB_STATE_NOTATTACHED) ? true : false;
|
||||
bool unplugged = udev->state == USB_STATE_NOTATTACHED;
|
||||
|
||||
if (!hif_dev)
|
||||
return;
|
||||
|
@ -375,16 +375,11 @@ static ssize_t write_file_debug(struct file *file, const char __user *user_buf,
|
||||
struct ath9k_htc_priv *priv = file->private_data;
|
||||
struct ath_common *common = ath9k_hw_common(priv->ah);
|
||||
unsigned long mask;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (kstrtoul(buf, 0, &mask))
|
||||
return -EINVAL;
|
||||
ret = kstrtoul_from_user(user_buf, count, 0, &mask);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
common->debug_mask = mask;
|
||||
return count;
|
||||
@ -491,7 +486,7 @@ int ath9k_htc_init_debug(struct ath_hw *ah)
|
||||
|
||||
priv->debug.debugfs_phy = debugfs_create_dir(KBUILD_MODNAME,
|
||||
priv->hw->wiphy->debugfsdir);
|
||||
if (!priv->debug.debugfs_phy)
|
||||
if (IS_ERR(priv->debug.debugfs_phy))
|
||||
return -ENOMEM;
|
||||
|
||||
ath9k_cmn_spectral_init_debug(&priv->spec_priv, priv->debug.debugfs_phy);
|
||||
|
@ -719,7 +719,7 @@ static int ath9k_htc_tx_aggr_oper(struct ath9k_htc_priv *priv,
|
||||
|
||||
aggr.sta_index = ista->index;
|
||||
aggr.tidno = tid & 0xf;
|
||||
aggr.aggr_enable = (action == IEEE80211_AMPDU_TX_START) ? true : false;
|
||||
aggr.aggr_enable = action == IEEE80211_AMPDU_TX_START;
|
||||
|
||||
WMI_CMD_BUF(WMI_TX_AGGR_ENABLE_CMDID, &aggr);
|
||||
if (ret)
|
||||
@ -1264,7 +1264,6 @@ static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
|
||||
u32 rfilt;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
changed_flags &= SUPPORTED_FILTERS;
|
||||
*total_flags &= SUPPORTED_FILTERS;
|
||||
|
||||
if (test_bit(ATH_OP_INVALID, &common->op_flags)) {
|
||||
|
@ -1571,7 +1571,6 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,
|
||||
struct ath_chanctx *ctx;
|
||||
u32 rfilt;
|
||||
|
||||
changed_flags &= SUPPORTED_FILTERS;
|
||||
*total_flags &= SUPPORTED_FILTERS;
|
||||
|
||||
spin_lock_bh(&sc->chan_lock);
|
||||
|
@ -172,9 +172,8 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
char buf[32];
|
||||
bool start;
|
||||
ssize_t len;
|
||||
ssize_t ret;
|
||||
int r;
|
||||
|
||||
if (count < 1)
|
||||
@ -183,14 +182,9 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
|
||||
if (sc->cur_chan->nvifs > 1)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
|
||||
if (kstrtobool(buf, &start))
|
||||
return -EINVAL;
|
||||
ret = kstrtobool_from_user(user_buf, count, &start);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&sc->mutex);
|
||||
|
||||
|
@ -242,10 +242,10 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
|
||||
spin_unlock_irqrestore(&wmi->wmi_lock, flags);
|
||||
goto free_skb;
|
||||
}
|
||||
spin_unlock_irqrestore(&wmi->wmi_lock, flags);
|
||||
|
||||
/* WMI command response */
|
||||
ath9k_wmi_rsp_callback(wmi, skb);
|
||||
spin_unlock_irqrestore(&wmi->wmi_lock, flags);
|
||||
|
||||
free_skb:
|
||||
kfree_skb(skb);
|
||||
@ -283,7 +283,8 @@ int ath9k_wmi_connect(struct htc_target *htc, struct wmi *wmi,
|
||||
|
||||
static int ath9k_wmi_cmd_issue(struct wmi *wmi,
|
||||
struct sk_buff *skb,
|
||||
enum wmi_cmd_id cmd, u16 len)
|
||||
enum wmi_cmd_id cmd, u16 len,
|
||||
u8 *rsp_buf, u32 rsp_len)
|
||||
{
|
||||
struct wmi_cmd_hdr *hdr;
|
||||
unsigned long flags;
|
||||
@ -293,6 +294,11 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
|
||||
hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
|
||||
|
||||
spin_lock_irqsave(&wmi->wmi_lock, flags);
|
||||
|
||||
/* record the rsp buffer and length */
|
||||
wmi->cmd_rsp_buf = rsp_buf;
|
||||
wmi->cmd_rsp_len = rsp_len;
|
||||
|
||||
wmi->last_seq_id = wmi->tx_seq_id;
|
||||
spin_unlock_irqrestore(&wmi->wmi_lock, flags);
|
||||
|
||||
@ -308,8 +314,8 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
u16 headroom = sizeof(struct htc_frame_hdr) +
|
||||
sizeof(struct wmi_cmd_hdr);
|
||||
unsigned long time_left, flags;
|
||||
struct sk_buff *skb;
|
||||
unsigned long time_left;
|
||||
int ret = 0;
|
||||
|
||||
if (ah->ah_flags & AH_UNPLUGGED)
|
||||
@ -333,11 +339,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* record the rsp buffer and length */
|
||||
wmi->cmd_rsp_buf = rsp_buf;
|
||||
wmi->cmd_rsp_len = rsp_len;
|
||||
|
||||
ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
|
||||
ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len, rsp_buf, rsp_len);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
@ -345,7 +347,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
|
||||
if (!time_left) {
|
||||
ath_dbg(common, WMI, "Timeout waiting for WMI command: %s\n",
|
||||
wmi_cmd_to_name(cmd_id));
|
||||
spin_lock_irqsave(&wmi->wmi_lock, flags);
|
||||
wmi->last_seq_id = 0;
|
||||
spin_unlock_irqrestore(&wmi->wmi_lock, flags);
|
||||
mutex_unlock(&wmi->op_mutex);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac)
|
||||
* Not setting this bit allows the hardware to use the key
|
||||
* for multicast frame decryption.
|
||||
*/
|
||||
if (mac[0] & 0x01)
|
||||
if (is_multicast_ether_addr(mac))
|
||||
unicast_flag = 0;
|
||||
|
||||
macLo = get_unaligned_le32(mac);
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Copyright (c) 2007 Kalle Valo <kalle.valo@iki.fi>
|
||||
* Copyright (c) 2010 Sebastian Smolorz <sesmo@gmx.net>
|
||||
*
|
||||
* This file is part of the Berlios driver for WLAN USB devices based on the
|
||||
* This file is part of the Berlios driver for USB WLAN devices based on the
|
||||
* Atmel AT76C503A/505/505A.
|
||||
*
|
||||
* Some iw_handler code was taken from airo.c, (C) 1999 Benjamin Reed
|
||||
@ -143,7 +143,7 @@ static const struct usb_device_id dev_table[] = {
|
||||
{ USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
||||
/* Dynalink/Askey WLL013 (intersil) */
|
||||
{ USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
||||
/* EZ connect 11Mpbs Wireless USB Adapter SMC2662W v1 */
|
||||
/* EZ connect 11Mpbs USB Wireless Adapter SMC2662W v1 */
|
||||
{ USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
||||
/* BenQ AWL300 */
|
||||
{ USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861) },
|
||||
@ -195,7 +195,7 @@ static const struct usb_device_id dev_table[] = {
|
||||
{ USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503) },
|
||||
/* 3Com 3CRSHEW696 */
|
||||
{ USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503) },
|
||||
/* Siemens Santis ADSL WLAN USB adapter WLL 013 */
|
||||
/* Siemens Santis ADSL USB WLAN adapter WLL 013 */
|
||||
{ USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503) },
|
||||
/* Belkin F5D6050, version 2 */
|
||||
{ USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503) },
|
||||
@ -238,7 +238,7 @@ static const struct usb_device_id dev_table[] = {
|
||||
{ USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958) },
|
||||
/* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */
|
||||
{ USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958) },
|
||||
/* Corega WLAN USB Stick 11 */
|
||||
/* Corega USB WLAN Stick 11 */
|
||||
{ USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
|
||||
/* Microstar MSI Box MS6978 */
|
||||
{ USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958) },
|
||||
|
@ -1176,23 +1176,20 @@ static ssize_t debug_level_show(struct device_driver *d, char *buf)
|
||||
static ssize_t debug_level_store(struct device_driver *d, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
char *p = (char *)buf;
|
||||
u32 val;
|
||||
unsigned long val;
|
||||
|
||||
if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
|
||||
p++;
|
||||
if (p[0] == 'x' || p[0] == 'X')
|
||||
p++;
|
||||
val = simple_strtoul(p, &p, 16);
|
||||
} else
|
||||
val = simple_strtoul(p, &p, 10);
|
||||
if (p == buf)
|
||||
int result = kstrtoul(buf, 0, &val);
|
||||
|
||||
if (result == -EINVAL)
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s is not in hex or decimal form.\n", buf);
|
||||
else if (result == -ERANGE)
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s has overflowed.\n", buf);
|
||||
else
|
||||
ipw_debug_level = val;
|
||||
|
||||
return strnlen(buf, count);
|
||||
return count;
|
||||
}
|
||||
static DRIVER_ATTR_RW(debug_level);
|
||||
|
||||
@ -1461,25 +1458,13 @@ static ssize_t scan_age_store(struct device *d, struct device_attribute *attr,
|
||||
{
|
||||
struct ipw_priv *priv = dev_get_drvdata(d);
|
||||
struct net_device *dev = priv->net_dev;
|
||||
char buffer[] = "00000000";
|
||||
unsigned long len =
|
||||
(sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
|
||||
unsigned long val;
|
||||
char *p = buffer;
|
||||
|
||||
IPW_DEBUG_INFO("enter\n");
|
||||
|
||||
strncpy(buffer, buf, len);
|
||||
buffer[len] = 0;
|
||||
unsigned long val;
|
||||
int result = kstrtoul(buf, 0, &val);
|
||||
|
||||
if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
|
||||
p++;
|
||||
if (p[0] == 'x' || p[0] == 'X')
|
||||
p++;
|
||||
val = simple_strtoul(p, &p, 16);
|
||||
} else
|
||||
val = simple_strtoul(p, &p, 10);
|
||||
if (p == buffer) {
|
||||
if (result == -EINVAL || result == -ERANGE) {
|
||||
IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
|
||||
} else {
|
||||
priv->ieee->scan_age = val;
|
||||
@ -1487,7 +1472,7 @@ static ssize_t scan_age_store(struct device *d, struct device_attribute *attr,
|
||||
}
|
||||
|
||||
IPW_DEBUG_INFO("exit\n");
|
||||
return len;
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(scan_age);
|
||||
|
@ -69,6 +69,11 @@ static const struct dmi_system_id dmi_ppag_approved_list[] = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
|
||||
},
|
||||
},
|
||||
{ .ident = "RAZER",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Razer"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -29,6 +29,11 @@ enum iwl_debug_cmds {
|
||||
* &struct iwl_dbg_host_event_cfg_cmd
|
||||
*/
|
||||
HOST_EVENT_CFG = 0x3,
|
||||
/**
|
||||
* @INVALID_WR_PTR_CMD: invalid write pointer, set in the TFD
|
||||
* when it's not in use
|
||||
*/
|
||||
INVALID_WR_PTR_CMD = 0x6,
|
||||
/**
|
||||
* @DBGC_SUSPEND_RESUME:
|
||||
* DBGC suspend/resume commad. Uses a single dword as data:
|
||||
@ -377,7 +382,7 @@ struct iwl_buf_alloc_cmd {
|
||||
#define DRAM_INFO_SECOND_MAGIC_WORD 0x89ABCDEF
|
||||
|
||||
/**
|
||||
* struct iwL_dram_info - DRAM fragments allocation struct
|
||||
* struct iwl_dram_info - DRAM fragments allocation struct
|
||||
*
|
||||
* Driver will fill in the first 1K(+) of the pointed DRAM fragment
|
||||
*
|
||||
|
@ -182,8 +182,7 @@ static void iwl_fwrt_dump_lmac_error_log(struct iwl_fw_runtime *fwrt, u8 lmac_nu
|
||||
base = fwrt->fw->inst_errlog_ptr;
|
||||
}
|
||||
|
||||
if ((fwrt->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ && !base) ||
|
||||
(fwrt->trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_BZ && base < 0x400000)) {
|
||||
if (!base) {
|
||||
IWL_ERR(fwrt,
|
||||
"Not valid error log pointer 0x%08X for %s uCode\n",
|
||||
base,
|
||||
|
@ -565,6 +565,8 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(struct iwl_trans *trans,
|
||||
#define RX_QUEUE_MASK 255
|
||||
#define RX_QUEUE_SIZE_LOG 8
|
||||
|
||||
#define IWL_DEFAULT_RX_QUEUE 0
|
||||
|
||||
/**
|
||||
* struct iwl_rb_status - reserve buffer status
|
||||
* host memory mapped FH registers
|
||||
|
@ -990,6 +990,8 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
|
||||
case IWL_CFG_RF_TYPE_GF:
|
||||
case IWL_CFG_RF_TYPE_MR:
|
||||
case IWL_CFG_RF_TYPE_MS:
|
||||
case IWL_CFG_RF_TYPE_FM:
|
||||
case IWL_CFG_RF_TYPE_WH:
|
||||
iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
|
||||
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
|
||||
if (!is_ap)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -1069,6 +1069,7 @@ struct iwl_trans_txqs {
|
||||
* @mbx_addr_1_step: step address data 1
|
||||
* @pcie_link_speed: current PCIe link speed (%PCI_EXP_LNKSTA_CLS_*),
|
||||
* only valid for discrete (not integrated) NICs
|
||||
* @invalid_tx_cmd: invalid TX command buffer
|
||||
*/
|
||||
struct iwl_trans {
|
||||
bool csme_own;
|
||||
@ -1133,6 +1134,8 @@ struct iwl_trans {
|
||||
|
||||
u8 pcie_link_speed;
|
||||
|
||||
struct iwl_dma_ptr invalid_tx_cmd;
|
||||
|
||||
/* pointer to trans specific struct */
|
||||
/*Ensure that this pointer will always be aligned to sizeof pointer */
|
||||
char trans_specific[] __aligned(sizeof(void *));
|
||||
@ -1490,7 +1493,7 @@ static inline u32 iwl_trans_read_mem32(struct iwl_trans *trans, u32 addr)
|
||||
{
|
||||
u32 value;
|
||||
|
||||
if (WARN_ON(iwl_trans_read_mem(trans, addr, &value, 1)))
|
||||
if (iwl_trans_read_mem(trans, addr, &value, 1))
|
||||
return 0xa5a5a5a5;
|
||||
|
||||
return value;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2021-2022 Intel Corporation
|
||||
* Copyright (C) 2021-2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
@ -774,9 +774,13 @@ static void iwl_mei_set_init_conf(struct iwl_mei *mei)
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &sar_msg.hdr);
|
||||
}
|
||||
|
||||
ether_addr_copy(nic_info_msg.mac_address, iwl_mei_cache.mac_address);
|
||||
ether_addr_copy(nic_info_msg.nvm_address, iwl_mei_cache.nvm_address);
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &nic_info_msg.hdr);
|
||||
if (is_valid_ether_addr(iwl_mei_cache.mac_address)) {
|
||||
ether_addr_copy(nic_info_msg.mac_address,
|
||||
iwl_mei_cache.mac_address);
|
||||
ether_addr_copy(nic_info_msg.nvm_address,
|
||||
iwl_mei_cache.nvm_address);
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &nic_info_msg.hdr);
|
||||
}
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &rfkill_msg.hdr);
|
||||
}
|
||||
@ -1532,7 +1536,7 @@ void iwl_mei_host_associated(const struct iwl_mei_conn_info *conn_info,
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
|
||||
@ -1561,7 +1565,7 @@ void iwl_mei_host_disassociated(void)
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
|
||||
@ -1597,7 +1601,7 @@ void iwl_mei_set_rfkill_state(bool hw_rfkill, bool sw_rfkill)
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
|
||||
@ -1626,7 +1630,7 @@ void iwl_mei_set_nic_info(const u8 *mac_address, const u8 *nvm_address)
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
|
||||
@ -1654,7 +1658,7 @@ void iwl_mei_set_country_code(u16 mcc)
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
iwl_mei_send_sap_msg_payload(mei->cldev, &msg.hdr);
|
||||
@ -1680,7 +1684,7 @@ void iwl_mei_set_power_limit(const __le16 *power_limit)
|
||||
|
||||
mei = mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
if (!mei && !mei->amt_enabled)
|
||||
if (!mei || !mei->amt_enabled)
|
||||
goto out;
|
||||
|
||||
memcpy(msg.sar_chain_info_table, power_limit, sizeof(msg.sar_chain_info_table));
|
||||
@ -1832,7 +1836,9 @@ void iwl_mei_unregister_complete(void)
|
||||
struct iwl_mei *mei =
|
||||
mei_cldev_get_drvdata(iwl_mei_global_cldev);
|
||||
|
||||
iwl_mei_send_sap_msg(mei->cldev, SAP_MSG_NOTIF_WIFIDR_DOWN);
|
||||
if (mei->amt_enabled)
|
||||
iwl_mei_send_sap_msg(mei->cldev,
|
||||
SAP_MSG_NOTIF_WIFIDR_DOWN);
|
||||
mei->got_ownership = false;
|
||||
}
|
||||
|
||||
@ -2070,33 +2076,29 @@ static void iwl_mei_remove(struct mei_cl_device *cldev)
|
||||
|
||||
mutex_lock(&iwl_mei_mutex);
|
||||
|
||||
if (mei->amt_enabled) {
|
||||
/*
|
||||
* Tell CSME that we are going down so that it won't access the
|
||||
* memory anymore, make sure this message goes through immediately.
|
||||
*/
|
||||
mei->csa_throttled = false;
|
||||
iwl_mei_send_sap_msg(mei->cldev,
|
||||
SAP_MSG_NOTIF_HOST_GOES_DOWN);
|
||||
/* Tell CSME that we are going down so that it won't access the
|
||||
* memory anymore, make sure this message goes through immediately.
|
||||
*/
|
||||
mei->csa_throttled = false;
|
||||
iwl_mei_send_sap_msg(mei->cldev,
|
||||
SAP_MSG_NOTIF_HOST_GOES_DOWN);
|
||||
|
||||
for (i = 0; i < SEND_SAP_MAX_WAIT_ITERATION; i++) {
|
||||
if (!iwl_mei_host_to_me_data_pending(mei))
|
||||
break;
|
||||
for (i = 0; i < SEND_SAP_MAX_WAIT_ITERATION; i++) {
|
||||
if (!iwl_mei_host_to_me_data_pending(mei))
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we couldn't make sure that CSME saw the HOST_GOES_DOWN
|
||||
* message, it means that it will probably keep reading memory
|
||||
* that we are going to unmap and free, expect IOMMU error
|
||||
* messages.
|
||||
*/
|
||||
if (i == SEND_SAP_MAX_WAIT_ITERATION)
|
||||
dev_err(&mei->cldev->dev,
|
||||
"Couldn't get ACK from CSME on HOST_GOES_DOWN message\n");
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
/* If we couldn't make sure that CSME saw the HOST_GOES_DOWN
|
||||
* message, it means that it will probably keep reading memory
|
||||
* that we are going to unmap and free, expect IOMMU error
|
||||
* messages.
|
||||
*/
|
||||
if (i == SEND_SAP_MAX_WAIT_ITERATION)
|
||||
dev_err(&mei->cldev->dev,
|
||||
"Couldn't get ACK from CSME on HOST_GOES_DOWN message\n");
|
||||
|
||||
mutex_unlock(&iwl_mei_mutex);
|
||||
|
||||
/*
|
||||
|
@ -315,8 +315,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
||||
ieee80211_hw_set(hw, STA_MMPDU_TXQ);
|
||||
|
||||
/* Set this early since we need to have it for the check below */
|
||||
if (mvm->mld_api_is_used &&
|
||||
mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_BZ)
|
||||
if (mvm->mld_api_is_used && mvm->nvm_data->sku_cap_11be_enable &&
|
||||
!iwlwifi_mod_params.disable_11ax &&
|
||||
!iwlwifi_mod_params.disable_11be)
|
||||
hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
|
||||
|
||||
/* With MLD FW API, it tracks timing by itself,
|
||||
@ -5604,9 +5605,6 @@ void iwl_mvm_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
return;
|
||||
}
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
/* Make sure we're done with the deferred traffic before flushing */
|
||||
flush_work(&mvm->add_stream_wk);
|
||||
|
||||
@ -5630,9 +5628,6 @@ void iwl_mvm_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
ap_sta_done = true;
|
||||
}
|
||||
|
||||
/* make sure only TDLS peers or the AP are flushed */
|
||||
WARN_ON_ONCE(sta != mvmvif->ap_sta && !sta->tdls);
|
||||
|
||||
if (drop) {
|
||||
if (iwl_mvm_flush_sta(mvm, mvmsta, false))
|
||||
IWL_ERR(mvm, "flush request fail\n");
|
||||
|
@ -1132,12 +1132,6 @@ static int get_crf_id(struct iwl_trans *iwl_trans)
|
||||
else
|
||||
sd_reg_ver_addr = SD_REG_VER;
|
||||
|
||||
if (!iwl_trans_grab_nic_access(iwl_trans)) {
|
||||
IWL_ERR(iwl_trans, "Failed to grab nic access before reading crf id\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Enable access to peripheral registers */
|
||||
val = iwl_read_umac_prph_no_grab(iwl_trans, WFPM_CTRL_REG);
|
||||
val |= ENABLE_WFPM;
|
||||
@ -1157,9 +1151,6 @@ static int get_crf_id(struct iwl_trans *iwl_trans)
|
||||
iwl_trans->hw_crf_id, iwl_trans->hw_cnv_id,
|
||||
iwl_trans->hw_wfpm_id);
|
||||
|
||||
iwl_trans_release_nic_access(iwl_trans);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1351,6 +1342,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (ret)
|
||||
goto out_free_trans;
|
||||
if (iwl_trans_grab_nic_access(iwl_trans)) {
|
||||
get_crf_id(iwl_trans);
|
||||
/* all good */
|
||||
iwl_trans_release_nic_access(iwl_trans);
|
||||
} else {
|
||||
@ -1360,7 +1352,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
}
|
||||
|
||||
iwl_trans->hw_rf_id = iwl_read32(iwl_trans, CSR_HW_RF_ID);
|
||||
get_crf_id(iwl_trans);
|
||||
|
||||
/*
|
||||
* The RF_ID is set to zero in blank OTP so read version to
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2003-2015, 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2003-2015, 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2016-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -315,7 +315,6 @@ enum iwl_pcie_imr_status {
|
||||
* @ucode_write_complete: indicates that the ucode has been copied.
|
||||
* @ucode_write_waitq: wait queue for uCode load
|
||||
* @cmd_queue - command queue number
|
||||
* @def_rx_queue - default rx queue number
|
||||
* @rx_buf_size: Rx buffer size
|
||||
* @scd_set_active: should the transport configure the SCD for HCMD queue
|
||||
* @rx_page_order: page order for receive buffer size
|
||||
@ -398,7 +397,6 @@ struct iwl_trans_pcie {
|
||||
wait_queue_head_t ucode_write_waitq;
|
||||
wait_queue_head_t sx_waitq;
|
||||
|
||||
u8 def_rx_queue;
|
||||
u8 n_no_reclaim_cmds;
|
||||
u8 no_reclaim_cmds[MAX_NO_RECLAIM_CMDS];
|
||||
u16 num_rx_bufs;
|
||||
|
@ -1373,7 +1373,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
|
||||
}
|
||||
}
|
||||
|
||||
if (rxq->id == trans_pcie->def_rx_queue)
|
||||
if (rxq->id == IWL_DEFAULT_RX_QUEUE)
|
||||
iwl_op_mode_rx(trans->op_mode, &rxq->napi,
|
||||
&rxcb);
|
||||
else
|
||||
|
@ -2018,6 +2018,30 @@ void iwl_trans_pcie_free_pnvm_dram_regions(struct iwl_dram_regions *dram_regions
|
||||
memset(desc_dram, 0, sizeof(*desc_dram));
|
||||
}
|
||||
|
||||
static void iwl_pcie_free_invalid_tx_cmd(struct iwl_trans *trans)
|
||||
{
|
||||
iwl_pcie_free_dma_ptr(trans, &trans->invalid_tx_cmd);
|
||||
}
|
||||
|
||||
static int iwl_pcie_alloc_invalid_tx_cmd(struct iwl_trans *trans)
|
||||
{
|
||||
struct iwl_cmd_header_wide bad_cmd = {
|
||||
.cmd = INVALID_WR_PTR_CMD,
|
||||
.group_id = DEBUG_GROUP,
|
||||
.sequence = cpu_to_le16(0xffff),
|
||||
.length = cpu_to_le16(0),
|
||||
.version = 0,
|
||||
};
|
||||
int ret;
|
||||
|
||||
ret = iwl_pcie_alloc_dma_ptr(trans, &trans->invalid_tx_cmd,
|
||||
sizeof(bad_cmd));
|
||||
if (ret)
|
||||
return ret;
|
||||
memcpy(trans->invalid_tx_cmd.addr, &bad_cmd, sizeof(bad_cmd));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void iwl_trans_pcie_free(struct iwl_trans *trans)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
@ -2048,6 +2072,8 @@ void iwl_trans_pcie_free(struct iwl_trans *trans)
|
||||
iwl_pcie_free_ict(trans);
|
||||
}
|
||||
|
||||
iwl_pcie_free_invalid_tx_cmd(trans);
|
||||
|
||||
iwl_pcie_free_fw_monitor(trans);
|
||||
|
||||
iwl_trans_pcie_free_pnvm_dram_regions(&trans_pcie->pnvm_data,
|
||||
@ -3617,8 +3643,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||
PCIE_LINK_STATE_CLKPM);
|
||||
}
|
||||
|
||||
trans_pcie->def_rx_queue = 0;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
addr_size = trans->txqs.tfd.addr_size;
|
||||
@ -3686,6 +3710,9 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||
|
||||
init_waitqueue_head(&trans_pcie->sx_waitq);
|
||||
|
||||
ret = iwl_pcie_alloc_invalid_tx_cmd(trans);
|
||||
if (ret)
|
||||
goto out_no_pci;
|
||||
|
||||
if (trans_pcie->msix_enabled) {
|
||||
ret = iwl_pcie_init_msix_handler(pdev, trans_pcie);
|
||||
|
@ -132,22 +132,6 @@ void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void iwl_pcie_tfd_set_tb(struct iwl_trans *trans, void *tfd,
|
||||
u8 idx, dma_addr_t addr, u16 len)
|
||||
{
|
||||
struct iwl_tfd *tfd_fh = (void *)tfd;
|
||||
struct iwl_tfd_tb *tb = &tfd_fh->tbs[idx];
|
||||
|
||||
u16 hi_n_len = len << 4;
|
||||
|
||||
put_unaligned_le32(addr, &tb->lo);
|
||||
hi_n_len |= iwl_get_dma_hi_addr(addr);
|
||||
|
||||
tb->hi_n_len = cpu_to_le16(hi_n_len);
|
||||
|
||||
tfd_fh->num_tbs = idx + 1;
|
||||
}
|
||||
|
||||
static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq,
|
||||
dma_addr_t addr, u16 len, bool reset)
|
||||
{
|
||||
@ -172,7 +156,7 @@ static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq,
|
||||
"Unaligned address = %llx\n", (unsigned long long)addr))
|
||||
return -EINVAL;
|
||||
|
||||
iwl_pcie_tfd_set_tb(trans, tfd, num_tbs, addr, len);
|
||||
iwl_pcie_gen1_tfd_set_tb(trans, tfd, num_tbs, addr, len);
|
||||
|
||||
return num_tbs;
|
||||
}
|
||||
@ -1203,7 +1187,11 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
|
||||
group_id = cmd->hdr.group_id;
|
||||
cmd_id = WIDE_ID(group_id, cmd->hdr.cmd);
|
||||
|
||||
iwl_txq_gen1_tfd_unmap(trans, meta, txq, index);
|
||||
if (trans->trans_cfg->gen2)
|
||||
iwl_txq_gen2_tfd_unmap(trans, meta,
|
||||
iwl_txq_get_tfd(trans, txq, index));
|
||||
else
|
||||
iwl_txq_gen1_tfd_unmap(trans, meta, txq, index);
|
||||
|
||||
/* Input error checking is done when commands are added to queue. */
|
||||
if (meta->flags & CMD_WANT_SKB) {
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "fw/api/commands.h"
|
||||
#include "fw/api/tx.h"
|
||||
#include "fw/api/datapath.h"
|
||||
#include "fw/api/debug.h"
|
||||
#include "queue/tx.h"
|
||||
#include "iwl-fh.h"
|
||||
#include "iwl-scd.h"
|
||||
@ -84,6 +85,50 @@ static u8 iwl_txq_gen2_get_num_tbs(struct iwl_trans *trans,
|
||||
return le16_to_cpu(tfd->num_tbs) & 0x1f;
|
||||
}
|
||||
|
||||
int iwl_txq_gen2_set_tb(struct iwl_trans *trans, struct iwl_tfh_tfd *tfd,
|
||||
dma_addr_t addr, u16 len)
|
||||
{
|
||||
int idx = iwl_txq_gen2_get_num_tbs(trans, tfd);
|
||||
struct iwl_tfh_tb *tb;
|
||||
|
||||
/* Only WARN here so we know about the issue, but we mess up our
|
||||
* unmap path because not every place currently checks for errors
|
||||
* returned from this function - it can only return an error if
|
||||
* there's no more space, and so when we know there is enough we
|
||||
* don't always check ...
|
||||
*/
|
||||
WARN(iwl_txq_crosses_4g_boundary(addr, len),
|
||||
"possible DMA problem with iova:0x%llx, len:%d\n",
|
||||
(unsigned long long)addr, len);
|
||||
|
||||
if (WARN_ON(idx >= IWL_TFH_NUM_TBS))
|
||||
return -EINVAL;
|
||||
tb = &tfd->tbs[idx];
|
||||
|
||||
/* Each TFD can point to a maximum max_tbs Tx buffers */
|
||||
if (le16_to_cpu(tfd->num_tbs) >= trans->txqs.tfd.max_tbs) {
|
||||
IWL_ERR(trans, "Error can not send more than %d chunks\n",
|
||||
trans->txqs.tfd.max_tbs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
put_unaligned_le64(addr, &tb->addr);
|
||||
tb->tb_len = cpu_to_le16(len);
|
||||
|
||||
tfd->num_tbs = cpu_to_le16(idx + 1);
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static void iwl_txq_set_tfd_invalid_gen2(struct iwl_trans *trans,
|
||||
struct iwl_tfh_tfd *tfd)
|
||||
{
|
||||
tfd->num_tbs = 0;
|
||||
|
||||
iwl_txq_gen2_set_tb(trans, tfd, trans->invalid_tx_cmd.dma,
|
||||
trans->invalid_tx_cmd.size);
|
||||
}
|
||||
|
||||
void iwl_txq_gen2_tfd_unmap(struct iwl_trans *trans, struct iwl_cmd_meta *meta,
|
||||
struct iwl_tfh_tfd *tfd)
|
||||
{
|
||||
@ -111,7 +156,7 @@ void iwl_txq_gen2_tfd_unmap(struct iwl_trans *trans, struct iwl_cmd_meta *meta,
|
||||
DMA_TO_DEVICE);
|
||||
}
|
||||
|
||||
tfd->num_tbs = 0;
|
||||
iwl_txq_set_tfd_invalid_gen2(trans, tfd);
|
||||
}
|
||||
|
||||
void iwl_txq_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq)
|
||||
@ -142,42 +187,6 @@ void iwl_txq_gen2_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq)
|
||||
}
|
||||
}
|
||||
|
||||
int iwl_txq_gen2_set_tb(struct iwl_trans *trans, struct iwl_tfh_tfd *tfd,
|
||||
dma_addr_t addr, u16 len)
|
||||
{
|
||||
int idx = iwl_txq_gen2_get_num_tbs(trans, tfd);
|
||||
struct iwl_tfh_tb *tb;
|
||||
|
||||
/*
|
||||
* Only WARN here so we know about the issue, but we mess up our
|
||||
* unmap path because not every place currently checks for errors
|
||||
* returned from this function - it can only return an error if
|
||||
* there's no more space, and so when we know there is enough we
|
||||
* don't always check ...
|
||||
*/
|
||||
WARN(iwl_txq_crosses_4g_boundary(addr, len),
|
||||
"possible DMA problem with iova:0x%llx, len:%d\n",
|
||||
(unsigned long long)addr, len);
|
||||
|
||||
if (WARN_ON(idx >= IWL_TFH_NUM_TBS))
|
||||
return -EINVAL;
|
||||
tb = &tfd->tbs[idx];
|
||||
|
||||
/* Each TFD can point to a maximum max_tbs Tx buffers */
|
||||
if (le16_to_cpu(tfd->num_tbs) >= trans->txqs.tfd.max_tbs) {
|
||||
IWL_ERR(trans, "Error can not send more than %d chunks\n",
|
||||
trans->txqs.tfd.max_tbs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
put_unaligned_le64(addr, &tb->addr);
|
||||
tb->tb_len = cpu_to_le16(len);
|
||||
|
||||
tfd->num_tbs = cpu_to_le16(idx + 1);
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static struct page *get_workaround_page(struct iwl_trans *trans,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
@ -1026,11 +1035,21 @@ static void iwl_txq_stuck_timer(struct timer_list *t)
|
||||
iwl_force_nmi(trans);
|
||||
}
|
||||
|
||||
static void iwl_txq_set_tfd_invalid_gen1(struct iwl_trans *trans,
|
||||
struct iwl_tfd *tfd)
|
||||
{
|
||||
tfd->num_tbs = 0;
|
||||
|
||||
iwl_pcie_gen1_tfd_set_tb(trans, tfd, 0, trans->invalid_tx_cmd.dma,
|
||||
trans->invalid_tx_cmd.size);
|
||||
}
|
||||
|
||||
int iwl_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, int slots_num,
|
||||
bool cmd_queue)
|
||||
{
|
||||
size_t tfd_sz = trans->txqs.tfd.size *
|
||||
trans->trans_cfg->base_params->max_tfd_queue_size;
|
||||
size_t num_entries = trans->trans_cfg->gen2 ?
|
||||
slots_num : trans->trans_cfg->base_params->max_tfd_queue_size;
|
||||
size_t tfd_sz;
|
||||
size_t tb0_buf_sz;
|
||||
int i;
|
||||
|
||||
@ -1040,8 +1059,7 @@ int iwl_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, int slots_num,
|
||||
if (WARN_ON(txq->entries || txq->tfds))
|
||||
return -EINVAL;
|
||||
|
||||
if (trans->trans_cfg->gen2)
|
||||
tfd_sz = trans->txqs.tfd.size * slots_num;
|
||||
tfd_sz = trans->txqs.tfd.size * num_entries;
|
||||
|
||||
timer_setup(&txq->stuck_timer, iwl_txq_stuck_timer, 0);
|
||||
txq->trans = trans;
|
||||
@ -1081,6 +1099,15 @@ int iwl_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, int slots_num,
|
||||
if (!txq->first_tb_bufs)
|
||||
goto err_free_tfds;
|
||||
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
void *tfd = iwl_txq_get_tfd(trans, txq, i);
|
||||
|
||||
if (trans->trans_cfg->gen2)
|
||||
iwl_txq_set_tfd_invalid_gen2(trans, tfd);
|
||||
else
|
||||
iwl_txq_set_tfd_invalid_gen1(trans, tfd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
err_free_tfds:
|
||||
dma_free_coherent(trans->dev, tfd_sz, txq->tfds, txq->dma_addr);
|
||||
@ -1340,22 +1367,12 @@ error:
|
||||
}
|
||||
|
||||
static inline dma_addr_t iwl_txq_gen1_tfd_tb_get_addr(struct iwl_trans *trans,
|
||||
void *_tfd, u8 idx)
|
||||
struct iwl_tfd *tfd, u8 idx)
|
||||
{
|
||||
struct iwl_tfd *tfd;
|
||||
struct iwl_tfd_tb *tb;
|
||||
struct iwl_tfd_tb *tb = &tfd->tbs[idx];
|
||||
dma_addr_t addr;
|
||||
dma_addr_t hi_len;
|
||||
|
||||
if (trans->trans_cfg->gen2) {
|
||||
struct iwl_tfh_tfd *tfh_tfd = _tfd;
|
||||
struct iwl_tfh_tb *tfh_tb = &tfh_tfd->tbs[idx];
|
||||
|
||||
return (dma_addr_t)(le64_to_cpu(tfh_tb->addr));
|
||||
}
|
||||
|
||||
tfd = _tfd;
|
||||
tb = &tfd->tbs[idx];
|
||||
addr = get_unaligned_le32(&tb->lo);
|
||||
|
||||
if (sizeof(dma_addr_t) <= sizeof(u32))
|
||||
@ -1376,7 +1393,7 @@ void iwl_txq_gen1_tfd_unmap(struct iwl_trans *trans,
|
||||
struct iwl_txq *txq, int index)
|
||||
{
|
||||
int i, num_tbs;
|
||||
void *tfd = iwl_txq_get_tfd(trans, txq, index);
|
||||
struct iwl_tfd *tfd = iwl_txq_get_tfd(trans, txq, index);
|
||||
|
||||
/* Sanity check on number of chunks */
|
||||
num_tbs = iwl_txq_gen1_tfd_get_num_tbs(trans, tfd);
|
||||
@ -1408,15 +1425,7 @@ void iwl_txq_gen1_tfd_unmap(struct iwl_trans *trans,
|
||||
|
||||
meta->tbs = 0;
|
||||
|
||||
if (trans->trans_cfg->gen2) {
|
||||
struct iwl_tfh_tfd *tfd_fh = (void *)tfd;
|
||||
|
||||
tfd_fh->num_tbs = 0;
|
||||
} else {
|
||||
struct iwl_tfd *tfd_fh = (void *)tfd;
|
||||
|
||||
tfd_fh->num_tbs = 0;
|
||||
}
|
||||
iwl_txq_set_tfd_invalid_gen1(trans, tfd);
|
||||
}
|
||||
|
||||
#define IWL_TX_CRC_SIZE 4
|
||||
@ -1520,7 +1529,12 @@ void iwl_txq_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq)
|
||||
/* We have only q->n_window txq->entries, but we use
|
||||
* TFD_QUEUE_SIZE_MAX tfds
|
||||
*/
|
||||
iwl_txq_gen1_tfd_unmap(trans, &txq->entries[idx].meta, txq, rd_ptr);
|
||||
if (trans->trans_cfg->gen2)
|
||||
iwl_txq_gen2_tfd_unmap(trans, &txq->entries[idx].meta,
|
||||
iwl_txq_get_tfd(trans, txq, rd_ptr));
|
||||
else
|
||||
iwl_txq_gen1_tfd_unmap(trans, &txq->entries[idx].meta,
|
||||
txq, rd_ptr);
|
||||
|
||||
/* free SKB */
|
||||
skb = txq->entries[idx].skb;
|
||||
|
@ -131,17 +131,8 @@ struct iwl_tso_hdr_page *get_page_hdr(struct iwl_trans *trans, size_t len,
|
||||
struct sk_buff *skb);
|
||||
#endif
|
||||
static inline u8 iwl_txq_gen1_tfd_get_num_tbs(struct iwl_trans *trans,
|
||||
void *_tfd)
|
||||
struct iwl_tfd *tfd)
|
||||
{
|
||||
struct iwl_tfd *tfd;
|
||||
|
||||
if (trans->trans_cfg->gen2) {
|
||||
struct iwl_tfh_tfd *tfh_tfd = _tfd;
|
||||
|
||||
return le16_to_cpu(tfh_tfd->num_tbs) & 0x1f;
|
||||
}
|
||||
|
||||
tfd = (struct iwl_tfd *)_tfd;
|
||||
return tfd->num_tbs & 0x1f;
|
||||
}
|
||||
|
||||
@ -164,6 +155,21 @@ static inline u16 iwl_txq_gen1_tfd_tb_get_len(struct iwl_trans *trans,
|
||||
return le16_to_cpu(tb->hi_n_len) >> 4;
|
||||
}
|
||||
|
||||
static inline void iwl_pcie_gen1_tfd_set_tb(struct iwl_trans *trans,
|
||||
struct iwl_tfd *tfd,
|
||||
u8 idx, dma_addr_t addr, u16 len)
|
||||
{
|
||||
struct iwl_tfd_tb *tb = &tfd->tbs[idx];
|
||||
u16 hi_n_len = len << 4;
|
||||
|
||||
put_unaligned_le32(addr, &tb->lo);
|
||||
hi_n_len |= iwl_get_dma_hi_addr(addr);
|
||||
|
||||
tb->hi_n_len = cpu_to_le16(hi_n_len);
|
||||
|
||||
tfd->num_tbs = idx + 1;
|
||||
}
|
||||
|
||||
void iwl_txq_gen1_tfd_unmap(struct iwl_trans *trans,
|
||||
struct iwl_cmd_meta *meta,
|
||||
struct iwl_txq *txq, int index);
|
||||
|
@ -129,18 +129,18 @@ MODULE_FIRMWARE("orinoco_ezusb_fw");
|
||||
|
||||
#define USB_AVAYA8_VENDOR_ID 0x0D98
|
||||
#define USB_AVAYAE_VENDOR_ID 0x0D9E
|
||||
#define USB_AVAYA_WIRELESS_ID 0x0300 /* Avaya Wireless USB Card */
|
||||
#define USB_AVAYA_WIRELESS_ID 0x0300 /* Avaya USB Wireless Card */
|
||||
|
||||
#define USB_AGERE_VENDOR_ID 0x0D4E /* Agere Systems */
|
||||
#define USB_AGERE_MODEL0801_ID 0x1000 /* Wireless USB Card Model 0801 */
|
||||
#define USB_AGERE_MODEL0802_ID 0x1001 /* Wireless USB Card Model 0802 */
|
||||
#define USB_AGERE_REBRANDED_ID 0x047A /* WLAN USB Card */
|
||||
#define USB_AGERE_MODEL0801_ID 0x1000 /* USB Wireless Card Model 0801 */
|
||||
#define USB_AGERE_MODEL0802_ID 0x1001 /* USB Wireless Card Model 0802 */
|
||||
#define USB_AGERE_REBRANDED_ID 0x047A /* USB WLAN Card */
|
||||
|
||||
#define USB_ELSA_VENDOR_ID 0x05CC
|
||||
#define USB_ELSA_AIRLANCER_ID 0x3100 /* ELSA AirLancer USB-11 */
|
||||
|
||||
#define USB_LEGEND_VENDOR_ID 0x0E7C
|
||||
#define USB_LEGEND_JOYNET_ID 0x0300 /* Joynet WLAN USB Card */
|
||||
#define USB_LEGEND_JOYNET_ID 0x0300 /* Joynet USB WLAN Card */
|
||||
|
||||
#define USB_SAMSUNG_VENDOR_ID 0x04E8
|
||||
#define USB_SAMSUNG_SEW2001U1_ID 0x5002 /* Samsung SEW-2001u Card */
|
||||
@ -154,7 +154,7 @@ MODULE_FIRMWARE("orinoco_ezusb_fw");
|
||||
#define USB_FUJITSU_E1100_ID 0x1002 /* connect2AIR WLAN E-1100 USB */
|
||||
|
||||
#define USB_2WIRE_VENDOR_ID 0x1630
|
||||
#define USB_2WIRE_WIRELESS_ID 0xff81 /* 2Wire Wireless USB adapter */
|
||||
#define USB_2WIRE_WIRELESS_ID 0xff81 /* 2Wire USB Wireless adapter */
|
||||
|
||||
|
||||
#define EZUSB_REQUEST_FW_TRANS 0xA0
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Driver for RNDIS based wireless USB devices.
|
||||
* Driver for RNDIS based USB wireless devices.
|
||||
*
|
||||
* Copyright (C) 2007 by Bjorge Dijkstra <bjd@jooz.net>
|
||||
* Copyright (C) 2008-2009 by Jussi Kivilinna <jussi.kivilinna@iki.fi>
|
||||
|
@ -253,8 +253,11 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf,
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!priv || !priv->hist_data)
|
||||
return -EFAULT;
|
||||
if (!priv || !priv->hist_data) {
|
||||
ret = -EFAULT;
|
||||
goto free_and_exit;
|
||||
}
|
||||
|
||||
phist_data = priv->hist_data;
|
||||
|
||||
p += sprintf(p, "\n"
|
||||
@ -309,6 +312,8 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf,
|
||||
ret = simple_read_from_buffer(ubuf, count, ppos, (char *)page,
|
||||
(unsigned long)p - page);
|
||||
|
||||
free_and_exit:
|
||||
free_page(page);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -420,7 +425,10 @@ mwifiex_regrdwr_write(struct file *file,
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
sscanf(buf, "%u %x %x", ®_type, ®_offset, ®_value);
|
||||
if (sscanf(buf, "%u %x %x", ®_type, ®_offset, ®_value) != 3) {
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (reg_type == 0 || reg_offset == 0) {
|
||||
ret = -EINVAL;
|
||||
@ -686,7 +694,10 @@ mwifiex_rdeeprom_write(struct file *file,
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
sscanf(buf, "%d %d", &offset, &bytes);
|
||||
if (sscanf(buf, "%d %d", &offset, &bytes) != 2) {
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (offset == -1 || bytes == -1) {
|
||||
ret = -EINVAL;
|
||||
|
@ -180,7 +180,6 @@ struct mwifiex_rxinfo {
|
||||
};
|
||||
|
||||
struct mwifiex_txinfo {
|
||||
u32 status_code;
|
||||
u8 flags;
|
||||
u8 bss_num;
|
||||
u8 bss_type;
|
||||
|
@ -282,14 +282,12 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
|
||||
sleep_cfm_buf->action = cpu_to_le16(SLEEP_CONFIRM);
|
||||
sleep_cfm_buf->resp_ctrl = cpu_to_le16(RESP_NEEDED);
|
||||
|
||||
memset(&adapter->sleep_params, 0, sizeof(adapter->sleep_params));
|
||||
memset(&adapter->sleep_period, 0, sizeof(adapter->sleep_period));
|
||||
adapter->tx_lock_flag = false;
|
||||
adapter->null_pkt_interval = 0;
|
||||
adapter->fw_bands = 0;
|
||||
adapter->config_bands = 0;
|
||||
adapter->adhoc_start_band = 0;
|
||||
adapter->scan_channels = NULL;
|
||||
adapter->fw_release_number = 0;
|
||||
adapter->fw_cap_info = 0;
|
||||
memset(&adapter->upld_buf, 0, sizeof(adapter->upld_buf));
|
||||
|
@ -444,15 +444,6 @@ struct mwifiex_current_bss_params {
|
||||
u8 data_rates[MWIFIEX_SUPPORTED_RATES];
|
||||
};
|
||||
|
||||
struct mwifiex_sleep_params {
|
||||
u16 sp_error;
|
||||
u16 sp_offset;
|
||||
u16 sp_stable_time;
|
||||
u8 sp_cal_control;
|
||||
u8 sp_ext_sleep_clk;
|
||||
u16 sp_reserved;
|
||||
};
|
||||
|
||||
struct mwifiex_sleep_period {
|
||||
u16 period;
|
||||
u16 reserved;
|
||||
@ -681,7 +672,6 @@ struct mwifiex_private {
|
||||
struct cfg80211_chan_def dfs_chandef;
|
||||
struct workqueue_struct *dfs_cac_workqueue;
|
||||
struct delayed_work dfs_cac_work;
|
||||
struct timer_list dfs_chan_switch_timer;
|
||||
struct workqueue_struct *dfs_chan_sw_workqueue;
|
||||
struct delayed_work dfs_chan_sw_work;
|
||||
struct cfg80211_beacon_data beacon_after;
|
||||
@ -888,8 +878,6 @@ struct mwifiex_adapter {
|
||||
struct work_struct main_work;
|
||||
struct workqueue_struct *rx_workqueue;
|
||||
struct work_struct rx_work;
|
||||
struct workqueue_struct *dfs_workqueue;
|
||||
struct work_struct dfs_work;
|
||||
bool rx_work_enabled;
|
||||
bool rx_processing;
|
||||
bool delay_main_work;
|
||||
@ -953,9 +941,7 @@ struct mwifiex_adapter {
|
||||
u8 fw_bands;
|
||||
u8 adhoc_start_band;
|
||||
u8 config_bands;
|
||||
struct mwifiex_chan_scan_param_set *scan_channels;
|
||||
u8 tx_lock_flag;
|
||||
struct mwifiex_sleep_params sleep_params;
|
||||
struct mwifiex_sleep_period sleep_period;
|
||||
u16 ps_mode;
|
||||
u32 ps_state;
|
||||
@ -1155,8 +1141,10 @@ int mwifiex_process_uap_event(struct mwifiex_private *);
|
||||
void mwifiex_delete_all_station_list(struct mwifiex_private *priv);
|
||||
void mwifiex_wmm_del_peer_ra_list(struct mwifiex_private *priv,
|
||||
const u8 *ra_addr);
|
||||
void *mwifiex_process_sta_txpd(struct mwifiex_private *, struct sk_buff *skb);
|
||||
void *mwifiex_process_uap_txpd(struct mwifiex_private *, struct sk_buff *skb);
|
||||
void mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb);
|
||||
void mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb);
|
||||
int mwifiex_sta_init_cmd(struct mwifiex_private *, u8 first_sta, bool init);
|
||||
int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd,
|
||||
struct mwifiex_scan_cmd_config *scan_cfg);
|
||||
|
@ -612,7 +612,6 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
|
||||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
int ret = 0;
|
||||
struct mwifiex_chan_scan_param_set *tmp_chan_list;
|
||||
struct mwifiex_chan_scan_param_set *start_chan;
|
||||
u32 tlv_idx, rates_size, cmd_no;
|
||||
u32 total_scan_time;
|
||||
u32 done_early;
|
||||
@ -643,7 +642,6 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
|
||||
total_scan_time = 0;
|
||||
radio_type = 0;
|
||||
chan_tlv_out->header.len = 0;
|
||||
start_chan = tmp_chan_list;
|
||||
done_early = false;
|
||||
|
||||
/*
|
||||
@ -750,8 +748,6 @@ mwifiex_scan_channel_list(struct mwifiex_private *priv,
|
||||
rates_size = mwifiex_append_rate_tlv(priv, scan_cfg_out,
|
||||
radio_type);
|
||||
|
||||
priv->adapter->scan_channels = start_chan;
|
||||
|
||||
/* Send the scan command to the firmware with the specified
|
||||
cfg */
|
||||
if (priv->adapter->ext_scan)
|
||||
@ -828,7 +824,6 @@ mwifiex_config_scan(struct mwifiex_private *priv,
|
||||
u8 ssid_filter;
|
||||
struct mwifiex_ie_types_htcap *ht_cap;
|
||||
struct mwifiex_ie_types_bss_mode *bss_mode;
|
||||
const u8 zero_mac[6] = {0, 0, 0, 0, 0, 0};
|
||||
|
||||
/* The tlv_buf_len is calculated for each scan command. The TLVs added
|
||||
in this routine will be preserved since the routine that sends the
|
||||
@ -966,7 +961,7 @@ mwifiex_config_scan(struct mwifiex_private *priv,
|
||||
sizeof(struct mwifiex_ie_types_scan_chan_gap);
|
||||
}
|
||||
|
||||
if (!ether_addr_equal(user_scan_in->random_mac, zero_mac)) {
|
||||
if (!is_zero_ether_addr(user_scan_in->random_mac)) {
|
||||
random_mac_tlv = (void *)tlv_pos;
|
||||
random_mac_tlv->header.type =
|
||||
cpu_to_le16(TLV_TYPE_RANDOM_MAC);
|
||||
|
@ -1083,17 +1083,17 @@ cont:
|
||||
"info: SDIO FUNC1 IO port: %#x\n", adapter->ioport);
|
||||
|
||||
/* Set Host interrupt reset to read to clear */
|
||||
if (!mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, ®))
|
||||
mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg,
|
||||
reg | card->reg->sdio_int_mask);
|
||||
else
|
||||
if (mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, ®))
|
||||
return -1;
|
||||
if (mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg,
|
||||
reg | card->reg->sdio_int_mask))
|
||||
return -1;
|
||||
|
||||
/* Dnld/Upld ready set to auto reset */
|
||||
if (!mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, ®))
|
||||
mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg,
|
||||
reg | AUTO_RE_ENABLE_INT);
|
||||
else
|
||||
if (mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, ®))
|
||||
return -1;
|
||||
if (mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg,
|
||||
reg | AUTO_RE_ENABLE_INT))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@ -1556,7 +1556,7 @@ done:
|
||||
}
|
||||
|
||||
/*
|
||||
* This function decode sdio aggreation pkt.
|
||||
* This function decodes sdio aggregation pkt.
|
||||
*
|
||||
* Based on the data block size and pkt_len,
|
||||
* skb data will be decoded to few packets.
|
||||
@ -2266,7 +2266,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
|
||||
ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf,
|
||||
card->mpa_tx.buf_len, mport);
|
||||
|
||||
/* Save the last multi port tx aggreagation info to debug log */
|
||||
/* Save the last multi port tx aggregation info to debug log. */
|
||||
index = adapter->dbg.last_sdio_mp_index;
|
||||
index = (index + 1) % MWIFIEX_DBG_SDIO_MP_NUM;
|
||||
adapter->dbg.last_sdio_mp_index = index;
|
||||
@ -2525,7 +2525,8 @@ static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
|
||||
mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg);
|
||||
|
||||
/* Get SDIO ioport */
|
||||
mwifiex_init_sdio_ioport(adapter);
|
||||
if (mwifiex_init_sdio_ioport(adapter))
|
||||
return -EIO;
|
||||
|
||||
/* Initialize SDIO variables in card */
|
||||
card->mp_rd_bitmap = 0;
|
||||
@ -3141,7 +3142,8 @@ static void mwifiex_sdio_up_dev(struct mwifiex_adapter *adapter)
|
||||
*/
|
||||
mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg);
|
||||
|
||||
mwifiex_init_sdio_ioport(adapter);
|
||||
if (mwifiex_init_sdio_ioport(adapter))
|
||||
dev_err(&card->func->dev, "error enabling SDIO port\n");
|
||||
}
|
||||
|
||||
static struct mwifiex_if_ops sdio_ops = {
|
||||
|
@ -92,6 +92,7 @@ int mwifiex_process_rx_packet(struct mwifiex_private *priv,
|
||||
skb->len, rx_pkt_off);
|
||||
priv->stats.rx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
|
||||
|
@ -29,8 +29,8 @@
|
||||
* - Priority specific Tx control
|
||||
* - Flags
|
||||
*/
|
||||
void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb)
|
||||
void mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
struct txpd *local_tx_pd;
|
||||
@ -39,15 +39,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
u16 pkt_type, pkt_offset;
|
||||
int hroom = adapter->intf_hdr_len;
|
||||
|
||||
if (!skb->len) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"Tx: bad packet length: %d\n", skb->len);
|
||||
tx_info->status_code = -1;
|
||||
return skb->data;
|
||||
}
|
||||
|
||||
BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN);
|
||||
|
||||
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
|
||||
|
||||
pad = ((uintptr_t)skb->data - (sizeof(*local_tx_pd) + hroom)) &
|
||||
@ -109,8 +100,6 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
if (!local_tx_pd->tx_control)
|
||||
/* TxCtrl set by user or default */
|
||||
local_tx_pd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl);
|
||||
|
||||
return skb->data;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -72,13 +72,18 @@ EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
|
||||
int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
|
||||
struct mwifiex_tx_param *tx_param)
|
||||
{
|
||||
int hroom, ret = -1;
|
||||
int hroom, ret;
|
||||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
u8 *head_ptr;
|
||||
struct txpd *local_tx_pd = NULL;
|
||||
struct mwifiex_sta_node *dest_node;
|
||||
struct ethhdr *hdr = (void *)skb->data;
|
||||
|
||||
if (unlikely(!skb->len ||
|
||||
skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN)) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
hroom = adapter->intf_hdr_len;
|
||||
|
||||
if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) {
|
||||
@ -88,33 +93,31 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
|
||||
dest_node->stats.tx_packets++;
|
||||
}
|
||||
|
||||
head_ptr = mwifiex_process_uap_txpd(priv, skb);
|
||||
mwifiex_process_uap_txpd(priv, skb);
|
||||
} else {
|
||||
head_ptr = mwifiex_process_sta_txpd(priv, skb);
|
||||
mwifiex_process_sta_txpd(priv, skb);
|
||||
}
|
||||
|
||||
if ((adapter->data_sent || adapter->tx_lock_flag) && head_ptr) {
|
||||
if (adapter->data_sent || adapter->tx_lock_flag) {
|
||||
skb_queue_tail(&adapter->tx_data_q, skb);
|
||||
atomic_inc(&adapter->tx_queued);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (head_ptr) {
|
||||
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA)
|
||||
local_tx_pd = (struct txpd *)(head_ptr + hroom);
|
||||
if (adapter->iface_type == MWIFIEX_USB) {
|
||||
ret = adapter->if_ops.host_to_card(adapter,
|
||||
priv->usb_port,
|
||||
skb, tx_param);
|
||||
} else {
|
||||
ret = adapter->if_ops.host_to_card(adapter,
|
||||
MWIFIEX_TYPE_DATA,
|
||||
skb, tx_param);
|
||||
}
|
||||
if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA)
|
||||
local_tx_pd = (struct txpd *)(skb->data + hroom);
|
||||
if (adapter->iface_type == MWIFIEX_USB) {
|
||||
ret = adapter->if_ops.host_to_card(adapter,
|
||||
priv->usb_port,
|
||||
skb, tx_param);
|
||||
} else {
|
||||
ret = adapter->if_ops.host_to_card(adapter,
|
||||
MWIFIEX_TYPE_DATA,
|
||||
skb, tx_param);
|
||||
}
|
||||
mwifiex_dbg_dump(adapter, DAT_D, "tx pkt:", skb->data,
|
||||
min_t(size_t, skb->len, DEBUG_DUMP_DATA_MAX_LEN));
|
||||
|
||||
out:
|
||||
switch (ret) {
|
||||
case -ENOSR:
|
||||
mwifiex_dbg(adapter, DATA, "data: -ENOSR is returned\n");
|
||||
@ -137,6 +140,11 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
|
||||
break;
|
||||
case -EINPROGRESS:
|
||||
break;
|
||||
case -EINVAL:
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"malformed skb (length: %u, headroom: %u)\n",
|
||||
skb->len, skb_headroom(skb));
|
||||
fallthrough;
|
||||
case 0:
|
||||
mwifiex_write_data_complete(adapter, skb, 0, ret);
|
||||
break;
|
||||
|
@ -110,6 +110,7 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv,
|
||||
skb->len, le16_to_cpu(uap_rx_pd->rx_pkt_offset));
|
||||
priv->stats.rx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!memcmp(&rx_pkt_hdr->rfc1042_hdr, bridge_tunnel_header,
|
||||
@ -252,7 +253,15 @@ int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,
|
||||
|
||||
if (is_multicast_ether_addr(ra)) {
|
||||
skb_uap = skb_copy(skb, GFP_ATOMIC);
|
||||
mwifiex_uap_queue_bridged_pkt(priv, skb_uap);
|
||||
if (likely(skb_uap)) {
|
||||
mwifiex_uap_queue_bridged_pkt(priv, skb_uap);
|
||||
} else {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"failed to copy skb for uAP\n");
|
||||
priv->stats.rx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (mwifiex_get_sta_entry(priv, ra)) {
|
||||
/* Requeue Intra-BSS packet */
|
||||
@ -461,8 +470,8 @@ int mwifiex_process_uap_rx_packet(struct mwifiex_private *priv,
|
||||
* - Priority specific Tx control
|
||||
* - Flags
|
||||
*/
|
||||
void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb)
|
||||
void mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
struct uap_txpd *txpd;
|
||||
@ -471,15 +480,6 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
u16 pkt_type, pkt_offset;
|
||||
int hroom = adapter->intf_hdr_len;
|
||||
|
||||
if (!skb->len) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"Tx: bad packet length: %d\n", skb->len);
|
||||
tx_info->status_code = -1;
|
||||
return skb->data;
|
||||
}
|
||||
|
||||
BUG_ON(skb_headroom(skb) < MWIFIEX_MIN_DATA_HEADER_LEN);
|
||||
|
||||
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
|
||||
|
||||
pad = ((uintptr_t)skb->data - (sizeof(*txpd) + hroom)) &
|
||||
@ -527,6 +527,4 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
if (!txpd->tx_control)
|
||||
/* TxCtrl set by user or default */
|
||||
txpd->tx_control = cpu_to_le32(priv->pkt_tx_ctrl);
|
||||
|
||||
return skb->data;
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ config MT7603E
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
This adds support for MT7603E wireless PCIe devices and the WLAN core
|
||||
This adds support for MT7603E PCIe wireless devices and the WLAN core
|
||||
on MT7628/MT7688 SoC devices. This family supports IEEE 802.11n 2x2
|
||||
to 300Mbps PHY rate
|
||||
|
||||
|
@ -11,7 +11,7 @@ config MT7615E
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
This adds support for MT7615-based wireless PCIe devices,
|
||||
This adds support for MT7615-based PCIe wireless devices,
|
||||
which support concurrent dual-band operation at both 5GHz
|
||||
and 2.4GHz, IEEE 802.11ac 4x4:4SS 1733Mbps PHY rate, wave2
|
||||
MU-MIMO up to 4 users/group and 160MHz channels.
|
||||
|
@ -10,7 +10,7 @@ config MT76x0U
|
||||
depends on MAC80211
|
||||
depends on USB
|
||||
help
|
||||
This adds support for MT7610U-based wireless USB 2.0 dongles,
|
||||
This adds support for MT7610U-based USB 2.0 wireless dongles,
|
||||
which comply with IEEE 802.11ac standards and support 1x1
|
||||
433Mbps PHY rate.
|
||||
|
||||
@ -22,7 +22,7 @@ config MT76x0E
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
This adds support for MT7610/MT7630-based wireless PCIe devices,
|
||||
This adds support for MT7610/MT7630-based PCIe wireless devices,
|
||||
which comply with IEEE 802.11ac standards and support 1x1
|
||||
433Mbps PHY rate.
|
||||
|
||||
|
@ -9,7 +9,7 @@ config MT76x2E
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
This adds support for MT7612/MT7602/MT7662-based wireless PCIe
|
||||
This adds support for MT7612/MT7602/MT7662-based PCIe wireless
|
||||
devices, which comply with IEEE 802.11ac standards and support
|
||||
2SS to 866Mbit/s PHY rate.
|
||||
|
||||
@ -22,7 +22,7 @@ config MT76x2U
|
||||
depends on MAC80211
|
||||
depends on USB
|
||||
help
|
||||
This adds support for MT7612U-based wireless USB 3.0 dongles,
|
||||
This adds support for MT7612U-based USB 3.0 wireless dongles,
|
||||
which comply with IEEE 802.11ac standards and support 2SS to
|
||||
866Mbit/s PHY rate.
|
||||
|
||||
|
@ -7,7 +7,7 @@ config MT7915E
|
||||
depends on PCI
|
||||
select RELAY
|
||||
help
|
||||
This adds support for MT7915-based wireless PCIe devices,
|
||||
This adds support for MT7915-based PCIe wireless devices,
|
||||
which support concurrent dual-band operation at both 5GHz
|
||||
and 2.4GHz IEEE 802.11ax 4x4:4SS 1024-QAM, 160MHz channels,
|
||||
OFDMA, spatial reuse and dual carrier modulation.
|
||||
|
@ -7,7 +7,7 @@ config MT7996E
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
This adds support for MT7996-based wireless PCIe devices,
|
||||
This adds support for MT7996-based PCIe wireless devices,
|
||||
which support concurrent tri-band operation at 6GHz, 5GHz,
|
||||
and 2.4GHz IEEE 802.11be 4x4:4SS 4096-QAM, 320MHz channels.
|
||||
|
||||
|
@ -4,4 +4,4 @@ config MT7601U
|
||||
depends on MAC80211
|
||||
depends on USB
|
||||
help
|
||||
This adds support for MT7601U-based wireless USB dongles.
|
||||
This adds support for MT7601U-based USB wireless dongles.
|
||||
|
@ -8,15 +8,12 @@
|
||||
#define WILC_CFG80211_H
|
||||
#include "netdev.h"
|
||||
|
||||
struct wiphy *wilc_cfg_alloc(void);
|
||||
int wilc_cfg80211_init(struct wilc **wilc, struct device *dev, int io_type,
|
||||
const struct wilc_hif_func *ops);
|
||||
struct wilc *wilc_create_wiphy(struct device *dev);
|
||||
void wilc_deinit_host_int(struct net_device *net);
|
||||
int wilc_init_host_int(struct net_device *net);
|
||||
void wilc_wfi_monitor_rx(struct net_device *mon_dev, u8 *buff, u32 size);
|
||||
struct wilc_vif *wilc_netdev_interface(struct wilc *wl, const char *name,
|
||||
enum nl80211_iftype type);
|
||||
void wilc_wfi_deinit_mon_interface(struct wilc *wl, bool rtnl_locked);
|
||||
struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl,
|
||||
const char *name,
|
||||
@ -24,7 +21,6 @@ struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl,
|
||||
void wilc_update_mgmt_frame_registrations(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
struct mgmt_frame_regs *upd);
|
||||
struct wilc_vif *wilc_get_interface(struct wilc *wl);
|
||||
struct wilc_vif *wilc_get_wl_to_vif(struct wilc *wl);
|
||||
void wlan_deinit_locks(struct wilc *wilc);
|
||||
#endif
|
||||
|
@ -3,7 +3,7 @@ config PLFXLC
|
||||
tristate "pureLiFi X, XL, XC device support"
|
||||
depends on CFG80211 && MAC80211 && USB
|
||||
help
|
||||
This option adds support for pureLiFi LiFi wireless USB
|
||||
This option adds support for pureLiFi LiFi USB wireless
|
||||
adapters. The pureLiFi X, XL, XC USB devices are based on
|
||||
802.11 OFDM PHY but uses light as the transmission medium.
|
||||
The driver supports common 802.11 encryption/authentication
|
||||
|
@ -170,7 +170,7 @@ config RT2800USB_RT35XX
|
||||
config RT2800USB_RT3573
|
||||
bool "rt2800usb - Include support for rt3573 devices (EXPERIMENTAL)"
|
||||
help
|
||||
This enables support for RT3573 chipset based wireless USB devices
|
||||
This enables support for RT3573 chipset based USB wireless devices
|
||||
in the rt2800usb driver.
|
||||
|
||||
config RT2800USB_RT53XX
|
||||
|
@ -3865,28 +3865,51 @@ static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev,
|
||||
}
|
||||
}
|
||||
|
||||
static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
|
||||
struct ieee80211_channel *chan,
|
||||
int power_level) {
|
||||
u16 eeprom, target_power, max_power;
|
||||
static void rt2800_config_alc_rt6352(struct rt2x00_dev *rt2x00dev,
|
||||
struct ieee80211_channel *chan,
|
||||
int power_level)
|
||||
{
|
||||
int cur_channel = rt2x00dev->rf_channel;
|
||||
u16 eeprom, chan_power, rate_power, target_power;
|
||||
u16 tx_power[2];
|
||||
s8 *power_group[2];
|
||||
u32 mac_sys_ctrl;
|
||||
u32 reg;
|
||||
u32 cnt, reg;
|
||||
u8 bbp;
|
||||
|
||||
/* hardware unit is 0.5dBm, limited to 23.5dBm */
|
||||
power_level *= 2;
|
||||
if (power_level > 0x2f)
|
||||
power_level = 0x2f;
|
||||
if (WARN_ON(cur_channel < 1 || cur_channel > 14))
|
||||
return;
|
||||
|
||||
max_power = chan->max_power * 2;
|
||||
if (max_power > 0x2f)
|
||||
max_power = 0x2f;
|
||||
/* get per chain power, 2 chains in total, unit is 0.5dBm */
|
||||
power_level = (power_level - 3) * 2;
|
||||
|
||||
/* We can't get the accurate TX power. Based on some tests, the real
|
||||
* TX power is approximately equal to channel_power + (max)rate_power.
|
||||
* Usually max rate_power is the gain of the OFDM 6M rate. The antenna
|
||||
* gain and externel PA gain are not included as we are unable to
|
||||
* obtain these values.
|
||||
*/
|
||||
rate_power = rt2800_eeprom_read_from_array(rt2x00dev,
|
||||
EEPROM_TXPOWER_BYRATE, 1);
|
||||
rate_power &= 0x3f;
|
||||
power_level -= rate_power;
|
||||
if (power_level < 1)
|
||||
power_level = 1;
|
||||
|
||||
power_group[0] = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
|
||||
power_group[1] = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
|
||||
for (cnt = 0; cnt < 2; cnt++) {
|
||||
chan_power = power_group[cnt][cur_channel - 1];
|
||||
if (chan_power >= 0x20 || chan_power == 0)
|
||||
chan_power = 0x10;
|
||||
tx_power[cnt] = power_level < chan_power ? power_level : chan_power;
|
||||
}
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_0);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, power_level);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, power_level);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_0, max_power);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_1, max_power);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_0, tx_power[0]);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_CH_INIT_1, tx_power[1]);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_0, 0x2f);
|
||||
rt2x00_set_field32(®, TX_ALC_CFG_0_LIMIT_1, 0x2f);
|
||||
|
||||
eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
|
||||
if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) {
|
||||
@ -5268,7 +5291,7 @@ static void rt2800_config_txpower_rt6352(struct rt2x00_dev *rt2x00dev,
|
||||
rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t);
|
||||
rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg);
|
||||
|
||||
rt2800_config_alc(rt2x00dev, chan, power_level);
|
||||
rt2800_config_alc_rt6352(rt2x00dev, chan, power_level);
|
||||
|
||||
/* TODO: temperature compensation code! */
|
||||
}
|
||||
@ -8561,7 +8584,7 @@ static void rt2800_r_calibration(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n");
|
||||
|
||||
maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
|
||||
maccfg &= (~0x04);
|
||||
maccfg &= (~0x08);
|
||||
rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg);
|
||||
|
||||
if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX)))
|
||||
|
@ -1656,7 +1656,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
memcpy(rtlpriv->sec.key_buf[key_idx],
|
||||
key->key, key->keylen);
|
||||
rtlpriv->sec.key_len[key_idx] = key->keylen;
|
||||
memcpy(mac_addr, bcast_addr, ETH_ALEN);
|
||||
eth_broadcast_addr(mac_addr);
|
||||
} else { /* pairwise key */
|
||||
rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
|
||||
"set pairwise key\n");
|
||||
|
@ -215,31 +215,3 @@ int rtl8723_download_fw(struct ieee80211_hw *hw,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtl8723_download_fw);
|
||||
|
||||
bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
struct rtl8192_tx_ring *ring;
|
||||
struct rtl_tx_desc *pdesc;
|
||||
struct sk_buff *pskb = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
ring = &rtlpci->tx_ring[BEACON_QUEUE];
|
||||
|
||||
pskb = __skb_dequeue(&ring->queue);
|
||||
kfree_skb(pskb);
|
||||
spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
|
||||
|
||||
pdesc = &ring->desc[0];
|
||||
rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
|
||||
|
||||
__skb_queue_tail(&ring->queue, skb);
|
||||
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
|
||||
|
||||
rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtl8723_cmd_send_packet);
|
||||
|
@ -66,7 +66,5 @@ void rtl8723_write_fw(struct ieee80211_hw *hw,
|
||||
u8 *buffer, u32 size, u8 max_page);
|
||||
int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be, int count);
|
||||
int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be, int count);
|
||||
bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#endif
|
||||
|
@ -1828,5 +1828,5 @@ void rtw_pci_shutdown(struct pci_dev *pdev)
|
||||
EXPORT_SYMBOL(rtw_pci_shutdown);
|
||||
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ac wireless PCI driver");
|
||||
MODULE_DESCRIPTION("Realtek PCI 802.11ac wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -826,7 +826,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
ret = rtw_core_init(rtwdev);
|
||||
if (ret)
|
||||
goto err_release_hw;
|
||||
goto err_free_rx_bufs;
|
||||
|
||||
ret = rtw_usb_intf_init(rtwdev, intf);
|
||||
if (ret) {
|
||||
@ -872,6 +872,9 @@ err_destroy_usb:
|
||||
err_deinit_core:
|
||||
rtw_core_deinit(rtwdev);
|
||||
|
||||
err_free_rx_bufs:
|
||||
rtw_usb_free_rx_bufs(rtwusb);
|
||||
|
||||
err_release_hw:
|
||||
ieee80211_free_hw(hw);
|
||||
|
||||
@ -909,5 +912,5 @@ void rtw_usb_disconnect(struct usb_interface *intf)
|
||||
EXPORT_SYMBOL(rtw_usb_disconnect);
|
||||
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver");
|
||||
MODULE_DESCRIPTION("Realtek USB 802.11ac wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
#include "chan.h"
|
||||
#include "debug.h"
|
||||
#include "fw.h"
|
||||
#include "ps.h"
|
||||
#include "util.h"
|
||||
|
||||
static enum rtw89_subband rtw89_get_subband_type(enum rtw89_band band,
|
||||
@ -116,6 +118,7 @@ bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
||||
rcd->prev_primary_channel = chan->primary_channel;
|
||||
rcd->prev_band_type = chan->band_type;
|
||||
band_changed = new->band_type != chan->band_type;
|
||||
rcd->band_changed = band_changed;
|
||||
|
||||
*chan = *new;
|
||||
return band_changed;
|
||||
@ -193,8 +196,12 @@ void rtw89_entity_init(struct rtw89_dev *rtwdev)
|
||||
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct cfg80211_chan_def *chandef;
|
||||
enum rtw89_entity_mode mode;
|
||||
struct rtw89_chan chan;
|
||||
u8 weight;
|
||||
u8 last;
|
||||
u8 idx;
|
||||
|
||||
weight = bitmap_weight(hal->entity_map, NUM_OF_RTW89_SUB_ENTITY);
|
||||
switch (weight) {
|
||||
@ -206,14 +213,121 @@ enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
|
||||
rtw89_config_default_chandef(rtwdev);
|
||||
fallthrough;
|
||||
case 1:
|
||||
last = RTW89_SUB_ENTITY_0;
|
||||
mode = RTW89_ENTITY_MODE_SCC;
|
||||
break;
|
||||
case 2:
|
||||
last = RTW89_SUB_ENTITY_1;
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
if (mode == RTW89_ENTITY_MODE_MCC)
|
||||
break;
|
||||
|
||||
mode = RTW89_ENTITY_MODE_MCC_PREPARE;
|
||||
break;
|
||||
}
|
||||
|
||||
for (idx = 0; idx <= last; idx++) {
|
||||
chandef = rtw89_chandef_get(rtwdev, idx);
|
||||
rtw89_get_channel_params(chandef, &chan);
|
||||
if (chan.channel == 0) {
|
||||
WARN(1, "Invalid channel on chanctx %d\n", idx);
|
||||
return RTW89_ENTITY_MODE_INVALID;
|
||||
}
|
||||
|
||||
rtw89_assign_entity_chan(rtwdev, idx, &chan);
|
||||
}
|
||||
|
||||
rtw89_set_entity_mode(rtwdev, mode);
|
||||
return mode;
|
||||
}
|
||||
|
||||
static void rtw89_chanctx_notify(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_chanctx_state state)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chanctx_listener *listener = chip->chanctx_listener;
|
||||
int i;
|
||||
|
||||
if (!listener)
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_OF_RTW89_CHANCTX_CALLBACKS; i++) {
|
||||
if (!listener->callbacks[i])
|
||||
continue;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
"chanctx notify listener: cb %d, state %d\n",
|
||||
i, state);
|
||||
|
||||
listener->callbacks[i](rtwdev, state);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_mcc_start(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (rtwdev->scanning)
|
||||
rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif);
|
||||
|
||||
rtw89_leave_lps(rtwdev);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC start\n");
|
||||
rtw89_chanctx_notify(rtwdev, RTW89_CHANCTX_STATE_MCC_START);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtw89_mcc_stop(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN, "MCC stop\n");
|
||||
rtw89_chanctx_notify(rtwdev, RTW89_CHANCTX_STATE_MCC_STOP);
|
||||
}
|
||||
|
||||
void rtw89_chanctx_work(struct work_struct *work)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
|
||||
chanctx_work.work);
|
||||
enum rtw89_entity_mode mode;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
rtw89_set_entity_mode(rtwdev, RTW89_ENTITY_MODE_MCC);
|
||||
rtw89_set_channel(rtwdev);
|
||||
|
||||
ret = rtw89_mcc_start(rtwdev);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "failed to start MCC: %d\n", ret);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
enum rtw89_entity_mode mode;
|
||||
u32 delay;
|
||||
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
default:
|
||||
return;
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
delay = ieee80211_tu_to_usec(RTW89_CHANCTX_TIME_MCC_PREPARE);
|
||||
break;
|
||||
}
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
|
||||
"queue chanctx work for mode %d with delay %d us\n",
|
||||
mode, delay);
|
||||
ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work,
|
||||
usecs_to_jiffies(delay));
|
||||
}
|
||||
|
||||
int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
@ -238,6 +352,7 @@ void rtw89_chanctx_ops_remove(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
struct rtw89_chanctx_cfg *cfg = (struct rtw89_chanctx_cfg *)ctx->drv_priv;
|
||||
enum rtw89_entity_mode mode;
|
||||
struct rtw89_vif *rtwvif;
|
||||
u8 drop, roll;
|
||||
|
||||
@ -267,6 +382,15 @@ void rtw89_chanctx_ops_remove(struct rtw89_dev *rtwdev,
|
||||
drop = roll;
|
||||
|
||||
out:
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
rtw89_mcc_stop(rtwdev);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
clear_bit(drop, hal->entity_map);
|
||||
rtw89_set_channel(rtwdev);
|
||||
}
|
||||
|
@ -7,6 +7,9 @@
|
||||
|
||||
#include "core.h"
|
||||
|
||||
/* The dwell time in TU before doing rtw89_chanctx_work(). */
|
||||
#define RTW89_CHANCTX_TIME_MCC_PREPARE 100
|
||||
|
||||
static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
@ -50,6 +53,8 @@ void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
|
||||
const struct cfg80211_chan_def *chandef);
|
||||
void rtw89_entity_init(struct rtw89_dev *rtwdev);
|
||||
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
|
||||
void rtw89_chanctx_work(struct work_struct *work);
|
||||
void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev);
|
||||
int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void rtw89_chanctx_ops_remove(struct rtw89_dev *rtwdev,
|
||||
|
@ -5666,7 +5666,8 @@ enum btc_wl_mode {
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta, enum btc_role_state state)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta);
|
||||
struct rtw89_btc *btc = &rtwdev->btc;
|
||||
|
@ -193,4 +193,13 @@ static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
|
||||
return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
|
||||
}
|
||||
|
||||
/* return bt req len in TU */
|
||||
static inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
struct rtw89_btc *btc = &rtwdev->btc;
|
||||
|
||||
return btc->bt_req_len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -256,8 +256,8 @@ void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef)
|
||||
NL80211_CHAN_NO_HT);
|
||||
}
|
||||
|
||||
static void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
||||
struct rtw89_chan *chan)
|
||||
void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
||||
struct rtw89_chan *chan)
|
||||
{
|
||||
struct ieee80211_channel *channel = chandef->chan;
|
||||
enum nl80211_chan_width width = chandef->width;
|
||||
@ -318,9 +318,11 @@ static void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
||||
|
||||
void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_sub_entity_idx roc_idx;
|
||||
enum rtw89_phy_idx phy_idx;
|
||||
enum rtw89_entity_mode mode;
|
||||
bool entity_active;
|
||||
@ -330,10 +332,23 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
return;
|
||||
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode))
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_SCC:
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
break;
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Invalid ent mode: %d\n", mode);
|
||||
return;
|
||||
}
|
||||
|
||||
roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
if (roc_idx != RTW89_SUB_ENTITY_IDLE)
|
||||
sub_entity_idx = roc_idx;
|
||||
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
phy_idx = RTW89_PHY_0;
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
chip->ops->set_txpwr(rtwdev, chan, phy_idx);
|
||||
@ -341,43 +356,54 @@ void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev)
|
||||
|
||||
void rtw89_set_channel(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct cfg80211_chan_def *chandef;
|
||||
const struct rtw89_chan_rcd *chan_rcd;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
enum rtw89_sub_entity_idx roc_idx;
|
||||
enum rtw89_mac_idx mac_idx;
|
||||
enum rtw89_phy_idx phy_idx;
|
||||
struct rtw89_chan chan;
|
||||
struct rtw89_channel_help_params bak;
|
||||
enum rtw89_entity_mode mode;
|
||||
bool band_changed;
|
||||
bool entity_active;
|
||||
|
||||
entity_active = rtw89_get_entity_state(rtwdev);
|
||||
|
||||
mode = rtw89_entity_recalc(rtwdev);
|
||||
if (WARN(mode != RTW89_ENTITY_MODE_SCC, "Invalid ent mode: %d\n", mode))
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_SCC:
|
||||
case RTW89_ENTITY_MODE_MCC:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
break;
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Invalid ent mode: %d\n", mode);
|
||||
return;
|
||||
}
|
||||
|
||||
roc_idx = atomic_read(&hal->roc_entity_idx);
|
||||
if (roc_idx != RTW89_SUB_ENTITY_IDLE)
|
||||
sub_entity_idx = roc_idx;
|
||||
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
mac_idx = RTW89_MAC_0;
|
||||
phy_idx = RTW89_PHY_0;
|
||||
chandef = rtw89_chandef_get(rtwdev, sub_entity_idx);
|
||||
rtw89_get_channel_params(chandef, &chan);
|
||||
if (WARN(chan.channel == 0, "Invalid channel\n"))
|
||||
return;
|
||||
|
||||
band_changed = rtw89_assign_entity_chan(rtwdev, sub_entity_idx, &chan);
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
chan_rcd = rtw89_chan_rcd_get(rtwdev, sub_entity_idx);
|
||||
|
||||
rtw89_chip_set_channel_prepare(rtwdev, &bak, &chan, mac_idx, phy_idx);
|
||||
rtw89_chip_set_channel_prepare(rtwdev, &bak, chan, mac_idx, phy_idx);
|
||||
|
||||
chip->ops->set_channel(rtwdev, &chan, mac_idx, phy_idx);
|
||||
chip->ops->set_channel(rtwdev, chan, mac_idx, phy_idx);
|
||||
|
||||
chip->ops->set_txpwr(rtwdev, &chan, phy_idx);
|
||||
chip->ops->set_txpwr(rtwdev, chan, phy_idx);
|
||||
|
||||
rtw89_chip_set_channel_done(rtwdev, &bak, &chan, mac_idx, phy_idx);
|
||||
rtw89_chip_set_channel_done(rtwdev, &bak, chan, mac_idx, phy_idx);
|
||||
|
||||
if (!entity_active || band_changed) {
|
||||
rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan.band_type);
|
||||
if (!entity_active || chan_rcd->band_changed) {
|
||||
rtw89_btc_ntfy_switch_band(rtwdev, phy_idx, chan->band_type);
|
||||
rtw89_chip_rfk_band_changed(rtwdev, phy_idx);
|
||||
}
|
||||
|
||||
@ -523,12 +549,12 @@ rtw89_core_tx_update_sec_key(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static u16 rtw89_core_get_mgmt_rate(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_core_tx_request *tx_req)
|
||||
struct rtw89_core_tx_request *tx_req,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct sk_buff *skb = tx_req->skb;
|
||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_vif *vif = tx_info->control.vif;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u16 lowest_rate;
|
||||
|
||||
if (tx_info->flags & IEEE80211_TX_CTL_NO_CCK_RATE ||
|
||||
@ -567,7 +593,8 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif = tx_req->vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
u8 qsel, ch_dma;
|
||||
|
||||
qsel = desc_info->hiq ? RTW89_TX_QSEL_B0_HI : RTW89_TX_QSEL_B0_MGMT;
|
||||
@ -584,7 +611,7 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
|
||||
desc_info->en_wd_info = true;
|
||||
desc_info->use_rate = true;
|
||||
desc_info->dis_data_fb = true;
|
||||
desc_info->data_rate = rtw89_core_get_mgmt_rate(rtwdev, tx_req);
|
||||
desc_info->data_rate = rtw89_core_get_mgmt_rate(rtwdev, tx_req, chan);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXRX,
|
||||
"tx mgmt frame with rate 0x%x on channel %d (band %d, bw %d)\n",
|
||||
@ -603,7 +630,8 @@ rtw89_core_tx_update_h2c_info(struct rtw89_dev *rtwdev,
|
||||
desc_info->ch_dma = RTW89_DMA_H2C;
|
||||
}
|
||||
|
||||
static void rtw89_core_get_no_ul_ofdma_htc(struct rtw89_dev *rtwdev, __le32 *htc)
|
||||
static void rtw89_core_get_no_ul_ofdma_htc(struct rtw89_dev *rtwdev, __le32 *htc,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
static const u8 rtw89_bandwidth_to_om[] = {
|
||||
[RTW89_CHANNEL_WIDTH_20] = HTC_OM_CHANNEL_WIDTH_20,
|
||||
@ -614,7 +642,6 @@ static void rtw89_core_get_no_ul_ofdma_htc(struct rtw89_dev *rtwdev, __le32 *htc
|
||||
};
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 om_bandwidth;
|
||||
|
||||
if (!chip->dis_2g_40m_ul_ofdma ||
|
||||
@ -1659,8 +1686,7 @@ static void rtw89_correct_cck_chan(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan_rcd *rcd =
|
||||
rtw89_chan_rcd_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u16 chan = rcd->prev_primary_channel;
|
||||
u8 band = rcd->prev_band_type == RTW89_BAND_2G ?
|
||||
NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
|
||||
u8 band = rtw89_hw_to_nl80211_band(rcd->prev_band_type);
|
||||
|
||||
if (status->band != NL80211_BAND_2GHZ &&
|
||||
status->encoding == RX_ENC_LEGACY &&
|
||||
@ -1900,7 +1926,6 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
const struct cfg80211_chan_def *chandef =
|
||||
rtw89_chandef_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *cur = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u16 data_rate;
|
||||
u8 data_rate_mode;
|
||||
|
||||
@ -1910,6 +1935,7 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
|
||||
|
||||
if (rtwdev->scanning &&
|
||||
RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
|
||||
const struct rtw89_chan *cur = rtw89_scan_chan_get(rtwdev);
|
||||
u8 chan = cur->primary_channel;
|
||||
u8 band = cur->band_type;
|
||||
enum nl80211_band nl_band;
|
||||
@ -2451,6 +2477,7 @@ out:
|
||||
|
||||
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct cfg80211_chan_def roc_chan;
|
||||
@ -2478,7 +2505,7 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
rtw89_config_roc_chandef(rtwdev, rtwvif->sub_entity_idx, &roc_chan);
|
||||
rtw89_set_channel(rtwdev);
|
||||
rtw89_write32_clr(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_A_UC_CAM_MATCH | B_AX_A_BC_CAM_MATCH);
|
||||
|
||||
ieee80211_ready_on_channel(hw);
|
||||
@ -2486,6 +2513,7 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
|
||||
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw89_roc *roc = &rtwvif->roc;
|
||||
struct rtw89_vif *tmp;
|
||||
@ -2499,7 +2527,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
rtw89_leave_lps(rtwdev);
|
||||
|
||||
rtw89_write32_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_RX_FLTR_CFG_MASK,
|
||||
rtwdev->hal.rx_fltr);
|
||||
|
||||
@ -2682,6 +2710,7 @@ static void rtw89_track_work(struct work_struct *work)
|
||||
rtw89_phy_tx_path_div_track(rtwdev);
|
||||
rtw89_phy_antdiv_track(rtwdev);
|
||||
rtw89_phy_ul_tb_ctrl_track(rtwdev);
|
||||
rtw89_tas_track(rtwdev);
|
||||
|
||||
if (rtwdev->lps_enabled && !rtwdev->btc.lps)
|
||||
rtw89_enter_lps_track(rtwdev);
|
||||
@ -2970,6 +2999,8 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
int ret;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP || sta->tdls) {
|
||||
@ -3023,7 +3054,7 @@ int rtw89_core_sta_assoc(struct rtw89_dev *rtwdev,
|
||||
|
||||
rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta,
|
||||
BTC_ROLE_MSTS_STA_CONN_END);
|
||||
rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template);
|
||||
rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template, chan);
|
||||
rtw89_phy_ul_tb_assoc(rtwdev, rtwvif);
|
||||
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
|
||||
@ -3463,6 +3494,27 @@ void rtw89_complete_cond(struct rtw89_wait_info *wait, unsigned int cond,
|
||||
complete(&wait->completion);
|
||||
}
|
||||
|
||||
void rtw89_core_ntfy_btc_event(struct rtw89_dev *rtwdev, enum rtw89_btc_hmsg event)
|
||||
{
|
||||
u16 bt_req_len;
|
||||
|
||||
switch (event) {
|
||||
case RTW89_BTC_HMSG_SET_BT_REQ_SLOT:
|
||||
bt_req_len = rtw89_coex_query_bt_req_len(rtwdev, RTW89_PHY_0);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC,
|
||||
"coex updates BT req len to %d TU\n", bt_req_len);
|
||||
break;
|
||||
default:
|
||||
if (event < NUM_OF_RTW89_BTC_HMSG)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC,
|
||||
"unhandled BTC HMSG event: %d\n", event);
|
||||
else
|
||||
rtw89_warn(rtwdev,
|
||||
"unrecognized BTC HMSG event: %d\n", event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int rtw89_core_start(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
@ -3496,6 +3548,8 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
|
||||
rtw89_mac_update_rts_threshold(rtwdev, RTW89_MAC_0);
|
||||
|
||||
rtw89_tas_reset(rtwdev);
|
||||
|
||||
ret = rtw89_hci_start(rtwdev);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to start hci\n");
|
||||
@ -3536,6 +3590,7 @@ void rtw89_core_stop(struct rtw89_dev *rtwdev)
|
||||
cancel_work_sync(&btc->icmp_notify_work);
|
||||
cancel_delayed_work_sync(&rtwdev->txq_reinvoke_work);
|
||||
cancel_delayed_work_sync(&rtwdev->track_work);
|
||||
cancel_delayed_work_sync(&rtwdev->chanctx_work);
|
||||
cancel_delayed_work_sync(&rtwdev->coex_act1_work);
|
||||
cancel_delayed_work_sync(&rtwdev->coex_bt_devinfo_work);
|
||||
cancel_delayed_work_sync(&rtwdev->coex_rfk_chk_work);
|
||||
@ -3572,6 +3627,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
|
||||
INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->track_work, rtw89_track_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->chanctx_work, rtw89_chanctx_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->coex_act1_work, rtw89_coex_act1_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work);
|
||||
INIT_DELAYED_WORK(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work);
|
||||
@ -3612,6 +3668,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
|
||||
|
||||
rtw89_ser_init(rtwdev);
|
||||
rtw89_entity_init(rtwdev);
|
||||
rtw89_tas_init(rtwdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3632,7 +3689,8 @@ EXPORT_SYMBOL(rtw89_core_deinit);
|
||||
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
const u8 *mac_addr, bool hw_scan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
|
||||
rtwdev->scanning = true;
|
||||
rtw89_leave_lps(rtwdev);
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
struct rtw89_dev;
|
||||
struct rtw89_pci_info;
|
||||
struct rtw89_mac_gen_def;
|
||||
struct rtw89_phy_gen_def;
|
||||
|
||||
extern const struct ieee80211_ops rtw89_ops;
|
||||
|
||||
@ -789,6 +791,7 @@ enum rtw89_phy_idx {
|
||||
|
||||
enum rtw89_sub_entity_idx {
|
||||
RTW89_SUB_ENTITY_0 = 0,
|
||||
RTW89_SUB_ENTITY_1 = 1,
|
||||
|
||||
NUM_OF_RTW89_SUB_ENTITY,
|
||||
RTW89_SUB_ENTITY_IDLE = NUM_OF_RTW89_SUB_ENTITY,
|
||||
@ -900,6 +903,7 @@ struct rtw89_chan {
|
||||
struct rtw89_chan_rcd {
|
||||
u8 prev_primary_channel;
|
||||
enum rtw89_band prev_band_type;
|
||||
bool band_changed;
|
||||
};
|
||||
|
||||
struct rtw89_channel_help_params {
|
||||
@ -2656,6 +2660,17 @@ struct rtw89_btc {
|
||||
bool lps;
|
||||
};
|
||||
|
||||
enum rtw89_btc_hmsg {
|
||||
RTW89_BTC_HMSG_TMR_EN = 0x0,
|
||||
RTW89_BTC_HMSG_BT_REG_READBACK = 0x1,
|
||||
RTW89_BTC_HMSG_SET_BT_REQ_SLOT = 0x2,
|
||||
RTW89_BTC_HMSG_FW_EV = 0x3,
|
||||
RTW89_BTC_HMSG_BT_LINK_CHG = 0x4,
|
||||
RTW89_BTC_HMSG_SET_BT_REQ_STBC = 0x5,
|
||||
|
||||
NUM_OF_RTW89_BTC_HMSG,
|
||||
};
|
||||
|
||||
enum rtw89_ra_mode {
|
||||
RTW89_RA_MODE_CCK = BIT(0),
|
||||
RTW89_RA_MODE_OFDM = BIT(1),
|
||||
@ -2885,6 +2900,32 @@ struct rtw89_roc {
|
||||
|
||||
#define RTW89_P2P_MAX_NOA_NUM 2
|
||||
|
||||
struct rtw89_p2p_ie_head {
|
||||
u8 eid;
|
||||
u8 ie_len;
|
||||
u8 oui[3];
|
||||
u8 oui_type;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_noa_attr_head {
|
||||
u8 attr_type;
|
||||
__le16 attr_len;
|
||||
u8 index;
|
||||
u8 oppps_ctwindow;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_p2p_noa_ie {
|
||||
struct rtw89_p2p_ie_head p2p_head;
|
||||
struct rtw89_noa_attr_head noa_head;
|
||||
struct ieee80211_p2p_noa_desc noa_desc[RTW89_P2P_MAX_NOA_NUM];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_p2p_noa_setter {
|
||||
struct rtw89_p2p_noa_ie ie;
|
||||
u8 noa_count;
|
||||
u8 noa_index;
|
||||
};
|
||||
|
||||
struct rtw89_vif {
|
||||
struct list_head list;
|
||||
struct rtw89_dev *rtwdev;
|
||||
@ -2927,6 +2968,7 @@ struct rtw89_vif {
|
||||
struct cfg80211_scan_request *scan_req;
|
||||
struct ieee80211_scan_ies *scan_ies;
|
||||
struct list_head general_pkt_list;
|
||||
struct rtw89_p2p_noa_setter p2p_noa;
|
||||
};
|
||||
|
||||
enum rtw89_lv1_rcvy_step {
|
||||
@ -3339,6 +3381,10 @@ struct rtw89_dig_regs {
|
||||
u32 seg0_pd_reg;
|
||||
u32 pd_lower_bound_mask;
|
||||
u32 pd_spatial_reuse_en;
|
||||
u32 bmode_pd_reg;
|
||||
u32 bmode_cca_rssi_limit_en;
|
||||
u32 bmode_pd_lower_bound_reg;
|
||||
u32 bmode_rssi_nocca_low_th_mask;
|
||||
struct rtw89_reg_def p0_lna_init;
|
||||
struct rtw89_reg_def p1_lna_init;
|
||||
struct rtw89_reg_def p0_tia_init;
|
||||
@ -3375,10 +3421,28 @@ struct rtw89_antdiv_info {
|
||||
bool get_stats;
|
||||
};
|
||||
|
||||
enum rtw89_chanctx_state {
|
||||
RTW89_CHANCTX_STATE_MCC_START,
|
||||
RTW89_CHANCTX_STATE_MCC_STOP,
|
||||
};
|
||||
|
||||
enum rtw89_chanctx_callbacks {
|
||||
RTW89_CHANCTX_CALLBACK_PLACEHOLDER,
|
||||
|
||||
NUM_OF_RTW89_CHANCTX_CALLBACKS,
|
||||
};
|
||||
|
||||
struct rtw89_chanctx_listener {
|
||||
void (*callbacks[NUM_OF_RTW89_CHANCTX_CALLBACKS])
|
||||
(struct rtw89_dev *rtwdev, enum rtw89_chanctx_state state);
|
||||
};
|
||||
|
||||
struct rtw89_chip_info {
|
||||
enum rtw89_core_chip_id chip_id;
|
||||
enum rtw89_chip_gen chip_gen;
|
||||
const struct rtw89_chip_ops *ops;
|
||||
const struct rtw89_mac_gen_def *mac_def;
|
||||
const struct rtw89_phy_gen_def *phy_def;
|
||||
const char *fw_basename;
|
||||
u8 fw_format_max;
|
||||
bool try_ce_fw;
|
||||
@ -3434,6 +3498,7 @@ struct rtw89_chip_info {
|
||||
/* NULL if no rfe-specific, or a null-terminated array by rfe_parms */
|
||||
const struct rtw89_rfe_parms_conf *rfe_parms_conf;
|
||||
const struct rtw89_rfe_parms *dflt_parms;
|
||||
const struct rtw89_chanctx_listener *chanctx_listener;
|
||||
|
||||
u8 txpwr_factor_rf;
|
||||
u8 txpwr_factor_mac;
|
||||
@ -3690,12 +3755,34 @@ struct rtw89_sar_info {
|
||||
};
|
||||
};
|
||||
|
||||
enum rtw89_tas_state {
|
||||
RTW89_TAS_STATE_DPR_OFF,
|
||||
RTW89_TAS_STATE_DPR_ON,
|
||||
RTW89_TAS_STATE_DPR_FORBID,
|
||||
};
|
||||
|
||||
#define RTW89_TAS_MAX_WINDOW 50
|
||||
struct rtw89_tas_info {
|
||||
s16 txpwr_history[RTW89_TAS_MAX_WINDOW];
|
||||
s32 total_txpwr;
|
||||
u8 cur_idx;
|
||||
s8 dpr_gap;
|
||||
s8 delta;
|
||||
enum rtw89_tas_state state;
|
||||
bool enable;
|
||||
};
|
||||
|
||||
struct rtw89_chanctx_cfg {
|
||||
enum rtw89_sub_entity_idx idx;
|
||||
};
|
||||
|
||||
enum rtw89_entity_mode {
|
||||
RTW89_ENTITY_MODE_SCC,
|
||||
RTW89_ENTITY_MODE_MCC_PREPARE,
|
||||
RTW89_ENTITY_MODE_MCC,
|
||||
|
||||
NUM_OF_RTW89_ENTITY_MODE,
|
||||
RTW89_ENTITY_MODE_INVALID = NUM_OF_RTW89_ENTITY_MODE,
|
||||
};
|
||||
|
||||
struct rtw89_sub_entity {
|
||||
@ -4352,6 +4439,7 @@ struct rtw89_dev {
|
||||
struct rtw89_antdiv_info antdiv;
|
||||
|
||||
struct delayed_work track_work;
|
||||
struct delayed_work chanctx_work;
|
||||
struct delayed_work coex_act1_work;
|
||||
struct delayed_work coex_bt_devinfo_work;
|
||||
struct delayed_work coex_rfk_chk_work;
|
||||
@ -4365,6 +4453,7 @@ struct rtw89_dev {
|
||||
|
||||
struct rtw89_regulatory_info regulatory;
|
||||
struct rtw89_sar_info sar;
|
||||
struct rtw89_tas_info tas;
|
||||
|
||||
struct rtw89_btc btc;
|
||||
enum rtw89_ps_mode ps_mode;
|
||||
@ -4900,6 +4989,18 @@ const struct rtw89_chan_rcd *rtw89_chan_rcd_get(struct rtw89_dev *rtwdev,
|
||||
return &hal->sub[idx].rcd;
|
||||
}
|
||||
|
||||
static inline
|
||||
const struct rtw89_chan *rtw89_scan_chan_get(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
|
||||
|
||||
if (rtwvif)
|
||||
return rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
else
|
||||
return rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
}
|
||||
|
||||
static inline void rtw89_chip_fem_setup(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
@ -5273,6 +5374,8 @@ struct rtw89_dev *rtw89_alloc_ieee80211_hw(struct device *device,
|
||||
void rtw89_free_ieee80211_hw(struct rtw89_dev *rtwdev);
|
||||
void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev);
|
||||
void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef);
|
||||
void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
|
||||
struct rtw89_chan *chan);
|
||||
void rtw89_set_channel(struct rtw89_dev *rtwdev);
|
||||
void rtw89_get_channel(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_chan *chan);
|
||||
@ -5307,5 +5410,6 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif, bool hw_scan);
|
||||
void rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool active);
|
||||
void rtw89_core_ntfy_btc_event(struct rtw89_dev *rtwdev, enum rtw89_btc_hmsg event);
|
||||
|
||||
#endif
|
||||
|
@ -572,9 +572,9 @@ static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
|
||||
seq_puts(m, #_regd "\n"); \
|
||||
break
|
||||
|
||||
static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev)
|
||||
static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 band = chan->band_type;
|
||||
u8 regd = rtw89_regd_get(rtwdev, band);
|
||||
|
||||
@ -604,16 +604,21 @@ static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rtw89_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
const struct rtw89_chan *chan;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
|
||||
seq_puts(m, "[Regulatory] ");
|
||||
__print_regd(m, rtwdev);
|
||||
__print_regd(m, rtwdev, chan);
|
||||
|
||||
seq_puts(m, "[SAR]\n");
|
||||
rtw89_print_sar(m, rtwdev);
|
||||
rtw89_print_sar(m, rtwdev, chan->freq);
|
||||
|
||||
seq_puts(m, "[TAS]\n");
|
||||
rtw89_print_tas(m, rtwdev);
|
||||
|
||||
seq_puts(m, "\n[TX power byrate]\n");
|
||||
ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_byr);
|
||||
@ -790,6 +795,9 @@ static void rtw89_debug_dump_mac_mem(struct seq_file *m,
|
||||
struct rtw89_dev *rtwdev,
|
||||
u8 sel, u32 start_addr, u32 len)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
u32 filter_model_addr = mac->filter_model_addr;
|
||||
u32 indir_access_addr = mac->indir_access_addr;
|
||||
u32 base_addr, start_page, residue;
|
||||
u32 i, j, p, pages;
|
||||
u32 dump_len, remain;
|
||||
@ -799,17 +807,17 @@ static void rtw89_debug_dump_mac_mem(struct seq_file *m,
|
||||
pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1;
|
||||
start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE;
|
||||
residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE;
|
||||
base_addr = rtw89_mac_mem_base_addrs[sel];
|
||||
base_addr = mac->mem_base_addrs[sel];
|
||||
base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE;
|
||||
|
||||
for (p = 0; p < pages; p++) {
|
||||
dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE);
|
||||
rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, base_addr);
|
||||
for (i = R_AX_INDIR_ACCESS_ENTRY + residue;
|
||||
i < R_AX_INDIR_ACCESS_ENTRY + dump_len;) {
|
||||
rtw89_write32(rtwdev, filter_model_addr, base_addr);
|
||||
for (i = indir_access_addr + residue;
|
||||
i < indir_access_addr + dump_len;) {
|
||||
seq_printf(m, "%08xh:", i);
|
||||
for (j = 0;
|
||||
j < 4 && i < R_AX_INDIR_ACCESS_ENTRY + dump_len;
|
||||
j < 4 && i < indir_access_addr + dump_len;
|
||||
j++, i += 4) {
|
||||
val = rtw89_read32(rtwdev, i);
|
||||
seq_printf(m, " %08x", val);
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "ps.h"
|
||||
#include "reg.h"
|
||||
#include "util.h"
|
||||
|
||||
@ -1165,7 +1166,7 @@ void rtw89_fw_log_dump(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
|
||||
return;
|
||||
|
||||
plain_log:
|
||||
rtw89_info(rtwdev, "C2H log: %*s", len, buf);
|
||||
rtw89_info(rtwdev, "C2H log: %.*s", len, buf);
|
||||
|
||||
}
|
||||
|
||||
@ -1758,7 +1759,8 @@ int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
struct sk_buff *skb;
|
||||
u8 pads[RTW89_PPE_BW_NUM];
|
||||
u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id;
|
||||
@ -1915,12 +1917,15 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb_beacon;
|
||||
u16 tim_offset;
|
||||
int bcn_total_len;
|
||||
u16 beacon_rate;
|
||||
void *noa_data;
|
||||
u8 noa_len;
|
||||
int ret;
|
||||
|
||||
if (vif->p2p)
|
||||
@ -1937,6 +1942,13 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
noa_len = rtw89_p2p_noa_fetch(rtwvif, &noa_data);
|
||||
if (noa_len &&
|
||||
(noa_len <= skb_tailroom(skb_beacon) ||
|
||||
pskb_expand_head(skb_beacon, 0, noa_len, GFP_KERNEL) == 0)) {
|
||||
skb_put_data(skb_beacon, noa_data, noa_len);
|
||||
}
|
||||
|
||||
bcn_total_len = H2C_BCN_BASE_LEN + skb_beacon->len;
|
||||
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, bcn_total_len);
|
||||
if (!skb) {
|
||||
@ -3851,6 +3863,7 @@ void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *scan_req)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct cfg80211_scan_request *req = &scan_req->req;
|
||||
u32 rx_fltr = rtwdev->hal.rx_fltr;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
@ -3873,7 +3886,7 @@ void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
rx_fltr &= ~B_AX_A_BC;
|
||||
rx_fltr &= ~B_AX_A_A1_MATCH;
|
||||
rtw89_write32_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_RX_FLTR_CFG_MASK,
|
||||
rx_fltr);
|
||||
}
|
||||
@ -3881,6 +3894,7 @@ void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
bool aborted)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
|
||||
struct cfg80211_scan_info info = {
|
||||
.aborted = aborted,
|
||||
@ -3891,7 +3905,7 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
return;
|
||||
|
||||
rtw89_write32_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_RX_FLTR_CFG_MASK,
|
||||
rtwdev->hal.rx_fltr);
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "reg.h"
|
||||
#include "util.h"
|
||||
|
||||
const u32 rtw89_mac_mem_base_addrs[RTW89_MAC_MEM_NUM] = {
|
||||
static const u32 rtw89_mac_mem_base_addrs_ax[RTW89_MAC_MEM_NUM] = {
|
||||
[RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR,
|
||||
[RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR,
|
||||
[RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR,
|
||||
@ -39,19 +39,21 @@ const u32 rtw89_mac_mem_base_addrs[RTW89_MAC_MEM_NUM] = {
|
||||
static void rtw89_mac_mem_write(struct rtw89_dev *rtwdev, u32 offset,
|
||||
u32 val, enum rtw89_mac_mem_sel sel)
|
||||
{
|
||||
u32 addr = rtw89_mac_mem_base_addrs[sel] + offset;
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
u32 addr = mac->mem_base_addrs[sel] + offset;
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, addr);
|
||||
rtw89_write32(rtwdev, R_AX_INDIR_ACCESS_ENTRY, val);
|
||||
rtw89_write32(rtwdev, mac->filter_model_addr, addr);
|
||||
rtw89_write32(rtwdev, mac->indir_access_addr, val);
|
||||
}
|
||||
|
||||
static u32 rtw89_mac_mem_read(struct rtw89_dev *rtwdev, u32 offset,
|
||||
enum rtw89_mac_mem_sel sel)
|
||||
{
|
||||
u32 addr = rtw89_mac_mem_base_addrs[sel] + offset;
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
u32 addr = mac->mem_base_addrs[sel] + offset;
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, addr);
|
||||
return rtw89_read32(rtwdev, R_AX_INDIR_ACCESS_ENTRY);
|
||||
rtw89_write32(rtwdev, mac->filter_model_addr, addr);
|
||||
return rtw89_read32(rtwdev, mac->indir_access_addr);
|
||||
}
|
||||
|
||||
int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
@ -2082,7 +2084,7 @@ static int addr_cam_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_ADDR_CAM_CTRL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_ADDR_CAM_CTRL, mac_idx);
|
||||
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val |= u32_encode_bits(0x7f, B_AX_ADDR_CAM_RANGE_MASK) |
|
||||
@ -2109,7 +2111,7 @@ static int scheduler_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PREBKF_CFG_1, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PREBKF_CFG_1, mac_idx);
|
||||
if (rtwdev->chip->chip_id == RTL8852C)
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_SIFS_MACTXEN_T1_MASK,
|
||||
SIFS_MACTXEN_T1_V1);
|
||||
@ -2118,14 +2120,14 @@ static int scheduler_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
SIFS_MACTXEN_T1);
|
||||
|
||||
if (rtwdev->chip->chip_id == RTL8852B || rtwdev->chip->chip_id == RTL8851B) {
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_SCH_EXT_CTRL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SCH_EXT_CTRL, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_PORT_RST_TSF_ADV);
|
||||
}
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_CCA_CFG_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CCA_CFG_0, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_BTCCA_EN);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PREBKF_CFG_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PREBKF_CFG_0, mac_idx);
|
||||
if (rtwdev->chip->chip_id == RTL8852C) {
|
||||
val = rtw89_read32_mask(rtwdev, R_AX_SEC_ENG_CTRL,
|
||||
B_AX_TX_PARTIAL_MODE);
|
||||
@ -2165,13 +2167,13 @@ int rtw89_mac_typ_fltr_opt(struct rtw89_dev *rtwdev,
|
||||
|
||||
switch (type) {
|
||||
case RTW89_MGNT:
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_MGNT_FLTR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MGNT_FLTR, mac_idx);
|
||||
break;
|
||||
case RTW89_CTRL:
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_CTRL_FLTR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTRL_FLTR, mac_idx);
|
||||
break;
|
||||
case RTW89_DATA:
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_DATA_FLTR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_DATA_FLTR, mac_idx);
|
||||
break;
|
||||
default:
|
||||
rtw89_err(rtwdev, "[ERR]set rx filter type err\n");
|
||||
@ -2202,9 +2204,9 @@ static int rx_fltr_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
B_AX_LSIG_PARITY_CHK_EN | B_AX_SIGA_CRC_CHK |
|
||||
B_AX_VHT_SU_SIGB_CRC_CHK | B_AX_VHT_MU_SIGB_CRC_CHK |
|
||||
B_AX_HE_SIGB_CRC_CHK;
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, mac_idx),
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_FLTR_OPT, mac_idx),
|
||||
mac_ftlr);
|
||||
rtw89_write16(rtwdev, rtw89_mac_reg_by_idx(R_AX_PLCP_HDR_FLTR, mac_idx),
|
||||
rtw89_write16(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_PLCP_HDR_FLTR, mac_idx),
|
||||
plcp_ftlr);
|
||||
|
||||
return 0;
|
||||
@ -2224,20 +2226,20 @@ static void _patch_dis_resp_chk(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
switch (rtwdev->chip->chip_id) {
|
||||
case RTL8852A:
|
||||
case RTL8852B:
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RSP_CHK_SIG, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RSP_CHK_SIG, mac_idx);
|
||||
val32 = rtw89_read32(rtwdev, reg) & ~b_rsp_chk_nav;
|
||||
rtw89_write32(rtwdev, reg, val32);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
val32 = rtw89_read32(rtwdev, reg) & ~b_rsp_chk_cca;
|
||||
rtw89_write32(rtwdev, reg, val32);
|
||||
break;
|
||||
default:
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RSP_CHK_SIG, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RSP_CHK_SIG, mac_idx);
|
||||
val32 = rtw89_read32(rtwdev, reg) | b_rsp_chk_nav;
|
||||
rtw89_write32(rtwdev, reg, val32);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
val32 = rtw89_read32(rtwdev, reg) | b_rsp_chk_cca;
|
||||
rtw89_write32(rtwdev, reg, val32);
|
||||
break;
|
||||
@ -2253,7 +2255,7 @@ static int cca_ctrl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_CCA_CONTROL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CCA_CONTROL, mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val |= (B_AX_TB_CHK_BASIC_NAV | B_AX_TB_CHK_BTCCA |
|
||||
B_AX_TB_CHK_EDCCA | B_AX_TB_CHK_CCA_P20 |
|
||||
@ -2294,7 +2296,7 @@ static int spatial_reuse_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
|
||||
if (ret)
|
||||
return ret;
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RX_SR_CTRL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_SR_CTRL, mac_idx);
|
||||
rtw89_write8_clr(rtwdev, reg, B_AX_SR_EN);
|
||||
|
||||
return 0;
|
||||
@ -2309,13 +2311,13 @@ static int tmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_MAC_LOOPBACK, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MAC_LOOPBACK, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_MACLBK_EN);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TCR0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TCR0, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_TCR_UDF_THSD_MASK, TCR_UDF_THSD);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TXD_FIFO_CTRL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXD_FIFO_CTRL, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_TXDFIFO_HIGH_MCS_THRE_MASK, TXDFIFO_HIGH_MCS_THRE);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_TXDFIFO_LOW_MCS_THRE_MASK, TXDFIFO_LOW_MCS_THRE);
|
||||
|
||||
@ -2333,7 +2335,7 @@ static int trxptcl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_0, mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val &= ~B_AX_WMAC_SPEC_SIFS_CCK_MASK;
|
||||
val |= FIELD_PREP(B_AX_WMAC_SPEC_SIFS_CCK_MASK, WMAC_SPEC_SIFS_CCK);
|
||||
@ -2353,12 +2355,12 @@ static int trxptcl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
val |= FIELD_PREP(B_AX_WMAC_SPEC_SIFS_OFDM_MASK, sifs);
|
||||
rtw89_write32(rtwdev, reg, val);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RXTRIG_TEST_USER_2, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXTRIG_TEST_USER_2, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_RXTRIG_FCSCHK_EN);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rrsr->ref_rate.addr, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, rrsr->ref_rate.addr, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, rrsr->ref_rate.mask, rrsr->ref_rate.data);
|
||||
reg = rtw89_mac_reg_by_idx(rrsr->rsc.addr, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, rrsr->rsc.addr, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, rrsr->rsc.mask, rrsr->rsc.data);
|
||||
|
||||
return 0;
|
||||
@ -2397,10 +2399,10 @@ static int rmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (mac_idx == RTW89_MAC_0)
|
||||
rst_bacam(rtwdev);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RESPBA_CAM_CTRL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RESPBA_CAM_CTRL, mac_idx);
|
||||
rtw89_write8_set(rtwdev, reg, B_AX_SSN_SEL);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_DLK_PROTECT_CTL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_DLK_PROTECT_CTL, mac_idx);
|
||||
val = rtw89_read16(rtwdev, reg);
|
||||
val = u16_replace_bits(val, TRXCFG_RMAC_DATA_TO,
|
||||
B_AX_RX_DLK_DATA_TIME_MASK);
|
||||
@ -2408,10 +2410,10 @@ static int rmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
B_AX_RX_DLK_CCA_TIME_MASK);
|
||||
rtw89_write16(rtwdev, reg, val);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RCR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RCR, mac_idx);
|
||||
rtw89_write8_mask(rtwdev, reg, B_AX_CH_EN_MASK, 0x1);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RX_FLTR_OPT, mac_idx);
|
||||
if (mac_idx == RTW89_MAC_0)
|
||||
rx_qta = rtwdev->mac.dle_info.c0_rx_qta;
|
||||
else
|
||||
@ -2425,13 +2427,13 @@ static int rmac_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (rtwdev->chip->chip_id == RTL8852A &&
|
||||
rtwdev->hal.cv == CHIP_CBV) {
|
||||
rtw89_write16_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_DLK_PROTECT_CTL, mac_idx),
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_DLK_PROTECT_CTL, mac_idx),
|
||||
B_AX_RX_DLK_CCA_TIME_MASK, 0);
|
||||
rtw89_write16_set(rtwdev, rtw89_mac_reg_by_idx(R_AX_RCR, mac_idx),
|
||||
rtw89_write16_set(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_RCR, mac_idx),
|
||||
BIT(12));
|
||||
}
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PLCP_HDR_FLTR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PLCP_HDR_FLTR, mac_idx);
|
||||
rtw89_write8_clr(rtwdev, reg, B_AX_VHT_SU_SIGB_CRC_CHK);
|
||||
|
||||
return ret;
|
||||
@ -2447,7 +2449,7 @@ static int cmac_com_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TX_SUB_CARRIER_VALUE, mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val = u32_replace_bits(val, 0, B_AX_TXSC_20M_MASK);
|
||||
val = u32_replace_bits(val, 0, B_AX_TXSC_40M_MASK);
|
||||
@ -2455,7 +2457,7 @@ static int cmac_com_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
rtw89_write32(rtwdev, reg, val);
|
||||
|
||||
if (chip_id == RTL8852A || chip_id == RTL8852B) {
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PTCL_RRSR1, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_RRSR1, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_RRSR_RATE_EN_MASK, RRSR_OFDM_CCK_EN);
|
||||
}
|
||||
|
||||
@ -2485,7 +2487,7 @@ static int ptcl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
return ret;
|
||||
|
||||
if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_SIFS_SETTING, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SIFS_SETTING, mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val = u32_replace_bits(val, S_AX_CTS2S_TH_1K,
|
||||
B_AX_HW_CTS2SELF_PKT_LEN_TH_MASK);
|
||||
@ -2494,7 +2496,7 @@ static int ptcl_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
val |= B_AX_HW_CTS2SELF_EN;
|
||||
rtw89_write32(rtwdev, reg, val);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PTCL_FSM_MON, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_FSM_MON, mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val = u32_replace_bits(val, S_AX_PTCL_TO_2MS, B_AX_PTCL_TX_ARB_TO_THR_MASK);
|
||||
val &= ~B_AX_PTCL_TX_ARB_TO_MODE;
|
||||
@ -2531,7 +2533,7 @@ static int cmac_dma_init(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RXDMA_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXDMA_CTRL_0, mac_idx);
|
||||
rtw89_write8_clr(rtwdev, reg, RX_FULL_MODE);
|
||||
|
||||
return 0;
|
||||
@ -2725,7 +2727,7 @@ static int rtw89_hw_sch_tx_en_h2c(struct rtw89_dev *rtwdev, u8 band,
|
||||
static int rtw89_set_hw_sch_tx_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
u16 tx_en, u16 tx_en_mask)
|
||||
{
|
||||
u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_TXEN, mac_idx);
|
||||
u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_TXEN, mac_idx);
|
||||
u16 val;
|
||||
int ret;
|
||||
|
||||
@ -2747,7 +2749,7 @@ static int rtw89_set_hw_sch_tx_en(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
static int rtw89_set_hw_sch_tx_en_v1(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
u32 tx_en, u32 tx_en_mask)
|
||||
{
|
||||
u32 reg = rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx);
|
||||
u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_DRV_TXEN, mac_idx);
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
@ -2768,7 +2770,7 @@ int rtw89_mac_stop_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
int ret;
|
||||
|
||||
*tx_en = rtw89_read16(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_CTN_TXEN, mac_idx));
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_TXEN, mac_idx));
|
||||
|
||||
switch (sel) {
|
||||
case RTW89_SCH_TX_SEL_ALL:
|
||||
@ -2809,7 +2811,7 @@ int rtw89_mac_stop_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
int ret;
|
||||
|
||||
*tx_en = rtw89_read32(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_CTN_DRV_TXEN, mac_idx));
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_CTN_DRV_TXEN, mac_idx));
|
||||
|
||||
switch (sel) {
|
||||
case RTW89_SCH_TX_SEL_ALL:
|
||||
@ -3016,7 +3018,7 @@ static int band_idle_ck_b(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PTCL_TX_CTN_SEL, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_TX_CTN_SEL, mac_idx);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read8, val,
|
||||
(val & B_AX_PTCL_TX_ON_STAT) == 0,
|
||||
@ -3224,7 +3226,7 @@ static void rtw89_scheduler_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_SCHEDULE_ERR_IMR, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_SCHEDULE_ERR_IMR, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_SORT_NON_IDLE_ERR_INT_EN |
|
||||
B_AX_FSM_TIMEOUT_ERR_INT_EN);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_FSM_TIMEOUT_ERR_INT_EN);
|
||||
@ -3235,7 +3237,7 @@ static void rtw89_ptcl_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
const struct rtw89_imr_info *imr = rtwdev->chip->imr_info;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PTCL_IMR0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PTCL_IMR0, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->ptcl_imr_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->ptcl_imr_set);
|
||||
}
|
||||
@ -3246,12 +3248,12 @@ static void rtw89_cdma_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(imr->cdma_imr_0_reg, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, imr->cdma_imr_0_reg, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->cdma_imr_0_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->cdma_imr_0_set);
|
||||
|
||||
if (chip_id == RTL8852C) {
|
||||
reg = rtw89_mac_reg_by_idx(imr->cdma_imr_1_reg, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, imr->cdma_imr_1_reg, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->cdma_imr_1_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->cdma_imr_1_set);
|
||||
}
|
||||
@ -3262,7 +3264,7 @@ static void rtw89_phy_intf_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
const struct rtw89_imr_info *imr = rtwdev->chip->imr_info;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(imr->phy_intf_imr_reg, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, imr->phy_intf_imr_reg, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->phy_intf_imr_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->phy_intf_imr_set);
|
||||
}
|
||||
@ -3272,7 +3274,7 @@ static void rtw89_rmac_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
const struct rtw89_imr_info *imr = rtwdev->chip->imr_info;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(imr->rmac_imr_reg, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, imr->rmac_imr_reg, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->rmac_imr_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->rmac_imr_set);
|
||||
}
|
||||
@ -3282,7 +3284,7 @@ static void rtw89_tmac_imr_enable(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
const struct rtw89_imr_info *imr = rtwdev->chip->imr_info;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(imr->tmac_imr_reg, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, imr->tmac_imr_reg, mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, imr->tmac_imr_clr);
|
||||
rtw89_write32_set(rtwdev, reg, imr->tmac_imr_set);
|
||||
}
|
||||
@ -3661,6 +3663,9 @@ static void rtw89_mac_dmac_tbl_init(struct rtw89_dev *rtwdev, u8 macid)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (rtwdev->chip->chip_gen != RTW89_CHIP_AX)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR,
|
||||
DMAC_TBL_BASE_ADDR + (macid << 4) + (i << 2));
|
||||
@ -3670,6 +3675,9 @@ static void rtw89_mac_dmac_tbl_init(struct rtw89_dev *rtwdev, u8 macid)
|
||||
|
||||
static void rtw89_mac_cmac_tbl_init(struct rtw89_dev *rtwdev, u8 macid)
|
||||
{
|
||||
if (rtwdev->chip->chip_gen != RTW89_CHIP_AX)
|
||||
return;
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR,
|
||||
CMAC_TBL_BASE_ADDR + macid * CCTL_INFO_SIZE);
|
||||
rtw89_write32(rtwdev, R_AX_INDIR_ACCESS_ENTRY, 0x4);
|
||||
@ -3860,7 +3868,7 @@ static void rtw89_mac_port_cfg_hiq_win(struct rtw89_dev *rtwdev,
|
||||
u8 port = rtwvif->port;
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(hiq_win_addr[port], rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, hiq_win_addr[port], rtwvif->mac_idx);
|
||||
rtw89_write8(rtwdev, reg, win);
|
||||
}
|
||||
|
||||
@ -3871,7 +3879,7 @@ static void rtw89_mac_port_cfg_hiq_dtim(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_port_reg *p = &rtw_port_base;
|
||||
u32 addr;
|
||||
|
||||
addr = rtw89_mac_reg_by_idx(R_AX_MD_TSFT_STMP_CTL, rtwvif->mac_idx);
|
||||
addr = rtw89_mac_reg_by_idx(rtwdev, R_AX_MD_TSFT_STMP_CTL, rtwvif->mac_idx);
|
||||
rtw89_write8_set(rtwdev, addr, B_AX_UPD_HGQMD | B_AX_UPD_TIMIE);
|
||||
|
||||
rtw89_write16_port_mask(rtwdev, rtwvif, p->dtim_ctrl, B_AX_DTIM_NUM_MASK,
|
||||
@ -3930,7 +3938,7 @@ static void rtw89_mac_port_cfg_bss_color(struct rtw89_dev *rtwdev,
|
||||
|
||||
bss_color = vif->bss_conf.he_bss_color.color;
|
||||
reg_base = port >= 4 ? R_AX_PTCL_BSS_COLOR_1 : R_AX_PTCL_BSS_COLOR_0;
|
||||
reg = rtw89_mac_reg_by_idx(reg_base, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, reg_base, rtwvif->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, masks[port], bss_color);
|
||||
}
|
||||
|
||||
@ -3944,7 +3952,7 @@ static void rtw89_mac_port_cfg_mbssid(struct rtw89_dev *rtwdev,
|
||||
return;
|
||||
|
||||
if (port == 0) {
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_MBSSID_CTRL, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MBSSID_CTRL, rtwvif->mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_P0MB_ALL_MASK);
|
||||
}
|
||||
}
|
||||
@ -3956,7 +3964,7 @@ static void rtw89_mac_port_cfg_hiq_drop(struct rtw89_dev *rtwdev,
|
||||
u32 reg;
|
||||
u32 val;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_MBSSID_DROP_0, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MBSSID_DROP_0, rtwvif->mac_idx);
|
||||
val = rtw89_read32(rtwdev, reg);
|
||||
val &= ~FIELD_PREP(B_AX_PORT_DROP_4_0_MASK, BIT(port));
|
||||
if (port == 0)
|
||||
@ -4014,7 +4022,7 @@ void rtw89_mac_port_tsf_sync(struct rtw89_dev *rtwdev,
|
||||
u32 val, reg;
|
||||
|
||||
val = RTW89_PORT_OFFSET_TU_TO_32US(offset_tu);
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_PORT0_TSF_SYNC + rtwvif->port * 4,
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PORT0_TSF_SYNC + rtwvif->port * 4,
|
||||
rtwvif->mac_idx);
|
||||
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_SYNC_PORT_SRC, rtwvif_src->port);
|
||||
@ -4204,7 +4212,7 @@ void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
|
||||
rtw89_mac_check_he_obss_narrow_bw_ru_iter,
|
||||
&tolerated);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_RXTRIG_TEST_USER_2, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_RXTRIG_TEST_USER_2, rtwvif->mac_idx);
|
||||
if (tolerated)
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_RXTRIG_RU26_DIS);
|
||||
else
|
||||
@ -4731,7 +4739,7 @@ bool rtw89_mac_get_txpwr_cr(struct rtw89_dev *rtwdev,
|
||||
{
|
||||
const struct rtw89_dle_mem *dle_mem = rtwdev->chip->dle_mem;
|
||||
enum rtw89_qta_mode mode = dle_mem->mode;
|
||||
u32 addr = rtw89_mac_reg_by_idx(reg_base, phy_idx);
|
||||
u32 addr = rtw89_mac_reg_by_idx(rtwdev, reg_base, phy_idx);
|
||||
|
||||
if (addr < R_AX_PWR_RATE_CTRL || addr > CMAC1_END_ADDR) {
|
||||
rtw89_err(rtwdev, "[TXPWR] addr=0x%x exceed txpwr cr\n",
|
||||
@ -4760,7 +4768,7 @@ EXPORT_SYMBOL(rtw89_mac_get_txpwr_cr);
|
||||
|
||||
int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
{
|
||||
u32 reg = rtw89_mac_reg_by_idx(R_AX_PPDU_STAT, mac_idx);
|
||||
u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PPDU_STAT, mac_idx);
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
|
||||
@ -4807,7 +4815,7 @@ void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
time_th = min_t(u32, time_th >> MAC_AX_TIME_TH_SH, MAC_AX_TIME_TH_MAX);
|
||||
len_th = min_t(u32, len_th >> MAC_AX_LEN_TH_SH, MAC_AX_LEN_TH_MAX);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_AGG_LEN_HT_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AGG_LEN_HT_0, mac_idx);
|
||||
rtw89_write16_mask(rtwdev, reg, B_AX_RTS_TXTIME_TH_MASK, time_th);
|
||||
rtw89_write16_mask(rtwdev, reg, B_AX_RTS_LEN_TH_MASK, len_th);
|
||||
}
|
||||
@ -5043,7 +5051,7 @@ int rtw89_mac_cfg_plt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BT_PLT, plt->band);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BT_PLT, plt->band);
|
||||
val = (plt->tx & RTW89_MAC_AX_PLT_LTE_RX ? B_AX_TX_PLT_GNT_LTE_RX : 0) |
|
||||
(plt->tx & RTW89_MAC_AX_PLT_GNT_BT_TX ? B_AX_TX_PLT_GNT_BT_TX : 0) |
|
||||
(plt->tx & RTW89_MAC_AX_PLT_GNT_BT_RX ? B_AX_TX_PLT_GNT_BT_RX : 0) |
|
||||
@ -5133,7 +5141,7 @@ u16 rtw89_mac_get_plt_cnt(struct rtw89_dev *rtwdev, u8 band)
|
||||
u32 reg;
|
||||
u16 cnt;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BT_PLT, band);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BT_PLT, band);
|
||||
cnt = rtw89_read32_mask(rtwdev, reg, B_AX_BT_PLT_PKT_CNT_MASK);
|
||||
rtw89_write16_set(rtwdev, reg, B_AX_BT_PLT_RST);
|
||||
|
||||
@ -5146,7 +5154,7 @@ static void rtw89_mac_bfee_standby_timer(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
u32 reg;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BF, "set bfee standby_timer to %d\n", keep);
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
if (keep) {
|
||||
set_bit(RTW89_FLAG_BFEE_TIMER_KEEP, rtwdev->flags);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_BFMEE_BFRP_RX_STANDBY_TIMER_MASK,
|
||||
@ -5165,7 +5173,7 @@ static void rtw89_mac_bfee_ctrl(struct rtw89_dev *rtwdev, u8 mac_idx, bool en)
|
||||
B_AX_BFMEE_HE_NDPA_EN;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BF, "set bfee ndpa_en to %d\n", en);
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
if (en) {
|
||||
set_bit(RTW89_FLAG_BFEE_EN, rtwdev->flags);
|
||||
rtw89_write32_set(rtwdev, reg, mask);
|
||||
@ -5187,30 +5195,30 @@ static int rtw89_mac_init_bfee(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
|
||||
/* AP mode set tx gid to 63 */
|
||||
/* STA mode set tx gid to 0(default) */
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BFMER_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMER_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_BFMER_NDP_BFEN);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx);
|
||||
rtw89_write32(rtwdev, reg, CSI_RRSC_BMAP);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_BFMEE_RESP_OPTION, mac_idx);
|
||||
val32 = FIELD_PREP(B_AX_BFMEE_NDP_RX_STANDBY_TIMER_MASK, NDP_RX_STANDBY_TIMER);
|
||||
rtw89_write32(rtwdev, reg, val32);
|
||||
rtw89_mac_bfee_standby_timer(rtwdev, mac_idx, true);
|
||||
rtw89_mac_bfee_ctrl(rtwdev, mac_idx, true);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL |
|
||||
B_AX_BFMEE_USE_NSTS |
|
||||
B_AX_BFMEE_CSI_GID_SEL |
|
||||
B_AX_BFMEE_CSI_FORCE_RETE_EN);
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RATE, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RATE, mac_idx);
|
||||
rtw89_write32(rtwdev, reg,
|
||||
u32_encode_bits(CSI_INIT_RATE_HT, B_AX_BFMEE_HT_CSI_RATE_MASK) |
|
||||
u32_encode_bits(CSI_INIT_RATE_VHT, B_AX_BFMEE_VHT_CSI_RATE_MASK) |
|
||||
u32_encode_bits(CSI_INIT_RATE_HE, B_AX_BFMEE_HE_CSI_RATE_MASK));
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_CSIRPT_OPTION, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_CSIRPT_OPTION, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg,
|
||||
B_AX_CSIPRT_VHTSU_AID_EN | B_AX_CSIPRT_HESU_AID_EN);
|
||||
|
||||
@ -5254,7 +5262,7 @@ static int rtw89_mac_set_csi_para_reg(struct rtw89_dev *rtwdev,
|
||||
nc = min(nc, sound_dim);
|
||||
nr = min(nr, sound_dim);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL);
|
||||
|
||||
val = FIELD_PREP(B_AX_BFMEE_CSIINFO0_NC_MASK, nc) |
|
||||
@ -5266,9 +5274,9 @@ static int rtw89_mac_set_csi_para_reg(struct rtw89_dev *rtwdev,
|
||||
FIELD_PREP(B_AX_BFMEE_CSIINFO0_STBC_EN, stbc_en);
|
||||
|
||||
if (port_sel == 0)
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
else
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_1, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_1, mac_idx);
|
||||
|
||||
rtw89_write16(rtwdev, reg, val);
|
||||
|
||||
@ -5304,11 +5312,11 @@ static int rtw89_mac_csi_rrsc(struct rtw89_dev *rtwdev,
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC5));
|
||||
}
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_AX_BFMEE_BFPARAM_SEL);
|
||||
rtw89_write32_clr(rtwdev, reg, B_AX_BFMEE_CSI_FORCE_RETE_EN);
|
||||
rtw89_write32(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx),
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_TRXPTCL_RESP_CSI_RRSC, mac_idx),
|
||||
rrsc);
|
||||
|
||||
return 0;
|
||||
@ -5346,19 +5354,21 @@ void rtw89_mac_bf_set_gid_table(struct rtw89_dev *rtwdev, struct ieee80211_vif *
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BF, "update bf GID table\n");
|
||||
|
||||
p = (__le32 *)conf->mu_group.membership;
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION_EN0, mac_idx),
|
||||
rtw89_write32(rtwdev,
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION_EN0, mac_idx),
|
||||
le32_to_cpu(p[0]));
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION_EN1, mac_idx),
|
||||
rtw89_write32(rtwdev,
|
||||
rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION_EN1, mac_idx),
|
||||
le32_to_cpu(p[1]));
|
||||
|
||||
p = (__le32 *)conf->mu_group.position;
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION0, mac_idx),
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION0, mac_idx),
|
||||
le32_to_cpu(p[0]));
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION1, mac_idx),
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION1, mac_idx),
|
||||
le32_to_cpu(p[1]));
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION2, mac_idx),
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION2, mac_idx),
|
||||
le32_to_cpu(p[2]));
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(R_AX_GID_POSITION3, mac_idx),
|
||||
rtw89_write32(rtwdev, rtw89_mac_reg_by_idx(rtwdev, R_AX_GID_POSITION3, mac_idx),
|
||||
le32_to_cpu(p[3]));
|
||||
}
|
||||
|
||||
@ -5449,7 +5459,7 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
return ret;
|
||||
}
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_AMPDU_AGG_LIMIT, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK,
|
||||
max_tx_time >> 5);
|
||||
}
|
||||
@ -5489,7 +5499,7 @@ int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
return ret;
|
||||
}
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_AMPDU_AGG_LIMIT, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx);
|
||||
*tx_time = rtw89_read32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK) << 5;
|
||||
}
|
||||
|
||||
@ -5531,7 +5541,7 @@ int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_TXCNT, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXCNT, mac_idx);
|
||||
*tx_retry = rtw89_read32_mask(rtwdev, reg, B_AX_L_TXCNT_LMT_MASK);
|
||||
}
|
||||
|
||||
@ -5550,7 +5560,7 @@ int rtw89_mac_set_hw_muedca_ctrl(struct rtw89_dev *rtwdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(R_AX_MUEDCA_EN, mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_MUEDCA_EN, mac_idx);
|
||||
if (en)
|
||||
rtw89_write16_set(rtwdev, reg, set);
|
||||
else
|
||||
@ -5673,3 +5683,12 @@ int rtw89_mac_ptk_drop_by_band_and_wait(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
|
||||
.band1_offset = RTW89_MAC_AX_BAND_REG_OFFSET,
|
||||
.filter_model_addr = R_AX_FILTER_MODEL_ADDR,
|
||||
.indir_access_addr = R_AX_INDIR_ACCESS_ENTRY,
|
||||
.mem_base_addrs = rtw89_mac_mem_base_addrs_ax,
|
||||
.rx_fltr = R_AX_RX_FLTR_OPT,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_mac_gen_ax);
|
||||
|
@ -275,6 +275,7 @@ enum rtw89_mac_dbg_port_sel {
|
||||
|
||||
/* SRAM mem dump */
|
||||
#define R_AX_INDIR_ACCESS_ENTRY 0x40000
|
||||
#define R_BE_INDIR_ACCESS_ENTRY 0x80000
|
||||
|
||||
#define AXIDMA_BASE_ADDR 0x18006000
|
||||
#define STA_SCHED_BASE_ADDR 0x18808000
|
||||
@ -298,6 +299,31 @@ enum rtw89_mac_dbg_port_sel {
|
||||
#define TXDATA_FIFO_1_BASE_ADDR 0x188A1000
|
||||
#define CPU_LOCAL_BASE_ADDR 0x18003000
|
||||
|
||||
#define WD_PAGE_BASE_ADDR_BE 0x0
|
||||
#define CPU_LOCAL_BASE_ADDR_BE 0x18003000
|
||||
#define AXIDMA_BASE_ADDR_BE 0x18006000
|
||||
#define SHARED_BUF_BASE_ADDR_BE 0x18700000
|
||||
#define DMAC_TBL_BASE_ADDR_BE 0x18800000
|
||||
#define SHCUT_MACHDR_BASE_ADDR_BE 0x18800800
|
||||
#define STA_SCHED_BASE_ADDR_BE 0x18818000
|
||||
#define NAT25_CAM_BASE_ADDR_BE 0x18820000
|
||||
#define RXPLD_FLTR_CAM_BASE_ADDR_BE 0x18823000
|
||||
#define SEC_CAM_BASE_ADDR_BE 0x18824000
|
||||
#define WOW_CAM_BASE_ADDR_BE 0x18828000
|
||||
#define MLD_TBL_BASE_ADDR_BE 0x18829000
|
||||
#define RX_CLSF_CAM_BASE_ADDR_BE 0x1882A000
|
||||
#define CMAC_TBL_BASE_ADDR_BE 0x18840000
|
||||
#define ADDR_CAM_BASE_ADDR_BE 0x18850000
|
||||
#define BSSID_CAM_BASE_ADDR_BE 0x18858000
|
||||
#define BA_CAM_BASE_ADDR_BE 0x18859000
|
||||
#define BCN_IE_CAM0_BASE_ADDR_BE 0x18860000
|
||||
#define TXDATA_FIFO_0_BASE_ADDR_BE 0x18861000
|
||||
#define TXD_FIFO_0_BASE_ADDR_BE 0x18862000
|
||||
#define BCN_IE_CAM1_BASE_ADDR_BE 0x18880000
|
||||
#define TXDATA_FIFO_1_BASE_ADDR_BE 0x18881000
|
||||
#define TXD_FIFO_1_BASE_ADDR_BE 0x18881800
|
||||
#define DCPU_LOCAL_BASE_ADDR_BE 0x19C02000
|
||||
|
||||
#define CCTL_INFO_SIZE 32
|
||||
|
||||
enum rtw89_mac_mem_sel {
|
||||
@ -322,13 +348,12 @@ enum rtw89_mac_mem_sel {
|
||||
RTW89_MAC_MEM_BSSID_CAM,
|
||||
RTW89_MAC_MEM_TXD_FIFO_0_V1,
|
||||
RTW89_MAC_MEM_TXD_FIFO_1_V1,
|
||||
RTW89_MAC_MEM_WD_PAGE,
|
||||
|
||||
/* keep last */
|
||||
RTW89_MAC_MEM_NUM,
|
||||
};
|
||||
|
||||
extern const u32 rtw89_mac_mem_base_addrs[];
|
||||
|
||||
enum rtw89_rpwm_req_pwr_state {
|
||||
RTW89_MAC_RPWM_REQ_PWR_STATE_ACTIVE = 0,
|
||||
RTW89_MAC_RPWM_REQ_PWR_STATE_BAND0_RFON = 1,
|
||||
@ -478,6 +503,7 @@ enum rtw89_mac_bf_rrsc_rate {
|
||||
({typeof(_addr) __addr = (_addr); \
|
||||
__addr >= R_AX_CMAC_REG_START && __addr <= R_AX_CMAC_REG_END; })
|
||||
#define RTW89_MAC_AX_BAND_REG_OFFSET 0x2000
|
||||
#define RTW89_MAC_BE_BAND_REG_OFFSET 0x4000
|
||||
|
||||
#define PTCL_IDLE_POLL_CNT 10000
|
||||
#define SW_CVR_DUR_US 8
|
||||
@ -826,14 +852,29 @@ struct rtw89_mac_size_set {
|
||||
|
||||
extern const struct rtw89_mac_size_set rtw89_mac_size;
|
||||
|
||||
static inline u32 rtw89_mac_reg_by_idx(u32 reg_base, u8 band)
|
||||
struct rtw89_mac_gen_def {
|
||||
u32 band1_offset;
|
||||
u32 filter_model_addr;
|
||||
u32 indir_access_addr;
|
||||
const u32 *mem_base_addrs;
|
||||
u32 rx_fltr;
|
||||
};
|
||||
|
||||
extern const struct rtw89_mac_gen_def rtw89_mac_gen_ax;
|
||||
extern const struct rtw89_mac_gen_def rtw89_mac_gen_be;
|
||||
|
||||
static inline
|
||||
u32 rtw89_mac_reg_by_idx(struct rtw89_dev *rtwdev, u32 reg_base, u8 band)
|
||||
{
|
||||
return band == 0 ? reg_base : (reg_base + 0x2000);
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
|
||||
return band == 0 ? reg_base : (reg_base + mac->band1_offset);
|
||||
}
|
||||
|
||||
static inline u32 rtw89_mac_reg_by_port(u32 base, u8 port, u8 mac_idx)
|
||||
static inline
|
||||
u32 rtw89_mac_reg_by_port(struct rtw89_dev *rtwdev, u32 base, u8 port, u8 mac_idx)
|
||||
{
|
||||
return rtw89_mac_reg_by_idx(base + port * 0x40, mac_idx);
|
||||
return rtw89_mac_reg_by_idx(rtwdev, base + port * 0x40, mac_idx);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
@ -841,7 +882,7 @@ rtw89_read32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
return rtw89_read32(rtwdev, reg);
|
||||
}
|
||||
|
||||
@ -851,7 +892,7 @@ rtw89_read32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
return rtw89_read32_mask(rtwdev, reg, mask);
|
||||
}
|
||||
|
||||
@ -861,7 +902,7 @@ rtw89_write32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write32(rtwdev, reg, data);
|
||||
}
|
||||
|
||||
@ -871,7 +912,7 @@ rtw89_write32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
@ -881,7 +922,7 @@ rtw89_write16_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write16_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
@ -891,7 +932,7 @@ rtw89_write32_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
@ -901,7 +942,7 @@ rtw89_write16_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write16_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
@ -911,7 +952,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
|
@ -224,6 +224,7 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
|
||||
u64 multicast)
|
||||
{
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
@ -271,13 +272,13 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
rtw89_write32_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_0),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_0),
|
||||
B_AX_RX_FLTR_CFG_MASK,
|
||||
rtwdev->hal.rx_fltr);
|
||||
if (!rtwdev->dbcc_en)
|
||||
goto out;
|
||||
rtw89_write32_mask(rtwdev,
|
||||
rtw89_mac_reg_by_idx(R_AX_RX_FLTR_OPT, RTW89_MAC_1),
|
||||
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_1),
|
||||
B_AX_RX_FLTR_CFG_MASK,
|
||||
rtwdev->hal.rx_fltr);
|
||||
|
||||
@ -296,7 +297,8 @@ static u8 rtw89_aifsn_to_aifs(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, u8 aifsn)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
|
||||
rtwvif->sub_entity_idx);
|
||||
u8 slot_time;
|
||||
u8 sifs;
|
||||
|
||||
@ -353,7 +355,7 @@ static void ____rtw89_conf_tx_mu_edca(struct rtw89_dev *rtwdev,
|
||||
val = FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_TIMER_MASK, timer_32us) |
|
||||
FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_CW_MASK, mu_edca->ecw_min_max) |
|
||||
FIELD_PREP(B_AX_MUEDCA_BE_PARAM_0_AIFS_MASK, aifs);
|
||||
reg = rtw89_mac_reg_by_idx(ac_to_mu_edca_param[ac], rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, ac_to_mu_edca_param[ac], rtwvif->mac_idx);
|
||||
rtw89_write32(rtwdev, reg, val);
|
||||
|
||||
rtw89_mac_set_hw_muedca_ctrl(rtwdev, rtwvif, true);
|
||||
@ -413,6 +415,8 @@ static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw,
|
||||
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, vif);
|
||||
rtw89_mac_port_update(rtwdev, rtwvif);
|
||||
rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, vif);
|
||||
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
} else {
|
||||
/* Abort ongoing scan if cancel_scan isn't issued
|
||||
* when disconnected by peer
|
||||
@ -476,6 +480,8 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
|
||||
rtw89_fw_h2c_join_info(rtwdev, rtwvif, NULL, true);
|
||||
rtw89_fw_h2c_cam(rtwdev, rtwvif, NULL, NULL);
|
||||
rtw89_chip_rfk_channel(rtwdev);
|
||||
|
||||
rtw89_queue_chanctx_work(rtwdev);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
|
38
drivers/net/wireless/realtek/rtw89/mac_be.c
Normal file
38
drivers/net/wireless/realtek/rtw89/mac_be.c
Normal file
@ -0,0 +1,38 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/* Copyright(c) 2019-2020 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include "mac.h"
|
||||
#include "reg.h"
|
||||
|
||||
static const u32 rtw89_mac_mem_base_addrs_be[RTW89_MAC_MEM_NUM] = {
|
||||
[RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_SHCUT_MACHDR] = SHCUT_MACHDR_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_STA_SCHED] = STA_SCHED_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_RXPLD_FLTR_CAM] = RXPLD_FLTR_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_SECURITY_CAM] = SEC_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_WOW_CAM] = WOW_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_CMAC_TBL] = CMAC_TBL_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_ADDR_CAM] = ADDR_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_BA_CAM] = BA_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_BCN_IE_CAM0] = BCN_IE_CAM0_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_BCN_IE_CAM1] = BCN_IE_CAM1_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_TXD_FIFO_0] = TXD_FIFO_0_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_TXD_FIFO_1] = TXD_FIFO_1_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_TXDATA_FIFO_0] = TXDATA_FIFO_0_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_CPU_LOCAL] = CPU_LOCAL_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_BSSID_CAM] = BSSID_CAM_BASE_ADDR_BE,
|
||||
[RTW89_MAC_MEM_WD_PAGE] = WD_PAGE_BASE_ADDR_BE,
|
||||
};
|
||||
|
||||
const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
|
||||
.band1_offset = RTW89_MAC_BE_BAND_REG_OFFSET,
|
||||
.filter_model_addr = R_BE_FILTER_MODEL_ADDR,
|
||||
.indir_access_addr = R_BE_INDIR_ACCESS_ENTRY,
|
||||
.mem_base_addrs = rtw89_mac_mem_base_addrs_be,
|
||||
.rx_fltr = R_BE_RX_FLTR_OPT,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_mac_gen_be);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user