int vnt_set_keys(struct ieee80211_hw *hw, struct ieee80211_sta *sta, struct ieee80211_vif *vif, struct ieee80211_key_conf *key) { struct ieee80211_bss_conf *conf = &vif->bss_conf; struct vnt_private *priv = hw->priv; u8 *mac_addr = NULL; u8 key_dec_mode = 0; int ret = 0, u; if (sta) mac_addr = &sta->addr[0]; switch (key->cipher) { case 0: for (u = 0 ; u < MAX_KEY_TABLE; u++) vnt_mac_disable_keyentry(priv, u); return ret; case WLAN_CIPHER_SUITE_WEP40: case WLAN_CIPHER_SUITE_WEP104: for (u = 0; u < MAX_KEY_TABLE; u++) vnt_mac_disable_keyentry(priv, u); vnt_set_keymode(hw, mac_addr, key, VNT_KEY_DEFAULTKEY, KEY_CTL_WEP, true); key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; return ret; case WLAN_CIPHER_SUITE_TKIP: key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; key_dec_mode = KEY_CTL_TKIP; break; case WLAN_CIPHER_SUITE_CCMP: if (priv->local_id <= MAC_REVISION_A1) return -EINVAL; key_dec_mode = KEY_CTL_CCMP; key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; } if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { vnt_set_keymode(hw, mac_addr, key, VNT_KEY_PAIRWISE, key_dec_mode, true); } else { vnt_set_keymode(hw, mac_addr, key, VNT_KEY_DEFAULTKEY, key_dec_mode, true); vnt_set_keymode(hw, (u8 *)conf->bssid, key, VNT_KEY_GROUP_ADDRESS, key_dec_mode, true); } return 0; }
static void vnt_stop(struct ieee80211_hw *hw) { struct vnt_private *priv = hw->priv; int i; if (!priv) return; for (i = 0; i < MAX_KEY_TABLE; i++) vnt_mac_disable_keyentry(priv, i); /* clear all keys */ priv->key_entry_inuse = 0; if (!test_bit(DEVICE_FLAGS_UNPLUG, &priv->flags)) vnt_mac_shutdown(priv); ieee80211_stop_queues(hw); set_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags); cancel_delayed_work_sync(&priv->run_command_work); priv->cmd_running = false; vnt_free_tx_bufs(priv); vnt_free_rx_bufs(priv); vnt_free_int_bufs(priv); usb_kill_urb(priv->interrupt_urb); usb_free_urb(priv->interrupt_urb); }