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:
parent
1a66c2991c
commit
fd6c211eab
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue