diff options
| author | John W. Linville <linville@tuxdriver.com> | 2012-05-16 10:57:32 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2012-05-16 10:57:32 -0400 |
| commit | 12d9568333de3bfc50ff8d3312c097ba7ea7fe3c (patch) | |
| tree | c92a8f034bfc37bc129a26834ef78543d06c8b9d | |
| parent | 5f561f686b90f51d97a1a6985175860200e55a2d (diff) | |
| parent | f3740572512075839e1a7ebde970081106fed3f0 (diff) | |
Merge branch 'for-linville' of git://github.com/kvalo/ath6kl
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/cfg80211.c | 238 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/cfg80211.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/core.h | 33 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/debug.c | 12 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/htc_mbox.c | 45 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/htc_pipe.c | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/init.c | 29 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/main.c | 104 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/sdio.c | 17 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/txrx.c | 12 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/usb.c | 12 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/wmi.c | 94 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath6kl/wmi.h | 24 |
13 files changed, 455 insertions, 178 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c index 28a65d3a03d0..b869a358ce43 100644 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c | |||
| @@ -693,8 +693,8 @@ ath6kl_add_bss_if_needed(struct ath6kl_vif *vif, | |||
| 693 | ie, 2 + vif->ssid_len + beacon_ie_len, | 693 | ie, 2 + vif->ssid_len + beacon_ie_len, |
| 694 | 0, GFP_KERNEL); | 694 | 0, GFP_KERNEL); |
| 695 | if (bss) | 695 | if (bss) |
| 696 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "added bss %pM to " | 696 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, |
| 697 | "cfg80211\n", bssid); | 697 | "added bss %pM to cfg80211\n", bssid); |
| 698 | kfree(ie); | 698 | kfree(ie); |
| 699 | } else | 699 | } else |
| 700 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n"); | 700 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n"); |
| @@ -882,6 +882,32 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason, | |||
| 882 | vif->sme_state = SME_DISCONNECTED; | 882 | vif->sme_state = SME_DISCONNECTED; |
| 883 | } | 883 | } |
| 884 | 884 | ||
| 885 | static int ath6kl_set_probed_ssids(struct ath6kl *ar, | ||
| 886 | struct ath6kl_vif *vif, | ||
| 887 | struct cfg80211_ssid *ssids, int n_ssids) | ||
| 888 | { | ||
| 889 | u8 i; | ||
| 890 | |||
| 891 | if (n_ssids > MAX_PROBED_SSID_INDEX) | ||
| 892 | return -EINVAL; | ||
| 893 | |||
| 894 | for (i = 0; i < n_ssids; i++) { | ||
| 895 | ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, | ||
| 896 | ssids[i].ssid_len ? | ||
| 897 | SPECIFIC_SSID_FLAG : ANY_SSID_FLAG, | ||
| 898 | ssids[i].ssid_len, | ||
| 899 | ssids[i].ssid); | ||
| 900 | } | ||
| 901 | |||
| 902 | /* Make sure no old entries are left behind */ | ||
| 903 | for (i = n_ssids; i < MAX_PROBED_SSID_INDEX; i++) { | ||
| 904 | ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i, | ||
| 905 | DISABLE_SSID_FLAG, 0, NULL); | ||
| 906 | } | ||
| 907 | |||
| 908 | return 0; | ||
| 909 | } | ||
| 910 | |||
| 885 | static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, | 911 | static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, |
| 886 | struct cfg80211_scan_request *request) | 912 | struct cfg80211_scan_request *request) |
| 887 | { | 913 | { |
| @@ -899,36 +925,25 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, | |||
| 899 | 925 | ||
| 900 | if (!ar->usr_bss_filter) { | 926 | if (!ar->usr_bss_filter) { |
| 901 | clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); | 927 | clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); |
| 902 | ret = ath6kl_wmi_bssfilter_cmd( | 928 | ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, |
| 903 | ar->wmi, vif->fw_vif_idx, | 929 | ALL_BSS_FILTER, 0); |
| 904 | (test_bit(CONNECTED, &vif->flags) ? | ||
| 905 | ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0); | ||
| 906 | if (ret) { | 930 | if (ret) { |
| 907 | ath6kl_err("couldn't set bss filtering\n"); | 931 | ath6kl_err("couldn't set bss filtering\n"); |
| 908 | return ret; | 932 | return ret; |
| 909 | } | 933 | } |
| 910 | } | 934 | } |
| 911 | 935 | ||
| 912 | if (request->n_ssids && request->ssids[0].ssid_len) { | 936 | ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, |
| 913 | u8 i; | 937 | request->n_ssids); |
| 914 | 938 | if (ret < 0) | |
| 915 | if (request->n_ssids > (MAX_PROBED_SSID_INDEX - 1)) | 939 | return ret; |
| 916 | request->n_ssids = MAX_PROBED_SSID_INDEX - 1; | ||
| 917 | |||
| 918 | for (i = 0; i < request->n_ssids; i++) | ||
| 919 | ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, | ||
| 920 | i + 1, SPECIFIC_SSID_FLAG, | ||
| 921 | request->ssids[i].ssid_len, | ||
| 922 | request->ssids[i].ssid); | ||
| 923 | } | ||
| 924 | 940 | ||
| 925 | /* this also clears IE in fw if it's not set */ | 941 | /* this also clears IE in fw if it's not set */ |
| 926 | ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, | 942 | ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx, |
| 927 | WMI_FRAME_PROBE_REQ, | 943 | WMI_FRAME_PROBE_REQ, |
| 928 | request->ie, request->ie_len); | 944 | request->ie, request->ie_len); |
| 929 | if (ret) { | 945 | if (ret) { |
| 930 | ath6kl_err("failed to set Probe Request appie for " | 946 | ath6kl_err("failed to set Probe Request appie for scan"); |
| 931 | "scan"); | ||
| 932 | return ret; | 947 | return ret; |
| 933 | } | 948 | } |
| 934 | 949 | ||
| @@ -945,8 +960,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, | |||
| 945 | 960 | ||
| 946 | channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL); | 961 | channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL); |
| 947 | if (channels == NULL) { | 962 | if (channels == NULL) { |
| 948 | ath6kl_warn("failed to set scan channels, " | 963 | ath6kl_warn("failed to set scan channels, scan all channels"); |
| 949 | "scan all channels"); | ||
| 950 | n_channels = 0; | 964 | n_channels = 0; |
| 951 | } | 965 | } |
| 952 | 966 | ||
| @@ -1018,6 +1032,20 @@ out: | |||
| 1018 | vif->scan_req = NULL; | 1032 | vif->scan_req = NULL; |
| 1019 | } | 1033 | } |
| 1020 | 1034 | ||
| 1035 | void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq, | ||
| 1036 | enum wmi_phy_mode mode) | ||
| 1037 | { | ||
| 1038 | enum nl80211_channel_type type; | ||
| 1039 | |||
| 1040 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, | ||
| 1041 | "channel switch notify nw_type %d freq %d mode %d\n", | ||
| 1042 | vif->nw_type, freq, mode); | ||
| 1043 | |||
| 1044 | type = (mode == WMI_11G_HT20) ? NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT; | ||
| 1045 | |||
| 1046 | cfg80211_ch_switch_notify(vif->ndev, freq, type); | ||
| 1047 | } | ||
| 1048 | |||
| 1021 | static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, | 1049 | static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, |
| 1022 | u8 key_index, bool pairwise, | 1050 | u8 key_index, bool pairwise, |
| 1023 | const u8 *mac_addr, | 1051 | const u8 *mac_addr, |
| @@ -1111,9 +1139,8 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, | |||
| 1111 | ar->ap_mode_bkey.key_len = key->key_len; | 1139 | ar->ap_mode_bkey.key_len = key->key_len; |
| 1112 | memcpy(ar->ap_mode_bkey.key, key->key, key->key_len); | 1140 | memcpy(ar->ap_mode_bkey.key, key->key, key->key_len); |
| 1113 | if (!test_bit(CONNECTED, &vif->flags)) { | 1141 | if (!test_bit(CONNECTED, &vif->flags)) { |
| 1114 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay initial group " | 1142 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, |
| 1115 | "key configuration until AP mode has been " | 1143 | "Delay initial group key configuration until AP mode has been started\n"); |
| 1116 | "started\n"); | ||
| 1117 | /* | 1144 | /* |
| 1118 | * The key will be set in ath6kl_connect_ap_mode() once | 1145 | * The key will be set in ath6kl_connect_ap_mode() once |
| 1119 | * the connected event is received from the target. | 1146 | * the connected event is received from the target. |
| @@ -1129,8 +1156,8 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, | |||
| 1129 | * the AP mode has properly started | 1156 | * the AP mode has properly started |
| 1130 | * (ath6kl_install_statioc_wep_keys). | 1157 | * (ath6kl_install_statioc_wep_keys). |
| 1131 | */ | 1158 | */ |
| 1132 | ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay WEP key configuration " | ||
