summaryrefslogtreecommitdiffstats
path: root/src/usr/pnor/sfc_ast2400.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/pnor/sfc_ast2400.C')
-rw-r--r--src/usr/pnor/sfc_ast2400.C27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/usr/pnor/sfc_ast2400.C b/src/usr/pnor/sfc_ast2400.C
index 197cd6b1a..5384e7b62 100644
--- a/src/usr/pnor/sfc_ast2400.C
+++ b/src/usr/pnor/sfc_ast2400.C
@@ -135,19 +135,38 @@ errlHndl_t SfcAST2400::writeFlash( uint32_t i_addr,
{
TRACDCOMP( g_trac_pnor, ENTER_MRK"SfcAST2400::writeFlash> i_addr=0x%.8x, i_size=0x%.8x", i_addr, i_size );
errlHndl_t l_err = NULL;
+ size_t l_bytes_left = i_size;
+ size_t l_bytes_to_write = 0;
+ uint32_t l_addr_to_write = i_addr;
do {
// Enable write mode
l_err = enableWriteMode();
if( l_err ) { break; }
+ // Page Program (PP) command only supports 256 bytes at a time
+ if( l_bytes_left <= PNOR::PAGE_PROGRAM_BYTES )
+ {
+ l_bytes_to_write = l_bytes_left;
+ l_bytes_left = 0;
+ }
+ else
+ {
+ l_bytes_to_write = PNOR::PAGE_PROGRAM_BYTES;
+ l_bytes_left -= PNOR::PAGE_PROGRAM_BYTES;
+ }
+
// Send in the Page Program command with the data to write
uint8_t opcode = PNOR::SPI_JEDEC_PAGE_PROGRAM;
- l_err = sendSpiCmd( opcode, i_addr,
- i_size, reinterpret_cast<uint8_t*>(i_data),
+ l_err = sendSpiCmd( opcode, l_addr_to_write,
+ l_bytes_to_write,
+ reinterpret_cast<uint8_t*>(i_data),
0, NULL );
if( l_err ) { break; }
+ // Move to the next chunk
+ l_addr_to_write += l_bytes_to_write;
+
// Wait for idle
l_err = pollOpComplete();
if( l_err ) { break; }
@@ -161,7 +180,7 @@ errlHndl_t SfcAST2400::writeFlash( uint32_t i_addr,
}
#endif
- } while(0);
+ } while(l_bytes_left);
TRACDCOMP( g_trac_pnor, EXIT_MRK"SfcAST2400::writeFlash> err=%.8X", ERRL_GETEID_SAFE(l_err) );
return l_err;
@@ -173,7 +192,7 @@ errlHndl_t SfcAST2400::writeFlash( uint32_t i_addr,
*/
errlHndl_t SfcAST2400::eraseFlash( uint32_t i_addr )
{
- TRACFCOMP(g_trac_pnor, ">>SfcAST2400::eraseFlash> Block 0x%.8X", i_addr );
+ TRACDCOMP(g_trac_pnor, ">>SfcAST2400::eraseFlash> Block 0x%.8X", i_addr );
errlHndl_t l_err = NULL;
do {
OpenPOWER on IntegriCloud