Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88eb6b42 authored by Abhishek Ambure's avatar Abhishek Ambure Committed by Balaji Pothunoori
Browse files

UPSTREAM: ath10k: update GCMP & GCMP-256 cipher suite number for WCN3990



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: default avatarAbhishek Ambure <aambure@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Change-Id: Iea5367f7664399c178b5749f7f9f46d7730ee784
Git-commit: 7d94f862d6482e1159ccca669cbf21c724d159e1
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


[bpothuno@codeaurora.org: fix trivial merge conflicts]
Signed-off-by: default avatarBalaji Pothunoori <bpothuno@codeaurora.org>
parent 7167f9e3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1037,6 +1037,7 @@ struct ath10k {

	u32 ampdu_reference;

	const u8 *wmi_key_cipher;
	void *ce_priv;

	/* must be last */
+6 −6
Original line number Diff line number Diff line
@@ -231,24 +231,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:
@@ -265,7 +265,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;
	}

+4 −2
Original line number Diff line number Diff line
@@ -1954,9 +1954,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) +
+30 −0
Original line number Diff line number Diff line
@@ -1588,6 +1588,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,
@@ -8421,6 +8445,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;
@@ -8428,6 +8453,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;
@@ -8435,6 +8461,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;
@@ -8442,6 +8469,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;
@@ -8449,9 +8477,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:
+24 −9
Original line number Diff line number Diff line
@@ -4765,15 +4765,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;