aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPontus Fuchs <pontus.fuchs@gmail.com>2014-02-12 14:04:47 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-13 15:20:17 -0500
commit82cad2a0b047bf4ee3e6088944ab0199a009bcdb (patch)
tree9025576aa0f337fbd756478a18586e7a3515b6e9
parent2ba0b46175967a40773f8be15f6678307fa3f45a (diff)
wcn36xx: Track dpu signature per sta
This fixes problems seen with multiple softap clients and reconnecting softap clients. Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/wcn36xx/smd.c5
-rw-r--r--drivers/net/wireless/ath/wcn36xx/txrx.c4
-rw-r--r--drivers/net/wireless/ath/wcn36xx/wcn36xx.h1
3 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c
index c7da55c94f31..7bf0ef8a1f56 100644
--- a/drivers/net/wireless/ath/wcn36xx/smd.c
+++ b/drivers/net/wireless/ath/wcn36xx/smd.c
@@ -902,11 +902,12 @@ static int wcn36xx_smd_config_sta_rsp(struct wcn36xx *wcn,
902 902
903 sta_priv->sta_index = params->sta_index; 903 sta_priv->sta_index = params->sta_index;
904 sta_priv->dpu_desc_index = params->dpu_index; 904 sta_priv->dpu_desc_index = params->dpu_index;
905 sta_priv->ucast_dpu_sign = params->uc_ucast_sig;
905 906
906 wcn36xx_dbg(WCN36XX_DBG_HAL, 907 wcn36xx_dbg(WCN36XX_DBG_HAL,
907 "hal config sta rsp status %d sta_index %d bssid_index %d p2p %d\n", 908 "hal config sta rsp status %d sta_index %d bssid_index %d uc_ucast_sig %d p2p %d\n",
908 params->status, params->sta_index, params->bssid_index, 909 params->status, params->sta_index, params->bssid_index,
909 params->p2p); 910 params->uc_ucast_sig, params->p2p);
910 911
911 return 0; 912 return 0;
912} 913}
diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c
index 6194c42b44ee..32bb26a0db2a 100644
--- a/drivers/net/wireless/ath/wcn36xx/txrx.c
+++ b/drivers/net/wireless/ath/wcn36xx/txrx.c
@@ -131,6 +131,7 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
131 struct ieee80211_vif, 131 struct ieee80211_vif,
132 drv_priv); 132 drv_priv);
133 133
134 bd->dpu_sign = sta_priv->ucast_dpu_sign;
134 if (vif->type == NL80211_IFTYPE_STATION) { 135 if (vif->type == NL80211_IFTYPE_STATION) {
135 bd->sta_index = sta_priv->bss_sta_index; 136 bd->sta_index = sta_priv->bss_sta_index;
136 bd->dpu_desc_idx = sta_priv->bss_dpu_desc_index; 137 bd->dpu_desc_idx = sta_priv->bss_dpu_desc_index;
@@ -144,10 +145,9 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
144 __vif_priv = get_vif_by_addr(wcn, hdr->addr2); 145 __vif_priv = get_vif_by_addr(wcn, hdr->addr2);
145 bd->sta_index = __vif_priv->self_sta_index; 146 bd->sta_index = __vif_priv->self_sta_index;
146 bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index; 147 bd->dpu_desc_idx = __vif_priv->self_dpu_desc_index;
148 bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
147 } 149 }
148 150
149 bd->dpu_sign = __vif_priv->self_ucast_dpu_sign;
150
151 if (ieee80211_is_nullfunc(hdr->frame_control) || 151 if (ieee80211_is_nullfunc(hdr->frame_control) ||
152 (sta_priv && !sta_priv->is_data_encrypted)) 152 (sta_priv && !sta_priv->is_data_encrypted))
153 bd->dpu_ne = 1; 153 bd->dpu_ne = 1;
diff --git a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
index 644710556a97..f0fb81dfd17b 100644
--- a/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
+++ b/drivers/net/wireless/ath/wcn36xx/wcn36xx.h
@@ -159,6 +159,7 @@ struct wcn36xx_sta {
159 u16 tid; 159 u16 tid;
160 u8 sta_index; 160 u8 sta_index;
161 u8 dpu_desc_index; 161 u8 dpu_desc_index;
162 u8 ucast_dpu_sign;
162 u8 bss_sta_index; 163 u8 bss_sta_index;
163 u8 bss_dpu_desc_index; 164 u8 bss_dpu_desc_index;
164 bool is_data_encrypted; 165 bool is_data_encrypted;