@ -47,19 +47,21 @@ static inline int fs_exists_unsupported(const char *filename)
return 0 ;
return 0 ;
}
}
static inline int fs_size_unsupported ( const char * filename )
static inline int fs_size_unsupported ( const char * filename , loff_t * size )
{
{
return - 1 ;
return - 1 ;
}
}
static inline int fs_read_unsupported ( const char * filename , void * buf ,
static inline int fs_read_unsupported ( const char * filename , void * buf ,
int offset , int len )
loff_t offset , loff_t len ,
loff_t * actread )
{
{
return - 1 ;
return - 1 ;
}
}
static inline int fs_write_unsupported ( const char * filename , void * buf ,
static inline int fs_write_unsupported ( const char * filename , void * buf ,
int offset , int len )
loff_t offset , loff_t len ,
loff_t * actwrite )
{
{
return - 1 ;
return - 1 ;
}
}
@ -88,9 +90,11 @@ struct fstype_info {
disk_partition_t * fs_partition ) ;
disk_partition_t * fs_partition ) ;
int ( * ls ) ( const char * dirname ) ;
int ( * ls ) ( const char * dirname ) ;
int ( * exists ) ( const char * filename ) ;
int ( * exists ) ( const char * filename ) ;
int ( * size ) ( const char * filename ) ;
int ( * size ) ( const char * filename , loff_t * size ) ;
int ( * read ) ( const char * filename , void * buf , int offset , int len ) ;
int ( * read ) ( const char * filename , void * buf , loff_t offset ,
int ( * write ) ( const char * filename , void * buf , int offset , int len ) ;
loff_t len , loff_t * actread ) ;
int ( * write ) ( const char * filename , void * buf , loff_t offset ,
loff_t len , loff_t * actwrite ) ;
void ( * close ) ( void ) ;
void ( * close ) ( void ) ;
int ( * uuid ) ( char * uuid_str ) ;
int ( * uuid ) ( char * uuid_str ) ;
} ;
} ;
@ -106,7 +110,11 @@ static struct fstype_info fstypes[] = {
. exists = fat_exists ,
. exists = fat_exists ,
. size = fat_size ,
. size = fat_size ,
. read = fat_read_file ,
. read = fat_read_file ,
# ifdef CONFIG_FAT_WRITE
. write = file_fat_write ,
# else
. write = fs_write_unsupported ,
. write = fs_write_unsupported ,
# endif
. uuid = fs_uuid_unsupported ,
. uuid = fs_uuid_unsupported ,
} ,
} ,
# endif
# endif
@ -120,7 +128,11 @@ static struct fstype_info fstypes[] = {
. exists = ext4fs_exists ,
. exists = ext4fs_exists ,
. size = ext4fs_size ,
. size = ext4fs_size ,
. read = ext4_read_file ,
. read = ext4_read_file ,
# ifdef CONFIG_CMD_EXT4_WRITE
. write = ext4_write_file ,
# else
. write = fs_write_unsupported ,
. write = fs_write_unsupported ,
# endif
. uuid = ext4fs_uuid ,
. uuid = ext4fs_uuid ,
} ,
} ,
# endif
# endif
@ -251,20 +263,21 @@ int fs_exists(const char *filename)
return ret ;
return ret ;
}
}
int fs_size ( const char * filename )
int fs_size ( const char * filename , loff_t * size )
{
{
int ret ;
int ret ;
struct fstype_info * info = fs_get_info ( fs_type ) ;
struct fstype_info * info = fs_get_info ( fs_type ) ;
ret = info - > size ( filename ) ;
ret = info - > size ( filename , size ) ;
fs_close ( ) ;
fs_close ( ) ;
return ret ;
return ret ;
}
}
int fs_read ( const char * filename , ulong addr , int offset , int len )
int fs_read ( const char * filename , ulong addr , loff_t offset , loff_t len ,
loff_t * actread )
{
{
struct fstype_info * info = fs_get_info ( fs_type ) ;
struct fstype_info * info = fs_get_info ( fs_type ) ;
void * buf ;
void * buf ;
@ -275,11 +288,11 @@ int fs_read(const char *filename, ulong addr, int offset, int len)
* means read the whole file .
* means read the whole file .
*/
*/
buf = map_sysmem ( addr , len ) ;
buf = map_sysmem ( addr , len ) ;
ret = info - > read ( filename , buf , offset , len ) ;
ret = info - > read ( filename , buf , offset , len , actread ) ;
unmap_sysmem ( buf ) ;
unmap_sysmem ( buf ) ;
/* If we requested a specific number of bytes, check we got it */
/* If we requested a specific number of bytes, check we got it */
if ( ret > = 0 & & len & & ret ! = len ) {
if ( ret = = 0 & & len & & * actread ! = len ) {
printf ( " ** Unable to read file %s ** \n " , filename ) ;
printf ( " ** Unable to read file %s ** \n " , filename ) ;
ret = - 1 ;
ret = - 1 ;
}
}
@ -288,17 +301,18 @@ int fs_read(const char *filename, ulong addr, int offset, int len)
return ret ;
return ret ;
}
}
int fs_write ( const char * filename , ulong addr , int offset , int len )
int fs_write ( const char * filename , ulong addr , loff_t offset , loff_t len ,
loff_t * actwrite )
{
{
struct fstype_info * info = fs_get_info ( fs_type ) ;
struct fstype_info * info = fs_get_info ( fs_type ) ;
void * buf ;
void * buf ;
int ret ;
int ret ;
buf = map_sysmem ( addr , len ) ;
buf = map_sysmem ( addr , len ) ;
ret = info - > write ( filename , buf , offset , len ) ;
ret = info - > write ( filename , buf , offset , len , actwrite ) ;
unmap_sysmem ( buf ) ;
unmap_sysmem ( buf ) ;
if ( ret > = 0 & & ret ! = len ) {
if ( ret < 0 & & len ! = * actwrite ) {
printf ( " ** Unable to write file %s ** \n " , filename ) ;
printf ( " ** Unable to write file %s ** \n " , filename ) ;
ret = - 1 ;
ret = - 1 ;
}
}
@ -310,7 +324,7 @@ int fs_write(const char *filename, ulong addr, int offset, int len)
int do_size ( cmd_tbl_t * cmdtp , int flag , int argc , char * const argv [ ] ,
int do_size ( cmd_tbl_t * cmdtp , int flag , int argc , char * const argv [ ] ,
int fstype )
int fstype )
{
{
in t size ;
loff_ t size ;
if ( argc ! = 4 )
if ( argc ! = 4 )
return CMD_RET_USAGE ;
return CMD_RET_USAGE ;
@ -318,8 +332,7 @@ int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
if ( fs_set_blk_dev ( argv [ 1 ] , argv [ 2 ] , fstype ) )
if ( fs_set_blk_dev ( argv [ 1 ] , argv [ 2 ] , fstype ) )
return 1 ;
return 1 ;
size = fs_size ( argv [ 3 ] ) ;
if ( fs_size ( argv [ 3 ] , & size ) < 0 )
if ( size < 0 )
return CMD_RET_FAILURE ;
return CMD_RET_FAILURE ;
setenv_hex ( " filesize " , size ) ;
setenv_hex ( " filesize " , size ) ;
@ -333,9 +346,10 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
unsigned long addr ;
unsigned long addr ;
const char * addr_str ;
const char * addr_str ;
const char * filename ;
const char * filename ;
unsigned long bytes ;
loff_t bytes ;
unsigned long pos ;
loff_t pos ;
int len_read ;
loff_t len_read ;
int ret ;
unsigned long time ;
unsigned long time ;
char * ep ;
char * ep ;
@ -377,12 +391,12 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
pos = 0 ;
pos = 0 ;
time = get_timer ( 0 ) ;
time = get_timer ( 0 ) ;
len_read = fs_read ( filename , addr , pos , bytes ) ;
ret = fs_read ( filename , addr , pos , bytes , & len_read ) ;
time = get_timer ( time ) ;
time = get_timer ( time ) ;
if ( len_read < = 0 )
if ( ret < 0 )
return 1 ;
return 1 ;
printf ( " %d bytes read in %lu ms " , len_read , time ) ;
printf ( " %llu bytes read in %lu ms " , len_read , time ) ;
if ( time > 0 ) {
if ( time > 0 ) {
puts ( " ( " ) ;
puts ( " ( " ) ;
print_size ( len_read / time * 1000 , " /s " ) ;
print_size ( len_read / time * 1000 , " /s " ) ;
@ -426,9 +440,10 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
{
{
unsigned long addr ;
unsigned long addr ;
const char * filename ;
const char * filename ;
unsigned long bytes ;
loff_t bytes ;
unsigned long pos ;
loff_t pos ;
int len ;
loff_t len ;
int ret ;
unsigned long time ;
unsigned long time ;
if ( argc < 6 | | argc > 7 )
if ( argc < 6 | | argc > 7 )
@ -437,8 +452,8 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
if ( fs_set_blk_dev ( argv [ 1 ] , argv [ 2 ] , fstype ) )
if ( fs_set_blk_dev ( argv [ 1 ] , argv [ 2 ] , fstype ) )
return 1 ;
return 1 ;
filename = argv [ 3 ] ;
addr = simple_strtoul ( argv [ 3 ] , NULL , 16 ) ;
addr = simple_strtoul ( argv [ 4 ] , NULL , 16 ) ;
filename = argv [ 4 ] ;
bytes = simple_strtoul ( argv [ 5 ] , NULL , 16 ) ;
bytes = simple_strtoul ( argv [ 5 ] , NULL , 16 ) ;
if ( argc > = 7 )
if ( argc > = 7 )
pos = simple_strtoul ( argv [ 6 ] , NULL , 16 ) ;
pos = simple_strtoul ( argv [ 6 ] , NULL , 16 ) ;
@ -446,12 +461,12 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
pos = 0 ;
pos = 0 ;
time = get_timer ( 0 ) ;
time = get_timer ( 0 ) ;
len = fs_write ( filename , addr , pos , bytes ) ;
ret = fs_write ( filename , addr , pos , bytes , & len ) ;
time = get_timer ( time ) ;
time = get_timer ( time ) ;
if ( len < = 0 )
if ( ret < 0 )
return 1 ;
return 1 ;
printf ( " %d bytes written in %lu ms " , len , time ) ;
printf ( " %llu bytes written in %lu ms " , len , time ) ;
if ( time > 0 ) {
if ( time > 0 ) {
puts ( " ( " ) ;
puts ( " ( " ) ;
print_size ( len / time * 1000 , " /s " ) ;
print_size ( len / time * 1000 , " /s " ) ;