WiFi-HAL: Decode short gi parameter for Rx packets

Decode short gi value from Rx stats and correct rate calculation
based on short gi value.

Change-Id: I5db98d3363298820095ee3d0bcd809745b935a4f
diff --git a/qcwcn/wifi_hal/pkt_stats.h b/qcwcn/wifi_hal/pkt_stats.h
index 5c55328..283c9ac 100644
--- a/qcwcn/wifi_hal/pkt_stats.h
+++ b/qcwcn/wifi_hal/pkt_stats.h
@@ -288,7 +288,9 @@
         u16 rate                            :  4;
         u16 nss                             :  2;
         u16 preamble                        :  2;
-        u16 bw                              :  8;
+        u16 bw                              :  2;
+        u16 short_gi                        :  1;
+        u16 reserved                        :  5;
     } mcs_s;
     u16 mcs;
 } MCS;
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp
index 4cde001..f7b302c 100644
--- a/qcwcn/wifi_hal/wifilogger_diag.cpp
+++ b/qcwcn/wifi_hal/wifilogger_diag.cpp
@@ -1029,7 +1029,7 @@
     return WIFI_SUCCESS;
 }
 
-static u16 get_rate(u16 mcs_r, u8 short_gi)
+static u16 get_rate(u16 mcs_r)
 {
     u16 tx_rate = 0;
     MCS mcs;
@@ -1075,10 +1075,10 @@
                 if(mcs.mcs_s.rate<8) {
                     if (!mcs.mcs_s.nss)
                         tx_rate = MCS_rate_lookup_ht[mcs.mcs_s.rate]
-                                                      [2*mcs.mcs_s.bw+short_gi];
+                                        [2*mcs.mcs_s.bw+mcs.mcs_s.short_gi];
                     else
                         tx_rate = MCS_rate_lookup_ht[10+mcs.mcs_s.rate]
-                                                      [2*mcs.mcs_s.bw+short_gi];
+                                        [2*mcs.mcs_s.bw+mcs.mcs_s.short_gi];
                 } else {
                     ALOGE("Unexpected HT mcs.mcs_s index");
                 }
@@ -1086,10 +1086,10 @@
             case WL_PREAMBLE_VHT:
                 if (!mcs.mcs_s.nss)
                     tx_rate = MCS_rate_lookup_ht[mcs.mcs_s.rate]
-                                                      [2*mcs.mcs_s.bw+short_gi];
+                                        [2*mcs.mcs_s.bw+mcs.mcs_s.short_gi];
                 else
                     tx_rate = MCS_rate_lookup_ht[10+mcs.mcs_s.rate]
-                                                      [2*mcs.mcs_s.bw+short_gi];
+                                        [2*mcs.mcs_s.bw+mcs.mcs_s.short_gi];
             break;
             default:
                 ALOGE("Unexpected preamble");
@@ -1098,12 +1098,6 @@
     return tx_rate;
 }
 
-static u16 get_rx_rate(u16 mcs)
-{
-    /* TODO: guard interval is not specified currently */
-    return get_rate(mcs, 0);
-}
-
 static wifi_error populate_rx_aggr_stats(hal_info *info)
 {
     wifi_error status;
@@ -1224,6 +1218,8 @@
             mcs->mcs_s.preamble = WL_PREAMBLE_HT;
             mcs->mcs_s.rate = (ht_vht_sig & BITMASK(7)) >> 3;
             mcs->mcs_s.bw = ((ht_vht_sig >> 7) & 1);
+            mcs->mcs_s.short_gi =
+                    ((rx_stats_rcvd->ppdu_start.ht_sig_vht_sig_a_2 >> 7) & 1);
         } else if (rx_stats_rcvd->ppdu_start.preamble_type ==
                    PREAMBLE_VHT_SIG_A_2) {
             ht_vht_sig = rx_stats_rcvd->ppdu_start.ht_sig_vht_sig_a_1;
@@ -1232,9 +1228,12 @@
             mcs->mcs_s.rate =
                 (rx_stats_rcvd->ppdu_start.ht_sig_vht_sig_a_2 >> 4) & BITMASK(4);
             mcs->mcs_s.bw = (ht_vht_sig & 3);
+            mcs->mcs_s.short_gi =
+                             (rx_stats_rcvd->ppdu_start.ht_sig_vht_sig_a_2 & 1);
         }
+
         info->aggr_stats.last_transmit_rate
-            = get_rx_rate(info->aggr_stats.RxMCS.mcs);
+            = get_rate(info->aggr_stats.RxMCS.mcs);
 
         info->aggr_stats.rssi = rx_stats_rcvd->ppdu_start.rssi_comb;
     }
@@ -1258,61 +1257,61 @@
 static void parse_tx_rate_and_mcs(struct tx_ppdu_start *ppdu_start,
                                 wifi_ring_per_packet_status_entry *rb_pkt_stats)
 {
-    u16 tx_rate = 0, short_gi = 0;
+    u16 tx_rate = 0;
     MCS mcs;
 
     if (ppdu_start->valid_s0_bw20) {
-        short_gi = ppdu_start->s0_bw20.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s0_bw20.rate;
         mcs.mcs_s.nss       = ppdu_start->s0_bw20.nss;
         mcs.mcs_s.preamble  = ppdu_start->s0_bw20.preamble_type;
         mcs.mcs_s.bw        = BW_20_MHZ;
+        mcs.mcs_s.short_gi  = ppdu_start->s0_bw20.short_gi;
     } else if (ppdu_start->valid_s0_bw40) {
-        short_gi = ppdu_start->s0_bw40.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s0_bw40.rate;
         mcs.mcs_s.nss       = ppdu_start->s0_bw40.nss;
         mcs.mcs_s.preamble  = ppdu_start->s0_bw40.preamble_type;
         mcs.mcs_s.bw        = BW_40_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s0_bw40.short_gi;
     } else if (ppdu_start->valid_s0_bw80) {
-        short_gi = ppdu_start->s0_bw80.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s0_bw80.rate;
         mcs.mcs_s.nss       = ppdu_start->s0_bw80.nss;
         mcs.mcs_s.preamble  = ppdu_start->s0_bw80.preamble_type;
         mcs.mcs_s.bw        = BW_80_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s0_bw80.short_gi;
     } else if (ppdu_start->valid_s0_bw160) {
-        short_gi = ppdu_start->s0_bw160.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s0_bw160.rate;
         mcs.mcs_s.nss       = ppdu_start->s0_bw160.nss;
         mcs.mcs_s.preamble  = ppdu_start->s0_bw160.preamble_type;
         mcs.mcs_s.bw        = BW_160_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s0_bw160.short_gi;
     } else if (ppdu_start->valid_s1_bw20) {
-        short_gi = ppdu_start->s1_bw20.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s1_bw20.rate;
         mcs.mcs_s.nss       = ppdu_start->s1_bw20.nss;
         mcs.mcs_s.preamble  = ppdu_start->s1_bw20.preamble_type;
         mcs.mcs_s.bw        = BW_20_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s1_bw20.short_gi;
     } else if (ppdu_start->valid_s1_bw40) {
-        short_gi = ppdu_start->s1_bw40.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s1_bw40.rate;
         mcs.mcs_s.nss       = ppdu_start->s1_bw40.nss;
         mcs.mcs_s.preamble  = ppdu_start->s1_bw40.preamble_type;
         mcs.mcs_s.bw        = BW_40_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s1_bw40.short_gi;
     } else if (ppdu_start->valid_s1_bw80) {
-        short_gi = ppdu_start->s1_bw80.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s1_bw80.rate;
         mcs.mcs_s.nss       = ppdu_start->s1_bw80.nss;
         mcs.mcs_s.preamble  = ppdu_start->s1_bw80.preamble_type;
         mcs.mcs_s.bw        = BW_80_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s1_bw80.short_gi;
     } else if (ppdu_start->valid_s1_bw160) {
-        short_gi = ppdu_start->s1_bw160.short_gi;
         mcs.mcs_s.rate      = ppdu_start->s1_bw160.rate;
         mcs.mcs_s.nss       = ppdu_start->s1_bw160.nss;
         mcs.mcs_s.preamble  = ppdu_start->s1_bw160.preamble_type;
         mcs.mcs_s.bw        = BW_160_MHZ;
+        mcs.mcs_s.short_gi = ppdu_start->s1_bw160.short_gi;
     }
 
     rb_pkt_stats->MCS = mcs.mcs;
-    rb_pkt_stats->last_transmit_rate = get_rate(mcs.mcs, short_gi);
+    rb_pkt_stats->last_transmit_rate = get_rate(mcs.mcs);
 }
 
 static void get_tx_aggr_stats(struct tx_ppdu_start *ppdu_start, hal_info *info)