This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/24388 )
Change subject: [VAMOS] osmo-bts-trx: properly handle per-timeslot TSC values
......................................................................
[VAMOS] osmo-bts-trx: properly handle per-timeslot TSC values
Change-Id: Idc5796151e3e83f42d60c2d4cb7c35890d76a7f5
Related: SYS#4895, OS#4941
---
M src/osmo-bts-trx/l1_if.c
M src/osmo-bts-trx/l1_if.h
M src/osmo-bts-trx/trx_if.c
M src/osmo-bts-trx/trx_if.h
M src/osmo-bts-trx/trx_provision_fsm.c
M src/osmo-bts-trx/trx_provision_fsm.h
M src/osmo-bts-trx/trx_vty.c
7 files changed, 83 insertions(+), 57 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/88/24388/1
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index 3f95a69..3be5179 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -271,15 +271,9 @@
struct phy_instance *pinst = trx_phy_instance(ts->trx);
struct trx_l1h *l1h = pinst->u.osmotrx.hdl;
uint8_t tn = ts->nr;
- uint16_t tsc = ts->tsc;
uint8_t slottype;
int rc;
- /* all TSC of all timeslots must be equal, because transceiver only
- * supports one TSC per TRX */
-
- osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_CFG_TSC, (void*)(intptr_t)tsc);
-
/* ignore disabled slots */
if (!(l1h->config.slotmask & (1 << tn)))
return NM_NACK_RES_NOTAVAIL;
@@ -303,6 +297,13 @@
struct trx_prov_ev_cfg_ts_data data = { .tn = tn, .slottype = slottype };
+ if (ts->tsc_set != 0 || ts->tsc != BTS_TSC(ts->trx->bts)) {
+ /* On TRXC we use 3GPP compliant numbering, so +1 */
+ data.tsc_set = ts->tsc_set + 1;
+ data.tsc_val = ts->tsc;
+ data.tsc_valid = true;
+ }
+
osmo_fsm_inst_dispatch(l1h->provision_fi, TRX_PROV_EV_CFG_TS, &data);
return 0;
diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h
index 864bb69..50369d9 100644
--- a/src/osmo-bts-trx/l1_if.h
+++ b/src/osmo-bts-trx/l1_if.h
@@ -105,9 +105,14 @@
uint8_t slotmask;
- bool slottype_valid[TRX_NR_TS];
- uint8_t slottype[TRX_NR_TS];
- bool slottype_sent[TRX_NR_TS];
+ bool setslot_valid[TRX_NR_TS];
+ struct {
+ uint8_t slottype;
+ uint8_t tsc_set;
+ uint8_t tsc_val;
+ bool tsc_valid;
+ } setslot[TRX_NR_TS];
+ bool setslot_sent[TRX_NR_TS];
};
struct trx_l1h {
diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c
index af1deef..c10a15f 100644
--- a/src/osmo-bts-trx/trx_if.c
+++ b/src/osmo-bts-trx/trx_if.c
@@ -8,6 +8,7 @@
* Copyright (C) 2013 Andreas Eversberg <jolly at eversberg.eu>
* Copyright (C) 2016-2017 Harald Welte <laforge at gnumonks.org>
* Copyright (C) 2019 Vadim Yanitskiy <axilirator at gmail.com>
+ * Copyright (C) 2021 sysmocom - s.m.f.c. GmbH <info at sysmocom.de>
*
* All Rights Reserved
*
@@ -326,10 +327,21 @@
return trx_ctrl_cmd(l1h, 0, "SETMAXDLYNB", "%d", dly);
}
-/*! Send "SETSLOT" command to TRX: Configure Channel Combination for TS */
-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb)
+/*! Send "SETSLOT" command to TRX: Configure Channel Combination and TSC for TS */
+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn,
+ trx_if_cmd_setslot_cb *cb)
{
- return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%d %d", tn, type);
+ const struct trx_config *cfg = &l1h->config;
+
+ if (cfg->setslot[tn].tsc_valid) { /* PHY is instructed to use a custom TSC */
+ return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%u %u C%u/S%u",
+ tn, cfg->setslot[tn].slottype,
+ cfg->setslot[tn].tsc_val,
+ cfg->setslot[tn].tsc_set);
+ } else { /* PHY is instructed to use the default TSC from 'SETTSC' */
+ return trx_ctrl_cmd_cb(l1h, 1, cb, "SETSLOT", "%u %u",
+ tn, cfg->setslot[tn].slottype);
+ }
}
/*! Send "RXTUNE" command to TRX: Tune Receiver to given ARFCN */
diff --git a/src/osmo-bts-trx/trx_if.h b/src/osmo-bts-trx/trx_if.h
index e131d56..b838b76 100644
--- a/src/osmo-bts-trx/trx_if.h
+++ b/src/osmo-bts-trx/trx_if.h
@@ -34,7 +34,7 @@
int trx_if_cmd_setpower_att(struct trx_l1h *l1h, int power_att_db, trx_if_cmd_setpower_att_cb *cb);
int trx_if_cmd_setmaxdly(struct trx_l1h *l1h, int dly);
int trx_if_cmd_setmaxdlynb(struct trx_l1h *l1h, int dly);
-int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, uint8_t type, trx_if_cmd_setslot_cb *cb);
+int trx_if_cmd_setslot(struct trx_l1h *l1h, uint8_t tn, trx_if_cmd_setslot_cb *cb);
int trx_if_cmd_rxtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);
int trx_if_cmd_txtune(struct trx_l1h *l1h, uint16_t arfcn, trx_if_cmd_generic_cb *cb);
int trx_if_cmd_handover(struct trx_l1h *l1h, uint8_t tn, uint8_t ss);
diff --git a/src/osmo-bts-trx/trx_provision_fsm.c b/src/osmo-bts-trx/trx_provision_fsm.c
index 070037d..60cdd78 100644
--- a/src/osmo-bts-trx/trx_provision_fsm.c
+++ b/src/osmo-bts-trx/trx_provision_fsm.c
@@ -192,16 +192,15 @@
}
/* Returns true if any TS changed, false otherwise */
-static bool update_ts_data(struct trx_l1h *l1h, struct trx_prov_ev_cfg_ts_data* ts_data) {
+static void update_ts_data(struct trx_l1h *l1h, struct trx_prov_ev_cfg_ts_data *data)
+{
+ l1h->config.setslot[data->tn].slottype = data->slottype;
+ l1h->config.setslot[data->tn].tsc_set = data->tsc_set;
+ l1h->config.setslot[data->tn].tsc_val = data->tsc_val;
+ l1h->config.setslot[data->tn].tsc_valid = data->tsc_valid;
- if (l1h->config.slottype[ts_data->tn] != ts_data->slottype ||
- !l1h->config.slottype_valid[ts_data->tn]) {
- l1h->config.slottype[ts_data->tn] = ts_data->slottype;
- l1h->config.slottype_valid[ts_data->tn] = true;
- l1h->config.slottype_sent[ts_data->tn] = false;
- return true;
- }
- return false;
+ l1h->config.setslot_valid[data->tn] = true;
+ l1h->config.setslot_sent[data->tn] = false;
}
/* Whether a given TRX is fully configured and can be powered on */
@@ -290,9 +289,7 @@
struct trx_l1h *l1h = (struct trx_l1h *)fi->priv;
struct phy_instance *pinst = l1h->phy_inst;
struct gsm_bts_trx *trx = pinst->trx;
- uint8_t bsic;
uint16_t arfcn;
- uint16_t tsc;
int nominal_power;
int status;
bool others_ready;
@@ -302,11 +299,21 @@
l1h->config.enabled =(bool)data;
break;
case TRX_PROV_EV_CFG_BSIC:
- bsic = (uint8_t)(intptr_t)data;
- if (l1h->config.bsic != bsic || !l1h->config.bsic_valid) {
- l1h->config.bsic = bsic;
- l1h->config.bsic_valid = true;
- l1h->config.bsic_sent = false;
+ /* We always get BSIC from the BSC, TSC can be derived from the BCC */
+ if (!pinst->phy_link->u.osmotrx.use_legacy_setbsic) {
+ const uint8_t tsc = BSIC2BCC((uint8_t)(intptr_t)data);
+ if (l1h->config.tsc != tsc || !l1h->config.tsc_valid) {
+ l1h->config.tsc = tsc;
+ l1h->config.tsc_valid = true;
+ l1h->config.tsc_sent = false;
+ }
+ } else {
+ const uint8_t bsic = (uint8_t)(intptr_t)data;
+ if (l1h->config.bsic != bsic || !l1h->config.bsic_valid) {
+ l1h->config.bsic = bsic;
+ l1h->config.bsic_valid = true;
+ l1h->config.bsic_sent = false;
+ }
}
break;
case TRX_PROV_EV_CFG_ARFCN:
@@ -319,14 +326,6 @@
l1h->config.nomtxpower_sent = false;
}
break;
- case TRX_PROV_EV_CFG_TSC:
- tsc = (uint16_t)(intptr_t)data;
- if (l1h->config.tsc != tsc || !l1h->config.tsc_valid) {
- l1h->config.tsc = tsc;
- l1h->config.tsc_valid = true;
- l1h->config.tsc_sent = false;
- }
- break;
case TRX_PROV_EV_CFG_TS:
update_ts_data(l1h, (struct trx_prov_ev_cfg_ts_data*)data);
break;
@@ -478,11 +477,10 @@
}
for (tn = 0; tn < TRX_NR_TS; tn++) {
- if (l1h->config.slottype_valid[tn]
- && !l1h->config.slottype_sent[tn]) {
- trx_if_cmd_setslot(l1h, tn,
- l1h->config.slottype[tn], l1if_setslot_cb);
- l1h->config.slottype_sent[tn] = true;
+ if (l1h->config.setslot_valid[tn]
+ && !l1h->config.setslot_sent[tn]) {
+ trx_if_cmd_setslot(l1h, tn, l1if_setslot_cb);
+ l1h->config.setslot_sent[tn] = true;
}
}
}
@@ -507,7 +505,7 @@
l1h->config.maxdly_sent = false;
l1h->config.maxdlynb_sent = false;
for (tn = 0; tn < TRX_NR_TS; tn++)
- l1h->config.slottype_sent[tn] = false;
+ l1h->config.setslot_sent[tn] = false;
} else if (!pinst->phy_link->u.osmotrx.poweronoff_sent) {
bts_model_trx_close_cb(pinst->trx, 0);
} /* else: poweroff in progress, cb will be called upon TRXC RSP */
@@ -519,12 +517,10 @@
break;
case TRX_PROV_EV_CFG_TS:
ts_data = (struct trx_prov_ev_cfg_ts_data*)data;
- if (update_ts_data(l1h, ts_data)) {
- trx_if_cmd_setslot(l1h, ts_data->tn,
- l1h->config.slottype[ ts_data->tn], l1if_setslot_cb);
- l1h->config.slottype_sent[ts_data->tn] = true;
- }
-
+ update_ts_data(l1h, ts_data);
+ /* While in this state we can send SETSLOT immediately */
+ trx_if_cmd_setslot(l1h, ts_data->tn, l1if_setslot_cb);
+ l1h->config.setslot_sent[ts_data->tn] = true;
break;
default:
OSMO_ASSERT(0);
@@ -571,7 +567,6 @@
X(TRX_PROV_EV_CFG_ENABLE) |
X(TRX_PROV_EV_CFG_BSIC) |
X(TRX_PROV_EV_CFG_ARFCN) |
- X(TRX_PROV_EV_CFG_TSC) |
X(TRX_PROV_EV_CFG_TS) |
X(TRX_PROV_EV_RXTUNE_CNF) |
X(TRX_PROV_EV_TXTUNE_CNF) |
@@ -623,7 +618,6 @@
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_ENABLE),
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_BSIC),
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_ARFCN),
- OSMO_VALUE_STRING(TRX_PROV_EV_CFG_TSC),
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_TS),
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_RXGAIN),
OSMO_VALUE_STRING(TRX_PROV_EV_CFG_SETMAXDLY),
diff --git a/src/osmo-bts-trx/trx_provision_fsm.h b/src/osmo-bts-trx/trx_provision_fsm.h
index 0f80088..8e6b97b 100644
--- a/src/osmo-bts-trx/trx_provision_fsm.h
+++ b/src/osmo-bts-trx/trx_provision_fsm.h
@@ -22,6 +22,8 @@
#pragma once
+#include <stdbool.h>
+
#include <osmocom/core/fsm.h>
enum trx_provision_fsm_states {
@@ -35,6 +37,11 @@
struct trx_prov_ev_cfg_ts_data {
uint8_t tn;
uint8_t slottype;
+
+ /* Training Sequence Code and Set */
+ uint8_t tsc_set;
+ uint8_t tsc_val;
+ bool tsc_valid;
};
enum trx_provision_fsm_events {
diff --git a/src/osmo-bts-trx/trx_vty.c b/src/osmo-bts-trx/trx_vty.c
index 2b0913f..d9d17d0 100644
--- a/src/osmo-bts-trx/trx_vty.c
+++ b/src/osmo-bts-trx/trx_vty.c
@@ -127,16 +127,23 @@
else
vty_out(vty, " maxdlynb : undefined%s", VTY_NEWLINE);
for (tn = 0; tn < TRX_NR_TS; tn++) {
- if (!((1 << tn) & l1h->config.slotmask))
+ if (!((1 << tn) & l1h->config.slotmask)) {
vty_out(vty, " slot #%d: unsupported%s", tn,
VTY_NEWLINE);
- else if (l1h->config.slottype_valid[tn])
- vty_out(vty, " slot #%d: type %d%s", tn,
- l1h->config.slottype[tn],
- VTY_NEWLINE);
- else
+ continue;
+ } else if (!l1h->config.setslot_valid[tn]) {
vty_out(vty, " slot #%d: undefined%s", tn,
VTY_NEWLINE);
+ continue;
+ }
+
+ vty_out(vty, " slot #%d: type %d", tn,
+ l1h->config.setslot[tn].slottype);
+ if (l1h->config.setslot[tn].tsc_valid)
+ vty_out(vty, " TSC-s%dc%d",
+ l1h->config.setslot[tn].tsc_set,
+ l1h->config.setslot[tn].tsc_val);
+ vty_out(vty, "%s", VTY_NEWLINE);
}
}
--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/24388
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Idc5796151e3e83f42d60c2d4cb7c35890d76a7f5
Gerrit-Change-Number: 24388
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210524/7611a2c8/attachment.htm>