Преглед изворни кода

qcacmn: Adding SW workaround for raw mode AMSDU packets

Due to HW limitation, WEP bit is expected to be set in AMSDU packets
transmitted in raw mode.

Set WEP bit if the QOS frame is AMSDU during the tx processing of the
raw mode packet.

Change-Id: Ibaa7d95f6ebcf9016e3c02355b5f0ce909eb9a93
CRs-Fixed: 2042666
Sathish Kumar пре 8 година
родитељ
комит
e7e784d1b4
1 измењених фајлова са 8 додато и 1 уклоњено
  1. 8 1
      dp/wifi3.0/dp_tx.c

+ 8 - 1
dp/wifi3.0/dp_tx.c

@@ -591,9 +591,16 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	int32_t i;
 
 	struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info;
+	qdf_dot3_qosframe_t *qos_wh = (qdf_dot3_qosframe_t *) nbuf->data;
 
 	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)) {
+		qos_wh->i_fc[1] |= IEEE80211_FC1_WEP;
+	}
+
 	if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, nbuf,
 				QDF_DMA_TO_DEVICE)) {
 		qdf_print("dma map error\n");
@@ -603,7 +610,7 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	}
 
 	for (curr_nbuf = nbuf, i = 0; curr_nbuf;
-				curr_nbuf = qdf_nbuf_next(nbuf), i++) {
+				curr_nbuf = qdf_nbuf_next(curr_nbuf), i++) {
 		seg_info->frags[i].paddr_lo =
 			qdf_nbuf_get_frag_paddr(curr_nbuf, 0);
 		seg_info->frags[i].paddr_hi = 0x0;