Commit 3137d1fe authored by Laurent THOMAS's avatar Laurent THOMAS

fix but in reverse_n_bits() when number of bits is 0

parent 02d908fc
......@@ -38,18 +38,6 @@
#define reserved 0xffff
void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
uint16_t j;
uint8_t i;
for(j = bitlen - 1,i = 0; j > i; j--, i++) {
if(((*value>>j)&1) != ((*value>>i)&1)) {
*value ^= (1<<j);
*value ^= (1<<i);
}
}
}
//38.321 Table 6.1.3.1-1
const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE] = {
0, 10, 14, 20, 28, 38, 53, 74,
......
......@@ -264,7 +264,19 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset,
int *period, int *offset);
void reverse_n_bits(uint8_t *value, uint16_t bitlen);
static inline uint8_t reverse_n_bits(const uint8_t value, const uint16_t bitlen)
{
uint8_t ret = value;
if (!bitlen)
return ret;
for (int j = bitlen - 1, i = 0; j > i; j--, i++) {
if (((ret >> j) & 1) != ((ret >> i) & 1)) {
ret ^= (1 << j);
ret ^= (1 << i);
}
}
return ret;
}
bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
uint16_t rbSize, uint8_t mcsIndex, uint8_t mcsTable,
......
......@@ -768,8 +768,10 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
// storing for possible retransmissions
current_harq->R = dlsch_pdu->targetCodeRate;
if (!dlsch_pdu->new_data_indicator && current_harq->TBS != dlsch_pdu->TBS) {
LOG_W(NR_MAC, "NDI indicates re-transmission but computed TBS %d doesn't match with what previously stored %d\n",
dlsch_pdu->TBS, current_harq->TBS);
LOG_W(NR_MAC,
"DCI format 10, NDI indicates re-transmission but computed TBS %d doesn't match with what previously stored %d\n",
dlsch_pdu->TBS,
current_harq->TBS);
dlsch_pdu->new_data_indicator = true; // treated as new data
}
current_harq->TBS = dlsch_pdu->TBS;
......@@ -1209,8 +1211,10 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
Nl);
// storing for possible retransmissions
if (!dlsch_pdu->new_data_indicator && current_harq->TBS != dlsch_pdu->TBS) {
LOG_W(NR_MAC, "NDI indicates re-transmission but computed TBS %d doesn't match with what previously stored %d\n",
dlsch_pdu->TBS, current_harq->TBS);
LOG_W(NR_MAC,
"DCI format 11, NDI indicates re-transmission but computed TBS %d doesn't match with what previously stored %d\n",
dlsch_pdu->TBS,
current_harq->TBS);
dlsch_pdu->new_data_indicator = true; // treated as new data
}
current_harq->R = dlsch_pdu->targetCodeRate;
......@@ -2458,8 +2462,7 @@ bool get_downlink_ack(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sche
pucch->pucch_resource = acknack_resource;
LOG_D(MAC, "frame %d slot %d pucch acknack payload %d\n", frame, slot, o_ACK);
}
reverse_n_bits(&o_ACK, number_harq_feedback);
pucch->ack_payload = o_ACK;
pucch->ack_payload = reverse_n_bits(o_ACK, number_harq_feedback);
pucch->n_harq = number_harq_feedback;
return (number_harq_feedback > 0);
......@@ -2719,29 +2722,21 @@ csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
AssertFatal(*SSB_resource.list.array[ssb_rsrp[0][0]] == mac->mib_ssb, "Couldn't find corresponding SSB in csi_SSB_ResourceList\n");
ssb_rsrp[1][0] = mac->ssb_measurements.ssb_rsrp_dBm;
uint8_t ssbi;
if (ssbri_bits > 0) {
ssbi = ssb_rsrp[0][0];
reverse_n_bits(&ssbi, ssbri_bits);
temp_payload = ssbi;
temp_payload = reverse_n_bits(ssb_rsrp[0][0], ssbri_bits);
bits += ssbri_bits;
}
uint8_t rsrp_idx = get_rsrp_index(ssb_rsrp[1][0]);
reverse_n_bits(&rsrp_idx, 7);
uint8_t rsrp_idx = reverse_n_bits(get_rsrp_index(ssb_rsrp[1][0]), 7);
temp_payload |= (rsrp_idx<<bits);
bits += 7; // 7 bits for highest RSRP
// from the second SSB, differential report
for (int i=1; i<nb_meas; i++){
ssbi = ssb_rsrp[0][i];
reverse_n_bits(&ssbi, ssbri_bits);
temp_payload = ssbi;
temp_payload = reverse_n_bits(ssb_rsrp[0][i], ssbri_bits);
bits += ssbri_bits;
rsrp_idx = get_rsrp_diff_index(ssb_rsrp[1][0],ssb_rsrp[1][i]);
reverse_n_bits(&rsrp_idx, 4);
rsrp_idx = reverse_n_bits(get_rsrp_diff_index(ssb_rsrp[1][0], ssb_rsrp[1][i]), 4);
temp_payload |= (rsrp_idx<<bits);
bits += 4; // 7 bits for highest RSRP
}
......@@ -2764,8 +2759,10 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
{
int p1_bits = 0;
int p2_bits = 0;
uint32_t temp_payload_1 = 0;
uint32_t temp_payload_2 = 0;
union {
uint32_t word;
uint8_t byte[4];
} temp_payload_1 = {0}, temp_payload_2 = {0};
AssertFatal(mapping_type != SUBBAND_ON_PUCCH, "CSI mapping for subband PMI and CQI not implemented\n");
for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
......@@ -2807,32 +2804,30 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
if (mapping_type == ON_PUSCH) {
p1_bits = cri_bitlen + ri_bitlen + cqi_bitlen;
p2_bits = pmi_x1_bitlen + pmi_x2_bitlen;
temp_payload_1 = (0/*mac->csi_measurements.cri*/ << (cqi_bitlen + ri_bitlen)) |
(mac->csirs_measurements.rank_indicator << cqi_bitlen) |
(mac->csirs_measurements.cqi);
temp_payload_2 = (mac->csirs_measurements.i1 << pmi_x2_bitlen) |
mac->csirs_measurements.i2;
temp_payload_1.word = (0 /*mac->csi_measurements.cri*/ << (cqi_bitlen + ri_bitlen))
| (mac->csirs_measurements.rank_indicator << cqi_bitlen) | (mac->csirs_measurements.cqi);
temp_payload_2.word = (mac->csirs_measurements.i1 << pmi_x2_bitlen) | mac->csirs_measurements.i2;
}
else {
p1_bits = nr_get_csi_bitlen(csi_report);
padding_bitlen = p1_bits - (cri_bitlen + ri_bitlen + pmi_x1_bitlen + pmi_x2_bitlen + cqi_bitlen);
temp_payload_1 = (0/*mac->csi_measurements.cri*/ << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen + ri_bitlen)) |
(mac->csirs_measurements.rank_indicator << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen)) |
(mac->csirs_measurements.i1 << (cqi_bitlen + pmi_x2_bitlen)) |
(mac->csirs_measurements.i2 << (cqi_bitlen)) |
(mac->csirs_measurements.cqi);
temp_payload_1.word =
(0 /*mac->csi_measurements.cri*/ << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen + ri_bitlen))
| (mac->csirs_measurements.rank_indicator << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen))
| (mac->csirs_measurements.i1 << (cqi_bitlen + pmi_x2_bitlen)) | (mac->csirs_measurements.i2 << (cqi_bitlen))
| (mac->csirs_measurements.cqi);
}
reverse_n_bits((uint8_t *)&temp_payload_1, p1_bits);
reverse_n_bits((uint8_t *)&temp_payload_2, p2_bits);
temp_payload_1.byte[0] = reverse_n_bits(temp_payload_1.byte[0], p1_bits);
temp_payload_2.byte[0] = reverse_n_bits(temp_payload_2.byte[0], p2_bits);
LOG_D(NR_MAC, "cri_bitlen = %d\n", cri_bitlen);
LOG_D(NR_MAC, "ri_bitlen = %d\n", ri_bitlen);
LOG_D(NR_MAC, "pmi_x1_bitlen = %d\n", pmi_x1_bitlen);
LOG_D(NR_MAC, "pmi_x2_bitlen = %d\n", pmi_x2_bitlen);
LOG_D(NR_MAC, "cqi_bitlen = %d\n", cqi_bitlen);
LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload_1);
LOG_D(NR_MAC, "csi_part2_payload = 0x%x\n", temp_payload_2);
LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload_1.word);
LOG_D(NR_MAC, "csi_part2_payload = 0x%x\n", temp_payload_2.word);
LOG_D(NR_MAC, "part1_bits = %d\n", p1_bits);
LOG_D(NR_MAC, "part2_bits = %d\n", p2_bits);
break;
......@@ -2842,8 +2837,8 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
}
AssertFatal(p1_bits <= 32 && p2_bits <= 32, "Not supporting CSI report with more than 32 bits\n");
csi_payload_t csi;
csi.part1_payload = temp_payload_1;
csi.part2_payload = temp_payload_2;
csi.part1_payload = temp_payload_1.word;
csi.part2_payload = temp_payload_2.word;
csi.p1_bits = p1_bits;
csi.p2_bits = p2_bits;
return csi;
......@@ -2855,7 +2850,10 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
NR_CSI_MeasConfig_t *csi_MeasConfig)
{
int n_bits = 0;
uint32_t temp_payload = 0;
union {
uint32_t w;
uint8_t b[4];
} temp_payload = {0};
for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
......@@ -2887,21 +2885,21 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
// TS 38.133 - Table 10.1.6.1-1
int rsrp_dBm = mac->csirs_measurements.rsrp_dBm;
if (rsrp_dBm < -140) {
temp_payload = 16;
temp_payload.w = 16;
} else if (rsrp_dBm > -44) {
temp_payload = 113;
temp_payload.w = 113;
} else {
temp_payload = mac->csirs_measurements.rsrp_dBm + 157;
temp_payload.w = mac->csirs_measurements.rsrp_dBm + 157;
}
reverse_n_bits((uint8_t *)&temp_payload, n_bits);
temp_payload.b[0] = reverse_n_bits(temp_payload.b[0], n_bits);
LOG_D(NR_MAC, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen);
LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_bitlen);
LOG_D(NR_MAC, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen);
LOG_D(NR_MAC, "n_bits = %d\n", n_bits);
LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload);
LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload.w);
break;
}
......@@ -2910,7 +2908,7 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
}
AssertFatal(n_bits <= 32, "Not supporting CSI report with more than 32 bits\n");
csi_payload_t csi;
csi.part1_payload = temp_payload;
csi.part1_payload = temp_payload.w;
csi.p1_bits = n_bits;
csi.p2_bits = 0;
return csi;
......
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