]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
mt76: connac: fix GTK rekey offload failure on WPA mixed mode
authorLeon Yen <Leon.Yen@mediatek.com>
Tue, 27 Jul 2021 22:59:16 +0000 (06:59 +0800)
committerAndrea Righi <andrea.righi@canonical.com>
Tue, 4 Jan 2022 08:48:24 +0000 (09:48 +0100)
BugLink: https://bugs.launchpad.net/bugs/1951822
[ Upstream commit 781f62960c635cfed55a8f8c0f909bdaf8268257 ]

Update the proper firmware programming sequence to fix GTK rekey
offload failure on WPA mixed mode.

In the mt76_connac_mcu_key_iter,
gtk_tlv->proto should be only set up on pairwise key
and gtk_tlk->group_cipher should be only set up on the group key.

Otherwise, those parameters required by firmware would be set
incorrectly to cause GTK rekey offload failure on WPA mixed mode
and then disconnection follows.

Fixes: b47e21e75c80 ("mt76: mt7615: add gtk rekey offload support")
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Leon Yen <Leon.Yen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c

index 5c3a81e5f559dda906096857e112116c623717f5..f57f047fce99c1b3f37ba53ed6d477cd99ead0b6 100644 (file)
@@ -1929,19 +1929,22 @@ mt76_connac_mcu_key_iter(struct ieee80211_hw *hw,
            key->cipher != WLAN_CIPHER_SUITE_TKIP)
                return;
 
-       if (key->cipher == WLAN_CIPHER_SUITE_TKIP) {
-               gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
+       if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
                cipher = BIT(3);
-       } else {
-               gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
+       else
                cipher = BIT(4);
-       }
 
        /* we are assuming here to have a single pairwise key */
        if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
+               if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
+                       gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_1);
+               else
+                       gtk_tlv->proto = cpu_to_le32(NL80211_WPA_VERSION_2);
+
                gtk_tlv->pairwise_cipher = cpu_to_le32(cipher);
-               gtk_tlv->group_cipher = cpu_to_le32(cipher);
                gtk_tlv->keyid = key->keyidx;
+       } else {
+               gtk_tlv->group_cipher = cpu_to_le32(cipher);
        }
 }