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 @@ ...@@ -38,18 +38,6 @@
#define reserved 0xffff #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 //38.321 Table 6.1.3.1-1
const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE] = { const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE] = {
0, 10, 14, 20, 28, 38, 53, 74, 0, 10, 14, 20, 28, 38, 53, 74,
......
...@@ -264,7 +264,19 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep, ...@@ -264,7 +264,19 @@ void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset, struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset,
int *period, int *offset); 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, bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
uint16_t rbSize, uint8_t mcsIndex, uint8_t mcsTable, 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, ...@@ -768,8 +768,10 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
// storing for possible retransmissions // storing for possible retransmissions
current_harq->R = dlsch_pdu->targetCodeRate; current_harq->R = dlsch_pdu->targetCodeRate;
if (!dlsch_pdu->new_data_indicator && current_harq->TBS != dlsch_pdu->TBS) { 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", LOG_W(NR_MAC,
dlsch_pdu->TBS, current_harq->TBS); "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 dlsch_pdu->new_data_indicator = true; // treated as new data
} }
current_harq->TBS = dlsch_pdu->TBS; current_harq->TBS = dlsch_pdu->TBS;
...@@ -1209,8 +1211,10 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac, ...@@ -1209,8 +1211,10 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
Nl); Nl);
// storing for possible retransmissions // storing for possible retransmissions
if (!dlsch_pdu->new_data_indicator && current_harq->TBS != dlsch_pdu->TBS) { 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", LOG_W(NR_MAC,
dlsch_pdu->TBS, current_harq->TBS); "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 dlsch_pdu->new_data_indicator = true; // treated as new data
} }
current_harq->R = dlsch_pdu->targetCodeRate; 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 ...@@ -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; pucch->pucch_resource = acknack_resource;
LOG_D(MAC, "frame %d slot %d pucch acknack payload %d\n", frame, slot, o_ACK); 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 = reverse_n_bits(o_ACK, number_harq_feedback);
pucch->ack_payload = o_ACK;
pucch->n_harq = number_harq_feedback; pucch->n_harq = number_harq_feedback;
return (number_harq_feedback > 0); return (number_harq_feedback > 0);
...@@ -2719,29 +2722,21 @@ csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, ...@@ -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"); 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; ssb_rsrp[1][0] = mac->ssb_measurements.ssb_rsrp_dBm;
uint8_t ssbi;
if (ssbri_bits > 0) { if (ssbri_bits > 0) {
ssbi = ssb_rsrp[0][0]; temp_payload = reverse_n_bits(ssb_rsrp[0][0], ssbri_bits);
reverse_n_bits(&ssbi, ssbri_bits);
temp_payload = ssbi;
bits += ssbri_bits; bits += ssbri_bits;
} }
uint8_t rsrp_idx = get_rsrp_index(ssb_rsrp[1][0]); uint8_t rsrp_idx = reverse_n_bits(get_rsrp_index(ssb_rsrp[1][0]), 7);
reverse_n_bits(&rsrp_idx, 7);
temp_payload |= (rsrp_idx<<bits); temp_payload |= (rsrp_idx<<bits);
bits += 7; // 7 bits for highest RSRP bits += 7; // 7 bits for highest RSRP
// from the second SSB, differential report // from the second SSB, differential report
for (int i=1; i<nb_meas; i++){ for (int i=1; i<nb_meas; i++){
ssbi = ssb_rsrp[0][i]; temp_payload = reverse_n_bits(ssb_rsrp[0][i], ssbri_bits);
reverse_n_bits(&ssbi, ssbri_bits);
temp_payload = ssbi;
bits += ssbri_bits; bits += ssbri_bits;
rsrp_idx = get_rsrp_diff_index(ssb_rsrp[1][0],ssb_rsrp[1][i]); rsrp_idx = reverse_n_bits(get_rsrp_diff_index(ssb_rsrp[1][0], ssb_rsrp[1][i]), 4);
reverse_n_bits(&rsrp_idx, 4);
temp_payload |= (rsrp_idx<<bits); temp_payload |= (rsrp_idx<<bits);
bits += 4; // 7 bits for highest RSRP 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, ...@@ -2764,8 +2759,10 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
{ {
int p1_bits = 0; int p1_bits = 0;
int p2_bits = 0; int p2_bits = 0;
uint32_t temp_payload_1 = 0; union {
uint32_t temp_payload_2 = 0; 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"); 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++) { 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, ...@@ -2807,32 +2804,30 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
if (mapping_type == ON_PUSCH) { if (mapping_type == ON_PUSCH) {
p1_bits = cri_bitlen + ri_bitlen + cqi_bitlen; p1_bits = cri_bitlen + ri_bitlen + cqi_bitlen;
p2_bits = pmi_x1_bitlen + pmi_x2_bitlen; p2_bits = pmi_x1_bitlen + pmi_x2_bitlen;
temp_payload_1 = (0/*mac->csi_measurements.cri*/ << (cqi_bitlen + ri_bitlen)) | temp_payload_1.word = (0 /*mac->csi_measurements.cri*/ << (cqi_bitlen + ri_bitlen))
(mac->csirs_measurements.rank_indicator << cqi_bitlen) | | (mac->csirs_measurements.rank_indicator << cqi_bitlen) | (mac->csirs_measurements.cqi);
(mac->csirs_measurements.cqi); temp_payload_2.word = (mac->csirs_measurements.i1 << pmi_x2_bitlen) | mac->csirs_measurements.i2;
temp_payload_2 = (mac->csirs_measurements.i1 << pmi_x2_bitlen) |
mac->csirs_measurements.i2;
} }
else { else {
p1_bits = nr_get_csi_bitlen(csi_report); p1_bits = nr_get_csi_bitlen(csi_report);
padding_bitlen = p1_bits - (cri_bitlen + ri_bitlen + pmi_x1_bitlen + pmi_x2_bitlen + cqi_bitlen); 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)) | temp_payload_1.word =
(mac->csirs_measurements.rank_indicator << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen)) | (0 /*mac->csi_measurements.cri*/ << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen + ri_bitlen))
(mac->csirs_measurements.i1 << (cqi_bitlen + pmi_x2_bitlen)) | | (mac->csirs_measurements.rank_indicator << (cqi_bitlen + pmi_x2_bitlen + pmi_x1_bitlen + padding_bitlen))
(mac->csirs_measurements.i2 << (cqi_bitlen)) | | (mac->csirs_measurements.i1 << (cqi_bitlen + pmi_x2_bitlen)) | (mac->csirs_measurements.i2 << (cqi_bitlen))
(mac->csirs_measurements.cqi); | (mac->csirs_measurements.cqi);
} }
reverse_n_bits((uint8_t *)&temp_payload_1, p1_bits); temp_payload_1.byte[0] = reverse_n_bits(temp_payload_1.byte[0], p1_bits);
reverse_n_bits((uint8_t *)&temp_payload_2, p2_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, "cri_bitlen = %d\n", cri_bitlen);
LOG_D(NR_MAC, "ri_bitlen = %d\n", ri_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_x1_bitlen = %d\n", pmi_x1_bitlen);
LOG_D(NR_MAC, "pmi_x2_bitlen = %d\n", pmi_x2_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, "cqi_bitlen = %d\n", cqi_bitlen);
LOG_D(NR_MAC, "csi_part1_payload = 0x%x\n", temp_payload_1); 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); 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, "part1_bits = %d\n", p1_bits);
LOG_D(NR_MAC, "part2_bits = %d\n", p2_bits); LOG_D(NR_MAC, "part2_bits = %d\n", p2_bits);
break; break;
...@@ -2842,8 +2837,8 @@ csi_payload_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac, ...@@ -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"); AssertFatal(p1_bits <= 32 && p2_bits <= 32, "Not supporting CSI report with more than 32 bits\n");
csi_payload_t csi; csi_payload_t csi;
csi.part1_payload = temp_payload_1; csi.part1_payload = temp_payload_1.word;
csi.part2_payload = temp_payload_2; csi.part2_payload = temp_payload_2.word;
csi.p1_bits = p1_bits; csi.p1_bits = p1_bits;
csi.p2_bits = p2_bits; csi.p2_bits = p2_bits;
return csi; return csi;
...@@ -2855,7 +2850,10 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, ...@@ -2855,7 +2850,10 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
NR_CSI_MeasConfig_t *csi_MeasConfig) NR_CSI_MeasConfig_t *csi_MeasConfig)
{ {
int n_bits = 0; 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++) { 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, ...@@ -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 // TS 38.133 - Table 10.1.6.1-1
int rsrp_dBm = mac->csirs_measurements.rsrp_dBm; int rsrp_dBm = mac->csirs_measurements.rsrp_dBm;
if (rsrp_dBm < -140) { if (rsrp_dBm < -140) {
temp_payload = 16; temp_payload.w = 16;
} else if (rsrp_dBm > -44) { } else if (rsrp_dBm > -44) {
temp_payload = 113; temp_payload.w = 113;
} else { } 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, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen);
LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_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, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen);
LOG_D(NR_MAC, "n_bits = %d\n", n_bits); 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; break;
} }
...@@ -2910,7 +2908,7 @@ csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac, ...@@ -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"); AssertFatal(n_bits <= 32, "Not supporting CSI report with more than 32 bits\n");
csi_payload_t csi; csi_payload_t csi;
csi.part1_payload = temp_payload; csi.part1_payload = temp_payload.w;
csi.p1_bits = n_bits; csi.p1_bits = n_bits;
csi.p2_bits = 0; csi.p2_bits = 0;
return csi; 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