Commit 9d9c09dd authored by Raymond Knopp's avatar Raymond Knopp

debugging with AW2S RRU. Added statistics for ULSCH/UCI in PHY and MAC.

parent cdd470fc
...@@ -2863,6 +2863,8 @@ add_executable(lte-softmodem ...@@ -2863,6 +2863,8 @@ add_executable(lte-softmodem
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${GTPU_need_ITTI} ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE} ${XFORMSINTERFACE_SOURCE}
${T_SOURCE} ${T_SOURCE}
...@@ -2904,6 +2906,8 @@ add_executable(ocp-enb ...@@ -2904,6 +2906,8 @@ add_executable(ocp-enb
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${GTPU_need_ITTI} ${GTPU_need_ITTI}
${XFORMSINTERFACE_SOURCE} ${XFORMSINTERFACE_SOURCE}
${T_SOURCE} ${T_SOURCE}
...@@ -2970,6 +2974,8 @@ add_executable(lte-uesoftmodem ...@@ -2970,6 +2974,8 @@ add_executable(lte-uesoftmodem
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${OPENAIR_DIR}/common/utils/utils.c ${OPENAIR_DIR}/common/utils/utils.c
${OPENAIR_DIR}/common/utils/system.c ${OPENAIR_DIR}/common/utils/system.c
${OPENAIR_DIR}/common/utils/lte/ue_power.c
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
${XFORMSINTERFACE_SOURCE} ${XFORMSINTERFACE_SOURCE}
${T_SOURCE} ${T_SOURCE}
${CONFIG_SOURCES} ${CONFIG_SOURCES}
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file ue_power.c
* \brief Routines to compute UE TX power according to 36.213
* \author R. Knopp, F. Kaltenberger
* \date 2020
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
* \note
* \warning
*/
#include <stdint.h>
#include <stdio.h>
#include "PHY/defs_eNB.h"
#include "PHY/TOOLS/dB_routines.h"
extern int16_t hundred_times_delta_TF[100];
extern uint16_t hundred_times_log10_NPRB[100];
int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, int ncp, uint8_t use_srs)
{
/// The payload + CRC size in bits, "B"
uint32_t B;
/// Number of code segments
uint32_t C;
/// Number of "small" code segments
uint32_t Cminus;
/// Number of "large" code segments
uint32_t Cplus;
/// Number of bits in "small" code segments (<6144)
uint32_t Kminus;
/// Number of bits in "large" code segments (<6144)
uint32_t Kplus;
/// Total number of bits across all segments
uint32_t sumKr;
/// Number of "Filler" bits
uint32_t F;
// num resource elements
uint32_t num_re=0.0;
// num symbols
uint32_t num_symb=0.0;
/// effective spectral efficiency of the PUSCH
uint32_t MPR_x100=0;
/// beta_offset
uint16_t beta_offset_pusch_x8=8;
/// delta mcs
float delta_mcs=0.0;
/// bandwidth factor
float bw_factor=0.0;
B= tbs+24;
lte_segmentation(NULL,
NULL,
B,
&C,
&Cplus,
&Cminus,
&Kplus,
&Kminus,
&F);
sumKr = Cminus*Kminus + Cplus*Kplus;
num_symb = 12-(ncp<<1)-(use_srs==0?0:1);
num_re = num_symb * nb_rb * 12;
if (num_re == 0)
return(0);
MPR_x100 = 100*sumKr/num_re;
if (control_only == 1 )
beta_offset_pusch_x8=8; // fixme
//(beta_offset_pusch_x8=ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? ue->ulsch[eNB_id]->beta_offset_cqi_times8:8;
// if deltamcs_enabledm
delta_mcs = ((hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch_x8)>>3))/100.0);
bw_factor = (norm!=0) ? 0 : (hundred_times_log10_NPRB[nb_rb-1]/100.0);
LOG_D(PHY,"estimated ue tx power %d (num_re %d, sumKr %d, mpr_x100 %d, delta_mcs %f, bw_factor %f)\n",
(int16_t)ceil(delta_mcs + bw_factor), num_re, sumKr, MPR_x100, delta_mcs, bw_factor);
return (int16_t)ceil(delta_mcs + bw_factor);
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file ue_power.h
* \brief support routines used in MAC and PHY
* \author R. Knopp, F. Kaltenberger
* \date 2020
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
* \note
* \warning
*/
int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs);
...@@ -118,8 +118,8 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -118,8 +118,8 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms,
int temp, i, aa, max_pos=0, max_val=0; int temp, i, aa, max_pos=0, max_val=0;
short Re,Im; short Re,Im;
uint8_t cyclic_shift = 0; // uint8_t cyclic_shift = 0;
int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size); int sync_pos = 0;//(frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size); AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size);
AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<3,"frame_parms->nb_antennas_rx %d not in [0,1]\n", AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<3,"frame_parms->nb_antennas_rx %d not in [0,1]\n",
...@@ -142,9 +142,5 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -142,9 +142,5 @@ int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms,
if (max_pos>frame_parms->ofdm_symbol_size/2) if (max_pos>frame_parms->ofdm_symbol_size/2)
max_pos = max_pos-frame_parms->ofdm_symbol_size; max_pos = max_pos-frame_parms->ofdm_symbol_size;
//#ifdef DEBUG_PHY
LOG_D(PHY,"max_pos = %d, sync_pos=%d\n",max_pos,sync_pos);
//#endif //DEBUG_PHY
return max_pos - sync_pos; return max_pos - sync_pos;
} }
...@@ -476,7 +476,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB, ...@@ -476,7 +476,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process;
((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index;
((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0; ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0;
// printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); LOG_D(PHY,"TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",rel8->mcs_1,rel8->resource_block_coding,rel8->redundancy_version_1,NPRB);
} else { } else {
dci_alloc->dci_length = sizeof_DCI1A_20MHz_FDD_t; dci_alloc->dci_length = sizeof_DCI1A_20MHz_FDD_t;
((DCI1A_20MHz_FDD_t *)dci_pdu)->type = 1; ((DCI1A_20MHz_FDD_t *)dci_pdu)->type = 1;
...@@ -535,7 +535,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB, ...@@ -535,7 +535,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
dlsch0->harq_mask |= (1 << rel8->harq_process); dlsch0->harq_mask |= (1 << rel8->harq_process);
if (rel8->rnti_type == 1) LOG_D(PHY,"DCI 1A: round %d, mcs %d, TBS %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,dlsch0_harq->TBS,rel8->resource_block_coding, if (rel8->rnti != SI_RNTI) LOG_I(PHY,"DCI 1A: round %d, mcs %d, TBS %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,dlsch0_harq->TBS,rel8->resource_block_coding,
rel8->redundancy_version_1,rel8->rnti,rel8->harq_process); rel8->redundancy_version_1,rel8->rnti,rel8->harq_process);
break; break;
......
...@@ -360,6 +360,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB, ...@@ -360,6 +360,7 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
proc->nbEncode=0; proc->nbEncode=0;
// if (hadlsch->Ndi == 1) { // this is a new packet // if (hadlsch->Ndi == 1) { // this is a new packet
if (hadlsch->round == 0) { // this is a new packet if (hadlsch->round == 0) { // this is a new packet
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
......
...@@ -2375,16 +2375,14 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, ...@@ -2375,16 +2375,14 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
for (l=num_pdcch_symbols; l<nsymb; l++) { for (l=num_pdcch_symbols; l<nsymb; l++) {
if (dlsch0 != NULL ) { if (dlsch0 != NULL ) {
#ifdef DEBUG_DLSCH_MODULATION LOG_D(PHY,"Generating DLSCH (num_pdcch_symb %d harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %x)\n",
LOG_I(PHY,"Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %d)\n", num_pdcch_symbols,harq_pid,
harq_pid,
dlsch0_harq->mimo_mode, dlsch0_harq->mimo_mode,
pmi2hex_2Ar2(dlsch0_harq->pmi_alloc), pmi2hex_2Ar2(dlsch0_harq->pmi_alloc),
mod_order0, mod_order0,
mod_order1, mod_order1,
rb_alloc[0] rb_alloc[0]
); );
#endif
} }
if (frame_parms->Ncp==0) { // normal prefix if (frame_parms->Ncp==0) { // normal prefix
......
...@@ -113,9 +113,6 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -113,9 +113,6 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 for PMCH x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 for PMCH
} }
#ifdef DEBUG_SCRAMBLING
printf("scrambling: i0 %d rnti %x, q %d, Ns %d, Nid_cell %d, G %d x2 %x\n",dlsch->i0,dlsch->rnti,q,Ns,frame_parms->Nid_cell, G, x2);
#endif
s = lte_gold_generic(&x1, &x2, 1); s = lte_gold_generic(&x1, &x2, 1);
for (n=0; n<(1+(G>>5)); n++) { for (n=0; n<(1+(G>>5)); n++) {
......
...@@ -1469,7 +1469,7 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16 ...@@ -1469,7 +1469,7 @@ void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16
// HYPOTHESIS: first packet per subframe has lowest timestamp of subframe // HYPOTHESIS: first packet per subframe has lowest timestamp of subframe
// should detect out of order and act accordingly .... // should detect out of order and act accordingly ....
AssertFatal(aid==0 || aid==1,"aid %d != 0 or 1\n",aid); AssertFatal(aid==0 || aid==1,"aid %d != 0 or 1\n",aid);
//LOG_I(PHY,"rxp[%d] %p, dest %p, offset %d (%lld,%lld)\n",aid,rxp[aid],rxp[aid]+(timestamp[packet_id]-timestamp[0]),(timestamp[packet_id]-timestamp[0]),timestamp[packet_id],timestamp[0]); LOG_D(PHY,"rxp[%d] %p, dest %p, offset %d (%lld,%lld)\n",aid,rxp[aid],rxp[aid]+(timestamp[packet_id]-timestamp[0]),(int)(timestamp[packet_id]-timestamp[0]),timestamp[packet_id],timestamp[0]);
memcpy((void*)(rxp[aid]+(timestamp[packet_id]-timestamp[0])), memcpy((void*)(rxp[aid]+(timestamp[packet_id]-timestamp[0])),
(void*)temp_rx, (void*)temp_rx,
spp_eth<<2); spp_eth<<2);
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "prach_extern.h" #include "prach_extern.h"
#include <openair1/PHY/LTE_TRANSPORT/transport_proto.h> #include <openair1/PHY/LTE_TRANSPORT/transport_proto.h>
#include <executables/split_headers.h> #include <executables/split_headers.h>
#include "common/utils/lte/prach_utils.h"
void rx_prach0(PHY_VARS_eNB *eNB, void rx_prach0(PHY_VARS_eNB *eNB,
RU_t *ru, RU_t *ru,
...@@ -112,7 +113,7 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -112,7 +113,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
prach_ConfigIndex = fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[ce_level]; prach_ConfigIndex = fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[ce_level];
Ncs_config = fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; Ncs_config = fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
restricted_set = fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag; restricted_set = fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag;
n_ra_prb = get_prach_prb_offset(fp,prach_ConfigIndex, n_ra_prb = get_prach_prb_offset(fp->frame_type,fp->tdd_config,fp->N_RB_UL,fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[ce_level],
fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],
tdd_mapindex,Nf); tdd_mapindex,Nf);
// update pointers to results for ce_level // update pointers to results for ce_level
...@@ -124,7 +125,7 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -124,7 +125,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
prach_ConfigIndex = fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; prach_ConfigIndex = fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
Ncs_config = fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; Ncs_config = fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
restricted_set = fp->prach_config_common.prach_ConfigInfo.highSpeedFlag; restricted_set = fp->prach_config_common.prach_ConfigInfo.highSpeedFlag;
n_ra_prb = get_prach_prb_offset(fp,prach_ConfigIndex, n_ra_prb = get_prach_prb_offset(fp->frame_type,fp->tdd_config,fp->N_RB_UL,fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset, fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,
tdd_mapindex,Nf); tdd_mapindex,Nf);
} }
...@@ -140,7 +141,7 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -140,7 +141,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
rxsigF = eNB->prach_vars_br.rxsigF[ce_level]; rxsigF = eNB->prach_vars_br.rxsigF[ce_level];
if (LOG_DEBUGFLAG(PRACH)) { if (LOG_DEBUGFLAG(PRACH)) {
if (((frame_prach)&1023) < 20) LOG_I(PHY, if (((frame_prach)&1023) < 20) LOG_D(PHY,
"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n", "PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n",
br_flag,ce_level,frame_prach,subframe, br_flag,ce_level,frame_prach,subframe,
fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],
...@@ -153,24 +154,24 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -153,24 +154,24 @@ void rx_prach0(PHY_VARS_eNB *eNB,
prachF = eNB->prach_vars.prachF; prachF = eNB->prach_vars.prachF;
rxsigF = eNB->prach_vars.rxsigF[0]; rxsigF = eNB->prach_vars.rxsigF[0];
if (LOG_DEBUGFLAG(PRACH)) { //if (LOG_DEBUGFLAG(PRACH)) {
if (((frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe, if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,
fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex); fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex);
} //}
} }
} else { } else {
if (br_flag == 1) { if (br_flag == 1) {
rxsigF = ru->prach_rxsigF_br[ce_level]; rxsigF = ru->prach_rxsigF_br[ce_level];
if (LOG_DEBUGFLAG(PRACH)) { if (LOG_DEBUGFLAG(PRACH)) {
if (((frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n",
br_flag,ce_level,frame_prach,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex); br_flag,ce_level,frame_prach,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex);
} }
} else { } else {
rxsigF = ru->prach_rxsigF[0]; rxsigF = ru->prach_rxsigF[0];
if (LOG_DEBUGFLAG(PRACH)) { if (LOG_DEBUGFLAG(PRACH)) {
if (((frame_prach)&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n",
subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex); subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex);
} }
} }
...@@ -299,11 +300,13 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -299,11 +300,13 @@ void rx_prach0(PHY_VARS_eNB *eNB,
case 6: case 6:
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_256,prach2,rxsigF[aa],1); dft(DFT_256,prach2,rxsigF[aa],1);
fft_size=256;
} else { } else {
dft(DFT_1536,prach2,rxsigF[aa],1); dft(DFT_1536,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1); dft(DFT_1536,prach2+3072,rxsigF[aa]+3072,1);
fft_size=1536;
} }
break; break;
...@@ -311,13 +314,14 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -311,13 +314,14 @@ void rx_prach0(PHY_VARS_eNB *eNB,
case 15: case 15:
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_256,prach2,rxsigF[aa],1); dft(DFT_256,prach2,rxsigF[aa],1);
fft_size=256;
} else { } else {
dft(DFT_3072,prach2,rxsigF[aa],1); dft(DFT_3072,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1); dft(DFT_3072,prach2+6144,rxsigF[aa]+6144,1);
} }
fft_size=3072;
break; break;
case 25: case 25:
...@@ -339,11 +343,13 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -339,11 +343,13 @@ void rx_prach0(PHY_VARS_eNB *eNB,
case 50: case 50:
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_2048,prach2,rxsigF[aa],1); dft(DFT_2048,prach2,rxsigF[aa],1);
fft_size=2048;
} else { } else {
dft(DFT_12288,prach2,rxsigF[aa],1); dft(DFT_12288,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1); dft(DFT_12288,prach2+24576,rxsigF[aa]+24576,1);
fft_size=12288;
} }
break; break;
...@@ -351,11 +357,13 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -351,11 +357,13 @@ void rx_prach0(PHY_VARS_eNB *eNB,
case 75: case 75:
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_3072,prach2,rxsigF[aa],1); dft(DFT_3072,prach2,rxsigF[aa],1);
fft_size=3072;
} else { } else {
dft(DFT_18432,prach2,rxsigF[aa],1); dft(DFT_18432,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1); dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1);
fft_size=18432;
} }
break; break;
...@@ -364,20 +372,24 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -364,20 +372,24 @@ void rx_prach0(PHY_VARS_eNB *eNB,
if (fp->threequarter_fs==0) { if (fp->threequarter_fs==0) {
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_4096,prach2,rxsigF[aa],1); dft(DFT_4096,prach2,rxsigF[aa],1);
fft_size=2048;
} else { } else {
dft(DFT_24576,prach2,rxsigF[aa],1); dft(DFT_24576,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1); dft(DFT_24576,prach2+49152,rxsigF[aa]+49152,1);
fft_size=24576;
} }
} else { } else {
if (prach_fmt == 4) { if (prach_fmt == 4) {
dft(DFT_3072,prach2,rxsigF[aa],1); dft(DFT_3072,prach2,rxsigF[aa],1);
fft_size=3072;
} else { } else {
dft(DFT_18432,prach2,rxsigF[aa],1); dft(DFT_18432,prach2,rxsigF[aa],1);
if (prach_fmt>1) if (prach_fmt>1)
dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1); dft(DFT_18432,prach2+36864,rxsigF[aa]+36864,1);
fft_size=18432;
} }
} }
...@@ -547,7 +559,6 @@ void rx_prach0(PHY_VARS_eNB *eNB, ...@@ -547,7 +559,6 @@ void rx_prach0(PHY_VARS_eNB *eNB,
} }
log2_ifft_size = 10; log2_ifft_size = 10;
fft_size = 6144;
if (new_dft == 1) { if (new_dft == 1) {
new_dft = 0; new_dft = 0;
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include "PHY/phy_extern.h" #include "PHY/phy_extern.h"
#include "PHY/phy_extern_ue.h" #include "PHY/phy_extern_ue.h"
#include "common/utils/LOG/vcd_signal_dumper.h" #include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/utils/lte/prach_utils.h"
uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419}; uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419};
uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case
...@@ -44,6 +44,9 @@ int16_t ru[2*839]; // quantized roots of unity ...@@ -44,6 +44,9 @@ int16_t ru[2*839]; // quantized roots of unity
uint32_t ZC_inv[839]; // multiplicative inverse for roots u uint32_t ZC_inv[839]; // multiplicative inverse for roots u
uint16_t du[838]; uint16_t du[838];
extern PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7];
/*
// This is table 5.7.1-4 from 36.211 // This is table 5.7.1-4 from 36.211
PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = { PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
// TDD Configuration Index 0 // TDD Configuration Index 0
...@@ -254,7 +257,7 @@ PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = { ...@@ -254,7 +257,7 @@ PRACH_TDD_PREAMBLE_MAP tdd_preamble_map[64][7] = {
} }
}; };
*/
uint16_t prach_root_sequence_map0_3[838] = { 129, 710, 140, 699, 120, 719, 210, 629, 168, 671, 84, 755, 105, 734, 93, 746, 70, 769, 60, 779, uint16_t prach_root_sequence_map0_3[838] = { 129, 710, 140, 699, 120, 719, 210, 629, 168, 671, 84, 755, 105, 734, 93, 746, 70, 769, 60, 779,
2, 837, 1, 838, 2, 837, 1, 838,
...@@ -377,7 +380,7 @@ uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index) { ...@@ -377,7 +380,7 @@ uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index) {
LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][0]->frame_parms; LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][0]->frame_parms;
return(tdd_preamble_map[fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][fp->tdd_config].map[tdd_map_index].f_ra); return(tdd_preamble_map[fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][fp->tdd_config].map[tdd_map_index].f_ra);
} }
/*
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type) { uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type) {
if (frame_type == FDD) // FDD if (frame_type == FDD) // FDD
return(prach_ConfigIndex>>4); return(prach_ConfigIndex>>4);
...@@ -556,14 +559,15 @@ int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex ...@@ -556,14 +559,15 @@ int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex
return(prach_mask); return(prach_mask);
} }
*/
int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, uint8_t subframe) { int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, uint8_t subframe) {
uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
int prach_mask = is_prach_subframe0(frame_parms, prach_ConfigIndex, frame, subframe); int prach_mask = is_prach_subframe0(frame_parms->tdd_config,frame_parms->frame_type, prach_ConfigIndex, frame, subframe);
for (int i=0; i<4; i++) { for (int i=0; i<4; i++) {
if (frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] == 1) if (frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] == 1)
prach_mask |= (is_prach_subframe0(frame_parms, frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i], prach_mask |= (is_prach_subframe0(frame_parms->tdd_config,frame_parms->frame_type, frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i],
frame, subframe) << (i+1)); frame, subframe) << (i+1));
} }
......
...@@ -74,17 +74,6 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id); ...@@ -74,17 +74,6 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index); uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index);
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t prach_ConfigIndex,
uint8_t n_ra_prboffset,
uint8_t tdd_mapindex, uint16_t Nf);
int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex,uint32_t frame, uint8_t subframe);
int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe); int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe);
......
This diff is collapsed.
...@@ -223,7 +223,9 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id); ...@@ -223,7 +223,9 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
@param frame_type 0-FDD, 1-TDD @param frame_type 0-FDD, 1-TDD
@returns 0-1 accordingly @returns 0-1 accordingly
*/ */
/*
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type); uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
*/
/*! /*!
\brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index \brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index
...@@ -306,12 +308,12 @@ void init_scrambling_lut(void); ...@@ -306,12 +308,12 @@ void init_scrambling_lut(void);
void init_unscrambling_lut(void); void init_unscrambling_lut(void);
/*
uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t prach_ConfigIndex, uint8_t prach_ConfigIndex,
uint8_t n_ra_prboffset, uint8_t n_ra_prboffset,
uint8_t tdd_mapindex, uint16_t Nf); uint8_t tdd_mapindex, uint16_t Nf);
*/
uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe); uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n); uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n);
...@@ -319,6 +321,6 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL); ...@@ -319,6 +321,6 @@ uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL);
void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2); void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2);
int16_t estimate_ue_tx_power(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs); int16_t estimate_ue_tx_power(int norm,uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs);
#endif #endif
...@@ -693,8 +693,6 @@ int16_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type); ...@@ -693,8 +693,6 @@ int16_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type);
int16_t find_uci(uint16_t rnti, int frame, int subframe, PHY_VARS_eNB *eNB,find_type_t type); int16_t find_uci(uint16_t rnti, int frame, int subframe, PHY_VARS_eNB *eNB,find_type_t type);
uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset); uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
......
...@@ -468,6 +468,35 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, ...@@ -468,6 +468,35 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
ulsch_harq->Nsymb_pusch, ulsch_harq->Nsymb_pusch,
nb_rb); nb_rb);
//#endif //#endif
eNB_SCH_STATS_t *stats=NULL;
int first_free=-1;
for (int i=0;i<NUMBER_OF_SCH_STATS_MAX;i++) {
if (eNB->ulsch_stats[i].rnti == 0 && first_free == -1) {
first_free = i;
stats=&eNB->ulsch_stats[i];
}
if (eNB->ulsch_stats[i].rnti == ulsch->rnti) {
stats=&eNB->ulsch_stats[i];
break;
}
}
if (stats) {
stats->rnti = ulsch->rnti;
stats->round_trials[ulsch_harq->round]++;
stats->frame=proc->frame_rx;
}
if (ulsch_harq->round == 0) {
if (stats) {
stats->current_Qm = Q_m;
stats->current_RI = 1;
stats->total_bytes_tx += ulsch_harq->TBS;
stats->current_TBS = ulsch_harq->TBS;
stats->current_G = ulsch_harq->G;
}
}
//if (ulsch_harq->round == 0) { // delete for RB shortage pattern //if (ulsch_harq->round == 0) { // delete for RB shortage pattern
// This is a new packet, so compute quantities regarding segmentation // This is a new packet, so compute quantities regarding segmentation
ulsch_harq->B = A+24; ulsch_harq->B = A+24;
...@@ -1086,3 +1115,42 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB, ...@@ -1086,3 +1115,42 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
ret = ulsch_decoding_data_all(eNB,proc, UE_id,harq_pid,llr8_flag); ret = ulsch_decoding_data_all(eNB,proc, UE_id,harq_pid,llr8_flag);
return(ret); return(ret);
} }
void dump_ulsch_stats(PHY_VARS_eNB *eNB,int frame) {
for (int i=0;i<NUMBER_OF_ULSCH_MAX;i++)
if (eNB->ulsch_stats[i].rnti>0) {
for (int aa=0;aa<eNB->frame_parms.nb_antennas_rx;aa++)
LOG_I(PHY,"ULSCH RNTI %x: ulsch_power[%d] %d, ulsch_noise_power[%d] %d\n",
eNB->ulsch_stats[i].rnti, aa,eNB->ulsch_stats[i].ulsch_power[aa],aa,eNB->ulsch_stats[i].ulsch_noise_power[aa]);
LOG_I(PHY,"ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d\n",
eNB->ulsch_stats[i].rnti,
eNB->ulsch_stats[i].round_trials[0],
(double)eNB->ulsch_stats[i].round_trials[1]/eNB->ulsch_stats[i].round_trials[0],
eNB->ulsch_stats[i].round_trials[1],
(double)eNB->ulsch_stats[i].round_trials[2]/eNB->ulsch_stats[i].round_trials[0],
eNB->ulsch_stats[i].round_trials[2],
(double)eNB->ulsch_stats[i].round_trials[3]/eNB->ulsch_stats[i].round_trials[0],
eNB->ulsch_stats[i].round_trials[3]);
LOG_I(PHY,"ULSCH RNTI %x: current_Qm %d, current_G %d, current_TBS %d, current_rate %f,current_RI %d, timing_offset %d, total_bytes RX/SCHED %d/%d\n",
eNB->ulsch_stats[i].rnti,
eNB->ulsch_stats[i].current_Qm,
eNB->ulsch_stats[i].current_G,
eNB->ulsch_stats[i].current_TBS,
(double)eNB->ulsch_stats[i].current_G/eNB->ulsch_stats[i].current_TBS,
eNB->ulsch_stats[i].current_RI,
eNB->ulsch_stats[i].timing_offset,
eNB->ulsch_stats[i].total_bytes_rx,
eNB->ulsch_stats[i].total_bytes_tx);
}
}
void clear_ulsch_stats(PHY_VARS_eNB *eNB) {
for (int i=0;i<NUMBER_OF_ULSCH_MAX;i++)
memset((void*)&eNB->ulsch_stats[i],0,sizeof(eNB->ulsch_stats[i]));
}
...@@ -1076,6 +1076,10 @@ void rx_ulsch(PHY_VARS_eNB *eNB, ...@@ -1076,6 +1076,10 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)/correction_factor; ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)/correction_factor;
LOG_D(PHY,"%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid, LOG_D(PHY,"%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid,
ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_times10(pusch_vars->ulsch_power[i])); ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_times10(pusch_vars->ulsch_power[i]));
pusch_vars->ulsch_noise_power[i]=0;
for (int rb=0;rb<ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;rb++)
pusch_vars->ulsch_noise_power[i]+=eNB->measurements.n0_subband_power[i][rb]/ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
LOG_D(PHY,"noise power[%d] %d\n",i,dB_fixed_times10(pusch_vars->ulsch_noise_power[i]));
} }
ulsch_channel_level(pusch_vars->drs_ch_estimates, ulsch_channel_level(pusch_vars->drs_ch_estimates,
......
...@@ -164,8 +164,10 @@ typedef struct { ...@@ -164,8 +164,10 @@ typedef struct {
/// - first index: rx antenna id [0..nb_antennas_rx[ /// - first index: rx antenna id [0..nb_antennas_rx[
/// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[
int32_t **ul_ch_magb; int32_t **ul_ch_magb;
/// measured RX power based on DRS /// measured RX power based on DMRS
int ulsch_power[2]; int ulsch_power[4];
/// measured RX power of noise
int ulsch_noise_power[4];
/// \brief llr values. /// \brief llr values.
/// - first index: ? [0..1179743] (hard coded) /// - first index: ? [0..1179743] (hard coded)
int16_t *llr; int16_t *llr;
...@@ -421,6 +423,42 @@ typedef struct { ...@@ -421,6 +423,42 @@ typedef struct {
int prach_I0; int prach_I0;
} PHY_MEASUREMENTS_eNB; } PHY_MEASUREMENTS_eNB;
typedef struct {
uint16_t rnti;
int frame;
int round_trials[8];
int total_bytes_tx;
int total_bytes_rx;
int current_G;
int current_TBS;
int current_Qm;
int current_mcs;
int current_RI;
int timing_offset;
int ulsch_power[4];
int ulsch_noise_power[4];
} eNB_SCH_STATS_t;
typedef struct {
uint16_t rnti;
int frame;
int pucch1_trials;
int pucch1_thres;
int current_pucch1_stat;
int pucch1_positive_SR;
int pucch1_low_stat[4];
int pucch1_high_stat[4];
int pucch1_phase;
int pucch1a_trials;
int current_pucch1a_stat_re;
int current_pucch1a_stat_im;
int pucch1ab_DTX;
int pucch1b_trials;
int current_pucch1b_stat_re;
int current_pucch1b_stat_im;
int pucch3_trials;
int current_pucch3_stat;
} eNB_UCI_STATS_t;
/// Top-level PHY Data Structure for eNB /// Top-level PHY Data Structure for eNB
typedef struct PHY_VARS_eNB_s { typedef struct PHY_VARS_eNB_s {
...@@ -591,7 +629,12 @@ typedef struct PHY_VARS_eNB_s { ...@@ -591,7 +629,12 @@ typedef struct PHY_VARS_eNB_s {
/// Information regarding TM5 /// Information regarding TM5
MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX]; MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
/// statistics for DLSCH measurement collection
eNB_SCH_STATS_t dlsch_stats[NUMBER_OF_SCH_STATS_MAX];
/// statistics for ULSCH measurement collection
eNB_SCH_STATS_t ulsch_stats[NUMBER_OF_SCH_STATS_MAX];
/// statis for UCI (PUCCH) measurement collection
eNB_UCI_STATS_t uci_stats[NUMBER_OF_SCH_STATS_MAX];
/// target_ue_dl_mcs : only for debug purposes /// target_ue_dl_mcs : only for debug purposes
uint32_t target_ue_dl_mcs; uint32_t target_ue_dl_mcs;
/// target_ue_ul_mcs : only for debug purposes /// target_ue_ul_mcs : only for debug purposes
......
...@@ -1086,72 +1086,5 @@ void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeri ...@@ -1086,72 +1086,5 @@ void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeri
} }
} }
// uint8_t eNB_id,uint8_t harq_pid, uint8_t UE_id,
int16_t estimate_ue_tx_power(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, lte_prefix_type_t ncp, uint8_t use_srs)
{
/// The payload + CRC size in bits, "B"
uint32_t B;
/// Number of code segments
uint32_t C;
/// Number of "small" code segments
uint32_t Cminus;
/// Number of "large" code segments
uint32_t Cplus;
/// Number of bits in "small" code segments (<6144)
uint32_t Kminus;
/// Number of bits in "large" code segments (<6144)
uint32_t Kplus;
/// Total number of bits across all segments
uint32_t sumKr;
/// Number of "Filler" bits
uint32_t F;
// num resource elements
uint32_t num_re=0.0;
// num symbols
uint32_t num_symb=0.0;
/// effective spectral efficiency of the PUSCH
uint32_t MPR_x100=0;
/// beta_offset
uint16_t beta_offset_pusch_x8=8;
/// delta mcs
float delta_mcs=0.0;
/// bandwidth factor
float bw_factor=0.0;
B= tbs+24;
lte_segmentation(NULL,
NULL,
B,
&C,
&Cplus,
&Cminus,
&Kplus,
&Kminus,
&F);
sumKr = Cminus*Kminus + Cplus*Kplus;
num_symb = 12-(ncp<<1)-(use_srs==0?0:1);
num_re = num_symb * nb_rb * 12;
if (num_re == 0)
return(0);
MPR_x100 = 100*sumKr/num_re;
if (control_only == 1 )
beta_offset_pusch_x8=8; // fixme
//(beta_offset_pusch_x8=ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? ue->ulsch[eNB_id]->beta_offset_cqi_times8:8;
// if deltamcs_enabledm
delta_mcs = ((hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch_x8)>>3))/100.0);
bw_factor = (hundred_times_log10_NPRB[nb_rb-1]/100.0);
#ifdef DEBUG_SEGMENTATION
printf("estimated ue tx power %d (num_re %d, sumKr %d, mpr_x100 %d, delta_mcs %f, bw_factor %f)\n",
(int16_t)ceil(delta_mcs + bw_factor), num_re, sumKr, MPR_x100, delta_mcs, bw_factor);
#endif
return (int16_t)ceil(delta_mcs + bw_factor);
}
...@@ -480,8 +480,6 @@ void pdsch_procedures(PHY_VARS_eNB *eNB, ...@@ -480,8 +480,6 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
subframe<<1); subframe<<1);
stop_meas(&eNB->dlsch_scrambling_stats); stop_meas(&eNB->dlsch_scrambling_stats);
start_meas(&eNB->dlsch_modulation_stats); start_meas(&eNB->dlsch_modulation_stats);
if (frame==0) LOG_I(PHY,"Generating pdsch for %d.%d starting in symbol %d, Qm %d, nb_rb %d, rbmask %x\n",
frame,subframe,dlsch_harq->pdsch_start,dlsch_harq->Qm,dlsch_harq->nb_rb,dlsch_harq->rb_alloc[0]);
dlsch_modulation(eNB, dlsch_modulation(eNB,
eNB->common_vars.txdataF, eNB->common_vars.txdataF,
AMP, AMP,
...@@ -1329,7 +1327,7 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) { ...@@ -1329,7 +1327,7 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) {
int nb=abortTpool(proc->threadPool, req->key); int nb=abortTpool(proc->threadPool, req->key);
nb+=abortNotifiedFIFO(proc->respDecode, req->key); nb+=abortNotifiedFIFO(proc->respDecode, req->key);
proc->nbDecode-=nb; proc->nbDecode-=nb;
LOG_I(PHY,"uplink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb); LOG_D(PHY,"uplink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb);
AssertFatal(ulsch_harq->processedSegments+nb == rdata->nbSegments,"processed: %d, aborted: %d, total %d\n", AssertFatal(ulsch_harq->processedSegments+nb == rdata->nbSegments,"processed: %d, aborted: %d, total %d\n",
ulsch_harq->processedSegments, nb, rdata->nbSegments); ulsch_harq->processedSegments, nb, rdata->nbSegments);
ulsch_harq->processedSegments=rdata->nbSegments; ulsch_harq->processedSegments=rdata->nbSegments;
...@@ -1385,6 +1383,15 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) { ...@@ -1385,6 +1383,15 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) {
fill_rx_indication(eNB,i,rdata->frame,rdata->subframe); // indicate SDU to MAC fill_rx_indication(eNB,i,rdata->frame,rdata->subframe); // indicate SDU to MAC
ulsch_harq->status = SCH_IDLE; ulsch_harq->status = SCH_IDLE;
ulsch->harq_mask &= ~(1 << rdata->harq_pid); ulsch->harq_mask &= ~(1 << rdata->harq_pid);
for (int j=0;j<NUMBER_OF_ULSCH_MAX;j++)
if (eNB->ulsch_stats[j].rnti == ulsch->rnti) {
eNB->ulsch_stats[j].total_bytes_rx+=ulsch_harq->TBS;
for (int aa=0;aa<eNB->frame_parms.nb_antennas_rx;aa++) {
eNB->ulsch_stats[j].ulsch_power[aa] = dB_fixed_times10(eNB->pusch_vars[rdata->UEid]->ulsch_power[aa]);
eNB->ulsch_stats[j].ulsch_noise_power[aa] = dB_fixed_times10(eNB->pusch_vars[rdata->UEid]->ulsch_noise_power[aa]);
}
break;
}
T (T_ENB_PHY_ULSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(rdata->frame), T_INT(rdata->subframe), T_INT(ulsch->rnti), T (T_ENB_PHY_ULSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(rdata->frame), T_INT(rdata->subframe), T_INT(ulsch->rnti),
T_INT(rdata->harq_pid)); T_INT(rdata->harq_pid));
} // ulsch not in error } // ulsch not in error
...@@ -1541,7 +1548,7 @@ void kill_te_thread(PHY_VARS_eNB *eNB) { ...@@ -1541,7 +1548,7 @@ void kill_te_thread(PHY_VARS_eNB *eNB) {
} }
void fill_rx_indication(PHY_VARS_eNB *eNB, void fill_rx_indication(PHY_VARS_eNB *eNB,
int UE_id, int ULSCH_id,
int frame, int frame,
int subframe) { int subframe) {
nfapi_rx_indication_pdu_t *pdu; nfapi_rx_indication_pdu_t *pdu;
...@@ -1549,7 +1556,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB, ...@@ -1549,7 +1556,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
int sync_pos; int sync_pos;
uint32_t harq_pid; uint32_t harq_pid;
if (eNB->ulsch[UE_id]->ue_type > 0) harq_pid = 0; if (eNB->ulsch[ULSCH_id]->ue_type > 0) harq_pid = 0;
else { else {
harq_pid = subframe2harq_pid (&eNB->frame_parms, harq_pid = subframe2harq_pid (&eNB->frame_parms,
frame, subframe); frame, subframe);
...@@ -1559,19 +1566,22 @@ void fill_rx_indication(PHY_VARS_eNB *eNB, ...@@ -1559,19 +1566,22 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
eNB->UL_INFO.rx_ind.sfn_sf = frame<<4| subframe; eNB->UL_INFO.rx_ind.sfn_sf = frame<<4| subframe;
eNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; eNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
pdu = &eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus]; pdu = &eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus];
// pdu->rx_ue_information.handle = eNB->ulsch[UE_id]->handle; // pdu->rx_ue_information.handle = eNB->ulsch[ULSCH_id]->handle;
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
pdu->rx_ue_information.rnti = eNB->ulsch[UE_id]->rnti; pdu->rx_ue_information.rnti = eNB->ulsch[ULSCH_id]->rnti;
pdu->rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; pdu->rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG;
pdu->rx_indication_rel8.length = eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3; pdu->rx_indication_rel8.length = eNB->ulsch[ULSCH_id]->harq_processes[harq_pid]->TBS>>3;
pdu->rx_indication_rel8.offset = 1; // DJP - I dont understand - but broken unless 1 ???? 0; // filled in at the end of the UL_INFO formation pdu->rx_indication_rel8.offset = 1; // DJP - I dont understand - but broken unless 1 ???? 0; // filled in at the end of the UL_INFO formation
pdu->data = eNB->ulsch[UE_id]->harq_processes[harq_pid]->decodedBytes; pdu->data = eNB->ulsch[ULSCH_id]->harq_processes[harq_pid]->decodedBytes;
// estimate timing advance for MAC // estimate timing advance for MAC
sync_pos = lte_est_timing_advance_pusch(&eNB->frame_parms, eNB->pusch_vars[UE_id]->drs_ch_estimates_time); sync_pos = lte_est_timing_advance_pusch(&eNB->frame_parms, eNB->pusch_vars[ULSCH_id]->drs_ch_estimates_time);
timing_advance_update = sync_pos; // - eNB->frame_parms.nb_prefix_samples/4; //to check timing_advance_update = sync_pos;
// if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} for (int i=0;i<NUMBER_OF_SCH_STATS_MAX;i++)
// if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} if (eNB->ulsch_stats[i].rnti == eNB->ulsch[ULSCH_id]->rnti)
eNB->ulsch_stats[i].timing_offset = sync_pos;
// if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,ULSCH_id); exit(-1);}
// if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,ULSCH_id); exit(-1);}
switch (eNB->frame_parms.N_RB_DL) { switch (eNB->frame_parms.N_RB_DL) {
case 6: /* nothing to do */ case 6: /* nothing to do */
break; break;
...@@ -1611,7 +1621,13 @@ void fill_rx_indication(PHY_VARS_eNB *eNB, ...@@ -1611,7 +1621,13 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
pdu->rx_indication_rel8.timing_advance = timing_advance_update; pdu->rx_indication_rel8.timing_advance = timing_advance_update;
// estimate UL_CQI for MAC // estimate UL_CQI for MAC
int SNRtimes10 = dB_fixed_times10(eNB->pusch_vars[UE_id]->ulsch_power[0] + ((eNB->frame_parms.nb_antennas_rx>1) ?eNB->pusch_vars[UE_id]->ulsch_power[1] : 0 )) - 10 * eNB->measurements.n0_subband_power_avg_dB; int total_power=0, avg_noise_power=0;
for (int i=0;i<eNB->frame_parms.nb_antennas_rx;i++) {
total_power+=(eNB->pusch_vars[ULSCH_id]->ulsch_power[i]);
avg_noise_power+=(eNB->pusch_vars[ULSCH_id]->ulsch_noise_power[i])/eNB->frame_parms.nb_antennas_rx;
}
int SNRtimes10 = dB_fixed_times10(total_power) -
dB_fixed_times10(avg_noise_power);
if (SNRtimes10 < -640) if (SNRtimes10 < -640)
pdu->rx_indication_rel8.ul_cqi = 0; pdu->rx_indication_rel8.ul_cqi = 0;
...@@ -1620,9 +1636,11 @@ void fill_rx_indication(PHY_VARS_eNB *eNB, ...@@ -1620,9 +1636,11 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
else else
pdu->rx_indication_rel8.ul_cqi = (640 + SNRtimes10) / 5; pdu->rx_indication_rel8.ul_cqi = (640 + SNRtimes10) / 5;
LOG_D(PHY,"[PUSCH %d] Frame %d Subframe %d Filling RX_indication with SNR %d (%d,%d), timing_advance %d (update %d)\n", LOG_D(PHY,"[PUSCH %d] Frame %d Subframe %d Filling RX_indication with SNR %d (%d,%d,%d), timing_advance %d (update %d,sync_pos %d)\n",
harq_pid,frame,subframe,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,eNB->measurements.n0_subband_power_avg_dB,pdu->rx_indication_rel8.timing_advance, harq_pid,frame,subframe,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,dB_fixed_times10(total_power),dB_fixed_times10(avg_noise_power),pdu->rx_indication_rel8.timing_advance,timing_advance_update,sync_pos);
timing_advance_update); for (int i=0;i<eNB->frame_parms.nb_antennas_rx;i++)
LOG_D(PHY,"antenna %d: ulsch_power %d, noise_power %d\n",i,dB_fixed_times10(eNB->pusch_vars[ULSCH_id]->ulsch_power[i]),dB_fixed_times10(eNB->pusch_vars[ULSCH_id]->ulsch_noise_power[i]));
eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus++; eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus++;
eNB->UL_INFO.rx_ind.sfn_sf = frame<<4 | subframe; eNB->UL_INFO.rx_ind.sfn_sf = frame<<4 | subframe;
pthread_mutex_unlock(&eNB->UL_INFO_mutex); pthread_mutex_unlock(&eNB->UL_INFO_mutex);
...@@ -2151,6 +2169,29 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { ...@@ -2151,6 +2169,29 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) {
LOG_I (PHY, "max_I0 %d (rb %d), min_I0 %d (rb %d), avg I0 %d\n", max_I0, amax, min_I0, amin, eNB->measurements.n0_subband_power_avg_dB); LOG_I (PHY, "max_I0 %d (rb %d), min_I0 %d (rb %d), avg I0 %d\n", max_I0, amax, min_I0, amin, eNB->measurements.n0_subband_power_avg_dB);
} }
// figure out a better way to choose slot_rx, 19 is ok for a particular TDD configuration with 30kHz SCS
if ((frame&127) == 0 && subframe==3) {
dump_ulsch_stats(eNB);
dump_uci_stats(eNB);
}
// clear unused statistics after 2 seconds
for (int i=0;i<NUMBER_OF_SCH_STATS_MAX;i++) {
if (eNB->ulsch_stats[i].frame <= frame) {
if ((eNB->ulsch_stats[i].frame + 200) < frame) eNB->ulsch_stats[i].rnti = 0;
}
else {
if (eNB->ulsch_stats[i].frame + 200 < (frame+1024)) eNB->ulsch_stats[i].rnti = 0;
}
if (eNB->uci_stats[i].frame <= frame) {
if ((eNB->uci_stats[i].frame + 200) < frame) eNB->uci_stats[i].rnti = 0;
}
else {
if (eNB->uci_stats[i].frame + 200 < (frame+1024)) eNB->uci_stats[i].rnti = 0;
}
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 );
} }
...@@ -2188,6 +2229,8 @@ void release_rnti_of_phy(module_id_t mod_id) { ...@@ -2188,6 +2229,8 @@ void release_rnti_of_phy(module_id_t mod_id) {
if((ulsch != NULL) && (ulsch->rnti == rnti)) { if((ulsch != NULL) && (ulsch->rnti == rnti)) {
LOG_I(PHY, "clean_eNb_ulsch ulsch[%d] UE %x\n", j, rnti); LOG_I(PHY, "clean_eNb_ulsch ulsch[%d] UE %x\n", j, rnti);
clean_eNb_ulsch(ulsch); clean_eNb_ulsch(ulsch);
for (j=0;j<NUMBER_OF_ULSCH_MAX;j++)
if (eNB_PHY->ulsch_stats[j].rnti == rnti) {eNB_PHY->ulsch_stats[j].rnti=0; break;}
} }
for(j=0; j<NUMBER_OF_UCI_VARS_MAX; j++) { for(j=0; j<NUMBER_OF_UCI_VARS_MAX; j++) {
......
...@@ -148,7 +148,7 @@ void prach_procedures(PHY_VARS_eNB *eNB, ...@@ -148,7 +148,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,
} else { } else {
if ((eNB->prach_energy_counter == 100) && if ((eNB->prach_energy_counter == 100) &&
(max_preamble_energy[0] > eNB->measurements.prach_I0+eNB->prach_DTX_threshold)) { (max_preamble_energy[0] > eNB->measurements.prach_I0+eNB->prach_DTX_threshold)) {
LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n", LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
eNB->Mod_id, eNB->Mod_id,
eNB->CC_id, eNB->CC_id,
frame, frame,
......
...@@ -474,15 +474,16 @@ void feptx_prec(RU_t *ru, ...@@ -474,15 +474,16 @@ void feptx_prec(RU_t *ru,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+ru->idx , 1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+ru->idx , 1);
for (aa=0;aa<ru->nb_tx;aa++) { for (aa=0;aa<ru->nb_tx;aa++) {
memset(ru->common.txdataF_BF[aa],0,sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_tti); if (ru->do_precoding == 0) {
for (int p=0;p<NB_ANTENNA_PORTS_ENB;p++) { memcpy((void*)ru->common.txdataF_BF[aa],
if (ru->do_precoding == 0) { (void*)&eNB->common_vars.txdataF[aa%fp->nb_antenna_ports_eNB][subframe*fp->symbols_per_tti*fp->ofdm_symbol_size],
if (p==0) sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_tti);
memcpy((void*)ru->common.txdataF_BF[aa],
(void*)&eNB->common_vars.txdataF[aa][subframe*fp->symbols_per_tti*fp->ofdm_symbol_size], }
sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_tti); else {
} else { memset(ru->common.txdataF_BF[aa],0,sizeof(int32_t)*fp->ofdm_symbol_size*fp->symbols_per_tti);
if (p<fp->nb_antenna_ports_eNB) { for (int p=0;p<NB_ANTENNA_PORTS_ENB;p++) {
if (p<fp->nb_antenna_ports_eNB) {
// For the moment this does nothing different than below, except ignore antenna ports 5,7,8. // For the moment this does nothing different than below, except ignore antenna ports 5,7,8.
for (l=0;l<pdcch_vars->num_pdcch_symbols;l++) for (l=0;l<pdcch_vars->num_pdcch_symbols;l++)
beam_precoding(eNB->common_vars.txdataF, beam_precoding(eNB->common_vars.txdataF,
...@@ -494,10 +495,10 @@ void feptx_prec(RU_t *ru, ...@@ -494,10 +495,10 @@ void feptx_prec(RU_t *ru,
aa, aa,
p, p,
eNB->Mod_id); eNB->Mod_id);
} //if (p<fp->nb_antenna_ports_eNB) } //if (p<fp->nb_antenna_ports_eNB)
// PDSCH region // PDSCH region
if (p<fp->nb_antenna_ports_eNB || p==5 || p==7 || p==8) { if (p<fp->nb_antenna_ports_eNB || p==5 || p==7 || p==8) {
for (l=pdcch_vars->num_pdcch_symbols;l<fp->symbols_per_tti;l++) { for (l=pdcch_vars->num_pdcch_symbols;l<fp->symbols_per_tti;l++) {
beam_precoding(eNB->common_vars.txdataF, beam_precoding(eNB->common_vars.txdataF,
ru->common.txdataF_BF, ru->common.txdataF_BF,
...@@ -510,8 +511,8 @@ void feptx_prec(RU_t *ru, ...@@ -510,8 +511,8 @@ void feptx_prec(RU_t *ru,
eNB->Mod_id); eNB->Mod_id);
} // for (l=pdcch_vars ....) } // for (l=pdcch_vars ....)
} // if (p<fp->nb_antenna_ports_eNB) ... } // if (p<fp->nb_antenna_ports_eNB) ...
} // ru->do_precoding!=0 } // for (p=0...)
} // for (p=0...) } // if do_precoding
} // for (aa=0 ...) } // for (aa=0 ...)
if(ru->idx<2) if(ru->idx<2)
......
...@@ -86,9 +86,14 @@ ...@@ -86,9 +86,14 @@
#define MAX_gNB 2 #define MAX_gNB 2
#endif #endif
#define NUMBER_OF_DLSCH_MAX 16
#define NUMBER_OF_ULSCH_MAX 16
#define NUMBER_OF_SCH_STATS_MAX 16
#define NUMBER_OF_NR_DLSCH_MAX 2//16 #define NUMBER_OF_NR_DLSCH_MAX 2//16
#define NUMBER_OF_NR_ULSCH_MAX 2//16 #define NUMBER_OF_NR_ULSCH_MAX 2//16
#define NUMBER_OF_NR_SCH_STATS_MAX 16 #define NUMBER_OF_NR_SCH_STATS_MAX 16
#define NUMBER_OF_NR_PUCCH_MAX 16 #define NUMBER_OF_NR_PUCCH_MAX 16
#define NUMBER_OF_NR_SR_MAX 16 #define NUMBER_OF_NR_SR_MAX 16
#define NUMBER_OF_NR_PDCCH_MAX 16 #define NUMBER_OF_NR_PDCCH_MAX 16
......
...@@ -596,13 +596,13 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -596,13 +596,13 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]); UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]);
if (((frameP & 127) == 0) && (subframeP == 0)) { if (((frameP & 127) == 0) && (subframeP == 0)) {
LOG_I(MAC,"UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n", LOG_I(MAC,"UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d (TPC accum %d) PUCCH SNR %d (TPC accum %d)\n",
rnti, rnti,
UE_scheduling_control->ul_out_of_sync == 0 ? "in synch" : "out of sync", UE_scheduling_control->ul_out_of_sync == 0 ? "in synch" : "out of sync",
UE_info->UE_template[CC_id][UE_id].phr_info, UE_info->UE_template[CC_id][UE_id].phr_info,
UE_scheduling_control->dl_cqi[CC_id], UE_scheduling_control->dl_cqi[CC_id],
(5 * UE_scheduling_control->pusch_snr[CC_id] - 640) / 10, (5 * UE_scheduling_control->pusch_snr[CC_id] - 640) / 10, UE_scheduling_control->pucch_tpc_accumulated[CC_id],
(5 * UE_scheduling_control->pucch1_snr[CC_id] - 640) / 10); (5 * UE_scheduling_control->pucch1_snr[CC_id] - 640) / 10, UE_scheduling_control->pusch_tpc_accumulated[CC_id]);
} }
RC.eNB[module_idP][CC_id]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] = -63; RC.eNB[module_idP][CC_id]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] = -63;
......
...@@ -483,8 +483,8 @@ void generate_Msg2(module_id_t module_idP, ...@@ -483,8 +483,8 @@ void generate_Msg2(module_id_t module_idP,
first_rb = 0; first_rb = 0;
vrb_map[first_rb] = 1; vrb_map[first_rb] = 1;
vrb_map[first_rb + 1] = 1; vrb_map[first_rb + 1] = 1;
vrb_map[first_rb + 2] = 1; //vrb_map[first_rb + 2] = 1;
vrb_map[first_rb + 3] = 1; //vrb_map[first_rb + 3] = 1;
memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t)); memset((void *) dl_config_pdu, 0, sizeof(nfapi_dl_config_request_pdu_t));
dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE;
dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); dl_config_pdu->pdu_size = (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu));
...@@ -495,12 +495,12 @@ void generate_Msg2(module_id_t module_idP, ...@@ -495,12 +495,12 @@ void generate_Msg2(module_id_t module_idP,
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 2; // RA-RNTI : see Table 4-10 from SCF082 - nFAPI specifications dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 2; // RA-RNTI : see Table 4-10 from SCF082 - nFAPI specifications
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 0; // no TPC
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = 0; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = 1;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 0; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 0;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = 0; dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = 0;
dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(N_RB_DL, first_rb, 4); dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(N_RB_DL, first_rb, 2);
// This checks if the above DCI allocation is feasible in current subframe // This checks if the above DCI allocation is feasible in current subframe
if (!CCE_allocation_infeasible(module_idP, CC_idP, 0, subframeP, if (!CCE_allocation_infeasible(module_idP, CC_idP, 0, subframeP,
...@@ -519,7 +519,7 @@ void generate_Msg2(module_id_t module_idP, ...@@ -519,7 +519,7 @@ void generate_Msg2(module_id_t module_idP,
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = ra->RA_rnti; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = ra->RA_rnti;
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(N_RB_DL, first_rb, 4); dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(N_RB_DL, first_rb, 2);
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.redundancy_version = 0; dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.redundancy_version = 0;
dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block
...@@ -1295,9 +1295,9 @@ initiate_ra_proc(module_id_t module_idP, ...@@ -1295,9 +1295,9 @@ initiate_ra_proc(module_id_t module_idP,
prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13; prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13;
} }
LOG_D(MAC, LOG_I(MAC,
"[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d Initiating RA procedure for preamble index %d\n", "[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d Initiating RA procedure for preamble index %d, timing offset %d\n",
module_idP, CC_id, frameP, subframeP, preamble_index); module_idP, CC_id, frameP, subframeP, preamble_index, timing_offset);
LOG_D(MAC, LOG_D(MAC,
"[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d PRACH resource type %d\n", "[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d PRACH resource type %d\n",
module_idP, CC_id, frameP, subframeP, rach_resource_type); module_idP, CC_id, frameP, subframeP, rach_resource_type);
...@@ -1339,6 +1339,9 @@ initiate_ra_proc(module_id_t module_idP, ...@@ -1339,6 +1339,9 @@ initiate_ra_proc(module_id_t module_idP,
abort(); abort();
case 1 : case 1 :
case 3 :
case 4 :
case 5 :
offset = 6; offset = 6;
break; break;
} }
......
...@@ -1066,18 +1066,21 @@ schedule_ue_spec(module_id_t module_idP, ...@@ -1066,18 +1066,21 @@ schedule_ue_spec(module_id_t module_idP,
if (snr > target_snr + 4) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
ue_sched_ctrl->pucch_tpc_accumulated[CC_id]--;
} else if (snr < target_snr - 4) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
ue_sched_ctrl->pucch_tpc_accumulated[CC_id]--;
} else { } else {
tpc = 1; //0 tpc = 1; //0
} }
LOG_D(MAC, "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, snr/target snr %d/%d (normal case)\n", LOG_D(MAC, "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d (accumulated %d), snr/target snr %d/%d (normal case)\n",
module_idP, module_idP,
frameP, frameP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
ue_sched_ctrl->pucch_tpc_accumulated[CC_id],
snr, snr,
target_snr); target_snr);
} // Po_PUCCH has been updated } // Po_PUCCH has been updated
......
This diff is collapsed.
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
#include "flexran_agent_mac.h" #include "flexran_agent_mac.h"
#include <dlfcn.h> #include <dlfcn.h>
#include <openair2/LAYER2/MAC/mac.h> #include <openair2/LAYER2/MAC/mac.h>
#include "common/utils/lte/prach_utils.h"
#include "T.h" #include "T.h"
...@@ -144,16 +144,18 @@ rx_sdu(const module_id_t enb_mod_idP, ...@@ -144,16 +144,18 @@ rx_sdu(const module_id_t enb_mod_idP,
if (UE_id != -1) { if (UE_id != -1) {
UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id]; UE_scheduling_control = &UE_info->UE_sched_ctrl[UE_id];
UE_template_ptr = &UE_info->UE_template[CC_idP][UE_id]; UE_template_ptr = &UE_info->UE_template[CC_idP][UE_id];
LOG_D(MAC, "[eNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n", LOG_D(MAC, "[eNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH (%s) sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d, timing_advance %d\n",
enb_mod_idP, enb_mod_idP,
harq_pid, harq_pid,
CC_idP, CC_idP,
frameP, frameP,
subframeP, subframeP,
sduP==NULL ? "in error" : "OK",
UE_scheduling_control->round_UL[CC_idP][harq_pid], UE_scheduling_control->round_UL[CC_idP][harq_pid],
current_rnti, current_rnti,
UE_id, UE_id,
ul_cqi); ul_cqi,
timing_advance);
AssertFatal(UE_scheduling_control->round_UL[CC_idP][harq_pid] < 8, "round >= 8\n"); AssertFatal(UE_scheduling_control->round_UL[CC_idP][harq_pid] < 8, "round >= 8\n");
if (sduP != NULL) { if (sduP != NULL) {
...@@ -270,14 +272,17 @@ rx_sdu(const module_id_t enb_mod_idP, ...@@ -270,14 +272,17 @@ rx_sdu(const module_id_t enb_mod_idP,
AssertFatal(mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx > 1, AssertFatal(mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx > 1,
"maxHARQ %d should be greater than 1\n", "maxHARQ %d should be greater than 1\n",
(int) mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx); (int) mac->common_channels[CC_idP].radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx);
LOG_D(MAC, "[eNB %d][PUSCH %d] CC_id %d [RAPROC Msg3] Received ULSCH sdu round %d from PHY (rnti %x, RA_id %d) ul_cqi %d\n", LOG_I(MAC, "[eNB %d][PUSCH %d] CC_id %d [RAPROC Msg3] Received ULSCH sdu (%s) round %d from PHY (rnti %x, RA_id %d) ul_cqi %d, timing advance %d\n",
enb_mod_idP, enb_mod_idP,
harq_pid, harq_pid,
CC_idP, CC_idP,
sduP!=NULL ? "OK" : "in error",
ra->msg3_round, ra->msg3_round,
current_rnti, current_rnti,
RA_id, RA_id,
ul_cqi); ul_cqi,
timing_advance);
first_rb = ra->msg3_first_rb; first_rb = ra->msg3_first_rb;
if (sduP == NULL) { // we've got an error on Msg3 if (sduP == NULL) { // we've got an error on Msg3
...@@ -1214,16 +1219,19 @@ schedule_ulsch(module_id_t module_idP, ...@@ -1214,16 +1219,19 @@ schedule_ulsch(module_id_t module_idP,
/* Note: RC.nb_mac_CC[module_idP] should be lower than or equal to NFAPI_CC_MAX */ /* Note: RC.nb_mac_CC[module_idP] should be lower than or equal to NFAPI_CC_MAX */
for (int CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++, cc++) { for (int CC_id = 0; CC_id < RC.nb_mac_CC[module_idP]; CC_id++, cc++) {
LTE_DL_FRAME_PARMS *frame_parms = &RC.eNB[module_idP][CC_id]->frame_parms;
if (is_prach_subframe(frame_parms, sched_frame, sched_subframe)) { if (is_prach_subframe0(cc->tdd_Config!=NULL ? cc->tdd_Config->subframeAssignment : 0,cc->tdd_Config!=NULL ? 1 : 0,
int start_rb = get_prach_prb_offset( cc->radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex,
frame_parms, sched_frame, sched_subframe)) {
frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, int start_rb = get_prach_prb_offset(cc->tdd_Config!=NULL ? 1 : 0,
frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset, cc->tdd_Config!=NULL ? cc->tdd_Config->subframeAssignment : 0,
0, // tdd_mapindex to_prb(cc->ul_Bandwidth),
sched_frame); // Nf cc->radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex,
cc->radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset,
0, // tdd_mapindex
sched_frame); // Nf
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
cc[CC_id].vrb_map_UL[start_rb + i] = 1; cc->vrb_map_UL[start_rb + i] = 1;
} }
/* HACK: let's remove the PUCCH from available RBs /* HACK: let's remove the PUCCH from available RBs
...@@ -1235,24 +1243,24 @@ schedule_ulsch(module_id_t module_idP, ...@@ -1235,24 +1243,24 @@ schedule_ulsch(module_id_t module_idP,
*/ */
switch (to_prb(cc[CC_id].ul_Bandwidth)) { switch (to_prb(cc[CC_id].ul_Bandwidth)) {
case 25: case 25:
cc[CC_id].vrb_map_UL[0] = 1; cc->vrb_map_UL[0] = 1;
cc[CC_id].vrb_map_UL[24] = 1; cc->vrb_map_UL[24] = 1;
break; break;
case 50: case 50:
cc[CC_id].vrb_map_UL[0] = 1; cc->vrb_map_UL[0] = 1;
cc[CC_id].vrb_map_UL[1] = 1; cc->vrb_map_UL[1] = 1;
cc[CC_id].vrb_map_UL[48] = 1; cc->vrb_map_UL[48] = 1;
cc[CC_id].vrb_map_UL[49] = 1; cc->vrb_map_UL[49] = 1;
break; break;
case 100: case 100:
cc[CC_id].vrb_map_UL[0] = 1; cc->vrb_map_UL[0] = 1;
cc[CC_id].vrb_map_UL[1] = 1; cc->vrb_map_UL[1] = 1;
cc[CC_id].vrb_map_UL[2] = 1; cc->vrb_map_UL[2] = 1;
cc[CC_id].vrb_map_UL[97] = 1; cc->vrb_map_UL[97] = 1;
cc[CC_id].vrb_map_UL[98] = 1; cc->vrb_map_UL[98] = 1;
cc[CC_id].vrb_map_UL[99] = 1; cc->vrb_map_UL[99] = 1;
break; break;
default: default:
...@@ -1270,6 +1278,8 @@ schedule_ulsch(module_id_t module_idP, ...@@ -1270,6 +1278,8 @@ schedule_ulsch(module_id_t module_idP,
/* /*
* Schedule the DCI0 for ULSCH * Schedule the DCI0 for ULSCH
*/ */
void void
schedule_ulsch_rnti(module_id_t module_idP, schedule_ulsch_rnti(module_id_t module_idP,
int CC_id, int CC_id,
...@@ -1277,7 +1287,6 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1277,7 +1287,6 @@ schedule_ulsch_rnti(module_id_t module_idP,
sub_frame_t subframeP, sub_frame_t subframeP,
unsigned char sched_subframeP) { unsigned char sched_subframeP) {
/* TODO: does this need to be static? */ /* TODO: does this need to be static? */
static int32_t tpc_accumulated = 0;
/* values from 0 to 7 can be used for mapping the cyclic shift /* values from 0 to 7 can be used for mapping the cyclic shift
* (36.211 , Table 5.5.2.1.1-1) */ * (36.211 , Table 5.5.2.1.1-1) */
const uint32_t cshift = 0; const uint32_t cshift = 0;
...@@ -1401,8 +1410,7 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1401,8 +1410,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
/* Power control */ /* Power control */
/* /*
* Compute the expected ULSCH RX snr (for the stats) * Compute the expected ULSCH RX snr (for the stats)
* This is the normalized RX snr and this should be constant (regardless *
* of mcs) Is not in dBm, unit from nfapi, converting to dBm
*/ */
const int32_t snr = (5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10; const int32_t snr = (5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10;
const int32_t target_snr = mac->puSch10xSnr / 10; const int32_t target_snr = mac->puSch10xSnr / 10;
...@@ -1423,10 +1431,10 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1423,10 +1431,10 @@ schedule_ulsch_rnti(module_id_t module_idP,
if (snr > target_snr + 4) { if (snr > target_snr + 4) {
tpc = 0; // -1 tpc = 0; // -1
tpc_accumulated--; UE_sched_ctrl_ptr->pusch_tpc_accumulated[CC_id]--;
} else if (snr < target_snr - 4) { } else if (snr < target_snr - 4) {
tpc = 2; // +1 tpc = 2; // +1
tpc_accumulated++; UE_sched_ctrl_ptr->pusch_tpc_accumulated[CC_id]++;
} }
} }
if (tpc != 1) { if (tpc != 1) {
...@@ -1438,7 +1446,7 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1438,7 +1446,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
tpc_accumulated, UE_sched_ctrl_ptr->pusch_tpc_accumulated[CC_id],
snr, snr,
target_snr); target_snr);
} }
...@@ -1998,10 +2006,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -1998,10 +2006,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
if (snr > target_snr + 4) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
UE_sched_ctrl->tpc_accumulated[CC_id]--; UE_sched_ctrl->pusch_tpc_accumulated[CC_id]--;
} else if (snr < target_snr - 4) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
UE_sched_ctrl->tpc_accumulated[CC_id]++; UE_sched_ctrl->pusch_tpc_accumulated[CC_id]++;
} else { } else {
tpc = 1; //0 tpc = 1; //0
} }
...@@ -2016,7 +2024,7 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -2016,7 +2024,7 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
UE_sched_ctrl->tpc_accumulated[CC_id], UE_sched_ctrl->pusch_tpc_accumulated[CC_id],
snr, snr,
target_snr); target_snr);
} }
......
...@@ -775,7 +775,6 @@ typedef struct { ...@@ -775,7 +775,6 @@ typedef struct {
uint32_t num_mac_sdu_rx; uint32_t num_mac_sdu_rx;
// Length of SDU Got from LC UL - Size array can be refined // Length of SDU Got from LC UL - Size array can be refined
uint32_t sdu_length_rx[NB_RB_MAX]; uint32_t sdu_length_rx[NB_RB_MAX];
} eNB_UE_STATS; } eNB_UE_STATS;
/*! \brief eNB template for UE context information */ /*! \brief eNB template for UE context information */
...@@ -964,7 +963,8 @@ typedef struct { ...@@ -964,7 +963,8 @@ typedef struct {
uint16_t feedback_cnt[NFAPI_CC_MAX]; uint16_t feedback_cnt[NFAPI_CC_MAX];
uint16_t timing_advance; uint16_t timing_advance;
uint16_t timing_advance_r9; uint16_t timing_advance_r9;
uint8_t tpc_accumulated[NFAPI_CC_MAX]; int8_t pusch_tpc_accumulated[NFAPI_CC_MAX];
int8_t pucch_tpc_accumulated[NFAPI_CC_MAX];
uint8_t periodic_wideband_cqi[NFAPI_CC_MAX]; uint8_t periodic_wideband_cqi[NFAPI_CC_MAX];
uint8_t periodic_wideband_spatial_diffcqi[NFAPI_CC_MAX]; uint8_t periodic_wideband_spatial_diffcqi[NFAPI_CC_MAX];
uint8_t periodic_wideband_pmi[NFAPI_CC_MAX]; uint8_t periodic_wideband_pmi[NFAPI_CC_MAX];
......
...@@ -730,13 +730,13 @@ void calculate_max_mcs_min_rb(module_id_t mod_id, ...@@ -730,13 +730,13 @@ void calculate_max_mcs_min_rb(module_id_t mod_id,
int tbs = get_TBS_UL(*mcs, rb_table[*rb_index]); int tbs = get_TBS_UL(*mcs, rb_table[*rb_index]);
// fixme: set use_srs flag // fixme: set use_srs flag
*tx_power = estimate_ue_tx_power(tbs * 8, rb_table[*rb_index], 0, Ncp, 0); *tx_power = estimate_ue_tx_power(0,tbs * 8, rb_table[*rb_index], 0, Ncp, 0);
/* find maximum MCS */ /* find maximum MCS */
while ((phr - *tx_power < 0 || tbs > bytes) && *mcs > 3) { while ((phr - *tx_power < 0 || tbs > bytes) && *mcs > 3) {
mcs--; mcs--;
tbs = get_TBS_UL(*mcs, rb_table[*rb_index]); tbs = get_TBS_UL(*mcs, rb_table[*rb_index]);
*tx_power = estimate_ue_tx_power(tbs * 8, rb_table[*rb_index], 0, Ncp, 0); *tx_power = estimate_ue_tx_power(0,tbs * 8, rb_table[*rb_index], 0, Ncp, 0);
} }
/* find minimum necessary RBs */ /* find minimum necessary RBs */
...@@ -746,7 +746,7 @@ void calculate_max_mcs_min_rb(module_id_t mod_id, ...@@ -746,7 +746,7 @@ void calculate_max_mcs_min_rb(module_id_t mod_id,
&& phr - *tx_power > 0) { && phr - *tx_power > 0) {
(*rb_index)++; (*rb_index)++;
tbs = get_TBS_UL(*mcs, rb_table[*rb_index]); tbs = get_TBS_UL(*mcs, rb_table[*rb_index]);
*tx_power = estimate_ue_tx_power(tbs * 8, rb_table[*rb_index], 0, Ncp, 0); *tx_power = estimate_ue_tx_power(0,tbs * 8, rb_table[*rb_index], 0, Ncp, 0);
} }
/* Decrease if we went to far in last iteration */ /* Decrease if we went to far in last iteration */
......
...@@ -67,8 +67,10 @@ fill_rar(const module_id_t module_idP, ...@@ -67,8 +67,10 @@ fill_rar(const module_id_t module_idP,
rar[5] = (uint8_t) (ra->rnti & 0xff); rar[5] = (uint8_t) (ra->rnti & 0xff);
//ra->timing_offset = 0; //ra->timing_offset = 0;
ra->timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps ra->timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps
rar[0] = (uint8_t) (ra->timing_offset >> (2 + 4)); // 7 MSBs of timing advance + divide by 4 //rar[0] = (uint8_t) (ra->timing_offset >> (2 + 4)); // 7 MSBs of timing advance + divide by 4
rar[1] = (uint8_t) (ra->timing_offset << (4 - 2)) & 0xf0; // 4 LSBs of timing advance + divide by 4 //rar[1] = (uint8_t) (ra->timing_offset << (4 - 2)) & 0xf0; // 4 LSBs of timing advance + divide by 4
rar[0] = (uint8_t) (ra->timing_offset >> (4)); // 7 MSBs of timing advance + divide by 4
rar[1] = (uint8_t) (ra->timing_offset << (4)) & 0xf0; // 4 LSBs of timing advance + divide by 4
COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_id]; COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_id];
if(N_RB_UL == 25) { if(N_RB_UL == 25) {
......
...@@ -331,6 +331,7 @@ static void *L1_thread_tx(void *param) { ...@@ -331,6 +331,7 @@ static void *L1_thread_tx(void *param) {
//wait_sync("tx_thread"); //wait_sync("tx_thread");
proc->respEncode = eNB->proc.L1_proc.respEncode;
while (!oai_exit) { while (!oai_exit) {
LOG_D(PHY,"Waiting for TX (IC %d)\n",proc->instance_cnt); LOG_D(PHY,"Waiting for TX (IC %d)\n",proc->instance_cnt);
...@@ -391,6 +392,8 @@ static void *L1_thread( void *param ) { ...@@ -391,6 +392,8 @@ static void *L1_thread( void *param ) {
} }
PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id]; PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id];
char thread_name[100]; char thread_name[100];
cpu_set_t cpuset; cpu_set_t cpuset;
CPU_ZERO(&cpuset); CPU_ZERO(&cpuset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment