|
@@ -1732,18 +1732,37 @@ static int ath9k_sta_add(struct ieee80211_hw *hw,
|
|
|
struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct ath_softc *sc = hw->priv;
|
|
|
+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
|
|
+ struct ath_node *an = (struct ath_node *) sta->drv_priv;
|
|
|
+ struct ieee80211_key_conf ps_key = { };
|
|
|
|
|
|
ath_node_attach(sc, sta);
|
|
|
+ an->ps_key = ath_key_config(common, vif, sta, &ps_key);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void ath9k_del_ps_key(struct ath_softc *sc,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ struct ieee80211_sta *sta)
|
|
|
+{
|
|
|
+ struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
|
|
+ struct ath_node *an = (struct ath_node *) sta->drv_priv;
|
|
|
+ struct ieee80211_key_conf ps_key = { .hw_key_idx = an->ps_key };
|
|
|
+
|
|
|
+ if (!an->ps_key)
|
|
|
+ return;
|
|
|
+
|
|
|
+ ath_key_delete(common, &ps_key);
|
|
|
+}
|
|
|
+
|
|
|
static int ath9k_sta_remove(struct ieee80211_hw *hw,
|
|
|
struct ieee80211_vif *vif,
|
|
|
struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct ath_softc *sc = hw->priv;
|
|
|
|
|
|
+ ath9k_del_ps_key(sc, vif, sta);
|
|
|
ath_node_detach(sc, sta);
|
|
|
|
|
|
return 0;
|
|
@@ -1844,6 +1863,9 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
|
|
|
|
|
|
switch (cmd) {
|
|
|
case SET_KEY:
|
|
|
+ if (sta)
|
|
|
+ ath9k_del_ps_key(sc, vif, sta);
|
|
|
+
|
|
|
ret = ath_key_config(common, vif, sta, key);
|
|
|
if (ret >= 0) {
|
|
|
key->hw_key_idx = ret;
|