@ -73,7 +73,7 @@ static lbaint_t fb_mmc_sparse_reserve(struct sparse_storage *info,
static void write_raw_image ( struct blk_desc * dev_desc , disk_partition_t * info ,
const char * part_name , void * buffer ,
unsigned int download_bytes )
unsigned int download_bytes , char * response )
{
lbaint_t blkcnt ;
lbaint_t blks ;
@ -84,7 +84,7 @@ static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
if ( blkcnt > info - > size ) {
pr_err ( " too large for partition: '%s' \n " , part_name ) ;
fastboot_fail ( " too large for partition " ) ;
fastboot_fail ( " too large for partition " , response ) ;
return ;
}
@ -93,13 +93,13 @@ static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
blks = blk_dwrite ( dev_desc , info - > start , blkcnt , buffer ) ;
if ( blks ! = blkcnt ) {
pr_err ( " failed writing to device %d \n " , dev_desc - > devnum ) ;
fastboot_fail ( " failed writing to device " ) ;
fastboot_fail ( " failed writing to device " , response ) ;
return ;
}
printf ( " ........ wrote " LBAFU " bytes to '%s' \n " , blkcnt * info - > blksz ,
part_name ) ;
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
}
# ifdef CONFIG_ANDROID_BOOT_IMAGE
@ -114,7 +114,8 @@ static void write_raw_image(struct blk_desc *dev_desc, disk_partition_t *info,
*/
static lbaint_t fb_mmc_get_boot_header ( struct blk_desc * dev_desc ,
disk_partition_t * info ,
struct andr_img_hdr * hdr )
struct andr_img_hdr * hdr ,
char * response )
{
ulong sector_size ; /* boot partition sector size */
lbaint_t hdr_sectors ; /* boot image header sectors count */
@ -125,7 +126,7 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc *dev_desc,
hdr_sectors = DIV_ROUND_UP ( sizeof ( struct andr_img_hdr ) , sector_size ) ;
if ( hdr_sectors = = 0 ) {
pr_err ( " invalid number of boot sectors: 0 " ) ;
fastboot_fail ( " invalid number of boot sectors: 0 " ) ;
fastboot_fail ( " invalid number of boot sectors: 0 " , response ) ;
return 0 ;
}
@ -133,7 +134,8 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc *dev_desc,
res = blk_dread ( dev_desc , info - > start , hdr_sectors , ( void * ) hdr ) ;
if ( res ! = hdr_sectors ) {
pr_err ( " cannot read header from boot partition " ) ;
fastboot_fail ( " cannot read header from boot partition " ) ;
fastboot_fail ( " cannot read header from boot partition " ,
response ) ;
return 0 ;
}
@ -141,7 +143,7 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc *dev_desc,
res = android_image_check_header ( hdr ) ;
if ( res ! = 0 ) {
pr_err ( " bad boot image magic " ) ;
fastboot_fail ( " boot partition not initialized " ) ;
fastboot_fail ( " boot partition not initialized " , response ) ;
return 0 ;
}
@ -159,7 +161,8 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc *dev_desc,
*/
static int fb_mmc_update_zimage ( struct blk_desc * dev_desc ,
void * download_buffer ,
unsigned int download_bytes )
unsigned int download_bytes ,
char * response )
{
uintptr_t hdr_addr ; /* boot image header address */
struct andr_img_hdr * hdr ; /* boot image header */
@ -179,7 +182,7 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
res = part_get_info_by_name ( dev_desc , BOOT_PARTITION_NAME , & info ) ;
if ( res < 0 ) {
pr_err ( " cannot find boot partition " ) ;
fastboot_fail ( " cannot find boot partition " ) ;
fastboot_fail ( " cannot find boot partition " , response ) ;
return - 1 ;
}
@ -188,17 +191,18 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
hdr = ( struct andr_img_hdr * ) hdr_addr ;
/* Read boot image header */
hdr_sectors = fb_mmc_get_boot_header ( dev_desc , & info , hdr ) ;
hdr_sectors = fb_mmc_get_boot_header ( dev_desc , & info , hdr , response ) ;
if ( hdr_sectors = = 0 ) {
pr_err ( " unable to read boot image header " ) ;
fastboot_fail ( " unable to read boot image header " ) ;
fastboot_fail ( " unable to read boot image header " , response ) ;
return - 1 ;
}
/* Check if boot image has second stage in it (we don't support it) */
if ( hdr - > second_size > 0 ) {
pr_err ( " moving second stage is not supported yet " ) ;
fastboot_fail ( " moving second stage is not supported yet " ) ;
fastboot_fail ( " moving second stage is not supported yet " ,
response ) ;
return - 1 ;
}
@ -216,7 +220,8 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
ramdisk_buffer ) ;
if ( res ! = ramdisk_sectors ) {
pr_err ( " cannot read ramdisk from boot partition " ) ;
fastboot_fail ( " cannot read ramdisk from boot partition " ) ;
fastboot_fail ( " cannot read ramdisk from boot partition " ,
response ) ;
return - 1 ;
}
@ -225,7 +230,7 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
res = blk_dwrite ( dev_desc , info . start , hdr_sectors , ( void * ) hdr ) ;
if ( res = = 0 ) {
pr_err ( " cannot writeback boot image header " ) ;
fastboot_fail ( " cannot write back boot image header " ) ;
fastboot_fail ( " cannot write back boot image header " , response ) ;
return - 1 ;
}
@ -237,7 +242,7 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
download_buffer ) ;
if ( res = = 0 ) {
pr_err ( " cannot write new kernel " ) ;
fastboot_fail ( " cannot write new kernel " ) ;
fastboot_fail ( " cannot write new kernel " , response ) ;
return - 1 ;
}
@ -249,18 +254,18 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
ramdisk_buffer ) ;
if ( res = = 0 ) {
pr_err ( " cannot write back original ramdisk " ) ;
fastboot_fail ( " cannot write back original ramdisk " ) ;
fastboot_fail ( " cannot write back original ramdisk " , response ) ;
return - 1 ;
}
puts ( " ........ zImage was updated in boot partition \n " ) ;
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
return 0 ;
}
# endif
void fb_mmc_flash_write ( const char * cmd , void * download_buffer ,
unsigned int download_bytes )
unsigned int download_bytes , char * response )
{
struct blk_desc * dev_desc ;
disk_partition_t info ;
@ -268,7 +273,7 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
dev_desc = blk_get_dev ( " mmc " , CONFIG_FASTBOOT_FLASH_MMC_DEV ) ;
if ( ! dev_desc | | dev_desc - > type = = DEV_TYPE_UNKNOWN ) {
pr_err ( " invalid mmc device \n " ) ;
fastboot_fail ( " invalid mmc device " ) ;
fastboot_fail ( " invalid mmc device " , response ) ;
return ;
}
@ -279,16 +284,17 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
if ( is_valid_gpt_buf ( dev_desc , download_buffer ) ) {
printf ( " %s: invalid GPT - refusing to write to flash \n " ,
__func__ ) ;
fastboot_fail ( " invalid GPT partition " ) ;
fastboot_fail ( " invalid GPT partition " , response ) ;
return ;
}
if ( write_mbr_and_gpt_partitions ( dev_desc , download_buffer ) ) {
printf ( " %s: writing GPT partitions failed \n " , __func__ ) ;
fastboot_fail ( " writing GPT partitions failed " ) ;
fastboot_fail ( " writing GPT partitions failed " ,
response ) ;
return ;
}
printf ( " ........ success \n " ) ;
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
return ;
}
# endif
@ -299,30 +305,32 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
if ( is_valid_dos_buf ( download_buffer ) ) {
printf ( " %s: invalid MBR - refusing to write to flash \n " ,
__func__ ) ;
fastboot_fail ( " invalid MBR partition " ) ;
fastboot_fail ( " invalid MBR partition " , response ) ;
return ;
}
if ( write_mbr_partition ( dev_desc , download_buffer ) ) {
printf ( " %s: writing MBR partition failed \n " , __func__ ) ;
fastboot_fail ( " writing MBR partition failed " ) ;
fastboot_fail ( " writing MBR partition failed " ,
response ) ;
return ;
}
printf ( " ........ success \n " ) ;
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
return ;
}
# endif
# ifdef CONFIG_ANDROID_BOOT_IMAGE
if ( strncasecmp ( cmd , " zimage " , 6 ) = = 0 ) {
fb_mmc_update_zimage ( dev_desc , download_buffer , download_bytes ) ;
fb_mmc_update_zimage ( dev_desc , download_buffer ,
download_bytes , response ) ;
return ;
}
# endif
if ( part_get_info_by_name_or_alias ( dev_desc , cmd , & info ) < 0 ) {
pr_err ( " cannot find partition: '%s' \n " , cmd ) ;
fastboot_fail ( " cannot find partition " ) ;
fastboot_fail ( " cannot find partition " , response ) ;
return ;
}
@ -344,16 +352,17 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
sparse . start ) ;
sparse . priv = & sparse_priv ;
err = write_sparse_image ( & sparse , cmd , download_buffer ) ;
err = write_sparse_image ( & sparse , cmd , download_buffer ,
response ) ;
if ( ! err )
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
} else {
write_raw_image ( dev_desc , & info , cmd , download_buffer ,
download_bytes ) ;
download_bytes , response ) ;
}
}
void fb_mmc_erase ( const char * cmd )
void fb_mmc_erase ( const char * cmd , char * response )
{
int ret ;
struct blk_desc * dev_desc ;
@ -363,21 +372,21 @@ void fb_mmc_erase(const char *cmd)
if ( mmc = = NULL ) {
pr_err ( " invalid mmc device " ) ;
fastboot_fail ( " invalid mmc device " ) ;
fastboot_fail ( " invalid mmc device " , response ) ;
return ;
}
dev_desc = blk_get_dev ( " mmc " , CONFIG_FASTBOOT_FLASH_MMC_DEV ) ;
if ( ! dev_desc | | dev_desc - > type = = DEV_TYPE_UNKNOWN ) {
pr_err ( " invalid mmc device " ) ;
fastboot_fail ( " invalid mmc device " ) ;
fastboot_fail ( " invalid mmc device " , response ) ;
return ;
}
ret = part_get_info_by_name_or_alias ( dev_desc , cmd , & info ) ;
if ( ret < 0 ) {
pr_err ( " cannot find partition: '%s' " , cmd ) ;
fastboot_fail ( " cannot find partition " ) ;
fastboot_fail ( " cannot find partition " , response ) ;
return ;
}
@ -396,11 +405,11 @@ void fb_mmc_erase(const char *cmd)
blks = blk_derase ( dev_desc , blks_start , blks_size ) ;
if ( blks ! = blks_size ) {
pr_err ( " failed erasing from device %d " , dev_desc - > devnum ) ;
fastboot_fail ( " failed erasing from device " ) ;
fastboot_fail ( " failed erasing from device " , response ) ;
return ;
}
printf ( " ........ erased " LBAFU " bytes from '%s' \n " ,
blks_size * info . blksz , cmd ) ;
fastboot_okay ( " " ) ;
fastboot_okay ( NULL , response ) ;
}