@@ -47,7 +47,6 @@ UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
47
47
#define CDC_ACM_IRQ_RX_ENABLED 2
48
48
#define CDC_ACM_IRQ_TX_ENABLED 3
49
49
#define CDC_ACM_RX_FIFO_BUSY 4
50
- #define CDC_ACM_LOCK 5
51
50
52
51
static struct k_work_q cdc_acm_work_q ;
53
52
static K_KERNEL_STACK_DEFINE (cdc_acm_stack ,
@@ -540,15 +539,10 @@ static void cdc_acm_tx_fifo_handler(struct k_work *work)
540
539
return ;
541
540
}
542
541
543
- if (atomic_test_and_set_bit (& data -> state , CDC_ACM_LOCK )) {
544
- cdc_acm_work_submit (& data -> tx_fifo_work );
545
- return ;
546
- }
547
-
548
542
buf = cdc_acm_buf_alloc (cdc_acm_get_bulk_in (c_data ));
549
543
if (buf == NULL ) {
550
544
cdc_acm_work_submit (& data -> tx_fifo_work );
551
- goto tx_fifo_handler_exit ;
545
+ return ;
552
546
}
553
547
554
548
len = ring_buf_get (data -> tx_fifo .rb , buf -> data , buf -> size );
@@ -559,9 +553,6 @@ static void cdc_acm_tx_fifo_handler(struct k_work *work)
559
553
LOG_ERR ("Failed to enqueue" );
560
554
net_buf_unref (buf );
561
555
}
562
-
563
- tx_fifo_handler_exit :
564
- atomic_clear_bit (& data -> state , CDC_ACM_LOCK );
565
556
}
566
557
567
558
/*
@@ -808,12 +799,6 @@ static void cdc_acm_irq_cb_handler(struct k_work *work)
808
799
return ;
809
800
}
810
801
811
- if (atomic_test_and_set_bit (& data -> state , CDC_ACM_LOCK )) {
812
- LOG_ERR ("Polling is in progress" );
813
- cdc_acm_work_submit (& data -> irq_cb_work );
814
- return ;
815
- }
816
-
817
802
data -> tx_fifo .altered = false;
818
803
data -> rx_fifo .altered = false;
819
804
data -> rx_fifo .irq = false;
@@ -845,8 +830,6 @@ static void cdc_acm_irq_cb_handler(struct k_work *work)
845
830
LOG_DBG ("tx irq pending, submit irq_cb_work" );
846
831
cdc_acm_work_submit (& data -> irq_cb_work );
847
832
}
848
-
849
- atomic_clear_bit (& data -> state , CDC_ACM_LOCK );
850
833
}
851
834
852
835
static void cdc_acm_irq_callback_set (const struct device * dev ,
@@ -865,13 +848,8 @@ static int cdc_acm_poll_in(const struct device *dev, unsigned char *const c)
865
848
uint32_t len ;
866
849
int ret = -1 ;
867
850
868
- if (atomic_test_and_set_bit (& data -> state , CDC_ACM_LOCK )) {
869
- LOG_ERR ("IRQ callback is used" );
870
- return -1 ;
871
- }
872
-
873
851
if (ring_buf_is_empty (data -> rx_fifo .rb )) {
874
- goto poll_in_exit ;
852
+ return ret ;
875
853
}
876
854
877
855
len = ring_buf_get (data -> rx_fifo .rb , c , 1 );
@@ -880,24 +858,20 @@ static int cdc_acm_poll_in(const struct device *dev, unsigned char *const c)
880
858
ret = 0 ;
881
859
}
882
860
883
- poll_in_exit :
884
- atomic_clear_bit (& data -> state , CDC_ACM_LOCK );
885
-
886
861
return ret ;
887
862
}
888
863
889
864
static void cdc_acm_poll_out (const struct device * dev , const unsigned char c )
890
865
{
891
866
struct cdc_acm_uart_data * const data = dev -> data ;
867
+ unsigned int lock ;
892
868
uint32_t wrote ;
893
869
894
- if (atomic_test_and_set_bit (& data -> state , CDC_ACM_LOCK )) {
895
- LOG_ERR ("IRQ callback is used" );
896
- return ;
897
- }
898
-
899
870
while (true) {
871
+ lock = irq_lock ();
900
872
wrote = ring_buf_put (data -> tx_fifo .rb , & c , 1 );
873
+ irq_unlock (lock );
874
+
901
875
if (wrote == 1 ) {
902
876
break ;
903
877
}
@@ -910,7 +884,6 @@ static void cdc_acm_poll_out(const struct device *dev, const unsigned char c)
910
884
k_msleep (1 );
911
885
}
912
886
913
- atomic_clear_bit (& data -> state , CDC_ACM_LOCK );
914
887
cdc_acm_work_submit (& data -> tx_fifo_work );
915
888
}
916
889
0 commit comments