diff --git a/lib/include/srslte/phy/phch/ra_ul.h b/lib/include/srslte/phy/phch/ra_ul.h index 5ff0eaca3..73f07e346 100644 --- a/lib/include/srslte/phy/phch/ra_ul.h +++ b/lib/include/srslte/phy/phch/ra_ul.h @@ -61,6 +61,10 @@ SRSLTE_API int srslte_ra_ul_dci_to_grant(srslte_cell_t* cell, srslte_dci_ul_t* dci, srslte_pusch_grant_t* grant); +SRSLTE_API void srslte_ra_ul_compute_nof_re(srslte_pusch_grant_t* grant, + srslte_cp_t cp, + uint32_t N_srs); + /** Others */ SRSLTE_API uint32_t srslte_ra_ul_info(srslte_pusch_grant_t* grant, char* info_str, uint32_t len); diff --git a/lib/src/phy/phch/ra_ul.c b/lib/src/phy/phch/ra_ul.c index fadddf12c..2f772430d 100644 --- a/lib/src/phy/phch/ra_ul.c +++ b/lib/src/phy/phch/ra_ul.c @@ -229,7 +229,7 @@ static void ul_fill_ra_mcs(srslte_ra_tb_t* tb, srslte_ra_tb_t* last_tb, uint32_t } } -static void compute_nof_re(srslte_pusch_grant_t* grant, srslte_cp_t cp, uint32_t N_srs) +void srslte_ra_ul_compute_nof_re(srslte_pusch_grant_t* grant, srslte_cp_t cp, uint32_t N_srs) { grant->nof_symb = 2 * (SRSLTE_CP_NSYMB(cp) - 1) - N_srs; grant->nof_re = grant->nof_symb * grant->L_prb * SRSLTE_NRE; @@ -299,10 +299,11 @@ int srslte_ra_ul_dci_to_grant(srslte_cell_t* cell, // copy RV grant->tb.rv = dci->tb.rv; - /* Compute final number of bits and RE */ - compute_nof_re(grant, cell->cp, sf->shortened ? 1 : 0); + /* Compute RE assuming shortened is false*/ + srslte_ra_ul_compute_nof_re(grant, cell->cp, 0); - // Assume hopping is the same + // TODO: Need to compute hopping here before determining if there is collision with SRS, but only MAC knows if it's a + // new tx or a retx. Need to split MAC interface in 2 calls. For now, assume hopping is the same for (uint32_t i = 0; i < 2; i++) { grant->n_prb_tilde[i] = grant->n_prb[i]; } diff --git a/lib/src/phy/ue/ue_ul.c b/lib/src/phy/ue/ue_ul.c index 56eb948f9..d67d47905 100644 --- a/lib/src/phy/ue/ue_ul.c +++ b/lib/src/phy/ue/ue_ul.c @@ -207,10 +207,19 @@ int srslte_ue_ul_dci_to_pusch_grant(srslte_ue_ul_t* q, srslte_dci_ul_t* dci, srslte_pusch_grant_t* grant) { + if (srslte_ra_ul_dci_to_grant(&q->cell, sf, &cfg->ul_cfg.hopping, dci, grant)) { + ERROR("Converting DCI to UL grant\n"); + return SRSLTE_ERROR; + } + // Update shortened before computing grant srslte_refsignal_srs_pusch_shortened(&q->signals, sf, &cfg->ul_cfg.srs, &cfg->ul_cfg.pusch); - return srslte_ra_ul_dci_to_grant(&q->cell, sf, &cfg->ul_cfg.hopping, dci, grant); + /* Update RE assuming if shortened is true */ + if (sf->shortened) { + srslte_ra_ul_compute_nof_re(grant, q->cell.cp, true); + } + return SRSLTE_SUCCESS; } void srslte_ue_ul_pusch_hopping(srslte_ue_ul_t* q, @@ -218,6 +227,9 @@ void srslte_ue_ul_pusch_hopping(srslte_ue_ul_t* q, srslte_ue_ul_cfg_t* cfg, srslte_pusch_grant_t* grant) { + if (cfg->ul_cfg.srs.configured && cfg->ul_cfg.hopping.hopping_enabled) { + ERROR("UL SRS and frequency hopping not currently supported\n"); + } return srslte_ra_ul_pusch_hopping(&q->hopping, sf, &cfg->ul_cfg.hopping, grant); }