mirror of https://github.com/PentHertz/srsLTE.git
Refactored cases mcs>29 for ul/dl
This commit is contained in:
parent
399f1cdbd1
commit
2f44e2bf3a
|
@ -197,7 +197,8 @@ typedef enum SRSLTE_API {
|
||||||
SRSLTE_MOD_BPSK = 0,
|
SRSLTE_MOD_BPSK = 0,
|
||||||
SRSLTE_MOD_QPSK,
|
SRSLTE_MOD_QPSK,
|
||||||
SRSLTE_MOD_16QAM,
|
SRSLTE_MOD_16QAM,
|
||||||
SRSLTE_MOD_64QAM
|
SRSLTE_MOD_64QAM,
|
||||||
|
SRSLTE_MOD_LAST
|
||||||
} srslte_mod_t;
|
} srslte_mod_t;
|
||||||
|
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
|
|
|
@ -226,8 +226,7 @@ SRSLTE_API uint32_t srslte_ra_dl_grant_nof_re(srslte_ra_dl_grant_t *grant,
|
||||||
SRSLTE_API int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci,
|
SRSLTE_API int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci,
|
||||||
uint32_t nof_prb,
|
uint32_t nof_prb,
|
||||||
uint32_t n_rb_ho,
|
uint32_t n_rb_ho,
|
||||||
srslte_ra_ul_grant_t *grant,
|
srslte_ra_ul_grant_t *grant);
|
||||||
uint32_t harq_pid);
|
|
||||||
|
|
||||||
SRSLTE_API void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant,
|
SRSLTE_API void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant,
|
||||||
srslte_cp_t cp,
|
srslte_cp_t cp,
|
||||||
|
|
|
@ -44,6 +44,7 @@ int srslte_demod_hard_demodulate(srslte_demod_hard_t* q, cf_t* symbols, uint8_t
|
||||||
|
|
||||||
int nbits=-1;
|
int nbits=-1;
|
||||||
switch(q->mod) {
|
switch(q->mod) {
|
||||||
|
case SRSLTE_MOD_LAST:
|
||||||
case SRSLTE_MOD_BPSK:
|
case SRSLTE_MOD_BPSK:
|
||||||
hard_bpsk_demod(symbols,bits,nsymbols);
|
hard_bpsk_demod(symbols,bits,nsymbols);
|
||||||
nbits=nsymbols;
|
nbits=nsymbols;
|
||||||
|
|
|
@ -82,6 +82,7 @@ int srslte_modem_table_set(srslte_modem_table_t* q, cf_t* table, uint32_t nsymbo
|
||||||
int srslte_modem_table_lte(srslte_modem_table_t* q, srslte_mod_t modulation) {
|
int srslte_modem_table_lte(srslte_modem_table_t* q, srslte_mod_t modulation) {
|
||||||
srslte_modem_table_init(q);
|
srslte_modem_table_init(q);
|
||||||
switch(modulation) {
|
switch(modulation) {
|
||||||
|
case SRSLTE_MOD_LAST:
|
||||||
case SRSLTE_MOD_BPSK:
|
case SRSLTE_MOD_BPSK:
|
||||||
q->nbits_x_symbol = 1;
|
q->nbits_x_symbol = 1;
|
||||||
q->nsymbols = 2;
|
q->nsymbols = 2;
|
||||||
|
|
|
@ -111,7 +111,7 @@ int srslte_dci_rar_to_ul_grant(srslte_dci_rar_grant_t *rar, uint32_t nof_prb,
|
||||||
srslte_ra_type2_from_riv(riv, &ul_dci->type2_alloc.L_crb, &ul_dci->type2_alloc.RB_start,
|
srslte_ra_type2_from_riv(riv, &ul_dci->type2_alloc.L_crb, &ul_dci->type2_alloc.RB_start,
|
||||||
nof_prb, nof_prb);
|
nof_prb, nof_prb);
|
||||||
|
|
||||||
if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant, 0)) {
|
if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant)) {
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ int srslte_dci_msg_to_ul_grant(srslte_dci_msg_t *msg, uint32_t nof_prb,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant, harq_pid)) {
|
if (srslte_ra_ul_dci_to_grant(ul_dci, nof_prb, n_rb_ho, grant)) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -185,51 +185,34 @@ int srslte_ra_ul_dci_to_grant_prb_allocation(srslte_ra_ul_dci_t *dci, srslte_ra_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
srslte_mod_t last_mod[8];
|
static void ul_dci_to_grant_mcs(srslte_ra_ul_dci_t *dci, srslte_ra_ul_grant_t *grant) {
|
||||||
uint32_t last_ul_tbs_idx[8];
|
|
||||||
uint32_t last_dl_tbs[8];
|
|
||||||
uint32_t last_dl_tbs2[8];
|
|
||||||
|
|
||||||
static int ul_dci_to_grant_mcs(srslte_ra_ul_dci_t *dci, srslte_ra_ul_grant_t *grant, uint32_t harq_pid) {
|
|
||||||
int tbs = -1;
|
|
||||||
// 8.6.2 First paragraph
|
// 8.6.2 First paragraph
|
||||||
if (dci->mcs_idx <= 28) {
|
if (dci->mcs_idx <= 28) {
|
||||||
/* Table 8.6.1-1 on 36.213 */
|
/* Table 8.6.1-1 on 36.213 */
|
||||||
if (dci->mcs_idx < 11) {
|
if (dci->mcs_idx < 11) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
||||||
tbs = srslte_ra_tbs_from_idx(dci->mcs_idx, grant->L_prb);
|
grant->mcs.tbs = srslte_ra_tbs_from_idx(dci->mcs_idx, grant->L_prb);
|
||||||
last_ul_tbs_idx[harq_pid%8] = dci->mcs_idx;
|
|
||||||
} else if (dci->mcs_idx < 21) {
|
} else if (dci->mcs_idx < 21) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_16QAM;
|
grant->mcs.mod = SRSLTE_MOD_16QAM;
|
||||||
tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-1, grant->L_prb);
|
grant->mcs.tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-1, grant->L_prb);
|
||||||
last_ul_tbs_idx[harq_pid%8] = dci->mcs_idx-1;
|
|
||||||
} else if (dci->mcs_idx < 29) {
|
} else if (dci->mcs_idx < 29) {
|
||||||
grant->mcs.mod = SRSLTE_MOD_64QAM;
|
grant->mcs.mod = SRSLTE_MOD_64QAM;
|
||||||
tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-2, grant->L_prb);
|
grant->mcs.tbs = srslte_ra_tbs_from_idx(dci->mcs_idx-2, grant->L_prb);
|
||||||
last_ul_tbs_idx[harq_pid%8] = dci->mcs_idx-2;
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Invalid MCS index %d\n", dci->mcs_idx);
|
fprintf(stderr, "Invalid MCS index %d\n", dci->mcs_idx);
|
||||||
}
|
}
|
||||||
last_mod[harq_pid%8] = grant->mcs.mod;
|
|
||||||
} else if (dci->mcs_idx == 29 && dci->cqi_request && grant->L_prb <= 4) {
|
} else if (dci->mcs_idx == 29 && dci->cqi_request && grant->L_prb <= 4) {
|
||||||
// 8.6.1 and 8.6.2 36.213 second paragraph
|
// 8.6.1 and 8.6.2 36.213 second paragraph
|
||||||
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
grant->mcs.mod = SRSLTE_MOD_QPSK;
|
||||||
tbs = srslte_ra_tbs_from_idx(last_ul_tbs_idx[harq_pid%8], grant->L_prb);
|
grant->mcs.tbs = 0;
|
||||||
dci->rv_idx = 1;
|
dci->rv_idx = 1;
|
||||||
} else if (dci->mcs_idx >= 29) {
|
} else if (dci->mcs_idx >= 29) {
|
||||||
// Else use last TBS/Modulation and use mcs to obtain rv_idx
|
// Else use last TBS/Modulation and use mcs to obtain rv_idx
|
||||||
tbs = srslte_ra_tbs_from_idx(last_ul_tbs_idx[harq_pid%8], grant->L_prb);
|
grant->mcs.tbs = -1;
|
||||||
grant->mcs.mod = last_mod[harq_pid%8];
|
grant->mcs.mod = SRSLTE_MOD_LAST;
|
||||||
dci->rv_idx = dci->mcs_idx - 28;
|
dci->rv_idx = dci->mcs_idx - 28;
|
||||||
DEBUG("TTI=%d, harq_pid=%d, mcs_idx=%d, tbs=%d, mod=%d, rv=%d\n",
|
DEBUG("mcs_idx=%d, tbs=%d, mod=%d, rv=%d\n",
|
||||||
harq_pid, harq_pid%8, dci->mcs_idx, tbs/8, grant->mcs.mod, dci->rv_idx);
|
dci->mcs_idx, grant->mcs.tbs/8, grant->mcs.mod, dci->rv_idx);
|
||||||
}
|
|
||||||
if (tbs < 0) {
|
|
||||||
fprintf(stderr, "Error computing TBS\n");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
} else {
|
|
||||||
grant->mcs.tbs = (uint32_t) tbs;
|
|
||||||
return SRSLTE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,25 +224,21 @@ void srslte_ra_ul_grant_to_nbits(srslte_ra_ul_grant_t *grant, srslte_cp_t cp, ui
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Compute PRB allocation for Uplink as defined in 8.1 and 8.4 of 36.213 */
|
/** Compute PRB allocation for Uplink as defined in 8.1 and 8.4 of 36.213 */
|
||||||
int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_grant_t *grant,
|
int srslte_ra_ul_dci_to_grant(srslte_ra_ul_dci_t *dci, uint32_t nof_prb, uint32_t n_rb_ho, srslte_ra_ul_grant_t *grant)
|
||||||
uint32_t harq_pid)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
// Compute PRB allocation
|
// Compute PRB allocation
|
||||||
if (!srslte_ra_ul_dci_to_grant_prb_allocation(dci, grant, n_rb_ho, nof_prb)) {
|
if (!srslte_ra_ul_dci_to_grant_prb_allocation(dci, grant, n_rb_ho, nof_prb)) {
|
||||||
|
|
||||||
// Compute MCS
|
// Compute MCS
|
||||||
if (!ul_dci_to_grant_mcs(dci, grant, harq_pid)) {
|
ul_dci_to_grant_mcs(dci, grant);
|
||||||
|
|
||||||
// Fill rest of grant structure
|
// Fill rest of grant structure
|
||||||
grant->mcs.idx = dci->mcs_idx;
|
grant->mcs.idx = dci->mcs_idx;
|
||||||
grant->M_sc = grant->L_prb*SRSLTE_NRE;
|
grant->M_sc = grant->L_prb*SRSLTE_NRE;
|
||||||
grant->M_sc_init = grant->M_sc; // FIXME: What should M_sc_init be?
|
grant->M_sc_init = grant->M_sc; // FIXME: What should M_sc_init be?
|
||||||
grant->Qm = srslte_mod_bits_x_symbol(grant->mcs.mod);
|
grant->Qm = srslte_mod_bits_x_symbol(grant->mcs.mod);
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Error computing MCS\n");
|
|
||||||
return SRSLTE_ERROR;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
printf("Error computing UL PRB allocation\n");
|
printf("Error computing UL PRB allocation\n");
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
|
@ -442,8 +421,7 @@ int srslte_ra_dl_dci_to_grant_prb_allocation(srslte_ra_dl_dci_t *dci, srslte_ra_
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_dl_fill_ra_mcs(srslte_ra_mcs_t *mcs, uint32_t nprb) {
|
int srslte_dl_fill_ra_mcs(srslte_ra_mcs_t *mcs, uint32_t nprb) {
|
||||||
uint32_t i_tbs = 0;
|
int i_tbs = 0;
|
||||||
int tbs = -1;
|
|
||||||
if (mcs->idx < 10) {
|
if (mcs->idx < 10) {
|
||||||
mcs->mod = SRSLTE_MOD_QPSK;
|
mcs->mod = SRSLTE_MOD_QPSK;
|
||||||
i_tbs = mcs->idx;
|
i_tbs = mcs->idx;
|
||||||
|
@ -455,24 +433,20 @@ int srslte_dl_fill_ra_mcs(srslte_ra_mcs_t *mcs, uint32_t nprb) {
|
||||||
i_tbs = mcs->idx-2;
|
i_tbs = mcs->idx-2;
|
||||||
} else if (mcs->idx == 29) {
|
} else if (mcs->idx == 29) {
|
||||||
mcs->mod = SRSLTE_MOD_QPSK;
|
mcs->mod = SRSLTE_MOD_QPSK;
|
||||||
tbs = 0;
|
i_tbs = -1;
|
||||||
i_tbs = 0;
|
|
||||||
} else if (mcs->idx == 30) {
|
} else if (mcs->idx == 30) {
|
||||||
mcs->mod = SRSLTE_MOD_16QAM;
|
mcs->mod = SRSLTE_MOD_16QAM;
|
||||||
tbs = 0;
|
i_tbs = -1;
|
||||||
i_tbs = 0;
|
|
||||||
} else if (mcs->idx == 31) {
|
} else if (mcs->idx == 31) {
|
||||||
mcs->mod = SRSLTE_MOD_64QAM;
|
mcs->mod = SRSLTE_MOD_64QAM;
|
||||||
tbs = 0;
|
i_tbs = -1;
|
||||||
i_tbs = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tbs == -1) {
|
int tbs = -1;
|
||||||
|
if (i_tbs >= 0) {
|
||||||
tbs = srslte_ra_tbs_from_idx(i_tbs, nprb);
|
tbs = srslte_ra_tbs_from_idx(i_tbs, nprb);
|
||||||
if (tbs >= 0) {
|
|
||||||
mcs->tbs = tbs;
|
mcs->tbs = tbs;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return tbs;
|
return tbs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -555,26 +529,14 @@ static int dl_dci_to_grant_mcs(srslte_ra_dl_dci_t *dci, srslte_ra_dl_grant_t *gr
|
||||||
grant->nof_tb = 0;
|
grant->nof_tb = 0;
|
||||||
if (dci->tb_en[0]) {
|
if (dci->tb_en[0]) {
|
||||||
grant->mcs[0].idx = dci->mcs_idx;
|
grant->mcs[0].idx = dci->mcs_idx;
|
||||||
tbs = srslte_dl_fill_ra_mcs(&grant->mcs[0], n_prb);
|
grant->mcs[0].tbs = srslte_dl_fill_ra_mcs(&grant->mcs[0], n_prb);
|
||||||
if (tbs) {
|
|
||||||
last_dl_tbs[dci->harq_process%8] = tbs;
|
|
||||||
} else {
|
|
||||||
// For mcs>=29, set last TBS received for this PID
|
|
||||||
grant->mcs[0].tbs = last_dl_tbs[dci->harq_process%8];
|
|
||||||
}
|
|
||||||
grant->nof_tb++;
|
grant->nof_tb++;
|
||||||
} else {
|
} else {
|
||||||
grant->mcs[0].tbs = 0;
|
grant->mcs[0].tbs = 0;
|
||||||
}
|
}
|
||||||
if (dci->tb_en[1]) {
|
if (dci->tb_en[1]) {
|
||||||
grant->mcs[1].idx = dci->mcs_idx_1;
|
grant->mcs[1].idx = dci->mcs_idx_1;
|
||||||
tbs = srslte_dl_fill_ra_mcs(&grant->mcs[1], n_prb);
|
grant->mcs[1].tbs = srslte_dl_fill_ra_mcs(&grant->mcs[1], n_prb);
|
||||||
if (tbs) {
|
|
||||||
last_dl_tbs2[dci->harq_process%8] = tbs;
|
|
||||||
} else {
|
|
||||||
// For mcs>=29, set last TBS received for this PID
|
|
||||||
grant->mcs[1].tbs = last_dl_tbs2[dci->harq_process%8];
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
grant->mcs[1].tbs = 0;
|
grant->mcs[1].tbs = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ int main(int argc, char **argv) {
|
||||||
dci.mcs_idx = mcs_idx;
|
dci.mcs_idx = mcs_idx;
|
||||||
|
|
||||||
srslte_ra_ul_grant_t grant;
|
srslte_ra_ul_grant_t grant;
|
||||||
if (srslte_ra_ul_dci_to_grant(&dci, cell.nof_prb, 0, &grant, 0)) {
|
if (srslte_ra_ul_dci_to_grant(&dci, cell.nof_prb, 0, &grant)) {
|
||||||
fprintf(stderr, "Error computing resource allocation\n");
|
fprintf(stderr, "Error computing resource allocation\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -408,7 +408,7 @@ int phch_worker::decode_pusch(srslte_enb_ul_pusch_t *grants, uint32_t nof_pusch)
|
||||||
|
|
||||||
srslte_ra_ul_grant_t phy_grant;
|
srslte_ra_ul_grant_t phy_grant;
|
||||||
int res = -1;
|
int res = -1;
|
||||||
if (!srslte_ra_ul_dci_to_grant(&grants[i].grant, enb_ul.cell.nof_prb, n_rb_ho, &phy_grant, tti_rx%8)) {
|
if (!srslte_ra_ul_dci_to_grant(&grants[i].grant, enb_ul.cell.nof_prb, n_rb_ho, &phy_grant)) {
|
||||||
if (phy_grant.mcs.mod == SRSLTE_MOD_64QAM) {
|
if (phy_grant.mcs.mod == SRSLTE_MOD_64QAM) {
|
||||||
phy_grant.mcs.mod = SRSLTE_MOD_16QAM;
|
phy_grant.mcs.mod = SRSLTE_MOD_16QAM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,11 @@ private:
|
||||||
float cfo;
|
float cfo;
|
||||||
bool rar_cqi_request;
|
bool rar_cqi_request;
|
||||||
|
|
||||||
|
// Save last TBS for mcs>28 cases
|
||||||
|
int last_dl_tbs[2*HARQ_DELAY_MS][SRSLTE_MAX_CODEWORDS];
|
||||||
|
int last_ul_tbs[2*HARQ_DELAY_MS];
|
||||||
|
srslte_mod_t last_ul_mod[2*HARQ_DELAY_MS];
|
||||||
|
|
||||||
// Metrics
|
// Metrics
|
||||||
dl_metrics_t dl_metrics;
|
dl_metrics_t dl_metrics;
|
||||||
ul_metrics_t ul_metrics;
|
ul_metrics_t ul_metrics;
|
||||||
|
|
|
@ -478,10 +478,20 @@ bool phch_worker::decode_pdcch_dl(srsue::mac_interface_phy::mac_grant_t* grant)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grant->pid = ASYNC_DL_SCHED?dci_unpacked.harq_process:(tti%(2*HARQ_DELAY_MS));
|
||||||
|
|
||||||
|
// Set last TBS for this TB (pid) in case of mcs>29 (7.1.7.2 of 36.213)
|
||||||
|
for (int i=0;i<SRSLTE_MAX_CODEWORDS;i++) {
|
||||||
|
if (grant->phy_grant.dl.mcs[i].tbs < 0) {
|
||||||
|
grant->phy_grant.dl.mcs[i].tbs = last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i];
|
||||||
|
}
|
||||||
|
// save it
|
||||||
|
last_dl_tbs[grant->pid%(2*HARQ_DELAY_MS)][i] = grant->phy_grant.dl.mcs[i].tbs;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fill MAC grant structure */
|
/* Fill MAC grant structure */
|
||||||
grant->ndi[0] = dci_unpacked.ndi;
|
grant->ndi[0] = dci_unpacked.ndi;
|
||||||
grant->ndi[1] = dci_unpacked.ndi_1;
|
grant->ndi[1] = dci_unpacked.ndi_1;
|
||||||
grant->pid = ASYNC_DL_SCHED?dci_unpacked.harq_process:(tti%(2*HARQ_DELAY_MS));
|
|
||||||
grant->n_bytes[0] = grant->phy_grant.dl.mcs[0].tbs / (uint32_t) 8;
|
grant->n_bytes[0] = grant->phy_grant.dl.mcs[0].tbs / (uint32_t) 8;
|
||||||
grant->n_bytes[1] = grant->phy_grant.dl.mcs[1].tbs / (uint32_t) 8;
|
grant->n_bytes[1] = grant->phy_grant.dl.mcs[1].tbs / (uint32_t) 8;
|
||||||
grant->tti = tti;
|
grant->tti = tti;
|
||||||
|
@ -718,14 +728,29 @@ bool phch_worker::decode_pdcch_ul(mac_interface_phy::mac_grant_t* grant)
|
||||||
ue_dl.last_location_ul.ncce, (1<<ue_dl.last_location_ul.L), dci_msg.nof_bits, hexstr);
|
ue_dl.last_location_ul.ncce, (1<<ue_dl.last_location_ul.L), dci_msg.nof_bits, hexstr);
|
||||||
|
|
||||||
if (grant->phy_grant.ul.mcs.tbs==0) {
|
if (grant->phy_grant.ul.mcs.tbs==0) {
|
||||||
srslte_vec_fprint_hex(stdout, dci_msg.data, dci_msg.nof_bits);
|
Info("Received PUSCH grant with empty data\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
|
||||||
|
// Use last TBS for this TB in case of mcs>28
|
||||||
|
if (grant->phy_grant.ul.mcs.tbs < 0) {
|
||||||
|
grant->phy_grant.ul.mcs.tbs = last_ul_tbs[tti%(2*HARQ_DELAY_MS)];
|
||||||
|
}
|
||||||
|
last_ul_tbs[tti%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.tbs;
|
||||||
|
|
||||||
|
if (grant->phy_grant.ul.mcs.mod == SRSLTE_MOD_LAST) {
|
||||||
|
grant->phy_grant.ul.mcs.mod = last_ul_mod[tti%(2*HARQ_DELAY_MS)];
|
||||||
|
grant->phy_grant.ul.Qm = srslte_mod_bits_x_symbol(grant->phy_grant.ul.mcs.mod);
|
||||||
|
}
|
||||||
|
last_ul_mod[tti%(2*HARQ_DELAY_MS)] = grant->phy_grant.ul.mcs.mod;
|
||||||
|
}
|
||||||
|
|
||||||
/* Limit UL modulation if not supported by the UE or disabled by higher layers */
|
/* Limit UL modulation if not supported by the UE or disabled by higher layers */
|
||||||
if (!phy->config->enable_64qam) {
|
if (!phy->config->enable_64qam) {
|
||||||
if (grant->phy_grant.ul.mcs.mod == SRSLTE_MOD_64QAM) {
|
if (grant->phy_grant.ul.mcs.mod >= SRSLTE_MOD_64QAM) {
|
||||||
grant->phy_grant.ul.mcs.mod = SRSLTE_MOD_16QAM;
|
grant->phy_grant.ul.mcs.mod = SRSLTE_MOD_16QAM;
|
||||||
grant->phy_grant.ul.Qm = 4;
|
grant->phy_grant.ul.Qm = 4;
|
||||||
}
|
}
|
||||||
|
@ -925,7 +950,7 @@ void phch_worker::encode_pusch(srslte_ra_ul_grant_t *grant, uint8_t *payload, ui
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Info("PUSCH: tti_tx=%d, alloc=(%d,%d), tbs=%d, mcs=%d, rv=%d, ack=%s, ri=%s, cfo=%.1f KHz%s\n",
|
Info("PUSCH: tti_tx=%d, alloc=(%d,%d), tbs=%d, mcs=%d, rv=%d, ack=%s, ri=%s, cfo=%.1f KHz%s\n",
|
||||||
(tti+4)%10240,
|
(tti+HARQ_DELAY_MS)%10240,
|
||||||
grant->n_prb[0], grant->n_prb[0]+grant->L_prb,
|
grant->n_prb[0], grant->n_prb[0]+grant->L_prb,
|
||||||
grant->mcs.tbs/8, grant->mcs.idx, rv,
|
grant->mcs.tbs/8, grant->mcs.idx, rv,
|
||||||
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",
|
uci_data.uci_ack_len>0?(uci_data.uci_ack?"1":"0"):"no",
|
||||||
|
|
Loading…
Reference in New Issue