Commit 4171dcc0 authored by Maud Tribaudeau's avatar Maud Tribaudeau Committed by Laurent THOMAS

Add full tdd 6 - cleanup not used function

parent c5aeaf03
......@@ -414,8 +414,8 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
eNB->Mod_id, fp->N_RB_DL, fp->phich_config_common.phich_resource, fp->phich_config_common.phich_duration);
crcTableInit();
lte_gold (fp, eNB->lte_gold_table, fp->Nid_cell);
generate_pcfich_reg_mapping (fp);
generate_phich_reg_mapping (fp);
generate_pcfich_reg_mapping(fp);
generate_phich_reg_mapping(fp);
init_sss();
init_fde();
......
......@@ -864,70 +864,90 @@ uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
}
// In TDD modes 1-5, each HarqPID is associated with a unique subframe and the number of harq processes equals the
// number of UL subframes. Modes 0 and 6 have more processes than UL subframes so HarqPID depends on sfn
uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe)
{
uint8_t ret = 255;
if (frame_parms->frame_type == FDD) {
ret = (((frame*10)+subframe)&7);
ret = (((frame * 10) + subframe) & 7);
} else {
switch (frame_parms->tdd_config) {
uint32_t cycle_idx;
case 0:
cycle_idx = 7 - frame % 7;
if (subframe < 5) {
ret = (cycle_idx + subframe - 2) % 7;
break;
} else {
ret = (cycle_idx + subframe - 4) % 7;
break;
}
case 1:
switch (subframe) {
case 2:
case 3:
ret = (subframe-2);
ret = (subframe - 2);
break;
case 7:
case 8:
ret = (subframe-5);
ret = (subframe - 5);
break;
default:
LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
ret = (255);
LOG_E(PHY, "subframe2harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
break;
}
break;
case 2:
if ((subframe!=2) && (subframe!=7)) {
LOG_E(PHY, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
ret = 255;
}
else ret = (subframe/7);
if ((subframe != 2) && (subframe != 7)) {
LOG_E(PHY, "subframe2harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
break;
} else
ret = (subframe / 7);
break;
case 3:
if ((subframe<2) || (subframe>4)) {
LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
ret = (255);
}
else ret = (subframe-2);
if ((subframe < 2) || (subframe > 4)) {
LOG_E(PHY, "subframe2harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
break;
} else
ret = (subframe - 2);
break;
case 4:
if ((subframe<2) || (subframe>3)) {
LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
ret = (255);
}
else ret = (subframe-2);
if ((subframe < 2) || (subframe > 3)) {
LOG_E(PHY, "subframe2harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
break;
} else
ret = (subframe - 2);
break;
case 5:
if (subframe!=2) {
LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config);
ret = (255);
}
else ret = (subframe-2);
if (subframe != 2) {
LOG_E(PHY, "subframe2harq_pid, Illegal subframe %d for TDD mode %d\n", subframe, frame_parms->tdd_config);
break;
} else
ret = (subframe - 2);
break;
case 6:
cycle_idx = 6 - frame % 6;
if (subframe < 5) {
ret = (cycle_idx + subframe - 2) % 6;
break;
} else {
ret = (cycle_idx + subframe - 4) % 6;
break;
}
default:
LOG_E(PHY,"subframe2_harq_pid, Unsupported TDD mode %d\n",frame_parms->tdd_config);
ret = (255);
LOG_E(PHY, "subframe2harq_pid, Unsupported TDD mode %d\n", frame_parms->tdd_config);
break;
}
}
......@@ -935,78 +955,102 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t
return ret;
}
uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
// Application of K factor from 3GPP TS 36213, Table 8-2 for TDD. For FDD K = 4
uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint8_t subframe)
{
uint8_t ul_subframe = 255;
if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 1)) {
if ((n==1)||(n==6)) { // tdd_config 0,1 SF 1,5
ul_subframe = ((n+6)%10);
} else if ((n==4)||(n==9)) {
ul_subframe = ((n+4)%10);
}
} else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
((n==0)||(n==1)||(n==5)||(n==6)))
ul_subframe = ((n+7)%10);
else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
(n==9)) // tdd_config 6 SF 9
ul_subframe = ((n+5)%10);
else
ul_subframe = ((n+4)%10);
if (frame_parms->frame_type == TDD) {
switch (frame_parms->tdd_config) {
case 1: // TDD config 1 - DL subframes to grant PUSCH 1,6,4 and 9
if ((subframe == 1) || (subframe == 6)) {
ul_subframe = ((subframe + 6) % 10);
} else if ((subframe == 4) || (subframe == 9)) {
ul_subframe = ((subframe + 4) % 10);
}
break;
case 6: // TDD config 6 - DL subframes to grant PUSCH 0,1,5,6 and 9
if ((subframe == 0) || (subframe == 1) || (subframe == 5) || (subframe == 6)) {
ul_subframe = ((subframe + 7) % 10);
} else if (subframe == 9) {
ul_subframe = ((subframe + 5) % 10);
}
default:
break;
}
} else // FDD
ul_subframe = ((subframe + 4) % 10);
if ( (subframe_select(frame_parms,ul_subframe) != SF_UL) && (frame_parms->frame_type == TDD)) return(255);
if ((subframe_select(frame_parms, ul_subframe) != SF_UL) && (frame_parms->frame_type == TDD))
return (255);
LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", n, ul_subframe);
LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", subframe, ul_subframe);
return ul_subframe;
}
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n)
uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint8_t subframe)
{
if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 1)) {
if ((n==7)||(n==2)) { // tdd_config 0,1 SF 1,5
return((n==7)? 1 : 6);
} else if ((n==3)||(n==8)) {
return((n==3)? 9 : 4);
}
} else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
((n==7)||(n==8)||(n==2)||(n==3)))
return((n+3)%10);
else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
(n==4)) // tdd_config 6 SF 9
return(9);
else
return((n+6)%10);
if (frame_parms->frame_type == TDD) {
switch (frame_parms->tdd_config) {
case 0: // TDD config 0 - UL subframes where PUSCH has been allocated are 2,3,4,7,8 and 9
if ((subframe == 7) || (subframe == 8) || (subframe == 2) || (subframe == 3))
return ((subframe + 3) % 10);
else if ((subframe == 4) || (subframe == 9))
return ((subframe == 4) ? 9 : 5);
break;
LOG_E(PHY, "%s %s:%i pdcch allocation error\n",__FUNCTION__,__FILE__,__LINE__);
case 1: // TDD config 1 - UL subframes where PUSCH has been allocated are 2,3,7 and 8
if ((subframe == 7) || (subframe == 2))
return ((subframe == 7) ? 1 : 6);
else if ((subframe == 3) || (subframe == 8))
return ((subframe == 3) ? 9 : 4);
break;
case 6: // TDD config 6 - UL subframes where PUSCH has been allocated are 2,3,4, 7 and 8
if ((subframe == 7) || (subframe == 8) || (subframe == 2) || (subframe == 3))
return ((subframe + 3) % 10);
else if (subframe == 4)
return (9);
break;
default:
break;
}
} else // FDD
return ((subframe + 6) % 10);
AssertFatal(false, "pdcch allocation error\n");
return 0;
}
uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t n)
// Find frame (current or next one) for PUSCH allocation from DL subframe
uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, uint8_t subframe)
{
uint32_t ul_frame;
uint32_t ul_frame = 0;
if (frame_parms->frame_type == TDD) {
switch (frame_parms->tdd_config) {
case 1: // TDD config 1 - For DL subframes 6 and 9 we do to next Frame to allocate PUSCH
if ((subframe == 1) || (subframe == 6) || (subframe == 4) || (subframe == 9)) {
ul_frame = (frame + (subframe < 5 ? 0 : 1));
}
break;
if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 1) &&
((n==1)||(n==6)||(n==4)||(n==9))) { // tdd_config 0,1 SF 1,5
ul_frame = (frame + (n < 5 ? 0 : 1));
} else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
((n==0)||(n==1)||(n==5)||(n==6)))
ul_frame = (frame + (n>=5 ? 1 : 0));
else if ((frame_parms->frame_type == TDD) &&
(frame_parms->tdd_config == 6) &&
(n==9)) // tdd_config 6 SF 9
ul_frame = (frame+1);
else
ul_frame = (frame+(n>=6 ? 1 : 0));
case 6: // TDD config 6 - For DL subframes 5, 6 and 9 we do to next Frame to allocate PUSCH
if ((subframe == 0) || (subframe == 1) || (subframe == 5) || (subframe == 6) || (subframe == 9)) {
ul_frame = (frame + (subframe >= 5 ? 1 : 0));
}
break;
default:
AssertFatal(1 == 0, "TDD mode not supported %d", frame_parms->tdd_config);
break;
}
} else // FDD
ul_frame = (frame + (subframe >= 6 ? 1 : 0));
LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, ul_frame);
LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, ul_frame);
return ul_frame % 1024;
}
......
......@@ -723,6 +723,9 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
Ngroup_PHICH++;
uint8_t mi = get_mi(frame_parms, subframe);
Ngroup_PHICH *= mi;
if (frame_parms->Ncp == 1)
NSF_PHICH = 2;
......@@ -750,23 +753,37 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
LOG_E(PHY,"FATAL ERROR: illegal harq_pid, returning\n");
return;
}
LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d)\n",
eNB->Mod_id,harq_pid,proc->frame_tx,
subframe,amp,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
LOG_D(PHY,
"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH for PUSCH slot %d, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI "
"%d, first_rb %d)\n",
eNB->Mod_id,
harq_pid,
proc->frame_tx,
subframe,
pusch_subframe,
amp,
ngroup_PHICH,
Ngroup_PHICH,
nseq_PHICH,
phich->hi,
phich->first_rb);
T(T_ENB_PHY_PHICH, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe),
T(T_ENB_PHY_PHICH,
T_INT(eNB->Mod_id),
T_INT(proc->frame_tx),
T_INT(subframe),
T_INT(-1 /* TODO: rnti */),
T_INT(harq_pid),
T_INT(Ngroup_PHICH), T_INT(NSF_PHICH),
T_INT(ngroup_PHICH), T_INT(nseq_PHICH),
T_INT(Ngroup_PHICH),
T_INT(NSF_PHICH),
T_INT(ngroup_PHICH),
T_INT(nseq_PHICH),
T_INT(phich->hi),
T_INT(phich->first_rb),
T_INT(phich->n_DMRS));
generate_phich(frame_parms,
amp,//amp*2,
amp, // amp*2,
nseq_PHICH,
ngroup_PHICH,
phich->hi,
......
......@@ -32,13 +32,12 @@
#include "PHY/defs_eNB.h"
// Refer to Table PHICH factor for TDD transmissions - 3GPP 36211, Table 6.9-1
uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
{
// for FeMBMS
if(frame_parms->FeMBMS_active!=0){
return(0);
}
if (frame_parms->FeMBMS_active != 0)
return (0);
// for FDD
if (frame_parms->frame_type == FDD)
......@@ -47,9 +46,12 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
// for TDD
switch (frame_parms->tdd_config) {
case 0:
if ((subframe==0) || (subframe==5))
return(2);
else return(1);
if ((subframe == 0) || (subframe == 5)) {
return 2;
} else if ((subframe == 1) || (subframe == 6)) {
return 1;
} else
return 0;
break;
......@@ -89,7 +91,10 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
break;
case 6:
return(1);
if ((subframe == 0) || (subframe == 1) || (subframe == 5) || (subframe == 6) || (subframe == 9))
return 1;
else
return 0;
break;
default:
......@@ -97,82 +102,51 @@ uint8_t get_mi(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe)
}
}
unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) {
if (frame_parms->frame_type == FDD)
return(subframe&7);
// Refer to 3GPP TS 36213, Table 8.3-1
// In therory, Frame is not needed for other TDD modes than 0 and 6
int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe)
{
int pusch_frame = frame;
if (frame_parms->frame_type == FDD) {
pusch_frame = subframe < 4 ? frame + 1023 : frame;
} else {
switch (frame_parms->tdd_config) {
case 0:
if ((subframe == 0) || (subframe == 5) || (subframe == 7))
pusch_frame = frame + 1023;
break;
case 1:
if (subframe == 6) {
return(0);
} else if (subframe==9){
return(1);
} else if (subframe==1){
return(2);
} else if (subframe==4){
return(3);
} else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
}
if ((subframe == 1) || (subframe == 4))
pusch_frame = frame + 1023;
break;
case 2:
if (subframe == 3) {
return(1);
} else if (subframe==8){
return(0);
} else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
}
if (subframe == 3)
pusch_frame = frame + 1023;
break;
case 3:
if ( (subframe == 8) || (subframe == 9) ) {
return(subframe-8);
} else if (subframe==0)
return(2);
else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
}
if (subframe == 0)
pusch_frame = frame + 1023;
break;
case 4:
if ( (subframe == 8) || (subframe == 9) ) {
return(subframe-8);
} else {
LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
}
break;
case 5:
break;
case 6:
if ((subframe == 0) || (subframe == 1) || (subframe == 5))
pusch_frame = frame + 1023;
break;
}
return(0);
}
int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe) {
int pusch_frame;
if (frame_parms->frame_type == FDD) {
pusch_frame = subframe<4 ? frame + 1024 - 1 : frame;
} else {
// Note this is not true, but it doesn't matter, the frame number is irrelevant for TDD!
pusch_frame = (frame);
}
//LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame);
LOG_D(PHY, "phich_frame2_pusch_frame frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame);
return pusch_frame % 1024;
}
uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) {
// Refer to 3GPP TS 36213, Table 8.3-1 - K factor application to find which PUSCH
// the PHICH will ACK/NACK
uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms, uint8_t subframe)
{
uint8_t pusch_subframe = 255;
if (frame_parms->frame_type == FDD)
......@@ -181,13 +155,13 @@ uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t s
switch (frame_parms->tdd_config) {
case 0:
if (subframe == 0)
pusch_subframe = (3);
pusch_subframe = 4;
else if (subframe == 5) {
pusch_subframe = (8);
pusch_subframe = 9;
} else if (subframe == 6)
pusch_subframe = (2);
pusch_subframe = 2;
else if (subframe == 1)
pusch_subframe = (7);
pusch_subframe = 7;
else {
AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
......
......@@ -40,22 +40,18 @@ void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
unsigned int *frame,
unsigned char *subframe)
{
// Fill in other TDD Configuration!!!!
if (frame_parms->frame_type == FDD) {
*subframe = current_subframe+6;
*subframe = current_subframe + 6;
if (*subframe>9) {
*subframe = *subframe-10;
*frame = (current_frame+1) & 1023;
if (*subframe > 9) {
*subframe = *subframe - 10;
*frame = (current_frame + 1) & 1023;
} else {
*frame=current_frame;
*frame = current_frame;
}
} else { // TDD
if (frame_parms->tdd_config == 1) {
switch (current_subframe) {
case 0:
*subframe = 7;
*frame = current_frame;
......@@ -63,82 +59,127 @@ void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
case 4:
*subframe = 2;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 5:
*subframe = 2;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 7;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
}
} else if (frame_parms->tdd_config == 3) {
} else if (frame_parms->tdd_config == 2) {
switch (current_subframe) {
case 0:
case 3:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
case 4:
case 5:
case 8:
*subframe = 7;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 2;
*frame = (current_frame + 2) & 1023;
break;
}
} else if (frame_parms->tdd_config == 3) {
switch (current_subframe) {
case 0:
case 5:
case 6:
*subframe = 2;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 7:
*subframe = 3;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 8:
*subframe = 4;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 2;
*frame = (current_frame+2) & 1023;
*frame = (current_frame + 2) & 1023;
break;
}
} else if (frame_parms->tdd_config == 4) {
switch (current_subframe) {
case 0:
case 4:
case 5:
case 6:
*subframe = 2;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 7:
*subframe = 3;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 8:
case 9:
*subframe = 2;
*frame = (current_frame+2) & 1023;
*frame = (current_frame + 2) & 1023;
break;
}
} else if (frame_parms->tdd_config == 5) {
switch (current_subframe) {
case 0:
case 4:
case 5:
case 6:
*subframe = 2;
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
break;
case 7:
case 8:
case 9:
*subframe = 2;
*frame = (current_frame+2) & 1023;
*frame = (current_frame + 2) & 1023;
break;
}
} else if (frame_parms->tdd_config == 0) {
switch (current_subframe) {
case 0:
*subframe = 7;
*frame = current_frame;
break;
case 5:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
}
} else if (frame_parms->tdd_config == 6) {
switch (current_subframe) {
case 0:
*subframe = 7;
*frame = current_frame;
break;
case 5:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 7;
*frame = (current_frame + 1) & 1023;
break;
}
}
......@@ -167,19 +208,62 @@ void get_Msg3_alloc_ret(LTE_DL_FRAME_PARMS *frame_parms,
// original PUSCH in 3, PHICH in 9, ret in 3
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 4, ret in 8
*frame = (current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
} else if (frame_parms->tdd_config == 2) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 7, PHICH in 3, ret in 7 next frame
*frame = (current_frame + 1) & 1023;
} else if (frame_parms->tdd_config == 3) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
// original PUSCH in 4, PHICH in 0, ret in 4 next frame
*frame=(current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
} else if (frame_parms->tdd_config == 4) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
*frame=(current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
} else if (frame_parms->tdd_config == 5) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
*frame=(current_frame+1) & 1023;
*frame = (current_frame + 1) & 1023;
} else if (frame_parms->tdd_config == 0) {
// original PUSCH in 2, PHICH in 6 ,ret in 2 next frame
// original PUSCH in 3, PHICH in 0 , ret in 4 next frame
// original PUSCH in 4, PHICH in 0 , ret in 4 next frame
// original PUSCH in 7, PHICH in 1 (S) ret in 7 next frame
// original PUSCH in 8, PHICH in 5 , ret in 9 next frame
// original PUSCH in 9, PHICH in 5, ret in 9 next frame
*frame = (current_frame + 1) & 1023;
if ((*subframe == 3) || (*subframe == 8)) {
*subframe = ((*subframe == 3) ? 4 : 9);
}
} else if (frame_parms->tdd_config == 6) {
// original PUSCH in 2, PHICH in 6 (S), ret in 3
// original PUSCH in 3, PHICH in 9, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 7
// original PUSCH in 7, PHICH in 1 (S), ret in 8
// original PUSCH in 8, PHICH in 5, ret in 2 in two frames
*frame = (current_frame + 1) & 1023;
switch (*subframe) {
case 2:
*subframe = 3;
break;
case 3:
*subframe = 4;
break;
case 4:
*subframe = 7;
break;
case 7:
*subframe = 8;
break;
case 8:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
default:
break;
}
}
}
}
......@@ -188,18 +272,31 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
uint32_t frame,
unsigned char current_subframe)
{
uint8_t ul_subframe = 0;
uint32_t ul_frame = 0;
uint8_t ul_subframe=0;
uint32_t ul_frame=0;
if (frame_parms->frame_type ==FDD) {
ul_subframe = (current_subframe>3) ? (current_subframe-4) : (current_subframe+6);
ul_frame = (current_subframe>3) ? ((frame+1)&1023) : frame;
if (frame_parms->frame_type == FDD) {
ul_subframe = (current_subframe > 3) ? (current_subframe - 4) : (current_subframe + 6);
ul_frame = (current_subframe > 3) ? ((frame + 1) & 1023) : frame;
} else {
switch (frame_parms->tdd_config) {
case 1:
case 0:
switch (current_subframe) {
case 0:
ul_subframe = 7;
ul_frame = frame;
break;
case 5:
ul_subframe = 2;
ul_frame = (frame + 1) & 1023;
break;
}
break;
case 1:
switch (current_subframe) {
case 9:
case 0:
ul_subframe = 7;
......@@ -209,14 +306,25 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
case 7:
ul_subframe = 2;
break;
}
break;
case 2:
switch (current_subframe) {
case 8:
ul_subframe = 7;
break;
case 3:
ul_subframe = 2;
break;
}
break;
case 3:
switch (current_subframe) {
case 0:
case 5:
case 6:
......@@ -240,7 +348,6 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
case 4:
switch (current_subframe) {
case 0:
case 5:
case 6:
......@@ -257,174 +364,326 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,
break;
case 5:
ul_subframe =2;
ul_subframe = 2;
break;
default:
LOG_E(PHY,"get_Msg3_harq_pid: Unsupported TDD configuration %d\n",frame_parms->tdd_config);
AssertFatal(1==0,"get_Msg3_harq_pid: Unsupported TDD configuration");
case 6:
switch (current_subframe) {
case 9:
ul_subframe = 7;
ul_frame = (frame + 1) & 1023;
break;
case 0:
ul_subframe = 7;
ul_frame = frame;
break;
case 5:
ul_frame = (frame + 1) & 1023;
ul_subframe = 2;
break;
}
}
return(subframe2harq_pid(frame_parms,ul_frame,ul_subframe));
break;
default:
LOG_E(PHY, "get_Msg3_harq_pid: Unsupported TDD configuration %d\n", frame_parms->tdd_config);
return 255;
}
}
return (subframe2harq_pid(frame_parms, ul_frame, ul_subframe));
}
unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe,unsigned char ACK_index)
// Refer to Table Downlink association set index for TDD - 3GPP TS 36213, Table 10.1.3.1-1
// K factor application - subrame(UL) - K = DL subframe ACKed/NACKed
unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms, unsigned char subframe, unsigned char ACK_index)
{
if (frame_parms->frame_type == FDD) {
return((subframe<4) ? subframe+6 : subframe-4);
return ((subframe < 4) ? subframe + 6 : subframe - 4);
} else {
switch (frame_parms->tdd_config) {
case 0:
if (subframe == 2) { // ACK subframe 6
return 6;
} else if (subframe == 4) { // ACK subframe 0
return 0;
} else if (subframe == 7) { // ACK subframe 1
return 1;
} else if (subframe == 9) { // ACK subframe 5
return 5;
} else {
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
}
break;
case 2:
if (subframe == 7) {
if (ACK_index == 0)
return 9;
else if (ACK_index == 1)
return 0;
else if (ACK_index == 2)
return 3;
else if (ACK_index == 3)
return 1;
} else if (subframe == 2) {
if (ACK_index == 0)
return 4;
else if (ACK_index == 1)
return 5;
else if (ACK_index == 2)
return 8;
else if (ACK_index == 3)
return 6;
} else {
LOG_E(PHY,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 3:
if (subframe == 2) { // ACK subframes 5 and 6
if (ACK_index==2)
return(1);
if (ACK_index == 2)
return 1;
return(5+ACK_index);
return (5 + ACK_index);
} else if (subframe == 3) { // ACK subframes 7 and 8
return(7+ACK_index); // To be updated
return (7 + ACK_index); // To be updated
} else if (subframe == 4) { // ACK subframes 9 and 0
return((9+ACK_index)%10);
return ((9 + ACK_index) % 10);
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
LOG_E(PHY,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 4:
if (subframe == 2) { // ACK subframes 0, 4 and 5
//if (ACK_index==2)
// if (ACK_index==2)
// return(1); TBC
if (ACK_index==2)
return(0);
if (ACK_index == 2)
return 0;
return(4+ACK_index);
return (4 + ACK_index);
} else if (subframe == 3) { // ACK subframes 6, 7 8 and 9
return(6+ACK_index); // To be updated
return (6 + ACK_index); // To be updated
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
LOG_E(PHY,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 1:
if (subframe == 2) { // ACK subframes 5 and 6
return(5+ACK_index);
return (5 + ACK_index);
} else if (subframe == 3) { // ACK subframe 9
return(9); // To be updated
return 9; // To be updated
} else if (subframe == 7) { // ACK subframes 0 and 1
return(ACK_index); // To be updated
return (ACK_index); // To be updated
} else if (subframe == 8) { // ACK subframe 4
return(4); // To be updated
return 4; // To be updated
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
}
break;
case 6:
if (subframe == 2) { // ACK subframe 5
return 5;
} else if (subframe == 3) { // ACK subframe 6
return 6;
} else if (subframe == 4) { // ACK subframe 9
return 9;
} else if (subframe == 7) { // ACK subframe 0
return 0;
} else if (subframe == 8) { // ACK subframe 1
return 1;
} else {
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_dl_subframe: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
}
break;
}
}
return(0);
return 0;
}
int ul_ACK_subframe2_dl_frame(LTE_DL_FRAME_PARMS *frame_parms,int frame, unsigned char subframe,unsigned char subframe_tx)
// Refer to Table Downlink association set index for TDD - 3GPP TS 36213, Table 10.1.3.1-1
// Depending on subframe, we will return current frame or previous one
int ul_ACK_subframe2_dl_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, unsigned char subframe, unsigned char subframe_tx)
{
if (frame_parms->frame_type == FDD) {
return (((subframe_tx > subframe ) ? frame-1 : frame)+1024)%1024;
return (((subframe_tx > subframe) ? frame - 1 : frame) + 1024) % 1024;
} else {
switch (frame_parms->tdd_config) {
case 0:
case 1:
return(((subframe_tx > subframe ) ? frame-1 : frame)+1024)%1024;
case 2:
case 6:
return (((subframe_tx > subframe) ? frame - 1 : frame) + 1024) % 1024;
break;
case 3:
//TODO
if ((subframe == 4) && (subframe_tx == 0))
return (frame + 1024) % 1024;
else
return (frame - 1 + 1024) % 1024;
break;
case 4:
//TODO
return (frame - 1 + 1024) % 1024;
break;
case 5:
if ((subframe == 2) && (subframe_tx == 9))
return (frame - 2 + 1024) % 1024;
else
return (frame - 1 + 1024) % 1024;
break;
}
}
return(0);
return 0;
}
unsigned char ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
// Return number of possible ACKed/NACKed cadidates in the subframe(UL)
unsigned char ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms, unsigned char subframe)
{
if (frame_parms->frame_type == FDD) {
return(1);
return 1;
} else {
switch (frame_parms->tdd_config) {
case 0:
return 1; // don't ACK special subframe for now
if (subframe == 2) { // ACK subframe 6
return 1;
} else if (subframe == 4) { // ACK subframe 0
return 1;
} else if (subframe == 7) { // ACK subframe 1*
printf("%s:%d: TO BE UPDATED!!!!!!!\n", __FILE__, __LINE__);
return 0; // To be updated
} else if (subframe == 9) { // ACK subframe 5
return 1;
} else {
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 6:
if (subframe == 2 || subframe == 3 || subframe == 4 || subframe == 7 || subframe == 8) {
return 1;
} else {
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
}
break;
case 1:
return 1; // don't ACK special subframe for now
if (subframe == 2) { // ACK subframes 5 and 6
return(2);
return 2;
} else if (subframe == 3) { // ACK subframe 9
return(1); // To be updated
return 1; // To be updated
} else if (subframe == 7) { // ACK subframes 0 and 1
return(2); // To be updated
return 2; // To be updated
} else if (subframe == 8) { // ACK subframe 4
return(1); // To be updated
return 1; // To be updated
} else {
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 2:
if (subframe == 2) { // ACK subframes 5 and 6
return 3; // To be updated
} else if (subframe == 7) { // ACK subframes 0 and 1
return 3; // To be updated
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 3:
if (subframe == 2) { // ACK subframes 5 and 6
return(2); // should be 3
return 2; // should be 3
} else if (subframe == 3) { // ACK subframes 7 and 8
return(2); // To be updated
return 2; // To be updated
} else if (subframe == 4) { // ACK subframes 9 and 0
return(2);
return 2;
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 4:
if (subframe == 2) { // ACK subframes 0,4 and 5
return(3); // should be 4
return 3; // should be 4
} else if (subframe == 3) { // ACK subframes 6,7,8 and 9
return(4);
return 4;
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
case 5:
if (subframe == 2) { // ACK subframes 0,3,4,5,6,7,8 and 9
return(8); // should be 3
return 8; // should be 3
} else {
LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n",
subframe,frame_parms->tdd_config);
return(0);
AssertFatal(1 == 0,
"phy_procedures_lte_common.c/ul_ACK_subframe2_M: illegal subframe %d for tdd_config %d\n",
subframe,
frame_parms->tdd_config);
return 0;
}
break;
}
}
return(0);
return 0;
}
// This function implements table 10.1-1 of 36-213, p. 69
......@@ -438,62 +697,142 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t cw_idx,
uint8_t do_reset) // 1 to reset ACK/NACK status : 0 otherwise
{
uint8_t status=0;
uint8_t subframe_ul=0xff, subframe_dl0=0xff, subframe_dl1=0xff,subframe_dl2=0xff, subframe_dl3=0xff;
uint8_t status = 0;
uint8_t subframe_ul = 0xff, subframe_dl[4] = {0xff, 0xff, 0xff, 0xff};
// printf("get_ack: SF %d\n",subframe);
if (frame_parms->frame_type == FDD) {
if (subframe_tx < 4)
subframe_dl0 = subframe_tx + 6;
subframe_dl[0] = subframe_tx + 6;
else
subframe_dl0 = subframe_tx - 4;
subframe_dl[0] = subframe_tx - 4;
o_ACK[cw_idx] = harq_ack[subframe_dl0].ack;
status = harq_ack[subframe_dl0].send_harq_status;
o_ACK[cw_idx] = harq_ack[subframe_dl[0]].ack;
status = harq_ack[subframe_dl[0]].send_harq_status;
LOG_D(PHY,"dl subframe %d send_harq_status %d cw_idx %d, reset %d\n",subframe_dl0, status, cw_idx, do_reset);
if(do_reset)
harq_ack[subframe_dl0].send_harq_status = 0;
//printf("get_ack: Getting ACK/NAK for PDSCH (subframe %d) => %d\n",subframe_dl,o_ACK[0]);
LOG_D(PHY, "dl subframe %d send_harq_status %d cw_idx %d, reset %d\n", subframe_dl[0], status, cw_idx, do_reset);
if (do_reset)
harq_ack[subframe_dl[0]].send_harq_status = 0;
// printf("get_ack: Getting ACK/NAK for PDSCH (subframe %d) => %d\n",subframe_dl,o_ACK[0]);
} else {
switch (frame_parms->tdd_config) {
case 0:
if (subframe_tx == 2) { // ACK subframe 6
subframe_ul = 2;
subframe_dl[0] = 6;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 3) { // nothing
subframe_ul = 0xff;
subframe_dl[0] = 0xff; // invalid subframe number indicates ACK/NACK is not needed
subframe_dl[1] = 0xff;
} else if (subframe_tx == 4) { // ACK subframe 0
subframe_ul = 4;
subframe_dl[0] = 0;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 7) { // ACK subframes 1
subframe_ul = 7;
subframe_dl[0] = 1;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 8) { // nothing
subframe_ul = 0xff;
subframe_dl[0] = 0xff; // invalid subframe number indicates ACK/NACK is not needed
subframe_dl[1] = 0xff;
} else if (subframe_tx == 9) { // ACK subframes 5
subframe_ul = 9;
subframe_dl[0] = 5;
subframe_dl[1] = 0xff;
} else {
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 1;
status = 0;
if ((subframe_dl[0] < 10) && (harq_ack[subframe_dl[0]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[0]].ack;
status += harq_ack[subframe_dl[0]].send_harq_status;
}
if ((subframe_dl[1] < 10) && (harq_ack[subframe_dl[1]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[1]].ack;
status += harq_ack[subframe_dl[1]].send_harq_status;
}
// report status = Nbundled
if (!status) {
o_ACK[cw_idx] = 0;
} else {
if (harq_ack[subframe_ul].vDAI_UL < 0xff) {
status += harq_ack[subframe_ul].vDAI_UL;
}
}
// reset ACK/NACK status
if (do_reset) {
LOG_D(PHY,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n",
subframe_tx,
subframe_ul,
subframe_dl[0],
subframe_dl[1]);
if (subframe_ul < 10) {
harq_ack[subframe_ul].vDAI_UL = 0xff;
}
if (subframe_dl[0] < 10) {
harq_ack[subframe_dl[0]].vDAI_DL = 0xff;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
}
if (subframe_dl[1] < 10) {
harq_ack[subframe_dl[1]].vDAI_DL = 0xff;
harq_ack[subframe_dl[1]].ack = 2;
harq_ack[subframe_dl[1]].send_harq_status = 0;
}
}
break;
case 1:
if (subframe_tx == 2) { // ACK subframes 5,6
subframe_ul = 6;
subframe_dl0 = 5;
subframe_dl1 = 6;
subframe_dl[0] = 5;
subframe_dl[1] = 6;
} else if (subframe_tx == 3) { // ACK subframe 9
subframe_ul = 9;
subframe_dl0 = 9;
subframe_dl1 = 0xff;
subframe_dl[0] = 9;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 4) { // nothing
subframe_ul = 0xff;
subframe_dl0 = 0xff; // invalid subframe number indicates ACK/NACK is not needed
subframe_dl1 = 0xff;
subframe_dl[0] = 0xff; // invalid subframe number indicates ACK/NACK is not needed
subframe_dl[1] = 0xff;
} else if (subframe_tx == 7) { // ACK subframes 0,1
subframe_ul = 1;
subframe_dl0 = 0;
subframe_dl1 = 1;
subframe_dl[0] = 0;
subframe_dl[1] = 1;
} else if (subframe_tx == 8) { // ACK subframes 4
subframe_ul = 4;
subframe_dl0 = 4;
subframe_dl1 = 0xff;
subframe_dl[0] = 4;
subframe_dl[1] = 0xff;
} else {
LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,frame_parms->tdd_config);
return(0);
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 1;
status = 0;
if ((subframe_dl0 < 10) && (harq_ack[subframe_dl0].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl0].ack;
status = harq_ack[subframe_dl0].send_harq_status;
if ((subframe_dl[0] < 10) && (harq_ack[subframe_dl[0]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[0]].ack;
status = harq_ack[subframe_dl[0]].send_harq_status;
}
if ((subframe_dl1 < 10) && (harq_ack[subframe_dl1].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack;
status = harq_ack[subframe_dl1].send_harq_status;
if ((subframe_dl[1] < 10) && (harq_ack[subframe_dl[1]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[1]].ack;
status = harq_ack[subframe_dl[1]].send_harq_status;
}
// report status = Nbundled
if (!status) {
......@@ -505,40 +844,205 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
}
if (!do_reset && (subframe_ul < 10)) {
if ((subframe_dl0 < 10) && (subframe_dl1 < 10)) {
LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status,
subframe_dl0, harq_ack[subframe_dl0].ack, harq_ack[subframe_dl0].send_harq_status, harq_ack[subframe_dl0].vDAI_DL,
subframe_dl1, harq_ack[subframe_dl1].ack, harq_ack[subframe_dl1].send_harq_status, harq_ack[subframe_dl1].vDAI_DL,
o_ACK[cw_idx], status);
} else if (subframe_dl0 < 10) {
LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status,
subframe_dl0, harq_ack[subframe_dl0].ack, harq_ack[subframe_dl0].send_harq_status, harq_ack[subframe_dl0].vDAI_DL,
o_ACK[cw_idx], status);
}else if (subframe_dl1 < 10) {
LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status,
subframe_dl1, harq_ack[subframe_dl1].ack, harq_ack[subframe_dl1].send_harq_status, harq_ack[subframe_dl1].vDAI_DL,
o_ACK[cw_idx], status);
if ((subframe_dl[0] < 10) && (subframe_dl[1] < 10)) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d "
"vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[0],
harq_ack[subframe_dl[0]].ack,
harq_ack[subframe_dl[0]].send_harq_status,
harq_ack[subframe_dl[0]].vDAI_DL,
subframe_dl[1],
harq_ack[subframe_dl[1]].ack,
harq_ack[subframe_dl[1]].send_harq_status,
harq_ack[subframe_dl[1]].vDAI_DL,
o_ACK[cw_idx],
status);
} else if (subframe_dl[0] < 10) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[0],
harq_ack[subframe_dl[0]].ack,
harq_ack[subframe_dl[0]].send_harq_status,
harq_ack[subframe_dl[0]].vDAI_DL,
o_ACK[cw_idx],
status);
} else if (subframe_dl[1] < 10) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[1],
harq_ack[subframe_dl[1]].ack,
harq_ack[subframe_dl[1]].send_harq_status,
harq_ack[subframe_dl[1]].vDAI_DL,
o_ACK[cw_idx],
status);
}
}
// reset ACK/NACK status
if (do_reset) {
LOG_D(PHY,"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n", subframe_tx, subframe_ul, subframe_dl0, subframe_dl1);
LOG_D(PHY,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n",
subframe_tx,
subframe_ul,
subframe_dl[0],
subframe_dl[1]);
if (subframe_ul < 10) {
harq_ack[subframe_ul].vDAI_UL = 0xff;
}
if (subframe_dl0 < 10) {
harq_ack[subframe_dl0].vDAI_DL = 0xff;
harq_ack[subframe_dl0].ack = 2;
harq_ack[subframe_dl0].send_harq_status = 0;
if (subframe_dl[0] < 10) {
harq_ack[subframe_dl[0]].vDAI_DL = 0xff;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
}
if (subframe_dl1 < 10) {
harq_ack[subframe_dl1].vDAI_DL = 0xff;
harq_ack[subframe_dl1].ack = 2;
harq_ack[subframe_dl1].send_harq_status = 0;
if (subframe_dl[1] < 10) {
harq_ack[subframe_dl[1]].vDAI_DL = 0xff;
harq_ack[subframe_dl[1]].ack = 2;
harq_ack[subframe_dl[1]].send_harq_status = 0;
}
}
break;
case 2:
if (subframe_tx == 2) { // ACK subframes 5,6
subframe_ul = 8;
subframe_dl[0] = 4;
subframe_dl[1] = 5;
subframe_dl[2] = 8;
subframe_dl[3] = 6;
} else if (subframe_tx == 7) { // ACK subframes 0,1
subframe_ul = 3;
subframe_dl[0] = 9;
subframe_dl[1] = 0;
subframe_dl[2] = 3;
subframe_dl[3] = 1;
} else {
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 1;
status = 0;
if ((subframe_dl[0] < 10) && (harq_ack[subframe_dl[0]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[0]].ack;
status = harq_ack[subframe_dl[0]].send_harq_status;
}
if ((subframe_dl[1] < 10) && (harq_ack[subframe_dl[1]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[1]].ack;
status = harq_ack[subframe_dl[1]].send_harq_status;
}
if ((subframe_dl[2] < 10) && (harq_ack[subframe_dl[2]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[2]].ack;
status = harq_ack[subframe_dl[2]].send_harq_status;
}
if ((subframe_dl[3] < 10) && (harq_ack[subframe_dl[3]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[3]].ack;
status = harq_ack[subframe_dl[3]].send_harq_status;
}
// report status = Nbundled
if (!status) {
o_ACK[cw_idx] = 0;
} else {
if (harq_ack[subframe_ul].vDAI_UL < 0xff) {
status = harq_ack[subframe_ul].vDAI_UL;
}
}
if (!do_reset && (subframe_ul < 10)) { // TODO
if ((subframe_dl[0] < 10) && (subframe_dl[1] < 10)) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d "
"vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[0],
harq_ack[subframe_dl[0]].ack,
harq_ack[subframe_dl[0]].send_harq_status,
harq_ack[subframe_dl[0]].vDAI_DL,
subframe_dl[1],
harq_ack[subframe_dl[1]].ack,
harq_ack[subframe_dl[1]].send_harq_status,
harq_ack[subframe_dl[1]].vDAI_DL,
o_ACK[cw_idx],
status);
} else if (subframe_dl[0] < 10) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[0],
harq_ack[subframe_dl[0]].ack,
harq_ack[subframe_dl[0]].send_harq_status,
harq_ack[subframe_dl[0]].vDAI_DL,
o_ACK[cw_idx],
status);
} else if (subframe_dl[1] < 10) {
LOG_D(PHY,
"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n",
subframe_tx,
subframe_ul,
harq_ack[subframe_ul].vDAI_UL,
status,
subframe_dl[1],
harq_ack[subframe_dl[1]].ack,
harq_ack[subframe_dl[1]].send_harq_status,
harq_ack[subframe_dl[1]].vDAI_DL,
o_ACK[cw_idx],
status);
}
}
// reset ACK/NACK status
if (do_reset) {
LOG_D(PHY,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n",
subframe_tx,
subframe_ul,
subframe_dl[0],
subframe_dl[1]);
if (subframe_ul < 10) {
harq_ack[subframe_ul].vDAI_UL = 0xff;
}
if (subframe_dl[0] < 10) {
harq_ack[subframe_dl[0]].vDAI_DL = 0xff;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
}
if (subframe_dl[1] < 10) {
harq_ack[subframe_dl[1]].vDAI_DL = 0xff;
harq_ack[subframe_dl[1]].ack = 2;
harq_ack[subframe_dl[1]].send_harq_status = 0;
}
if (subframe_dl[2] < 10) {
harq_ack[subframe_dl[2]].vDAI_DL = 0xff;
harq_ack[subframe_dl[2]].ack = 2;
harq_ack[subframe_dl[2]].send_harq_status = 0;
}
if (subframe_dl[3] < 10) {
harq_ack[subframe_dl[3]].vDAI_DL = 0xff;
harq_ack[subframe_dl[3]].ack = 2;
harq_ack[subframe_dl[3]].send_harq_status = 0;
}
}
......@@ -546,116 +1050,201 @@ uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms,
case 3:
if (subframe_tx == 2) { // ACK subframes 5 and 6
subframe_dl0 = 5;
subframe_dl1 = 6;
subframe_dl[0] = 5;
subframe_dl[1] = 6;
subframe_ul = 2;
//printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
// printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d
// (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
} else if (subframe_tx == 3) { // ACK subframes 7 and 8
subframe_dl0 = 7;
subframe_dl1 = 8;
subframe_dl[0] = 7;
subframe_dl[1] = 8;
subframe_ul = 3;
//printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
// printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
// printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
} else if (subframe_tx == 4) { // ACK subframes 9 and 0
subframe_dl0 = 9;
subframe_dl1 = 0;
subframe_dl[0] = 9;
subframe_dl[1] = 0;
subframe_ul = 4;
//printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
// printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack);
} else {
LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,frame_parms->tdd_config);
return(0);
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 0;
if (harq_ack[subframe_dl0].send_harq_status == 1) {
o_ACK[cw_idx] = harq_ack[subframe_dl0].ack;
if (harq_ack[subframe_dl[0]].send_harq_status == 1) {
o_ACK[cw_idx] = harq_ack[subframe_dl[0]].ack;
if (harq_ack[subframe_dl1].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack;
} else if (harq_ack[subframe_dl1].send_harq_status == 1)
o_ACK[cw_idx] = harq_ack[subframe_dl1].ack;
if (harq_ack[subframe_dl[1]].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl[1]].ack;
} else if (harq_ack[subframe_dl[1]].send_harq_status == 1)
o_ACK[cw_idx] = harq_ack[subframe_dl[1]].ack;
pN_bundled[0] = harq_ack[subframe_rx].vDAI_UL;
status = harq_ack[subframe_dl0].send_harq_status + harq_ack[subframe_dl1].send_harq_status;
status = harq_ack[subframe_dl[0]].send_harq_status + harq_ack[subframe_dl[1]].send_harq_status;
//LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d subframe_rx %d N_bundled %d \n",
// subframe_tx, subframe_dl0, harq_ack[subframe_dl0].send_harq_status,harq_ack[subframe_dl0].ack,
// subframe_dl1, harq_ack[subframe_dl1].send_harq_status,harq_ack[subframe_dl1].ack, subframe_rx, pN_bundled[0]);
// LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d subframe_rx %d N_bundled
// %d \n",
// subframe_tx, subframe_dl[0], harq_ack[subframe_dl[0]].send_harq_status,harq_ack[subframe_dl[0]].ack,
// subframe_dl[1], harq_ack[subframe_dl[1]].send_harq_status,harq_ack[subframe_dl[1]].ack, subframe_rx, pN_bundled[0]);
if (do_reset) {
// reset ACK/NACK status
harq_ack[subframe_dl0].ack = 2;
harq_ack[subframe_dl1].ack = 2;
harq_ack[subframe_dl0].send_harq_status = 0;
harq_ack[subframe_dl1].send_harq_status = 0;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[1]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
harq_ack[subframe_dl[1]].send_harq_status = 0;
}
break;
case 4:
if (subframe_tx == 2) { // ACK subframes 4, 5 and 0
subframe_dl0 = 0;
subframe_dl1 = 4;
subframe_dl2 = 5;
subframe_dl[0] = 0;
subframe_dl[1] = 4;
subframe_dl[2] = 5;
subframe_ul = 2;
//printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
// printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d
// (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status);
} else if (subframe_tx == 3) { // ACK subframes 6, 7 8 and 9
subframe_dl0 = 7;
subframe_dl1 = 8;
subframe_dl2 = 9;
subframe_dl3 = 6;
subframe_dl[0] = 7;
subframe_dl[1] = 8;
subframe_dl[2] = 9;
subframe_dl[3] = 6;
subframe_ul = 3;
//printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
//printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
// printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack);
// printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]);
} else {
LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,frame_parms->tdd_config);
return(0);
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 0;
if (harq_ack[subframe_dl0].send_harq_status == 1)
o_ACK[cw_idx] = harq_ack[subframe_dl0].ack;
if (harq_ack[subframe_dl[0]].send_harq_status == 1)
o_ACK[cw_idx] = harq_ack[subframe_dl[0]].ack;
if (harq_ack[subframe_dl1].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack;
if (harq_ack[subframe_dl[1]].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl[1]].ack;
if (harq_ack[subframe_dl2].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl2].ack;
if (harq_ack[subframe_dl[2]].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl[2]].ack;
if (harq_ack[subframe_dl3].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl3].ack;
if (harq_ack[subframe_dl[3]].send_harq_status == 1)
o_ACK[cw_idx] &= harq_ack[subframe_dl[3]].ack;
pN_bundled[0] = harq_ack[subframe_rx].vDAI_UL;
status = harq_ack[subframe_dl0].send_harq_status + harq_ack[subframe_dl1].send_harq_status + harq_ack[subframe_dl2].send_harq_status + harq_ack[subframe_dl3].send_harq_status;
LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d dl Sfn2 %d status %d o_Ack %d dl Sfn3 %d status %d o_Ack %d subframe_rx %d N_bundled %d status %d\n",
subframe_tx, subframe_dl0, harq_ack[subframe_dl0].send_harq_status,harq_ack[subframe_dl0].ack,
subframe_dl1, harq_ack[subframe_dl1].send_harq_status,harq_ack[subframe_dl1].ack,
subframe_dl2, harq_ack[subframe_dl2].send_harq_status,harq_ack[subframe_dl2].ack,
subframe_dl3, harq_ack[subframe_dl3].send_harq_status,harq_ack[subframe_dl3].ack,subframe_rx, pN_bundled[0], status);
status = harq_ack[subframe_dl[0]].send_harq_status + harq_ack[subframe_dl[1]].send_harq_status
+ harq_ack[subframe_dl[2]].send_harq_status + harq_ack[subframe_dl[3]].send_harq_status;
LOG_D(PHY,
"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d dl Sfn2 %d status %d o_Ack %d "
"dl Sfn3 %d status %d o_Ack %d subframe_rx %d N_bundled %d status %d\n",
subframe_tx,
subframe_dl[0],
harq_ack[subframe_dl[0]].send_harq_status,
harq_ack[subframe_dl[0]].ack,
subframe_dl[1],
harq_ack[subframe_dl[1]].send_harq_status,
harq_ack[subframe_dl[1]].ack,
subframe_dl[2],
harq_ack[subframe_dl[2]].send_harq_status,
harq_ack[subframe_dl[2]].ack,
subframe_dl[3],
harq_ack[subframe_dl[3]].send_harq_status,
harq_ack[subframe_dl[3]].ack,
subframe_rx,
pN_bundled[0],
status);
if (do_reset) {
// reset ACK/NACK status
harq_ack[subframe_dl0].ack = 2;
harq_ack[subframe_dl1].ack = 2;
harq_ack[subframe_dl2].ack = 2;
harq_ack[subframe_dl3].ack = 2;
harq_ack[subframe_dl0].send_harq_status = 0;
harq_ack[subframe_dl1].send_harq_status = 0;
harq_ack[subframe_dl2].send_harq_status = 0;
harq_ack[subframe_dl3].send_harq_status = 0;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[1]].ack = 2;
harq_ack[subframe_dl[2]].ack = 2;
harq_ack[subframe_dl[3]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
harq_ack[subframe_dl[1]].send_harq_status = 0;
harq_ack[subframe_dl[2]].send_harq_status = 0;
harq_ack[subframe_dl[3]].send_harq_status = 0;
}
break;
case 6:
if (subframe_tx == 2) { // ACK subframe 5
subframe_ul = 2;
subframe_dl[0] = 5;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 3) { // ACK subframe 6
subframe_ul = 3;
subframe_dl[0] = 6;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 4) { // ACK subframe 9
subframe_ul = 4;
subframe_dl[0] = 9;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 7) { // ACK subframes 0
subframe_ul = 7;
subframe_dl[0] = 0;
subframe_dl[1] = 0xff;
} else if (subframe_tx == 8) { // ACK subframe 1
subframe_ul = 8;
subframe_dl[0] = 1;
subframe_dl[1] = 0xff;
} else {
LOG_E(PHY,
"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n",
subframe_tx,
frame_parms->tdd_config);
return 0;
}
// report ACK/NACK status
o_ACK[cw_idx] = 1;
status = 0;
if ((subframe_dl[0] < 10) && (harq_ack[subframe_dl[0]].send_harq_status)) {
o_ACK[cw_idx] &= harq_ack[subframe_dl[0]].ack;
status += harq_ack[subframe_dl[0]].send_harq_status;
}
// report status = Nbundled
if (!status) {
o_ACK[cw_idx] = 0;
} else {
if (harq_ack[subframe_ul].vDAI_UL < 0xff) {
status += harq_ack[subframe_ul].vDAI_UL;
}
}
// reset ACK/NACK status
if (do_reset) {
LOG_D(PHY,
"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n",
subframe_tx,
subframe_ul,
subframe_dl[0],
subframe_dl[1]);
if (subframe_ul < 10) {
harq_ack[subframe_ul].vDAI_UL = 0xff;
}
if (subframe_dl[0] < 10) {
harq_ack[subframe_dl[0]].vDAI_DL = 0xff;
harq_ack[subframe_dl[0]].ack = 2;
harq_ack[subframe_dl[0]].send_harq_status = 0;
}
}
break;
}
}
//printf("status %d\n",status);
return(status);
return (status);
}
uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,
......@@ -718,7 +1307,7 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1)
default:
LOG_E(PHY,"get_Np() FATAL: unsupported N_RB_DL %d\n",N_RB_DL);
return(0);
return 0;
break;
}
......@@ -730,98 +1319,163 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1)
return(Np[0+plus1]);
}
// Return number of DL subframes (DL + S)
int subframe_num(LTE_DL_FRAME_PARMS *frame_parms){
if (frame_parms->frame_type == FDD)
return 10;
switch (frame_parms->tdd_config) {
case 0:
return 4;
case 1:
return 6;
case 2:
return 8;
case 3:
return 7;
case 4:
return 8;
case 5:
return 9;
case 6:
return 5;
default:
LOG_E(PHY,"Unsupported TDD configuration %d\n",frame_parms->tdd_config);
AssertFatal(frame_parms->tdd_config==1 || frame_parms->tdd_config==3 || frame_parms->tdd_config==4 || frame_parms->tdd_config==5,"subframe x Unsupported TDD configuration");
return(255);
LOG_E(PHY, "Unsupported TDD configuration %d\n", frame_parms->tdd_config);
AssertFatal(frame_parms->tdd_config == 1 || frame_parms->tdd_config == 3 || frame_parms->tdd_config == 4
|| frame_parms->tdd_config == 5,
"subframe x Unsupported TDD configuration");
return (255);
}
}
// Return the type (DL, UL or Special) of subframe
lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,
unsigned char subframe)
{
// if FDD return dummy value
if (frame_parms->frame_type == FDD)
return(SF_DL);
return (SF_DL);
else {
switch (frame_parms->tdd_config) {
case 0:
switch (subframe) {
case 0:
case 5:
return (SF_DL);
break;
case 2:
case 3:
case 4:
case 7:
case 8:
case 9:
return (SF_UL);
break;
default:
return (SF_S);
break;
}
case 1:
switch (subframe) {
case 0:
case 4:
case 5:
case 9:
return(SF_DL);
return (SF_DL);
break;
case 2:
case 3:
case 7:
case 8:
return(SF_UL);
return (SF_UL);
break;
default:
return(SF_S);
return (SF_S);
break;
}
case 2:
switch (subframe) {
case 0:
case 3:
case 4:
case 5:
case 8:
case 9:
return (SF_DL);
break;
case 2:
case 7:
return (SF_UL);
break;
default:
return (SF_S);
break;
}
case 3:
if ((subframe<1) || (subframe>=5))
return(SF_DL);
else if ((subframe>1) && (subframe < 5))
return(SF_UL);
else if (subframe==1)
if ((subframe < 1) || (subframe >= 5))
return (SF_DL);
else if ((subframe > 1) && (subframe < 5))
return (SF_UL);
else if (subframe == 1)
return (SF_S);
else {
LOG_E(PHY,"[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return(255);
LOG_E(PHY, "[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return (255);
}
case 4:
if ((subframe<1) || (subframe>=4))
return(SF_DL);
else if ((subframe>1) && (subframe < 4))
return(SF_UL);
else if (subframe==1)
if ((subframe < 1) || (subframe >= 4))
return (SF_DL);
else if ((subframe > 1) && (subframe < 4))
return (SF_UL);
else if (subframe == 1)
return (SF_S);
else {
LOG_E(PHY,"[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return(255);
LOG_E(PHY, "[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return (255);
}
case 5:
if ((subframe<1) || (subframe>=3))
return(SF_DL);
else if ((subframe>1) && (subframe < 3))
return(SF_UL);
else if (subframe==1)
if ((subframe < 1) || (subframe >= 3))
return (SF_DL);
else if ((subframe > 1) && (subframe < 3))
return (SF_UL);
else if (subframe == 1)
return (SF_S);
else {
LOG_E(PHY,"[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return(255);
LOG_E(PHY, "[PHY_PROCEDURES_LTE] Unknown subframe number\n");
return (255);
}
break;
case 6:
switch (subframe) {
case 0:
case 5:
case 9:
return (SF_DL);
break;
default:
AssertFatal(1==0,"subframe %d Unsupported TDD configuration %d\n",subframe,frame_parms->tdd_config);
return(255);
case 2:
case 3:
case 4:
case 7:
case 8:
return (SF_UL);
break;
default:
return (SF_S);
break;
}
default:
LOG_E(PHY, "subframe %d Unsupported TDD configuration %d\n", subframe, frame_parms->tdd_config);
return (255);
}
}
}
......@@ -852,8 +1506,7 @@ dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t
return ret;
}
// Return the HARQ PID of a PHICH by finding its corresponding PUSCH timing
uint8_t phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe)
{
......@@ -863,6 +1516,7 @@ uint8_t phich_subframe_to_harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t fram
phich_subframe2_pusch_subframe(frame_parms,subframe)));
}
// Return if whether or not it is a possible PHICH subframe (Refer to 3GPP TS 36213, Table 8.3-1)
unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
{
......@@ -870,37 +1524,53 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub
return(1);
} else {
switch (frame_parms->tdd_config) {
case 0:
if ((subframe == 0) || (subframe == 1) || (subframe == 5) || (subframe == 6))
return 1;
break;
case 1:
if ((subframe == 1) || (subframe == 4) || (subframe == 6) || (subframe == 9))
return(1);
return 1;
break;
case 2:
if ((subframe == 3) || (subframe == 8))
return 1;
break;
case 3:
if ((subframe == 0) || (subframe == 8) || (subframe == 9))
return(1);
return 1;
break;
case 4:
if ((subframe == 8) || (subframe == 9) )
return(1);
if ((subframe == 8) || (subframe == 9))
return 1;
break;
case 5:
if (subframe == 8)
return(1);
return 1;
break;
case 6:
if ((subframe == 0) || (subframe == 1) || (subframe == 5) || (subframe == 6) || (subframe == 9))
return 1;
break;
default:
return(0);
return 0;
break;
}
}
return(0);
return 0;
}
......
......@@ -1124,6 +1124,64 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
}
break;
case 6: // DL:S:UL:UL:UL:DL:S:UL:UL:DL
harq_ack0 = 2; // DTX
M = 1;
if (subframe == 2) {
candidate_dl[0] = 5;
} else if (subframe == 3) {
candidate_dl[0] = 6;
} else if (subframe == 4) {
candidate_dl[0] = 9;
} else if (subframe == 7) {
candidate_dl[0] = 0;
} else if (subframe == 8) {
candidate_dl[0] = 1;
} else {
LOG_E(PHY,
"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal tx-subframe %d for tdd_config %d\n",
ue->Mod_id,
proc->frame_tx,
subframe,
frame_parms->tdd_config);
return (0);
}
if (harq_ack[candidate_dl[0]].send_harq_status > 0) {
last_dl = candidate_dl[0];
}
if (last_dl >= 10) {
LOG_E(PHY,
"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal rx-subframe %d (tx-subframe %d) for tdd_config %d\n",
ue->Mod_id,
proc->frame_tx,
last_dl,
subframe,
frame_parms->tdd_config);
return (0);
}
LOG_D(PHY, "SFN/SF %d/%d calculating n1_pucch0 from last_dl=%d\n", proc->frame_tx % 1024, proc->subframe_tx, last_dl);
// i=0
nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[last_dl];
n1_pucch0 = get_Np(frame_parms->N_RB_DL, nCCE0, 0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
harq_ack0 = b[0];
if (harq_ack0 != 2) { // DTX
if (SR == 0) {
b[0] = harq_ack0;
b[1] = harq_ack0;
ue->pucch_sel[subframe] = 0;
return (n1_pucch0);
} else {
b[0] = harq_ack0;
b[1] = harq_ack0;
return (ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
}
}
break;
} // switch tdd_config
}
......
......@@ -1329,9 +1329,10 @@ initiate_ra_proc(module_id_t module_idP,
abort();
case 1 :
case 3 :
case 4 :
case 3:
case 4:
case 5 :
case 6:
offset = 6;
break;
}
......
......@@ -264,6 +264,7 @@ generate_dlsch_header(unsigned char *mac_header,
}
//------------------------------------------------------------------------------
// For Dl subframe, we allocate the DAI of UL subframe accorting table (3GPP TS 36213, Table 10.1.3.1-1 K PDSCH)
void
set_ul_DAI(int module_idP,
int UE_idP,
......@@ -318,7 +319,23 @@ set_ul_DAI(int module_idP,
case 2:
// if ((subframeP==3)||(subframeP==8))
// UE_info->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
// UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
switch (subframeP) {
case 0:
case 1:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI;
break;
case 4:
case 5:
case 8:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI;
break;
case 9:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI;
break;
}
break;
case 3:
......@@ -361,8 +378,27 @@ set_ul_DAI(int module_idP,
break;
case 6:
// if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9))
// UE_info->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
switch (subframeP) {
case 0:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI;
break;
case 1:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI;
break;
case 5:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI;
break;
case 6:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI;
break;
case 9:
UE_info->UE_template[CC_idP][UE_idP].DAI_ul[4] = DAI;
break;
}
break;
default:
......
......@@ -3097,11 +3097,16 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
if (cc->tdd_Config) {
switch (cc->tdd_Config->subframeAssignment) {
case 1:
case 0:
case 2:
case 6:
if( subframeP == 1 || subframeP == 6 ) cqi_req=0;
break;
case 3:
case 4:
case 5:
if( subframeP == 1 ) cqi_req=0;
break;
......
......@@ -212,7 +212,6 @@ get_Msg3alloc(COMMON_channels_t *cc,
sub_frame_t *subframe)
//------------------------------------------------------------------------------
{
// Fill in other TDD Configuration!!!!
int subframeAssignment;
if (cc->tdd_Config == NULL) { // FDD
......@@ -227,7 +226,18 @@ get_Msg3alloc(COMMON_channels_t *cc,
} else { // TDD
subframeAssignment = (int) cc->tdd_Config->subframeAssignment;
if (subframeAssignment == 1) {
if (subframeAssignment == 0) {
switch (current_subframe) {
case 0:
*subframe = 7;
*frame = current_frame;
break;
case 5:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
}
} else if (subframeAssignment == 1) {
switch (current_subframe) {
case 0:
*subframe = 7;
......@@ -249,6 +259,26 @@ get_Msg3alloc(COMMON_channels_t *cc,
*frame = (current_frame + 1) & 1023;
break;
}
} else if (subframeAssignment == 2) {
switch (current_subframe) {
case 0:
case 3:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
case 4:
case 5:
case 8:
*subframe = 7;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 2;
*frame = (current_frame + 2) & 1023;
break;
}
} else if (subframeAssignment == 3) {
switch (current_subframe) {
case 0:
......@@ -311,6 +341,23 @@ get_Msg3alloc(COMMON_channels_t *cc,
*frame = (current_frame + 2) & 1023;
break;
}
} else if (subframeAssignment == 6) {
switch (current_subframe) {
case 0:
*subframe = 7;
*frame = current_frame;
break;
case 5:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
case 9:
*subframe = 7;
*frame = (current_frame + 1) & 1023;
break;
}
}
}
......@@ -341,12 +388,28 @@ get_Msg3allocret(COMMON_channels_t *cc,
} else {
subframeAssignment = (int) cc->tdd_Config->subframeAssignment;
if (subframeAssignment == 1) {
if (subframeAssignment == 0) {
// original PUSCH in 2, PHICH in 6 (S), ret in 2
// original PUSCH in 3, PHICH in 0, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 4
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 5, ret in 9
// original PUSCH in 9, PHICH in 5, ret in 9
*frame = (current_frame + 1) & 1023;
if ((*subframe == 3) || (*subframe == 8)) {
*subframe = ((*subframe == 3) ? 4 : 9);
}
} else if (subframeAssignment == 1) {
// original PUSCH in 2, PHICH in 6 (S), ret in 2
// original PUSCH in 3, PHICH in 9, ret in 3
// original PUSCH in 7, PHICH in 1 (S), ret in 7
// original PUSCH in 8, PHICH in 4, ret in 8
*frame = (current_frame + 1) & 1023;
} else if (subframeAssignment == 2) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
// original PUSCH in 4, PHICH in 0, ret in 4 next frame
*frame = (current_frame + 1) & 1023;
} else if (subframeAssignment == 3) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
// original PUSCH in 3, PHICH in 9, ret in 3 next frame
......@@ -359,6 +422,34 @@ get_Msg3allocret(COMMON_channels_t *cc,
} else if (subframeAssignment == 5) {
// original PUSCH in 2, PHICH in 8, ret in 2 next frame
*frame = (current_frame + 1) & 1023;
} else if (cc->tdd_Config->subframeAssignment == 6) {
// original PUSCH in 2, PHICH in 6 (S), ret in 3
// original PUSCH in 3, PHICH in 9, ret in 4
// original PUSCH in 4, PHICH in 0, ret in 7
// original PUSCH in 7, PHICH in 1 (S), ret in 8
// original PUSCH in 8, PHICH in 5, ret in 2+
*frame = (current_frame + 1) & 1023;
switch (*subframe) {
case 2:
*subframe = 3;
break;
case 3:
*subframe = 4;
break;
case 4:
*subframe = 7;
break;
case 7:
*subframe = 8;
break;
case 8:
*subframe = 2;
*frame = (current_frame + 1) & 1023;
break;
default:
break;
}
}
}
......@@ -366,6 +457,8 @@ get_Msg3allocret(COMMON_channels_t *cc,
}
//------------------------------------------------------------------------------
// In TDD modes 1-5, each HarqPID is associated with a unique subframe and the number of harq processes equals the
// number of UL subframes. Modes 0 and 6 have more processes than UL subframes so HarqPID depends on sfn
uint8_t
subframe2harqpid(COMMON_channels_t *cc,
frame_t frame,
......@@ -379,6 +472,14 @@ subframe2harqpid(COMMON_channels_t *cc,
ret = (((frame << 1) + subframe) & 7);
} else {
switch (cc->tdd_Config->subframeAssignment) {
uint32_t cycle_idx;
case 0:
cycle_idx = 7 - frame % 7;
if (subframe < 5) {
return (cycle_idx + subframe - 2) % 7;
} else {
return (cycle_idx + subframe - 4) % 7;
}
case 1:
if (subframe == 2 || subframe == 3 || subframe == 7 || subframe == 8) {
switch (subframe) {
......@@ -393,9 +494,10 @@ subframe2harqpid(COMMON_channels_t *cc,
break;
default:
AssertFatal(1 == 0, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
AssertFatal(1 == 0,
"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframe,
(int) cc->tdd_Config->subframeAssignment);
(int)cc->tdd_Config->subframeAssignment);
break;
}
}
......@@ -429,6 +531,13 @@ subframe2harqpid(COMMON_channels_t *cc,
(int) cc->tdd_Config->subframeAssignment);
ret = (subframe - 2);
break;
case 6:
cycle_idx = 6 - frame % 6;
if (subframe < 5) {
return (cycle_idx + subframe - 2) % 6;
} else {
return (cycle_idx + subframe - 4) % 6;
}
default:
AssertFatal(1 == 0, "subframe2_harq_pid, Unsupported TDD mode %d\n",
......@@ -441,156 +550,32 @@ subframe2harqpid(COMMON_channels_t *cc,
}
//------------------------------------------------------------------------------
uint8_t
get_Msg3harqpid(COMMON_channels_t *cc,
frame_t frame,
sub_frame_t current_subframe)
int is_UL_sf(COMMON_channels_t *ccP, sub_frame_t subframeP)
//------------------------------------------------------------------------------
{
uint8_t ul_subframe = 0;
uint32_t ul_frame = 0;
// if FDD return dummy value
if (ccP->tdd_Config == NULL)
return 0;
if (cc->tdd_Config == NULL) { // FDD
ul_subframe = (current_subframe > 3) ? (current_subframe - 4) : (current_subframe + 6);
ul_frame = (current_subframe > 3) ? ((frame + 1) & 1023) : frame;
} else {
switch (cc->tdd_Config->subframeAssignment) {
case 1:
switch (current_subframe) {
case 9:
switch (ccP->tdd_Config->subframeAssignment) {
case 0:
ul_subframe = 7;
break;
case 5:
case 7:
ul_subframe = 2;
break;
}
break;
case 3:
switch (current_subframe) {
switch (subframeP) {
case 0:
case 5:
case 6:
ul_subframe = 2;
break;
case 7:
ul_subframe = 3;
break;
case 8:
ul_subframe = 4;
break;
case 9:
ul_subframe = 2;
break;
}
break;
return 0;
case 2:
case 3:
case 4:
switch (current_subframe) {
case 0:
case 5:
case 6:
case 7:
case 8:
case 9:
ul_subframe = 2;
break;
case 7:
ul_subframe = 3;
break;
}
break;
case 5:
ul_subframe = 2;
break;
return 1;
default:
LOG_E(PHY, "get_Msg3_harq_pid: Unsupported TDD configuration %d\n",
(int) cc->tdd_Config->subframeAssignment);
AssertFatal(1 == 0, "get_Msg3_harq_pid: Unsupported TDD configuration");
break;
}
}
return (subframe2harqpid(cc,
ul_frame,
ul_subframe));
}
//------------------------------------------------------------------------------
uint32_t
pdcchalloc2ulframe(COMMON_channels_t *ccP,
uint32_t frame,
uint8_t n)
//------------------------------------------------------------------------------
{
uint32_t ul_frame = (frame + (n >= 6 ? 1 : 0));
if (ccP->tdd_Config) {
if (ccP->tdd_Config->subframeAssignment == 1) {
if (n == 1 || n == 6) {
ul_frame = (frame + (n == 1 ? 0 : 1));
}
} else if (ccP->tdd_Config->subframeAssignment == 6) {
if (n == 0 || n == 1 || n == 5 || n == 6) {
ul_frame = (frame + (n >= 5 ? 1 : 0));
} else if (n == 9) {
ul_frame = (frame + 1);
}
}
}
LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n",
frame,
n,
ul_frame);
return ul_frame;
}
//------------------------------------------------------------------------------
uint8_t
pdcchalloc2ulsubframe(COMMON_channels_t *ccP,
uint8_t n)
//------------------------------------------------------------------------------
{
uint8_t ul_subframe;
if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 1 && (n == 1 || n == 6)) // tdd_config 0,1 SF 1,5
ul_subframe = ((n + 6) % 10);
else if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 6 && (n == 0 || n == 1 || n == 5 || n == 6))
ul_subframe = ((n + 7) % 10);
else if (ccP->tdd_Config && ccP->tdd_Config->subframeAssignment == 6 && n == 9) // tdd_config 6 SF 9
ul_subframe = ((n + 5) % 10);
else
ul_subframe = ((n + 4) % 10);
LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n",
n,
ul_subframe);
return ul_subframe;
}
//------------------------------------------------------------------------------
int
is_UL_sf(COMMON_channels_t *ccP,
sub_frame_t subframeP)
//------------------------------------------------------------------------------
{
// if FDD return dummy value
if (ccP->tdd_Config == NULL)
return 0;
switch (ccP->tdd_Config->subframeAssignment) {
}
break;
case 1:
switch (subframeP) {
case 0:
......@@ -611,6 +596,26 @@ is_UL_sf(COMMON_channels_t *ccP,
break;
case 2:
switch (subframeP) {
case 0:
case 3:
case 4:
case 5:
case 8:
case 9:
return (0);
break;
case 2:
case 7:
return (1);
break;
default:
return (0);
break;
}
break;
case 3:
if (subframeP <= 1 || subframeP >= 5)
return 0;
......@@ -629,11 +634,27 @@ is_UL_sf(COMMON_channels_t *ccP,
return 1;
case 6:
switch (subframeP) {
case 0:
case 5:
case 9:
return 0;
case 2:
case 3:
case 4:
case 7:
case 8:
return 1;
default:
AssertFatal(1 == 0, "subframe %d Unsupported TDD configuration %d\n",
subframeP,
(int) ccP->tdd_Config->subframeAssignment);
return 0;
}
break;
default:
AssertFatal(1 == 0, "subframe %d Unsupported TDD configuration %d\n", subframeP, (int)ccP->tdd_Config->subframeAssignment);
}
return 0;
......@@ -673,23 +694,54 @@ ul_subframe2_k_phich(COMMON_channels_t *cc,
sub_frame_t ul_subframe)
//------------------------------------------------------------------------------
{
if(cc->tdd_Config) { //TODO fill other tdd config
switch(cc->tdd_Config->subframeAssignment) {
if (cc->tdd_Config) {
switch (cc->tdd_Config->subframeAssignment) {
case 0:
if (ul_subframe == 2 || ul_subframe == 7)
return 4;
else if (ul_subframe == 3 || ul_subframe == 8)
return 7;
else if (ul_subframe == 4 || ul_subframe == 9)
return 6;
else
return 255;
break;
case 1:
if(ul_subframe == 2 || ul_subframe == 7)
if (ul_subframe == 2 || ul_subframe == 7)
return 4;
else if(ul_subframe == 3 || ul_subframe == 8)
else if (ul_subframe == 3 || ul_subframe == 8)
return 6;
return 255;
case 2:
if (ul_subframe == 2 || ul_subframe == 7)
return 6;
else
return 255;
case 3:
if (ul_subframe == 2 || ul_subframe == 3 || ul_subframe == 4)
return 6;
case 4:
if (ul_subframe == 2 || ul_subframe == 3)
return 6;
case 5:
if (ul_subframe == 2)
return 6;
case 6:
if (ul_subframe == 2 || ul_subframe == 7)
return 4;
else if (ul_subframe == 3 || ul_subframe == 4)
return 6;
else if (ul_subframe == 8)
return 7;
else
return 255;
break;
}
}
......@@ -2436,84 +2488,6 @@ get_tmode(module_id_t module_idP,
return 0;
}
//------------------------------------------------------------------------------
int8_t
get_ULharq(module_id_t module_idP,
int CC_idP,
uint16_t frameP,
uint8_t subframeP)
//------------------------------------------------------------------------------
{
int8_t ret = -1;
eNB_MAC_INST *eNB = RC.mac[module_idP];
COMMON_channels_t *cc = &eNB->common_channels[CC_idP];
if (cc->tdd_Config == NULL) { // FDD
ret = (((frameP << 1) + subframeP) & 7);
} else {
switch (cc->tdd_Config->subframeAssignment) {
case 1:
switch (subframeP) {
case 2:
case 3:
ret = (subframeP - 2);
break;
case 7:
case 8:
ret = (subframeP - 5);
break;
default:
AssertFatal(1 == 0, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframeP,
(int) cc->tdd_Config->subframeAssignment);
break;
}
break;
case 2:
AssertFatal((subframeP == 2) || (subframeP == 7), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframeP,
(int) cc->tdd_Config->subframeAssignment);
ret = (subframeP / 7);
break;
case 3:
AssertFatal((subframeP > 1) && (subframeP < 5), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframeP,
(int) cc->tdd_Config->subframeAssignment);
ret = (subframeP - 2);
break;
case 4:
AssertFatal((subframeP > 1) && (subframeP < 4), "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframeP,
(int) cc->tdd_Config->subframeAssignment);
ret = (subframeP - 2);
break;
case 5:
AssertFatal(subframeP == 2, "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",
subframeP,
(int) cc->tdd_Config->subframeAssignment);
ret = (subframeP - 2);
break;
default:
AssertFatal(1 == 0, "subframe2_harq_pid, Unsupported TDD mode %d\n",
(int) cc->tdd_Config->subframeAssignment);
break;
}
}
AssertFatal(ret != -1, "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t) ret,
frameP,
subframeP);
return ret;
}
//------------------------------------------------------------------------------
uint16_t
getRIV(uint16_t N_RB_DL,
......@@ -3626,10 +3600,8 @@ int CCE_try_allocate_ulsch(int module_id,
}
//------------------------------------------------------------------------------
void
get_retransmission_timing(LTE_TDD_Config_t *tdd_Config,
frame_t *frameP,
sub_frame_t *subframeP)
// Used for MSG 4
void get_retransmission_timing(LTE_TDD_Config_t *tdd_Config, frame_t *frameP, sub_frame_t *subframeP)
//------------------------------------------------------------------------------
{
if (tdd_Config == NULL) {
......@@ -3639,12 +3611,14 @@ get_retransmission_timing(LTE_TDD_Config_t *tdd_Config,
*subframeP = (*subframeP + 8) % 10;
} else {
switch (tdd_Config->subframeAssignment) { //TODO fill in other TDD configs
default:
printf("%s:%d: TODO\n",
__FILE__,
__LINE__);
abort();
switch (tdd_Config->subframeAssignment) { // TODO fill in other TDD configs
case 0:
if (*subframeP == 0 || *subframeP == 5) {
*subframeP += 0;
*frameP = (*frameP + 1) % 1024;
} else {
LOG_E(MAC, "Illegal dl subframe %d for tdd config %ld\n", *subframeP, tdd_Config->subframeAssignment);
}
break;
case 1:
......@@ -3657,12 +3631,52 @@ get_retransmission_timing(LTE_TDD_Config_t *tdd_Config,
*frameP = (*frameP + (*subframeP / 10)) % 1024;
*subframeP %= 10;
} else {
AssertFatal(2 == 1, "Illegal dl subframe %d for tdd config %ld\n",
*subframeP,
tdd_Config->subframeAssignment);
AssertFatal(2 == 1, "Illegal dl subframe %d for tdd config %ld\n", *subframeP, tdd_Config->subframeAssignment);
}
break;
case 2:
if (*subframeP == 0) {
*subframeP = 4;
*frameP = (*frameP + 1) % 1024;
} else if (*subframeP == 3) {
*subframeP = 5;
*frameP = (*frameP + 1) % 1024;
} else if (*subframeP == 4) {
*subframeP = 8;
*frameP = (*frameP + 1) % 1024;
} else if (*subframeP == 5) {
*subframeP = 9;
*frameP = (*frameP + 1) % 1024;
} else if (*subframeP == 8) {
*subframeP = 0;
*frameP = (*frameP + 2) % 1024;
} else if (*subframeP == 9) {
*subframeP = 3;
*frameP = (*frameP + 2) % 1024;
} else {
LOG_E(MAC, "Illegal dl subframe %d for tdd config %ld\n", *subframeP, tdd_Config->subframeAssignment);
return;
}
break;
case 6:
if (*subframeP == 0) {
*subframeP = 5;
*frameP = (*frameP + 1) % 1024;
} else if (*subframeP == 9) {
*subframeP = 0;
*frameP = (*frameP + 2) % 1024;
} else if (*subframeP == 5) {
*subframeP = 9;
*frameP = (*frameP + 1) % 1024;
} else {
AssertFatal(2 == 1, "Illegal dl subframe %d for tdd config %ld\n", *subframeP, tdd_Config->subframeAssignment);
}
break;
default:
printf("%s:%d: TODO\n", __FILE__, __LINE__);
abort();
}
}
......@@ -3676,10 +3690,17 @@ get_dl_subframe_count(int tdd_config_sfa,
//------------------------------------------------------------------------------
{
uint8_t tdd1[10] = {1, -1, -1, -1, 2, 3, -1, -1, -1, 4}; // special subframes 1,6 are excluded
uint8_t tdd6[10] = {1, -1, -1, -1, -1, 2, -1, -1, -1, 3}; // special subframes 1,6 are excluded
switch (tdd_config_sfa) {// TODO fill in other tdd configs
case 1:
return tdd1[subframeP];
break;
case 6:
return tdd6[subframeP];
break;
default:
AssertFatal(1 == 0, "TDD config not supported");
}
return -1;
......@@ -3714,6 +3735,23 @@ frame_subframe2_dl_harq_pid(LTE_TDD_Config_t *tdd_Config,
count,
harq_pid);
return harq_pid;
case 6:
count = get_dl_subframe_count(tdd_Config->subframeAssignment, subframeP);
harq_pid = (((frame_cnt * 1024 + abs_frameP) * 3) - 1 + count) % 6; // 3 dl subframes in a frame
if (harq_pid < 0) {
harq_pid += 6;
}
LOG_D(MAC,
"[frame_subframe2_dl_harq_pid] (%d,%d) calculate harq_pid ((( %d * 1024 + %d) *3) - 1 + %d) = %d \n",
(abs_frameP + 1024) % 1024,
subframeP,
frame_cnt,
abs_frameP,
count,
harq_pid);
return harq_pid;
}
} else {
return ((abs_frameP * 10) + subframeP) & 7;
......@@ -3792,6 +3830,18 @@ ul_ACK_subframe2M(LTE_TDD_Config_t *tdd_Config,
subframe,
tdd_Config->subframeAssignment);
break;
case 6:
if (subframe == 2 || subframe == 3 || subframe == 4 || subframe == 7 || subframe == 8) {
return 1;
} else {
LOG_E(PHY,
"eNB_scheduler_primitives.c/ul_ACK_subframe2M: illegal subframe %d for tdd_config %ld\n",
subframe,
tdd_Config->subframeAssignment);
return (0);
}
break;
}
return 0;
......@@ -3807,11 +3857,26 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
if (tdd_Config == NULL) {
return ((subframe < 4) ? subframe + 6 : subframe - 4);
}
switch (tdd_Config->subframeAssignment) {
case 0:
if (subframe == 2) { // ACK subframe 6
return (6);
} else if (subframe == 4) { // ACK subframe 0
return (0);
} else if (subframe == 7) { // ACK subframe 1
return (1);
} else if (subframe == 9) { // ACK subframe 5
return (5);
} else {
LOG_E(MAC, "illegal subframe %d for tdd_config %ld\n", subframe, tdd_Config->subframeAssignment);
return (0);
}
break;
case 3:
if (subframe == 2) { // ACK subframes 5 and 6
if (ACK_index == 2) return 1;
if (ACK_index == 2)
return 1;
return (5 + ACK_index);
}
......@@ -3831,9 +3896,10 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
case 4:
if (subframe == 2) { // ACK subframes 0, 4 and 5
//if (ACK_index==2)
// if (ACK_index==2)
// return(1); TBC
if (ACK_index == 2) return 0;
if (ACK_index == 2)
return 0;
return (4 + ACK_index);
}
......@@ -3868,6 +3934,41 @@ ul_ACK_subframe2dl_subframe(LTE_TDD_Config_t *tdd_Config,
subframe,
tdd_Config->subframeAssignment);
break;
case 2:
if (subframe == 2) { // ACK subframes 4 and 5 and 8
if (ACK_index == 2) {
return (8);
}
return (4 + ACK_index);
} else if (subframe == 7) { // ACK subframes 9 and 0 and 3
if (ACK_index == 2) {
return (3);
}
return ((9 + ACK_index) % 10); // To be updated
} else {
LOG_E(MAC, "illegal subframe %d for tdd_config %ld\n", subframe, tdd_Config->subframeAssignment);
return 255;
}
break;
case 6:
if (subframe == 2) { // ACK subframe 5
return (5);
} else if (subframe == 3) { // ACK subframe 6
return (6);
} else if (subframe == 4) { // ACK subframe 9
return (9);
} else if (subframe == 7) { // ACK subframe 0
return (0);
} else if (subframe == 8) { // ACK subframe 1
return (1);
} else {
LOG_E(MAC, "illegal subframe %d for tdd_config %ld\n", subframe, tdd_Config->subframeAssignment);
return (0);
}
break;
}
return 0;
......@@ -3933,8 +4034,22 @@ extract_harq(module_id_t mod_idP,
subframeP,
m);
if (frameP==1023&&subframeP>5) frame_tx=-1;
else frame_tx = subframeP < 4 ? frameP -1 : frameP;
if (subframe_tx == 255) {
AssertFatal(subframe_tx != 0xff, "illegal subframe number 0xff\n");
}
if (cc->tdd_Config->subframeAssignment == 2 || cc->tdd_Config->subframeAssignment == 6) {
if (subframe_tx > subframeP) {
frame_tx = (frameP + 1023) % 1024; // will reduce by one
} else {
frame_tx = frameP;
}
} else {
if (frameP == 1023 && subframeP > 5)
frame_tx = -1;
else
frame_tx = subframeP < 4 ? frameP - 1 : frameP;
}
harq_pid = frame_subframe2_dl_harq_pid(cc->tdd_Config,
frame_tx,
......
......@@ -792,15 +792,36 @@ rx_sdu(const module_id_t enb_mod_idP,
if(mac->common_channels[CC_idP].tdd_Config != NULL) {
switch(mac->common_channels[CC_idP].tdd_Config->subframeAssignment) {
case 0:
ra->Msg4_frame = frameP + 1;
ra->Msg4_subframe = ((subframeP < 5) ? 0 : 5);
break;
case 1:
ra->Msg4_frame = frameP + ((subframeP > 2) ? 1 : 0);
ra->Msg4_subframe = (subframeP + 7) % 10;
break;
case 2:
ra->Msg4_frame = (frameP + ((subframeP > 2) ? 1 : 0)) % 1024;
ra->Msg4_subframe = (subframeP + 6) % 10;
break;
case 3:
case 4:
case 5:
ra->Msg4_frame = frameP;
ra->Msg4_subframe = subframeP + 4;
break;
case 6:
ra->Msg4_frame = frameP + ((subframeP < 5) ? 0 : 1);
ra->Msg4_subframe = ((subframeP < 5) ? 9 : 5);
break;
default:
printf("%s:%d: TODO\n", __FILE__, __LINE__);
abort();
// TODO need to be complete for other tdd configs.
}
} else {
/* Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now,
......@@ -1562,12 +1583,17 @@ schedule_ulsch_rnti(module_id_t module_idP,
* Subframes:36.213/7.2.3 CQI definition */
if (cc[CC_id].tdd_Config) {
switch (cc[CC_id].tdd_Config->subframeAssignment) {
case 0:
case 1:
case 2:
case 6:
if (subframeP == 1 || subframeP == 6)
cqi_req = 0;
break;
case 3:
case 4:
case 5:
if (subframeP == 1)
cqi_req = 0;
break;
......
......@@ -1051,14 +1051,6 @@ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe);
unsigned char ul_ACK_subframe2M(LTE_TDD_Config_t *tdd_Config,unsigned char subframe);
uint8_t get_Msg3harqpid(COMMON_channels_t *cc,
frame_t frame, sub_frame_t current_subframe);
uint32_t pdcchalloc2ulframe(COMMON_channels_t *ccP, uint32_t frame,
uint8_t n);
uint8_t pdcchalloc2ulsubframe(COMMON_channels_t *ccP, uint8_t n);
int is_UL_sf(COMMON_channels_t *ccP, sub_frame_t subframeP);
uint8_t getQm(uint8_t mcs);
......
......@@ -2738,6 +2738,8 @@ do_RRCConnectionSetup(
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 71 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid;
} else {
switch (carrier->sib1->tdd_Config->subframeAssignment) {
case 0:
case 6:
case 1:
switch(frame_parms->N_RB_UL) {
case 25:
......@@ -2779,6 +2781,12 @@ do_RRCConnectionSetup(
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7+
(ue_context_pP->local_uid&1); // Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 3 for UE2, 2 for UE3 , etc..)
break;
case 6: // To be checked : Multi UE
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex =
18
+ (ue_context_pP->local_uid & 3)
* 5; // Isr = 18 (every 20 subframes, offset=3 for UE0, 7 for UE1, 2 for UE2, 7 for UE3 , 2 for UE4 etc..)
break;
default:
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7; // Isr = 5 (every 10 subframes, offset=2 for all UE0 etc..)
......
......@@ -4477,6 +4477,12 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7 + (ue_context_pP->local_uid &
1); // Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 3 for UE2, 2 for UE3 , etc..)
break;
case 6:
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex =
18
+ (ue_context_pP->local_uid & 3)
* 5; // Isr = 18 (every 20 subframes, offset=3 for UE0, 7 for UE1, 2 for UE2, 7 for UE3 , 2 for UE4 etc..)
break;
default:
physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7; // Isr = 5 (every 10 subframes, offset=2 for all UE0 etc..)
......
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