提交 240d2799 编写于 作者: V Vasanthakumar Thiagarajan 提交者: Kalle Valo

ath6kl: Take vif information from wmi event

Interface index is passed in wmi command header from target.
Use this index to get the appropriate vif.
Signed-off-by: NVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Signed-off-by: NKalle Valo <kvalo@qca.qualcomm.com>
上级 334234b5
...@@ -123,12 +123,9 @@ static struct ieee80211_supported_band ath6kl_band_5ghz = { ...@@ -123,12 +123,9 @@ static struct ieee80211_supported_band ath6kl_band_5ghz = {
#define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */ #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */
static int ath6kl_set_wpa_version(struct ath6kl *ar, static int ath6kl_set_wpa_version(struct ath6kl_vif *vif,
enum nl80211_wpa_versions wpa_version) enum nl80211_wpa_versions wpa_version)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version); ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version);
if (!wpa_version) { if (!wpa_version) {
...@@ -145,12 +142,9 @@ static int ath6kl_set_wpa_version(struct ath6kl *ar, ...@@ -145,12 +142,9 @@ static int ath6kl_set_wpa_version(struct ath6kl *ar,
return 0; return 0;
} }
static int ath6kl_set_auth_type(struct ath6kl *ar, static int ath6kl_set_auth_type(struct ath6kl_vif *vif,
enum nl80211_auth_type auth_type) enum nl80211_auth_type auth_type)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type); ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type);
switch (auth_type) { switch (auth_type) {
...@@ -176,11 +170,8 @@ static int ath6kl_set_auth_type(struct ath6kl *ar, ...@@ -176,11 +170,8 @@ static int ath6kl_set_auth_type(struct ath6kl *ar,
return 0; return 0;
} }
static int ath6kl_set_cipher(struct ath6kl *ar, u32 cipher, bool ucast) static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto; u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto;
u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len : u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len :
&vif->grp_crypto_len; &vif->grp_crypto_len;
...@@ -218,11 +209,8 @@ static int ath6kl_set_cipher(struct ath6kl *ar, u32 cipher, bool ucast) ...@@ -218,11 +209,8 @@ static int ath6kl_set_cipher(struct ath6kl *ar, u32 cipher, bool ucast)
return 0; return 0;
} }
static void ath6kl_set_key_mgmt(struct ath6kl *ar, u32 key_mgmt) static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt); ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt);
if (key_mgmt == WLAN_AKM_SUITE_PSK) { if (key_mgmt == WLAN_AKM_SUITE_PSK) {
...@@ -376,7 +364,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -376,7 +364,7 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
return 0; return 0;
} else if (vif->ssid_len == sme->ssid_len && } else if (vif->ssid_len == sme->ssid_len &&
!memcmp(vif->ssid, sme->ssid, vif->ssid_len)) { !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) {
ath6kl_disconnect(ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
} }
memset(vif->ssid, 0, sizeof(vif->ssid)); memset(vif->ssid, 0, sizeof(vif->ssid));
...@@ -390,23 +378,23 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -390,23 +378,23 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
if (sme->bssid && !is_broadcast_ether_addr(sme->bssid)) if (sme->bssid && !is_broadcast_ether_addr(sme->bssid))
memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid)); memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid));
ath6kl_set_wpa_version(ar, sme->crypto.wpa_versions); ath6kl_set_wpa_version(vif, sme->crypto.wpa_versions);
status = ath6kl_set_auth_type(ar, sme->auth_type); status = ath6kl_set_auth_type(vif, sme->auth_type);
if (status) { if (status) {
up(&ar->sem); up(&ar->sem);
return status; return status;
} }
if (sme->crypto.n_ciphers_pairwise) if (sme->crypto.n_ciphers_pairwise)
ath6kl_set_cipher(ar, sme->crypto.ciphers_pairwise[0], true); ath6kl_set_cipher(vif, sme->crypto.ciphers_pairwise[0], true);
else else
ath6kl_set_cipher(ar, 0, true); ath6kl_set_cipher(vif, 0, true);
ath6kl_set_cipher(ar, sme->crypto.cipher_group, false); ath6kl_set_cipher(vif, sme->crypto.cipher_group, false);
if (sme->crypto.n_akm_suites) if (sme->crypto.n_akm_suites)
ath6kl_set_key_mgmt(ar, sme->crypto.akm_suites[0]); ath6kl_set_key_mgmt(vif, sme->crypto.akm_suites[0]);
if ((sme->key_len) && if ((sme->key_len) &&
(vif->auth_mode == NONE_AUTH) && (vif->auth_mode == NONE_AUTH) &&
...@@ -438,7 +426,8 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -438,7 +426,8 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
if (!ar->usr_bss_filter) { if (!ar->usr_bss_filter) {
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
if (ath6kl_wmi_bssfilter_cmd(ar->wmi, ALL_BSS_FILTER, 0) != 0) { if (ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
ALL_BSS_FILTER, 0) != 0) {
ath6kl_err("couldn't set bss filtering\n"); ath6kl_err("couldn't set bss filtering\n");
up(&ar->sem); up(&ar->sem);
return -EIO; return -EIO;
...@@ -491,12 +480,11 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, ...@@ -491,12 +480,11 @@ static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
return 0; return 0;
} }
static int ath6kl_add_bss_if_needed(struct ath6kl *ar, const u8 *bssid, static int ath6kl_add_bss_if_needed(struct ath6kl_vif *vif, const u8 *bssid,
struct ieee80211_channel *chan, struct ieee80211_channel *chan,
const u8 *beacon_ie, size_t beacon_ie_len) const u8 *beacon_ie, size_t beacon_ie_len)
{ {
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
struct cfg80211_bss *bss; struct cfg80211_bss *bss;
u8 *ie; u8 *ie;
...@@ -540,7 +528,7 @@ static int ath6kl_add_bss_if_needed(struct ath6kl *ar, const u8 *bssid, ...@@ -540,7 +528,7 @@ static int ath6kl_add_bss_if_needed(struct ath6kl *ar, const u8 *bssid,
return 0; return 0;
} }
void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel, void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
u8 *bssid, u16 listen_intvl, u8 *bssid, u16 listen_intvl,
u16 beacon_intvl, u16 beacon_intvl,
enum network_type nw_type, enum network_type nw_type,
...@@ -548,8 +536,7 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel, ...@@ -548,8 +536,7 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel,
u8 assoc_resp_len, u8 *assoc_info) u8 assoc_resp_len, u8 *assoc_info)
{ {
struct ieee80211_channel *chan; struct ieee80211_channel *chan;
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
/* capinfo + listen interval */ /* capinfo + listen interval */
u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16); u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16);
...@@ -592,11 +579,11 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel, ...@@ -592,11 +579,11 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel,
if (nw_type & ADHOC_NETWORK) { if (nw_type & ADHOC_NETWORK) {
cfg80211_ibss_joined(ar->net_dev, bssid, GFP_KERNEL); cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
return; return;
} }
if (ath6kl_add_bss_if_needed(ar, bssid, chan, assoc_info, if (ath6kl_add_bss_if_needed(vif, bssid, chan, assoc_info,
beacon_ie_len) < 0) { beacon_ie_len) < 0) {
ath6kl_err("could not add cfg80211 bss entry for " ath6kl_err("could not add cfg80211 bss entry for "
"connect/roamed notification\n"); "connect/roamed notification\n");
...@@ -606,13 +593,13 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel, ...@@ -606,13 +593,13 @@ void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel,
if (vif->sme_state == SME_CONNECTING) { if (vif->sme_state == SME_CONNECTING) {
/* inform connect result to cfg80211 */ /* inform connect result to cfg80211 */
vif->sme_state = SME_CONNECTED; vif->sme_state = SME_CONNECTED;
cfg80211_connect_result(ar->net_dev, bssid, cfg80211_connect_result(vif->ndev, bssid,
assoc_req_ie, assoc_req_len, assoc_req_ie, assoc_req_len,
assoc_resp_ie, assoc_resp_len, assoc_resp_ie, assoc_resp_len,
WLAN_STATUS_SUCCESS, GFP_KERNEL); WLAN_STATUS_SUCCESS, GFP_KERNEL);
} else if (vif->sme_state == SME_CONNECTED) { } else if (vif->sme_state == SME_CONNECTED) {
/* inform roam event to cfg80211 */ /* inform roam event to cfg80211 */
cfg80211_roamed(ar->net_dev, chan, bssid, cfg80211_roamed(vif->ndev, chan, bssid,
assoc_req_ie, assoc_req_len, assoc_req_ie, assoc_req_len,
assoc_resp_ie, assoc_resp_len, GFP_KERNEL); assoc_resp_ie, assoc_resp_len, GFP_KERNEL);
} }
...@@ -641,7 +628,7 @@ static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy, ...@@ -641,7 +628,7 @@ static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
} }
vif->reconnect_flag = 0; vif->reconnect_flag = 0;
ath6kl_disconnect(ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
memset(vif->ssid, 0, sizeof(vif->ssid)); memset(vif->ssid, 0, sizeof(vif->ssid));
vif->ssid_len = 0; vif->ssid_len = 0;
...@@ -655,12 +642,11 @@ static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy, ...@@ -655,12 +642,11 @@ static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
return 0; return 0;
} }
void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason, void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,
u8 *bssid, u8 assoc_resp_len, u8 *bssid, u8 assoc_resp_len,
u8 *assoc_info, u16 proto_reason) u8 *assoc_info, u16 proto_reason)
{ {
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
if (vif->scan_req) { if (vif->scan_req) {
cfg80211_scan_done(vif->scan_req, true); cfg80211_scan_done(vif->scan_req, true);
...@@ -674,7 +660,7 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason, ...@@ -674,7 +660,7 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason,
return; return;
} }
memset(bssid, 0, ETH_ALEN); memset(bssid, 0, ETH_ALEN);
cfg80211_ibss_joined(ar->net_dev, bssid, GFP_KERNEL); cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
return; return;
} }
...@@ -704,13 +690,13 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason, ...@@ -704,13 +690,13 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason,
clear_bit(CONNECT_PEND, &vif->flags); clear_bit(CONNECT_PEND, &vif->flags);
if (vif->sme_state == SME_CONNECTING) { if (vif->sme_state == SME_CONNECTING) {
cfg80211_connect_result(ar->net_dev, cfg80211_connect_result(vif->ndev,
bssid, NULL, 0, bssid, NULL, 0,
NULL, 0, NULL, 0,
WLAN_STATUS_UNSPECIFIED_FAILURE, WLAN_STATUS_UNSPECIFIED_FAILURE,
GFP_KERNEL); GFP_KERNEL);
} else if (vif->sme_state == SME_CONNECTED) { } else if (vif->sme_state == SME_CONNECTED) {
cfg80211_disconnected(ar->net_dev, reason, cfg80211_disconnected(vif->ndev, reason,
NULL, 0, GFP_KERNEL); NULL, 0, GFP_KERNEL);
} }
...@@ -733,7 +719,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ...@@ -733,7 +719,7 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
if (!ar->usr_bss_filter) { if (!ar->usr_bss_filter) {
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
ret = ath6kl_wmi_bssfilter_cmd( ret = ath6kl_wmi_bssfilter_cmd(
ar->wmi, ar->wmi, vif->fw_vif_idx,
(test_bit(CONNECTED, &vif->flags) ? (test_bit(CONNECTED, &vif->flags) ?
ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0); ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0);
if (ret) { if (ret) {
...@@ -804,10 +790,9 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev, ...@@ -804,10 +790,9 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
return ret; return ret;
} }
void ath6kl_cfg80211_scan_complete_event(struct ath6kl *ar, int status) void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, int status)
{ {
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
int i; int i;
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status %d\n", __func__, status); ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status %d\n", __func__, status);
...@@ -852,7 +837,8 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, ...@@ -852,7 +837,8 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
if (params->cipher == CCKM_KRK_CIPHER_SUITE) { if (params->cipher == CCKM_KRK_CIPHER_SUITE) {
if (params->key_len != WMI_KRK_LEN) if (params->key_len != WMI_KRK_LEN)
return -EINVAL; return -EINVAL;
return ath6kl_wmi_add_krk_cmd(ar->wmi, params->key); return ath6kl_wmi_add_krk_cmd(ar->wmi, vif->fw_vif_idx,
params->key);
} }
if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) { if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
...@@ -1079,16 +1065,13 @@ static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy, ...@@ -1079,16 +1065,13 @@ static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
return 0; return 0;
} }
void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl *ar, u8 keyid, void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid,
bool ismcast) bool ismcast)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
"%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast); "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast);
cfg80211_michael_mic_failure(ar->net_dev, vif->bssid, cfg80211_michael_mic_failure(vif->ndev, vif->bssid,
(ismcast ? NL80211_KEYTYPE_GROUP : (ismcast ? NL80211_KEYTYPE_GROUP :
NL80211_KEYTYPE_PAIRWISE), keyid, NULL, NL80211_KEYTYPE_PAIRWISE), keyid, NULL,
GFP_KERNEL); GFP_KERNEL);
...@@ -1282,18 +1265,18 @@ static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy, ...@@ -1282,18 +1265,18 @@ static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
memcpy(vif->req_bssid, ibss_param->bssid, memcpy(vif->req_bssid, ibss_param->bssid,
sizeof(vif->req_bssid)); sizeof(vif->req_bssid));
ath6kl_set_wpa_version(ar, 0); ath6kl_set_wpa_version(vif, 0);
status = ath6kl_set_auth_type(ar, NL80211_AUTHTYPE_OPEN_SYSTEM); status = ath6kl_set_auth_type(vif, NL80211_AUTHTYPE_OPEN_SYSTEM);
if (status) if (status)
return status; return status;
if (ibss_param->privacy) { if (ibss_param->privacy) {
ath6kl_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, true); ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, true);
ath6kl_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, false); ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, false);
} else { } else {
ath6kl_set_cipher(ar, 0, true); ath6kl_set_cipher(vif, 0, true);
ath6kl_set_cipher(ar, 0, false); ath6kl_set_cipher(vif, 0, false);
} }
vif->nw_type = vif->next_mode; vif->nw_type = vif->next_mode;
...@@ -1329,7 +1312,7 @@ static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy, ...@@ -1329,7 +1312,7 @@ static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy,
if (!ath6kl_cfg80211_ready(ar)) if (!ath6kl_cfg80211_ready(ar))
return -EIO; return -EIO;
ath6kl_disconnect(ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
memset(vif->ssid, 0, sizeof(vif->ssid)); memset(vif->ssid, 0, sizeof(vif->ssid));
vif->ssid_len = 0; vif->ssid_len = 0;
...@@ -1720,9 +1703,9 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev, ...@@ -1720,9 +1703,9 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
} }
if (p.prwise_crypto_type == 0) { if (p.prwise_crypto_type == 0) {
p.prwise_crypto_type = NONE_CRYPT; p.prwise_crypto_type = NONE_CRYPT;
ath6kl_set_cipher(ar, 0, true); ath6kl_set_cipher(vif, 0, true);
} else if (info->crypto.n_ciphers_pairwise == 1) } else if (info->crypto.n_ciphers_pairwise == 1)
ath6kl_set_cipher(ar, info->crypto.ciphers_pairwise[0], true); ath6kl_set_cipher(vif, info->crypto.ciphers_pairwise[0], true);
switch (info->crypto.cipher_group) { switch (info->crypto.cipher_group) {
case WLAN_CIPHER_SUITE_WEP40: case WLAN_CIPHER_SUITE_WEP40:
...@@ -1739,7 +1722,7 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev, ...@@ -1739,7 +1722,7 @@ static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
p.grp_crypto_type = NONE_CRYPT; p.grp_crypto_type = NONE_CRYPT;
break; break;
} }
ath6kl_set_cipher(ar, info->crypto.cipher_group, false); ath6kl_set_cipher(vif, info->crypto.cipher_group, false);
p.nw_type = AP_NETWORK; p.nw_type = AP_NETWORK;
vif->nw_type = vif->next_mode; vif->nw_type = vif->next_mode;
......
...@@ -24,20 +24,20 @@ int ath6kl_register_ieee80211_hw(struct ath6kl *ar); ...@@ -24,20 +24,20 @@ int ath6kl_register_ieee80211_hw(struct ath6kl *ar);
struct ath6kl *ath6kl_core_alloc(struct device *dev); struct ath6kl *ath6kl_core_alloc(struct device *dev);
void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar); void ath6kl_deinit_ieee80211_hw(struct ath6kl *ar);
void ath6kl_cfg80211_scan_complete_event(struct ath6kl *ar, int status); void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, int status);
void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel, void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
u8 *bssid, u16 listen_intvl, u8 *bssid, u16 listen_intvl,
u16 beacon_intvl, u16 beacon_intvl,
enum network_type nw_type, enum network_type nw_type,
u8 beacon_ie_len, u8 assoc_req_len, u8 beacon_ie_len, u8 assoc_req_len,
u8 assoc_resp_len, u8 *assoc_info); u8 assoc_resp_len, u8 *assoc_info);
void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason, void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,
u8 *bssid, u8 assoc_resp_len, u8 *bssid, u8 assoc_resp_len,
u8 *assoc_info, u16 proto_reason); u8 *assoc_info, u16 proto_reason);
void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl *ar, u8 keyid, void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid,
bool ismcast); bool ismcast);
#endif /* ATH6KL_CFG80211_H */ #endif /* ATH6KL_CFG80211_H */
...@@ -628,32 +628,32 @@ struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid); ...@@ -628,32 +628,32 @@ struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid);
void ath6kl_ready_event(void *devt, u8 * datap, u32 sw_ver, u32 abi_ver); void ath6kl_ready_event(void *devt, u8 * datap, u32 sw_ver, u32 abi_ver);
int ath6kl_control_tx(void *devt, struct sk_buff *skb, int ath6kl_control_tx(void *devt, struct sk_buff *skb,
enum htc_endpoint_id eid); enum htc_endpoint_id eid);
void ath6kl_connect_event(struct ath6kl *ar, u16 channel, void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel,
u8 *bssid, u16 listen_int, u8 *bssid, u16 listen_int,
u16 beacon_int, enum network_type net_type, u16 beacon_int, enum network_type net_type,
u8 beacon_ie_len, u8 assoc_req_len, u8 beacon_ie_len, u8 assoc_req_len,
u8 assoc_resp_len, u8 *assoc_info); u8 assoc_resp_len, u8 *assoc_info);
void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel); void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel);
void ath6kl_connect_ap_mode_sta(struct ath6kl *ar, u16 aid, u8 *mac_addr, void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
u8 keymgmt, u8 ucipher, u8 auth, u8 keymgmt, u8 ucipher, u8 auth,
u8 assoc_req_len, u8 *assoc_info); u8 assoc_req_len, u8 *assoc_info);
void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason,
u8 *bssid, u8 assoc_resp_len, u8 *bssid, u8 assoc_resp_len,
u8 *assoc_info, u16 prot_reason_status); u8 *assoc_info, u16 prot_reason_status);
void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast); void ath6kl_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, bool ismcast);
void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr); void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr);
void ath6kl_scan_complete_evt(struct ath6kl *ar, int status); void ath6kl_scan_complete_evt(struct ath6kl_vif *vif, int status);
void ath6kl_tgt_stats_event(struct ath6kl *ar, u8 *ptr, u32 len); void ath6kl_tgt_stats_event(struct ath6kl_vif *vif, u8 *ptr, u32 len);
void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active); void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active);
enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac); enum htc_endpoint_id ath6kl_ac2_endpoint_id(void *devt, u8 ac);
void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid); void ath6kl_pspoll_event(struct ath6kl_vif *vif, u8 aid);
void ath6kl_dtimexpiry_event(struct ath6kl *ar); void ath6kl_dtimexpiry_event(struct ath6kl_vif *vif);
void ath6kl_disconnect(struct ath6kl *ar, u8 if_idx); void ath6kl_disconnect(struct ath6kl_vif *vif);
void ath6kl_deep_sleep_enable(struct ath6kl *ar); void ath6kl_deep_sleep_enable(struct ath6kl *ar);
void aggr_recv_delba_req_evt(struct ath6kl *ar, u8 tid); void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid);
void aggr_recv_addba_req_evt(struct ath6kl *ar, u8 tid, u16 seq_no, void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no,
u8 win_sz); u8 win_sz);
void ath6kl_wakeup_event(void *dev); void ath6kl_wakeup_event(void *dev);
void ath6kl_target_failure(struct ath6kl *ar); void ath6kl_target_failure(struct ath6kl *ar);
......
...@@ -1249,6 +1249,8 @@ static ssize_t ath6kl_create_qos_write(struct file *file, ...@@ -1249,6 +1249,8 @@ static ssize_t ath6kl_create_qos_write(struct file *file,
{ {
struct ath6kl *ar = file->private_data; struct ath6kl *ar = file->private_data;
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
char buf[100]; char buf[100];
ssize_t len; ssize_t len;
char *sptr, *token; char *sptr, *token;
...@@ -1403,7 +1405,7 @@ static ssize_t ath6kl_create_qos_write(struct file *file, ...@@ -1403,7 +1405,7 @@ static ssize_t ath6kl_create_qos_write(struct file *file,
return -EINVAL; return -EINVAL;
pstream.medium_time = cpu_to_le32(val32); pstream.medium_time = cpu_to_le32(val32);
ath6kl_wmi_create_pstream_cmd(ar->wmi, &pstream); ath6kl_wmi_create_pstream_cmd(ar->wmi, vif->fw_vif_idx, &pstream);
return count; return count;
} }
...@@ -1421,6 +1423,8 @@ static ssize_t ath6kl_delete_qos_write(struct file *file, ...@@ -1421,6 +1423,8 @@ static ssize_t ath6kl_delete_qos_write(struct file *file,
{ {
struct ath6kl *ar = file->private_data; struct ath6kl *ar = file->private_data;
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
char buf[100]; char buf[100];
ssize_t len; ssize_t len;
char *sptr, *token; char *sptr, *token;
...@@ -1445,7 +1449,8 @@ static ssize_t ath6kl_delete_qos_write(struct file *file, ...@@ -1445,7 +1449,8 @@ static ssize_t ath6kl_delete_qos_write(struct file *file,
if (kstrtou8(token, 0, &tsid)) if (kstrtou8(token, 0, &tsid))
return -EINVAL; return -EINVAL;
ath6kl_wmi_delete_pstream_cmd(ar->wmi, traffic_class, tsid); ath6kl_wmi_delete_pstream_cmd(ar->wmi, vif->fw_vif_idx,
traffic_class, tsid);
return count; return count;
} }
......
...@@ -441,7 +441,7 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile, ...@@ -441,7 +441,7 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile,
if (test_bit(WMI_READY, &ar->flag)) { if (test_bit(WMI_READY, &ar->flag)) {
discon_issued = (test_bit(CONNECTED, &vif->flags) || discon_issued = (test_bit(CONNECTED, &vif->flags) ||
test_bit(CONNECT_PEND, &vif->flags)); test_bit(CONNECT_PEND, &vif->flags));
ath6kl_disconnect(ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
if (!keep_profile) if (!keep_profile)
ath6kl_init_profile_info(ar); ath6kl_init_profile_info(ar);
...@@ -462,7 +462,7 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile, ...@@ -462,7 +462,7 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile,
* are collected. * are collected.
*/ */
if (discon_issued) if (discon_issued)
ath6kl_disconnect_event(ar, DISCONNECT_CMD, ath6kl_disconnect_event(vif, DISCONNECT_CMD,
(vif->nw_type & AP_NETWORK) ? (vif->nw_type & AP_NETWORK) ?
bcast_mac : vif->bssid, bcast_mac : vif->bssid,
0, NULL, 0); 0, NULL, 0);
...@@ -498,10 +498,8 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile, ...@@ -498,10 +498,8 @@ void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile,
ath6kl_reset_device(ar, ar->target_type, true, true); ath6kl_reset_device(ar, ar->target_type, true, true);
} }
static void ath6kl_install_static_wep_keys(struct ath6kl *ar) static void ath6kl_install_static_wep_keys(struct ath6kl_vif *vif)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
u8 index; u8 index;
u8 keyusage; u8 keyusage;
...@@ -511,7 +509,7 @@ static void ath6kl_install_static_wep_keys(struct ath6kl *ar) ...@@ -511,7 +509,7 @@ static void ath6kl_install_static_wep_keys(struct ath6kl *ar)
if (index == vif->def_txkey_index) if (index == vif->def_txkey_index)
keyusage |= TX_USAGE; keyusage |= TX_USAGE;
ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, ath6kl_wmi_addkey_cmd(vif->ar->wmi, vif->fw_vif_idx,
index, index,
WEP_CRYPT, WEP_CRYPT,
keyusage, keyusage,
...@@ -524,13 +522,12 @@ static void ath6kl_install_static_wep_keys(struct ath6kl *ar) ...@@ -524,13 +522,12 @@ static void ath6kl_install_static_wep_keys(struct ath6kl *ar)
} }
} }
void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel) void ath6kl_connect_ap_mode_bss(struct ath6kl_vif *vif, u16 channel)
{ {
struct ath6kl *ar = vif->ar;
struct ath6kl_req_key *ik; struct ath6kl_req_key *ik;
int res; int res;
u8 key_rsc[ATH6KL_KEY_SEQ_LEN]; u8 key_rsc[ATH6KL_KEY_SEQ_LEN];
/* TODO: Pass vif instead of taking it from ar */
struct ath6kl_vif *vif = ar->vif;
ik = &ar->ap_mode_bkey; ik = &ar->ap_mode_bkey;
...@@ -539,7 +536,7 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel) ...@@ -539,7 +536,7 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel)
switch (vif->auth_mode) { switch (vif->auth_mode) {
case NONE_AUTH: case NONE_AUTH:
if (vif->prwise_crypto == WEP_CRYPT) if (vif->prwise_crypto == WEP_CRYPT)
ath6kl_install_static_wep_keys(ar); ath6kl_install_static_wep_keys(vif);
break; break;
case WPA_PSK_AUTH: case WPA_PSK_AUTH:
case WPA2_PSK_AUTH: case WPA2_PSK_AUTH:
...@@ -561,15 +558,16 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel) ...@@ -561,15 +558,16 @@ void ath6kl_connect_ap_mode_bss(struct ath6kl *ar, u16 channel)
break; break;
} }
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0); ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx, NONE_BSS_FILTER, 0);
set_bit(CONNECTED, &vif->flags); set_bit(CONNECTED, &vif->flags);
netif_carrier_on(ar->net_dev); netif_carrier_on(vif->ndev);
} }
void ath6kl_connect_ap_mode_sta(struct ath6kl *ar, u16 aid, u8 *mac_addr, void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
u8 keymgmt, u8 ucipher, u8 auth, u8 keymgmt, u8 ucipher, u8 auth,
u8 assoc_req_len, u8 *assoc_info) u8 assoc_req_len, u8 *assoc_info)
{ {
struct ath6kl *ar = vif->ar;
u8 *ies = NULL, *wpa_ie = NULL, *pos; u8 *ies = NULL, *wpa_ie = NULL, *pos;
size_t ies_len = 0; size_t ies_len = 0;
struct station_info sinfo; struct station_info sinfo;
...@@ -624,9 +622,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl *ar, u16 aid, u8 *mac_addr, ...@@ -624,9 +622,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl *ar, u16 aid, u8 *mac_addr,
sinfo.assoc_req_ies_len = ies_len; sinfo.assoc_req_ies_len = ies_len;
sinfo.filled |= STATION_INFO_ASSOC_REQ_IES; sinfo.filled |= STATION_INFO_ASSOC_REQ_IES;
cfg80211_new_sta(ar->net_dev, mac_addr, &sinfo, GFP_KERNEL); cfg80211_new_sta(vif->ndev, mac_addr, &sinfo, GFP_KERNEL);
netif_wake_queue(ar->net_dev); netif_wake_queue(vif->ndev);
} }
/* Functions for Tx credit handling */ /* Functions for Tx credit handling */
...@@ -916,17 +914,14 @@ void disconnect_timer_handler(unsigned long ptr) ...@@ -916,17 +914,14 @@ void disconnect_timer_handler(unsigned long ptr)
struct ath6kl_vif *vif = netdev_priv(dev); struct ath6kl_vif *vif = netdev_priv(dev);
ath6kl_init_profile_info(vif->ar); ath6kl_init_profile_info(vif->ar);
ath6kl_disconnect(vif->ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
} }
void ath6kl_disconnect(struct ath6kl *ar, u8 if_idx) void ath6kl_disconnect(struct ath6kl_vif *vif)
{ {
/* TODO: Pass vif instead of taking it from ar */
struct ath6kl_vif *vif = ar->vif;
if (test_bit(CONNECTED, &vif->flags) || if (test_bit(CONNECTED, &vif->flags) ||
test_bit(CONNECT_PEND, &vif->flags)) { test_bit(CONNECT_PEND, &vif->flags)) {
ath6kl_wmi_disconnect_cmd(ar->wmi, if_idx); ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
/* /*
* Disconnect command is issued, clear the connect pending * Disconnect command is issued, clear the connect pending
* flag. The connected flag will be cleared in * flag. The connected flag will be cleared in
...@@ -971,7 +966,7 @@ void ath6kl_deep_sleep_enable(struct ath6kl *ar) ...@@ -971,7 +966,7 @@ void ath6kl_deep_sleep_enable(struct ath6kl *ar)
printk(KERN_WARNING "ath6kl: failed to disable scan " printk(KERN_WARNING "ath6kl: failed to disable scan "
"during suspend\n"); "during suspend\n");
ath6kl_cfg80211_scan_complete_event(ar, -ECANCELED); ath6kl_cfg80211_scan_complete_event(vif, -ECANCELED);
/* save the current power mode before enabling power save */ /* save the current power mode before enabling power save */
ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode; ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
...@@ -1027,31 +1022,30 @@ void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver) ...@@ -1027,31 +1022,30 @@ void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver)
test_bit(TESTMODE, &ar->flag) ? " testmode" : ""); test_bit(TESTMODE, &ar->flag) ? " testmode" : "");
} }
void ath6kl_scan_complete_evt(struct ath6kl *ar, int status) void ath6kl_scan_complete_evt(struct ath6kl_vif *vif, int status)
{ {
/* TODO: Pass vif instead of taking it from ar */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
ath6kl_cfg80211_scan_complete_event(ar, status); ath6kl_cfg80211_scan_complete_event(vif, status);
if (!ar->usr_bss_filter) { if (!ar->usr_bss_filter) {
clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0); ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
NONE_BSS_FILTER, 0);
} }
ath6kl_dbg(ATH6KL_DBG_WLAN_SCAN, "scan complete: %d\n", status); ath6kl_dbg(ATH6KL_DBG_WLAN_SCAN, "scan complete: %d\n", status);
} }
void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid, void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
u16 listen_int, u16 beacon_int, u16 listen_int, u16 beacon_int,
enum network_type net_type, u8 beacon_ie_len, enum network_type net_type, u8 beacon_ie_len,
u8 assoc_req_len, u8 assoc_resp_len, u8 assoc_req_len, u8 assoc_resp_len,
u8 *assoc_info) u8 *assoc_info)
{ {
/* TODO: findout vif instead of taking it from ar */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
ath6kl_cfg80211_connect_event(ar, channel, bssid, ath6kl_cfg80211_connect_event(vif, channel, bssid,
listen_int, beacon_int, listen_int, beacon_int,
net_type, beacon_ie_len, net_type, beacon_ie_len,
assoc_req_len, assoc_resp_len, assoc_req_len, assoc_resp_len,
...@@ -1065,13 +1059,13 @@ void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid, ...@@ -1065,13 +1059,13 @@ void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid,
ar->listen_intvl_t, ar->listen_intvl_t,
ar->listen_intvl_b); ar->listen_intvl_b);
netif_wake_queue(ar->net_dev); netif_wake_queue(vif->ndev);
/* Update connect & link status atomically */ /* Update connect & link status atomically */
spin_lock_bh(&ar->lock); spin_lock_bh(&ar->lock);
set_bit(CONNECTED, &vif->flags); set_bit(CONNECTED, &vif->flags);
clear_bit(CONNECT_PEND, &vif->flags); clear_bit(CONNECT_PEND, &vif->flags);
netif_carrier_on(ar->net_dev); netif_carrier_on(vif->ndev);
spin_unlock_bh(&ar->lock); spin_unlock_bh(&ar->lock);
aggr_reset_state(vif->aggr_cntxt); aggr_reset_state(vif->aggr_cntxt);
...@@ -1085,16 +1079,17 @@ void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid, ...@@ -1085,16 +1079,17 @@ void ath6kl_connect_event(struct ath6kl *ar, u16 channel, u8 *bssid,
if (!ar->usr_bss_filter) { if (!ar->usr_bss_filter) {
set_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags); set_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
ath6kl_wmi_bssfilter_cmd(ar->wmi, CURRENT_BSS_FILTER, 0); ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
CURRENT_BSS_FILTER, 0);
} }
} }
void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast) void ath6kl_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid, bool ismcast)
{ {
struct ath6kl_sta *sta; struct ath6kl_sta *sta;
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
u8 tsc[6]; u8 tsc[6];
/* /*
* For AP case, keyid will have aid of STA which sent pkt with * For AP case, keyid will have aid of STA which sent pkt with
* MIC error. Use this aid to get MAC & send it to hostapd. * MIC error. Use this aid to get MAC & send it to hostapd.
...@@ -1108,20 +1103,19 @@ void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast) ...@@ -1108,20 +1103,19 @@ void ath6kl_tkip_micerr_event(struct ath6kl *ar, u8 keyid, bool ismcast)
"ap tkip mic error received from aid=%d\n", keyid); "ap tkip mic error received from aid=%d\n", keyid);
memset(tsc, 0, sizeof(tsc)); /* FIX: get correct TSC */ memset(tsc, 0, sizeof(tsc)); /* FIX: get correct TSC */
cfg80211_michael_mic_failure(ar->net_dev, sta->mac, cfg80211_michael_mic_failure(vif->ndev, sta->mac,
NL80211_KEYTYPE_PAIRWISE, keyid, NL80211_KEYTYPE_PAIRWISE, keyid,
tsc, GFP_KERNEL); tsc, GFP_KERNEL);
} else } else
ath6kl_cfg80211_tkip_micerr_event(ar, keyid, ismcast); ath6kl_cfg80211_tkip_micerr_event(vif, keyid, ismcast);
} }
static void ath6kl_update_target_stats(struct ath6kl *ar, u8 *ptr, u32 len) static void ath6kl_update_target_stats(struct ath6kl_vif *vif, u8 *ptr, u32 len)
{ {
struct wmi_target_stats *tgt_stats = struct wmi_target_stats *tgt_stats =
(struct wmi_target_stats *) ptr; (struct wmi_target_stats *) ptr;
/* TODO: Findout vif */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
struct target_stats *stats = &vif->target_stats; struct target_stats *stats = &vif->target_stats;
struct tkip_ccmp_stats *ccmp_stats; struct tkip_ccmp_stats *ccmp_stats;
u8 ac; u8 ac;
...@@ -1229,13 +1223,12 @@ static void ath6kl_add_le32(__le32 *var, __le32 val) ...@@ -1229,13 +1223,12 @@ static void ath6kl_add_le32(__le32 *var, __le32 val)
*var = cpu_to_le32(le32_to_cpu(*var) + le32_to_cpu(val)); *var = cpu_to_le32(le32_to_cpu(*var) + le32_to_cpu(val));
} }
void ath6kl_tgt_stats_event(struct ath6kl *ar, u8 *ptr, u32 len) void ath6kl_tgt_stats_event(struct ath6kl_vif *vif, u8 *ptr, u32 len)
{ {
struct wmi_ap_mode_stat *p = (struct wmi_ap_mode_stat *) ptr; struct wmi_ap_mode_stat *p = (struct wmi_ap_mode_stat *) ptr;
struct ath6kl *ar = vif->ar;
struct wmi_ap_mode_stat *ap = &ar->ap_stats; struct wmi_ap_mode_stat *ap = &ar->ap_stats;
struct wmi_per_sta_stat *st_ap, *st_p; struct wmi_per_sta_stat *st_ap, *st_p;
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
u8 ac; u8 ac;
if (vif->nw_type == AP_NETWORK) { if (vif->nw_type == AP_NETWORK) {
...@@ -1257,7 +1250,7 @@ void ath6kl_tgt_stats_event(struct ath6kl *ar, u8 *ptr, u32 len) ...@@ -1257,7 +1250,7 @@ void ath6kl_tgt_stats_event(struct ath6kl *ar, u8 *ptr, u32 len)
} }
} else { } else {
ath6kl_update_target_stats(ar, ptr, len); ath6kl_update_target_stats(vif, ptr, len);
} }
} }
...@@ -1276,13 +1269,12 @@ void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr) ...@@ -1276,13 +1269,12 @@ void ath6kl_txpwr_rx_evt(void *devt, u8 tx_pwr)
wake_up(&ar->event_wq); wake_up(&ar->event_wq);
} }
void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid) void ath6kl_pspoll_event(struct ath6kl_vif *vif, u8 aid)
{ {
struct ath6kl_sta *conn; struct ath6kl_sta *conn;
struct sk_buff *skb; struct sk_buff *skb;
bool psq_empty = false; bool psq_empty = false;
/* TODO: Pass vif instead of taking it from ar */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
conn = ath6kl_find_sta_by_aid(ar, aid); conn = ath6kl_find_sta_by_aid(ar, aid);
...@@ -1305,7 +1297,7 @@ void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid) ...@@ -1305,7 +1297,7 @@ void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid)
spin_unlock_bh(&conn->psq_lock); spin_unlock_bh(&conn->psq_lock);
conn->sta_flags |= STA_PS_POLLED; conn->sta_flags |= STA_PS_POLLED;
ath6kl_data_tx(skb, ar->net_dev); ath6kl_data_tx(skb, vif->ndev);
conn->sta_flags &= ~STA_PS_POLLED; conn->sta_flags &= ~STA_PS_POLLED;
spin_lock_bh(&conn->psq_lock); spin_lock_bh(&conn->psq_lock);
...@@ -1316,12 +1308,11 @@ void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid) ...@@ -1316,12 +1308,11 @@ void ath6kl_pspoll_event(struct ath6kl *ar, u8 aid)
ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, conn->aid, 0); ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, conn->aid, 0);
} }
void ath6kl_dtimexpiry_event(struct ath6kl *ar) void ath6kl_dtimexpiry_event(struct ath6kl_vif *vif)
{ {
bool mcastq_empty = false; bool mcastq_empty = false;
struct sk_buff *skb; struct sk_buff *skb;
/* TODO: Pass vif instead of taking it from ar */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
/* /*
* If there are no associated STAs, ignore the DTIM expiry event. * If there are no associated STAs, ignore the DTIM expiry event.
...@@ -1349,7 +1340,7 @@ void ath6kl_dtimexpiry_event(struct ath6kl *ar) ...@@ -1349,7 +1340,7 @@ void ath6kl_dtimexpiry_event(struct ath6kl *ar)
while ((skb = skb_dequeue(&ar->mcastpsq)) != NULL) { while ((skb = skb_dequeue(&ar->mcastpsq)) != NULL) {
spin_unlock_bh(&ar->mcastpsq_lock); spin_unlock_bh(&ar->mcastpsq_lock);
ath6kl_data_tx(skb, ar->net_dev); ath6kl_data_tx(skb, vif->ndev);
spin_lock_bh(&ar->mcastpsq_lock); spin_lock_bh(&ar->mcastpsq_lock);
} }
...@@ -1361,12 +1352,11 @@ void ath6kl_dtimexpiry_event(struct ath6kl *ar) ...@@ -1361,12 +1352,11 @@ void ath6kl_dtimexpiry_event(struct ath6kl *ar)
ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, MCAST_AID, 0); ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx, MCAST_AID, 0);
} }
void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid,
u8 assoc_resp_len, u8 *assoc_info, u8 assoc_resp_len, u8 *assoc_info,
u16 prot_reason_status) u16 prot_reason_status)
{ {
/* TODO: Findout vif instead of taking it from ar */ struct ath6kl *ar = vif->ar;
struct ath6kl_vif *vif = ar->vif;
if (vif->nw_type == AP_NETWORK) { if (vif->nw_type == AP_NETWORK) {
if (!ath6kl_remove_sta(ar, bssid, prot_reason_status)) if (!ath6kl_remove_sta(ar, bssid, prot_reason_status))
...@@ -1386,17 +1376,17 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, ...@@ -1386,17 +1376,17 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid,
if (!is_broadcast_ether_addr(bssid)) { if (!is_broadcast_ether_addr(bssid)) {
/* send event to application */ /* send event to application */
cfg80211_del_sta(ar->net_dev, bssid, GFP_KERNEL); cfg80211_del_sta(vif->ndev, bssid, GFP_KERNEL);
} }
if (memcmp(ar->net_dev->dev_addr, bssid, ETH_ALEN) == 0) { if (memcmp(vif->ndev->dev_addr, bssid, ETH_ALEN) == 0) {
memset(vif->wep_key_list, 0, sizeof(vif->wep_key_list)); memset(vif->wep_key_list, 0, sizeof(vif->wep_key_list));
clear_bit(CONNECTED, &vif->flags); clear_bit(CONNECTED, &vif->flags);
} }
return; return;
} }
ath6kl_cfg80211_disconnect_event(ar, reason, bssid, ath6kl_cfg80211_disconnect_event(vif, reason, bssid,
assoc_resp_len, assoc_info, assoc_resp_len, assoc_info,
prot_reason_status); prot_reason_status);
...@@ -1414,7 +1404,8 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, ...@@ -1414,7 +1404,8 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid,
*/ */
if (reason == DISCONNECT_CMD) { if (reason == DISCONNECT_CMD) {
if (!ar->usr_bss_filter && test_bit(WMI_READY, &ar->flag)) if (!ar->usr_bss_filter && test_bit(WMI_READY, &ar->flag))
ath6kl_wmi_bssfilter_cmd(ar->wmi, NONE_BSS_FILTER, 0); ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
NONE_BSS_FILTER, 0);
} else { } else {
set_bit(CONNECT_PEND, &vif->flags); set_bit(CONNECT_PEND, &vif->flags);
if (((reason == ASSOC_FAILED) && if (((reason == ASSOC_FAILED) &&
...@@ -1429,7 +1420,7 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, ...@@ -1429,7 +1420,7 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid,
/* update connect & link status atomically */ /* update connect & link status atomically */
spin_lock_bh(&ar->lock); spin_lock_bh(&ar->lock);
clear_bit(CONNECTED, &vif->flags); clear_bit(CONNECTED, &vif->flags);
netif_carrier_off(ar->net_dev); netif_carrier_off(vif->ndev);
spin_unlock_bh(&ar->lock); spin_unlock_bh(&ar->lock);
if ((reason != CSERV_DISCONNECT) || (vif->reconnect_flag != 1)) if ((reason != CSERV_DISCONNECT) || (vif->reconnect_flag != 1))
...@@ -1438,7 +1429,7 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid, ...@@ -1438,7 +1429,7 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid,
if (reason != CSERV_DISCONNECT) if (reason != CSERV_DISCONNECT)
ar->user_key_ctrl = 0; ar->user_key_ctrl = 0;
netif_stop_queue(ar->net_dev); netif_stop_queue(vif->ndev);
memset(vif->bssid, 0, sizeof(vif->bssid)); memset(vif->bssid, 0, sizeof(vif->bssid));
vif->bss_ch = 0; vif->bss_ch = 0;
...@@ -1472,7 +1463,7 @@ static int ath6kl_close(struct net_device *dev) ...@@ -1472,7 +1463,7 @@ static int ath6kl_close(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
ath6kl_disconnect(ar, vif->fw_vif_idx); ath6kl_disconnect(vif);
if (test_bit(WMI_READY, &ar->flag)) { if (test_bit(WMI_READY, &ar->flag)) {
if (ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0xFFFF, if (ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0xFFFF,
...@@ -1482,7 +1473,7 @@ static int ath6kl_close(struct net_device *dev) ...@@ -1482,7 +1473,7 @@ static int ath6kl_close(struct net_device *dev)
clear_bit(WLAN_ENABLED, &vif->flags); clear_bit(WLAN_ENABLED, &vif->flags);
} }
ath6kl_cfg80211_scan_complete_event(ar, -ECANCELED); ath6kl_cfg80211_scan_complete_event(vif, -ECANCELED);
return 0; return 0;
} }
......
...@@ -287,7 +287,8 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev) ...@@ -287,7 +287,8 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
chk_adhoc_ps_mapping = true; chk_adhoc_ps_mapping = true;
else { else {
/* get the stream mapping */ /* get the stream mapping */
ret = ath6kl_wmi_implicit_create_pstream(ar->wmi, skb, ret = ath6kl_wmi_implicit_create_pstream(ar->wmi,
vif->fw_vif_idx, skb,
0, test_bit(WMM_ENABLED, &vif->flags), &ac); 0, test_bit(WMM_ENABLED, &vif->flags), &ac);
if (ret) if (ret)
goto fail_tx; goto fail_tx;
...@@ -1354,10 +1355,9 @@ static void aggr_delete_tid_state(struct aggr_info *p_aggr, u8 tid) ...@@ -1354,10 +1355,9 @@ static void aggr_delete_tid_state(struct aggr_info *p_aggr, u8 tid)
memset(stats, 0, sizeof(struct rxtid_stats)); memset(stats, 0, sizeof(struct rxtid_stats));
} }
void aggr_recv_addba_req_evt(struct ath6kl *ar, u8 tid, u16 seq_no, u8 win_sz) void aggr_recv_addba_req_evt(struct ath6kl_vif *vif, u8 tid, u16 seq_no,
u8 win_sz)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
struct aggr_info *p_aggr = vif->aggr_cntxt; struct aggr_info *p_aggr = vif->aggr_cntxt;
struct rxtid *rxtid; struct rxtid *rxtid;
struct rxtid_stats *stats; struct rxtid_stats *stats;
...@@ -1425,10 +1425,8 @@ struct aggr_info *aggr_init(struct net_device *dev) ...@@ -1425,10 +1425,8 @@ struct aggr_info *aggr_init(struct net_device *dev)
return p_aggr; return p_aggr;
} }
void aggr_recv_delba_req_evt(struct ath6kl *ar, u8 tid) void aggr_recv_delba_req_evt(struct ath6kl_vif *vif, u8 tid)
{ {
/* TODO: Findout vif */
struct ath6kl_vif *vif = ar->vif;
struct aggr_info *p_aggr = vif->aggr_cntxt; struct aggr_info *p_aggr = vif->aggr_cntxt;
struct rxtid *rxtid; struct rxtid *rxtid;
......
...@@ -2171,9 +2171,9 @@ int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb, ...@@ -2171,9 +2171,9 @@ int ath6kl_wmi_data_hdr_add(struct wmi *wmi, struct sk_buff *skb,
int ath6kl_wmi_dot11_hdr_remove(struct wmi *wmi, struct sk_buff *skb); int ath6kl_wmi_dot11_hdr_remove(struct wmi *wmi, struct sk_buff *skb);
int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb); int ath6kl_wmi_dot3_2_dix(struct sk_buff *skb);
int ath6kl_wmi_implicit_create_pstream(struct wmi *wmi, struct sk_buff *skb, int ath6kl_wmi_implicit_create_pstream(struct wmi *wmi, u8 if_idx,
u32 layer2_priority, bool wmm_enabled, struct sk_buff *skb, u32 layer2_priority,
u8 *ac); bool wmm_enabled, u8 *ac);
int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb); int ath6kl_wmi_control_rx(struct wmi *wmi, struct sk_buff *skb);
...@@ -2204,7 +2204,8 @@ int ath6kl_wmi_scanparams_cmd(struct wmi *wmi, u8 if_idx, u16 fg_start_sec, ...@@ -2204,7 +2204,8 @@ int ath6kl_wmi_scanparams_cmd(struct wmi *wmi, u8 if_idx, u16 fg_start_sec,
u16 pas_chdw_msec, u8 short_scan_ratio, u16 pas_chdw_msec, u8 short_scan_ratio,
u8 scan_ctrl_flag, u32 max_dfsch_act_time, u8 scan_ctrl_flag, u32 max_dfsch_act_time,
u16 maxact_scan_per_ssid); u16 maxact_scan_per_ssid);
int ath6kl_wmi_bssfilter_cmd(struct wmi *wmi, u8 filter, u32 ie_mask); int ath6kl_wmi_bssfilter_cmd(struct wmi *wmi, u8 if_idx, u8 filter,
u32 ie_mask);
int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag, int ath6kl_wmi_probedssid_cmd(struct wmi *wmi, u8 if_idx, u8 index, u8 flag,
u8 ssid_len, u8 *ssid); u8 ssid_len, u8 *ssid);
int ath6kl_wmi_listeninterval_cmd(struct wmi *wmi, u8 if_idx, int ath6kl_wmi_listeninterval_cmd(struct wmi *wmi, u8 if_idx,
...@@ -2216,9 +2217,10 @@ int ath6kl_wmi_pmparams_cmd(struct wmi *wmi, u16 idle_period, ...@@ -2216,9 +2217,10 @@ int ath6kl_wmi_pmparams_cmd(struct wmi *wmi, u16 idle_period,
u16 tx_wakup_policy, u16 num_tx_to_wakeup, u16 tx_wakup_policy, u16 num_tx_to_wakeup,
u16 ps_fail_event_policy); u16 ps_fail_event_policy);
int ath6kl_wmi_disctimeout_cmd(struct wmi *wmi, u8 timeout); int ath6kl_wmi_disctimeout_cmd(struct wmi *wmi, u8 timeout);
int ath6kl_wmi_create_pstream_cmd(struct wmi *wmi, int ath6kl_wmi_create_pstream_cmd(struct wmi *wmi, u8 if_idx,
struct wmi_create_pstream_cmd *pstream); struct wmi_create_pstream_cmd *pstream);
int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 traffic_class, u8 tsid); int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class,
u8 tsid);
int ath6kl_wmi_set_rts_cmd(struct wmi *wmi, u16 threshold); int ath6kl_wmi_set_rts_cmd(struct wmi *wmi, u16 threshold);
int ath6kl_wmi_set_lpreamble_cmd(struct wmi *wmi, u8 status, int ath6kl_wmi_set_lpreamble_cmd(struct wmi *wmi, u8 status,
...@@ -2234,7 +2236,7 @@ int ath6kl_wmi_addkey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index, ...@@ -2234,7 +2236,7 @@ int ath6kl_wmi_addkey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index,
u8 *key_rsc, u8 *key_material, u8 *key_rsc, u8 *key_material,
u8 key_op_ctrl, u8 *mac_addr, u8 key_op_ctrl, u8 *mac_addr,
enum wmi_sync_flag sync_flag); enum wmi_sync_flag sync_flag);
int ath6kl_wmi_add_krk_cmd(struct wmi *wmi, u8 *krk); int ath6kl_wmi_add_krk_cmd(struct wmi *wmi, u8 if_idx, u8 *krk);
int ath6kl_wmi_deletekey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index); int ath6kl_wmi_deletekey_cmd(struct wmi *wmi, u8 if_idx, u8 key_index);
int ath6kl_wmi_setpmkid_cmd(struct wmi *wmi, u8 if_idx, const u8 *bssid, int ath6kl_wmi_setpmkid_cmd(struct wmi *wmi, u8 if_idx, const u8 *bssid,
const u8 *pmkid, bool set); const u8 *pmkid, bool set);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册