dyn PDCH: track pending PDCH de-/activation
Set and clear pending flags on the TS according to PDCH de-/activation. This will allow changing the time we set the channel state to after PDCH DEACT and before PDCH ACT, in a subsequent commit. Also add a sanity check on whether we're sending conflicting or superfluous PDCH de-/activations on the same TS. Change-Id: Ieae73271df749ded3d90585116aae01f3ad4ee74
This commit is contained in:
parent
c1fbdedcd3
commit
3201988f7b
|
@ -1204,6 +1204,7 @@ static int rsl_rx_hando_det(struct msgb *msg)
|
||||||
static int rsl_rx_pdch_act_ack(struct msgb *msg)
|
static int rsl_rx_pdch_act_ack(struct msgb *msg)
|
||||||
{
|
{
|
||||||
msg->lchan->ts->flags |= TS_F_PDCH_ACTIVE;
|
msg->lchan->ts->flags |= TS_F_PDCH_ACTIVE;
|
||||||
|
msg->lchan->ts->flags &= ~TS_F_PDCH_ACT_PENDING;
|
||||||
|
|
||||||
/* We have activated PDCH, so now the channel is available again. */
|
/* We have activated PDCH, so now the channel is available again. */
|
||||||
do_lchan_free(msg->lchan);
|
do_lchan_free(msg->lchan);
|
||||||
|
@ -1214,6 +1215,7 @@ static int rsl_rx_pdch_act_ack(struct msgb *msg)
|
||||||
static int rsl_rx_pdch_deact_ack(struct msgb *msg)
|
static int rsl_rx_pdch_deact_ack(struct msgb *msg)
|
||||||
{
|
{
|
||||||
msg->lchan->ts->flags &= ~TS_F_PDCH_ACTIVE;
|
msg->lchan->ts->flags &= ~TS_F_PDCH_ACTIVE;
|
||||||
|
msg->lchan->ts->flags &= ~TS_F_PDCH_DEACT_PENDING;
|
||||||
|
|
||||||
rsl_chan_activate_lchan(msg->lchan, msg->lchan->dyn_pdch.act_type,
|
rsl_chan_activate_lchan(msg->lchan, msg->lchan->dyn_pdch.act_type,
|
||||||
msg->lchan->dyn_pdch.ho_ref);
|
msg->lchan->dyn_pdch.ho_ref);
|
||||||
|
@ -1975,10 +1977,24 @@ int rsl_ipacc_pdch_activate(struct gsm_bts_trx_ts *ts, int act)
|
||||||
struct abis_rsl_dchan_hdr *dh;
|
struct abis_rsl_dchan_hdr *dh;
|
||||||
uint8_t msg_type;
|
uint8_t msg_type;
|
||||||
|
|
||||||
if (act)
|
if (ts->flags & TS_F_PDCH_PENDING_MASK) {
|
||||||
|
LOGP(DRSL, LOGL_ERROR,
|
||||||
|
"%s PDCH %s requested, but a PDCH%s%s is still pending\n",
|
||||||
|
gsm_ts_name(ts),
|
||||||
|
act ? "ACT" : "DEACT",
|
||||||
|
ts->flags & TS_F_PDCH_ACT_PENDING? " ACT" : "",
|
||||||
|
ts->flags & TS_F_PDCH_DEACT_PENDING? " DEACT" : "");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (act){
|
||||||
msg_type = RSL_MT_IPAC_PDCH_ACT;
|
msg_type = RSL_MT_IPAC_PDCH_ACT;
|
||||||
else
|
ts->flags |= TS_F_PDCH_ACT_PENDING;
|
||||||
|
} else {
|
||||||
msg_type = RSL_MT_IPAC_PDCH_DEACT;
|
msg_type = RSL_MT_IPAC_PDCH_DEACT;
|
||||||
|
ts->flags |= TS_F_PDCH_DEACT_PENDING;
|
||||||
|
}
|
||||||
|
/* TODO add timeout to cancel PDCH DE/ACT */
|
||||||
|
|
||||||
dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));
|
dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));
|
||||||
init_dchan_hdr(dh, msg_type);
|
init_dchan_hdr(dh, msg_type);
|
||||||
|
|
Loading…
Reference in New Issue