ath10k: update GCMP & GCMP-256 cipher suite number for WCN3990
authorAbhishek Ambure <aambure@codeaurora.org>
Fri, 8 Feb 2019 12:55:26 +0000 (14:55 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 11 Feb 2019 16:26:04 +0000 (18:26 +0200)
TLV based firmware ex. QCA6174, WCN3990 expects key cipher value
set to 9 while non-TLV firmware expects key cipher value set to 8
for enabling GCMP and GCMP-256 cipher suites.

To fix this problem, attach the key cipher suite values based on
wmi version.

Tested HW: WCN3990
Tested FW: WLAN.HL.2.0-01188-QCAHLSWMTPLZ-1

Signed-off-by: Abhishek Ambure <aambure@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi-tlv.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 46e9c8c97a4d01837401e9962646fbbf085ef13b..f2278d0c3efad8f1b7e30556bf30248fb9d627c1 100644 (file)
@@ -1182,6 +1182,7 @@ struct ath10k {
 
        u32 ampdu_reference;
 
+       const u8 *wmi_key_cipher;
        void *ce_priv;
 
        u32 sta_tid_stats_mask;
index 4dd64f31088519dc710e07cf6393b6b153c054e5..6c66a3435d5712178af0fbf3bc5de23f500eaedb 100644 (file)
@@ -250,24 +250,24 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
 
        switch (key->cipher) {
        case WLAN_CIPHER_SUITE_CCMP:
-               arg.key_cipher = WMI_CIPHER_AES_CCM;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
                break;
        case WLAN_CIPHER_SUITE_TKIP:
-               arg.key_cipher = WMI_CIPHER_TKIP;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP];
                arg.key_txmic_len = 8;
                arg.key_rxmic_len = 8;
                break;
        case WLAN_CIPHER_SUITE_WEP40:
        case WLAN_CIPHER_SUITE_WEP104:
-               arg.key_cipher = WMI_CIPHER_WEP;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP];
                break;
        case WLAN_CIPHER_SUITE_CCMP_256:
-               arg.key_cipher = WMI_CIPHER_AES_CCM;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
                break;
        case WLAN_CIPHER_SUITE_GCMP:
        case WLAN_CIPHER_SUITE_GCMP_256:
-               arg.key_cipher = WMI_CIPHER_AES_GCM;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
                break;
        case WLAN_CIPHER_SUITE_BIP_GMAC_128:
        case WLAN_CIPHER_SUITE_BIP_GMAC_256:
@@ -284,7 +284,7 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
 
        if (cmd == DISABLE_KEY) {
-               arg.key_cipher = WMI_CIPHER_NONE;
+               arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE];
                arg.key_data = NULL;
        }
 
index 90617e1a074c2c917ebe392a5de4e3d1f7c46e3d..7621dfe8a61cfe31a9eabe64693173032f4024a6 100644 (file)
@@ -2060,9 +2060,11 @@ ath10k_wmi_tlv_op_gen_vdev_install_key(struct ath10k *ar,
        size_t len;
        void *ptr;
 
-       if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
+       if (arg->key_cipher == ar->wmi_key_cipher[WMI_CIPHER_NONE] &&
+           arg->key_data)
                return ERR_PTR(-EINVAL);
-       if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
+       if (arg->key_cipher != ar->wmi_key_cipher[WMI_CIPHER_NONE] &&
+           !arg->key_data)
                return ERR_PTR(-EINVAL);
 
        len = sizeof(*tlv) + sizeof(*cmd) +
index b99b3a19eda5dcd6c54635db5e890be3fb0a8aba..903aa8cffc43f0e4bb26010a6b6033a3207eb879 100644 (file)
@@ -1606,6 +1606,30 @@ static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
        .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
 };
 
+static const u8 wmi_key_cipher_suites[] = {
+       [WMI_CIPHER_NONE] = WMI_CIPHER_NONE,
+       [WMI_CIPHER_WEP] = WMI_CIPHER_WEP,
+       [WMI_CIPHER_TKIP] = WMI_CIPHER_TKIP,
+       [WMI_CIPHER_AES_OCB] = WMI_CIPHER_AES_OCB,
+       [WMI_CIPHER_AES_CCM] = WMI_CIPHER_AES_CCM,
+       [WMI_CIPHER_WAPI] = WMI_CIPHER_WAPI,
+       [WMI_CIPHER_CKIP] = WMI_CIPHER_CKIP,
+       [WMI_CIPHER_AES_CMAC] = WMI_CIPHER_AES_CMAC,
+       [WMI_CIPHER_AES_GCM] = WMI_CIPHER_AES_GCM,
+};
+
+static const u8 wmi_tlv_key_cipher_suites[] = {
+       [WMI_CIPHER_NONE] = WMI_TLV_CIPHER_NONE,
+       [WMI_CIPHER_WEP] = WMI_TLV_CIPHER_WEP,
+       [WMI_CIPHER_TKIP] = WMI_TLV_CIPHER_TKIP,
+       [WMI_CIPHER_AES_OCB] = WMI_TLV_CIPHER_AES_OCB,
+       [WMI_CIPHER_AES_CCM] = WMI_TLV_CIPHER_AES_CCM,
+       [WMI_CIPHER_WAPI] = WMI_TLV_CIPHER_WAPI,
+       [WMI_CIPHER_CKIP] = WMI_TLV_CIPHER_CKIP,
+       [WMI_CIPHER_AES_CMAC] = WMI_TLV_CIPHER_AES_CMAC,
+       [WMI_CIPHER_AES_GCM] = WMI_TLV_CIPHER_AES_GCM,
+};
+
 static const struct wmi_peer_flags_map wmi_peer_flags_map = {
        .auth = WMI_PEER_AUTH,
        .qos = WMI_PEER_QOS,
@@ -9252,6 +9276,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
+               ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_10_2_4:
                ar->wmi.cmd = &wmi_10_2_4_cmd_map;
@@ -9259,6 +9284,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
+               ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_10_2:
                ar->wmi.cmd = &wmi_10_2_cmd_map;
@@ -9266,6 +9292,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
                ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
+               ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_10_1:
                ar->wmi.cmd = &wmi_10x_cmd_map;
@@ -9273,6 +9300,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
                ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
                ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
+               ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_MAIN:
                ar->wmi.cmd = &wmi_cmd_map;
@@ -9280,9 +9308,11 @@ int ath10k_wmi_attach(struct ath10k *ar)
                ar->wmi.vdev_param = &wmi_vdev_param_map;
                ar->wmi.pdev_param = &wmi_pdev_param_map;
                ar->wmi.peer_flags = &wmi_peer_flags_map;
+               ar->wmi_key_cipher = wmi_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_TLV:
                ath10k_wmi_tlv_attach(ar);
+               ar->wmi_key_cipher = wmi_tlv_key_cipher_suites;
                break;
        case ATH10K_FW_WMI_OP_VERSION_UNSET:
        case ATH10K_FW_WMI_OP_VERSION_MAX:
index 1f82f101e23da31b123fe386e2d9be5329a3caba..f849481ed65e54a1fde2ded9561334c732f70e47 100644 (file)
@@ -4931,15 +4931,30 @@ struct wmi_key_seq_counter {
        __le32 key_seq_counter_h;
 } __packed;
 
-#define WMI_CIPHER_NONE     0x0 /* clear key */
-#define WMI_CIPHER_WEP      0x1
-#define WMI_CIPHER_TKIP     0x2
-#define WMI_CIPHER_AES_OCB  0x3
-#define WMI_CIPHER_AES_CCM  0x4
-#define WMI_CIPHER_WAPI     0x5
-#define WMI_CIPHER_CKIP     0x6
-#define WMI_CIPHER_AES_CMAC 0x7
-#define WMI_CIPHER_AES_GCM  0x8
+enum wmi_cipher_suites {
+       WMI_CIPHER_NONE,
+       WMI_CIPHER_WEP,
+       WMI_CIPHER_TKIP,
+       WMI_CIPHER_AES_OCB,
+       WMI_CIPHER_AES_CCM,
+       WMI_CIPHER_WAPI,
+       WMI_CIPHER_CKIP,
+       WMI_CIPHER_AES_CMAC,
+       WMI_CIPHER_AES_GCM,
+};
+
+enum wmi_tlv_cipher_suites {
+       WMI_TLV_CIPHER_NONE,
+       WMI_TLV_CIPHER_WEP,
+       WMI_TLV_CIPHER_TKIP,
+       WMI_TLV_CIPHER_AES_OCB,
+       WMI_TLV_CIPHER_AES_CCM,
+       WMI_TLV_CIPHER_WAPI,
+       WMI_TLV_CIPHER_CKIP,
+       WMI_TLV_CIPHER_AES_CMAC,
+       WMI_TLV_CIPHER_ANY,
+       WMI_TLV_CIPHER_AES_GCM,
+};
 
 struct wmi_vdev_install_key_cmd {
        __le32 vdev_id;