diff options
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r-- | net/mac80211/main.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 61877662e8f8..0d7b08db8e56 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -358,7 +358,8 @@ static void ieee80211_restart_work(struct work_struct *work) | |||
358 | flush_workqueue(local->workqueue); | 358 | flush_workqueue(local->workqueue); |
359 | 359 | ||
360 | mutex_lock(&local->mtx); | 360 | mutex_lock(&local->mtx); |
361 | WARN(test_bit(SCAN_HW_SCANNING, &local->scanning), | 361 | WARN(test_bit(SCAN_HW_SCANNING, &local->scanning) || |
362 | local->sched_scanning, | ||
362 | "%s called with hardware scan in progress\n", __func__); | 363 | "%s called with hardware scan in progress\n", __func__); |
363 | mutex_unlock(&local->mtx); | 364 | mutex_unlock(&local->mtx); |
364 | 365 | ||
@@ -580,8 +581,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
580 | 581 | ||
581 | wiphy->flags |= WIPHY_FLAG_NETNS_OK | | 582 | wiphy->flags |= WIPHY_FLAG_NETNS_OK | |
582 | WIPHY_FLAG_4ADDR_AP | | 583 | WIPHY_FLAG_4ADDR_AP | |
583 | WIPHY_FLAG_4ADDR_STATION | | 584 | WIPHY_FLAG_4ADDR_STATION; |
584 | WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS; | ||
585 | 585 | ||
586 | if (!ops->set_key) | 586 | if (!ops->set_key) |
587 | wiphy->flags |= WIPHY_FLAG_IBSS_RSN; | 587 | wiphy->flags |= WIPHY_FLAG_IBSS_RSN; |
@@ -652,6 +652,9 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
652 | setup_timer(&local->dynamic_ps_timer, | 652 | setup_timer(&local->dynamic_ps_timer, |
653 | ieee80211_dynamic_ps_timer, (unsigned long) local); | 653 | ieee80211_dynamic_ps_timer, (unsigned long) local); |
654 | 654 | ||
655 | INIT_WORK(&local->sched_scan_stopped_work, | ||
656 | ieee80211_sched_scan_stopped_work); | ||
657 | |||
655 | sta_info_init(local); | 658 | sta_info_init(local); |
656 | 659 | ||
657 | for (i = 0; i < IEEE80211_MAX_QUEUES; i++) { | 660 | for (i = 0; i < IEEE80211_MAX_QUEUES; i++) { |
@@ -682,7 +685,7 @@ EXPORT_SYMBOL(ieee80211_alloc_hw); | |||
682 | int ieee80211_register_hw(struct ieee80211_hw *hw) | 685 | int ieee80211_register_hw(struct ieee80211_hw *hw) |
683 | { | 686 | { |
684 | struct ieee80211_local *local = hw_to_local(hw); | 687 | struct ieee80211_local *local = hw_to_local(hw); |
685 | int result; | 688 | int result, i; |
686 | enum ieee80211_band band; | 689 | enum ieee80211_band band; |
687 | int channels, max_bitrates; | 690 | int channels, max_bitrates; |
688 | bool supp_ht; | 691 | bool supp_ht; |
@@ -697,6 +700,13 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
697 | WLAN_CIPHER_SUITE_AES_CMAC | 700 | WLAN_CIPHER_SUITE_AES_CMAC |
698 | }; | 701 | }; |
699 | 702 | ||
703 | if ((hw->wiphy->wowlan.flags || hw->wiphy->wowlan.n_patterns) | ||
704 | #ifdef CONFIG_PM | ||
705 | && (!local->ops->suspend || !local->ops->resume) | ||
706 | #endif | ||
707 | ) | ||
708 | return -EINVAL; | ||
709 | |||
700 | if (hw->max_report_rates == 0) | 710 | if (hw->max_report_rates == 0) |
701 | hw->max_report_rates = hw->max_rates; | 711 | hw->max_report_rates = hw->max_rates; |
702 | 712 | ||
@@ -733,11 +743,19 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
733 | return -ENOMEM; | 743 | return -ENOMEM; |
734 | 744 | ||
735 | /* if low-level driver supports AP, we also support VLAN */ | 745 | /* if low-level driver supports AP, we also support VLAN */ |
736 | if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) | 746 | if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) { |
737 | local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); | 747 | hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); |
748 | hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN); | ||
749 | } | ||
738 | 750 | ||
739 | /* mac80211 always supports monitor */ | 751 | /* mac80211 always supports monitor */ |
740 | local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); | 752 | hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR); |
753 | hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); | ||
754 | |||
755 | /* mac80211 doesn't support more than 1 channel */ | ||
756 | for (i = 0; i < hw->wiphy->n_iface_combinations; i++) | ||
757 | if (hw->wiphy->iface_combinations[i].num_different_channels > 1) | ||
758 | return -EINVAL; | ||
741 | 759 | ||
742 | #ifndef CONFIG_MAC80211_MESH | 760 | #ifndef CONFIG_MAC80211_MESH |
743 | /* mesh depends on Kconfig, but drivers should set it if they want */ | 761 | /* mesh depends on Kconfig, but drivers should set it if they want */ |
@@ -827,6 +845,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
827 | if (!local->ops->remain_on_channel) | 845 | if (!local->ops->remain_on_channel) |
828 | local->hw.wiphy->max_remain_on_channel_duration = 5000; | 846 | local->hw.wiphy->max_remain_on_channel_duration = 5000; |
829 | 847 | ||
848 | if (local->ops->sched_scan_start) | ||
849 | local->hw.wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; | ||
850 | |||
830 | result = wiphy_register(local->hw.wiphy); | 851 | result = wiphy_register(local->hw.wiphy); |
831 | if (result < 0) | 852 | if (result < 0) |
832 | goto fail_wiphy_register; | 853 | goto fail_wiphy_register; |
@@ -850,8 +871,10 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
850 | * and we need some headroom for passing the frame to monitor | 871 | * and we need some headroom for passing the frame to monitor |
851 | * interfaces, but never both at the same time. | 872 | * interfaces, but never both at the same time. |
852 | */ | 873 | */ |
874 | #ifndef __CHECKER__ | ||
853 | BUILD_BUG_ON(IEEE80211_TX_STATUS_HEADROOM != | 875 | BUILD_BUG_ON(IEEE80211_TX_STATUS_HEADROOM != |
854 | sizeof(struct ieee80211_tx_status_rtap_hdr)); | 876 | sizeof(struct ieee80211_tx_status_rtap_hdr)); |
877 | #endif | ||
855 | local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom, | 878 | local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom, |
856 | sizeof(struct ieee80211_tx_status_rtap_hdr)); | 879 | sizeof(struct ieee80211_tx_status_rtap_hdr)); |
857 | 880 | ||