Skip to content

Commit 34c155f

Browse files
committed
drivers: modem: cellular: Use k_pipe instead of ringbuffer
Ringbuffer is not safe in ISR but k_pipe without waiting is. So use pipe for events, so that possible GPIO callbacks from ISR content can post events. Signed-off-by: Seppo Takalo <[email protected]>
1 parent e5137c3 commit 34c155f

File tree

1 file changed

+7
-16
lines changed

1 file changed

+7
-16
lines changed

drivers/modem/modem_cellular.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,7 @@ struct modem_cellular_data {
167167
/* Event dispatcher */
168168
struct k_work event_dispatch_work;
169169
uint8_t event_buf[8];
170-
struct ring_buf event_rb;
171-
struct k_mutex event_rb_lock;
170+
struct k_pipe event_pipe;
172171

173172
struct k_mutex api_lock;
174173
struct modem_cellular_event_cb cb;
@@ -723,26 +722,18 @@ static void modem_cellular_event_dispatch_handler(struct k_work *item)
723722
struct modem_cellular_data *data =
724723
CONTAINER_OF(item, struct modem_cellular_data, event_dispatch_work);
725724

726-
uint8_t events[sizeof(data->event_buf)];
727-
uint8_t events_cnt;
725+
enum modem_cellular_event event;
726+
const size_t len = sizeof(event);
728727

729-
k_mutex_lock(&data->event_rb_lock, K_FOREVER);
730-
731-
events_cnt = (uint8_t)ring_buf_get(&data->event_rb, events, sizeof(data->event_buf));
732-
733-
k_mutex_unlock(&data->event_rb_lock);
734-
735-
for (uint8_t i = 0; i < events_cnt; i++) {
736-
modem_cellular_event_handler(data, (enum modem_cellular_event)events[i]);
728+
while (k_pipe_read(&data->event_pipe, (uint8_t *)&event, len, K_NO_WAIT) == len) {
729+
modem_cellular_event_handler(data, (enum modem_cellular_event)event);
737730
}
738731
}
739732

740733
static void modem_cellular_delegate_event(struct modem_cellular_data *data,
741734
enum modem_cellular_event evt)
742735
{
743-
k_mutex_lock(&data->event_rb_lock, K_FOREVER);
744-
ring_buf_put(&data->event_rb, (uint8_t *)&evt, 1);
745-
k_mutex_unlock(&data->event_rb_lock);
736+
k_pipe_write(&data->event_pipe, (const uint8_t *)&evt, sizeof(evt), K_NO_WAIT);
746737
k_work_submit(&data->event_dispatch_work);
747738
}
748739

@@ -2196,7 +2187,7 @@ static int modem_cellular_init(const struct device *dev)
21962187
k_mutex_init(&data->api_lock);
21972188
k_work_init_delayable(&data->timeout_work, modem_cellular_timeout_handler);
21982189
k_work_init(&data->event_dispatch_work, modem_cellular_event_dispatch_handler);
2199-
ring_buf_init(&data->event_rb, sizeof(data->event_buf), data->event_buf);
2190+
k_pipe_init(&data->event_pipe, data->event_buf, sizeof(data->event_buf));
22002191

22012192
k_sem_init(&data->suspended_sem, 0, 1);
22022193

0 commit comments

Comments
 (0)