@ -108,7 +108,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
int mmc_send_status ( struct mmc * mmc , int timeout )
{
struct mmc_cmd cmd ;
int err ;
int err , retries = 5 ;
# ifdef CONFIG_MMC_TRACE
int status ;
# endif
@ -121,17 +121,21 @@ int mmc_send_status(struct mmc *mmc, int timeout)
do {
err = mmc_send_cmd ( mmc , & cmd , NULL ) ;
if ( err )
if ( ! err ) {
if ( ( cmd . response [ 0 ] & MMC_STATUS_RDY_FOR_DATA ) & &
( cmd . response [ 0 ] & MMC_STATUS_CURR_STATE ) ! =
MMC_STATE_PRG )
break ;
else if ( cmd . response [ 0 ] & MMC_STATUS_MASK ) {
printf ( " Status Error: 0x%08X \n " ,
cmd . response [ 0 ] ) ;
return COMM_ERR ;
}
} else if ( - - retries < 0 )
return err ;
else if ( cmd . response [ 0 ] & MMC_STATUS_RDY_FOR_DATA )
break ;
udelay ( 1000 ) ;
if ( cmd . response [ 0 ] & MMC_STATUS_MASK ) {
printf ( " Status Error: 0x%08X \n " , cmd . response [ 0 ] ) ;
return COMM_ERR ;
}
} while ( timeout - - ) ;
# ifdef CONFIG_MMC_TRACE
@ -305,11 +309,12 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
printf ( " mmc fail to send stop cmd \n " ) ;
return 0 ;
}
/* Waiting for the ready status */
mmc_send_status ( mmc , timeout ) ;
}
/* Waiting for the ready status */
if ( mmc_send_status ( mmc , timeout ) )
return 0 ;
return blkcnt ;
}
@ -341,7 +346,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
{
struct mmc_cmd cmd ;
struct mmc_data data ;
int timeout = 1000 ;
if ( blkcnt > 1 )
cmd . cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK ;
@ -373,9 +377,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
printf ( " mmc fail to send stop cmd \n " ) ;
return 0 ;
}
/* Waiting for the ready status */
mmc_send_status ( mmc , timeout ) ;
}
return blkcnt ;
@ -610,7 +611,8 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
ret = mmc_send_cmd ( mmc , & cmd , NULL ) ;
/* Waiting for the ready status */
mmc_send_status ( mmc , timeout ) ;
if ( ! ret )
ret = mmc_send_status ( mmc , timeout ) ;
return ret ;