Skip to content

Commit 2cfd924

Browse files
SeppoTakalocfriedt
authored andcommitted
modem: cmux: Combine state and event
Refactor internal event bits to use state enum values and define set_state() and wait_state() so we don't need two set of variables to maintain. Signed-off-by: Seppo Takalo <[email protected]>
1 parent de183df commit 2cfd924

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

subsys/modem/modem_cmux.c

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ static int modem_cmux_wrap_command(struct modem_cmux_command **command, const ui
103103
return 0;
104104
}
105105

106+
static void set_state(struct modem_cmux *cmux, enum modem_cmux_state state)
107+
{
108+
cmux->state = state;
109+
k_event_set(&cmux->event, BIT(state));
110+
}
111+
112+
static bool wait_state(struct modem_cmux *cmux, enum modem_cmux_state state, k_timeout_t timeout)
113+
{
114+
return k_event_wait(&cmux->event, BIT(state), false, timeout) == BIT(state);
115+
}
116+
117+
static bool is_connected(struct modem_cmux *cmux)
118+
{
119+
return cmux->state == MODEM_CMUX_STATE_CONNECTED;
120+
}
121+
106122
static struct modem_cmux_command *modem_cmux_command_wrap(const uint8_t *data)
107123
{
108124
return (struct modem_cmux_command *)data;
@@ -452,14 +468,12 @@ static void modem_cmux_on_cld_command(struct modem_cmux *cmux, struct modem_cmux
452468
}
453469

454470
LOG_DBG("CMUX disconnected");
455-
cmux->state = MODEM_CMUX_STATE_DISCONNECTED;
471+
set_state(cmux, MODEM_CMUX_STATE_DISCONNECTED);
456472
k_mutex_lock(&cmux->transmit_rb_lock, K_FOREVER);
457473
cmux->flow_control_on = false;
458474
k_mutex_unlock(&cmux->transmit_rb_lock);
459475

460476
modem_cmux_raise_event(cmux, MODEM_CMUX_EVENT_DISCONNECTED);
461-
k_event_clear(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT);
462-
k_event_post(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT);
463477
}
464478

465479
static void modem_cmux_on_control_frame_ua(struct modem_cmux *cmux)
@@ -470,15 +484,13 @@ static void modem_cmux_on_control_frame_ua(struct modem_cmux *cmux)
470484
}
471485

472486
LOG_DBG("CMUX connected");
473-
cmux->state = MODEM_CMUX_STATE_CONNECTED;
487+
set_state(cmux, MODEM_CMUX_STATE_CONNECTED);
474488
cmux->initiator = true;
475489
k_mutex_lock(&cmux->transmit_rb_lock, K_FOREVER);
476490
cmux->flow_control_on = true;
477491
k_mutex_unlock(&cmux->transmit_rb_lock);
478492
k_work_cancel_delayable(&cmux->connect_work);
479493
modem_cmux_raise_event(cmux, MODEM_CMUX_EVENT_CONNECTED);
480-
k_event_clear(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT);
481-
k_event_post(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT);
482494
}
483495

484496
static void modem_cmux_respond_unsupported_cmd(struct modem_cmux *cmux)
@@ -606,21 +618,19 @@ static void modem_cmux_on_control_frame_sabm(struct modem_cmux *cmux)
606618

607619
LOG_DBG("CMUX connection request received");
608620
cmux->initiator = false;
609-
cmux->state = MODEM_CMUX_STATE_CONNECTED;
621+
set_state(cmux, MODEM_CMUX_STATE_CONNECTED);
610622
modem_cmux_connect_response_transmit(cmux);
611623
k_mutex_lock(&cmux->transmit_rb_lock, K_FOREVER);
612624
cmux->flow_control_on = true;
613625
k_mutex_unlock(&cmux->transmit_rb_lock);
614626
modem_cmux_raise_event(cmux, MODEM_CMUX_EVENT_CONNECTED);
615-
k_event_clear(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT);
616-
k_event_post(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT);
617627
}
618628

619629
static void modem_cmux_on_control_frame(struct modem_cmux *cmux)
620630
{
621631
modem_cmux_log_received_frame(&cmux->frame);
622632

623-
if (cmux->state == MODEM_CMUX_STATE_CONNECTED && cmux->frame.cr == cmux->initiator) {
633+
if (is_connected(cmux) && cmux->frame.cr == cmux->initiator) {
624634
LOG_DBG("Received a response frame, dropping");
625635
return;
626636
}
@@ -1105,7 +1115,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
11051115
dwork = k_work_delayable_from_work(item);
11061116
cmux = CONTAINER_OF(dwork, struct modem_cmux, connect_work);
11071117

1108-
cmux->state = MODEM_CMUX_STATE_CONNECTING;
1118+
set_state(cmux, MODEM_CMUX_STATE_CONNECTING);
11091119
cmux->initiator = true;
11101120

11111121
static const struct modem_cmux_frame frame = {
@@ -1128,7 +1138,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)
11281138
struct modem_cmux_command *command;
11291139
uint8_t data[2];
11301140

1131-
cmux->state = MODEM_CMUX_STATE_DISCONNECTING;
1141+
set_state(cmux, MODEM_CMUX_STATE_DISCONNECTING);
11321142

11331143
command = modem_cmux_command_wrap(data);
11341144
command->type.ea = 1;
@@ -1362,16 +1372,14 @@ void modem_cmux_init(struct modem_cmux *cmux, const struct modem_cmux_config *co
13621372
cmux->receive_buf = config->receive_buf;
13631373
cmux->receive_buf_size = config->receive_buf_size;
13641374
sys_slist_init(&cmux->dlcis);
1365-
cmux->state = MODEM_CMUX_STATE_DISCONNECTED;
13661375
ring_buf_init(&cmux->transmit_rb, config->transmit_buf_size, config->transmit_buf);
13671376
k_mutex_init(&cmux->transmit_rb_lock);
13681377
k_work_init_delayable(&cmux->receive_work, modem_cmux_receive_handler);
13691378
k_work_init_delayable(&cmux->transmit_work, modem_cmux_transmit_handler);
13701379
k_work_init_delayable(&cmux->connect_work, modem_cmux_connect_handler);
13711380
k_work_init_delayable(&cmux->disconnect_work, modem_cmux_disconnect_handler);
13721381
k_event_init(&cmux->event);
1373-
k_event_clear(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT);
1374-
k_event_post(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT);
1382+
set_state(cmux, MODEM_CMUX_STATE_DISCONNECTED);
13751383

13761384
#if CONFIG_MODEM_STATS
13771385
modem_cmux_init_buf_stats(cmux);
@@ -1433,8 +1441,7 @@ int modem_cmux_connect(struct modem_cmux *cmux)
14331441
return ret;
14341442
}
14351443

1436-
if (k_event_wait(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT, false,
1437-
MODEM_CMUX_T2_TIMEOUT) == 0) {
1444+
if (!wait_state(cmux, MODEM_CMUX_STATE_CONNECTED, MODEM_CMUX_T2_TIMEOUT)) {
14381445
return -EAGAIN;
14391446
}
14401447

@@ -1445,7 +1452,7 @@ int modem_cmux_connect_async(struct modem_cmux *cmux)
14451452
{
14461453
int ret = 0;
14471454

1448-
if (k_event_test(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT)) {
1455+
if (cmux->state != MODEM_CMUX_STATE_DISCONNECTED) {
14491456
return -EALREADY;
14501457
}
14511458

@@ -1472,8 +1479,7 @@ int modem_cmux_disconnect(struct modem_cmux *cmux)
14721479
return ret;
14731480
}
14741481

1475-
if (k_event_wait(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT, false,
1476-
MODEM_CMUX_T2_TIMEOUT) == 0) {
1482+
if (!wait_state(cmux, MODEM_CMUX_STATE_DISCONNECTED, MODEM_CMUX_T2_TIMEOUT)) {
14771483
return -EAGAIN;
14781484
}
14791485

@@ -1484,7 +1490,7 @@ int modem_cmux_disconnect_async(struct modem_cmux *cmux)
14841490
{
14851491
int ret = 0;
14861492

1487-
if (k_event_test(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT)) {
1493+
if (cmux->state == MODEM_CMUX_STATE_DISCONNECTED) {
14881494
return -EALREADY;
14891495
}
14901496

@@ -1531,7 +1537,6 @@ void modem_cmux_release(struct modem_cmux *cmux)
15311537
/* Unreference pipe */
15321538
cmux->pipe = NULL;
15331539

1534-
/* Reset events */
1535-
k_event_clear(&cmux->event, MODEM_CMUX_EVENT_CONNECTED_BIT);
1536-
k_event_post(&cmux->event, MODEM_CMUX_EVENT_DISCONNECTED_BIT);
1540+
/* Reset state */
1541+
set_state(cmux, MODEM_CMUX_STATE_DISCONNECTED);
15371542
}

0 commit comments

Comments
 (0)