From 45f3ac45c91410543d75d72e44613861082481ea Mon Sep 17 00:00:00 2001 From: ruchi agrawal Date: Wed, 25 Oct 2017 09:03:28 +0530 Subject: [PATCH] qcacmn: WEP bit set for RAW Mode Workaround Set WEP bit for protection disabled VAP, to avoid Hardware crash Change-Id: I4121d04de9465e07aae2ba24930b1045fb8addf8 CRs-Fixed: 2132317 --- dp/inc/cdp_txrx_cmn_struct.h | 2 ++ dp/wifi3.0/dp_main.c | 4 ++++ dp/wifi3.0/dp_tx.c | 22 +++++++++++++++++++--- dp/wifi3.0/dp_types.h | 2 ++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index a5b9875867df..38553af3eada 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -549,6 +549,7 @@ enum cdp_pdev_param_type { * @CDP_ENABLE_PROXYSTA: proxy sta * @CDP_UPDATE_TDLS_FLAGS: tdls link flags * @CDP_ENABLE_AP_BRIDGE: set ap_bridging enable/disable + * @CDP_ENABLE_CIPHER : set cipher type based on security */ enum cdp_vdev_param_type { CDP_ENABLE_NAWDS, @@ -558,6 +559,7 @@ enum cdp_vdev_param_type { CDP_UPDATE_TDLS_FLAGS, CDP_CFG_WDS_AGING_TIMER, CDP_ENABLE_AP_BRIDGE, + CDP_ENABLE_CIPHER }; #define TXRX_FW_STATS_TXSTATS 1 diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 144e44101c53..f469616043dd 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -2726,6 +2726,7 @@ static struct cdp_vdev *dp_vdev_attach_wifi3(struct cdp_pdev *txrx_pdev, vdev->delete.pending = 0; vdev->safemode = 0; vdev->drop_unenc = 1; + vdev->sec_type = cdp_sec_type_none; #ifdef notyet vdev->filters_num = 0; #endif @@ -4817,6 +4818,9 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle, else vdev->ap_bridge_enabled = false; break; + case CDP_ENABLE_CIPHER: + vdev->sec_type = val; + break; default: break; } diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index cec94752ec28..839d6d1d914e 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -55,6 +55,22 @@ /* invalid peer id for reinject*/ #define DP_INVALID_PEER 0XFFFE +/*mapping between hal encrypt type and cdp_sec_type*/ +#define MAX_CDP_SEC_TYPE 12 +static const uint8_t sec_type_map[MAX_CDP_SEC_TYPE] = { + HAL_TX_ENCRYPT_TYPE_NO_CIPHER, + HAL_TX_ENCRYPT_TYPE_WEP_128, + HAL_TX_ENCRYPT_TYPE_WEP_104, + HAL_TX_ENCRYPT_TYPE_WEP_40, + HAL_TX_ENCRYPT_TYPE_TKIP_WITH_MIC, + HAL_TX_ENCRYPT_TYPE_TKIP_NO_MIC, + HAL_TX_ENCRYPT_TYPE_AES_CCMP_128, + HAL_TX_ENCRYPT_TYPE_WAPI, + HAL_TX_ENCRYPT_TYPE_AES_CCMP_256, + HAL_TX_ENCRYPT_TYPE_AES_GCMP_128, + HAL_TX_ENCRYPT_TYPE_AES_GCMP_256, + HAL_TX_ENCRYPT_TYPE_WAPI_GCM_SM4}; + /** * dp_tx_get_queue() - Returns Tx queue IDs to be used for this Tx frame * @vdev: DP Virtual device handle @@ -716,10 +732,8 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf, DP_STATS_INC_PKT(vdev, tx_i.raw.raw_pkt, 1, qdf_nbuf_len(nbuf)); /* SWAR for HW: Enable WEP bit in the AMSDU frames for RAW mode */ - if ((qos_wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) - && (qos_wh->i_qos[0] & IEEE80211_QOS_AMSDU)) { + if (qos_wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) qos_wh->i_fc[1] |= IEEE80211_FC1_WEP; - } if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, nbuf, QDF_DMA_TO_DEVICE)) { @@ -800,6 +814,8 @@ static QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev, hal_tx_desc_set_encap_type(hal_tx_desc_cached, tx_desc->tx_encap_type); hal_tx_desc_set_dscp_tid_table_id(hal_tx_desc_cached, vdev->dscp_tid_map_id); + hal_tx_desc_set_encrypt_type(hal_tx_desc_cached, + sec_type_map[vdev->sec_type]); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, "%s length:%d , type = %d, dma_addr %llx, offset %d desc id %u", diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 4e6dbf954fa7..be84e9688cf3 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1192,6 +1192,8 @@ struct dp_vdev { /* AP BRIDGE enabled */ uint32_t ap_bridge_enabled; + enum cdp_sec_type sec_type; + };