dexter submitted this change.
er_ccu_l1_if: use one ccu_desr per timeslot
At the moment only allocate one CCU descriptor and use it as context for
the whole TRX. This is fine when running with one PDCH only but as soon
as multiple PDCHs are used the CCU descriptor gets messed up. Let's fix
this by introducing a TRX descriptor that contains an array of 8 CCU
descriptors, one for each timeslot.
Related: OS#6022
Change-Id: I09a51f34ce0edef79a797c4686c7b1d27c376e49
---
M src/ericsson-rbs/er_ccu_descr.h
M src/ericsson-rbs/er_ccu_l1_if.c
2 files changed, 61 insertions(+), 24 deletions(-)
diff --git a/src/ericsson-rbs/er_ccu_descr.h b/src/ericsson-rbs/er_ccu_descr.h
index 0b56cc0..9fe1aab 100644
--- a/src/ericsson-rbs/er_ccu_descr.h
+++ b/src/ericsson-rbs/er_ccu_descr.h
@@ -47,3 +47,7 @@
};
+
+struct er_trx_descr {
+ struct er_ccu_descr ts_ccu_descr[8];
+};
diff --git a/src/ericsson-rbs/er_ccu_l1_if.c b/src/ericsson-rbs/er_ccu_l1_if.c
index b7dd102..0fe30b2 100644
--- a/src/ericsson-rbs/er_ccu_l1_if.c
+++ b/src/ericsson-rbs/er_ccu_l1_if.c
@@ -372,18 +372,22 @@
int l1if_pdch_req(void *obj, uint8_t ts, int is_ptcch, uint32_t fn,
uint16_t arfcn, uint8_t block_nr, uint8_t *data, uint8_t len)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
struct er_gprs_trau_frame trau_frame;
ubit_t trau_frame_encoded[ER_GPRS_TRAU_FRAME_LEN_64K];
struct gprs_rlcmac_bts *bts;
int rc;
/* Make sure that the CCU is synchronized and connected. */
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: PDCH(ts=%u, arfcn=%u) no CCU context, tossing MAC block...\n",
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: PDCH(ts=%u, arfcn=%u) no TRX context, tossing MAC block...\n",
ts, arfcn);
return -EINVAL;
}
+
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
+
if (!ccu_descr->link.ccu_connected) {
LOGPL1IF(ccu_descr, LOGL_NOTICE, "PCU-DATA-IND", "CCU not connected, tossing MAC block...\n");
return -EINVAL;
@@ -450,46 +454,56 @@
void *l1if_open_pdch(uint8_t bts_nr, uint8_t trx_no, uint32_t hlayer1, struct gsmtap_inst *gsmtap)
{
- struct er_ccu_descr *ccu_descr;
+ struct er_trx_descr *trx_descr;
+ unsigned int i;
/* Note: We do not have enough information to really open anything at
- * this point. We will just create the CCU context. */
+ * this point. We will just create the TRX context and fill it wit basic
+ * CCU context (one for each TS) */
- ccu_descr = talloc_zero(tall_pcu_ctx, struct er_ccu_descr);
- OSMO_ASSERT(ccu_descr);
- ccu_descr->er_ccu_rx_cb = er_ccu_rx_cb;
- ccu_descr->er_ccu_empty_cb = er_ccu_empty_cb;
- ccu_descr->pcu.trx_no = trx_no;
- ccu_descr->pcu.bts_nr = bts_nr;
+ trx_descr = talloc_zero(tall_pcu_ctx, struct er_trx_descr);
+ OSMO_ASSERT(trx_descr);
- return ccu_descr;
+ for (i = 0; i < ARRAY_SIZE(trx_descr->ts_ccu_descr); i++) {
+ trx_descr->ts_ccu_descr[i].er_ccu_rx_cb = er_ccu_rx_cb;
+ trx_descr->ts_ccu_descr[i].er_ccu_empty_cb = er_ccu_empty_cb;
+ trx_descr->ts_ccu_descr[i].pcu.trx_no = trx_no;
+ trx_descr->ts_ccu_descr[i].pcu.bts_nr = bts_nr;
+ trx_descr->ts_ccu_descr[i].pcu.ts = i;
+ }
+
+ return trx_descr;
}
int l1if_close_pdch(void *obj)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ unsigned int i;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: no CCU context, cannot close unknown PDCH...\n");
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: no TRX context, cannot close unknown TRX...\n");
return -EINVAL;
}
- er_ccu_if_close(ccu_descr);
- talloc_free(ccu_descr);
+ for (i = 0; i < ARRAY_SIZE(trx_descr->ts_ccu_descr); i++)
+ er_ccu_if_close(&trx_descr->ts_ccu_descr[i]);
+
+ talloc_free(trx_descr);
return 0;
}
int l1if_connect_pdch(void *obj, uint8_t ts)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
int rc;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, PDCH never opened before?\n", ts);
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, TRX never opened before?\n", ts);
return -EINVAL;
}
- ccu_descr->pcu.ts = ts;
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
rc = pcu_l1if_get_e1_ccu_conn_pars(&ccu_descr->e1_conn_pars, ccu_descr->pcu.bts_nr, ccu_descr->pcu.trx_no,
ccu_descr->pcu.ts);
@@ -507,13 +521,16 @@
int l1if_disconnect_pdch(void *obj, uint8_t ts)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, PDCH never opened before?\n", ts);
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no TRX context, TRX never opened before?\n", ts);
return -EINVAL;
}
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
+
er_ccu_if_close(ccu_descr);
return 0;
To view, visit change 32423. To unsubscribe, or for help writing mail filters, visit settings.