IF4p5 optimizations for RRU and more inline performance statistics for RRU
This commit is contained in:
@@ -58,7 +58,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) {
|
|||||||
uint16_t db_fulllength, db_halflength;
|
uint16_t db_fulllength, db_halflength;
|
||||||
int slotoffsetF=0, blockoffsetF=0;
|
int slotoffsetF=0, blockoffsetF=0;
|
||||||
|
|
||||||
uint16_t *data_block=NULL, *i=NULL;
|
uint16_t *data_block=NULL, *i=NULL, *d=NULL;
|
||||||
|
|
||||||
IF4p5_header_t *packet_header=NULL;
|
IF4p5_header_t *packet_header=NULL;
|
||||||
eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv);
|
eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv);
|
||||||
@@ -138,23 +138,48 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) {
|
|||||||
|
|
||||||
if (packet_type == IF4p5_PULFFT) {
|
if (packet_type == IF4p5_PULFFT) {
|
||||||
|
|
||||||
|
uint16_t *rx0 = (uint16_t*) &rxdataF[0][blockoffsetF];
|
||||||
|
uint16_t *rx1 = (uint16_t*) &rxdataF[0][slotoffsetF];
|
||||||
|
|
||||||
|
|
||||||
for (symbol_id=fp->symbols_per_tti-nsym; symbol_id<fp->symbols_per_tti; symbol_id++) {
|
for (symbol_id=fp->symbols_per_tti-nsym; symbol_id<fp->symbols_per_tti; symbol_id++) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF4_SYMBOL, symbol_id );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF4_SYMBOL, symbol_id );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
||||||
|
|
||||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
|
||||||
i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id];
|
|
||||||
data_block[element_id] = ((uint16_t) lin2alaw_if4p5[*i]) | ((uint16_t)(lin2alaw_if4p5[*(i+1)]<<8));
|
|
||||||
|
|
||||||
i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id];
|
start_meas(&ru->compression);
|
||||||
data_block[element_id+db_halflength] = ((uint16_t) lin2alaw_if4p5[*i]) | ((uint16_t)(lin2alaw_if4p5[*(i+1)]<<8));
|
|
||||||
//if (element_id==0) LOG_I(PHY,"send_if4p5: symbol %d rxdata0 = (%d,%d)\n",symbol_id,*i,*(i+1));
|
|
||||||
|
|
||||||
}
|
for (element_id=0; element_id<db_halflength; element_id+=8) {
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
i = (uint16_t*) &rx0[element_id];
|
||||||
packet_header->frame_status &= ~(0x000f<<26);
|
d = (uint16_t*) &data_block[element_id];
|
||||||
packet_header->frame_status |= (symbol_id&0x000f)<<26;
|
d[0] = ((uint16_t) lin2alaw_if4p5[i[0]]) | ((uint16_t)(lin2alaw_if4p5[i[1]]<<8));
|
||||||
|
d[1] = ((uint16_t) lin2alaw_if4p5[i[2]]) | ((uint16_t)(lin2alaw_if4p5[i[3]]<<8));
|
||||||
|
d[2] = ((uint16_t) lin2alaw_if4p5[i[4]]) | ((uint16_t)(lin2alaw_if4p5[i[5]]<<8));
|
||||||
|
d[3] = ((uint16_t) lin2alaw_if4p5[i[6]]) | ((uint16_t)(lin2alaw_if4p5[i[7]]<<8));
|
||||||
|
d[4] = ((uint16_t) lin2alaw_if4p5[i[8]]) | ((uint16_t)(lin2alaw_if4p5[i[9]]<<8));
|
||||||
|
d[5] = ((uint16_t) lin2alaw_if4p5[i[10]]) | ((uint16_t)(lin2alaw_if4p5[i[11]]<<8));
|
||||||
|
d[6] = ((uint16_t) lin2alaw_if4p5[i[12]]) | ((uint16_t)(lin2alaw_if4p5[i[13]]<<8));
|
||||||
|
d[7] = ((uint16_t) lin2alaw_if4p5[i[14]]) | ((uint16_t)(lin2alaw_if4p5[i[15]]<<8));
|
||||||
|
|
||||||
|
i = (uint16_t*) &rx1[element_id];
|
||||||
|
d = (uint16_t*) &data_block[element_id+db_halflength];
|
||||||
|
d[0] = ((uint16_t) lin2alaw_if4p5[i[0]]) | ((uint16_t)(lin2alaw_if4p5[i[1]]<<8));
|
||||||
|
d[1] = ((uint16_t) lin2alaw_if4p5[i[2]]) | ((uint16_t)(lin2alaw_if4p5[i[3]]<<8));
|
||||||
|
d[2] = ((uint16_t) lin2alaw_if4p5[i[4]]) | ((uint16_t)(lin2alaw_if4p5[i[5]]<<8));
|
||||||
|
d[3] = ((uint16_t) lin2alaw_if4p5[i[6]]) | ((uint16_t)(lin2alaw_if4p5[i[7]]<<8));
|
||||||
|
d[4] = ((uint16_t) lin2alaw_if4p5[i[8]]) | ((uint16_t)(lin2alaw_if4p5[i[9]]<<8));
|
||||||
|
d[5] = ((uint16_t) lin2alaw_if4p5[i[10]]) | ((uint16_t)(lin2alaw_if4p5[i[11]]<<8));
|
||||||
|
d[6] = ((uint16_t) lin2alaw_if4p5[i[12]]) | ((uint16_t)(lin2alaw_if4p5[i[13]]<<8));
|
||||||
|
d[7] = ((uint16_t) lin2alaw_if4p5[i[14]]) | ((uint16_t)(lin2alaw_if4p5[i[15]]<<8));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_meas(&ru->compression);
|
||||||
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
||||||
|
packet_header->frame_status &= ~(0x000f<<26);
|
||||||
|
packet_header->frame_status |= (symbol_id&0x000f)<<26;
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
||||||
|
start_meas(&ru->transport);
|
||||||
if ((ru->ifdevice.trx_write_func(&ru->ifdevice,
|
if ((ru->ifdevice.trx_write_func(&ru->ifdevice,
|
||||||
symbol_id,
|
symbol_id,
|
||||||
&tx_buffer,
|
&tx_buffer,
|
||||||
@@ -163,6 +188,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) {
|
|||||||
IF4p5_PULFFT)) < 0) {
|
IF4p5_PULFFT)) < 0) {
|
||||||
perror("ETHERNET write for IF4p5_PULFFT\n");
|
perror("ETHERNET write for IF4p5_PULFFT\n");
|
||||||
}
|
}
|
||||||
|
stop_meas(&ru->transport);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
||||||
slotoffsetF += fp->ofdm_symbol_size;
|
slotoffsetF += fp->ofdm_symbol_size;
|
||||||
blockoffsetF += fp->ofdm_symbol_size;
|
blockoffsetF += fp->ofdm_symbol_size;
|
||||||
|
|||||||
@@ -756,6 +756,10 @@ typedef struct RU_t_s{
|
|||||||
time_stats_t rx_fhaul;
|
time_stats_t rx_fhaul;
|
||||||
/// Timing statistics (TX Fronthaul + Compression)
|
/// Timing statistics (TX Fronthaul + Compression)
|
||||||
time_stats_t tx_fhaul;
|
time_stats_t tx_fhaul;
|
||||||
|
/// Timong statistics (Compression)
|
||||||
|
time_stats_t compression;
|
||||||
|
/// Timing statistics (Fronthaul transport)
|
||||||
|
time_stats_t transport;
|
||||||
/// RX and TX buffers for precoder output
|
/// RX and TX buffers for precoder output
|
||||||
RU_COMMON common;
|
RU_COMMON common;
|
||||||
/// beamforming weight vectors per eNB
|
/// beamforming weight vectors per eNB
|
||||||
|
|||||||
@@ -1322,8 +1322,11 @@ static void* ru_stats_thread(void* param) {
|
|||||||
if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL);
|
if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL);
|
||||||
if (ru->feptx_ofdm) print_meas(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL);
|
if (ru->feptx_ofdm) print_meas(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL);
|
||||||
if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
|
if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
|
||||||
if (ru->fh_north_out) print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL);
|
if (ru->fh_north_out) {
|
||||||
|
print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL);
|
||||||
|
print_meas(&ru->compression,"compression",NULL,NULL);
|
||||||
|
print_meas(&ru->transport,"transport",NULL,NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(NULL);
|
return(NULL);
|
||||||
@@ -1911,6 +1914,8 @@ void init_RU(char *rf_config_file) {
|
|||||||
ru->ifdevice.eth_params = &ru->eth_params;
|
ru->ifdevice.eth_params = &ru->eth_params;
|
||||||
reset_meas(&ru->rx_fhaul);
|
reset_meas(&ru->rx_fhaul);
|
||||||
reset_meas(&ru->tx_fhaul);
|
reset_meas(&ru->tx_fhaul);
|
||||||
|
reset_meas(&ru->compression);
|
||||||
|
reset_meas(&ru->transport);
|
||||||
|
|
||||||
ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params);
|
ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params);
|
||||||
printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id);
|
printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id);
|
||||||
@@ -1934,6 +1939,8 @@ void init_RU(char *rf_config_file) {
|
|||||||
ru->ifdevice.eth_params = &ru->eth_params;
|
ru->ifdevice.eth_params = &ru->eth_params;
|
||||||
reset_meas(&ru->rx_fhaul);
|
reset_meas(&ru->rx_fhaul);
|
||||||
reset_meas(&ru->tx_fhaul);
|
reset_meas(&ru->tx_fhaul);
|
||||||
|
reset_meas(&ru->compression);
|
||||||
|
reset_meas(&ru->transport);
|
||||||
|
|
||||||
ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params);
|
ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params);
|
||||||
printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id);
|
printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id);
|
||||||
|
|||||||
Reference in New Issue
Block a user