Lines Matching refs:backend
64 static int modem_backend_uart_async_hwfc_rx_enable(struct modem_backend_uart *backend) in modem_backend_uart_async_hwfc_rx_enable() argument
67 struct rx_buf_t *buf = rx_buf_alloc(&backend->async); in modem_backend_uart_async_hwfc_rx_enable()
73 ret = uart_rx_enable(backend->uart, buf->buf, in modem_backend_uart_async_hwfc_rx_enable()
74 backend->async.rx_buf_size - sizeof(struct rx_buf_t), in modem_backend_uart_async_hwfc_rx_enable()
77 rx_buf_unref(&backend->async, buf->buf); in modem_backend_uart_async_hwfc_rx_enable()
84 static void modem_backend_uart_async_hwfc_rx_recovery(struct modem_backend_uart *backend) in modem_backend_uart_async_hwfc_rx_recovery() argument
88 if (!atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_rx_recovery()
93 err = modem_backend_uart_async_hwfc_rx_enable(backend); in modem_backend_uart_async_hwfc_rx_recovery()
99 if (!atomic_test_and_clear_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_rx_recovery()
102 uart_rx_disable(backend->uart); in modem_backend_uart_async_hwfc_rx_recovery()
108 static bool modem_backend_uart_async_hwfc_is_uart_stopped(const struct modem_backend_uart *backend) in modem_backend_uart_async_hwfc_is_uart_stopped() argument
110 if (!atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_is_uart_stopped()
112 !atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_is_uart_stopped()
114 !atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_is_uart_stopped()
122 static bool modem_backend_uart_async_hwfc_is_open(const struct modem_backend_uart *backend) in modem_backend_uart_async_hwfc_is_open() argument
124 return atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_is_open()
131 struct modem_backend_uart *backend = (struct modem_backend_uart *) user_data; in modem_backend_uart_async_hwfc_event_handler() local
137 atomic_clear_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_event_handler()
139 k_work_submit(&backend->transmit_idle_work); in modem_backend_uart_async_hwfc_event_handler()
143 if (modem_backend_uart_async_hwfc_is_open(backend)) { in modem_backend_uart_async_hwfc_event_handler()
146 atomic_clear_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_event_handler()
148 k_work_submit(&backend->transmit_idle_work); in modem_backend_uart_async_hwfc_event_handler()
153 struct rx_buf_t *buf = rx_buf_alloc(&backend->async); in modem_backend_uart_async_hwfc_event_handler()
159 err = uart_rx_buf_rsp(backend->uart, buf->buf, in modem_backend_uart_async_hwfc_event_handler()
160 backend->async.rx_buf_size - sizeof(struct rx_buf_t)); in modem_backend_uart_async_hwfc_event_handler()
163 rx_buf_unref(&backend->async, buf->buf); in modem_backend_uart_async_hwfc_event_handler()
169 rx_buf_unref(&backend->async, evt->data.rx_buf.buf); in modem_backend_uart_async_hwfc_event_handler()
175 rx_buf_ref(&backend->async, evt->data.rx.buf); in modem_backend_uart_async_hwfc_event_handler()
178 err = k_msgq_put(&backend->async.rx_queue, &rx_event, K_NO_WAIT); in modem_backend_uart_async_hwfc_event_handler()
182 rx_buf_unref(&backend->async, evt->data.rx.buf); in modem_backend_uart_async_hwfc_event_handler()
185 k_work_schedule(&backend->receive_ready_work, K_NO_WAIT); in modem_backend_uart_async_hwfc_event_handler()
190 if (atomic_test_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_event_handler()
192 if (!atomic_test_and_set_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_event_handler()
194 k_work_schedule(&backend->receive_ready_work, K_NO_WAIT); in modem_backend_uart_async_hwfc_event_handler()
208 if (modem_backend_uart_async_hwfc_is_uart_stopped(backend)) { in modem_backend_uart_async_hwfc_event_handler()
209 k_work_submit(&backend->async.common.rx_disabled_work); in modem_backend_uart_async_hwfc_event_handler()
215 struct modem_backend_uart *backend = (struct modem_backend_uart *)data; in modem_backend_uart_async_hwfc_open() local
216 struct rx_buf_t *buf = rx_buf_alloc(&backend->async); in modem_backend_uart_async_hwfc_open()
223 atomic_clear(&backend->async.common.state); in modem_backend_uart_async_hwfc_open()
224 atomic_set_bit(&backend->async.common.state, MODEM_BACKEND_UART_ASYNC_STATE_OPEN_BIT); in modem_backend_uart_async_hwfc_open()
226 ret = uart_rx_enable(backend->uart, buf->buf, in modem_backend_uart_async_hwfc_open()
227 backend->async.rx_buf_size - sizeof(struct rx_buf_t), in modem_backend_uart_async_hwfc_open()
230 rx_buf_unref(&backend->async, buf->buf); in modem_backend_uart_async_hwfc_open()
231 atomic_clear(&backend->async.common.state); in modem_backend_uart_async_hwfc_open()
235 modem_pipe_notify_opened(&backend->pipe); in modem_backend_uart_async_hwfc_open()
240 static uint32_t get_receive_buf_size(struct modem_backend_uart *backend) in get_receive_buf_size() argument
242 return (backend->async.rx_buf_size - sizeof(struct rx_buf_t)) * backend->async.rx_buf_count; in get_receive_buf_size()
245 static void advertise_transmit_buf_stats(struct modem_backend_uart *backend, uint32_t length) in advertise_transmit_buf_stats() argument
247 modem_stats_buffer_advertise_length(&backend->transmit_buf_stats, length); in advertise_transmit_buf_stats()
250 static void advertise_receive_buf_stats(struct modem_backend_uart *backend, uint32_t reserved) in advertise_receive_buf_stats() argument
252 modem_stats_buffer_advertise_length(&backend->receive_buf_stats, reserved); in advertise_receive_buf_stats()
256 static uint32_t get_transmit_buf_size(const struct modem_backend_uart *backend) in get_transmit_buf_size() argument
258 return backend->async.common.transmit_buf_size; in get_transmit_buf_size()
263 struct modem_backend_uart *backend = (struct modem_backend_uart *)data; in modem_backend_uart_async_hwfc_transmit() local
268 transmitting = atomic_test_and_set_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_transmit()
275 bytes_to_transmit = MIN(size, get_transmit_buf_size(backend)); in modem_backend_uart_async_hwfc_transmit()
278 memcpy(backend->async.common.transmit_buf, buf, bytes_to_transmit); in modem_backend_uart_async_hwfc_transmit()
280 ret = uart_tx(backend->uart, backend->async.common.transmit_buf, bytes_to_transmit, in modem_backend_uart_async_hwfc_transmit()
284 advertise_transmit_buf_stats(backend, bytes_to_transmit); in modem_backend_uart_async_hwfc_transmit()
298 struct modem_backend_uart *backend = (struct modem_backend_uart *)data; in modem_backend_uart_async_hwfc_receive() local
304 size_t reserved = backend->async.rx_event.len; in modem_backend_uart_async_hwfc_receive()
306 for (int i = 0; i < k_msgq_num_used_get(&backend->async.rx_queue); i++) { in modem_backend_uart_async_hwfc_receive()
307 if (k_msgq_peek_at(&backend->async.rx_queue, &rx_event, i)) { in modem_backend_uart_async_hwfc_receive()
312 advertise_receive_buf_stats(backend, reserved); in modem_backend_uart_async_hwfc_receive()
318 if (backend->async.rx_event.len == 0) { in modem_backend_uart_async_hwfc_receive()
319 if (k_msgq_get(&backend->async.rx_queue, &backend->async.rx_event, in modem_backend_uart_async_hwfc_receive()
324 copy_size = MIN(size - received, backend->async.rx_event.len); in modem_backend_uart_async_hwfc_receive()
325 memcpy(buf, backend->async.rx_event.buf, copy_size); in modem_backend_uart_async_hwfc_receive()
328 backend->async.rx_event.buf += copy_size; in modem_backend_uart_async_hwfc_receive()
329 backend->async.rx_event.len -= copy_size; in modem_backend_uart_async_hwfc_receive()
331 if (backend->async.rx_event.len == 0) { in modem_backend_uart_async_hwfc_receive()
332 rx_buf_unref(&backend->async, backend->async.rx_event.buf); in modem_backend_uart_async_hwfc_receive()
336 if (backend->async.rx_event.len != 0 || in modem_backend_uart_async_hwfc_receive()
337 k_msgq_num_used_get(&backend->async.rx_queue) != 0) { in modem_backend_uart_async_hwfc_receive()
338 k_work_schedule(&backend->receive_ready_work, K_NO_WAIT); in modem_backend_uart_async_hwfc_receive()
341 modem_backend_uart_async_hwfc_rx_recovery(backend); in modem_backend_uart_async_hwfc_receive()
348 struct modem_backend_uart *backend = (struct modem_backend_uart *)data; in modem_backend_uart_async_hwfc_close() local
350 atomic_clear_bit(&backend->async.common.state, MODEM_BACKEND_UART_ASYNC_STATE_OPEN_BIT); in modem_backend_uart_async_hwfc_close()
351 uart_tx_abort(backend->uart); in modem_backend_uart_async_hwfc_close()
353 if (!atomic_test_and_clear_bit(&backend->async.common.state, in modem_backend_uart_async_hwfc_close()
356 uart_rx_disable(backend->uart); in modem_backend_uart_async_hwfc_close()
369 bool modem_backend_uart_async_is_supported(struct modem_backend_uart *backend) in modem_backend_uart_async_is_supported() argument
371 return uart_callback_set(backend->uart, modem_backend_uart_async_hwfc_event_handler, in modem_backend_uart_async_is_supported()
372 backend) == 0; in modem_backend_uart_async_is_supported()
383 struct modem_backend_uart *backend = in modem_backend_uart_async_hwfc_notify_closed() local
386 modem_pipe_notify_closed(&backend->pipe); in modem_backend_uart_async_hwfc_notify_closed()
390 static void init_stats(struct modem_backend_uart *backend) in init_stats() argument
396 receive_buf_size = get_receive_buf_size(backend); in init_stats()
397 transmit_buf_size = get_transmit_buf_size(backend); in init_stats()
399 snprintk(name, sizeof(name), "%s_%s", backend->uart->name, "rx"); in init_stats()
400 modem_stats_buffer_init(&backend->receive_buf_stats, name, receive_buf_size); in init_stats()
401 snprintk(name, sizeof(name), "%s_%s", backend->uart->name, "tx"); in init_stats()
402 modem_stats_buffer_init(&backend->transmit_buf_stats, name, transmit_buf_size); in init_stats()
406 int modem_backend_uart_async_init(struct modem_backend_uart *backend, in modem_backend_uart_async_init() argument
412 backend->async.rx_buf_count = CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_BUFFER_COUNT; in modem_backend_uart_async_init()
419 buf_size -= (config->receive_buf_size % (sizeof(uint32_t) * backend->async.rx_buf_count)); in modem_backend_uart_async_init()
420 backend->async.rx_buf_size = buf_size / backend->async.rx_buf_count; in modem_backend_uart_async_init()
421 __ASSERT_NO_MSG(backend->async.rx_buf_size > sizeof(struct rx_buf_t)); in modem_backend_uart_async_init()
424 err = k_mem_slab_init(&backend->async.rx_slab, config->receive_buf, in modem_backend_uart_async_init()
425 backend->async.rx_buf_size, backend->async.rx_buf_count); in modem_backend_uart_async_init()
429 k_msgq_init(&backend->async.rx_queue, (char *)&backend->async.rx_queue_buf, in modem_backend_uart_async_init()
432 backend->async.common.transmit_buf = config->transmit_buf; in modem_backend_uart_async_init()
433 backend->async.common.transmit_buf_size = config->transmit_buf_size; in modem_backend_uart_async_init()
434 k_work_init(&backend->async.common.rx_disabled_work, in modem_backend_uart_async_init()
437 modem_pipe_init(&backend->pipe, backend, &modem_backend_uart_async_api); in modem_backend_uart_async_init()
440 init_stats(backend); in modem_backend_uart_async_init()