@@ -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+
106122static 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
465479static 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
484496static 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
619629static 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