[PATCH] osmocom-bb[master]: host/trxcon/scheduler: implement xCCH TX capability

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/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Thu Feb 22 15:33:06 UTC 2018


Review at  https://gerrit.osmocom.org/6733

host/trxcon/scheduler: implement xCCH TX capability

Change-Id: I4da4816dcecc55eb9b4d2d6c631967026a5e4f68
---
M src/host/trxcon/sched_lchan_desc.c
M src/host/trxcon/sched_lchan_handlers.c
M src/host/trxcon/sched_trx.h
3 files changed, 95 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/33/6733/1

diff --git a/src/host/trxcon/sched_lchan_desc.c b/src/host/trxcon/sched_lchan_desc.c
index 55edb98..e3998fa 100644
--- a/src/host/trxcon/sched_lchan_desc.c
+++ b/src/host/trxcon/sched_lchan_desc.c
@@ -29,7 +29,6 @@
 #define LID_SACCH	0x40
 
 /* TODO: implement */
-#define tx_data_fn	NULL
 #define tx_pdtch_fn	NULL
 #define tx_tchf_fn	NULL
 #define tx_tchh_fn	NULL
@@ -43,6 +42,10 @@
 	uint32_t fn, enum trx_lchan_type chan, uint8_t bid,
 	sbit_t *bits, uint16_t nbits, int8_t rssi, float toa);
 
+int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts,
+	uint32_t fn, enum trx_lchan_type chan,
+	uint8_t bid, uint16_t *nbits);
+
 int rx_sch_fn(struct trx_instance *trx, struct trx_ts *ts,
 	uint32_t fn, enum trx_lchan_type chan, uint8_t bid,
 	sbit_t *bits, uint16_t nbits, int8_t rssi, float toa);
diff --git a/src/host/trxcon/sched_lchan_handlers.c b/src/host/trxcon/sched_lchan_handlers.c
index b27f811..078c5fd 100644
--- a/src/host/trxcon/sched_lchan_handlers.c
+++ b/src/host/trxcon/sched_lchan_handlers.c
@@ -164,6 +164,95 @@
 	return 0;
 }
 
+int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts,
+	uint32_t fn, enum trx_lchan_type chan,
+	uint8_t bid, uint16_t *nbits)
+{
+	struct trx_lchan_state *lchan;
+	struct trx_ts_prim *prim;
+	struct l1ctl_info_ul *ul;
+	ubit_t burst[GSM_BURST_LEN];
+	ubit_t *buffer, *offset;
+	uint8_t *mask, *l2;
+	int rc;
+
+	/* Find required channel state */
+	lchan = sched_trx_find_lchan(ts, chan);
+	if (lchan == NULL)
+		return -EINVAL;
+
+	/* Set up pointers */
+	mask = &lchan->tx_burst_mask;
+	buffer = lchan->tx_bursts;
+
+	if (bid > 0) {
+		/* If we have encoded bursts */
+		if (*mask)
+			goto send_burst;
+		else
+			return 0;
+	}
+
+	/* Encode payload if not yet */
+
+	/* Get a message from TX queue */
+	prim = llist_entry(ts->tx_prims.next, struct trx_ts_prim, list);
+	ul = (struct l1ctl_info_ul *) prim->payload;
+	l2 = (uint8_t *) ul->payload;
+
+	/* Encode bursts */
+	rc = gsm0503_xcch_encode(buffer, l2);
+	if (rc) {
+		LOGP(DSCH, LOGL_ERROR, "Failed to encode L2 payload\n");
+
+		/* Remove primitive from queue and free memory */
+		llist_del(&prim->list);
+		talloc_free(prim);
+
+		return -EINVAL;
+	}
+
+send_burst:
+	/* Determine which burst should be sent */
+	offset = buffer + bid * 116;
+
+	/* Update mask */
+	*mask |= (1 << bid);
+
+	/* If we are sending the last (4/4) burst */
+	if ((*mask & 0x0f) == 0x0f) {
+		/* Remove primitive from queue and free memory */
+		prim = llist_entry(ts->tx_prims.next, struct trx_ts_prim, list);
+		llist_del(&prim->list);
+		talloc_free(prim);
+
+		/* Reset mask */
+		*mask = 0x00;
+	}
+
+	/* Compose a new burst */
+	memset(burst, 0, 3); /* TB */
+	memcpy(burst + 3, offset, 58); /* Payload 1/2 */
+	memcpy(burst + 61, trx->tsc, 26); /* TSC */
+	memcpy(burst + 87, offset + 58, 58); /* Payload 2/2 */
+	memset(burst + 145, 0, 3); /* TB */
+
+	if (nbits)
+		*nbits = GSM_BURST_LEN;
+
+	LOGP(DSCH, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n",
+		trx_lchan_desc[chan].name, fn, ts->index, bid);
+
+	/* Send burst to transceiver */
+	rc = trx_if_tx_burst(trx, ts->index, fn, 10, burst);
+	if (rc) {
+		LOGP(DSCH, LOGL_ERROR, "Could not send burst to transceiver\n");
+		return rc;
+	}
+
+	return 0;
+}
+
 static void decode_sb(struct gsm_time *time, uint8_t *bsic, uint8_t *sb_info)
 {
 	uint8_t t3p;
diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h
index 725f666..cab290b 100644
--- a/src/host/trxcon/sched_trx.h
+++ b/src/host/trxcon/sched_trx.h
@@ -148,6 +148,8 @@
 	uint32_t rx_first_fn;
 	/*! \brief Mask of received bursts */
 	uint8_t rx_burst_mask;
+	/*! \brief Mask of transmitted bursts */
+	uint8_t tx_burst_mask;
 	/*! \brief Burst buffer for RX */
 	sbit_t *rx_bursts;
 	/*! \brief Burst buffer for TX */

-- 
To view, visit https://gerrit.osmocom.org/6733
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4da4816dcecc55eb9b4d2d6c631967026a5e4f68
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list