@@ -1446,7 +1446,7 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw,
switch (cmd) {
case SET_KEY:
- ret = ath_key_config(common, vif, sta, key);
+ ret = ath_key_config(common, vif, sta, key, true);
if (ret >= 0) {
key->hw_key_idx = ret;
/* push IV and Michael MIC generation to stack */
@@ -929,6 +929,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
+ ieee80211_hw_set(hw, EXT_KEY_ID_COMPAT);
if (ath9k_ps_enable)
ieee80211_hw_set(hw, SUPPORTS_PS);
@@ -1518,7 +1518,7 @@ static int ath9k_sta_add(struct ieee80211_hw *hw,
vif->type != NL80211_IFTYPE_AP_VLAN)
return 0;
- key = ath_key_config(common, vif, sta, &ps_key);
+ key = ath_key_config(common, vif, sta, &ps_key, true);
if (key > 0) {
an->ps_key = key;
an->key_idx[0] = key;
@@ -1675,9 +1675,13 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_node *an = NULL;
int ret = 0, i;
+ bool rx_accel = true;
- if (ath9k_modparam_nohwcrypt)
+ if (ath9k_modparam_nohwcrypt) {
+ if (cmd == EXT_DISABLE_KEY_RX || cmd == EXT_KEY_RX_TX)
+ return 0;
return -ENOSPC;
+ }
if ((vif->type == NL80211_IFTYPE_ADHOC ||
vif->type == NL80211_IFTYPE_MESH_POINT) &&
@@ -1701,12 +1705,15 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
an = (struct ath_node *)sta->drv_priv;
switch (cmd) {
+ case EXT_SET_KEY:
+ rx_accel = false;
+ /* Fall trough */
case SET_KEY:
if (sta)
ath9k_del_ps_key(sc, vif, sta);
key->hw_key_idx = 0;
- ret = ath_key_config(common, vif, sta, key);
+ ret = ath_key_config(common, vif, sta, key, rx_accel);
if (ret >= 0) {
key->hw_key_idx = ret;
/* push IV and Michael MIC generation to stack */
@@ -1740,6 +1747,13 @@ static int ath9k_set_key(struct ieee80211_hw *hw,
}
key->hw_key_idx = 0;
break;
+ case EXT_DISABLE_KEY_RX:
+ rx_accel = false;
+ /* fall trough */
+ case EXT_KEY_RX_TX:
+ if (ath_hw_rx_crypt(common, key, sta, rx_accel))
+ ret = 0;
+ break;
default:
ret = -EINVAL;
}
Implements %EXT_SET_KEY, %EXT_KEY_RX_TX and %EXT_DISABLE_KEY_RX and enables EXT_KEY_ID_COMPAT. Signed-off-by: Alexander Wetzel <alexander@wetzel-home.de> --- Like the generic ath patch to provide Extended Key ID support just the minimum needed to get it working in AP mode and serve as an reference how Compatibility Extended Key ID support looks like from a driver perspective. drivers/net/wireless/ath/ath9k/htc_drv_main.c | 2 +- drivers/net/wireless/ath/ath9k/init.c | 1 + drivers/net/wireless/ath/ath9k/main.c | 20 ++++++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-)