fixing conflicts
This commit is contained in:
@@ -1630,260 +1630,6 @@ static void* ru_thread_tx( void* param ) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void* ru_thread_control( void* param ) {
|
|
||||||
|
|
||||||
|
|
||||||
RU_t *ru = (RU_t*)param;
|
|
||||||
RU_proc_t *proc = &ru->proc;
|
|
||||||
RRU_CONFIG_msg_t rru_config_msg;
|
|
||||||
ssize_t msg_len;
|
|
||||||
int len, ret;
|
|
||||||
|
|
||||||
|
|
||||||
// Start IF device if any
|
|
||||||
if (ru->start_if) {
|
|
||||||
LOG_I(PHY,"Starting IF interface for RU %d\n",ru->idx);
|
|
||||||
AssertFatal(
|
|
||||||
ru->start_if(ru,NULL) == 0, "Could not start the IF device\n");
|
|
||||||
|
|
||||||
if (ru->if_south != LOCAL_RF) wait_eNBs();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ru->state = (ru->function==eNodeB_3GPP)? RU_RUN : RU_IDLE;
|
|
||||||
LOG_I(PHY,"Control channel ON for RU %d\n", ru->idx);
|
|
||||||
|
|
||||||
while (!oai_exit) // Change the cond
|
|
||||||
{
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t); // TODO : check what should be the msg len
|
|
||||||
|
|
||||||
if (ru->state == RU_IDLE && ru->if_south != LOCAL_RF)
|
|
||||||
send_tick(ru);
|
|
||||||
|
|
||||||
|
|
||||||
if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice,
|
|
||||||
&rru_config_msg,
|
|
||||||
msg_len))<0) {
|
|
||||||
LOG_D(PHY,"Waiting msg for RU %d\n", ru->idx);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch(rru_config_msg.type)
|
|
||||||
{
|
|
||||||
case RAU_tick: // RRU
|
|
||||||
if (ru->if_south != LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Received Tick msg...Ignoring\n");
|
|
||||||
}else{
|
|
||||||
LOG_I(PHY,"Tick received from RAU\n");
|
|
||||||
|
|
||||||
if (send_capab(ru) == 0) ru->state = RU_CONFIG;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_capabilities: // RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_capab msg...Ignoring\n");
|
|
||||||
|
|
||||||
else{
|
|
||||||
msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
|
|
||||||
|
|
||||||
AssertFatal(rru_config_msg.len==msg_len,"Received capabilities with incorrect length (%d!=%d)\n",(int)rru_config_msg.len,(int)msg_len);
|
|
||||||
LOG_I(PHY,"Received capabilities from RRU %d (len %d/%d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",ru->idx,
|
|
||||||
(int)rru_config_msg.len,(int)msg_len,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_pdschReferenceSignalPower[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_rxgain[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_tx[0],
|
|
||||||
((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_rx[0]);
|
|
||||||
|
|
||||||
configure_ru(ru->idx,(RRU_capabilities_t *)&rru_config_msg.msg[0]);
|
|
||||||
|
|
||||||
// send config
|
|
||||||
if (send_config(ru,rru_config_msg) == 0) ru->state = RU_CONFIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_config: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Configuration received from RAU (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n",
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->num_bands,
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0],
|
|
||||||
((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]);
|
|
||||||
|
|
||||||
configure_rru(ru->idx, (void*)&rru_config_msg.msg[0]);
|
|
||||||
|
|
||||||
|
|
||||||
fill_rf_config(ru,ru->rf_config_file);
|
|
||||||
init_frame_parms(&ru->frame_parms,1);
|
|
||||||
ru->frame_parms.nb_antennas_rx = ru->nb_rx;
|
|
||||||
phy_init_RU(ru);
|
|
||||||
|
|
||||||
//if (ru->is_slave == 1) lte_sync_time_init(&ru->frame_parms);
|
|
||||||
|
|
||||||
if (ru->rfdevice.is_init != 1){
|
|
||||||
ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (ru->rfdevice.trx_config_func) AssertFatal((ru->rfdevice.trx_config_func(&ru->rfdevice,&ru->openair0_cfg)==0),
|
|
||||||
"Failed to configure RF device for RU %d\n",ru->idx);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (setup_RU_buffers(ru)!=0) {
|
|
||||||
printf("Exiting, cannot initialize RU Buffers\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// send CONFIG_OK
|
|
||||||
|
|
||||||
rru_config_msg.type = RRU_config_ok;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t);
|
|
||||||
LOG_I(PHY,"Sending CONFIG_OK to RAU %d\n", ru->idx);
|
|
||||||
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),
|
|
||||||
"RU %d failed send CONFIG_OK to RAU\n",ru->idx);
|
|
||||||
reset_proc(ru);
|
|
||||||
ru->state = RU_READY;
|
|
||||||
} else LOG_E(PHY,"Received RRU_config msg...Ignoring\n");
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_config_ok: // RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_config_ok msg...Ignoring\n");
|
|
||||||
else{
|
|
||||||
|
|
||||||
if (setup_RU_buffers(ru)!=0) {
|
|
||||||
printf("Exiting, cannot initialize RU Buffers\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set state to RUN for Master RU, Others on SYNC
|
|
||||||
ru->state = (ru->is_slave == 1) ? RU_SYNC : RU_RUN ;
|
|
||||||
ru->in_synch = 0;
|
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY, "Signaling main thread that RU %d (is_slave %d) is ready in state %s\n",ru->idx,ru->is_slave,ru_states[ru->state]);
|
|
||||||
pthread_mutex_lock(&RC.ru_mutex);
|
|
||||||
RC.ru_mask &= ~(1<<ru->idx);
|
|
||||||
pthread_cond_signal(&RC.ru_cond);
|
|
||||||
pthread_mutex_unlock(&RC.ru_mutex);
|
|
||||||
|
|
||||||
wait_sync("ru_thread_control");
|
|
||||||
|
|
||||||
// send start
|
|
||||||
rru_config_msg.type = RRU_start;
|
|
||||||
rru_config_msg.len = sizeof(RRU_CONFIG_msg_t); // TODO: set to correct msg len
|
|
||||||
|
|
||||||
|
|
||||||
LOG_I(PHY,"Sending Start to RRU %d\n", ru->idx);
|
|
||||||
AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1),"Failed to send msg to RU %d\n",ru->idx);
|
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&proc->mutex_ru);
|
|
||||||
proc->instance_cnt_ru = 1;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_ru);
|
|
||||||
if (pthread_cond_signal(&proc->cond_ru_thread) != 0) {
|
|
||||||
LOG_E( PHY, "ERROR pthread_cond_signal for RU %d\n",ru->idx);
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_start: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Start received from RAU\n");
|
|
||||||
|
|
||||||
if (ru->state == RU_READY){
|
|
||||||
|
|
||||||
LOG_I(PHY, "Signaling main thread that RU %d is ready\n",ru->idx);
|
|
||||||
pthread_mutex_lock(&RC.ru_mutex);
|
|
||||||
RC.ru_mask &= ~(1<<ru->idx);
|
|
||||||
pthread_cond_signal(&RC.ru_cond);
|
|
||||||
pthread_mutex_unlock(&RC.ru_mutex);
|
|
||||||
|
|
||||||
wait_sync("ru_thread_control");
|
|
||||||
|
|
||||||
ru->state = (ru->is_slave == 1) ? RU_SYNC : RU_RUN ;
|
|
||||||
ru->cmd = EMPTY;
|
|
||||||
pthread_mutex_lock(&proc->mutex_ru);
|
|
||||||
proc->instance_cnt_ru = 1;
|
|
||||||
pthread_mutex_unlock(&proc->mutex_ru);
|
|
||||||
if (pthread_cond_signal(&proc->cond_ru_thread) != 0) {
|
|
||||||
LOG_E( PHY, "ERROR pthread_cond_signal for RU %d\n",ru->idx);
|
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else LOG_E(PHY,"RRU not ready, cannot start\n");
|
|
||||||
|
|
||||||
} else LOG_E(PHY,"Received RRU_start msg...Ignoring\n");
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_sync_ok: //RAU
|
|
||||||
if (ru->if_south == LOCAL_RF) LOG_E(PHY,"Received RRU_config_ok msg...Ignoring\n");
|
|
||||||
else{
|
|
||||||
if (ru->is_slave == 1){
|
|
||||||
LOG_I(PHY,"Received RRU_sync_ok from RRU %d\n",ru->idx);
|
|
||||||
// Just change the state of the RRU to unblock ru_thread()
|
|
||||||
ru->state = RU_RUN;
|
|
||||||
}else LOG_E(PHY,"Received RRU_sync_ok from a master RRU...Ignoring\n");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RRU_frame_resynch: //RRU
|
|
||||||
if (ru->if_south != LOCAL_RF) LOG_E(PHY,"Received RRU frame resynch message, should not happen in RAU\n");
|
|
||||||
else {
|
|
||||||
LOG_I(PHY,"Received RRU_frame_resynch command\n");
|
|
||||||
ru->cmd = RU_FRAME_RESYNCH;
|
|
||||||
ru->cmdval = ((uint16_t*)&rru_config_msg.msg[0])[0];
|
|
||||||
LOG_I(PHY,"Received Frame Resynch messaage with value %d\n",ru->cmdval);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RRU_stop: // RRU
|
|
||||||
if (ru->if_south == LOCAL_RF){
|
|
||||||
LOG_I(PHY,"Stop received from RAU\n");
|
|
||||||
|
|
||||||
if (ru->state == RU_RUN || ru->state == RU_ERROR){
|
|
||||||
|
|
||||||
LOG_I(PHY,"Stopping RRU\n");
|
|
||||||
ru->state = RU_READY;
|
|
||||||
// TODO: stop ru_thread
|
|
||||||
}else{
|
|
||||||
LOG_I(PHY,"RRU not running, can't stop\n");
|
|
||||||
}
|
|
||||||
}else LOG_E(PHY,"Received RRU_stop msg...Ignoring\n");
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (ru->if_south != LOCAL_RF){
|
|
||||||
if (ru->state == RU_IDLE){
|
|
||||||
// Keep sending TICK
|
|
||||||
send_tick(ru);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
} // switch
|
|
||||||
} //else
|
|
||||||
|
|
||||||
|
|
||||||
}//while
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void* ru_thread( void* param ) {
|
static void* ru_thread( void* param ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user