Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion include/zephyr/modem/cmux.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,15 @@ typedef void (*modem_cmux_callback)(struct modem_cmux *cmux, enum modem_cmux_eve
* @cond INTERNAL_HIDDEN
*/

#if CONFIG_MODEM_CMUX_MTU > 127
#define MODEM_CMUX_HEADER_SIZE 7
#else
#define MODEM_CMUX_HEADER_SIZE 6
#endif


/* Total size of the CMUX work buffers */
#define MODEM_CMUX_WORK_BUFFER_SIZE (CONFIG_MODEM_CMUX_MTU + 7 + \
#define MODEM_CMUX_WORK_BUFFER_SIZE (CONFIG_MODEM_CMUX_MTU + MODEM_CMUX_HEADER_SIZE + \
CONFIG_MODEM_CMUX_WORK_BUFFER_SIZE_EXTRA)

enum modem_cmux_state {
Expand Down
28 changes: 15 additions & 13 deletions subsys/modem/modem_cmux.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,18 @@ LOG_MODULE_REGISTER(modem_cmux, CONFIG_MODEM_CMUX_LOG_LEVEL);
#define MODEM_CMUX_EA (0x01)
#define MODEM_CMUX_CR (0x02)
#define MODEM_CMUX_PF (0x10)
#define MODEM_CMUX_FRAME_SIZE_MAX (0x07)
#define MODEM_CMUX_DATA_SIZE_MIN (0x08)
#define MODEM_CMUX_DATA_FRAME_SIZE_MIN (MODEM_CMUX_FRAME_SIZE_MAX + \
MODEM_CMUX_DATA_SIZE_MIN)
#define MODEM_CMUX_DATA_SIZE_MIN 8
#define MODEM_CMUX_DATA_FRAME_SIZE_MIN (MODEM_CMUX_HEADER_SIZE + MODEM_CMUX_DATA_SIZE_MIN)
#define MODEM_CMUX_DATA_FRAME_SIZE_MAX (MODEM_CMUX_HEADER_SIZE + CONFIG_MODEM_CMUX_MTU)

#define MODEM_CMUX_CMD_DATA_SIZE_MAX (0x08)
#define MODEM_CMUX_CMD_FRAME_SIZE_MAX (MODEM_CMUX_FRAME_SIZE_MAX + \
MODEM_CMUX_CMD_DATA_SIZE_MAX)
/* Biggest supported Multiplexer control commands in UIH frame
* Modem Status Command (MSC) - 5 bytes when Break is included.
*
* PN would be 10 bytes, but that is not implemented
*/
#define MODEM_CMUX_CMD_DATA_SIZE_MAX 5
#define MODEM_CMUX_CMD_FRAME_SIZE_MAX (MODEM_CMUX_HEADER_SIZE + \
MODEM_CMUX_CMD_DATA_SIZE_MAX)

#define MODEM_CMUX_T1_TIMEOUT (K_MSEC(330))
#define MODEM_CMUX_T2_TIMEOUT (K_MSEC(660))
Expand Down Expand Up @@ -274,13 +278,13 @@ static void modem_cmux_bus_callback(struct modem_pipe *pipe, enum modem_pipe_eve
static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
const struct modem_cmux_frame *frame)
{
uint8_t buf[MODEM_CMUX_FRAME_SIZE_MAX];
uint8_t buf[MODEM_CMUX_HEADER_SIZE];
uint8_t fcs;
uint16_t space;
uint16_t data_len;
uint16_t buf_idx;

space = ring_buf_space_get(&cmux->transmit_rb) - MODEM_CMUX_FRAME_SIZE_MAX;
space = ring_buf_space_get(&cmux->transmit_rb) - MODEM_CMUX_HEADER_SIZE;
data_len = MIN(space, frame->data_len);
data_len = MIN(data_len, CONFIG_MODEM_CMUX_MTU);

Expand Down Expand Up @@ -1330,11 +1334,9 @@ void modem_cmux_init(struct modem_cmux *cmux, const struct modem_cmux_config *co
__ASSERT_NO_MSG(cmux != NULL);
__ASSERT_NO_MSG(config != NULL);
__ASSERT_NO_MSG(config->receive_buf != NULL);
__ASSERT_NO_MSG(config->receive_buf_size >=
(CONFIG_MODEM_CMUX_MTU + MODEM_CMUX_FRAME_SIZE_MAX));
__ASSERT_NO_MSG(config->receive_buf_size >= MODEM_CMUX_DATA_FRAME_SIZE_MAX);
__ASSERT_NO_MSG(config->transmit_buf != NULL);
__ASSERT_NO_MSG(config->transmit_buf_size >=
(CONFIG_MODEM_CMUX_MTU + MODEM_CMUX_FRAME_SIZE_MAX));
__ASSERT_NO_MSG(config->transmit_buf_size >= MODEM_CMUX_DATA_FRAME_SIZE_MAX);

memset(cmux, 0x00, sizeof(*cmux));
cmux->callback = config->callback;
Expand Down