@@ -482,6 +482,7 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
482482 return ret ;
483483 }
484484 send_cmd_done = 0 ;
485+ receive_cmd_done = 1 ;
485486 rx_data_rdy = FALSE;
486487 if (msg -> rx_buf ) {
487488 rx_data_ptr = msg -> rx_buf ;
@@ -500,22 +501,18 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
500501 (void )clock_gettime (CLOCK_REALTIME , & abstime );
501502 abstime .tv_sec += MIPI_TRANSFER_TIMEOUT ;
502503 ret = sem_timedwait (& g_send_cmd_done , & abstime );
503- if (! receive_cmd_done ) {
504- ret = sem_timedwait ( & g_read_cmd_done , & abstime ) ;
504+ if (ret != OK ) {
505+ goto Fail_case ;
505506 }
506- leave_critical_section (flags );
507- if (send_cmd_done != 1 || receive_cmd_done != 1 ) {
508- #ifdef CONFIG_PM
509- bsp_pm_domain_control (BSP_MIPI_DRV , 0 );
510- #endif
511- #ifdef CONFIG_SMP
512- spin_unlock (& g_rtl8730e_config_dev_s_underflow );
513- #endif
514- if (msg -> rx_buf && msg -> rx_len > 0 ) {
515- memset (msg -> rx_buf , 0 , msg -> rx_len );
507+ if (MIPI_LPTX_IS_READ (msg -> type )) {
508+ (void )clock_gettime (CLOCK_REALTIME , & abstime );
509+ abstime .tv_sec += MIPI_TRANSFER_TIMEOUT ;
510+ ret = sem_timedwait (& g_read_cmd_done , & abstime );
511+ if (ret != OK ) {
512+ goto Fail_case ;
516513 }
517- return FAIL ;
518514 }
515+ leave_critical_section (flags );
519516#ifdef CONFIG_SMP
520517 spin_unlock (& g_rtl8730e_config_dev_s_underflow );
521518#endif
@@ -527,6 +524,26 @@ static int amebasmart_mipi_transfer(FAR struct mipi_dsi_host *dsi_host, FAR cons
527524 rx_data_len = 0 ;
528525 }
529526 return OK ;
527+ Fail_case :
528+ #ifdef CONFIG_PM
529+ bsp_pm_domain_control (BSP_MIPI_DRV , 0 );
530+ #endif
531+ #ifdef CONFIG_SMP
532+ spin_unlock (& g_rtl8730e_config_dev_s_underflow );
533+ #endif
534+ if (send_cmd_done == 0 ) {
535+ sem_init (& g_send_cmd_done , 0 , 0 );
536+ }
537+ if (MIPI_LPTX_IS_READ (msg -> type )) {
538+ sem_init (& g_read_cmd_done , 0 , 0 );
539+ }
540+ if (msg -> rx_buf && msg -> rx_len > 0 ) {
541+ memset (msg -> rx_buf , 0 , msg -> rx_len );
542+ rx_data_ptr = NULL ;
543+ rx_data_len = 0 ;
544+ }
545+ leave_critical_section (flags );
546+ return FAIL ;
530547}
531548
532549#ifdef CONFIG_PM
0 commit comments