osmo-bts-trx: fix hopping pointer bug in trx_sched_fn()
In change [1] together with the actual implementation I introduced a serious bug to trx_sched_fn(): if a timeslot is configured to use frequency hopping, both 'pinst' and 'l1h' pointers are *overwriten* in the inner loop, so the Downlink burst is re-directed to the approproate PHY instance. However, if a subsequent timeslot is not hopping, the Downlink burst would be re-directed to the wrong PHY instance because both pointers were overwriten during a previous iteration. Let's add another 'struct phy_instance' pointer to the inner loop, so it's properly re-initialized for each timeslot iteration. Change-Id: I9afbbef8dc5d885763356470c27d4392dce8e815 Fixes: [1] I68f4ae09fd0789ad0d8f1c1e17e17dfc4de8e462 Related: SYS#4868, OS#4546
This commit is contained in:
parent
f4c2b61e3e
commit
1c2c92da17
|
@ -107,9 +107,9 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn)
|
|||
|
||||
/* process every TRX */
|
||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||
struct phy_instance *pinst = trx_phy_instance(trx);
|
||||
struct phy_link *plink = pinst->phy_link;
|
||||
struct trx_l1h *l1h = pinst->u.osmotrx.hdl;
|
||||
const struct phy_instance *_pinst = trx_phy_instance(trx);
|
||||
const struct phy_link *plink = _pinst->phy_link;
|
||||
struct trx_l1h *l1h = _pinst->u.osmotrx.hdl;
|
||||
struct l1sched_trx *l1t = &l1h->l1s;
|
||||
|
||||
/* we don't schedule, if power is off */
|
||||
|
@ -122,6 +122,8 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn)
|
|||
|
||||
/* process every TS of TRX */
|
||||
for (tn = 0; tn < ARRAY_SIZE(l1t->ts); tn++) {
|
||||
const struct phy_instance *pinst = _pinst;
|
||||
|
||||
/* ready-to-send */
|
||||
_sched_rts(l1t, tn, GSM_TDMA_FN_SUM(sched_fn, plink->u.osmotrx.rts_advance));
|
||||
|
||||
|
@ -143,7 +145,6 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn)
|
|||
pinst = dlfh_route_br(&br, &trx->ts[tn]);
|
||||
if (pinst == NULL)
|
||||
continue;
|
||||
l1h = pinst->u.osmotrx.hdl;
|
||||
}
|
||||
|
||||
if (pinst->trx == bts->c0) {
|
||||
|
@ -153,7 +154,7 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn)
|
|||
br.att = 0;
|
||||
}
|
||||
|
||||
trx_if_send_burst(l1h, &br);
|
||||
trx_if_send_burst(pinst->u.osmotrx.hdl, &br);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue