trxcon: Suppress POWERON to TRX if we're already powered on.

The existing logic unconditionally wants to send a POWERON command
on TRXC whenever L1CTL_FBSB_REQ is received.  That may cause some
problems when sending subsequent L1CTL_FBSB_REQ, e.g. due to signal loss.

Sending POWEROFF when transceiver is not powered on is normal though.
This can happen if trxcon is restarted while fake_trx was running.

The existing FSM state could unfortunately not been used, as it's a
mixture between the TRX connection state and the command/response state.

The current solution is just a work around. We definitely need to
introduce separate state machines for transceiver and its TRXC
interface.

Change-Id: I834e8897b95a2490811319697fc7cab6076db480
This commit is contained in:
Harald Welte 2019-05-30 15:21:45 +02:00 committed by Vadim Yanitskiy
parent 1a66c2991c
commit fd6c211eab
3 changed files with 18 additions and 3 deletions

View File

@ -362,7 +362,10 @@ static int l1ctl_rx_fbsb_req(struct l1ctl_link *l1l, struct msgb *msg)
trx_if_cmd_txtune(l1l->trx, band_arfcn);
}
trx_if_cmd_poweron(l1l->trx);
/* Transceiver might have been powered on before, e.g.
* in case of sending L1CTL_FBSB_REQ due to signal loss. */
if (!l1l->trx->powered_up)
trx_if_cmd_poweron(l1l->trx);
/* Start FBSB expire timer */
l1l->fbsb_timer.data = l1l;

View File

@ -254,6 +254,11 @@ int trx_if_cmd_poweroff(struct trx_instance *trx)
int trx_if_cmd_poweron(struct trx_instance *trx)
{
if (trx->powered_up) {
/* FIXME: this should be handled by the FSM, not here! */
LOGP(DTRX, LOGL_ERROR, "Suppressing POWERON as we're already powered up\n");
return -EAGAIN;
}
return trx_ctrl_cmd(trx, 1, "POWERON", "");
}
@ -495,10 +500,14 @@ static int trx_ctrl_read_cb(struct osmo_fd *ofd, unsigned int what)
}
/* Trigger state machine */
if (!strncmp(tcm->cmd + 4, "POWERON", 7))
if (!strncmp(tcm->cmd + 4, "POWERON", 7)) {
trx->powered_up = true;
osmo_fsm_inst_state_chg(trx->fsm, TRX_STATE_ACTIVE, 0, 0);
else if (!strncmp(tcm->cmd + 4, "POWEROFF", 8))
}
else if (!strncmp(tcm->cmd + 4, "POWEROFF", 8)) {
trx->powered_up = false;
osmo_fsm_inst_state_chg(trx->fsm, TRX_STATE_IDLE, 0, 0);
}
else if (!strncmp(tcm->cmd + 4, "MEASURE", 7))
trx_if_measure_rsp_cb(trx, buf + 14);
else if (!strncmp(tcm->cmd + 4, "ECHO", 4))

View File

@ -25,7 +25,10 @@ struct trx_instance {
struct osmo_timer_list trx_ctrl_timer;
struct llist_head trx_ctrl_list;
struct osmo_fsm_inst *fsm;
/* HACK: we need proper state machines */
uint32_t prev_state;
bool powered_up;
/* GSM L1 specific */
uint16_t pm_band_arfcn_start;