L1/L2 scheduling extensions for BL/CE operation, BR random-access procedure, BR PRACH detection. Still untested, but compilation succeeds. Missing elements in L2 - PUSCH programming for Msg3, Msg4 retransmission programming for BL/CE. DLSCH/ULSCH programming for UE-specific DLSCH/ULSCH for BL/CE
This commit is contained in:
+145
-8
@@ -144,6 +144,9 @@ void init_eNB(int,int);
|
||||
void stop_eNB(int nb_inst);
|
||||
|
||||
void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||
#ifdef Rel14
|
||||
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
|
||||
#endif
|
||||
|
||||
static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) {
|
||||
|
||||
@@ -153,8 +156,12 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
|
||||
// Common RX procedures subframe n
|
||||
|
||||
// if this is IF5 or 3GPP_eNB
|
||||
if (eNB->RU_list[0]->function < NGFI_RAU_IF4p5) wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
|
||||
if (eNB->RU_list[0]->function < NGFI_RAU_IF4p5) {
|
||||
wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
#ifdef Rel14
|
||||
wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx);
|
||||
#endif
|
||||
}
|
||||
// UE-specific RX processing for subframe n
|
||||
phy_procedures_eNB_uespec_RX(eNB, proc, no_relay );
|
||||
|
||||
@@ -432,6 +439,67 @@ void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
||||
|
||||
}
|
||||
|
||||
#ifdef Rel14
|
||||
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) {
|
||||
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
|
||||
int i;
|
||||
|
||||
if (ru!=NULL) {
|
||||
pthread_mutex_lock(&proc->mutex_RU_PRACH_br);
|
||||
for (i=0;i<eNB->num_RU;i++) {
|
||||
if (ru == eNB->RU_list[i]) {
|
||||
LOG_I(PHY,"frame %d, subframe %d: RU %d for eNB %d signals PRACH BR (mask %x, num_RU %d)\n",frame,subframe,i,eNB->Mod_id,proc->RU_mask_prach_br,eNB->num_RU);
|
||||
if ((proc->RU_mask_prach_br&(1<<i)) > 0)
|
||||
LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information (PRACH BR) from RU %d (num_RU %d, mask %x) has not been served yet!\n",
|
||||
eNB->Mod_id,frame,subframe,ru->idx,eNB->num_RU,proc->RU_mask_prach_br);
|
||||
proc->RU_mask_prach_br |= (1<<i);
|
||||
}
|
||||
}
|
||||
if (proc->RU_mask_prach_br != (1<<eNB->num_RU)-1) { // not all RUs have provided their information so return
|
||||
pthread_mutex_unlock(&proc->mutex_RU_PRACH_br);
|
||||
return(0);
|
||||
}
|
||||
else { // all RUs have provided their information so continue on and wakeup eNB processing
|
||||
proc->RU_mask_prach_br = 0;
|
||||
pthread_mutex_unlock(&proc->mutex_RU_PRACH_br);
|
||||
}
|
||||
}
|
||||
|
||||
// check if we have to detect PRACH first
|
||||
if (is_prach_subframe(fp,frame,subframe)>0) {
|
||||
LOG_D(PHY,"Triggering prach br processing, frame %d, subframe %d\n",frame,subframe);
|
||||
if (proc->instance_cnt_prach_br == 0) {
|
||||
LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH BR\n", frame,subframe);
|
||||
return;
|
||||
}
|
||||
|
||||
// wake up thread for PRACH RX
|
||||
if (pthread_mutex_lock(&proc->mutex_prach_br) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->thread_index, proc->instance_cnt_prach_br);
|
||||
exit_fun( "error locking mutex_prach" );
|
||||
return;
|
||||
}
|
||||
|
||||
++proc->instance_cnt_prach_br;
|
||||
// set timing for prach thread
|
||||
proc->frame_prach_br = frame;
|
||||
proc->subframe_prach_br = subframe;
|
||||
|
||||
// the thread can now be woken up
|
||||
if (pthread_cond_signal(&proc->cond_prach_br) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH BR thread %d\n", proc->thread_index);
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
return;
|
||||
}
|
||||
|
||||
pthread_mutex_unlock( &proc->mutex_prach_br );
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief The prach receive thread of eNB.
|
||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
||||
@@ -457,7 +525,11 @@ static void* eNB_thread_prach( void* param ) {
|
||||
if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break;
|
||||
|
||||
LOG_D(PHY,"Running eNB prach procedures\n");
|
||||
prach_procedures(eNB);
|
||||
prach_procedures(eNB
|
||||
#ifdef Rel14
|
||||
,0
|
||||
#endif
|
||||
);
|
||||
|
||||
if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break;
|
||||
}
|
||||
@@ -468,6 +540,44 @@ static void* eNB_thread_prach( void* param ) {
|
||||
return &eNB_thread_prach_status;
|
||||
}
|
||||
|
||||
#ifdef Rel14
|
||||
/*!
|
||||
* \brief The prach receive thread of eNB for BL/CE UEs.
|
||||
* \param param is a \ref eNB_proc_t structure which contains the info what to process.
|
||||
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
|
||||
*/
|
||||
static void* eNB_thread_prach_br( void* param ) {
|
||||
static int eNB_thread_prach_status;
|
||||
|
||||
|
||||
PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param;
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
|
||||
// set default return value
|
||||
eNB_thread_prach_status = 0;
|
||||
|
||||
thread_top_init("eNB_thread_prach_br",1,500000L,1000000L,20000000L);
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
if (oai_exit) break;
|
||||
|
||||
|
||||
if (wait_on_condition(&proc->mutex_prach_br,&proc->cond_prach_br,&proc->instance_cnt_prach_br,"eNB_prach_thread_br") < 0) break;
|
||||
|
||||
LOG_D(PHY,"Running eNB prach procedures for BL/CE UEs\n");
|
||||
prach_procedures(eNB,1);
|
||||
|
||||
if (release_thread(&proc->mutex_prach_br,&proc->instance_cnt_prach_br,"eNB_prach_thread_br") < 0) break;
|
||||
}
|
||||
|
||||
LOG_I(PHY, "Exiting eNB thread PRACH BR\n");
|
||||
|
||||
eNB_thread_prach_status = 0;
|
||||
return &eNB_thread_prach_status;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *);
|
||||
@@ -482,6 +592,9 @@ void init_eNB_proc(int inst) {
|
||||
eNB_proc_t *proc;
|
||||
eNB_rxtx_proc_t *proc_rxtx;
|
||||
pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL,*attr_te=NULL,*attr_synch=NULL;
|
||||
#ifdef Rel14
|
||||
pthread_attr_t *attr_prach_br=NULL;
|
||||
#endif
|
||||
|
||||
for (CC_id=0; CC_id<RC.nb_CC[inst]; CC_id++) {
|
||||
eNB = RC.eNB[inst][CC_id];
|
||||
@@ -523,10 +636,22 @@ void init_eNB_proc(int inst) {
|
||||
pthread_attr_init( &proc->attr_te);
|
||||
pthread_attr_init( &proc_rxtx[0].attr_rxtx);
|
||||
pthread_attr_init( &proc_rxtx[1].attr_rxtx);
|
||||
#ifdef Rel14
|
||||
proc->instance_cnt_prach_br = -1;
|
||||
proc->RU_mask_prach_br=0;
|
||||
pthread_mutex_init( &proc->mutex_prach_br, NULL);
|
||||
pthread_mutex_init( &proc->mutex_RU_PRACH_br,NULL);
|
||||
pthread_cond_init( &proc->cond_prach_br, NULL);
|
||||
pthread_attr_init( &proc->attr_prach_br);
|
||||
#endif
|
||||
#ifndef DEADLINE_SCHEDULER
|
||||
attr0 = &proc_rxtx[0].attr_rxtx;
|
||||
attr1 = &proc_rxtx[1].attr_rxtx;
|
||||
attr_prach = &proc->attr_prach;
|
||||
#ifdef Rel14
|
||||
attr_prach_br = &proc->attr_prach_br;
|
||||
#endif
|
||||
|
||||
attr_asynch = &proc->attr_asynch_rxtx;
|
||||
attr_single = &proc->attr_single;
|
||||
attr_td = &proc->attr_td;
|
||||
@@ -538,7 +663,9 @@ void init_eNB_proc(int inst) {
|
||||
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] );
|
||||
}
|
||||
pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB );
|
||||
|
||||
#ifdef Rel14
|
||||
pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB );
|
||||
#endif
|
||||
char name[16];
|
||||
if (eNB->single_thread_flag==0) {
|
||||
snprintf( name, sizeof(name), "RXTX0 %d", i );
|
||||
@@ -601,10 +728,18 @@ void kill_eNB_proc(int inst) {
|
||||
pthread_cond_signal( &proc_rxtx[0].cond_rxtx );
|
||||
pthread_cond_signal( &proc_rxtx[1].cond_rxtx );
|
||||
pthread_cond_signal( &proc->cond_prach );
|
||||
|
||||
pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx);
|
||||
pthread_join( proc->pthread_prach, (void**)&status );
|
||||
|
||||
pthread_mutex_destroy( &proc->mutex_prach );
|
||||
pthread_cond_destroy( &proc->cond_prach );
|
||||
pthread_cond_destroy( &proc->cond_prach );
|
||||
#ifdef Rel14
|
||||
pthread_cond_signal( &proc->cond_prach_br );
|
||||
pthread_join( proc->pthread_prach_br, (void**)&status );
|
||||
pthread_mutex_destroy( &proc->mutex_prach_br );
|
||||
pthread_cond_destroy( &proc->cond_prach_br );
|
||||
#endif
|
||||
pthread_mutex_destroy(&eNB->UL_INFO_mutex);
|
||||
int i;
|
||||
for (i=0;i<2;i++) {
|
||||
@@ -756,11 +891,13 @@ void init_eNB_afterRU() {
|
||||
|
||||
AssertFatal(RC.ru[ru_id]!=NULL,"ru_id %d is null\n",ru_id);
|
||||
|
||||
RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx;
|
||||
RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB;
|
||||
RC.ru[ru_id]->eNB_top = eNB_top;
|
||||
RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx;
|
||||
RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB;
|
||||
RC.ru[ru_id]->wakeup_prach_eNB_br = wakeup_prach_eNB_br;
|
||||
RC.ru[ru_id]->eNB_top = eNB_top;
|
||||
}
|
||||
}
|
||||
|
||||
void init_eNB(int single_thread_flag,int wait_for_sync) {
|
||||
|
||||
int CC_id;
|
||||
|
||||
+128
-31
@@ -479,15 +479,19 @@ void fh_if4p5_south_asynch_in(RU_t *ru,int *frame,int *subframe) {
|
||||
|
||||
uint16_t packet_type;
|
||||
uint32_t symbol_number,symbol_mask,symbol_mask_full,prach_rx;
|
||||
|
||||
uint32_t got_prach_info=0;
|
||||
|
||||
symbol_number = 0;
|
||||
symbol_mask = 0;
|
||||
symbol_mask_full = (1<<fp->symbols_per_tti)-1;
|
||||
prach_rx = 0;
|
||||
symbol_mask = (1<<fp->symbols_per_tti)-1;
|
||||
prach_rx = 0;
|
||||
|
||||
do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
|
||||
recv_IF4p5(ru, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number);
|
||||
// grab first prach information for this new subframe
|
||||
if (got_prach_info==0) {
|
||||
prach_rx = is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx);
|
||||
got_prach_info = 1;
|
||||
}
|
||||
if (proc->first_rx != 0) {
|
||||
*frame = proc->frame_rx;
|
||||
*subframe = proc->subframe_rx;
|
||||
@@ -503,13 +507,15 @@ void fh_if4p5_south_asynch_in(RU_t *ru,int *frame,int *subframe) {
|
||||
exit_fun("Exiting");
|
||||
}
|
||||
}
|
||||
if (packet_type == IF4p5_PULFFT) {
|
||||
symbol_mask = symbol_mask | (1<<symbol_number);
|
||||
prach_rx = (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0) ? 1 : 0;
|
||||
} else if (packet_type == IF4p5_PRACH) {
|
||||
prach_rx = 0;
|
||||
}
|
||||
} while( (symbol_mask != symbol_mask_full) || (prach_rx == 1));
|
||||
if (packet_type == IF4p5_PULFFT) symbol_mask &= (~(1<<symbol_number));
|
||||
else if (packet_type == IF4p5_PRACH) prach_rx &= (~0x1);
|
||||
#ifdef Rel14
|
||||
else if (packet_type == IF4p5_PRACH_BR_CE0) prach_rx &= (~0x2);
|
||||
else if (packet_type == IF4p5_PRACH_BR_CE1) prach_rx &= (~0x4);
|
||||
else if (packet_type == IF4p5_PRACH_BR_CE2) prach_rx &= (~0x8);
|
||||
else if (packet_type == IF4p5_PRACH_BR_CE3) prach_rx &= (~0x10);
|
||||
#endif
|
||||
} while( (symbol_mask > 0) || (prach_rx >0)); // haven't received all PUSCH symbols and PRACH information
|
||||
}
|
||||
|
||||
|
||||
@@ -895,20 +901,60 @@ static void* ru_thread_prach( void* param ) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 );
|
||||
rx_prach(NULL,
|
||||
ru,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
proc->frame_prach,
|
||||
0);
|
||||
0
|
||||
#ifdef Rel14
|
||||
,0
|
||||
#endif
|
||||
);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0 );
|
||||
if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break;
|
||||
}
|
||||
|
||||
printf( "Exiting RU thread PRACH\n");
|
||||
LOG_I(PHY, "Exiting RU thread PRACH\n");
|
||||
|
||||
ru_thread_prach_status = 0;
|
||||
return &ru_thread_prach_status;
|
||||
}
|
||||
|
||||
#ifdef Rel14
|
||||
static void* ru_thread_prach_br( void* param ) {
|
||||
|
||||
static int ru_thread_prach_status;
|
||||
|
||||
RU_t *ru = (RU_t*)param;
|
||||
RU_proc_t *proc = (RU_proc_t*)&ru->proc;
|
||||
|
||||
// set default return value
|
||||
ru_thread_prach_status = 0;
|
||||
|
||||
thread_top_init("ru_thread_prach_br",1,500000L,1000000L,20000000L);
|
||||
|
||||
while (!oai_exit) {
|
||||
|
||||
if (oai_exit) break;
|
||||
if (wait_on_condition(&proc->mutex_prach_br,&proc->cond_prach_br,&proc->instance_cnt_prach_br,"ru_prach_thread_br") < 0) break;
|
||||
rx_prach(NULL,
|
||||
ru,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
proc->frame_prach_br,
|
||||
0,
|
||||
1);
|
||||
if (release_thread(&proc->mutex_prach_br,&proc->instance_cnt_prach_br,"ru_prach_thread_br") < 0) break;
|
||||
}
|
||||
|
||||
LOG_I(PHY, "Exiting RU thread PRACH BR\n");
|
||||
|
||||
ru_thread_prach_status = 0;
|
||||
return &ru_thread_prach_status;
|
||||
}
|
||||
#endif
|
||||
|
||||
int wakeup_synch(RU_t *ru){
|
||||
|
||||
struct timespec wait;
|
||||
@@ -1058,6 +1104,35 @@ static inline int wakeup_prach_ru(RU_t *ru) {
|
||||
return(0);
|
||||
}
|
||||
|
||||
#ifdef Rel14
|
||||
static inline int wakeup_prach_ru_br(RU_t *ru) {
|
||||
|
||||
struct timespec wait;
|
||||
|
||||
wait.tv_sec=0;
|
||||
wait.tv_nsec=5000000L;
|
||||
|
||||
if (pthread_mutex_timedlock(&ru->proc.mutex_prach_br,&wait) !=0) {
|
||||
LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for RU prach thread BR (IC %d)\n", ru->proc.instance_cnt_prach_br);
|
||||
exit_fun( "error locking mutex_rxtx" );
|
||||
return(-1);
|
||||
}
|
||||
if (ru->proc.instance_cnt_prach_br==-1) {
|
||||
++ru->proc.instance_cnt_prach_br;
|
||||
ru->proc.frame_prach_br = ru->proc.frame_rx;
|
||||
ru->proc.subframe_prach_br = ru->proc.subframe_rx;
|
||||
|
||||
LOG_D(PHY,"RU %d: waking up PRACH thread\n",ru->idx);
|
||||
// the thread can now be woken up
|
||||
AssertFatal(pthread_cond_signal(&ru->proc.cond_prach_br) == 0, "ERROR pthread_cond_signal for RU prach thread BR\n");
|
||||
}
|
||||
else LOG_W(PHY,"RU prach thread busy, skipping\n");
|
||||
pthread_mutex_unlock( &ru->proc.mutex_prach_br );
|
||||
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void* ru_thread( void* param ) {
|
||||
|
||||
static int ru_thread_status;
|
||||
@@ -1150,10 +1225,10 @@ static void* ru_thread( void* param ) {
|
||||
is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx),
|
||||
proc->frame_rx,proc->subframe_rx);
|
||||
|
||||
if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0))
|
||||
wakeup_prach_ru(ru);
|
||||
|
||||
|
||||
if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) wakeup_prach_ru(ru);
|
||||
#ifdef Rel14
|
||||
else if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>1)) wakeup_prach_ru_br(ru);
|
||||
#endif
|
||||
|
||||
// adjust for timing offset between RU
|
||||
if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023;
|
||||
@@ -1298,7 +1373,9 @@ void init_RU_proc(RU_t *ru) {
|
||||
RU_proc_t *proc;
|
||||
pthread_attr_t *attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_synch=NULL;
|
||||
//pthread_attr_t *attr_fep=NULL;
|
||||
|
||||
#ifdef Rel14
|
||||
pthread_attr_t *attr_prach_br=NULL;
|
||||
#endif
|
||||
char name[100];
|
||||
|
||||
#ifndef OCP_FRAMEWORK
|
||||
@@ -1335,32 +1412,37 @@ void init_RU_proc(RU_t *ru) {
|
||||
pthread_attr_init( &proc->attr_synch);
|
||||
pthread_attr_init( &proc->attr_asynch_rxtx);
|
||||
pthread_attr_init( &proc->attr_fep);
|
||||
|
||||
|
||||
#ifdef Rel14
|
||||
proc->instance_cnt_prach_br = -1;
|
||||
pthread_mutex_init( &proc->mutex_prach_br, NULL);
|
||||
pthread_cond_init( &proc->cond_prach_br, NULL);
|
||||
pthread_attr_init( &proc->attr_prach_br);
|
||||
#endif
|
||||
|
||||
#ifndef DEADLINE_SCHEDULER
|
||||
attr_FH = &proc->attr_FH;
|
||||
attr_prach = &proc->attr_prach;
|
||||
attr_synch = &proc->attr_synch;
|
||||
attr_asynch = &proc->attr_asynch_rxtx;
|
||||
// attr_fep = &proc->attr_fep;
|
||||
attr_FH = &proc->attr_FH;
|
||||
attr_prach = &proc->attr_prach;
|
||||
attr_synch = &proc->attr_synch;
|
||||
attr_asynch = &proc->attr_asynch_rxtx;
|
||||
#ifdef Rel14
|
||||
attr_prach_br = &proc->attr_prach_br;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru );
|
||||
|
||||
if (ru->function == NGFI_RRU_IF4p5) {
|
||||
pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru );
|
||||
|
||||
#ifdef Rel14
|
||||
pthread_create( &proc->pthread_prach_br, attr_prach_br, ru_thread_prach_br, (void*)ru );
|
||||
#endif
|
||||
if (ru->is_slave == 1) pthread_create( &proc->pthread_synch, attr_synch, ru_thread_synch, (void*)ru);
|
||||
|
||||
|
||||
if ((ru->if_timing == synch_to_other) ||
|
||||
(ru->function == NGFI_RRU_IF5) ||
|
||||
(ru->function == NGFI_RRU_IF4p5))
|
||||
|
||||
|
||||
pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, ru_thread_asynch_rxtx, (void*)ru );
|
||||
|
||||
|
||||
(ru->function == NGFI_RRU_IF4p5)) pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, ru_thread_asynch_rxtx, (void*)ru );
|
||||
|
||||
snprintf( name, sizeof(name), "ru_thread_FH %d", ru->idx );
|
||||
pthread_setname_np( proc->pthread_FH, name );
|
||||
@@ -1563,6 +1645,7 @@ void configure_ru(int idx,
|
||||
RRU_config_t *config = (RRU_config_t *)arg;
|
||||
RRU_capabilities_t *capabilities = (RRU_capabilities_t*)arg;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
LOG_I(PHY, "Received capabilities from RRU %d\n",idx);
|
||||
|
||||
@@ -1588,6 +1671,13 @@ void configure_ru(int idx,
|
||||
LOG_I(PHY,"REMOTE_IF4p5: prach_FrequOffset %d, prach_ConfigIndex %d\n",
|
||||
config->prach_FreqOffset[0],config->prach_ConfigIndex[0]);
|
||||
|
||||
#ifdef Rel14
|
||||
for (i=0;i<4;i++) {
|
||||
config->emtc_prach_CElevel_enable[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i];
|
||||
config->emtc_prach_FreqOffset[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i];
|
||||
config->emtc_prach_ConfigIndex[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
// take antenna capabilities of RRU
|
||||
ru->nb_tx = capabilities->nb_tx[0];
|
||||
@@ -1621,6 +1711,13 @@ void configure_rru(int idx,
|
||||
config->prach_FreqOffset[0],config->prach_ConfigIndex[0]);
|
||||
ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset = config->prach_FreqOffset[0];
|
||||
ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex = config->prach_ConfigIndex[0];
|
||||
#ifdef Rel14
|
||||
for (int i=0;i<4;i++) {
|
||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] = config->emtc_prach_CElevel_enable[0][i];
|
||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i] = config->emtc_prach_FreqOffset[0][i];
|
||||
ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i] = config->emtc_prach_ConfigIndex[0][i];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
init_frame_parms(&ru->frame_parms,1);
|
||||
|
||||
Reference in New Issue
Block a user