Lines Matching refs:local

69 		ieee80211_hw_config(sdata->local, 0);  in __ieee80211_recalc_txpower()
83 static u32 __ieee80211_idle_off(struct ieee80211_local *local) in __ieee80211_idle_off() argument
85 if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) in __ieee80211_idle_off()
88 local->hw.conf.flags &= ~IEEE80211_CONF_IDLE; in __ieee80211_idle_off()
92 static u32 __ieee80211_idle_on(struct ieee80211_local *local) in __ieee80211_idle_on() argument
94 if (local->hw.conf.flags & IEEE80211_CONF_IDLE) in __ieee80211_idle_on()
97 ieee80211_flush_queues(local, NULL, false); in __ieee80211_idle_on()
99 local->hw.conf.flags |= IEEE80211_CONF_IDLE; in __ieee80211_idle_on()
103 static u32 __ieee80211_recalc_idle(struct ieee80211_local *local, in __ieee80211_recalc_idle() argument
109 lockdep_assert_held(&local->mtx); in __ieee80211_recalc_idle()
112 !list_empty(&local->chanctx_list) || in __ieee80211_recalc_idle()
113 local->monitors; in __ieee80211_recalc_idle()
115 working = !local->ops->remain_on_channel && in __ieee80211_recalc_idle()
116 !list_empty(&local->roc_list); in __ieee80211_recalc_idle()
118 scanning = test_bit(SCAN_SW_SCANNING, &local->scanning) || in __ieee80211_recalc_idle()
119 test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning); in __ieee80211_recalc_idle()
131 ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop); in __ieee80211_recalc_idle()
134 return __ieee80211_idle_off(local); in __ieee80211_recalc_idle()
135 return __ieee80211_idle_on(local); in __ieee80211_recalc_idle()
138 u32 ieee80211_idle_off(struct ieee80211_local *local) in ieee80211_idle_off() argument
140 return __ieee80211_recalc_idle(local, true); in ieee80211_idle_off()
143 void ieee80211_recalc_idle(struct ieee80211_local *local) in ieee80211_recalc_idle() argument
145 u32 change = __ieee80211_recalc_idle(local, false); in ieee80211_recalc_idle()
147 ieee80211_hw_config(local, change); in ieee80211_recalc_idle()
162 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac() local
168 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_verify_mac()
176 m = local->hw.wiphy->addr_mask; in ieee80211_verify_mac()
184 mutex_lock(&local->iflist_mtx); in ieee80211_verify_mac()
185 list_for_each_entry(iter, &local->interfaces, list) { in ieee80211_verify_mac()
203 mutex_unlock(&local->iflist_mtx); in ieee80211_verify_mac()
253 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface() local
260 list_for_each_entry(nsdata, &local->interfaces, list) { in ieee80211_check_concurrent_iface()
315 mutex_lock(&local->chanctx_mtx); in ieee80211_check_concurrent_iface()
317 mutex_unlock(&local->chanctx_mtx); in ieee80211_check_concurrent_iface()
324 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
341 !(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) { in ieee80211_check_queues()
358 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags() local
363 local->fif_##_s += offset; \ in ieee80211_adjust_monitor_flags()
377 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues() local
381 if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) in ieee80211_set_default_queues()
383 else if (local->hw.queues >= IEEE80211_NUM_ACS) in ieee80211_set_default_queues()
391 int ieee80211_add_virtual_monitor(struct ieee80211_local *local) in ieee80211_add_virtual_monitor() argument
396 if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) in ieee80211_add_virtual_monitor()
401 if (local->monitor_sdata) in ieee80211_add_virtual_monitor()
404 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
409 sdata->local = local; in ieee80211_add_virtual_monitor()
412 wiphy_name(local->hw.wiphy)); in ieee80211_add_virtual_monitor()
419 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
432 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
433 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
434 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
436 mutex_lock(&local->mtx); in ieee80211_add_virtual_monitor()
437 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
439 mutex_unlock(&local->mtx); in ieee80211_add_virtual_monitor()
441 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
442 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_add_virtual_monitor()
443 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
445 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
453 void ieee80211_del_virtual_monitor(struct ieee80211_local *local) in ieee80211_del_virtual_monitor() argument
457 if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) in ieee80211_del_virtual_monitor()
462 mutex_lock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
464 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
465 lockdep_is_held(&local->iflist_mtx)); in ieee80211_del_virtual_monitor()
467 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
471 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_del_virtual_monitor()
472 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
476 mutex_lock(&local->mtx); in ieee80211_del_virtual_monitor()
478 mutex_unlock(&local->mtx); in ieee80211_del_virtual_monitor()
480 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
494 struct ieee80211_local *local = sdata->local; in ieee80211_do_open() local
511 mutex_lock(&local->mtx); in ieee80211_do_open()
513 mutex_unlock(&local->mtx); in ieee80211_do_open()
526 mutex_lock(&local->key_mtx); in ieee80211_do_open()
529 mutex_unlock(&local->key_mtx); in ieee80211_do_open()
553 if (local->open_count == 0) { in ieee80211_do_open()
554 res = drv_start(local); in ieee80211_do_open()
559 ieee80211_led_radio(local, true); in ieee80211_do_open()
560 ieee80211_mod_tpt_led_trig(local, in ieee80211_do_open()
570 local->hw.wiphy->perm_addr, in ieee80211_do_open()
592 local->cooked_mntrs++; in ieee80211_do_open()
597 res = drv_add_interface(local, sdata); in ieee80211_do_open()
600 } else if (local->monitors == 0 && local->open_count == 0) { in ieee80211_do_open()
601 res = ieee80211_add_virtual_monitor(local); in ieee80211_do_open()
607 local->monitors++; in ieee80211_do_open()
608 if (local->monitors == 1) { in ieee80211_do_open()
609 local->hw.conf.flags |= IEEE80211_CONF_MONITOR; in ieee80211_do_open()
614 ieee80211_configure_filter(local); in ieee80211_do_open()
615 mutex_lock(&local->mtx); in ieee80211_do_open()
616 ieee80211_recalc_idle(local); in ieee80211_do_open()
617 mutex_unlock(&local->mtx); in ieee80211_do_open()
623 ieee80211_del_virtual_monitor(local); in ieee80211_do_open()
625 res = drv_add_interface(local, sdata); in ieee80211_do_open()
635 local->fif_pspoll++; in ieee80211_do_open()
636 local->fif_probe_req++; in ieee80211_do_open()
638 ieee80211_configure_filter(local); in ieee80211_do_open()
640 local->fif_probe_req++; in ieee80211_do_open()
695 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
704 atomic_inc(&local->iff_allmultis); in ieee80211_do_open()
707 atomic_inc(&local->iff_promiscs); in ieee80211_do_open()
710 local->open_count++; in ieee80211_do_open()
713 ieee80211_hw_config(local, hw_reconf_flags); in ieee80211_do_open()
715 ieee80211_recalc_ps(local, -1); in ieee80211_do_open()
726 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_do_open()
729 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); in ieee80211_do_open()
731 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
732 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
736 if (local->queue_stop_reasons[ac_queue] == 0 && in ieee80211_do_open()
737 skb_queue_empty(&local->pending[ac_queue])) in ieee80211_do_open()
741 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); in ieee80211_do_open()
746 drv_remove_interface(local, sdata); in ieee80211_do_open()
748 if (!local->open_count) in ieee80211_do_open()
749 drv_stop(local); in ieee80211_do_open()
753 mutex_lock(&local->mtx); in ieee80211_do_open()
755 mutex_unlock(&local->mtx); in ieee80211_do_open()
781 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop() local
792 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
794 ieee80211_scan_cancel(local); in ieee80211_do_stop()
802 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
840 atomic_dec(&local->iff_allmultis); in ieee80211_do_stop()
843 atomic_dec(&local->iff_promiscs); in ieee80211_do_stop()
846 local->fif_pspoll--; in ieee80211_do_stop()
847 local->fif_probe_req--; in ieee80211_do_stop()
849 local->fif_probe_req--; in ieee80211_do_stop()
854 spin_lock_bh(&local->filter_lock); in ieee80211_do_stop()
855 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
857 spin_unlock_bh(&local->filter_lock); in ieee80211_do_stop()
861 del_timer_sync(&local->dynamic_ps_timer); in ieee80211_do_stop()
862 cancel_work_sync(&local->dynamic_ps_enable_work); in ieee80211_do_stop()
866 mutex_lock(&local->mtx); in ieee80211_do_stop()
871 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
875 mutex_unlock(&local->mtx); in ieee80211_do_stop()
884 WARN_ON(local->suspended); in ieee80211_do_stop()
885 mutex_lock(&local->mtx); in ieee80211_do_stop()
887 mutex_unlock(&local->mtx); in ieee80211_do_stop()
910 local->total_ps_buffered--; in ieee80211_do_stop()
911 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
918 local->open_count--; in ieee80211_do_stop()
922 mutex_lock(&local->mtx); in ieee80211_do_stop()
924 mutex_unlock(&local->mtx); in ieee80211_do_stop()
932 local->cooked_mntrs--; in ieee80211_do_stop()
936 local->monitors--; in ieee80211_do_stop()
937 if (local->monitors == 0) { in ieee80211_do_stop()
938 local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR; in ieee80211_do_stop()
946 RCU_INIT_POINTER(local->p2p_sdata, NULL); in ieee80211_do_stop()
968 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
970 skb_queue_walk_safe(&local->pending[i], skb, tmp) { in ieee80211_do_stop()
973 __skb_unlink(skb, &local->pending[i]); in ieee80211_do_stop()
974 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
978 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
983 ieee80211_purge_tx_queue(&local->hw, &txqi->queue); in ieee80211_do_stop()
987 if (local->open_count == 0) in ieee80211_do_stop()
988 ieee80211_clear_tx_pending(local); in ieee80211_do_stop()
999 if (local->suspended) { in ieee80211_do_stop()
1000 WARN_ON(local->wowlan); in ieee80211_do_stop()
1001 WARN_ON(rtnl_dereference(local->monitor_sdata)); in ieee80211_do_stop()
1009 if (local->monitors == 0) in ieee80211_do_stop()
1010 ieee80211_del_virtual_monitor(local); in ieee80211_do_stop()
1012 mutex_lock(&local->mtx); in ieee80211_do_stop()
1013 ieee80211_recalc_idle(local); in ieee80211_do_stop()
1014 mutex_unlock(&local->mtx); in ieee80211_do_stop()
1022 drv_remove_interface(local, sdata); in ieee80211_do_stop()
1025 ieee80211_recalc_ps(local, -1); in ieee80211_do_stop()
1028 flush_delayed_work(&local->scan_work); in ieee80211_do_stop()
1030 if (local->open_count == 0) { in ieee80211_do_stop()
1031 ieee80211_stop_device(local); in ieee80211_do_stop()
1038 ieee80211_configure_filter(local); in ieee80211_do_stop()
1039 ieee80211_hw_config(local, hw_reconf_flags); in ieee80211_do_stop()
1041 if (local->monitors == local->open_count) in ieee80211_do_stop()
1042 ieee80211_add_virtual_monitor(local); in ieee80211_do_stop()
1057 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list() local
1067 atomic_inc(&local->iff_allmultis); in ieee80211_set_multicast_list()
1069 atomic_dec(&local->iff_allmultis); in ieee80211_set_multicast_list()
1075 atomic_inc(&local->iff_promiscs); in ieee80211_set_multicast_list()
1077 atomic_dec(&local->iff_promiscs); in ieee80211_set_multicast_list()
1080 spin_lock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
1081 __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len); in ieee80211_set_multicast_list()
1082 spin_unlock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
1083 ieee80211_queue_work(&local->hw, &local->reconfig_filter); in ieee80211_set_multicast_list()
1137 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue() local
1141 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_monitor_select_queue()
1176 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work() local
1185 if (local->scanning) in ieee80211_iface_work()
1188 if (!ieee80211_can_run_worker(local)) in ieee80211_iface_work()
1205 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1212 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1215 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1222 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1229 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1235 local, sta, mgmt, len); in ieee80211_iface_work()
1238 ieee80211_process_addba_resp(local, sta, in ieee80211_iface_work()
1250 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1270 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1281 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1428 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype() local
1435 if (!local->ops->change_interface) in ieee80211_runtime_change_iftype()
1486 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1532 static void ieee80211_assign_perm_addr(struct ieee80211_local *local, in ieee80211_assign_perm_addr() argument
1542 memcpy(perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1544 if (is_zero_ether_addr(local->hw.wiphy->addr_mask) && in ieee80211_assign_perm_addr()
1545 local->hw.wiphy->n_addresses <= 1) in ieee80211_assign_perm_addr()
1548 mutex_lock(&local->iflist_mtx); in ieee80211_assign_perm_addr()
1557 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1567 if (local->hw.flags & IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF) { in ieee80211_assign_perm_addr()
1568 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1580 for (i = 0; i < local->hw.wiphy->n_addresses; i++) { in ieee80211_assign_perm_addr()
1583 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1584 if (ether_addr_equal(local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
1593 local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
1600 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_assign_perm_addr()
1603 m = local->hw.wiphy->addr_mask; in ieee80211_assign_perm_addr()
1618 m = local->hw.wiphy->perm_addr; in ieee80211_assign_perm_addr()
1619 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1644 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1662 mutex_unlock(&local->iflist_mtx); in ieee80211_assign_perm_addr()
1665 int ieee80211_if_add(struct ieee80211_local *local, const char *name, in ieee80211_if_add() argument
1681 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1689 ieee80211_assign_perm_addr(local, wdev->address, type); in ieee80211_if_add()
1692 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1696 if (local->ops->wake_tx_queue) in ieee80211_if_add()
1698 local->hw.txq_data_size; in ieee80211_if_add()
1700 if (local->hw.queues >= IEEE80211_NUM_ACS) in ieee80211_if_add()
1708 dev_net_set(ndev, wiphy_net(local->hw.wiphy)); in ieee80211_if_add()
1710 ndev->needed_headroom = local->tx_headroom + in ieee80211_if_add()
1725 ieee80211_assign_perm_addr(local, ndev->perm_addr, type); in ieee80211_if_add()
1730 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); in ieee80211_if_add()
1747 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1748 sdata->local = local; in ieee80211_if_add()
1762 sband = local->hw.wiphy->bands[i]; in ieee80211_if_add()
1777 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1791 ndev->features |= local->hw.netdev_features; in ieee80211_if_add()
1802 mutex_lock(&local->iflist_mtx); in ieee80211_if_add()
1803 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1804 mutex_unlock(&local->iflist_mtx); in ieee80211_if_add()
1816 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1818 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1842 void ieee80211_remove_interfaces(struct ieee80211_local *local) in ieee80211_remove_interfaces() argument
1855 list_for_each_entry(sdata, &local->interfaces, list) in ieee80211_remove_interfaces()
1859 mutex_lock(&local->iflist_mtx); in ieee80211_remove_interfaces()
1860 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1868 mutex_unlock(&local->iflist_mtx); in ieee80211_remove_interfaces()