Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ZhouShuya
OpenXG-RAN
Commits
38e9231a
Commit
38e9231a
authored
Nov 02, 2018
by
magounak
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
adding ru_state at ru_thread_tx for RU_mask_tx
parent
85b6f018
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
43 additions
and
24 deletions
+43
-24
common/utils/LOG/vcd_signal_dumper.c
common/utils/LOG/vcd_signal_dumper.c
+2
-0
common/utils/LOG/vcd_signal_dumper.h
common/utils/LOG/vcd_signal_dumper.h
+2
-0
common/utils/T/T_defs.h
common/utils/T/T_defs.h
+1
-1
common/utils/T/T_messages.txt
common/utils/T/T_messages.txt
+10
-0
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+18
-14
targets/RT/USER/lte-ru.c
targets/RT/USER/lte-ru.c
+10
-9
No files found.
common/utils/LOG/vcd_signal_dumper.c
View file @
38e9231a
...
...
@@ -87,6 +87,8 @@ const char* eurecomVariablesNames[] = {
"subframe_number_if4p5_south_in"
,
"frame_number_if4p5_south_in"
,
"ic_enb"
,
"l1_proc_ic"
,
"l1_proc_tx_ic"
,
"runtime_TX_eNB"
,
"runtime_RX_eNB"
,
"frame_number_TX0_UE"
,
...
...
common/utils/LOG/vcd_signal_dumper.h
View file @
38e9231a
...
...
@@ -64,6 +64,8 @@ typedef enum {
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_IF4P5_SOUTH_IN
,
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_IF4P5_SOUTH_IN
,
VCD_SIGNAL_DUMPER_VARIABLES_IC_ENB
,
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC
,
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC
,
VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB
,
VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB
,
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE
,
...
...
common/utils/T/T_defs.h
View file @
38e9231a
...
...
@@ -44,7 +44,7 @@ typedef struct {
#define VCD_NUM_FUNCTIONS (218)
/* number of VCD variables (to be kept up to date! see in T_messages.txt) */
#define VCD_NUM_VARIABLES (13
7
)
/*(136)*//*(128)*/
#define VCD_NUM_VARIABLES (13
9
)
/*(136)*//*(128)*/
/* first VCD function (to be kept up to date! see in T_messages.txt) */
#define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
...
...
common/utils/T/T_messages.txt
View file @
38e9231a
...
...
@@ -1076,6 +1076,16 @@ ID = VCD_VARIABLE_IC_ENB
GROUP = ALL:VCD:ENB:VCD_VARIABLE
FORMAT = ulong,value
VCD_NAME = ic_enb
ID = VCD_VARIABLE_L1_PROC_IC
DESC = VCD variable L1_PROC_IC
GROUP = ALL:VCD:ENB:VCD_VARIABLE
FORMAT = ulong,value
VCD_NAME = l1_proc_ic
ID = VCD_VARIABLE_L1_PROC_TX_IC
DESC = VCD variable L1_PROC_TX_IC
GROUP = ALL:VCD:ENB:VCD_VARIABLE
FORMAT = ulong,value
VCD_NAME = l1_proc_tx_ic
ID = VCD_VARIABLE_RUNTIME_TX_ENB
DESC = VCD variable RUNTIME_TX_ENB
GROUP = ALL:VCD:ENB:VCD_VARIABLE
...
...
targets/RT/USER/lte-enb.c
View file @
38e9231a
...
...
@@ -174,7 +174,6 @@ extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
static
inline
int
rxtx
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
char
*
thread_name
)
{
start_meas
(
&
softmodem_stats_rxtx_sf
);
LOG_I
(
PHY
,
"ENTERED rxtx
\n
"
);
if
(
nfapi_mode
==
1
)
{
// I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
...
...
@@ -284,7 +283,7 @@ LOG_I(PHY,"ENTERED rxtx\n");
stop_meas
(
&
softmodem_stats_rxtx_sf
);
LOG_
I
(
PHY
,
"%s() Exit proc[rx:%d%d tx:%d%d]
\n
"
,
__FUNCTION__
,
proc
->
frame_rx
,
proc
->
subframe_rx
,
proc
->
frame_tx
,
proc
->
subframe_tx
);
LOG_
D
(
PHY
,
"%s() Exit proc[rx:%d%d tx:%d%d]
\n
"
,
__FUNCTION__
,
proc
->
frame_rx
,
proc
->
subframe_rx
,
proc
->
frame_tx
,
proc
->
subframe_tx
);
LOG_D
(
PHY
,
"rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld "
,
softmodem_stats_rxtx_sf
.
p_time
,
nfapi_meas
.
p_time
,
...
...
@@ -358,7 +357,9 @@ static void* L1_thread_tx(void* param) {
phy_procedures_eNB_TX
(
eNB
,
proc
,
1
);
pthread_mutex_lock
(
&
proc
->
mutex
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC
,
proc
->
instance_cnt
);
proc
->
instance_cnt
=
-
1
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC
,
proc
->
instance_cnt
);
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
proc
->
cond
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
...
...
@@ -434,8 +435,9 @@ static void* L1_thread( void* param ) {
{
if
(
rxtx
(
eNB
,
proc
,
thread_name
)
<
0
)
break
;
}
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC
,
proc
->
instance_cnt
);
if
(
release_thread
(
&
proc
->
mutex
,
&
proc
->
instance_cnt
,
thread_name
)
<
0
)
break
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC
,
proc
->
instance_cnt
);
if
(
nfapi_mode
!=
2
){
if
(
get_thread_parallel_conf
()
==
PARALLEL_RU_L1_TRX_SPLIT
)
wakeup_tx
(
eNB
);
else
if
(
get_thread_parallel_conf
()
==
PARALLEL_RU_L1_SPLIT
)
...
...
@@ -489,7 +491,7 @@ int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
wait
.
tv_nsec
=
5000000L
;
LTE_DL_FRAME_PARMS
*
fp
;
LOG_
I
(
PHY
,
"Entered
wakeup_txfh %d.%d IC_RU = %d
\n
"
,
proc
->
frame_tx
,
proc
->
subframe_tx
,
proc
->
instance_cnt_RUs
);
LOG_
D
(
PHY
,
"
wakeup_txfh %d.%d IC_RU = %d
\n
"
,
proc
->
frame_tx
,
proc
->
subframe_tx
,
proc
->
instance_cnt_RUs
);
if
(
wait_on_condition
(
&
proc
->
mutex_RUs
,
&
proc
->
cond_RUs
,
&
proc
->
instance_cnt_RUs
,
"wakeup_txfh"
)
<
0
)
{
LOG_E
(
PHY
,
"Frame %d, subframe %d: TX FH not ready
\n
"
,
proc
->
frame_tx
,
proc
->
subframe_tx
);
return
(
-
1
);
...
...
@@ -528,8 +530,10 @@ int wakeup_txfh(L1_rxtx_proc_t *proc,PHY_VARS_eNB *eNB) {
ru_proc
->
timestamp_tx
=
proc
->
timestamp_tx
;
ru_proc
->
subframe_tx
=
proc
->
subframe_tx
;
ru_proc
->
frame_tx
=
proc
->
frame_tx
;
LOG_I
(
PHY
,
"wakeup_txfh: ru_proc->subframe_tx %d
\n
"
,
ru_proc
->
subframe_tx
);
// the thread can now be woken up
LOG_D
(
PHY
,
"wakeup_txfh: ru_proc->subframe_tx %d
\n
"
,
ru_proc
->
subframe_tx
);
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
ru_proc
->
cond_eNBs
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
...
...
@@ -554,7 +558,6 @@ int wakeup_tx(PHY_VARS_eNB *eNB) {
struct
timespec
wait
;
wait
.
tv_sec
=
0
;
wait
.
tv_nsec
=
5000000L
;
LOG_I
(
PHY
,
"ENTERED wakeup_tx
\n
"
);
if
(
pthread_mutex_timedlock
(
&
L1_proc_tx
->
mutex
,
&
wait
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] ERROR locking mutex for eNB L1_thread_tx
\n
"
);
...
...
@@ -564,9 +567,9 @@ int wakeup_tx(PHY_VARS_eNB *eNB) {
while
(
L1_proc_tx
->
instance_cnt
==
0
){
//check if the previous has finished
pthread_cond_wait
(
&
L1_proc_tx
->
cond
,
&
L1_proc_tx
->
mutex
);
}
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC
,
L1_proc_tx
->
instance_cnt
);
L1_proc_tx
->
instance_cnt
=
0
;
// set go for the current one
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_TX_IC
,
L1_proc_tx
->
instance_cnt
);
L1_proc_tx
->
subframe_rx
=
L1_proc
->
subframe_rx
;
L1_proc_tx
->
frame_rx
=
L1_proc
->
frame_rx
;
...
...
@@ -593,8 +596,6 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
L1_rxtx_proc_t
*
L1_proc
=&
proc
->
L1_proc
;
LTE_DL_FRAME_PARMS
*
fp
=
&
eNB
->
frame_parms
;
LOG_I
(
PHY
,
"ENTERED wakeup_rxtx
\n
"
);
int
i
;
struct
timespec
wait
;
...
...
@@ -613,9 +614,10 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
exit_fun
(
"error locking mutex_rxtx"
);
return
(
-
1
);
}
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC
,
L1_proc
->
instance_cnt
);
++
L1_proc
->
instance_cnt
;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_L1_PROC_IC
,
L1_proc
->
instance_cnt
);
// We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// transmitted timestamp of the next TX slot (first).
...
...
@@ -627,7 +629,9 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
L1_proc
->
subframe_rx
=
ru_proc
->
subframe_rx
;
L1_proc
->
frame_tx
=
(
L1_proc
->
subframe_rx
>
(
9
-
sf_ahead
))
?
(
L1_proc
->
frame_rx
+
1
)
&
1023
:
L1_proc
->
frame_rx
;
L1_proc
->
subframe_tx
=
(
L1_proc
->
subframe_rx
+
sf_ahead
)
%
10
;
LOG_I
(
PHY
,
"wakeup_rxtx: L1_proc->subframe_rx %d, L1_proc->subframe_tx %d
\n
"
,
L1_proc
->
subframe_rx
,
L1_proc
->
subframe_tx
);
LOG_D
(
PHY
,
"wakeup_rxtx: L1_proc->subframe_rx %d, L1_proc->subframe_tx %d
\n
"
,
L1_proc
->
subframe_rx
,
L1_proc
->
subframe_tx
);
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
L1_proc
->
cond
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread
\n
"
);
...
...
targets/RT/USER/lte-ru.c
View file @
38e9231a
...
...
@@ -155,11 +155,10 @@ static inline void fh_if5_south_out(RU_t *ru) {
// southbound IF4p5 fronthaul
static
inline
void
fh_if4p5_south_out
(
RU_t
*
ru
)
{
if
(
ru
==
RC
.
ru
[
0
])
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST
,
ru
->
proc
.
timestamp_tx
&
0xffffffff
);
LOG_I
(
PHY
,
"ENTERED fh_if4p5_south_out Sending IF4p5 for frame %d subframe %d ru %d
\n
"
,
ru
->
proc
.
frame_tx
,
ru
->
proc
.
subframe_tx
,
ru
->
idx
);
if
(
subframe_select
(
&
ru
->
frame_parms
,
ru
->
proc
.
subframe_tx
)
!=
SF_UL
)
{
send_IF4p5
(
ru
,
ru
->
proc
.
frame_tx
,
ru
->
proc
.
subframe_tx
,
IF4p5_PDLFFT
);
ru
->
south_out_cnt
++
;
LOG_I
(
PHY
,
"south_out_cnt %d
\n
"
,
ru
->
south_out_cnt
);
printf
(
"south_out_cnt %d, frame %d, subframe %d
\n
"
,
ru
->
south_out_cnt
,
ru
->
proc
.
frame_tx
,
ru
->
proc
.
subframe_tx
);
}
/*if (ru == RC.ru[0] || ru == RC.ru[1]) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU+ru->idx, ru->proc.frame_tx );
...
...
@@ -211,7 +210,6 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) {
RU_proc_t
*
proc
=
&
ru
->
proc
;
int
f
,
sf
;
LOG_I
(
PHY
,
"ENTERED fh_if4p5_south_in
\n
"
);
uint16_t
packet_type
;
uint32_t
symbol_number
=
0
;
uint32_t
symbol_mask_full
;
...
...
@@ -220,7 +218,7 @@ LOG_I(PHY,"ENTERED fh_if4p5_south_in\n");
symbol_mask_full
=
(
1
<<
fp
->
ul_symbols_in_S_subframe
)
-
1
;
else
symbol_mask_full
=
(
1
<<
fp
->
symbols_per_tti
)
-
1
;
LOG_I
(
PHY
,
"fh_if4p5_south_in: RU %d, frame %d, subframe %d, ru %d
\n
"
,
ru
->
idx
,
*
frame
,
*
subframe
,
ru
->
idx
);
//printf(
"fh_if4p5_south_in: RU %d, frame %d, subframe %d, ru %d\n",ru->idx,*frame,*subframe,ru->idx);
AssertFatal
(
proc
->
symbol_mask
[
*
subframe
]
==
0
,
"rx_fh_if4p5: proc->symbol_mask[%d] = %x
\n
"
,
*
subframe
,
proc
->
symbol_mask
[
*
subframe
]);
do
{
recv_IF4p5
(
ru
,
&
f
,
&
sf
,
&
packet_type
,
&
symbol_number
);
...
...
@@ -1145,7 +1143,7 @@ void wakeup_L1s(RU_t *ru) {
RU_proc_t
*
ruproc
=
&
ru
->
proc
;
struct
timespec
t
;
LOG_
I
(
PHY
,
"wakeup_L1s (num %d) for RU %d ru->eNB_top:%p
\n
"
,
ru
->
num_eNB
,
ru
->
idx
,
ru
->
eNB_top
);
LOG_
D
(
PHY
,
"wakeup_L1s (num %d) for RU %d ru->eNB_top:%p
\n
"
,
ru
->
num_eNB
,
ru
->
idx
,
ru
->
eNB_top
);
// call eNB function directly
...
...
@@ -1508,7 +1506,7 @@ static void* ru_thread_tx( void* param ) {
if
(
oai_exit
)
break
;
LOG_
I
(
PHY
,
"ru_thread_tx (ru %d): Waiting for TX processing
\n
"
,
ru
->
idx
);
LOG_
D
(
PHY
,
"ru_thread_tx (ru %d): Waiting for TX processing
\n
"
,
ru
->
idx
);
// wait until eNBs are finished subframe RX n and TX n+4
wait_on_condition
(
&
proc
->
mutex_eNBs
,
&
proc
->
cond_eNBs
,
&
proc
->
instance_cnt_eNBs
,
"ru_thread_tx"
);
LOG_I
(
PHY
,
"ru_thread_tx (ru %d): Woken from condition
\n
"
,
ru
->
idx
);
...
...
@@ -1544,19 +1542,22 @@ static void* ru_thread_tx( void* param ) {
eNB
->
Mod_id
,
eNB_proc
->
frame_rx
,
eNB_proc
->
subframe_rx
,
ru
->
idx
,
eNB
->
num_RU
,
eNB_proc
->
RU_mask_tx
);
eNB_proc
->
RU_mask_tx
|=
(
1
<<
j
);
}
else
if
(
eNB
->
RU_list
[
j
]
->
state
==
RU_SYNC
){
eNB_proc
->
RU_mask_tx
|=
(
1
<<
j
);
}
}
if
(
eNB_proc
->
RU_mask_tx
!=
(
1
<<
eNB
->
num_RU
)
-
1
)
{
// not all RUs have provided their information so return
LOG_I
(
PHY
,
"Not all RUs have provided their info (mask = %d)
\n
"
,
eNB_proc
->
RU_mask_tx
);
printf
(
"Not all RUs have provided their info (mask = %d)
\n
"
,
eNB_proc
->
RU_mask_tx
);
pthread_mutex_unlock
(
&
eNB_proc
->
mutex_RU_tx
);
}
else
{
// all RUs TX are finished so send the ready signal to eNB processing
LOG_I
(
PHY
,
"All RUs TX are finished. Ready to send wakeup signal to eNB processing
\n
"
);
printf
(
"All RUs TX are finished. Ready to send wakeup signal to eNB processing
\n
"
);
eNB_proc
->
RU_mask_tx
=
0
;
pthread_mutex_unlock
(
&
eNB_proc
->
mutex_RU_tx
);
pthread_mutex_lock
(
&
L1_proc
->
mutex_RUs
);
L1_proc
->
instance_cnt_RUs
=
0
;
LOG_I
(
PHY
,
"ru_thread_tx send signal to L1_thread_tx with (mask = %d)
\n
"
,
eNB_proc
->
RU_mask_tx
);
printf
(
"ru_thread_tx send signal to L1_thread_tx with (mask = %d)
\n
"
,
eNB_proc
->
RU_mask_tx
);
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
L1_proc
->
cond_RUs
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment