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
常顺宇
OpenXG-RAN
Commits
9fa001c3
Commit
9fa001c3
authored
Apr 05, 2018
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
prevent UL_indication from overlapping with tx process which cause the drop
parent
846268fd
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
71 additions
and
57 deletions
+71
-57
common/utils/T/T_defs.h
common/utils/T/T_defs.h
+2
-2
common/utils/system.c
common/utils/system.c
+1
-0
openair1/PHY/LTE_TRANSPORT/dci.c
openair1/PHY/LTE_TRANSPORT/dci.c
+3
-2
openair1/PHY/LTE_TRANSPORT/dci_tools.c
openair1/PHY/LTE_TRANSPORT/dci_tools.c
+1
-0
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+5
-5
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+2
-2
openair1/SCHED/fapi_l1.c
openair1/SCHED/fapi_l1.c
+3
-2
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+13
-1
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+2
-2
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+30
-33
targets/RT/USER/lte-ru.c
targets/RT/USER/lte-ru.c
+9
-8
No files found.
common/utils/T/T_defs.h
View file @
9fa001c3
...
...
@@ -8,10 +8,10 @@
#define T_MAX_ARGS 16
/* maximum size of a message - increase if needed */
#define T_BUFFER_MAX (10
24*64)
#define T_BUFFER_MAX (10
)
/*(1024*64)*/
/* size of the local cache for messages (must be pow(2,something)) */
#define T_CACHE_SIZE (
8192 * 2)
#define T_CACHE_SIZE (
1)
/*(8192 * 2)*/
/* maximum number of bytes a message can contain */
#ifdef T_SEND_TIME
...
...
common/utils/system.c
View file @
9fa001c3
...
...
@@ -148,6 +148,7 @@ int background_system(char *command)
void
start_background_system
(
void
)
{
return
;
int
p
[
2
];
pid_t
son
;
...
...
openair1/PHY/LTE_TRANSPORT/dci.c
View file @
9fa001c3
...
...
@@ -2265,7 +2265,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
y
[
0
]
=
&
yseq0
[
0
];
y
[
1
]
=
&
yseq1
[
0
];
#if
0
#if
1
// reset all bits to <NIL>, here we set <NIL> elements as 2
// memset(e, 2, DCI_BITS_MAX);
// here we interpret NIL as a random QPSK sequence. That makes power estimation easier.
...
...
@@ -2276,7 +2276,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
/* clear all bits, the above code may generate too much false detections
* (not sure about this, to be checked somehow)
*/
memset
(
e
,
0
,
DCI_BITS_MAX
);
//
memset(e, 0, DCI_BITS_MAX);
e_ptr
=
e
;
...
...
@@ -2298,6 +2298,7 @@ uint8_t generate_dci_top(uint8_t num_pdcch_symbols,
#endif
if
(
dci_alloc
[
i
].
firstCCE
>=
0
)
{
//printf("generate DCI .%d rnti %d length %d\n", subframe, dci_alloc[i].rnti, dci_alloc[i].dci_length);
e_ptr
=
generate_dci0
(
dci_alloc
[
i
].
dci_pdu
,
e
+
(
72
*
dci_alloc
[
i
].
firstCCE
),
dci_alloc
[
i
].
dci_length
,
...
...
openair1/PHY/LTE_TRANSPORT/dci_tools.c
View file @
9fa001c3
...
...
@@ -2183,6 +2183,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t
#endif
//printf("DCI %d.%d rnti %d harq %d TBS %d\n", frame, subframe, rel8->rnti, rel8->harq_process, dlsch0_harq->TBS);
#if T_TRACER
if
(
dlsch0
->
active
)
T
(
T_ENB_PHY_DLSCH_UE_DCI
,
T_INT
(
0
),
T_INT
(
frame
),
T_INT
(
subframe
),
...
...
openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
View file @
9fa001c3
...
...
@@ -646,9 +646,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
}
}
if
(
C
>=
8
&&
get_nprocs
()
>
8
&&
codingw
)
//one main three worker
{
encoding_return
=
if
(
C
>=
8
&&
get_nprocs
()
>=
16
&&
codingw
)
//one main three worker
{
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
a
,
num_pdcch_symbols
,
...
...
@@ -663,8 +663,8 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
te_wakeup_stats1
,
i_stats
,
3
);
}
else
if
(
C
>=
6
&&
get_nprocs
()
>=
6
&&
codingw
)
//one main two worker
}
else
if
(
C
>=
6
&&
get_nprocs
()
>=
8
&&
codingw
)
//one main two worker
{
encoding_return
=
dlsch_encoding_2threads
(
eNB
,
...
...
openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
View file @
9fa001c3
...
...
@@ -794,11 +794,11 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
int
ulsch_decoding_data_all
(
PHY_VARS_eNB
*
eNB
,
int
UE_id
,
int
harq_pid
,
int
llr8_flag
)
{
int
ret
=
0
;
if
(
codingw
)
/*
if(codingw)
{
ret = ulsch_decoding_data_2thread(eNB,UE_id,harq_pid,llr8_flag);
}
else
else
*/
{
ret
=
ulsch_decoding_data
(
eNB
,
UE_id
,
harq_pid
,
llr8_flag
);
}
...
...
openair1/SCHED/fapi_l1.c
View file @
9fa001c3
...
...
@@ -201,8 +201,9 @@ void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_pr
dlsch0_harq
->
pdsch_start
=
eNB
->
pdcch_vars
[
subframe
&
1
].
num_pdcch_symbols
;
if
(
dlsch0_harq
->
round
==
0
)
{
//get pointer to SDU if this a new SDU
AssertFatal
(
sdu
!=
NULL
,
"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]
\n
"
,
frame
,
subframe
,
//if (sdu==NULL) printf("dlsch0_harq %p harq %d\n", dlsch0_harq, harq_pid);
AssertFatal
(
sdu
!=
NULL
,
"sdu==%d, NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]
\n
"
,
*
sdu
,
frame
,
subframe
,
proc
->
frame_tx
,
proc
->
subframe_tx
,
rel8
->
rnti
,
UE_id
,
harq_pid
,
dl_config_pdu
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
,
dlsch0_harq
->
round
,
dlsch0_harq
->
frame
,
dlsch0_harq
->
subframe
,
dlsch0_harq
->
pdu
,
dlsch0_harq
->
mcs
,
dlsch0_harq
->
ndi
,
dlsch0_harq
->
pdsch_start
);
if
(
rel8
->
rnti
!=
0xFFFF
)
LOG_D
(
PHY
,
"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d
\n
"
,
...
...
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
9fa001c3
...
...
@@ -359,6 +359,11 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
&
eNB
->
dlsch_turbo_encoding_wakeup_stats1
,
&
eNB
->
dlsch_interleaving_stats
);
stop_meas
(
&
eNB
->
dlsch_encoding_stats
);
//////////////////////////////////////////////////*******************************************
if
(
eNB
->
dlsch_encoding_stats
.
diff_now
>
500
*
3000
&&
opp_enabled
==
1
)
{
print_meas_now
(
&
eNB
->
dlsch_encoding_stats
,
"total coding"
,
stderr
);
}
// 36-211
start_meas
(
&
eNB
->
dlsch_scrambling_stats
);
dlsch_scrambling
(
fp
,
...
...
@@ -394,6 +399,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
dlsch
->
active
=
0
;
dlsch_harq
->
round
++
;
//printf(" dlsch_harq ++ %p %d.%d harq %d rnti %d\n", dlsch_harq, frame, subframe, harq_pid, dlsch->rnti);
LOG_D
(
PHY
,
"Generating DLSCH/PDSCH dlsch_harq[round:%d]
\n
"
,
dlsch_harq
->
round
);
}
...
...
@@ -513,7 +519,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
//LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n", num_pdcch_symbols, num_dci, eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX
,
1
);
//printf("//////////************before generate_dci_top UL %d.%d TX %d.%d \n", ul_frame, ul_subframe, frame, subframe);
if
(
nfapi_mode
==
0
||
nfapi_mode
==
1
)
{
generate_dci_top
(
num_pdcch_symbols
,
num_dci
,
...
...
@@ -1641,6 +1647,9 @@ void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,
// release DLSCH if needed
if
(
ulsch_harq
->
o_ACK
[
i
]
==
1
)
release_harq
(
eNB
,
UE_id
,
i
,
frame
,
subframe
,
0xffff
);
//if (ulsch_harq->o_ACK[i] != 1)
//printf("got NACK %d.%d rnti %d harq %d\n", frame, subframe, rnti, eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10]);
#if T_TRACER
/* TODO: get correct harq pid */
if
(
ulsch_harq
->
o_ACK
[
i
]
!=
1
)
...
...
@@ -1735,6 +1744,9 @@ void fill_uci_harq_indication(PHY_VARS_eNB *eNB,
// release DLSCH if needed
if
(
harq_ack
[
0
]
==
1
)
release_harq
(
eNB
,
UE_id
,
0
,
frame
,
subframe
,
0xffff
);
//if (harq_ack[0] != 1)
//printf("got NACK %d.%d rnti %d harq %d\n", frame, subframe, uci->rnti, eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10]);
#if T_TRACER
if
(
harq_ack
[
0
]
!=
1
)
T
(
T_ENB_PHY_DLSCH_UE_NACK
,
T_INT
(
0
),
T_INT
(
frame
),
T_INT
(
subframe
),
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
9fa001c3
...
...
@@ -928,7 +928,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
eNB
->
DL_req
[
CC_id
].
sfn_sf
=
frameP
<<
4
|
subframeP
;
eNB
->
DL_req
[
CC_id
].
header
.
message_id
=
NFAPI_DL_CONFIG_REQUEST
;
//printf("doing retransmission for fill_nfapi_dlsch_config frame %d subframe %d rnti = %d harq_pid = %d\n", frameP, subframeP, rnti, harq_pid);
fill_nfapi_dlsch_config
(
eNB
,
dl_req
,
TBS
,
-
1
/* retransmission, no pdu_index */
,
rnti
,
0
,
// type 0 allocation from 7.1.6 in 36.213
...
...
@@ -1455,7 +1455,7 @@ schedule_ue_spec(module_id_t module_idP,slice_id_t slice_idP,
"physicalConfigDedicated is NULL
\n
"
);
AssertFatal
(
UE_list
->
UE_template
[
CC_id
][
UE_id
].
physicalConfigDedicated
->
pdsch_ConfigDedicated
!=
NULL
,
"physicalConfigDedicated->pdsch_ConfigDedicated is NULL
\n
"
);
//printf("mac DL transmition with frame = %d, subframe = %d, rnti = %d, pdu_index = %p\n", frameP, subframeP, rnti, eNB->pdu_index);
fill_nfapi_dlsch_config
(
eNB
,
dl_req
,
TBS
,
eNB
->
pdu_index
[
CC_id
],
rnti
,
0
,
// type 0 allocation from 7.1.6 in 36.213
0
,
// virtual_resource_block_assignment_flag, unused here
0
,
// resource_block_coding, to be filled in later
...
...
targets/RT/USER/lte-enb.c
View file @
9fa001c3
...
...
@@ -224,6 +224,12 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER
,
1
);
if
(
wait_on_condition
(
&
proc
[
1
].
mutex_rxtx
,
&
proc
[
1
].
cond_rxtx
,
&
proc
[
1
].
pipe_ready
,
"wakeup_tx"
)
<
0
)
{
LOG_E
(
PHY
,
"Frame %d, subframe %d: TX1 not ready
\n
"
,
proc
[
1
].
frame_rx
,
proc
[
1
].
subframe_rx
);
return
(
-
1
);
}
if
(
release_thread
(
&
proc
[
1
].
mutex_rxtx
,
&
proc
[
1
].
pipe_ready
,
"wakeup_tx"
)
<
0
)
return
(
-
1
);
pthread_mutex_lock
(
&
eNB
->
UL_INFO_mutex
);
eNB
->
UL_INFO
.
frame
=
proc
->
frame_rx
;
...
...
@@ -237,17 +243,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER
,
0
);
if
(
oai_exit
)
return
(
-
1
);
if
(
get_nprocs
()
>=
8
){
wakeup_tx
(
eNB
,
eNB
->
proc
.
ru_proc
);
}
else
if
(
get_nprocs
()
>=
4
){
phy_procedures_eNB_TX
(
eNB
,
proc
,
no_relay
,
NULL
,
1
);
wakeup_txfh
(
proc
,
eNB
->
proc
.
ru_proc
);
}
else
{
phy_procedures_eNB_TX
(
eNB
,
proc
,
no_relay
,
NULL
,
1
);
}
if
(
get_nprocs
()
<=
4
)
phy_procedures_eNB_TX
(
eNB
,
proc
,
no_relay
,
NULL
,
1
);
stop_meas
(
&
softmodem_stats_rxtx_sf
);
...
...
@@ -314,14 +310,6 @@ static void* tx_thread(void* param) {
while
(
!
oai_exit
)
{
pthread_mutex_lock
(
&
proc
->
mutex_rxtx
);
proc
->
pipe_ready
++
;
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
proc
->
cond_rxtx
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
}
pthread_mutex_unlock
(
&
proc
->
mutex_rxtx
);
if
(
wait_on_condition
(
&
proc
->
mutex_rxtx
,
&
proc
->
cond_rxtx
,
&
proc
->
instance_cnt_rxtx
,
thread_name
)
<
0
)
break
;
if
(
oai_exit
)
break
;
...
...
@@ -336,8 +324,16 @@ static void* tx_thread(void* param) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB
,
proc
->
frame_rx
);
phy_procedures_eNB_TX
(
eNB
,
proc
,
no_relay
,
NULL
,
1
);
if
(
release_thread
(
&
proc
->
mutex_rxtx
,
&
proc
->
instance_cnt_rxtx
,
thread_name
)
<
0
)
break
;
if
(
release_thread
(
&
proc
->
mutex_rxtx
,
&
proc
->
instance_cnt_rxtx
,
thread_name
)
<
0
)
break
;
pthread_mutex_lock
(
&
proc
->
mutex_rxtx
);
proc
->
pipe_ready
++
;
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
proc
->
cond_rxtx
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
}
pthread_mutex_unlock
(
&
proc
->
mutex_rxtx
);
wakeup_txfh
(
proc
,
eNB_proc
->
ru_proc
);
}
...
...
@@ -376,14 +372,6 @@ static void* eNB_thread_rxtx( void* param ) {
while
(
!
oai_exit
)
{
pthread_mutex_lock
(
&
proc
->
mutex_rxtx
);
proc
->
pipe_ready
++
;
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
proc
->
cond_rxtx
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
}
pthread_mutex_unlock
(
&
proc
->
mutex_rxtx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0
+
(
proc
->
subframe_rx
&
1
),
0
);
T
(
T_ENB_MASTER_TICK
,
T_INT
(
0
),
T_INT
(
proc
->
frame_rx
),
T_INT
(
proc
->
subframe_rx
));
...
...
@@ -407,6 +395,20 @@ static void* eNB_thread_rxtx( void* param ) {
}
if
(
release_thread
(
&
proc
->
mutex_rxtx
,
&
proc
->
instance_cnt_rxtx
,
thread_name
)
<
0
)
break
;
pthread_mutex_lock
(
&
proc
->
mutex_rxtx
);
proc
->
pipe_ready
++
;
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
proc
->
cond_rxtx
)
!=
0
)
{
LOG_E
(
PHY
,
"[eNB] ERROR pthread_cond_signal for eNB TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
}
pthread_mutex_unlock
(
&
proc
->
mutex_rxtx
);
if
(
get_nprocs
()
>=
8
)
wakeup_tx
(
eNB
,
eNB
->
proc
.
ru_proc
);
else
if
(
get_nprocs
()
>
4
)
{
phy_procedures_eNB_TX
(
eNB
,
proc
,
no_relay
,
NULL
,
1
);
wakeup_txfh
(
proc
,
eNB
->
proc
.
ru_proc
);
}
}
// while !oai_exit
...
...
@@ -521,11 +523,6 @@ int wakeup_tx(PHY_VARS_eNB *eNB,RU_proc_t *ru_proc) {
wait
.
tv_nsec
=
5000000L
;
if
(
wait_on_condition
(
&
proc_rxtx1
->
mutex_rxtx
,
&
proc_rxtx1
->
cond_rxtx
,
&
proc_rxtx1
->
pipe_ready
,
"wakeup_tx"
)
<
0
)
{
LOG_E
(
PHY
,
"Frame %d, subframe %d: TX1 not ready
\n
"
,
proc_rxtx1
->
frame_rx
,
proc_rxtx1
->
subframe_rx
);
return
(
-
1
);
}
if
(
release_thread
(
&
proc_rxtx1
->
mutex_rxtx
,
&
proc_rxtx1
->
pipe_ready
,
"wakeup_tx"
)
<
0
)
return
(
-
1
);
if
(
proc_rxtx1
->
instance_cnt_rxtx
==
0
)
{
LOG_E
(
PHY
,
"Frame %d, subframe %d: TX1 thread busy, dropping
\n
"
,
proc_rxtx1
->
frame_rx
,
proc_rxtx1
->
subframe_rx
);
...
...
targets/RT/USER/lte-ru.c
View file @
9fa001c3
...
...
@@ -1181,7 +1181,7 @@ void wakeup_eNBs(RU_t *ru) {
LOG_D
(
PHY
,
"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p
\n
"
,
ru
->
num_eNB
,
ru
->
idx
,
ru
->
eNB_top
);
if
(
ru
->
num_eNB
==
1
&&
ru
->
eNB_top
!=
0
&&
get_nprocs
()
<
4
)
{
if
(
ru
->
num_eNB
==
1
&&
ru
->
eNB_top
!=
0
&&
get_nprocs
()
<
=
4
)
{
// call eNB function directly
char
string
[
20
];
...
...
@@ -1556,9 +1556,13 @@ static void* ru_thread( void* param ) {
pthread_cond_signal
(
&
RC
.
ru_cond
);
pthread_mutex_unlock
(
&
RC
.
ru_mutex
);
wait_sync
(
"ru_thread"
);
pthread_mutex_lock
(
&
proc
->
mutex_FH1
);
proc
->
instance_cnt_FH1
=
0
;
pthread_mutex_unlock
(
&
proc
->
mutex_FH1
);
pthread_cond_signal
(
&
proc
->
cond_FH1
);
wait_sync
(
"ru_thread"
);
if
(
!
emulate_rf
){
// Start RF device if any
...
...
@@ -1584,10 +1588,7 @@ static void* ru_thread( void* param ) {
if
((
ru
->
is_slave
)
&&
(
ru
->
if_south
==
LOCAL_RF
))
do_ru_synch
(
ru
);
}
pthread_mutex_lock
(
&
proc
->
mutex_FH1
);
proc
->
instance_cnt_FH1
=
0
;
pthread_mutex_unlock
(
&
proc
->
mutex_FH1
);
pthread_cond_signal
(
&
proc
->
cond_FH1
);
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
...
...
@@ -1645,7 +1646,7 @@ static void* ru_thread( void* param ) {
// wakeup all eNB processes waiting for this RU
if
(
ru
->
num_eNB
>
0
)
wakeup_eNBs
(
ru
);
if
(
get_nprocs
()
<
4
){
if
(
get_nprocs
()
<
=
4
){
// do TX front-end processing if needed (precoding and/or IDFTs)
if
(
ru
->
feptx_prec
)
ru
->
feptx_prec
(
ru
);
...
...
@@ -1859,7 +1860,7 @@ void init_RU_proc(RU_t *ru) {
if
(
emulate_rf
)
pthread_create
(
&
proc
->
pthread_emulateRF
,
attr_emulateRF
,
emulatedRF_thread
,
(
void
*
)
proc
);
if
(
get_nprocs
()
>
=
4
)
if
(
get_nprocs
()
>
4
)
pthread_create
(
&
proc
->
pthread_FH1
,
attr_FH1
,
ru_thread_tx
,
(
void
*
)
ru
);
if
(
ru
->
function
==
NGFI_RRU_IF4p5
)
{
...
...
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