+++ /dev/null
-From 6645d5e441db9121793421d477255f4242b3dbf3 Mon Sep 17 00:00:00 2001
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Tue, 15 Sep 2015 09:58:53 +0200
-Subject: iwlwifi: mvm: fix D3 CCMP TX PN assignment
-
-From: Johannes Berg <johannes.berg@intel.com>
-
-commit 6645d5e441db9121793421d477255f4242b3dbf3 upstream.
-
-When going into/coming out of D3, the TX PN must be programmed into
-and restored from the firmware respectively. The restore was broken
-due to my previous commit to move PN assignment into the driver.
-Sending the PN to the firmware still worked since we now use the
-counter that's shared with mac80211, but accessing it through the
-mac80211 API makes no sense now.
-
-Fix this by reading/writing the counter directly. This actually
-simplifies the code since we don't need to round-trip through the
-key_seq structure.
-
-Fixes: ca8c0f4bede6 ("iwlwifi: mvm: move TX PN assignment for CCMP to the driver")
-Reported-by: Luca Coelho <luciano.coelho@intel.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/net/wireless/iwlwifi/mvm/d3.c | 15 +++++----------
- 1 file changed, 5 insertions(+), 10 deletions(-)
-
---- a/drivers/net/wireless/iwlwifi/mvm/d3.c
-+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
-@@ -274,18 +274,13 @@ static void iwl_mvm_wowlan_program_keys(
- break;
- case WLAN_CIPHER_SUITE_CCMP:
- if (sta) {
-- u8 *pn = seq.ccmp.pn;
-+ u64 pn64;
-
- aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc;
- aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc;
-
-- ieee80211_get_key_tx_seq(key, &seq);
-- aes_tx_sc->pn = cpu_to_le64((u64)pn[5] |
-- ((u64)pn[4] << 8) |
-- ((u64)pn[3] << 16) |
-- ((u64)pn[2] << 24) |
-- ((u64)pn[1] << 32) |
-- ((u64)pn[0] << 40));
-+ pn64 = atomic64_read(&key->tx_pn);
-+ aes_tx_sc->pn = cpu_to_le64(pn64);
- } else {
- aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc;
- }
-@@ -1444,15 +1439,15 @@ static void iwl_mvm_d3_update_gtks(struc
-
- switch (key->cipher) {
- case WLAN_CIPHER_SUITE_CCMP:
-- iwl_mvm_aes_sc_to_seq(&sc->aes.tsc, &seq);
- iwl_mvm_set_aes_rx_seq(sc->aes.unicast_rsc, key);
-+ atomic64_set(&key->tx_pn, le64_to_cpu(sc->aes.tsc.pn));
- break;
- case WLAN_CIPHER_SUITE_TKIP:
- iwl_mvm_tkip_sc_to_seq(&sc->tkip.tsc, &seq);
- iwl_mvm_set_tkip_rx_seq(sc->tkip.unicast_rsc, key);
-+ ieee80211_set_key_tx_seq(key, &seq);
- break;
- }
-- ieee80211_set_key_tx_seq(key, &seq);
-
- /* that's it for this key */
- return;