ソースを参照

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
ruchi agrawal 7 年 前
コミット
45f3ac45c9
4 ファイル変更27 行追加3 行削除
  1. 2 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 4 0
      dp/wifi3.0/dp_main.c
  3. 19 3
      dp/wifi3.0/dp_tx.c
  4. 2 0
      dp/wifi3.0/dp_types.h

+ 2 - 0
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

+ 4 - 0
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;
 	}

+ 19 - 3
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",

+ 2 - 0
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;
+
 };