Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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
Michael Black
OpenXG UE
Commits
829c687f
Commit
829c687f
authored
Jul 22, 2016
by
Sandeep Kumar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eNB tx working
parent
a35fb287
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
72 additions
and
93 deletions
+72
-93
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+72
-93
No files found.
targets/RT/USER/lte-enb.c
View file @
829c687f
...
@@ -496,7 +496,7 @@ static void* eNB_thread_rxtx( void* param ) {
...
@@ -496,7 +496,7 @@ static void* eNB_thread_rxtx( void* param ) {
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc
\n
"
);
LOG_E
(
PHY
,
"[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc
\n
"
);
exit_fun
(
"nothing to add"
);
exit_fun
(
"nothing to add"
);
break
;
break
;
}
}
}
else
if
(
PHY_vars_eNB_g
[
0
][
proc
->
CC_id
]
->
node_function
==
NGFI_RRU_IF4
)
{
}
else
if
(
PHY_vars_eNB_g
[
0
][
proc
->
CC_id
]
->
node_function
==
NGFI_RRU_IF4
)
{
/// **** recv_IF4 of txdataF from RCC **** ///
/// **** recv_IF4 of txdataF from RCC **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
...
@@ -604,10 +604,8 @@ static void* eNB_thread_rxtx( void* param ) {
...
@@ -604,10 +604,8 @@ static void* eNB_thread_rxtx( void* param ) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0
+
(
proc
->
subframe_rx
&
1
),
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0
+
(
proc
->
subframe_rx
&
1
),
0
);
printf
(
"Exiting eNB thread RXn_TXnp4
\n
"
);
printf
(
"Exiting eNB thread RXn_TXnp4
\n
"
);
eNB_thread_rxtx_status
=
0
;
eNB_thread_rxtx_status
=
0
;
return
&
eNB_thread_rxtx_status
;
return
&
eNB_thread_rxtx_status
;
}
}
...
@@ -679,7 +677,6 @@ static void* eNB_thread_asynch_rx( void* param ) {
...
@@ -679,7 +677,6 @@ static void* eNB_thread_asynch_rx( void* param ) {
prach_rx
=
0
;
prach_rx
=
0
;
do
{
// Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
do
{
// Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
recv_IF4
(
eNB
,
&
frame_rx
,
&
subframe_rx
,
&
packet_type
,
&
symbol_number
);
recv_IF4
(
eNB
,
&
frame_rx
,
&
subframe_rx
,
&
packet_type
,
&
symbol_number
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
0
);
...
@@ -690,10 +687,7 @@ static void* eNB_thread_asynch_rx( void* param ) {
...
@@ -690,10 +687,7 @@ static void* eNB_thread_asynch_rx( void* param ) {
}
else
if
(
packet_type
==
IF4_PRACH
)
{
}
else
if
(
packet_type
==
IF4_PRACH
)
{
// wake up thread for PRACH RX
// wake up thread for PRACH RX
prach_rx
=
1
;
prach_rx
=
1
;
}
}
}
while
(
(
symbol_mask
!=
symbol_mask_full
)
&&
(
prach_rx
==
0
));
}
while
(
(
symbol_mask
!=
symbol_mask_full
)
&&
(
prach_rx
==
0
));
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
first_rx
==
0
)
{
...
@@ -732,16 +726,12 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -732,16 +726,12 @@ static void* eNB_thread_FH( void* param ) {
int
i
;
int
i
;
int
prach_rx
;
int
prach_rx
;
uint16_t
packet_type
;
uint16_t
packet_type
;
uint32_t
symbol_number
=
0
;
uint32_t
symbol_number
=
0
;
uint32_t
symbol_mask
,
symbol_mask_full
;
uint32_t
symbol_mask
,
symbol_mask_full
;
int
subframe
=
proc
->
subframe_rx
;
int
subframe
=
0
,
frame
=
0
;
int
frame
=
proc
->
frame_rx
;
wait
.
tv_sec
=
0
;
wait
.
tv_sec
=
0
;
wait
.
tv_nsec
=
5000000L
;
wait
.
tv_nsec
=
5000000L
;
...
@@ -835,7 +825,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -835,7 +825,7 @@ static void* eNB_thread_FH( void* param ) {
exit_fun
(
"Error getting thread priority"
);
exit_fun
(
"Error getting thread priority"
);
}
}
LOG_I
(
HW
,
"[SCHED][eNB]
RX
thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s
\n
"
,
sched_getcpu
(),
gettid
(),
LOG_I
(
HW
,
"[SCHED][eNB]
FH
thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s
\n
"
,
sched_getcpu
(),
gettid
(),
(
policy
==
SCHED_FIFO
)
?
"SCHED_FIFO"
:
(
policy
==
SCHED_FIFO
)
?
"SCHED_FIFO"
:
(
policy
==
SCHED_RR
)
?
"SCHED_RR"
:
(
policy
==
SCHED_RR
)
?
"SCHED_RR"
:
(
policy
==
SCHED_OTHER
)
?
"SCHED_OTHER"
:
(
policy
==
SCHED_OTHER
)
?
"SCHED_OTHER"
:
...
@@ -849,7 +839,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -849,7 +839,7 @@ static void* eNB_thread_FH( void* param ) {
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
// wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads
// wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads
printf
(
"waiting for sync (eNB_thread_
rx_common
)
\n
"
);
printf
(
"waiting for sync (eNB_thread_
FH
)
\n
"
);
pthread_mutex_lock
(
&
sync_mutex
);
pthread_mutex_lock
(
&
sync_mutex
);
while
(
sync_var
<
0
)
while
(
sync_var
<
0
)
...
@@ -892,76 +882,75 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -892,76 +882,75 @@ static void* eNB_thread_FH( void* param ) {
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
if
(
oai_exit
)
break
;
if
(
oai_exit
)
break
;
// This case is for synchronization to another thread
if
((
eNB
->
node_timing
==
synch_to_other
)
&&
if
((
eNB
->
node_timing
==
synch_to_other
)
&&
((
eNB
->
node_function
==
NGFI_RRU_IF4
)
||
((
eNB
->
node_function
==
NGFI_RCC_IF4
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF5
)
||
(
eNB
->
node_function
==
eNodeB_3GPP_BBU
)))
{
(
eNB
->
node_function
==
eNodeB_3GPP
)))
{
// This case is for synchronization to another thread
//wait for event
//wait for event
// how long should we wait here, for MOBIPASS this could be long
// how long should we wait here, for MOBIPASS this could be long
// if (pthread_mutex_timedlock(&proc->mutex_FH,&wait) != 0) {
// if (pthread_mutex_timedlock(&proc->mutex_FH,&wait) != 0) {
if
(
pthread_mutex_lock
(
&
proc
->
mutex_FH
)
!=
0
)
{
if
(
pthread_mutex_lock
(
&
proc
->
mutex_FH
)
!=
0
)
{
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for FH
\n
"
);
LOG_E
(
PHY
,
"[SCHED][eNB] error locking mutex for FH
\n
"
);
exit_fun
(
"error locking mutex"
);
exit_fun
(
"error locking mutex"
);
break
;
break
;
}
}
while
(
proc
->
instance_cnt_FH
<
0
)
{
while
(
proc
->
instance_cnt_FH
<
0
)
{
// most of the time the thread is waiting here
// most of the time the thread is waiting here
// proc->instance_cnt_prach is -1
// proc->instance_cnt_prach is -1
pthread_cond_wait
(
&
proc
->
cond_FH
,
&
proc
->
mutex_FH
);
// this unlocks mutex_rxtx while waiting and then locks it again
pthread_cond_wait
(
&
proc
->
cond_FH
,
&
proc
->
mutex_FH
);
// this unlocks mutex_rxtx while waiting and then locks it again
}
}
proc
->
instance_cnt_FH
++
;
proc
->
instance_cnt_FH
++
;
}
}
// Remaining cases are all for synchronization on FH interface
// Remaining cases are all for synchronization on FH interface
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
((
eNB
->
node_function
==
NGFI_RRU_IF4
)
||
((
eNB
->
node_function
==
NGFI_RRU_IF4
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF5
)
||
(
eNB
->
node_function
==
NGFI_RRU_IF5
)
||
(
eNB
->
node_function
==
eNodeB_3GPP
)))
{
// acquisition from RF
(
eNB
->
node_function
==
eNodeB_3GPP
)))
{
// acquisition from RF
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
rxp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
rxdata
[
0
][
i
][
subframe
*
fp
->
samples_per_tti
];
rxp
[
i
]
=
(
void
*
)
&
eNB
->
common_vars
.
rxdata
[
0
][
i
][
subframe
*
fp
->
samples_per_tti
];
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ
,
1
);
// sanitycheck
if
(
subframe
==
9
)
{
if
(
subframe
==
9
)
{
subframe
=
0
;
subframe
=
0
;
frame
++
;
frame
++
;
frame
&=
1023
;
frame
&=
1023
;
}
else
{
}
else
{
subframe
++
;
subframe
++
;
}
}
rxs
=
eNB
->
rfdevice
.
trx_read_func
(
&
eNB
->
rfdevice
,
rxs
=
eNB
->
rfdevice
.
trx_read_func
(
&
eNB
->
rfdevice
,
&
proc
->
timestamp_rx
,
&
proc
->
timestamp_rx
,
rxp
,
rxp
,
fp
->
samples_per_tti
,
fp
->
samples_per_tti
,
fp
->
nb_antennas_rx
);
fp
->
nb_antennas_rx
);
proc
->
frame_rx
=
(
proc
->
timestamp_rx
/
(
fp
->
samples_per_tti
*
10
))
&
1023
;
proc
->
frame_rx
=
(
proc
->
timestamp_rx
/
(
fp
->
samples_per_tti
*
10
))
&
1023
;
proc
->
subframe_rx
=
(
proc
->
timestamp_rx
/
fp
->
samples_per_tti
)
%
10
;
proc
->
subframe_rx
=
(
proc
->
timestamp_rx
/
fp
->
samples_per_tti
)
%
10
;
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
subframe_rx
!=
subframe
){
if
(
proc
->
subframe_rx
!=
subframe
){
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)
\n
"
,
proc
->
subframe_rx
,
subframe
);
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)
\n
"
,
proc
->
subframe_rx
,
subframe
);
exit_fun
(
"Exiting"
);
exit_fun
(
"Exiting"
);
}
}
if
(
proc
->
frame_rx
!=
frame
)
{
if
(
proc
->
frame_rx
!=
frame
)
{
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)
\n
"
,
proc
->
frame_rx
,
frame
);
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)
\n
"
,
proc
->
frame_rx
,
frame
);
exit_fun
(
"Exiting"
);
exit_fun
(
"Exiting"
);
}
}
}
else
{
}
else
{
proc
->
first_rx
=
0
;
proc
->
first_rx
=
0
;
frame
=
proc
->
frame_rx
;
subframe
=
proc
->
subframe_rx
;
}
}
//
printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe);
//printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
...
@@ -974,7 +963,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -974,7 +963,7 @@ static void* eNB_thread_FH( void* param ) {
}
// node_timing==synch_to_ext_device && node_function == RRU || eNodeB
}
// node_timing==synch_to_ext_device && node_function == RRU || eNodeB
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
(
eNB
->
node_function
==
eNodeB_3GPP_BBU
))
{
// acquisition from IF
(
eNB
->
node_function
==
eNodeB_3GPP_BBU
))
{
// acquisition from IF
/// **** recv_IF5 of rxdata from RRH **** ///
/// **** recv_IF5 of rxdata from RRH **** ///
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5
,
1
);
recv_IF5
(
eNB
,
&
proc
->
timestamp_rx
,
proc
->
subframe_rx
,
IF5_RRH_GW_UL
);
recv_IF5
(
eNB
,
&
proc
->
timestamp_rx
,
proc
->
subframe_rx
,
IF5_RRH_GW_UL
);
...
@@ -982,30 +971,30 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -982,30 +971,30 @@ static void* eNB_thread_FH( void* param ) {
proc
->
frame_rx
=
(
proc
->
timestamp_rx
/
(
fp
->
samples_per_tti
*
10
))
&
1023
;
proc
->
frame_rx
=
(
proc
->
timestamp_rx
/
(
fp
->
samples_per_tti
*
10
))
&
1023
;
proc
->
subframe_rx
=
(
proc
->
timestamp_rx
/
fp
->
samples_per_tti
)
%
10
;
proc
->
subframe_rx
=
(
proc
->
timestamp_rx
/
fp
->
samples_per_tti
)
%
10
;
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
subframe_rx
!=
subframe
){
if
(
proc
->
subframe_rx
!=
subframe
){
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)
\n
"
,
proc
->
subframe_rx
,
subframe
);
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)
\n
"
,
proc
->
subframe_rx
,
subframe
);
//exit_fun("Exiting");
exit_fun
(
"Exiting"
);
}
}
if
(
proc
->
frame_rx
!=
frame
)
{
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)
\n
"
,
proc
->
frame_rx
,
frame
);
if
(
proc
->
frame_rx
!=
frame
)
{
//exit_fun("Exiting");
LOG_E
(
PHY
,
"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)
\n
"
,
proc
->
frame_rx
,
frame
);
}
exit_fun
(
"Exiting"
);
}
}
else
{
}
else
{
proc
->
first_rx
=
0
;
proc
->
first_rx
=
0
;
}
}
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB
,
proc
->
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB
,
proc
->
subframe_rx
);
}
// eNodeB_3GPP_BBU && node_timing == synch_to_ext_device
}
// eNodeB_3GPP_BBU && node_timing == synch_to_ext_device
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
else
if
((
eNB
->
node_timing
==
synch_to_ext_device
)
&&
(
eNB
->
node_function
==
NGFI_RCC_IF4
))
{
(
eNB
->
node_function
==
NGFI_RCC_IF4
))
{
/// **** recv_IF4 of rxdataF from RRU **** ///
/// **** recv_IF4 of rxdataF from RRU **** ///
/// **** recv_IF4 of rxsigF from RRU **** ///
/// **** recv_IF4 of rxsigF from RRU **** ///
// get frame/subframe information from IF4 interface
// timed loop (200 us)
// timed loop (200 us)
symbol_number
=
0
;
symbol_number
=
0
;
...
@@ -1014,7 +1003,6 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1014,7 +1003,6 @@ static void* eNB_thread_FH( void* param ) {
prach_rx
=
0
;
prach_rx
=
0
;
do
{
// Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
do
{
// Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
1
);
recv_IF4
(
eNB
,
&
proc
->
frame_rx
,
&
proc
->
subframe_rx
,
&
packet_type
,
&
symbol_number
);
recv_IF4
(
eNB
,
&
proc
->
frame_rx
,
&
proc
->
subframe_rx
,
&
packet_type
,
&
symbol_number
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4
,
0
);
...
@@ -1025,10 +1013,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1025,10 +1013,7 @@ static void* eNB_thread_FH( void* param ) {
}
else
if
(
packet_type
==
IF4_PRACH
)
{
}
else
if
(
packet_type
==
IF4_PRACH
)
{
// wake up thread for PRACH RX
// wake up thread for PRACH RX
prach_rx
=
1
;
prach_rx
=
1
;
}
}
}
while
(
(
symbol_mask
!=
symbol_mask_full
)
&&
(
prach_rx
==
0
));
}
while
(
(
symbol_mask
!=
symbol_mask_full
)
&&
(
prach_rx
==
0
));
if
(
proc
->
first_rx
==
0
)
{
if
(
proc
->
first_rx
==
0
)
{
...
@@ -1047,7 +1032,6 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1047,7 +1032,6 @@ static void* eNB_thread_FH( void* param ) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS
,
proc
->
timestamp_rx
&
0xffffffff
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB
,
proc
->
frame_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB
,
proc
->
subframe_rx
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB
,
proc
->
subframe_rx
);
}
// node_timing == synch_to_externs, node_function = NGFI_IF4
}
// node_timing == synch_to_externs, node_function = NGFI_IF4
else
{
// should not get here
else
{
// should not get here
...
@@ -1061,10 +1045,11 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1061,10 +1045,11 @@ static void* eNB_thread_FH( void* param ) {
// wake up slave FH thread
// wake up slave FH thread
// lock the FH mutex and make sure the thread is ready
// lock the FH mutex and make sure the thread is ready
if
(
pthread_mutex_timedlock
(
&
slave_proc
->
mutex_FH
,
&
wait
)
!=
0
)
{
if
(
pthread_mutex_timedlock
(
&
slave_proc
->
mutex_FH
,
&
wait
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)
\n
"
,
proc
->
CC_id
,
slave_proc
->
CC_id
);
LOG_E
(
PHY
,
"[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)
\n
"
,
proc
->
CC_id
,
slave_proc
->
CC_id
);
exit_fun
(
"error locking mutex_rxtx"
);
exit_fun
(
"error locking mutex_rxtx"
);
break
;
break
;
}
}
int
cnt_slave
=
++
slave_proc
->
instance_cnt_FH
;
int
cnt_slave
=
++
slave_proc
->
instance_cnt_FH
;
slave_proc
->
frame_rx
=
proc
->
frame_rx
;
slave_proc
->
frame_rx
=
proc
->
frame_rx
;
slave_proc
->
subframe_rx
=
proc
->
subframe_rx
;
slave_proc
->
subframe_rx
=
proc
->
subframe_rx
;
...
@@ -1073,16 +1058,16 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1073,16 +1058,16 @@ static void* eNB_thread_FH( void* param ) {
pthread_mutex_unlock
(
&
slave_proc
->
mutex_FH
);
pthread_mutex_unlock
(
&
slave_proc
->
mutex_FH
);
if
(
cnt_slave
==
0
)
{
if
(
cnt_slave
==
0
)
{
// the thread was presumably waiting where it should and can now be woken up
// the thread was presumably waiting where it should and can now be woken up
if
(
pthread_cond_signal
(
&
slave_proc
->
cond_FH
)
!=
0
)
{
if
(
pthread_cond_signal
(
&
slave_proc
->
cond_FH
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d
\n
"
,
proc
->
CC_id
,
slave_proc
->
CC_id
);
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d
\n
"
,
proc
->
CC_id
,
slave_proc
->
CC_id
);
exit_fun
(
"ERROR pthread_cond_signal"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
break
;
break
;
}
}
}
else
{
}
else
{
LOG_W
(
PHY
,
"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)
\n
"
,
slave_proc
->
frame_rx
,
slave_proc
->
CC_id
,
cnt_slave
);
LOG_W
(
PHY
,
"[eNB] Frame %d, FH CC_id %d thread busy!! (cnt_rxtx %i)
\n
"
,
slave_proc
->
frame_rx
,
slave_proc
->
CC_id
,
cnt_slave
);
exit_fun
(
"TX thread busy"
);
exit_fun
(
"TX thread busy"
);
break
;
break
;
}
}
}
}
...
@@ -1102,7 +1087,7 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1102,7 +1087,7 @@ static void* eNB_thread_FH( void* param ) {
// We have just received and processed the common part of a subframe, say n.
// 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
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// transmitted timestamp of the next TX slot (first).
// transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_pe
x
r_frame) was n*samples_per_tti,
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti,
// we want to generate subframe (n+3), so TS_tx = TX_rx+3*samples_per_tti,
// and proc->subframe_tx = proc->subframe_rx+3
// and proc->subframe_tx = proc->subframe_rx+3
proc_rxtx
->
timestamp_tx
=
proc
->
timestamp_rx
+
(
4
*
fp
->
samples_per_tti
);
proc_rxtx
->
timestamp_tx
=
proc
->
timestamp_rx
+
(
4
*
fp
->
samples_per_tti
);
...
@@ -1124,14 +1109,13 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1124,14 +1109,13 @@ static void* eNB_thread_FH( void* param ) {
LOG_W
(
PHY
,
"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)
\n
"
,
proc_rxtx
->
frame_tx
,
cnt_rxtx
);
LOG_W
(
PHY
,
"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)
\n
"
,
proc_rxtx
->
frame_tx
,
cnt_rxtx
);
exit_fun
(
"TX thread busy"
);
exit_fun
(
"TX thread busy"
);
break
;
break
;
}
}
stop_meas
(
&
softmodem_stats_rxtx_sf
);
stop_meas
(
&
softmodem_stats_rxtx_sf
);
#ifdef DEADLINE_SCHEDULER
#ifdef DEADLINE_SCHEDULER
if
(
opp_enabled
){
if
(
opp_enabled
){
if
(
softmodem_stats_rxtx_sf
.
diff_now
/
(
cpuf
)
>
attr
.
sched_runtime
){
if
(
softmodem_stats_rxtx_sf
.
diff_now
/
(
cpuf
)
>
attr
.
sched_runtime
)
{
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB
,
(
softmodem_stats_rxtx_sf
.
diff_now
/
cpuf
-
attr
.
sched_runtime
)
/
1000000
.
0
);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RXTX_ENB
,
(
softmodem_stats_rxtx_sf
.
diff_now
/
cpuf
-
attr
.
sched_runtime
)
/
1000000
.
0
);
}
}
}
}
#endif // DEADLINE_SCHEDULER
#endif // DEADLINE_SCHEDULER
...
@@ -1152,7 +1136,6 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1152,7 +1136,6 @@ static void* eNB_thread_FH( void* param ) {
}
}
printf
(
"Exiting FH thread
\n
"
);
printf
(
"Exiting FH thread
\n
"
);
eNB_thread_FH_status
=
0
;
eNB_thread_FH_status
=
0
;
return
&
eNB_thread_FH_status
;
return
&
eNB_thread_FH_status
;
...
@@ -1167,8 +1150,6 @@ static void* eNB_thread_FH( void* param ) {
...
@@ -1167,8 +1150,6 @@ static void* eNB_thread_FH( void* param ) {
static
void
*
eNB_thread_prach
(
void
*
param
)
{
static
void
*
eNB_thread_prach
(
void
*
param
)
{
static
int
eNB_thread_prach_status
;
static
int
eNB_thread_prach_status
;
eNB_proc_t
*
proc
=
(
eNB_proc_t
*
)
param
;
eNB_proc_t
*
proc
=
(
eNB_proc_t
*
)
param
;
PHY_VARS_eNB
*
eNB
=
PHY_vars_eNB_g
[
0
][
proc
->
CC_id
];
PHY_VARS_eNB
*
eNB
=
PHY_vars_eNB_g
[
0
][
proc
->
CC_id
];
...
@@ -1315,10 +1296,8 @@ static void* eNB_thread_prach( void* param ) {
...
@@ -1315,10 +1296,8 @@ static void* eNB_thread_prach( void* param ) {
}
}
}
}
printf
(
"Exiting eNB thread PRACH
\n
"
);
printf
(
"Exiting eNB thread PRACH
\n
"
);
eNB_thread_prach_status
=
0
;
eNB_thread_prach_status
=
0
;
return
&
eNB_thread_prach_status
;
return
&
eNB_thread_prach_status
;
}
}
...
...
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