Commit 3df0b895 authored by Hongzhi Wang's avatar Hongzhi Wang

re-activating HARQ for UL. break loop when one segment is in error

parent 65b0e7a8
...@@ -602,8 +602,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -602,8 +602,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
E = nr_get_E(G, harq_process->C, Qm, n_layers, r); E = nr_get_E(G, harq_process->C, Qm, n_layers, r);
memset(harq_process->c[r],0,Kr_bytes); memset(harq_process->c[r],0,Kr_bytes);
if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ //if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){
//if (dtx_det==0){ if (dtx_det==0){
if (mcs >9){ if (mcs >9){
memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short));
...@@ -705,6 +705,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -705,6 +705,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
else{ else{
no_iteration_ldpc = ulsch->max_ldpc_iterations+1; no_iteration_ldpc = ulsch->max_ldpc_iterations+1;
} }
bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations);
if (decodeSuccess) { if (decodeSuccess) {
memcpy(harq_process->b+offset, memcpy(harq_process->b+offset,
...@@ -716,37 +717,40 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ...@@ -716,37 +717,40 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
else { else {
LOG_D(PHY,"uplink segment error %d/%d\n",r,harq_process->C); LOG_D(PHY,"uplink segment error %d/%d\n",r,harq_process->C);
LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id);
break; //don't even attempt to decode other segments
} }
if (r==(harq_process->C-1)){ }
if ((decodeSuccess)&&(harq_process->processedSegments==(harq_process->C))) {
LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,0);
phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS);
harq_process->status = SCH_IDLE; if ((harq_process->processedSegments==(harq_process->C))) {
harq_process->round = 0; LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n",
ulsch->harq_mask &= ~(1 << harq_pid); phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS);
harq_process->status = SCH_IDLE;
LOG_D(PHY, "ULSCH received ok \n"); harq_process->round = 0;
nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0,0); ulsch->harq_mask &= ~(1 << harq_pid);
} else { LOG_D(PHY, "ULSCH received ok \n");
LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0,0);
phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot,
harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); } else {
if (harq_process->round >= ulsch->Mlimit) { LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n",
harq_process->status = SCH_IDLE; phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot,
harq_process->round = 0; harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r);
harq_process->handled = 0; if (harq_process->round >= ulsch->Mlimit) {
ulsch->harq_mask &= ~(1 << harq_pid); harq_process->status = SCH_IDLE;
} harq_process->round = 0;
harq_process->handled = 1; harq_process->handled = 0;
no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; ulsch->harq_mask &= ~(1 << harq_pid);
LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); }
nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1,0); harq_process->handled = 1;
} no_iteration_ldpc = ulsch->max_ldpc_iterations + 1;
ulsch->last_iteration_cnt = no_iteration_ldpc; LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id);
} nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1,0);
}
} }
ulsch->last_iteration_cnt = no_iteration_ldpc;
}
else { else {
void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment; void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment;
......
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