forked from Minki/linux
ath10k: add new cipher suite support
QCA99x0 and QCA4019 family chips support CCMP-256, GCMP-128, and GCMP-256 ciphers in hardware, so advertise support for these. As firmware does not support group management frame ciphers (BIP), handle them in software (mac80211). Reviewed-by: Sebastian Gottschall <s.gottschall@dd-wrt.com> Cc: Jouni Malinen <jouni@qca.qualcomm.com> Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
36d9cdb6fb
commit
2ea9f12cef
@ -74,6 +74,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA9887_HW_1_0_VERSION,
|
||||
@ -97,6 +98,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -119,6 +121,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -141,6 +144,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_0_VERSION,
|
||||
@ -163,6 +167,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_2_VERSION,
|
||||
@ -188,6 +193,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA99X0_HW_2_0_DEV_VERSION,
|
||||
@ -216,6 +222,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 4,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9984_HW_1_0_DEV_VERSION,
|
||||
@ -249,6 +256,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
*/
|
||||
.vht160_mcs_rx_highest = 1560,
|
||||
.vht160_mcs_tx_highest = 1560,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9888_HW_2_0_DEV_VERSION,
|
||||
@ -281,6 +289,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
*/
|
||||
.vht160_mcs_rx_highest = 780,
|
||||
.vht160_mcs_tx_highest = 780,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_0_DEV_VERSION,
|
||||
@ -303,6 +312,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
||||
@ -327,6 +337,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA4019_HW_1_0_DEV_VERSION,
|
||||
@ -356,6 +367,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 4,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -550,6 +550,9 @@ struct ath10k_hw_params {
|
||||
*/
|
||||
int vht160_mcs_rx_highest;
|
||||
int vht160_mcs_tx_highest;
|
||||
|
||||
/* Number of ciphers supported (i.e First N) in cipher_suites array */
|
||||
int n_cipher_suites;
|
||||
};
|
||||
|
||||
struct htt_rx_desc;
|
||||
|
@ -242,6 +242,16 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
arg.key_cipher = WMI_CIPHER_WEP;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
arg.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;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
@ -5723,7 +5733,10 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
u32 flags2;
|
||||
|
||||
/* this one needs to be done in software */
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
||||
return 1;
|
||||
|
||||
if (arvif->nohwcrypt)
|
||||
@ -8074,7 +8087,22 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
WLAN_CIPHER_SUITE_WEP104,
|
||||
WLAN_CIPHER_SUITE_TKIP,
|
||||
WLAN_CIPHER_SUITE_CCMP,
|
||||
|
||||
/* Do not add hardware supported ciphers before this line.
|
||||
* Allow software encryption for all chips. Don't forget to
|
||||
* update n_cipher_suites below.
|
||||
*/
|
||||
WLAN_CIPHER_SUITE_AES_CMAC,
|
||||
WLAN_CIPHER_SUITE_BIP_CMAC_256,
|
||||
WLAN_CIPHER_SUITE_BIP_GMAC_128,
|
||||
WLAN_CIPHER_SUITE_BIP_GMAC_256,
|
||||
|
||||
/* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
|
||||
* and CCMP-256 in hardware.
|
||||
*/
|
||||
WLAN_CIPHER_SUITE_GCMP,
|
||||
WLAN_CIPHER_SUITE_GCMP_256,
|
||||
WLAN_CIPHER_SUITE_CCMP_256,
|
||||
};
|
||||
struct ieee80211_supported_band *band;
|
||||
void *channels;
|
||||
@ -8318,7 +8346,18 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
}
|
||||
|
||||
ar->hw->wiphy->cipher_suites = cipher_suites;
|
||||
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
|
||||
/* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
|
||||
* and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
|
||||
* from chip specific hw_param table.
|
||||
*/
|
||||
if (!ar->hw_params.n_cipher_suites ||
|
||||
ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
|
||||
ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
|
||||
ar->hw_params.n_cipher_suites);
|
||||
ar->hw_params.n_cipher_suites = 8;
|
||||
}
|
||||
ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
|
||||
|
||||
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
|
@ -4751,6 +4751,7 @@ struct wmi_key_seq_counter {
|
||||
#define WMI_CIPHER_WAPI 0x5
|
||||
#define WMI_CIPHER_CKIP 0x6
|
||||
#define WMI_CIPHER_AES_CMAC 0x7
|
||||
#define WMI_CIPHER_AES_GCM 0x8
|
||||
|
||||
struct wmi_vdev_install_key_cmd {
|
||||
__le32 vdev_id;
|
||||
|
Loading…
Reference in New Issue
Block a user