carrier aggregation prepartion work:

- handle an UE on the second carrier
- quick fix (may change in the future) to deal with race conditions
  in lte-softmodem. TX procedures (phy_procedures_eNB_TX) are now done
  the one after the other, from carrier 0 to carrier N.


git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7541 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Cedric Roux
2015-06-08 08:24:51 +00:00
parent 41311fa942
commit 76fc205b35
8 changed files with 81 additions and 33 deletions
+42 -7
View File
@@ -992,6 +992,15 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
}
}
/* mutex, cond and variable to serialize phy proc TX calls
* (this mechanism may be relaxed in the future for better
* performances)
*/
static struct {
pthread_mutex_t mutex_phy_proc_tx;
pthread_cond_t cond_phy_proc_tx;
volatile uint8_t phy_proc_CC_id;
} sync_phy_proc[NUM_ENB_THREADS];
/*!
* \brief The transmit thread of eNB.
@@ -1092,16 +1101,35 @@ static void* eNB_thread_tx( void* param )
if (oai_exit) break;
if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&&
(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))||
(PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) {
if (((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD) &&
((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_DL) ||
(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S))) ||
(PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD)) {
/* run PHY TX procedures the one after the other for all CCs to avoid race conditions
* (may be relaxed in the future for performance reasons)
*/
if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) {
LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe);
exit_fun("nothing to add");
break;
}
/* wait for our turn */
while (sync_phy_proc[proc->subframe].phy_proc_CC_id != proc->CC_id) {
pthread_cond_wait(&sync_phy_proc[proc->subframe].cond_phy_proc_tx,
&sync_phy_proc[proc->subframe].mutex_phy_proc_tx);
}
phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL );
}
if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S)) {
phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL );
/* we're done, let the next one proceed */
sync_phy_proc[proc->subframe].phy_proc_CC_id++;
sync_phy_proc[proc->subframe].phy_proc_CC_id %= MAX_NUM_CCs;
pthread_cond_broadcast(&sync_phy_proc[proc->subframe].cond_phy_proc_tx);
if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) {
LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe);
exit_fun("nothing to add");
break;
}
}
do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] );
@@ -1376,6 +1404,13 @@ void init_eNB_proc(void)
// PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1;
#endif
}
/* setup PHY proc TX sync mechanism */
for (i=0; i<NUM_ENB_THREADS; i++) {
pthread_mutex_init(&sync_phy_proc[i].mutex_phy_proc_tx, NULL);
pthread_cond_init(&sync_phy_proc[i].cond_phy_proc_tx, NULL);
sync_phy_proc[i].phy_proc_CC_id = 0;
}
}
/*!