Skip to content

Commit efdf6dc

Browse files
SeppoTakalorlubos
authored andcommitted
[nrf fromlist] 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. Upstream PR #: 97362 Signed-off-by: Seppo Takalo <[email protected]>
1 parent f5b6222 commit efdf6dc

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
@@ -166,8 +166,7 @@ struct modem_cellular_data {
166166
/* Event dispatcher */
167167
struct k_work event_dispatch_work;
168168
uint8_t event_buf[8];
169-
struct ring_buf event_rb;
170-
struct k_mutex event_rb_lock;
169+
struct k_pipe event_pipe;
171170

172171
struct k_mutex api_lock;
173172
struct modem_cellular_event_cb cb;
@@ -711,26 +710,18 @@ static void modem_cellular_event_dispatch_handler(struct k_work *item)
711710
struct modem_cellular_data *data =
712711
CONTAINER_OF(item, struct modem_cellular_data, event_dispatch_work);
713712

714-
uint8_t events[sizeof(data->event_buf)];
715-
uint8_t events_cnt;
713+
enum modem_cellular_event event;
714+
const size_t len = sizeof(event);
716715

717-
k_mutex_lock(&data->event_rb_lock, K_FOREVER);
718-
719-
events_cnt = (uint8_t)ring_buf_get(&data->event_rb, events, sizeof(data->event_buf));
720-
721-
k_mutex_unlock(&data->event_rb_lock);
722-
723-
for (uint8_t i = 0; i < events_cnt; i++) {
724-
modem_cellular_event_handler(data, (enum modem_cellular_event)events[i]);
716+
while (k_pipe_read(&data->event_pipe, (uint8_t *)&event, len, K_NO_WAIT) == len) {
717+
modem_cellular_event_handler(data, (enum modem_cellular_event)event);
725718
}
726719
}
727720

728721
static void modem_cellular_delegate_event(struct modem_cellular_data *data,
729722
enum modem_cellular_event evt)
730723
{
731-
k_mutex_lock(&data->event_rb_lock, K_FOREVER);
732-
ring_buf_put(&data->event_rb, (uint8_t *)&evt, 1);
733-
k_mutex_unlock(&data->event_rb_lock);
724+
k_pipe_write(&data->event_pipe, (const uint8_t *)&evt, sizeof(evt), K_NO_WAIT);
734725
k_work_submit(&data->event_dispatch_work);
735726
}
736727

@@ -2108,7 +2099,7 @@ static int modem_cellular_init(const struct device *dev)
21082099
k_mutex_init(&data->api_lock);
21092100
k_work_init_delayable(&data->timeout_work, modem_cellular_timeout_handler);
21102101
k_work_init(&data->event_dispatch_work, modem_cellular_event_dispatch_handler);
2111-
ring_buf_init(&data->event_rb, sizeof(data->event_buf), data->event_buf);
2102+
k_pipe_init(&data->event_pipe, data->event_buf, sizeof(data->event_buf));
21122103

21132104
k_sem_init(&data->suspended_sem, 0, 1);
21142105

0 commit comments

Comments
 (0)