2727 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828 *
2929--------------------------------------------- */
30-
3130#include "embARC_toolchain.h"
3231#include "embARC_error.h"
3332#include "arc_exception.h"
@@ -60,7 +59,10 @@ Inline void dw_sdio_fifo_read_poll(DW_SDIO_CTRL_PTR sdio, uint32_t *buf, uint32_
6059 uint32_t i ;
6160
6261 while (size ) {
63- len = dw_sdio_reg_read (sdio , DWSDIO_REG_STATUS );
62+ do {
63+ len = dw_sdio_reg_read (sdio , DWSDIO_REG_STATUS );
64+ } while (len & DWSDIO_STATUS_FIFO_EMPTY );
65+
6466 len = (len & DWSDIO_STATUS_MASK_FIFO ) >> DWSDIO_STATUS_BIT_FIFO ;
6567
6668 len = min (size , len );
@@ -96,8 +98,11 @@ Inline void dw_sdio_fifo_write_poll(DW_SDIO_CTRL_PTR sdio, uint32_t *buf, uint32
9698 uint32_t i ;
9799 uint32_t fifo_depth = sdio -> fifo_depth ;
98100
99- while (size ) {
100- len = dw_sdio_reg_read (sdio , DWSDIO_REG_STATUS );
101+ while (size ) {
102+ do {
103+ len = dw_sdio_reg_read (sdio , DWSDIO_REG_STATUS );
104+ } while (len & DWSDIO_STATUS_FIFO_FULL );
105+
101106 len = fifo_depth - ((len & DWSDIO_STATUS_MASK_FIFO ) >> DWSDIO_STATUS_BIT_FIFO );
102107 len = min (size , len );
103108
@@ -188,7 +193,6 @@ static int32_t dw_sdio_bus_freq_set(DW_SDIO_CTRL_PTR sdio, uint32_t card_number,
188193 dw_sdio_reg_write (sdio , DWSDIO_REG_CLKSRC , 0 );
189194 dw_sdio_reg_write (sdio , DWSDIO_REG_CLKDIV , div );
190195
191-
192196 dw_sdio_reg_write (sdio , DWSDIO_REG_CMD , DWSDIO_CMD_PRV_DAT_WAIT |
193197 DWSDIO_CMD_UPD_CLK | DWSDIO_CMD_START | DWSDIO_CMD_USE_HOLD_REG );
194198
@@ -284,7 +288,6 @@ static int32_t dw_sdio_data_transfer_poll(DW_SDIO_CTRL_PTR sdio, SDIO_DATA_PTR d
284288{
285289 uint32_t size ;
286290 uint32_t status ;
287- int32_t ret ;
288291 uint32_t timeout = 1000 ;
289292 uint32_t start = OSP_GET_CUR_MS ();
290293
@@ -295,30 +298,28 @@ static int32_t dw_sdio_data_transfer_poll(DW_SDIO_CTRL_PTR sdio, SDIO_DATA_PTR d
295298
296299 if (status & (DWSDIO_INT_DATA_ERR | DWSDIO_INT_DATA_TMO )) {
297300 DBG ("%s:, data transfer error!\r\n" , __func__ );
298- ret = E_SYS ;
299- break ;
301+ return E_SYS ;
302+ }
303+
304+ if (status & DWSDIO_INT_DTO ) {
305+ return E_OK ;
300306 }
301307
302- if (data -> flags == SDIO_DATA_READ && (status & DWSDIO_INT_RXDR )) {
308+ if (data -> flags == SDIO_DATA_READ && (status & DWSDIO_INT_RXDR ) && size ) {
303309 dw_sdio_fifo_read_poll (sdio , (uint32_t * )data -> in , size );
310+ size = 0 ;
304311 dw_sdio_reg_write (sdio , DWSDIO_REG_RINTSTS , DWSDIO_INT_RXDR );
305- } else if (data -> flags == SDIO_DATA_WRITE && (status & DWSDIO_INT_TXDR )) {
312+ } else if (data -> flags == SDIO_DATA_WRITE && (status & DWSDIO_INT_TXDR ) && size ) {
306313 dw_sdio_fifo_write_poll (sdio , (uint32_t * )data -> out , size );
314+ size = 0 ;
307315 dw_sdio_reg_write (sdio , DWSDIO_REG_RINTSTS , DWSDIO_INT_TXDR );
308316 }
309317
310- if (status & DWSDIO_INT_DTO ) {
311- ret = E_OK ;
312- break ;
313- }
314-
315318 if ((OSP_GET_CUR_MS () - start ) > timeout ) {
316319 DBG ("%s: timeout on data transfer\r\n" , __func__ );
317320 return E_TMOUT ;
318321 }
319322 }
320-
321- return ret ;
322323}
323324
324325void dw_sdio_isr (DEV_SDIO * sdio_obj , void * ptr )
@@ -419,7 +420,6 @@ int32_t dw_sdio_cmd_poll(DEV_SDIO *sdio_obj, SDIO_CMD_PTR cmd, SDIO_DATA_PTR dat
419420 return E_SYS ;
420421 }
421422
422-
423423 if (cmd -> resp_type & SDIO_RSP_PRESENT ) {
424424 if (cmd -> resp_type & SDIO_RSP_136 ) {
425425 cmd -> resp [0 ] = dw_sdio_reg_read (sdio , DWSDIO_REG_RESP3 );
@@ -509,9 +509,9 @@ int32_t dw_sdio_cd(DEV_SDIO *sdio_obj, uint32_t card_number)
509509 * Some use 0 (CD pin to GNU) to indicate card detect.
510510 */
511511#ifdef DWSDIO_CARD_DETECT_HIGH_LEVEL
512- val = dw_sdio_reg_read (sdio , DWSDIO_REG_CDETECT );
512+ val = dw_sdio_reg_read (sdio , DWSDIO_REG_CDETECT );
513513#else
514- val = ~dw_sdio_reg_read (sdio , DWSDIO_REG_CDETECT );
514+ val = ~dw_sdio_reg_read (sdio , DWSDIO_REG_CDETECT );
515515#endif
516516
517517 if ((val & (1 << card_number )) == (1 << card_number )) {
@@ -523,13 +523,12 @@ int32_t dw_sdio_cd(DEV_SDIO *sdio_obj, uint32_t card_number)
523523
524524int32_t dw_sdio_wp (DEV_SDIO * sdio_obj , uint32_t card_number )
525525{
526-
527526 uint32_t val ;
528527
529528 DEV_SDIO_INFO_PTR sdio_info_ptr = & (sdio_obj -> sdio_info );
530529 DW_SDIO_CTRL_PTR sdio = (DW_SDIO_CTRL_PTR )sdio_info_ptr -> sdio_ctrl ;
531530
532- val = dw_sdio_reg_read (sdio , DWSDIO_REG_WRTPRT );
531+ val = dw_sdio_reg_read (sdio , DWSDIO_REG_WRTPRT );
533532
534533 if ((val & (1 << card_number )) == (1 << card_number )) {
535534 return 1 ; /* the specific card is write-protect */
@@ -554,8 +553,8 @@ int32_t dw_sdio_control(DEV_SDIO *sdio_obj, SDIO_CTRL_CMD_PTR ctrl_cmd, void *pa
554553 dw_sdio_bus_type_set (sdio , card , (uint32_t )param );
555554 break ;
556555 case SDIO_CMD_SET_BUS_FREQ :
557- dw_sdio_bus_freq_set (sdio , card , (uint32_t )param );
558- break ;
556+ dw_sdio_bus_freq_set (sdio , card , (uint32_t )param );
557+ break ;
559558 /* \todo add more cmds */
560559 default :
561560 ret = E_PAR ;
0 commit comments