Use qbit-TA to update Timing Advance
Separate qbit-TA to TA conversion into separate function and use it for computing and updating Timing Advance. Note: the code was tested with TA=0 only to make sure it does not introduce regressions. Change-Id: I96fdbb20b09fb85fdd9fb6dcf3c25f6bee7f80e4 Fixes: OS#1531
This commit is contained in:
parent
4ea452689d
commit
d71e8b32e3
27
src/bts.cpp
27
src/bts.cpp
|
@ -478,8 +478,7 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit,
|
|||
int rc;
|
||||
int plen;
|
||||
uint8_t usf = 7;
|
||||
uint8_t tsc;
|
||||
uint16_t ta;
|
||||
uint8_t tsc, ta = qta2ta(qta);
|
||||
uint16_t ms_class = 0;
|
||||
uint16_t priority = 0;
|
||||
|
||||
|
@ -490,13 +489,6 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit,
|
|||
|
||||
sb = is_single_block(ra, burst_type, is_11bit, &ms_class, &priority);
|
||||
|
||||
if (qta < 0)
|
||||
qta = 0;
|
||||
if (qta > 252)
|
||||
qta = 252;
|
||||
|
||||
ta = qta >> 2;
|
||||
|
||||
if (sb) {
|
||||
rc = sba()->alloc(&trx_no, &ts_no, &sb_fn, ta);
|
||||
if (rc < 0)
|
||||
|
@ -1475,6 +1467,23 @@ int gprs_rlcmac_pdch::rcv_block_gprs(uint8_t *data, uint32_t fn,
|
|||
return rc;
|
||||
}
|
||||
|
||||
void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts,
|
||||
uint8_t ta)
|
||||
{
|
||||
struct gprs_rlcmac_ul_tbf *tbf =
|
||||
bts_main_data()->bts->ul_tbf_by_poll_fn(fn, trx_no, ts);
|
||||
if (!tbf)
|
||||
LOGP(DL1IF, LOGL_DEBUG, "[%s] update TA = %u ignored due to "
|
||||
"unknown UL TBF on TRX = %d, TS = %d, FN = %d\n",
|
||||
p, ta, trx_no, ts, fn);
|
||||
else if (tbf->ta() != ta) {
|
||||
LOGP(DL1IF, LOGL_INFO, "[%s] Updating TA %u -> %u on "
|
||||
"TRX = %d, TS = %d, FN = %d\n",
|
||||
p, tbf->ta(), ta, trx_no, ts, fn);
|
||||
tbf->set_ta(ta);
|
||||
}
|
||||
}
|
||||
|
||||
gprs_rlcmac_tbf *gprs_rlcmac_pdch::tbf_from_list_by_tfi(
|
||||
LListHead<gprs_rlcmac_tbf> *tbf_list, uint8_t tfi,
|
||||
enum gprs_rlcmac_tbf_direction dir)
|
||||
|
|
|
@ -143,6 +143,15 @@ struct gprs_rlcmac_trx {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts,
|
||||
uint8_t ta);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* This is the data from C. As soon as our minimal compiler is gcc 4.7
|
||||
* we can start to compile pcu_vty.c with c++ and remove the split.
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <lc15_l1_if.h>
|
||||
#include <gprs_debug.h>
|
||||
#include <pcu_l1_if.h>
|
||||
#include <bts.h>
|
||||
|
||||
extern void *tall_pcu_ctx;
|
||||
|
||||
|
@ -204,6 +205,8 @@ static int handle_ph_data_ind(struct lc15l1_hdl *fl1h,
|
|||
data_ind->msgUnitParam.u8Size-1);
|
||||
|
||||
get_meas(&meas, &data_ind->measParam);
|
||||
bts_update_tbf_ta("PH-DATA", data_ind->u32Fn, fl1h->trx_no,
|
||||
data_ind->u8Tn, qta2ta(meas.bto));
|
||||
|
||||
switch (data_ind->sapi) {
|
||||
case GsmL1_Sapi_Pdtch:
|
||||
|
@ -235,31 +238,12 @@ static int handle_ph_data_ind(struct lc15l1_hdl *fl1h,
|
|||
|
||||
static int handle_ph_ra_ind(struct lc15l1_hdl *fl1h, GsmL1_PhRaInd_t *ra_ind)
|
||||
{
|
||||
uint8_t acc_delay;
|
||||
|
||||
if (ra_ind->measParam.fLinkQuality < MIN_QUAL_RACH)
|
||||
return 0;
|
||||
|
||||
DEBUGP(DL1IF, "Rx PH-RA.ind");
|
||||
|
||||
/* check for under/overflow / sign */
|
||||
if (ra_ind->measParam.i16BurstTiming < 0)
|
||||
acc_delay = 0;
|
||||
else
|
||||
acc_delay = ra_ind->measParam.i16BurstTiming >> 2;
|
||||
|
||||
LOGP(DL1IF, LOGL_NOTICE, "got (P)RACH request, TA = %u (ignored)\n",
|
||||
acc_delay);
|
||||
|
||||
#warning "The (P)RACH request is just dropped here"
|
||||
|
||||
#if 0
|
||||
if (acc_delay > bts->max_ta) {
|
||||
LOGP(DL1C, LOGL_INFO, "ignoring RACH request %u > max_ta(%u)\n",
|
||||
acc_delay, btsb->max_ta);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
bts_update_tbf_ta("PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,
|
||||
qta2ta(ra_ind->measParam.i16BurstTiming));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <sysmo_l1_if.h>
|
||||
#include <gprs_debug.h>
|
||||
#include <pcu_l1_if.h>
|
||||
#include <bts.h>
|
||||
|
||||
extern void *tall_pcu_ctx;
|
||||
|
||||
|
@ -189,6 +190,8 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1h,
|
|||
data_ind->msgUnitParam.u8Size-1);
|
||||
|
||||
get_meas(&meas, &data_ind->measParam);
|
||||
bts_update_tbf_ta("PH-DATA", data_ind->u32Fn, fl1h->trx_no,
|
||||
data_ind->u8Tn, qta2ta(meas.bto));
|
||||
|
||||
switch (data_ind->sapi) {
|
||||
case GsmL1_Sapi_Pdtch:
|
||||
|
@ -220,33 +223,14 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1h,
|
|||
|
||||
static int handle_ph_ra_ind(struct femtol1_hdl *fl1h, GsmL1_PhRaInd_t *ra_ind)
|
||||
{
|
||||
uint8_t acc_delay;
|
||||
|
||||
pcu_rx_ra_time(ra_ind->u16Arfcn, ra_ind->u32Fn, ra_ind->u8Tn);
|
||||
|
||||
if (ra_ind->measParam.fLinkQuality < MIN_QUAL_RACH)
|
||||
return 0;
|
||||
|
||||
DEBUGP(DL1IF, "Rx PH-RA.ind");
|
||||
|
||||
/* check for under/overflow / sign */
|
||||
if (ra_ind->measParam.i16BurstTiming < 0)
|
||||
acc_delay = 0;
|
||||
else
|
||||
acc_delay = ra_ind->measParam.i16BurstTiming >> 2;
|
||||
|
||||
LOGP(DL1IF, LOGL_NOTICE, "got (P)RACH request, TA = %u (ignored)\n",
|
||||
acc_delay);
|
||||
|
||||
#warning "The (P)RACH request is just dropped here"
|
||||
|
||||
#if 0
|
||||
if (acc_delay > bts->max_ta) {
|
||||
LOGP(DL1C, LOGL_INFO, "ignoring RACH request %u > max_ta(%u)\n",
|
||||
acc_delay, btsb->max_ta);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
bts_update_tbf_ta("PH-RA", ra_ind->u32Fn, fl1h->trx_no, ra_ind->u8Tn,
|
||||
qta2ta(ra_ind->measParam.i16BurstTiming));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,15 @@ extern "C" {
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline uint8_t qta2ta(int16_t qta)
|
||||
{
|
||||
if (qta < 0)
|
||||
return 0;
|
||||
if (qta > 252)
|
||||
qta = 252;
|
||||
return qta >> 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* L1 Measurement values
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue