diff --git a/drivers/modem/modem_iface_uart.c b/drivers/modem/modem_iface_uart.c index 0bed06e56f2..8139ee4d7ae 100644 --- a/drivers/modem/modem_iface_uart.c +++ b/drivers/modem/modem_iface_uart.c @@ -74,8 +74,12 @@ static void modem_iface_uart_isr(const struct device *uart_dev, UINT32_MAX); } if (!partial_size) { - LOG_ERR("Rx buffer doesn't have enough space"); - modem_iface_uart_flush(&ctx->iface); + if (data->hw_flow_control) { + uart_irq_rx_disable(ctx->iface.dev); + } else { + LOG_ERR("Rx buffer doesn't have enough space"); + modem_iface_uart_flush(&ctx->iface); + } break; } @@ -114,6 +118,10 @@ static int modem_iface_uart_read(struct modem_iface *iface, data = (struct modem_iface_uart_data *)(iface->iface_data); *bytes_read = ring_buf_get(&data->rx_rb, buf, size); + if (data->hw_flow_control && *bytes_read == 0) { + uart_irq_rx_enable(iface->dev); + } + return 0; } diff --git a/drivers/modem/modem_iface_uart.h b/drivers/modem/modem_iface_uart.h index 98ef8665fbb..63c472c2bdd 100644 --- a/drivers/modem/modem_iface_uart.h +++ b/drivers/modem/modem_iface_uart.h @@ -20,6 +20,9 @@ extern "C" { #endif struct modem_iface_uart_data { + /* HW flow control */ + bool hw_flow_control; + /* ring buffer char buffer */ char *rx_rb_buf; size_t rx_rb_buf_len;