Quellcode durchsuchen

qcacld-3.0: Fix data rate for beacon frames

Currently, in monitor mode, beacon frames are showing an incorrect phy
rate (0). This is because the values in the RX descriptor for
interpreting the legacy rates have changed in ihelium.

Make changes in host to interpret the new values into data rates correctly.

Change-Id: Ibf845666943fd718b657c0128758dabfb64a38ef
CRs-Fixed: 2082456
Mohit Khanna vor 7 Jahren
Ursprung
Commit
31776f8b90
2 geänderte Dateien mit 154 neuen und 40 gelöschten Zeilen
  1. 153 38
      core/dp/htt/htt_rx.c
  2. 1 2
      core/dp/txrx/ol_rx.c

+ 153 - 38
core/dp/htt/htt_rx.c

@@ -1677,10 +1677,110 @@ int htt_mon_rx_handle_amsdu_packet(qdf_nbuf_t msdu, htt_pdev_handle pdev,
 	return 1;
 }
 
+#define SHORT_PREAMBLE 1
+#define LONG_PREAMBLE  0
+#ifdef HELIUMPLUS
 /**
- * htt_mon_rx_get_phy_info() - Get rate interms of 500Kbps.
- * @rx_desc: Pointer to struct htt_host_rx_desc_base
- * @rx_status: Return variable updated with phy_info in rx_status
+ * htt_rx_get_rate() - get rate info in terms of 500Kbps from htt_rx_desc
+ * @l_sig_rate_select: OFDM or CCK rate
+ * @l_sig_rate:
+ *
+ * If l_sig_rate_select is 0:
+ * 0x8: OFDM 48 Mbps
+ * 0x9: OFDM 24 Mbps
+ * 0xA: OFDM 12 Mbps
+ * 0xB: OFDM 6 Mbps
+ * 0xC: OFDM 54 Mbps
+ * 0xD: OFDM 36 Mbps
+ * 0xE: OFDM 18 Mbps
+ * 0xF: OFDM 9 Mbps
+ * If l_sig_rate_select is 1:
+ * 0x1:  DSSS 1 Mbps long preamble
+ * 0x2:  DSSS 2 Mbps long preamble
+ * 0x3:  CCK 5.5 Mbps long preamble
+ * 0x4:  CCK 11 Mbps long preamble
+ * 0x5:  DSSS 2 Mbps short preamble
+ * 0x6:  CCK 5.5 Mbps
+ * 0x7:  CCK 11 Mbps short  preamble
+ *
+ * Return: rate interms of 500Kbps.
+ */
+static unsigned char htt_rx_get_rate(uint32_t l_sig_rate_select,
+					uint32_t l_sig_rate, uint8_t *preamble)
+{
+	char ret = 0x0;
+	*preamble = LONG_PREAMBLE;
+	if (l_sig_rate_select == 0) {
+		switch (l_sig_rate) {
+		case 0x8:
+			ret = 0x60;
+			break;
+		case 0x9:
+			ret = 0x30;
+			break;
+		case 0xA:
+			ret = 0x18;
+			break;
+		case 0xB:
+			ret = 0x0c;
+			break;
+		case 0xC:
+			ret = 0x6c;
+			break;
+		case 0xD:
+			ret = 0x48;
+			break;
+		case 0xE:
+			ret = 0x24;
+			break;
+		case 0xF:
+			ret = 0x12;
+			break;
+		default:
+			break;
+		}
+	} else if (l_sig_rate_select == 1) {
+		switch (l_sig_rate) {
+		case 0x1:
+			ret = 0x2;
+			*preamble = LONG_PREAMBLE;
+			break;
+		case 0x2:
+			ret = 0x4;
+			*preamble = LONG_PREAMBLE;
+			break;
+		case 0x3:
+			ret = 0xB;
+			*preamble = LONG_PREAMBLE;
+			break;
+		case 0x4:
+			ret = 0x16;
+			*preamble = LONG_PREAMBLE;
+			break;
+		case 0x5:
+			ret = 0x4;
+			*preamble = SHORT_PREAMBLE;
+			break;
+		case 0x6:
+			ret = 0xB;
+			break;
+		case 0x7:
+			ret = 0x16;
+			*preamble = SHORT_PREAMBLE;
+			break;
+		default:
+			break;
+		}
+	} else {
+		qdf_print("Invalid rate info\n");
+	}
+	return ret;
+}
+#else
+/**
+ * htt_rx_get_rate() - get rate info in terms of 500Kbps from htt_rx_desc
+ * @l_sig_rate_select: OFDM or CCK rate
+ * @l_sig_rate:
  *
  * If l_sig_rate_select is 0:
  * 0x8: OFDM 48 Mbps
@@ -1693,54 +1793,45 @@ int htt_mon_rx_handle_amsdu_packet(qdf_nbuf_t msdu, htt_pdev_handle pdev,
  * 0xF: OFDM 9 Mbps
  * If l_sig_rate_select is 1:
  * 0x8: CCK 11 Mbps long preamble
- * 0x9: CCK 5.5 Mbps long preamble
+ *  0x9: CCK 5.5 Mbps long preamble
  * 0xA: CCK 2 Mbps long preamble
  * 0xB: CCK 1 Mbps long preamble
  * 0xC: CCK 11 Mbps short preamble
  * 0xD: CCK 5.5 Mbps short preamble
  * 0xE: CCK 2 Mbps short preamble
  *
- * Return: None
+ * Return: rate interms of 500Kbps.
  */
-static void htt_mon_rx_get_phy_info(struct htt_host_rx_desc_base *rx_desc,
-				    struct mon_rx_status *rx_status)
+static unsigned char htt_rx_get_rate(uint32_t l_sig_rate_select,
+					uint32_t l_sig_rate, uint8_t *preamble)
 {
-#define SHORT_PREAMBLE 1
-#define LONG_PREAMBLE  0
-	char rate = 0x0;
-	uint8_t preamble = SHORT_PREAMBLE;
-	uint8_t preamble_type = rx_desc->ppdu_start.preamble_type;
-	uint8_t mcs = 0, nss = 0, sgi = 0, bw = 0, beamformed = 0;
-	uint16_t vht_flags = 0, ht_flags = 0;
-	uint32_t l_sig_rate_select = rx_desc->ppdu_start.l_sig_rate_select;
-	uint32_t l_sig_rate = rx_desc->ppdu_start.l_sig_rate;
-	bool is_stbc = 0, ldpc = 0;
-
+	char ret = 0x0;
+	*preamble = SHORT_PREAMBLE;
 	if (l_sig_rate_select == 0) {
 		switch (l_sig_rate) {
 		case 0x8:
-			rate = 0x60;
+			ret = 0x60;
 			break;
 		case 0x9:
-			rate = 0x30;
+			ret = 0x30;
 			break;
 		case 0xA:
-			rate = 0x18;
+			ret = 0x18;
 			break;
 		case 0xB:
-			rate = 0x0c;
+			ret = 0x0c;
 			break;
 		case 0xC:
-			rate = 0x6c;
+			ret = 0x6c;
 			break;
 		case 0xD:
-			rate = 0x48;
+			ret = 0x48;
 			break;
 		case 0xE:
-			rate = 0x24;
+			ret = 0x24;
 			break;
 		case 0xF:
-			rate = 0x12;
+			ret = 0x12;
 			break;
 		default:
 			break;
@@ -1748,29 +1839,29 @@ static void htt_mon_rx_get_phy_info(struct htt_host_rx_desc_base *rx_desc,
 	} else if (l_sig_rate_select == 1) {
 		switch (l_sig_rate) {
 		case 0x8:
-			rate = 0x16;
-			preamble = LONG_PREAMBLE;
+			ret = 0x16;
+			*preamble = LONG_PREAMBLE;
 			break;
 		case 0x9:
-			rate = 0x0B;
-			preamble = LONG_PREAMBLE;
+			ret = 0x0B;
+			*preamble = LONG_PREAMBLE;
 			break;
 		case 0xA:
-			rate = 0x04;
-			preamble = LONG_PREAMBLE;
+			ret = 0x4;
+			*preamble = LONG_PREAMBLE;
 			break;
 		case 0xB:
-			rate = 0x02;
-			preamble = LONG_PREAMBLE;
+			ret = 0x02;
+			*preamble = LONG_PREAMBLE;
 			break;
 		case 0xC:
-			rate = 0x16;
+			ret = 0x16;
 			break;
 		case 0xD:
-			rate = 0x0B;
+			ret = 0x0B;
 			break;
 		case 0xE:
-			rate = 0x04;
+			ret = 0x04;
 			break;
 		default:
 			break;
@@ -1778,8 +1869,33 @@ static void htt_mon_rx_get_phy_info(struct htt_host_rx_desc_base *rx_desc,
 	} else {
 		qdf_print("Invalid rate info\n");
 	}
+	return ret;
+}
+#endif /* HELIUMPLUS */
+/**
+ * htt_mon_rx_get_phy_info() - Get phy info
+ * @rx_desc: Pointer to struct htt_host_rx_desc_base
+ * @rx_status: Return variable updated with phy_info in rx_status
+ *
+ * Return: None
+ */
+static void htt_mon_rx_get_phy_info(struct htt_host_rx_desc_base *rx_desc,
+				    struct mon_rx_status *rx_status)
+{
+	uint8_t preamble = 0;
+	uint8_t preamble_type = rx_desc->ppdu_start.preamble_type;
+	uint8_t mcs = 0, nss = 0, sgi = 0, bw = 0, beamformed = 0;
+	uint16_t vht_flags = 0, ht_flags = 0;
+	uint32_t l_sig_rate_select = rx_desc->ppdu_start.l_sig_rate_select;
+	uint32_t l_sig_rate = rx_desc->ppdu_start.l_sig_rate;
+	bool is_stbc = 0, ldpc = 0;
 
 	switch (preamble_type) {
+	case 4:
+	/* legacy */
+		rx_status->rate = htt_rx_get_rate(l_sig_rate_select, l_sig_rate,
+						&preamble);
+		break;
 	case 8:
 		is_stbc = ((VHT_SIG_A_2(rx_desc) >> 4) & 3);
 		/* fallthrough */
@@ -1838,7 +1954,6 @@ static void htt_mon_rx_get_phy_info(struct htt_host_rx_desc_base *rx_desc,
 	rx_status->ldpc = ldpc;
 	rx_status->beamformed = beamformed;
 	rx_status->vht_flag_values3[0] = mcs << 0x4 | (nss + 1);
-	rx_status->rate = rate;
 	rx_status->ht_flags = ht_flags;
 	rx_status->vht_flags = vht_flags;
 	rx_status->rtap_flags |= ((preamble == SHORT_PREAMBLE) ? BIT(1) : 0);

+ 1 - 2
core/dp/txrx/ol_rx.c

@@ -1507,8 +1507,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev,
 	ol_rx_ind_record_event(filled, OL_RX_INDICATION_BUF_REPLENISH);
 
 	if (!head_msdu) {
-		ol_txrx_warn("%s: No packet to send to HDD",
-			     __func__);
+		ol_txrx_dbg("No packet to send to HDD");
 		return;
 	}