@ -34,51 +34,58 @@
# include <string.h>
# include <stddef.h>
# include <urjtag/error.h>
# include <urjtag/flash.h>
# include <urjtag/bus.h>
# include "flash.h"
# include "jedec.h"
# include "amd.h"
# include "cfi.h"
# include "intel.h"
# include "mic.h"
urj_flash_cfi_array_t * urj_flash_cfi_array = NULL ;
void
urj_flash_detectflash ( urj_bus_t * bus , uint32_t adr )
urj_flash_cleanup ( void )
{
urj_flash_cfi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
}
int
urj_flash_detectflash ( urj_log_level_t ll , urj_bus_t * bus , uint32_t adr )
{
urj_flash_cfi_query_structure_t * cfi ;
const char * s ;
if ( ! bus )
{
printf ( _ ( " Error: Missing bus driver! \n " ) ) ;
return ;
urj_error_set ( URJ_ERROR_INVALID , _ ( " bus driver " ) ) ;
return URJ_STATUS_FAIL ;
}
urj_flash_cfi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
urj_flash_cleanup ( ) ;
URJ_BUS_PREPARE ( bus ) ;
if ( urj_flash_cfi_detect ( bus , adr , & urj_flash_cfi_array ) )
if ( urj_flash_cfi_detect ( bus , adr , & urj_flash_cfi_array ) ! = URJ_STATUS_OK )
{
urj_flash_c fi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
if ( urj_flash_jedec_detect ( bus , adr , & urj_flash_cfi_array ) ! = 0 )
urj_flash_c leanup( ) ;
if ( urj_flash_jedec_detect ( bus , adr , & urj_flash_cfi_array )
! = URJ_STATUS_OK )
{
urj_flash_c fi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
if ( urj_flash_amd_detect ( bus , adr , & urj_flash_cfi_array ) ! = 0 )
urj_flash_c leanup( ) ;
if ( urj_flash_amd_detect ( bus , adr , & urj_flash_cfi_array )
! = URJ_STATUS_OK )
{
urj_flash_cfi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
urj_flash_cleanup ( ) ;
# ifdef JEDEC_EXP
if ( urj_flash_jedec_exp_detect
( bus , adr , & urj_flash_cfi_array ) )
if ( urj_flash_jedec_exp_detect ( bus , adr , & urj_flash_cfi_array )
! = URJ_STATUS_OK )
{
urj_flash_cfi_array_free ( urj_flash_cfi_array ) ;
urj_flash_cfi_array = NULL ;
urj_flash_cleanup ( ) ;
}
# endif
}
@ -87,8 +94,8 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
if ( urj_flash_cfi_array = = NULL )
{
printf ( _ ( " Flash not found! \n " ) ) ;
return ;
urj_error_set ( URJ_ERROR_NOTFOUND , _ ( " Flash not found! " ) ) ;
return URJ_STATUS_FAIL ;
}
cfi = & urj_flash_cfi_array - > cfi_chips [ 0 ] - > cfi ;
@ -96,7 +103,7 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
/* detect CFI capable devices */
/* TODO: Low chip only */
/* see 4.3.2 in [1] */
printf ( _ ( " Query identification string: \n " ) ) ;
urj_log ( ll , _ ( " Query identification string: \n " ) ) ;
/* see section 2 in [2] */
switch ( cfi - > identification_string . pri_id_code )
{
@ -128,9 +135,8 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
s = N_ ( " unknown!!! " ) ;
break ;
}
printf ( _
( " \t Primary Algorithm Command Set and Control Interface ID Code: 0x%04X (%s) \n " ) ,
cfi - > identification_string . pri_id_code , _ ( s ) ) ;
urj_log ( ll , _ ( " \t Primary Algorithm Command Set and Control Interface ID Code: 0x%04X (%s) \n " ) ,
cfi - > identification_string . pri_id_code , _ ( s ) ) ;
switch ( cfi - > identification_string . alt_id_code )
{
case CFI_VENDOR_NULL :
@ -161,48 +167,42 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
s = N_ ( " unknown!!! " ) ;
break ;
}
printf ( _
( " \t Alternate Algorithm Command Set and Control Interface ID Code: 0x%04X (%s) \n " ) ,
cfi - > identification_string . alt_id_code , _ ( s ) ) ;
urj_log ( ll , _ ( " \t Alternate Algorithm Command Set and Control Interface ID Code: 0x%04X (%s) \n " ) ,
cfi - > identification_string . alt_id_code , _ ( s ) ) ;
/* see 4.3.3 in [1] */
printf ( _ ( " Query system interface information: \n " ) ) ;
printf ( _
( " \t Vcc Logic Supply Minimum Write/Erase or Write voltage: %d mV \n " ) ,
cfi - > system_interface_info . vcc_min_wev ) ;
printf ( _
( " \t Vcc Logic Supply Maximum Write/Erase or Write voltage: %d mV \n " ) ,
cfi - > system_interface_info . vcc_max_wev ) ;
printf ( _
( " \t Vpp [Programming] Supply Minimum Write/Erase voltage: %d mV \n " ) ,
cfi - > system_interface_info . vpp_min_wev ) ;
printf ( _
( " \t Vpp [Programming] Supply Maximum Write/Erase voltage: %d mV \n " ) ,
cfi - > system_interface_info . vpp_max_wev ) ;
printf ( _ ( " \t Typical timeout per single byte/word program: %d us \n " ) ,
cfi - > system_interface_info . typ_single_write_timeout ) ;
printf ( _
( " \t Typical timeout for maximum-size multi-byte program: %d us \n " ) ,
cfi - > system_interface_info . typ_buffer_write_timeout ) ;
printf ( _ ( " \t Typical timeout per individual block erase: %d ms \n " ) ,
cfi - > system_interface_info . typ_block_erase_timeout ) ;
printf ( _ ( " \t Typical timeout for full chip erase: %d ms \n " ) ,
cfi - > system_interface_info . typ_chip_erase_timeout ) ;
printf ( _ ( " \t Maximum timeout for byte/word program: %d us \n " ) ,
cfi - > system_interface_info . max_single_write_timeout ) ;
printf ( _ ( " \t Maximum timeout for multi-byte program: %d us \n " ) ,
cfi - > system_interface_info . max_buffer_write_timeout ) ;
printf ( _ ( " \t Maximum timeout per individual block erase: %d ms \n " ) ,
cfi - > system_interface_info . max_block_erase_timeout ) ;
printf ( _ ( " \t Maximum timeout for chip erase: %d ms \n " ) ,
cfi - > system_interface_info . max_chip_erase_timeout ) ;
urj_log ( ll , _ ( " Query system interface information: \n " ) ) ;
urj_log ( ll , _ ( " \t Vcc Logic Supply Minimum Write/Erase or Write voltage: %d mV \n " ) ,
cfi - > system_interface_info . vcc_min_wev ) ;
urj_log ( ll , _ ( " \t Vcc Logic Supply Maximum Write/Erase or Write voltage: %d mV \n " ) ,
cfi - > system_interface_info . vcc_max_wev ) ;
urj_log ( ll , _ ( " \t Vpp [Programming] Supply Minimum Write/Erase voltage: %d mV \n " ) ,
cfi - > system_interface_info . vpp_min_wev ) ;
urj_log ( ll , _ ( " \t Vpp [Programming] Supply Maximum Write/Erase voltage: %d mV \n " ) ,
cfi - > system_interface_info . vpp_max_wev ) ;
urj_log ( ll , _ ( " \t Typical timeout per single byte/word program: %d us \n " ) ,
cfi - > system_interface_info . typ_single_write_timeout ) ;
urj_log ( ll , _ ( " \t Typical timeout for maximum-size multi-byte program: %d us \n " ) ,
cfi - > system_interface_info . typ_buffer_write_timeout ) ;
urj_log ( ll , _ ( " \t Typical timeout per individual block erase: %d ms \n " ) ,
cfi - > system_interface_info . typ_block_erase_timeout ) ;
urj_log ( ll , _ ( " \t Typical timeout for full chip erase: %d ms \n " ) ,
cfi - > system_interface_info . typ_chip_erase_timeout ) ;
urj_log ( ll , _ ( " \t Maximum timeout for byte/word program: %d us \n " ) ,
cfi - > system_interface_info . max_single_write_timeout ) ;
urj_log ( ll , _ ( " \t Maximum timeout for multi-byte program: %d us \n " ) ,
cfi - > system_interface_info . max_buffer_write_timeout ) ;
urj_log ( ll , _ ( " \t Maximum timeout per individual block erase: %d ms \n " ) ,
cfi - > system_interface_info . max_block_erase_timeout ) ;
urj_log ( ll , _ ( " \t Maximum timeout for chip erase: %d ms \n " ) ,
cfi - > system_interface_info . max_chip_erase_timeout ) ;
/* see 4.3.4 in [1] */
printf ( _ ( " Device geometry definition: \n " ) ) ;
printf ( _ ( " \t Device Size: %d B (%d KiB, %d MiB) \n " ) ,
cfi - > device_geometry . device_size ,
cfi - > device_geometry . device_size / 1024 ,
cfi - > device_geometry . device_size / ( 1024 * 1024 ) ) ;
urj_log ( ll , _ ( " Device geometry definition: \n " ) ) ;
urj_log ( ll , _ ( " \t Device Size: %d B (%d KiB, %d MiB) \n " ) ,
cfi - > device_geometry . device_size ,
cfi - > device_geometry . device_size / 1024 ,
cfi - > device_geometry . device_size / ( 1024 * 1024 ) ) ;
/* see section 4 in [2] */
switch ( cfi - > device_geometry . device_interface )
{
@ -225,27 +225,27 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
s = N_ ( " unknown!!! " ) ;
break ;
}
printf ( _ ( " \t Flash Device Interface Code description: 0x%04X (%s) \n " ) ,
cfi - > device_geometry . device_interface , _ ( s ) ) ;
printf ( _ ( " \t Maximum number of bytes in multi-byte program: %d \n " ) ,
cfi - > device_geometry . max_bytes_write ) ;
printf ( _ ( " \t Number of Erase Block Regions within device: %d \n " ) ,
cfi - > device_geometry . number_of_erase_regions ) ;
printf ( _ ( " \t Erase Block Region Information: \n " ) ) ;
urj_log ( ll , _ ( " \t Flash Device Interface Code description: 0x%04X (%s) \n " ) ,
cfi - > device_geometry . device_interface , _ ( s ) ) ;
urj_log ( ll , _ ( " \t Maximum number of bytes in multi-byte program: %d \n " ) ,
cfi - > device_geometry . max_bytes_write ) ;
urj_log ( ll , _ ( " \t Number of Erase Block Regions within device: %d \n " ) ,
cfi - > device_geometry . number_of_erase_regions ) ;
urj_log ( ll , _ ( " \t Erase Block Region Information: \n " ) ) ;
{
int i ;
for ( i = 0 ; i < cfi - > device_geometry . number_of_erase_regions ; i + + )
{
printf ( _ ( " \t \t Region %d: \n " ) , i ) ;
printf ( _ ( " \t \t \t Erase Block Size: %d B (%d KiB) \n " ) ,
cfi - > device_geometry . erase_block_regions [ i ] .
erase_block_size ,
cfi - > device_geometry . erase_block_regions [ i ] .
erase_block_size / 1024 ) ;
printf ( _ ( " \t \t \t Number of Erase Blocks: %d \n " ) ,
cfi - > device_geometry . erase_block_regions [ i ] .
number_of_erase_blocks ) ;
urj_log ( ll , _ ( " \t \t Region %d: \n " ) , i ) ;
urj_log ( ll , _ ( " \t \t \t Erase Block Size: %d B (%d KiB) \n " ) ,
cfi - > device_geometry . erase_block_regions [ i ] .
erase_block_size ,
cfi - > device_geometry . erase_block_regions [ i ] .
erase_block_size / 1024 ) ;
urj_log ( ll , _ ( " \t \t \t Number of Erase Blocks: %d \n " ) ,
cfi - > device_geometry . erase_block_regions [ i ] .
number_of_erase_blocks ) ;
}
}
@ -303,137 +303,142 @@ urj_flash_detectflash (urj_bus_t *bus, uint32_t adr)
major_version = pri_vendor_tbl - > major_version ;
minor_version = pri_vendor_tbl - > minor_version ;
printf ( _ ( " Primary Vendor-Specific Extended Query: \n " ) ) ;
printf ( _ ( " \t Major version number: %c \n " ) ,
pri_vendor_tbl - > major_version ) ;
printf ( _ ( " \t Minor version number: %c \n " ) ,
pri_vendor_tbl - > minor_version ) ;
urj_log ( ll , _ ( " Primary Vendor-Specific Extended Query: \n " ) ) ;
urj_log ( ll , _ ( " \t Major version number: %c \n " ) ,
pri_vendor_tbl - > major_version ) ;
urj_log ( ll , _ ( " \t Minor version number: %c \n " ) ,
pri_vendor_tbl - > minor_version ) ;
if ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 0 ' ) )
{
if ( ( pri_vendor_tbl - > address_sensitive_unlock & 0x3 ) <
ARRAY_SIZE ( required_or_not ) )
printf ( _ ( " \t Address Sensitive Unlock: %s \n " ) ,
required_or_not [ pri_vendor_tbl - >
address_sensitive_unlock & 0x3 ] ) ;
urj_log ( ll , _ ( " \t Address Sensitive Unlock: %s \n " ) ,
required_or_not [ pri_vendor_tbl - >
address_sensitive_unlock & 0x3 ] ) ;
else
printf ( _ ( " \t Address Sensitive Unlock: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Address Sensitive Unlock: %s \n " ) , bad_value ) ;
if ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 4 ' ) )
{
if ( ( pri_vendor_tbl - > address_sensitive_unlock > > 2 ) <
ARRAY_SIZE ( process_technology ) )
printf ( _ ( " \t Process Technology: %s \n " ) ,
process_technology [ pri_vendor_tbl - >
address_sensitive_unlock > >
2 ] ) ;
urj_log ( ll , _ ( " \t Process Technology: %s \n " ) ,
process_technology [ pri_vendor_tbl - >
address_sensitive_unlock > >
2 ] ) ;
else
printf ( _ ( " \t Process Technology: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Process Technology: %s \n " ) , bad_value ) ;
}
else if ( major_version = = ' 1 ' & & minor_version = = ' 3 ' )
{
if ( ( pri_vendor_tbl - > address_sensitive_unlock > > 2 ) <
ARRAY_SIZE ( process_technology_13 ) )
printf ( _ ( " \t Process Technology: %s \n " ) ,
process_technology_13 [ pri_vendor_tbl - >
address_sensitive_unlock > >
2 ] ) ;
urj_log ( ll , _ ( " \t Process Technology: %s \n " ) ,
process_technology_13 [ pri_vendor_tbl - >
address_sensitive_unlock > >
2 ] ) ;
else
printf ( _ ( " \t Process Technology: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Process Technology: %s \n " ) , bad_value ) ;
}
if ( pri_vendor_tbl - > erase_suspend < ARRAY_SIZE ( erase_suspend ) )
printf ( _ ( " \t Erase Suspend: %s \n " ) ,
erase_suspend [ pri_vendor_tbl - > erase_suspend ] ) ;
urj_log ( ll , _ ( " \t Erase Suspend: %s \n " ) ,
erase_suspend [ pri_vendor_tbl - > erase_suspend ] ) ;
if ( pri_vendor_tbl - > sector_protect = = 0 )
printf ( _ ( " \t Sector Protect: Not supported \n " ) ) ;
urj_log ( ll , _ ( " \t Sector Protect: Not supported \n " ) ) ;
else
printf ( _ ( " \t Sector Protect: %d sectors per group \n " ) ,
pri_vendor_tbl - > sector_protect ) ;
urj_log ( ll , _ ( " \t Sector Protect: %d sectors per group \n " ) ,
pri_vendor_tbl - > sector_protect ) ;
if ( pri_vendor_tbl - > sector_temporary_unprotect <
ARRAY_SIZE ( supported_or_not ) )
printf ( _ ( " \t Sector Temporary Unprotect: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - >
sector_temporary_unprotect ] ) ;
urj_log ( ll , _ ( " \t Sector Temporary Unprotect: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - >
sector_temporary_unprotect ] ) ;
else
printf ( _ ( " \t Sector Temporary Unprotect: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Sector Temporary Unprotect: %s \n " ) ,
bad_value ) ;
if ( pri_vendor_tbl - > sector_protect_scheme <
ARRAY_SIZE ( sector_protect_scheme ) )
printf ( _ ( " \t Sector Protect/Unprotect Scheme: %s \n " ) ,
sector_protect_scheme [ pri_vendor_tbl - >
sector_protect_scheme ] ) ;
urj_log ( ll , _ ( " \t Sector Protect/Unprotect Scheme: %s \n " ) ,
sector_protect_scheme [ pri_vendor_tbl - >
sector_protect_scheme ] ) ;
else
printf ( _ ( " \t Sector Protect/Unprotect Scheme: %s \n " ) ,
bad_value ) ;
urj_log ( ll , _ ( " \t Sector Protect/Unprotect Scheme: %s \n " ) ,
bad_value ) ;
if ( pri_vendor_tbl - > simultaneous_operation = = 0 )
printf ( _ ( " \t Simultaneous Operation: Not supported \n " ) ) ;
urj_log ( ll , _ ( " \t Simultaneous Operation: Not supported \n " ) ) ;
else
printf ( _ ( " \t Simultaneous Operation: %d sectors \n " ) ,
pri_vendor_tbl - > simultaneous_operation ) ;
urj_log ( ll , _ ( " \t Simultaneous Operation: %d sectors \n " ) ,
pri_vendor_tbl - > simultaneous_operation ) ;
if ( pri_vendor_tbl - > burst_mode_type <
ARRAY_SIZE ( supported_or_not ) )
printf ( _ ( " \t Burst Mode Type: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > burst_mode_type ] ) ;
urj_log ( ll , _ ( " \t Burst Mode Type: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > burst_mode_type ] ) ;
else
printf ( _ ( " \t Burst Mode Type: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Burst Mode Type: %s \n " ) ,
bad_value ) ;
if ( pri_vendor_tbl - > page_mode_type < ARRAY_SIZE ( page_mode_type ) )
printf ( _ ( " \t Page Mode Type: %s \n " ) ,
page_mode_type [ pri_vendor_tbl - > page_mode_type ] ) ;
urj_log ( ll , _ ( " \t Page Mode Type: %s \n " ) ,
page_mode_type [ pri_vendor_tbl - > page_mode_type ] ) ;
else
printf ( _ ( " \t Page Mode Type: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Page Mode Type: %s \n " ) ,
bad_value ) ;
}
if ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 1 ' ) )
{
printf ( _ ( " \t ACC (Acceleration) Supply Minimum: %d mV \n " ) ,
pri_vendor_tbl - > acc_min ) ;
printf ( _ ( " \t ACC (Acceleration) Supply Maximum: %d mV \n " ) ,
pri_vendor_tbl - > acc_max ) ;
urj_log ( ll , _ ( " \t ACC (Acceleration) Supply Minimum: %d mV \n " ) ,
pri_vendor_tbl - > acc_min ) ;
urj_log ( ll , _ ( " \t ACC (Acceleration) Supply Maximum: %d mV \n " ) ,
pri_vendor_tbl - > acc_max ) ;
if ( pri_vendor_tbl - > top_bottom_sector_flag <
ARRAY_SIZE ( top_bottom ) )
printf ( _ ( " \t Top/Bottom Sector Flag: %s \n " ) ,
top_bottom [ pri_vendor_tbl - > top_bottom_sector_flag ] ) ;
urj_log ( ll , _ ( " \t Top/Bottom Sector Flag: %s \n " ) ,
top_bottom [ pri_vendor_tbl - > top_bottom_sector_flag ] ) ;
else
printf ( _ ( " \t Top/Bottom Sector Flag: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Top/Bottom Sector Flag: %s \n " ) , bad_value ) ;
}
if ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 2 ' ) )
{
if ( pri_vendor_tbl - > program_suspend <
ARRAY_SIZE ( supported_or_not ) )
printf ( _ ( " \t Program Suspend: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > program_suspend ] ) ;
urj_log ( ll , _ ( " \t Program Suspend: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > program_suspend ] ) ;
else
printf ( _ ( " \t Program Suspend: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t Program Suspend: %s \n " ) ,
bad_value ) ;
}
if ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 4 ' ) )
{
if ( pri_vendor_tbl - > unlock_bypass < ARRAY_SIZE ( supported_or_not ) )
printf ( _ ( " \t Unlock Bypass: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > unlock_bypass ] ) ;
urj_log ( ll , _ ( " \t Unlock Bypass: %s \n " ) ,
supported_or_not [ pri_vendor_tbl - > unlock_bypass ] ) ;
else
printf ( _ ( " \t Unlock Bypass: %s \n " ) , bad_value ) ;
printf ( _ ( " \t SecSi Sector (Customer OTP Area) Size: %d bytes \n " ) ,
pri_vendor_tbl - > secsi_sector_size ) ;
printf ( _ ( " \t Embedded Hardware Reset Timeout Maximum: %d ns \n " ) ,
pri_vendor_tbl - > embedded_hwrst_timeout_max ) ;
printf ( _
( " \t Non-Embedded Hardware Reset Timeout Maximum: %d ns \n " ) ,
pri_vendor_tbl - > non_embedded_hwrst_timeout_max ) ;
printf ( _ ( " \t Erase Suspend Timeout Maximum: %d us \n " ) ,
pri_vendor_tbl - > erase_suspend_timeout_max ) ;
printf ( _ ( " \t Program Suspend Timeout Maximum: %d us \n " ) ,
pri_vendor_tbl - > program_suspend_timeout_max ) ;
urj_log ( ll , _ ( " \t Unlock Bypass: %s \n " ) , bad_value ) ;
urj_log ( ll , _ ( " \t SecSi Sector (Customer OTP Area) Size: %d bytes \n " ) ,
pri_vendor_tbl - > secsi_sector_size ) ;
urj_log ( ll , _ ( " \t Embedded Hardware Reset Timeout Maximum: %d ns \n " ) ,
pri_vendor_tbl - > embedded_hwrst_timeout_max ) ;
urj_log ( ll , _ ( " \t Non-Embedded Hardware Reset Timeout Maximum: %d ns \n " ) ,
pri_vendor_tbl - > non_embedded_hwrst_timeout_max ) ;
urj_log ( ll , _ ( " \t Erase Suspend Timeout Maximum: %d us \n " ) ,
pri_vendor_tbl - > erase_suspend_timeout_max ) ;
urj_log ( ll , _ ( " \t Program Suspend Timeout Maximum: %d us \n " ) ,
pri_vendor_tbl - > program_suspend_timeout_max ) ;
}
if ( ( major_version > ' 1 '
| | ( major_version = = ' 1 ' & & minor_version > = ' 3 ' ) )
& & pri_vendor_tbl - > bank_organization )
{
printf ( _ ( " \t Bank Organization: \n " ) ) ;
urj_log ( ll , _ ( " \t Bank Organization: \n " ) ) ;
for ( i = 0 ; i < pri_vendor_tbl - > bank_organization ; i + + )
printf ( _ ( " \t \t Bank%d: %d sectors \n " ) , i + 1 ,
pri_vendor_tbl - > bank_region_info [ i ] ) ;
urj_log ( ll , _ ( " \t \t Bank%d: %d sectors \n " ) ,
i + 1 , pri_vendor_tbl - > bank_region_info [ i ] ) ;
}
}
return URJ_STATUS_OK ;
}