From 7b186adb0afcfbf3af1a98e6acc46d17408b3dba Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 21 Jul 2016 18:28:30 +0200 Subject: [PATCH] dyn TS: implement litecell15 specifics For chan_nr_by_sapi(), add GSM_PCHAN_TCH_F_TCH_H_PDCH to pick_pchan(). Add GSM_PCHAN_TCH_F_TCH_H_PDCH to pchan_to_logChComb[] for first pchan initialization. In ts_connect_as(), make sure that callers pass proper "real world" pchan types, i.e. reject the "meta" GSM_PCHAN_TCH_F_TCH_H_PDCH pchan constant. In ts_opstart(), connect as PCHAN_NONE since we will only know the desired pchan when the first RSL chan activ is received. Add GSM_PCHAN_TCH_F_TCH_H_PDCH to lchan_to_GsmL1_SubCh_t(), by using its current "real" pchan mode. Call cb_ts_[dis]connected() unconditionally, i.e. not only for TCH_F_PDCH when a pending flag is set. The cb_ts_[dis]connected() will be a no-op if the pchan type is not dynamic. Change-Id: Ie30323f968da25027045c42a7ae7f1e70ca711ae --- src/osmo-bts-litecell15/l1_if.c | 13 +++++++++---- src/osmo-bts-litecell15/oml.c | 29 ++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/osmo-bts-litecell15/l1_if.c b/src/osmo-bts-litecell15/l1_if.c index 2af248137..0e4c24baa 100644 --- a/src/osmo-bts-litecell15/l1_if.c +++ b/src/osmo-bts-litecell15/l1_if.c @@ -611,11 +611,16 @@ static int handle_mph_time_ind(struct lc15l1_hdl *fl1, static enum gsm_phys_chan_config pick_pchan(struct gsm_bts_trx_ts *ts) { - if (ts->pchan != GSM_PCHAN_TCH_F_PDCH) + switch (ts->pchan) { + case GSM_PCHAN_TCH_F_PDCH: + if (ts->flags & TS_F_PDCH_ACTIVE) + return GSM_PCHAN_PDCH; + return GSM_PCHAN_TCH_F; + case GSM_PCHAN_TCH_F_TCH_H_PDCH: + return ts->dyn.pchan_is; + default: return ts->pchan; - if (ts->flags & TS_F_PDCH_ACTIVE) - return GSM_PCHAN_PDCH; - return GSM_PCHAN_TCH_F; + } } static uint8_t chan_nr_by_sapi(struct gsm_bts_trx_ts *ts, diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c index c3bf800d3..8b1f1950c 100644 --- a/src/osmo-bts-litecell15/oml.c +++ b/src/osmo-bts-litecell15/oml.c @@ -91,6 +91,8 @@ static const enum GsmL1_LogChComb_t pchan_to_logChComb[_GSM_PCHAN_MAX] = { [GSM_PCHAN_PDCH] = GsmL1_LogChComb_XIII, [GSM_PCHAN_TCH_F_PDCH] = GsmL1_LogChComb_I, /*< first init like TCH/F, until PDCH ACT */ + [GSM_PCHAN_TCH_F_TCH_H_PDCH] = GsmL1_LogChComb_0, /*< first unused, + until first RSL CHAN ACT */ [GSM_PCHAN_UNKNOWN] = GsmL1_LogChComb_0, }; @@ -486,6 +488,14 @@ static int ts_connect_as(struct gsm_bts_trx_ts *ts, struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(ts->trx); GsmL1_MphConnectReq_t *cr; + if (pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) { + LOGP(DL1C, LOGL_ERROR, + "%s Requested TS connect as %s," + " expected a specific pchan instead\n", + gsm_ts_and_pchan_name(ts), gsm_pchan_name(pchan)); + return -EINVAL; + } + cr = prim_init(msgb_l1prim(msg), GsmL1_PrimId_MphConnectReq, fl1h, l1p_handle_for_ts(ts)); cr->u8Tn = ts->nr; @@ -496,6 +506,11 @@ static int ts_connect_as(struct gsm_bts_trx_ts *ts, static int ts_opstart(struct gsm_bts_trx_ts *ts) { + if (ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) { + /* First connect as NONE, until first RSL CHAN ACT. */ + ts->dyn.pchan_is = ts->dyn.pchan_want = GSM_PCHAN_NONE; + return ts_connect_as(ts, GSM_PCHAN_NONE, opstart_compl_cb, NULL); + } return ts_connect_as(ts, ts->pchan, opstart_compl_cb, NULL); } @@ -516,7 +531,12 @@ GsmL1_Sapi_t lchan_to_GsmL1_Sapi_t(const struct gsm_lchan *lchan) GsmL1_SubCh_t lchan_to_GsmL1_SubCh_t(const struct gsm_lchan *lchan) { - switch (lchan->ts->pchan) { + enum gsm_phys_chan_config pchan = lchan->ts->pchan; + + if (pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH) + pchan = lchan->ts->dyn.pchan_want; + + switch (pchan) { case GSM_PCHAN_CCCH_SDCCH4: case GSM_PCHAN_CCCH_SDCCH4_CBCH: if (lchan->type == GSM_LCHAN_CCCH) @@ -532,6 +552,7 @@ GsmL1_SubCh_t lchan_to_GsmL1_SubCh_t(const struct gsm_lchan *lchan) case GSM_PCHAN_PDCH: case GSM_PCHAN_UNKNOWN: default: + /* case GSM_PCHAN_TCH_F_TCH_H_PDCH: is caught above */ return GsmL1_SubCh_NA; } @@ -1847,8 +1868,7 @@ static int ts_disconnect_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, LOGP(DL1C, LOGL_DEBUG, "%s Rx mphDisconnectCnf\n", gsm_lchan_name(ts->lchan)); - if (ts->flags & TS_F_PDCH_PENDING_MASK) - cb_ts_disconnected(ts); + cb_ts_disconnected(ts); return 0; } @@ -1882,8 +1902,7 @@ static int ts_connect_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, ts->flags & TS_F_PDCH_ACT_PENDING ? "ACT_PENDING " : "", ts->flags & TS_F_PDCH_DEACT_PENDING ? "DEACT_PENDING " : ""); - if (ts->flags & TS_F_PDCH_PENDING_MASK) - cb_ts_connected(ts); + cb_ts_connected(ts); return 0; }