Change in osmo-bts[master]: [VAMOS] osmo-bts-trx: properly handle per-timeslot TSC values

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.org
Mon May 24 23:24:02 UTC 2021


fixeria 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>


More information about the gerrit-log mailing list