• Home
  • Raw
  • Download

Lines Matching refs:local

70 		ieee80211_hw_config(sdata->local, 0);  in __ieee80211_recalc_txpower()
85 static u32 __ieee80211_idle_off(struct ieee80211_local *local) in __ieee80211_idle_off() argument
87 if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) in __ieee80211_idle_off()
90 local->hw.conf.flags &= ~IEEE80211_CONF_IDLE; in __ieee80211_idle_off()
94 static u32 __ieee80211_idle_on(struct ieee80211_local *local) in __ieee80211_idle_on() argument
96 if (local->hw.conf.flags & IEEE80211_CONF_IDLE) in __ieee80211_idle_on()
99 ieee80211_flush_queues(local, NULL, false); in __ieee80211_idle_on()
101 local->hw.conf.flags |= IEEE80211_CONF_IDLE; in __ieee80211_idle_on()
105 static u32 __ieee80211_recalc_idle(struct ieee80211_local *local, in __ieee80211_recalc_idle() argument
111 lockdep_assert_held(&local->mtx); in __ieee80211_recalc_idle()
114 !list_empty(&local->chanctx_list) || in __ieee80211_recalc_idle()
115 local->monitors; in __ieee80211_recalc_idle()
117 working = !local->ops->remain_on_channel && in __ieee80211_recalc_idle()
118 !list_empty(&local->roc_list); in __ieee80211_recalc_idle()
120 scanning = test_bit(SCAN_SW_SCANNING, &local->scanning) || in __ieee80211_recalc_idle()
121 test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning); in __ieee80211_recalc_idle()
133 ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop); in __ieee80211_recalc_idle()
136 return __ieee80211_idle_off(local); in __ieee80211_recalc_idle()
137 return __ieee80211_idle_on(local); in __ieee80211_recalc_idle()
140 u32 ieee80211_idle_off(struct ieee80211_local *local) in ieee80211_idle_off() argument
142 return __ieee80211_recalc_idle(local, true); in ieee80211_idle_off()
145 void ieee80211_recalc_idle(struct ieee80211_local *local) in ieee80211_recalc_idle() argument
147 u32 change = __ieee80211_recalc_idle(local, false); in ieee80211_recalc_idle()
149 ieee80211_hw_config(local, change); in ieee80211_recalc_idle()
155 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac() local
161 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_verify_mac()
169 m = local->hw.wiphy->addr_mask; in ieee80211_verify_mac()
177 mutex_lock(&local->iflist_mtx); in ieee80211_verify_mac()
178 list_for_each_entry(iter, &local->interfaces, list) { in ieee80211_verify_mac()
196 mutex_unlock(&local->iflist_mtx); in ieee80211_verify_mac()
246 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface() local
253 list_for_each_entry(nsdata, &local->interfaces, list) { in ieee80211_check_concurrent_iface()
308 mutex_lock(&local->chanctx_mtx); in ieee80211_check_concurrent_iface()
310 mutex_unlock(&local->chanctx_mtx); in ieee80211_check_concurrent_iface()
317 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
337 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
354 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags() local
359 local->fif_##_s += offset; \ in ieee80211_adjust_monitor_flags()
373 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues() local
377 if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) in ieee80211_set_default_queues()
379 else if (local->hw.queues >= IEEE80211_NUM_ACS) in ieee80211_set_default_queues()
387 int ieee80211_add_virtual_monitor(struct ieee80211_local *local) in ieee80211_add_virtual_monitor() argument
392 if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) in ieee80211_add_virtual_monitor()
397 if (local->monitor_sdata) in ieee80211_add_virtual_monitor()
400 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
405 sdata->local = local; in ieee80211_add_virtual_monitor()
408 wiphy_name(local->hw.wiphy)); in ieee80211_add_virtual_monitor()
415 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
428 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
429 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
430 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
432 mutex_lock(&local->mtx); in ieee80211_add_virtual_monitor()
433 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
435 mutex_unlock(&local->mtx); in ieee80211_add_virtual_monitor()
437 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
438 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_add_virtual_monitor()
439 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
441 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
452 void ieee80211_del_virtual_monitor(struct ieee80211_local *local) in ieee80211_del_virtual_monitor() argument
456 if (!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) in ieee80211_del_virtual_monitor()
461 mutex_lock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
463 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
464 lockdep_is_held(&local->iflist_mtx)); in ieee80211_del_virtual_monitor()
466 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
470 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_del_virtual_monitor()
471 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
475 mutex_lock(&local->mtx); in ieee80211_del_virtual_monitor()
477 mutex_unlock(&local->mtx); in ieee80211_del_virtual_monitor()
479 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
493 struct ieee80211_local *local = sdata->local; in ieee80211_do_open() local
510 mutex_lock(&local->mtx); in ieee80211_do_open()
512 mutex_unlock(&local->mtx); in ieee80211_do_open()
527 mutex_lock(&local->key_mtx); in ieee80211_do_open()
530 mutex_unlock(&local->key_mtx); in ieee80211_do_open()
555 if (local->open_count == 0) { in ieee80211_do_open()
556 res = drv_start(local); in ieee80211_do_open()
561 ieee80211_led_radio(local, true); in ieee80211_do_open()
562 ieee80211_mod_tpt_led_trig(local, in ieee80211_do_open()
572 local->hw.wiphy->perm_addr, in ieee80211_do_open()
594 local->cooked_mntrs++; in ieee80211_do_open()
599 res = drv_add_interface(local, sdata); in ieee80211_do_open()
602 } else if (local->monitors == 0 && local->open_count == 0) { in ieee80211_do_open()
603 res = ieee80211_add_virtual_monitor(local); in ieee80211_do_open()
609 local->monitors++; in ieee80211_do_open()
610 if (local->monitors == 1) { in ieee80211_do_open()
611 local->hw.conf.flags |= IEEE80211_CONF_MONITOR; in ieee80211_do_open()
616 ieee80211_configure_filter(local); in ieee80211_do_open()
617 mutex_lock(&local->mtx); in ieee80211_do_open()
618 ieee80211_recalc_idle(local); in ieee80211_do_open()
619 mutex_unlock(&local->mtx); in ieee80211_do_open()
625 ieee80211_del_virtual_monitor(local); in ieee80211_do_open()
627 res = drv_add_interface(local, sdata); in ieee80211_do_open()
637 local->fif_pspoll++; in ieee80211_do_open()
638 local->fif_probe_req++; in ieee80211_do_open()
640 ieee80211_configure_filter(local); in ieee80211_do_open()
642 local->fif_probe_req++; in ieee80211_do_open()
703 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
708 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
720 atomic_inc(&local->iff_allmultis); in ieee80211_do_open()
723 local->open_count++; in ieee80211_do_open()
726 ieee80211_hw_config(local, hw_reconf_flags); in ieee80211_do_open()
728 ieee80211_recalc_ps(local); in ieee80211_do_open()
732 local->ops->wake_tx_queue) { in ieee80211_do_open()
741 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_do_open()
744 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); in ieee80211_do_open()
746 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
747 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
751 if (local->queue_stop_reasons[ac_queue] == 0 && in ieee80211_do_open()
752 skb_queue_empty(&local->pending[ac_queue])) in ieee80211_do_open()
756 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); in ieee80211_do_open()
761 drv_remove_interface(local, sdata); in ieee80211_do_open()
763 if (!local->open_count) in ieee80211_do_open()
764 drv_stop(local); in ieee80211_do_open()
768 mutex_lock(&local->mtx); in ieee80211_do_open()
770 mutex_unlock(&local->mtx); in ieee80211_do_open()
796 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop() local
808 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
810 ieee80211_scan_cancel(local); in ieee80211_do_stop()
818 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
861 atomic_dec(&local->iff_allmultis); in ieee80211_do_stop()
864 local->fif_pspoll--; in ieee80211_do_stop()
865 local->fif_probe_req--; in ieee80211_do_stop()
867 local->fif_probe_req--; in ieee80211_do_stop()
872 spin_lock_bh(&local->filter_lock); in ieee80211_do_stop()
873 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
875 spin_unlock_bh(&local->filter_lock); in ieee80211_do_stop()
879 del_timer_sync(&local->dynamic_ps_timer); in ieee80211_do_stop()
880 cancel_work_sync(&local->dynamic_ps_enable_work); in ieee80211_do_stop()
884 mutex_lock(&local->mtx); in ieee80211_do_stop()
889 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
893 mutex_unlock(&local->mtx); in ieee80211_do_stop()
902 WARN_ON(local->suspended); in ieee80211_do_stop()
903 mutex_lock(&local->mtx); in ieee80211_do_stop()
905 mutex_unlock(&local->mtx); in ieee80211_do_stop()
928 local->total_ps_buffered--; in ieee80211_do_stop()
929 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
936 local->open_count--; in ieee80211_do_stop()
940 mutex_lock(&local->mtx); in ieee80211_do_stop()
942 mutex_unlock(&local->mtx); in ieee80211_do_stop()
950 local->cooked_mntrs--; in ieee80211_do_stop()
954 local->monitors--; in ieee80211_do_stop()
955 if (local->monitors == 0) { in ieee80211_do_stop()
956 local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR; in ieee80211_do_stop()
976 RCU_INIT_POINTER(local->p2p_sdata, NULL); in ieee80211_do_stop()
996 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
998 skb_queue_walk_safe(&local->pending[i], skb, tmp) { in ieee80211_do_stop()
1001 __skb_unlink(skb, &local->pending[i]); in ieee80211_do_stop()
1002 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
1006 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
1009 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
1013 if (local->open_count == 0) in ieee80211_do_stop()
1014 ieee80211_clear_tx_pending(local); in ieee80211_do_stop()
1027 if (local->suspended) { in ieee80211_do_stop()
1028 WARN_ON(local->wowlan); in ieee80211_do_stop()
1029 WARN_ON(rtnl_dereference(local->monitor_sdata)); in ieee80211_do_stop()
1037 if (local->monitors == 0) in ieee80211_do_stop()
1038 ieee80211_del_virtual_monitor(local); in ieee80211_do_stop()
1040 mutex_lock(&local->mtx); in ieee80211_do_stop()
1041 ieee80211_recalc_idle(local); in ieee80211_do_stop()
1042 mutex_unlock(&local->mtx); in ieee80211_do_stop()
1050 drv_remove_interface(local, sdata); in ieee80211_do_stop()
1053 ieee80211_recalc_ps(local); in ieee80211_do_stop()
1056 flush_delayed_work(&local->scan_work); in ieee80211_do_stop()
1058 if (local->open_count == 0) { in ieee80211_do_stop()
1059 ieee80211_stop_device(local); in ieee80211_do_stop()
1066 ieee80211_configure_filter(local); in ieee80211_do_stop()
1067 ieee80211_hw_config(local, hw_reconf_flags); in ieee80211_do_stop()
1069 if (local->monitors == local->open_count) in ieee80211_do_stop()
1070 ieee80211_add_virtual_monitor(local); in ieee80211_do_stop()
1085 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list() local
1093 atomic_inc(&local->iff_allmultis); in ieee80211_set_multicast_list()
1095 atomic_dec(&local->iff_allmultis); in ieee80211_set_multicast_list()
1099 spin_lock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
1100 __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len); in ieee80211_set_multicast_list()
1101 spin_unlock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
1102 ieee80211_queue_work(&local->hw, &local->reconfig_filter); in ieee80211_set_multicast_list()
1181 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue() local
1185 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_monitor_select_queue()
1232 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work() local
1239 if (test_bit(SCAN_SW_SCANNING, &local->scanning)) in ieee80211_iface_work()
1242 if (!ieee80211_can_run_worker(local)) in ieee80211_iface_work()
1253 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1259 local, sta, mgmt, len); in ieee80211_iface_work()
1262 ieee80211_process_addba_resp(local, sta, in ieee80211_iface_work()
1274 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1287 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1295 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1324 mutex_lock(&local->sta_mtx); in ieee80211_iface_work()
1334 mutex_unlock(&local->sta_mtx); in ieee80211_iface_work()
1486 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype() local
1493 if (!local->ops->change_interface) in ieee80211_runtime_change_iftype()
1544 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1590 static void ieee80211_assign_perm_addr(struct ieee80211_local *local, in ieee80211_assign_perm_addr() argument
1600 memcpy(perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1602 if (is_zero_ether_addr(local->hw.wiphy->addr_mask) && in ieee80211_assign_perm_addr()
1603 local->hw.wiphy->n_addresses <= 1) in ieee80211_assign_perm_addr()
1606 mutex_lock(&local->iflist_mtx); in ieee80211_assign_perm_addr()
1615 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1625 if (ieee80211_hw_check(&local->hw, P2P_DEV_ADDR_FOR_INTF)) { in ieee80211_assign_perm_addr()
1626 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1638 for (i = 0; i < local->hw.wiphy->n_addresses; i++) { in ieee80211_assign_perm_addr()
1641 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1642 if (ether_addr_equal(local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
1651 local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
1658 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_assign_perm_addr()
1661 m = local->hw.wiphy->addr_mask; in ieee80211_assign_perm_addr()
1676 m = local->hw.wiphy->perm_addr; in ieee80211_assign_perm_addr()
1677 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1702 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1720 mutex_unlock(&local->iflist_mtx); in ieee80211_assign_perm_addr()
1723 int ieee80211_if_add(struct ieee80211_local *local, const char *name, in ieee80211_if_add() argument
1740 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1748 ieee80211_assign_perm_addr(local, wdev->address, type); in ieee80211_if_add()
1751 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1755 if (local->ops->wake_tx_queue && in ieee80211_if_add()
1760 local->hw.txq_data_size; in ieee80211_if_add()
1762 if (local->ops->wake_tx_queue) { in ieee80211_if_add()
1766 if (local->hw.queues >= IEEE80211_NUM_ACS) in ieee80211_if_add()
1775 dev_net_set(ndev, wiphy_net(local->hw.wiphy)); in ieee80211_if_add()
1783 ndev->needed_headroom = local->tx_headroom + in ieee80211_if_add()
1799 ieee80211_assign_perm_addr(local, ndev->perm_addr, type); in ieee80211_if_add()
1804 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); in ieee80211_if_add()
1821 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1822 sdata->local = local; in ieee80211_if_add()
1836 sband = local->hw.wiphy->bands[i]; in ieee80211_if_add()
1861 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1873 ndev->features |= local->hw.netdev_features; in ieee80211_if_add()
1879 ndev->max_mtu = local->hw.max_mtu; in ieee80211_if_add()
1888 mutex_lock(&local->iflist_mtx); in ieee80211_if_add()
1889 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1890 mutex_unlock(&local->iflist_mtx); in ieee80211_if_add()
1902 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1904 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1907 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
1927 void ieee80211_remove_interfaces(struct ieee80211_local *local) in ieee80211_remove_interfaces() argument
1946 cfg80211_shutdown_all_interfaces(local->hw.wiphy); in ieee80211_remove_interfaces()
1948 WARN(local->open_count, "%s: open count remains %d\n", in ieee80211_remove_interfaces()
1949 wiphy_name(local->hw.wiphy), local->open_count); in ieee80211_remove_interfaces()
1951 ieee80211_txq_teardown_flows(local); in ieee80211_remove_interfaces()
1953 mutex_lock(&local->iflist_mtx); in ieee80211_remove_interfaces()
1954 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1962 mutex_unlock(&local->iflist_mtx); in ieee80211_remove_interfaces()