Commit 48fa603d authored by Bjarki Arge Andreasen's avatar Bjarki Arge Andreasen Committed by Fabio Baltieri
Browse files

modem: cmux: Patch resync mechanism



The CMUX resync mechanism can get stuck between states
MODEM_CMUX_RECEIVE_STATE_RESYNC_0 and
MODEM_CMUX_RECEIVE_STATE_RESYNC_1 if the resync flags, which are
sent only once in state MODEM_CMUX_RECEIVE_STATE_SOF, are not
responded to, or the response is lost.

This patch ensures resync flags are sent from states
MODEM_CMUX_RECEIVE_STATE_SOF, MODEM_CMUX_RECEIVE_STATE_RESYNC_1
and MODEM_CMUX_RECEIVE_STATE_RESYNC_2 if its determined that the
resync flags are not being responded to.

Signed-off-by: default avatarBjarki Arge Andreasen <bjarki@arge-andreasen.me>
parent 3ebe8142
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -638,10 +638,16 @@ static void modem_cmux_on_frame(struct modem_cmux *cmux)
	modem_cmux_on_dlci_frame(cmux);
}

static void modem_cmux_transmit_resync(struct modem_cmux *cmux)
{
	static const uint8_t resync[3] = {0xF9, 0xF9, 0xF9};

	modem_pipe_transmit(cmux->pipe, resync, sizeof(resync));
}

static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t byte)
{
	uint8_t fcs;
	static const uint8_t resync[3] = {0xF9, 0xF9, 0xF9};

	switch (cmux->receive_state) {
	case MODEM_CMUX_RECEIVE_STATE_SOF:
@@ -650,10 +656,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
			break;
		}

		/* Send resync flags */
		modem_pipe_transmit(cmux->pipe, resync, sizeof(resync));

		/* Await resync flags */
		modem_cmux_transmit_resync(cmux);
		cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC_0;
		break;

@@ -668,6 +671,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
		if (byte == 0xF9) {
			cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC_2;
		} else {
			modem_cmux_transmit_resync(cmux);
			cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC_0;
		}

@@ -677,6 +681,7 @@ static void modem_cmux_process_received_byte(struct modem_cmux *cmux, uint8_t by
		if (byte == 0xF9) {
			cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC_3;
		} else {
			modem_cmux_transmit_resync(cmux);
			cmux->receive_state = MODEM_CMUX_RECEIVE_STATE_RESYNC_0;
		}