wifi: ath12k: switch to using wiphy_lock()
v4 cover wifi: ath12k: switch to using wiphy_lock()
From: Kalle Valo <[email protected]>
Convert all uses of struct ath12k::conf_mutex to use struct wiphy::mtx, which is already used by mac80211, and remove conf_mutex from ath12k. This way we have one mutex less in ath12k and simpler locking design.
v4:
* patch 2: s/praparation/preparation/
* ath12k_mac_op_assign_vif_chanctx(): lockdep_assert_wiphy() was twice
* ath12k_mac_vdev_create()(): lockdep_assert_wiphy() was twice
* as this is now tested with MLO remove RFC tag, this patchset should be ready now
v3: https://patchwork.kernel.org/project/linux-wireless/cover/[email protected]/
* new patch: wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
* new patch: wifi: ath12k: ath12k_mac_op_sta_state(): clean up update_wk cancellation
* patch 3: ath12k_core_post_reconfigure_recovery(): take wiphy lock before hw_mutex to avoid a lockdep warning
* patch 3: ath12k_sta_rc_update_wk(): remove extra wiphy_lock() calls
* patch 3: update commit message, especially remove the sparse warning which was already fixed
* rebase to ath-202409191620
v2: https://patchwork.kernel.org/project/linux-wireless/cover/[email protected]/
* rebase to ath-202409051620
* patch 1: ath12k_wow_op_suspend(): remove extra wiphy_lock()/unlock() (Baochen)
* patch 1: fix clang warnings about unused labels (Johannes)
* patch 2: s/no/now/ (Jeff)
* patch 4: ath12k_sta_rc_update_wk(): fix wiphy_priv() usage
v1: https://patchwork.kernel.org/project/linux-wireless/cover/[email protected]/
Kalle Valo (6):
wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
wifi: ath12k: convert struct ath12k_sta::update_wk to use struct
wiphy_work
wifi: ath12k: switch to using wiphy_lock() and remove ar->conf_mutex
wifi: ath12k: cleanup unneeded labels
wifi: ath12k: ath12k_mac_set_key(): remove exit label
wifi: ath12k: ath12k_mac_op_sta_state(): clean up update_wk
cancellation
drivers/net/wireless/ath/ath12k/core.c | 7 +- drivers/net/wireless/ath/ath12k/core.h | 7 +- drivers/net/wireless/ath/ath12k/debugfs.c | 4 +- .../wireless/ath/ath12k/debugfs_htt_stats.c | 26 +- drivers/net/wireless/ath/ath12k/mac.c | 387 +++++++----------- drivers/net/wireless/ath/ath12k/peer.c | 6 +- drivers/net/wireless/ath/ath12k/wow.c | 26 +- 7 files changed, 190 insertions(+), 273 deletions(-)
base-commit: 1a0c640ce1cdcde3eb131a0c1e70ca1ed7cf27cb
Signature · 1 line
2.39.5
PATCH v4 1/6 wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
From: Kalle Valo <[email protected]>
When I try to manually set bitrates:
iw wlan0 set bitrates legacy-2.4 1
I get sleeping from invalid context error, see below. Fix that by switching to use recently introduced ieee80211_iterate_stations_mtx().
Do note that WCN6855 firmware is still crashing, I'm not sure if that firmware even supports bitrate WMI commands and should we consider disabling ath12k_mac_op_set_bitrate_mask() for WCN6855? But that's for another patch.
BUG: sleeping function called from invalid context at drivers/net/wireless/ath/ath12k/wmi.c:420
in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 2236, name: iwpreempt_count: 0, expected: 0
RCU nest depth: 1, expected: 0
3 locks held by iw/2236:
#0: ffffffffabc6f1d8 (cb_lock){++++}-{3:3}, at: genl_rcv+0x14/0x40
#1: ffff888138410810 (&rdev->wiphy.mtx){+.+.}-{3:3}, at: nl80211_pre_doit+0x54d/0x800 [cfg80211] #2: ffffffffab2cfaa0 (rcu_read_lock){....}-{1:2}, at: ieee80211_iterate_stations_atomic+0x2f/0x200 [mac80211]
CPU: 3 UID: 0 PID: 2236 Comm: iw Not tainted 6.11.0-rc7-wt-ath+ #1772 Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021 Call Trace: <TASK> dump_stack_lvl+0xa4/0xe0 dump_stack+0x10/0x20 __might_resched+0x363/0x5a0 ? __alloc_skb+0x165/0x340 __might_sleep+0xad/0x160 ath12k_wmi_cmd_send+0xb1/0x3d0 [ath12k] ? ath12k_wmi_init_wcn7850+0xa40/0xa40 [ath12k] ? __netdev_alloc_skb+0x45/0x7b0 ? __asan_memset+0x39/0x40 ? ath12k_wmi_alloc_skb+0xf0/0x150 [ath12k] ? reacquire_held_locks+0x4d0/0x4d0 ath12k_wmi_set_peer_param+0x340/0x5b0 [ath12k] ath12k_mac_disable_peer_fixed_rate+0xa3/0x110 [ath12k] ? ath12k_mac_vdev_stop+0x4f0/0x4f0 [ath12k] ieee80211_iterate_stations_atomic+0xd4/0x200 [mac80211] ath12k_mac_op_set_bitrate_mask+0x5d2/0x1080 [ath12k] ? ath12k_mac_vif_chan+0x320/0x320 [ath12k] drv_set_bitrate_mask+0x267/0x470 [mac80211] ieee80211_set_bitrate_mask+0x4cc/0x8a0 [mac80211] ? __this_cpu_preempt_check+0x13/0x20 nl80211_set_tx_bitrate_mask+0x2bc/0x530 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? trace_contention_end+0xef/0x140 ? rtnl_unlock+0x9/0x10 ? nl80211_pre_doit+0x557/0x800 [cfg80211] genl_family_rcv_msg_doit+0x1f0/0x2e0 ? genl_family_rcv_msg_attrs_parse.isra.0+0x250/0x250 ? ns_capable+0x57/0xd0 genl_family_rcv_msg+0x34c/0x600 ? genl_family_rcv_msg_dumpit+0x310/0x310 ? __lock_acquire+0xc62/0x1de0 ? he_set_mcs_mask.isra.0+0x8d0/0x8d0 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? cfg80211_external_auth_request+0x690/0x690 [cfg80211] genl_rcv_msg+0xa0/0x130 netlink_rcv_skb+0x14c/0x400 ? genl_family_rcv_msg+0x600/0x600 ? netlink_ack+0xd70/0xd70 ? rwsem_optimistic_spin+0x4f0/0x4f0 ? genl_rcv+0x14/0x40 ? down_read_killable+0x580/0x580 ? netlink_deliver_tap+0x13e/0x350 ? __this_cpu_preempt_check+0x13/0x20 genl_rcv+0x23/0x40 netlink_unicast+0x45e/0x790 ? netlink_attachskb+0x7f0/0x7f0 netlink_sendmsg+0x7eb/0xdb0 ? netlink_unicast+0x790/0x790 ? __this_cpu_preempt_check+0x13/0x20 ? selinux_socket_sendmsg+0x31/0x40 ? netlink_unicast+0x790/0x790 __sock_sendmsg+0xc9/0x160 ____sys_sendmsg+0x620/0x990 ? kernel_sendmsg+0x30/0x30 ? __copy_msghdr+0x410/0x410 ? __kasan_check_read+0x11/0x20 ? mark_lock+0xe6/0x1470 ___sys_sendmsg+0xe9/0x170 ? copy_msghdr_from_user+0x120/0x120 ? __lock_acquire+0xc62/0x1de0 ? do_fault_around+0x2c6/0x4e0 ? do_user_addr_fault+0x8c1/0xde0 ? reacquire_held_locks+0x220/0x4d0 ? do_user_addr_fault+0x8c1/0xde0 ? __kasan_check_read+0x11/0x20 ? __fdget+0x4e/0x1d0 ? sockfd_lookup_light+0x1a/0x170 __sys_sendmsg+0xd2/0x180 ? __sys_sendmsg_sock+0x20/0x20 ? reacquire_held_locks+0x4d0/0x4d0 ? debug_smp_processor_id+0x17/0x20 __x64_sys_sendmsg+0x72/0xb0 ? lockdep_hardirqs_on+0x7d/0x100 x64_sys_call+0x894/0x9f0 do_syscall_64+0x64/0x130 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7f230fe04807 Code: 64 89 02 48 c7 c0 ff ff ff ff eb bb 0f 1f 80 00 00 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10 RSP: 002b:00007ffe996a7ea8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000556f9f9c3390 RCX: 00007f230fe04807 RDX: 0000000000000000 RSI: 00007ffe996a7ee0 RDI: 0000000000000003 RBP: 0000556f9f9c88c0 R08: 0000000000000002 R09: 0000000000000000 R10: 0000556f965ca190 R11: 0000000000000246 R12: 0000556f9f9c8780 R13: 00007ffe996a7ee0 R14: 0000556f9f9c87d0 R15: 0000556f9f9c88c0 </TASK>
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +9 -9
@@ -8186,9 +8186,9 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, arvif->vdev_id, ret); goto out; } -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_disable_peer_fixed_rate, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_disable_peer_fixed_rate, + arvif); }else if (ath12k_mac_bitrate_mask_get_single_nss (ar, band, mask, &single_nss)) { rate =WMI_FIXED_RATE_NONE ;
@@ -8233,16 +8233,16 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, goto out; } -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_disable_peer_fixed_rate, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_disable_peer_fixed_rate, + arvif);mutex_lock (&ar->conf_mutex); arvif->bitrate_mask = *mask; -ieee80211_iterate_stations_atomic (hw, - ath12k_mac_set_bitrate_mask_iter, - arvif); +ieee80211_iterate_stations_mtx (hw, + ath12k_mac_set_bitrate_mask_iter, + arvif);mutex_unlock (&ar->conf_mutex); }
Signature · 1 line
2.39.5
Re: [PATCH v4 1/6] wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
Quoted 111 lines · Kalle Valo
From: Kalle Valo <[email protected]>
When I try to manually set bitrates:
iw wlan0 set bitrates legacy-2.4 1
I get sleeping from invalid context error, see below. Fix that by switching to use recently introduced
ieee80211_iterate_stations_mtx().Do note that WCN6855 firmware is still crashing, I'm not sure if that firmware even supports bitrate WMI commands and should we consider disabling
ath12k_mac_op_set_bitrate_mask()for WCN6855? But that's for another patch.BUG: sleeping function called from invalid context at drivers/net/wireless/ath/ath12k/wmi.c:420
in_atomic(): 0,irqs_disabled(): 0,non_block: 0, pid: 2236, name: iwpreempt_count: 0, expected: 0
RCU nest depth: 1, expected: 0
3 locks held by iw/2236:
#0:ffffffffabc6f1d8(cb_lock){++++}-{3:3}, at:genl_rcv+0x14/0x40
#1:ffff888138410810(&rdev->wiphy.mtx){+.+.}-{3:3}, at:nl80211_pre_doit+0x54d/0x800[cfg80211] #2:ffffffffab2cfaa0(rcu_read_lock){....}-{1:2}, at:ieee80211_iterate_stations_atomic+0x2f/0x200[mac80211]CPU: 3 UID: 0 PID: 2236 Comm: iw Not tainted 6.11.0-rc7-wt-ath+ #1772 Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021 Call Trace: <TASK> dump_stack_lvl+0xa4/0xe0 dump_stack+0x10/0x20 __might_resched+0x363/0x5a0 ? __alloc_skb+0x165/0x340 __might_sleep+0xad/0x160 ath12k_wmi_cmd_send+0xb1/0x3d0 [ath12k] ? ath12k_wmi_init_wcn7850+0xa40/0xa40 [ath12k] ? __netdev_alloc_skb+0x45/0x7b0 ? __asan_memset+0x39/0x40 ? ath12k_wmi_alloc_skb+0xf0/0x150 [ath12k] ? reacquire_held_locks+0x4d0/0x4d0 ath12k_wmi_set_peer_param+0x340/0x5b0 [ath12k] ath12k_mac_disable_peer_fixed_rate+0xa3/0x110 [ath12k] ? ath12k_mac_vdev_stop+0x4f0/0x4f0 [ath12k] ieee80211_iterate_stations_atomic+0xd4/0x200 [mac80211] ath12k_mac_op_set_bitrate_mask+0x5d2/0x1080 [ath12k] ? ath12k_mac_vif_chan+0x320/0x320 [ath12k] drv_set_bitrate_mask+0x267/0x470 [mac80211] ieee80211_set_bitrate_mask+0x4cc/0x8a0 [mac80211] ? __this_cpu_preempt_check+0x13/0x20 nl80211_set_tx_bitrate_mask+0x2bc/0x530 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? trace_contention_end+0xef/0x140 ? rtnl_unlock+0x9/0x10 ? nl80211_pre_doit+0x557/0x800 [cfg80211] genl_family_rcv_msg_doit+0x1f0/0x2e0 ? genl_family_rcv_msg_attrs_parse.isra.0+0x250/0x250 ? ns_capable+0x57/0xd0 genl_family_rcv_msg+0x34c/0x600 ? genl_family_rcv_msg_dumpit+0x310/0x310 ? __lock_acquire+0xc62/0x1de0 ? he_set_mcs_mask.isra.0+0x8d0/0x8d0 [cfg80211] ? nl80211_parse_tx_bitrate_mask+0x2320/0x2320 [cfg80211] ? cfg80211_external_auth_request+0x690/0x690 [cfg80211] genl_rcv_msg+0xa0/0x130 netlink_rcv_skb+0x14c/0x400 ? genl_family_rcv_msg+0x600/0x600 ? netlink_ack+0xd70/0xd70 ? rwsem_optimistic_spin+0x4f0/0x4f0 ? genl_rcv+0x14/0x40 ? down_read_killable+0x580/0x580 ? netlink_deliver_tap+0x13e/0x350 ? __this_cpu_preempt_check+0x13/0x20 genl_rcv+0x23/0x40 netlink_unicast+0x45e/0x790 ? netlink_attachskb+0x7f0/0x7f0 netlink_sendmsg+0x7eb/0xdb0 ? netlink_unicast+0x790/0x790 ? __this_cpu_preempt_check+0x13/0x20 ? selinux_socket_sendmsg+0x31/0x40 ? netlink_unicast+0x790/0x790 __sock_sendmsg+0xc9/0x160 ____sys_sendmsg+0x620/0x990 ? kernel_sendmsg+0x30/0x30 ? __copy_msghdr+0x410/0x410 ? __kasan_check_read+0x11/0x20 ? mark_lock+0xe6/0x1470 ___sys_sendmsg+0xe9/0x170 ? copy_msghdr_from_user+0x120/0x120 ? __lock_acquire+0xc62/0x1de0 ? do_fault_around+0x2c6/0x4e0 ? do_user_addr_fault+0x8c1/0xde0 ? reacquire_held_locks+0x220/0x4d0 ? do_user_addr_fault+0x8c1/0xde0 ? __kasan_check_read+0x11/0x20 ? __fdget+0x4e/0x1d0 ? sockfd_lookup_light+0x1a/0x170 __sys_sendmsg+0xd2/0x180 ? __sys_sendmsg_sock+0x20/0x20 ? reacquire_held_locks+0x4d0/0x4d0 ? debug_smp_processor_id+0x17/0x20 __x64_sys_sendmsg+0x72/0xb0 ? lockdep_hardirqs_on+0x7d/0x100 x64_sys_call+0x894/0x9f0 do_syscall_64+0x64/0x130 entry_SYSCALL_64_after_hwframe+0x4b/0x53 RIP: 0033:0x7f230fe04807 Code: 64 89 02 48 c7 c0 ff ff ff ff eb bb 0f 1f 80 00 00 00 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 51 c3 48 83 ec 28 89 54 24 1c 48 89 74 24 10 RSP: 002b:00007ffe996a7ea8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 0000556f9f9c3390 RCX: 00007f230fe04807 RDX: 0000000000000000 RSI: 00007ffe996a7ee0 RDI: 0000000000000003 RBP: 0000556f9f9c88c0 R08: 0000000000000002 R09: 0000000000000000 R10: 0000556f965ca190 R11: 0000000000000246 R12: 0000556f9f9c8780 R13: 00007ffe996a7ee0 R14: 0000556f9f9c87d0 R15: 0000556f9f9c88c0 </TASK>
Quoted 3 lines
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Signed-off-by Kalle Valo <[email protected]>
Note that current checkpatch.pl says:
WARNING:MISSING_FIXES_TAG: The commit message has 'Call Trace:', perhaps it also needs a 'Fixes:' tag?
Is this worthy?
Or since firmware still crashes do we not consider this issue fixed?
PATCH v4 2/6 wifi: ath12k: convert struct ath12k_sta::update_wk to use struct wiphy_work
In reply to Kalle ValoFrom: Kalle Valo <[email protected]>
For preparation to switch ath12k to use wiphy_lock() we can convert ath12k_sta_rc_update_wk() to use wiphy_work_queue() for consistency. To avoid any deadlocks do the struct ath12k_sta::update_wk conversion before switching to using wiphy_lock() throughout the driver.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.h | 2 +- drivers/net/wireless/ath/ath12k/mac.c | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-)
drivers/net/wireless/ath/ath12k/core.h +1 -1
@@ -451,7 +451,7 @@ struct ath12k_sta {u32 smps;enum hal_pn_type pn_type; -struct work_struct update_wk; +struct wiphy_work update_wk;struct rate_info txrate;struct rate_info last_txrate;u64 rx_duration;
drivers/net/wireless/ath/ath12k/mac.c +7 -5
@@ -4273,7 +4273,7 @@ static int ath12k_station_disassoc(struct ath12k *ar,return 0 ; } -static void ath12k_sta_rc_update_wk (struct work_struct *wk) +static void ath12k_sta_rc_update_wk (struct wiphy *wiphy,struct wiphy_work *wk) {struct ath12k *ar;struct ath12k_vif *arvif;
@@ -4289,6 +4289,8 @@ static void ath12k_sta_rc_update_wk(struct work_struct *wk)struct ath12k_wmi_peer_assoc_arg peer_arg;enum wmi_phy_mode peer_phymode; +lockdep_assert_wiphy (wiphy); + arsta = container_of(wk, struct ath12k_sta, update_wk); sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv); arvif = arsta->arvif;
@@ -4586,7 +4588,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,/* cancel must be done outside the mutex to avoid deadlock */ if ((old_state ==IEEE80211_STA_NONE && new_state ==IEEE80211_STA_NOTEXIST )) -cancel_work_sync (&arsta->update_wk); +wiphy_work_cancel (hw->wiphy, &arsta->update_wk); ar =ath12k_get_ar_by_vif (hw, vif);if (!ar) {
@@ -4600,7 +4602,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, new_state == IEEE80211_STA_NONE) {memset (arsta,0 ,sizeof (*arsta)); arsta->arvif = arvif; -INIT_WORK (&arsta->update_wk, ath12k_sta_rc_update_wk); +wiphy_work_init (&arsta->update_wk, ath12k_sta_rc_update_wk); ret =ath12k_mac_station_add (ar, vif, sta);if (ret)
@@ -4811,7 +4813,7 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,spin_unlock_bh (&ar->data_lock); -ieee80211_queue_work (hw, &arsta->update_wk); +wiphy_work_queue (hw->wiphy, &arsta->update_wk); } static int ath12k_conf_tx_uapsd(struct ath12k_vif *arvif,
@@ -8113,7 +8115,7 @@ static void ath12k_mac_set_bitrate_mask_iter(void *data, arsta->changed |=IEEE80211_RC_SUPP_RATES_CHANGED ;spin_unlock_bh (&ar->data_lock); -ieee80211_queue_work (ath12k_ar_to_hw (ar), &arsta->update_wk); +wiphy_work_queue (ath12k_ar_to_hw (ar)->wiphy, &arsta->update_wk); } static void ath12k_mac_disable_peer_fixed_rate(void *data,
Signature · 1 line
2.39.5
PATCH v4 3/6 wifi: ath12k: switch to using wiphy_lock() and remove ar->conf_mutex
In reply to Kalle ValoFrom: Kalle Valo <[email protected]>
Switch from using driver specific ar->conf_mutex to wiphy->mtx. The benefits are:
* one lock less and simplified locking
* possibility to use wiphy_work_queue() without other locks
Most of the mac80211 ops are called within wiphy_lock(), most notable exception being tx op. This can be checked with lockdep_assert_wiphy() from net/mac80211/driver-ops.[ch] and I veried that by manually going through all the ops in ath12k_ops which had lockdep_assert_wiphy().
The conversion was simple:
* All conf_mutex lock() and unlock() calls which already were called under wiphy_lock() I replaced with lockdep_assert_wiphy().
* The rest of conf_mutex calls I replaced with wiphy_lock() and wiphy_unlock().
* All lockdep_asset_held(conf_mutex) calls I replaced with lockdep_assert_wiphy().
One exception was in ath12k_core_post_reconfigure_recovery() where the wiphy lock needs to be taken before hw_mutex to avoid a lockdep warning.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.c | 7 +- drivers/net/wireless/ath/ath12k/core.h | 5 +- drivers/net/wireless/ath/ath12k/debugfs.c | 4 +- .../wireless/ath/ath12k/debugfs_htt_stats.c | 26 +- drivers/net/wireless/ath/ath12k/mac.c | 276 +++++++----------- drivers/net/wireless/ath/ath12k/peer.c | 6 +- drivers/net/wireless/ath/ath12k/wow.c | 26 +- 7 files changed, 141 insertions(+), 209 deletions(-)
drivers/net/wireless/ath/ath12k/core.c +3 -4
@@ -1004,7 +1004,7 @@ void ath12k_core_halt(struct ath12k *ar) {struct ath12k_base *ab = ar->ab; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy); ar->num_created_vdevs =0 ; ar->allocated_vdev_map =0 ;
@@ -1078,6 +1078,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)if (!ah || ah->state ==ATH12K_HW_STATE_OFF )continue ; +wiphy_lock (ah->hw->wiphy);mutex_lock (&ah->hw_mutex);switch (ah->state) {
@@ -1086,10 +1087,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)for (j =0 ; j < ah->num_radio; j++) { ar = &ah->radio[j]; - -mutex_lock (&ar->conf_mutex);ath12k_core_halt (ar); -mutex_unlock (&ar->conf_mutex); }break ;
@@ -1110,6 +1108,7 @@ static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab) }mutex_unlock (&ah->hw_mutex); +wiphy_unlock (ah->hw->wiphy); }complete (&ab->driver_recovery);
drivers/net/wireless/ath/ath12k/core.h +1 -4
@@ -562,10 +562,7 @@ struct ath12k {u32 num_stations;u32 max_num_stations;bool monitor_present; -/* To synchronize concurrent synchronous mac80211 callback operations, -* concurrent debugfs configuration and concurrent FW statistics events. -*/ -struct mutex conf_mutex; +/* protects the radio specific data like debug stats, ppdu_stats_info stats, * vdev_stop_status info, scan data, ath12k_sta info, ath12k_vif info, * channel context data, survey info, test mode data.
drivers/net/wireless/ath/ath12k/debugfs.c +2 -2
@@ -15,14 +15,14 @@ static ssize_t ath12k_write_simulate_radar(struct file *file,struct ath12k *ar = file->private_data;int ret; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy); ret =ath12k_wmi_simulate_radar (ar);if (ret) goto exit; ret = count; exit: -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return ret; }
drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c +13 -13
@@ -1627,9 +1627,9 @@ static ssize_t ath12k_read_htt_stats_type(struct file *file,char buf[32 ];size_t len; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy); type = ar->debug.htt_stats.type; -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy); len =scnprintf (buf,sizeof (buf),"%u\n" , type);
@@ -1662,7 +1662,7 @@ static ssize_t ath12k_write_htt_stats_type(struct file *file, type >= ATH12K_DBG_HTT_NUM_EXT_STATS)return -EINVAL ; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy); ar->debug.htt_stats.type = type; ar->debug.htt_stats.cfg_param[0 ] = cfg_param[0 ];
@@ -1670,7 +1670,7 @@ static ssize_t ath12k_write_htt_stats_type(struct file *file, ar->debug.htt_stats.cfg_param[2 ] = cfg_param[2 ]; ar->debug.htt_stats.cfg_param[3 ] = cfg_param[3 ]; -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return count; }
@@ -1691,7 +1691,7 @@ static int ath12k_debugfs_htt_stats_req(struct ath12k *ar)int ret, pdev_id;struct htt_ext_stats_cfg_params cfg_params = {0 }; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);init_completion (&stats_req->htt_stats_rcvd);
@@ -1741,7 +1741,7 @@ static int ath12k_open_htt_stats(struct inode *inode,if (type ==ATH12K_DBG_HTT_EXT_STATS_RESET )return -EPERM ; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy);if (ah->state !=ATH12K_HW_STATE_ON ) { ret = -ENETDOWN ;
@@ -1776,14 +1776,14 @@ static int ath12k_open_htt_stats(struct inode *inode, file->private_data = stats_req; -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return 0 ; out:kfree (stats_req); ar->debug.htt_stats.stats_req =NULL ; err_unlock: -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return ret; }
@@ -1793,10 +1793,10 @@ static int ath12k_release_htt_stats(struct inode *inode, {struct ath12k *ar = inode->i_private; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy);kfree (file->private_data); ar->debug.htt_stats.stats_req =NULL ; -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return 0 ; }
@@ -1840,7 +1840,7 @@ static ssize_t ath12k_write_htt_stats_reset(struct file *file, type == ATH12K_DBG_HTT_EXT_STATS_RESET)return -E2BIG ; -mutex_lock (&ar->conf_mutex); +wiphy_lock (ath12k_ar_to_hw (ar)->wiphy); cfg_params.cfg0 =HTT_STAT_DEFAULT_RESET_START_OFFSET ; param_pos = (type >>5 ) +1 ;
@@ -1866,12 +1866,12 @@ static ssize_t ath12k_write_htt_stats_reset(struct file *file, 0ULL);if (ret) {ath12k_warn (ar->ab,"failed to send htt stats request: %d\n" , ret); -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return ret; } ar->debug.htt_stats.reset = type; -mutex_unlock (&ar->conf_mutex); +wiphy_unlock (ath12k_ar_to_hw (ar)->wiphy);return count; }
drivers/net/wireless/ath/ath12k/mac.c +107 -169
1,065 lines not on this page · raw message
drivers/net/wireless/ath/ath12k/peer.c +3 -3
@@ -186,7 +186,7 @@ void ath12k_peer_cleanup(struct ath12k *ar, u32 vdev_id)struct ath12k_peer *peer, *tmp;struct ath12k_base *ab = ar->ab; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);spin_lock_bh (&ab->base_lock);list_for_each_entry_safe (peer, tmp, &ab->peers, list) {
@@ -235,7 +235,7 @@ int ath12k_peer_delete(struct ath12k *ar, u32 vdev_id, u8 *addr) {int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);reinit_completion (&ar->peer_delete_done);
@@ -268,7 +268,7 @@ int ath12k_peer_create(struct ath12k *ar, struct ath12k_vif *arvif,struct ath12k_peer *peer;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);if (ar->num_peers > (ar->max_num_peers -1 )) { ath12k_warn(ar->ab,
drivers/net/wireless/ath/ath12k/wow.c +12 -14
@@ -132,7 +132,7 @@ static int ath12k_wow_cleanup(struct ath12k *ar)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) { ret =ath12k_wow_vif_cleanup (arvif);
@@ -476,7 +476,7 @@ static int ath12k_wow_set_wakeups(struct ath12k *ar,struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) {if (ath12k_wow_is_p2p_vdev (arvif))
@@ -535,7 +535,7 @@ static int ath12k_wow_nlo_cleanup(struct ath12k *ar)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) {if (ath12k_wow_is_p2p_vdev (arvif))
@@ -558,7 +558,7 @@ static int ath12k_wow_set_hw_filter(struct ath12k *ar)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) {if (arvif->vdev_type !=WMI_VDEV_TYPE_STA )
@@ -584,7 +584,7 @@ static int ath12k_wow_clear_hw_filter(struct ath12k *ar)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) {if (arvif->vdev_type !=WMI_VDEV_TYPE_STA )
@@ -735,7 +735,7 @@ static int ath12k_wow_arp_ns_offload(struct ath12k *ar, bool enable)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy); offload =kmalloc (sizeof (*offload),GFP_KERNEL );if (!offload)
@@ -769,7 +769,7 @@ static int ath12k_gtk_rekey_offload(struct ath12k *ar, bool enable)struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) { if (arvif->vdev_type != WMI_VDEV_TYPE_STA ||
@@ -827,7 +827,7 @@ static int ath12k_wow_set_keepalive(struct ath12k *ar,struct ath12k_vif *arvif;int ret; -lockdep_assert_held (&ar->conf_mutex); +lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);list_for_each_entry (arvif, &ar->arvifs, list) { ret =ath12k_mac_vif_set_keepalive (arvif, method, interval);
@@ -845,7 +845,7 @@ int ath12k_wow_op_suspend(struct ieee80211_hw *hw,struct ath12k *ar =ath12k_ah_to_ar (ah,0 );int ret; -mutex_lock (&ar->conf_mutex); +lockdep_assert_wiphy (hw->wiphy); ret =ath12k_wow_cleanup (ar);if (ret) {
@@ -913,7 +913,6 @@ int ath12k_wow_op_suspend(struct ieee80211_hw *hw,ath12k_wow_cleanup (ar); exit: -mutex_unlock (&ar->conf_mutex);return ret ?1 :0 ; }
@@ -922,9 +921,9 @@ void ath12k_wow_op_set_wakeup(struct ieee80211_hw *hw, bool enabled)struct ath12k_hw *ah =ath12k_hw_to_ah (hw);struct ath12k *ar =ath12k_ah_to_ar (ah,0 ); -mutex_lock (&ar->conf_mutex); +lockdep_assert_wiphy (hw->wiphy); +device_set_wakeup_enable (ar->ab->dev, enabled); -mutex_unlock (&ar->conf_mutex); }int ath12k_wow_op_resume (struct ieee80211_hw *hw)
@@ -933,7 +932,7 @@ int ath12k_wow_op_resume(struct ieee80211_hw *hw)struct ath12k *ar =ath12k_ah_to_ar (ah,0 );int ret; -mutex_lock (&ar->conf_mutex); +lockdep_assert_wiphy (hw->wiphy); ret =ath12k_hif_resume (ar->ab);if (ret) {
@@ -995,7 +994,6 @@ int ath12k_wow_op_resume(struct ieee80211_hw *hw) } } -mutex_unlock (&ar->conf_mutex);return ret; }
Signature · 1 line
2.39.5
Re: [PATCH v4 3/6] wifi: ath12k: switch to using wiphy_lock() and remove ar->conf_mutex
Quoted 1 line · Kalle Valo
From: Kalle Valo <[email protected]>
...
Quoted 1 line
drivers/net/wireless/ath/ath12k/peer.c | 6 +-
This file is missing the Qualcomm Innovation Center 2024 copyright I'll add that in pending
PATCH v4 4/6 wifi: ath12k: cleanup unneeded labels
In reply to Kalle ValoFrom: Kalle Valo <[email protected]>
After removing the conf_mutex in the previous patch there are now unnecessary labels in mac.c. Remove those and instead use directly return.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 56 +++++++++++---------------- 1 file changed, 22 insertions(+), 34 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +22 -34
@@ -1282,24 +1282,23 @@ static int ath12k_mac_config(struct ath12k *ar, u32 changed) ar->monitor_conf_enabled = conf->flags &IEEE80211_CONF_MONITOR ;if (ar->monitor_conf_enabled) {if (ar->monitor_vdev_created) - goto exit; +return ret; ret =ath12k_mac_monitor_vdev_create (ar);if (ret) - goto exit; +return ret; ret =ath12k_mac_monitor_start (ar);if (ret) goto err_mon_del; }else {if (!ar->monitor_vdev_created) - goto exit; +return ret; ret =ath12k_mac_monitor_stop (ar);if (ret) - goto exit; +return ret;ath12k_mac_monitor_vdev_delete (ar); } } -exit:return ret; err_mon_del:
@@ -4717,10 +4716,9 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,if (ret) {ath12k_warn (ar->ab,"failed to set tx power for station ret: %d\n" , ret); - goto out; +return ret; } -out:return ret; }
@@ -6472,7 +6470,7 @@ static int ath12k_mac_vdev_create(struct ath12k *ar, struct ieee80211_vif *vif)if (ret) {ath12k_warn (ab,"failed to create WMI vdev %d: %d\n" , arvif->vdev_id, ret); - goto err; +return ret; } ar->num_created_vdevs++;
@@ -6589,13 +6587,13 @@ static int ath12k_mac_vdev_create(struct ath12k *ar, struct ieee80211_vif *vif)if (ret) {ath12k_warn (ar->ab,"failed to delete peer vdev_id %d addr %pM\n" , arvif->vdev_id, vif->addr); - goto err; +return ret; } ret =ath12k_wait_for_peer_delete_done (ar, arvif->vdev_id, vif->addr);if (ret) - goto err; +return ret; ar->num_peers--; }
@@ -7625,21 +7623,18 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, arvif->vdev_type != WMI_VDEV_TYPE_MONITOR && !ath12k_peer_exist_by_vdev_id(ab, arvif->vdev_id)) {memcpy (&arvif->chanctx, ctx,sizeof (*ctx)); - ret =0 ; - goto out; +return 0 ; } -if (WARN_ON (arvif->is_started)) { - ret = -EBUSY ; - goto out; - } +if (WARN_ON (arvif->is_started)) +return -EBUSY ;if (arvif->vdev_type ==WMI_VDEV_TYPE_MONITOR ) { ret =ath12k_mac_monitor_start (ar);if (ret) - goto out; +return ret; arvif->is_started = true; - goto out; +return ret; } ret =ath12k_mac_vdev_start (arvif, ctx);
@@ -7647,7 +7642,7 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,ath12k_warn (ab,"failed to start vdev %i addr %pM on freq %d: %d\n" , arvif->vdev_id, vif->addr, ctx->def.chan->center_freq, ret); - goto out; +return ret; }if (arvif->vdev_type !=WMI_VDEV_TYPE_MONITOR && ar->monitor_vdev_created)
@@ -7657,7 +7652,6 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,/* TODO: Setup ps and cts/rts protection */ -out:return ret; }
@@ -8125,10 +8119,8 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, ldpc = !!(ar->ht_cap_info &WMI_HT_CAP_LDPC ); sgi = mask->control[band].gi; -if (sgi ==NL80211_TXRATE_FORCE_LGI ) { - ret = -EINVAL ; - goto out; - } +if (sgi ==NL80211_TXRATE_FORCE_LGI ) +return -EINVAL ;/* mac80211 doesn't support sending a fixed HT/VHT MCS alone, rather it * requires passing at least one of used basic rates along with them.
@@ -8144,7 +8136,7 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,if (ret) {ath12k_warn (ar->ab,"failed to get single legacy rate for vdev %i: %d\n" , arvif->vdev_id, ret); - goto out; +return ret; } ieee80211_iterate_stations_mtx(hw, ath12k_mac_disable_peer_fixed_rate,
@@ -8189,8 +8181,7 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,*/ ath12k_warn (ar->ab,"Setting more than one MCS Value in bitrate mask not supported\n" ); - ret = -EINVAL ; - goto out; +return -EINVAL ; } ieee80211_iterate_stations_mtx(hw,
@@ -8209,7 +8200,6 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw, arvif->vdev_id, ret); } -out:return ret; }
@@ -8520,7 +8510,7 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,spin_unlock_bh (&ar->data_lock);if (ret) - goto exit; +return ret; scan_time_msec = hw->wiphy->max_remain_on_channel_duration *2 ;
@@ -8529,10 +8519,8 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, arg.num_chan =1 ; arg.chan_list =kcalloc (arg.num_chan,sizeof (*arg.chan_list),GFP_KERNEL ); -if (!arg.chan_list) { - ret = -ENOMEM ; - goto exit; - } +if (!arg.chan_list) +return -ENOMEM ; arg.vdev_id = arvif->vdev_id; arg.scan_id =ATH12K_SCAN_ID ;
@@ -8570,7 +8558,7 @@ static int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw, free_chan_list:kfree (arg.chan_list); -exit: +return ret; }
Signature · 1 line
2.39.5
PATCH v4 5/6 wifi: ath12k: ath12k_mac_set_key(): remove exit label
In reply to Kalle ValoFrom: Kalle Valo <[email protected]>
In ath12k_mac_set_key() removing the exit label was a bit more complex so do it in a separate patch. Remove the else branch and remove now the uncessary ret initialisation.
No functional changes.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +10 -12
@@ -3945,7 +3945,7 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,struct ath12k_peer *peer;struct ath12k_sta *arsta;const u8 *peer_addr; -int ret =0 ; +int ret;u32 flags =0 ;lockdep_assert_wiphy (ath12k_ar_to_hw (ar)->wiphy);
@@ -3973,14 +3973,13 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,if (cmd ==SET_KEY ) {ath12k_warn (ab,"cannot install key for non-existent peer %pM\n" , peer_addr); - ret = -EOPNOTSUPP ; - goto exit; - }else { -/* if the peer doesn't exist there is no key to disable -* anymore -*/ - goto exit; +return -EOPNOTSUPP ; } + +/* if the peer doesn't exist there is no key to disable +* anymore +*/ +return 0 ; }if (key->flags &IEEE80211_KEY_FLAG_PAIRWISE )
@@ -3991,13 +3990,13 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd, ret =ath12k_install_key (arvif, key, cmd, peer_addr, flags);if (ret) {ath12k_warn (ab,"ath12k_install_key failed (%d)\n" , ret); - goto exit; +return ret; } ret =ath12k_dp_rx_peer_pn_replay_config (arvif, peer_addr, cmd, key);if (ret) {ath12k_warn (ab,"failed to offload PN replay detection %d\n" , ret); - goto exit; +return ret; }spin_lock_bh (&ab->base_lock);
@@ -4043,8 +4042,7 @@ static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,spin_unlock_bh (&ab->base_lock); -exit: -return ret; +return 0 ; } static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
Signature · 1 line
2.39.5
Re: [PATCH v4 5/6] wifi: ath12k: ath12k_mac_set_key(): remove exit label
Quoted 4 lines · Kalle Valo
From: Kalle Valo <[email protected]>
In
ath12k_mac_set_key()removing the exit label was a bit more complex so do it in a separate patch. Remove the else branch and remove now the uncessary ret
s/uncessary/unnecessary/
I'll fix this in 'pending'
Quoted 1 line
initialisation.
I'll leave the UK spelling -- don't have a need to enforce US spelling here :)
PATCH v4 6/6 wifi: ath12k: ath12k_mac_op_sta_state(): clean up update_wk cancellation
In reply to Kalle ValoFrom: Kalle Valo <[email protected]>
Now that we have switched to using wiphy_lock() there's no need to have update_wk cancel call separately, for consistency move it to the rest of code handling IEEE80211_STA_NONE state.
No functional changes.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/net/wireless/ath/ath12k/mac.c +2 -5
@@ -4569,11 +4569,6 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,struct ath12k_peer *peer;int ret =0 ; -/* cancel must be done outside the mutex to avoid deadlock */ -if ((old_state ==IEEE80211_STA_NONE && - new_state ==IEEE80211_STA_NOTEXIST )) -wiphy_work_cancel (hw->wiphy, &arsta->update_wk); - ar =ath12k_get_ar_by_vif (hw, vif);if (!ar) {WARN_ON_ONCE (1 );
@@ -4594,6 +4589,8 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, sta->addr, arvif->vdev_id); }else if ((old_state ==IEEE80211_STA_NONE && new_state ==IEEE80211_STA_NOTEXIST )) { +wiphy_work_cancel (hw->wiphy, &arsta->update_wk); +if (arvif->vdev_type ==WMI_VDEV_TYPE_STA ) {ath12k_bss_disassoc (ar, arvif); ret =ath12k_mac_vdev_stop (arvif);
Signature · 1 line
2.39.5
Jeff Johnson
AppliedQuoted 9 lines · Kalle Valo
From: Kalle Valo <[email protected]>
Convert all uses of struct
ath12k::conf_mutexto use structwiphy::mtx, which is already used by mac80211, and removeconf_mutexfrom ath12k. This way we have one mutex less in ath12k and simpler locking design.v4:
[...]
Applied, thanks!
[1/6] wifi: ath12k: fix atomic calls in ath12k_mac_op_set_bitrate_mask()
commit: 8fac3266c68a8e647240b8ac8d0b82f1821edf85
[2/6] wifi: ath12k: convert struct ath12k_sta::update_wk to use struct wiphy_work
commit: 58550cdda961dedad8ed08c5abf8367d5c020fb6
[3/6] wifi: ath12k: switch to using wiphy_lock() and remove ar->conf_mutex
commit: b8c67509b91ec23fcacbb99d40c960ab479e1299
[4/6] wifi: ath12k: cleanup unneeded labels
commit: 31489439e6481cd0c21c8c7096d2ec44dc56b6a6
[5/6] wifi: ath12k: ath12k_mac_set_key(): remove exit label
commit: 37d06d71e69c16d24ccc276cb86489fd2fcd00c4
[6/6] wifi: ath12k: ath12k_mac_op_sta_state(): clean up update_wk cancellation
commit: e805272f8c2dee280e2fa1c1a454517df17f1261Best regards,
Signature · 1 line
Jeff Johnson <[email protected]>