qcacmn: Update Peer rx/tx rate based on DATA packets

Packets sent/received at fixed rate were also considered to
update the client rates as displayed in wlanconfig command output.
An idle client transmits NULL packets at basic rate and hence
rx rate shows up the basic rate when an idle client is connected.
Consider only data packets to update rates. Do not consider
NULL packets for rate update.
CRs-Fixed: 2435447

Change-Id: Icbf9f2a656bb0d36e16d953952c529185c119f17
diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h
index 246e3f0..9a583e6 100644
--- a/dp/wifi3.0/dp_internal.h
+++ b/dp/wifi3.0/dp_internal.h
@@ -1035,6 +1035,30 @@
 
 bool dp_is_soc_reinit(struct dp_soc *soc);
 
+/*
+ * dp_is_subtype_data() - check if the frame subtype is data
+ *
+ * @frame_ctrl: Frame control field
+ *
+ * check the frame control field and verify if the packet
+ * is a data packet.
+ *
+ * Return: true or false
+ */
+static inline bool dp_is_subtype_data(uint16_t frame_ctrl)
+{
+	if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) ==
+	    QDF_IEEE80211_FC0_TYPE_DATA) &&
+	    (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+	    QDF_IEEE80211_FC0_SUBTYPE_DATA) ||
+	    ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+	    QDF_IEEE80211_FC0_SUBTYPE_QOS))) {
+		return true;
+	}
+
+	return false;
+}
+
 #ifdef WDI_EVENT_ENABLE
 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
 				uint32_t stats_type_upload_mask,
diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c
index de5de6d..eb02142 100644
--- a/dp/wifi3.0/dp_rx_mon_status.c
+++ b/dp/wifi3.0/dp_rx_mon_status.c
@@ -281,7 +281,8 @@
 	if (is_invalid_peer)
 		return;
 
-	dp_rx_rate_stats_update(peer, ppdu);
+	if (dp_is_subtype_data(ppdu->frame_ctrl))
+		dp_rx_rate_stats_update(peer, ppdu);
 
 #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
 	dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, pdev->soc,
diff --git a/qdf/inc/qdf_net_types.h b/qdf/inc/qdf_net_types.h
index fdf6162..bad9ba4 100644
--- a/qdf/inc/qdf_net_types.h
+++ b/qdf/inc/qdf_net_types.h
@@ -67,6 +67,13 @@
 #define QDF_IEEE80211_FC1_TODS          0x01
 #define QDF_IEEE80211_FC1_FROMDS        0x02
 
+#define QDF_IEEE80211_FC0_TYPE_MASK     0x0c
+#define QDF_IEEE80211_FC0_SUBTYPE_MASK  0xf0
+
+#define QDF_IEEE80211_FC0_TYPE_DATA     0x08
+#define QDF_IEEE80211_FC0_SUBTYPE_DATA  0x00
+#define QDF_IEEE80211_FC0_SUBTYPE_QOS   0x80
+
 #define QDF_NET_IS_MAC_MULTICAST(_a)   (*(_a) & 0x01)
 
 /**