|
@@ -475,7 +475,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv)
|
|
|
if (!test_and_set_bit(i, &priv->ucode_key_table))
|
|
|
return i;
|
|
|
|
|
|
- return -1;
|
|
|
+ return WEP_INVALID_OFFSET;
|
|
|
}
|
|
|
|
|
|
int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty)
|
|
@@ -620,6 +620,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv,
|
|
|
/* else, we are overriding an existing key => no need to allocated room
|
|
|
* in uCode. */
|
|
|
|
|
|
+ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
|
|
+ "no space for new kew");
|
|
|
+
|
|
|
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
@@ -637,6 +640,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
__le16 key_flags = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK);
|
|
|
key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
|
|
@@ -664,14 +668,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
|
|
|
/* else, we are overriding an existing key => no need to allocated room
|
|
|
* in uCode. */
|
|
|
|
|
|
+ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
|
|
+ "no space for new kew");
|
|
|
+
|
|
|
priv->stations[sta_id].sta.key.key_flags = key_flags;
|
|
|
priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
|
|
priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
|
|
|
|
|
|
+ ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
|
|
|
+
|
|
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
|
|
|
|
- IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n");
|
|
|
- return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
|
|
@@ -696,6 +704,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
|
|
|
/* else, we are overriding an existing key => no need to allocated room
|
|
|
* in uCode. */
|
|
|
|
|
|
+ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
|
|
|
+ "no space for new kew");
|
|
|
+
|
|
|
/* This copy is acutally not needed: we get the key with each TX */
|
|
|
memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16);
|
|
|
|
|
@@ -734,6 +745,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) {
|
|
|
+ IWL_WARNING("Removing wrong key %d 0x%x\n",
|
|
|
+ keyconf->keyidx, key_flags);
|
|
|
+ spin_unlock_irqrestore(&priv->sta_lock, flags);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset,
|
|
|
&priv->ucode_key_table))
|
|
|
IWL_ERROR("index %d not used in uCode key table.\n",
|