From 6a8a551ef33f8def8c37ab9f955e1e290cea0dd0 Mon Sep 17 00:00:00 2001
From: Xiwen JIANG <xiwen.jiang@eureocm.fr>
Date: Fri, 24 Jun 2016 12:32:57 +0200
Subject: [PATCH] add beamforming_mode into generate eNB and UE dlsch
 parameters from DCI

---
 openair1/PHY/LTE_TRANSPORT/dci_tools.c  | 23 +++++++++---
 openair1/PHY/LTE_TRANSPORT/proto.h      |  6 ++--
 openair1/SCHED/phy_procedures_lte_eNb.c |  9 +++--
 openair1/SCHED/phy_procedures_lte_ue.c  | 16 +++++----
 openair1/SIMULATION/LTE_PHY/dlsim.c     | 48 +++++++++++++++----------
 5 files changed, 68 insertions(+), 34 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index f1bf0da14f..a01b31ee90 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -872,7 +872,8 @@ int generate_eNB_dlsch_params_from_dci(int frame,
                                        uint16_t si_rnti,
                                        uint16_t ra_rnti,
                                        uint16_t p_rnti,
-                                       uint16_t DL_pmi_single)
+                                       uint16_t DL_pmi_single,
+				       uint8_t beamforming_mode)
 {
 
   uint8_t harq_pid = UINT8_MAX;
@@ -1244,7 +1245,13 @@ int generate_eNB_dlsch_params_from_dci(int frame,
 
     dlsch0_harq->Nl          = 1;
     //    dlsch[0]->layer_index = 0;
-    dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    if (beamforming_mode == 0)
+      dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    else if (beamforming_mode == 7)
+      dlsch0_harq->mimo_mode = TM7;
+    else
+      LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode);
+      
     dlsch0_harq->dl_power_off = 1;
     /*
       if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) {
@@ -3854,7 +3861,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
                                       PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
                                       uint16_t si_rnti,
                                       uint16_t ra_rnti,
-                                      uint16_t p_rnti)
+                                      uint16_t p_rnti,
+                                      uint8_t beamforming_mode)
 {
 
   uint8_t harq_pid=0;
@@ -4171,6 +4179,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
     dlsch0_harq->rvidx = rv;
     dlsch0_harq->Nl = 1;
     //    dlsch[0]->layer_index = 0;
+
     dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
     dlsch0_harq->dl_power_off = 1; //no power offset
 
@@ -4521,7 +4530,13 @@ int generate_ue_dlsch_params_from_dci(int frame,
 
     dlsch[0]->rnti = rnti;
 
-    dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    if (beamforming_mode == 0)
+      dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    else if (beamforming_mode == 7)
+      dlsch0_harq->mimo_mode   = TM7;
+    else
+      LOG_E(PHY,"Not supported beamforming mode %d\n",beamforming_mode);
+       
 
     dlsch0 = dlsch[0];
 
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 35de21c7b8..7535a26470 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -1424,7 +1424,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
                                       PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
                                       uint16_t si_rnti,
                                       uint16_t ra_rnti,
-                                      uint16_t p_rnti);
+                                      uint16_t p_rnti,
+                                      uint8_t beamforming_mode);
 
 int32_t generate_eNB_dlsch_params_from_dci(int frame,
     uint8_t subframe,
@@ -1437,7 +1438,8 @@ int32_t generate_eNB_dlsch_params_from_dci(int frame,
     uint16_t si_rnti,
     uint16_t ra_rnti,
     uint16_t p_rnti,
-    uint16_t DL_pmi_single);
+    uint16_t DL_pmi_single,
+    uint8_t beamforming_mode);
 
 int32_t generate_eNB_ulsch_params_from_rar(uint8_t *rar_pdu,
     frame_t frame,
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index e03ffa2120..e9ee770545 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1094,7 +1094,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                          SI_RNTI,
                                          0,
                                          P_RNTI,
-                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                         0);
 
 
       phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
@@ -1129,7 +1130,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                          SI_RNTI,
                                          DCI_pdu->dci_alloc[i].rnti,
                                          P_RNTI,
-                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                         0); 
 
       //    mac_xface->macphy_exit("Transmitted RAR, exiting\n");
 
@@ -1187,7 +1189,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                            SI_RNTI,
                                            0,
                                            P_RNTI,
-                                           phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single);
+                                           phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single,
+                                           phy_vars_eNB->transmission_mode[(uint8_t)UE_id]>7?0:phy_vars_eNB->transmission_mode[(uint8_t)UE_id]);
         LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n",
               phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
 
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 0ad6505149..d87a8479f5 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -132,7 +132,7 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t
                                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
                                   phy_vars_ue->frame_rx,
 				  subframe,
-				  phy_vars_ue->transmission_mode[eNB_id]);
+                                  phy_vars_ue->transmission_mode[eNB_id]);
 
   write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1);
   write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1);
@@ -2143,7 +2143,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 					     phy_vars_ue->pdsch_config_dedicated,
 					     SI_RNTI,
 					     0,
-					     P_RNTI)==0)) {
+					     P_RNTI,
+                                             phy_vars_ue->transmission_mode[eNB_id]>7?0:phy_vars_ue->transmission_mode[eNB_id])==0)) {
 
 #ifdef DIAG_PHY
 	
@@ -2211,7 +2212,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
                                             phy_vars_ue->pdsch_config_dedicated,
                                             SI_RNTI,
                                             0,
-                                            P_RNTI)==0) {
+                                            P_RNTI,
+                                            0)==0) {
 
         phy_vars_ue->dlsch_SI_received[eNB_id]++;
  
@@ -2255,7 +2257,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
                                             phy_vars_ue->pdsch_config_dedicated,
                                             SI_RNTI,
                                             phy_vars_ue->prach_resources[eNB_id]->ra_RNTI,
-                                            P_RNTI)==0) {
+                                            P_RNTI,
+                                            0)==0) {
 
         phy_vars_ue->dlsch_ra_received[eNB_id]++;
 
@@ -2790,7 +2793,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
                     phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
                     frame_rx,
 		    subframe_prev,
-		    phy_vars_ue->transmission_mode[eNB_id]);
+		    0);
 
 #ifdef DEBUG_PHY_PROC
             LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
@@ -2853,8 +2856,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
 #endif
- 
-	    //	      dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev);
+            //        dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev); 
             VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
             stop_meas(&phy_vars_ue->phy_proc_rx);
 	    return(-1);
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 19a0437bdf..6e78ad1a56 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -1149,10 +1149,11 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             transmission_mode<7?0:transmission_mode);
 
-          if (transmission_mode == 7)
-	    PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mimo_mode = TM7; //Xiwen: to check about harq_pid
+          /*if (transmission_mode == 7)
+	    PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mimo_mode = TM7; //Xiwen: to check about harq_pid*/
 
           num_dci++;
           num_ue_spec_dci++;
@@ -1292,7 +1293,8 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             0);
 
           num_common_dci++;
           num_dci++;
@@ -1459,7 +1461,8 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             0);
 
           num_dci++;
           num_ue_spec_dci++;
@@ -1599,7 +1602,8 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             0);
 
           num_common_dci++;
           num_dci++;
@@ -1767,7 +1771,8 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             0);
 
           num_dci++;
           num_ue_spec_dci++;
@@ -1907,7 +1912,8 @@ int main(int argc, char **argv)
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single,
+                                             0);
 
           num_common_dci++;
           num_dci++;
@@ -1936,7 +1942,8 @@ int main(int argc, char **argv)
                                            SI_RNTI,
                                            0,
                                            P_RNTI,
-                                           PHY_vars_eNB->eNB_UE_stats[k].DL_pmi_single);
+                                           PHY_vars_eNB->eNB_UE_stats[k].DL_pmi_single,
+                                           0);
 
         dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
         num_ue_spec_dci++;
@@ -3226,7 +3233,8 @@ PMI_FEEDBACK:
                                                            PHY_vars_UE->pdsch_config_dedicated,
                                                            SI_RNTI,
                                                            0,
-                                                           P_RNTI)==0)) {
+                                                           P_RNTI==0,
+                                                           transmission_mode<7?0:transmission_mode))) {
                       //dump_dci(&PHY_vars_UE->lte_frame_parms,&dci_alloc_rx[i]);
                       coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
                                                       PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb,
@@ -3237,8 +3245,8 @@ PMI_FEEDBACK:
                                                       0,
 						      subframe,
 						      (transmission_mode<7?0:transmission_mode));
-          	    if (transmission_mode==7 && common_flag==0)
-       	    	      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->mimo_mode = TM7; 
+          	    /*if (transmission_mode==7 && common_flag==0)
+       	    	      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->mimo_mode = TM7; */
 
                       /*
                       rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword);
@@ -3289,9 +3297,10 @@ PMI_FEEDBACK:
                                                       PHY_vars_UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
-                                                      P_RNTI);
-          	    if(transmission_mode==7 && common_flag==0)
-       	    	      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->mimo_mode = TM7; 
+                                                      P_RNTI,
+                                                      transmission_mode<7?0:transmission_mode);
+          	    /*if(transmission_mode==7 && common_flag==0)
+       	    	      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->mimo_mode = TM7;*/ 
                     break;
 
                   case 3:
@@ -3306,7 +3315,8 @@ PMI_FEEDBACK:
                                                       PHY_vars_UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
-                                                      P_RNTI);
+                                                      P_RNTI,
+                                                      0);
                     //        printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx);
                     break;
 
@@ -3321,7 +3331,8 @@ PMI_FEEDBACK:
                                                       PHY_vars_UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
-                                                      P_RNTI);
+                                                      P_RNTI,
+                                                      0);
                     break;
 
                   case 5:
@@ -3336,7 +3347,8 @@ PMI_FEEDBACK:
                                                       PHY_vars_UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
-                                                      P_RNTI);
+                                                      P_RNTI,
+                                                      0);
                     break;
 
                   }
-- 
2.26.2