Signed-off-by: Paul Kocialkowski <cont...@paulk.fr>
---
 drivers/block/sunxi_nand/src/format/nand_format.c  |   16 ++---
 .../block/sunxi_nand/src/include/nand_drv_cfg.h    |    4 +-
 drivers/block/sunxi_nand/src/include/nand_logic.h  |    4 +-
 drivers/block/sunxi_nand/src/include/nand_physic.h |    4 +-
 drivers/block/sunxi_nand/src/include/nand_simple.h |    8 +--
 drivers/block/sunxi_nand/src/include/nand_type.h   |   70 ++++++++++----------
 drivers/block/sunxi_nand/src/logic/logic_cache.c   |   56 +++++++++-------
 drivers/block/sunxi_nand/src/logic/logic_ctl.c     |   50 ++++++++------
 drivers/block/sunxi_nand/src/logic/mapping.c       |    4 +-
 drivers/block/sunxi_nand/src/physic/nand_phy.c     |   16 ++---
 .../block/sunxi_nand/src/physic/nand_simple_r.c    |    2 +-
 .../block/sunxi_nand/src/physic/nand_simple_w.c    |    6 +-
 12 files changed, 127 insertions(+), 113 deletions(-)

diff --git a/drivers/block/sunxi_nand/src/format/nand_format.c 
b/drivers/block/sunxi_nand/src/format/nand_format.c
index fe485b5..1c6db8e 100644
--- a/drivers/block/sunxi_nand/src/format/nand_format.c
+++ b/drivers/block/sunxi_nand/src/format/nand_format.c
@@ -220,7 +220,7 @@ __s32 _CalculatePhyOpPar(struct __PhysicOpPara_t *pPhyPar, 
__u32 nZone, __u32 nB
 *               < 0     read page data failed.
 
************************************************************************************************************************
 */
-static __s32 _VirtualPageRead(__u32 nDieNum, __u32 nBlkNum, __u32 nPage, __u32 
SectBitmap, void *pBuf, void *pSpare)
+static __s32 _VirtualPageRead(__u32 nDieNum, __u32 nBlkNum, __u32 nPage, __u64 
SectBitmap, void *pBuf, void *pSpare)
 {
     __s32 i, result;
     __u8  *tmpSrcData, *tmpDstData, *tmpSrcPtr[4], *tmpDstPtr[4];
@@ -239,7 +239,7 @@ static __s32 _VirtualPageRead(__u32 nDieNum, __u32 nBlkNum, 
__u32 nPage, __u32 S
         //process the pointer to spare area data
         for(i=0; i<2; i++)
         {
-            if(SectBitmap & (1<<i))
+            if(SectBitmap & ((__u64)1<<i))
             {
                 tmpSrcPtr[i] = FORMAT_SPARE_BUF + 4 * i;
                 tmpDstPtr[i] = (__u8 *)pSpare + 4 * i;
@@ -252,7 +252,7 @@ static __s32 _VirtualPageRead(__u32 nDieNum, __u32 nBlkNum, 
__u32 nPage, __u32 S
 
         for(i=0; i<2; i++)
         {
-            if(SectBitmap & (1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
+            if(SectBitmap & ((__u64)1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
             {
                 tmpSrcPtr[i+2] = LML_SPARE_BUF + 4 * (i + 
SECTOR_CNT_OF_SINGLE_PAGE);
                 tmpDstPtr[i+2] = (__u8 *)pSpare + 8 + 4 * i;
@@ -330,7 +330,7 @@ static __s32 _VirtualPageRead(__u32 nDieNum, __u32 nBlkNum, 
__u32 nPage, __u32 S
 *               < 0     write page data failed.
 
************************************************************************************************************************
 */
-static __s32 _VirtualPageWrite(__u32 nDieNum, __u32 nBlkNum, __u32 nPage, 
__u32 SectBitmap, void *pBuf, void *pSpare)
+static __s32 _VirtualPageWrite(__u32 nDieNum, __u32 nBlkNum, __u32 nPage, 
__u64 SectBitmap, void *pBuf, void *pSpare)
 {
     __s32 i, result;
     __u8  *tmpSrcData, *tmpDstData, *tmpSrcPtr[4], *tmpDstPtr[4];
@@ -350,7 +350,7 @@ static __s32 _VirtualPageWrite(__u32 nDieNum, __u32 
nBlkNum, __u32 nPage, __u32
         //process the pointer to spare area data
         for(i=0; i<2; i++)
         {
-            if(SectBitmap & (1<<i))
+            if(SectBitmap & ((__u64)1<<i))
             {
                 tmpSrcPtr[i] = (__u8 *)pSpare + 4 * i;
                 tmpDstPtr[i] = FORMAT_SPARE_BUF + 4 * i;
@@ -363,7 +363,7 @@ static __s32 _VirtualPageWrite(__u32 nDieNum, __u32 
nBlkNum, __u32 nPage, __u32
 
         for(i=0; i<2; i++)
         {
-            if(SectBitmap & (1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
+            if(SectBitmap & ((__u64)1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
             {
                 tmpSrcPtr[i+2] = (__u8 *)pSpare + 8 + 4 * i;
                 tmpDstPtr[i+2] = LML_SPARE_BUF + 4 * (i + 
SECTOR_CNT_OF_SINGLE_PAGE);
@@ -923,7 +923,7 @@ static __s32 _GetBlkLogicInfo(struct __ScanDieInfo_t 
*pDieInfo)
     __s32   i;
     __s16   tmpPageNum[4];
     __u16   tmpLogicInfo;
-    __u32   spare_bitmap;
+    __u64   spare_bitmap;
     struct  __NandUserData_t tmpSpare[2];
 
 
@@ -980,7 +980,7 @@ static __s32 _GetBlkLogicInfo(struct __ScanDieInfo_t 
*pDieInfo)
                 //calculate the number of the page in the super block to get 
spare data
                 tmpPage = tmpPageNum[i] * INTERLEAVE_BANK_CNT + tmpBnkNum;
                 //_VirtualPageRead(pDieInfo->nDie, tmpBlkNum, tmpPage, 
LOGIC_INFO_BITMAP, FORMAT_PAGE_BUF, (void *)&tmpSpare);
-                spare_bitmap = (SUPPORT_MULTI_PROGRAM ? (0x3 | (0x3 << 
SECTOR_CNT_OF_SINGLE_PAGE)) : 0x3);
+                spare_bitmap = (SUPPORT_MULTI_PROGRAM ? ((__u64)0x3 | 
((__u64)0x3 << SECTOR_CNT_OF_SINGLE_PAGE)) : (__u64)0x3);
                 _VirtualPageRead(pDieInfo->nDie, tmpBlkNum, tmpPage, 
spare_bitmap, FORMAT_PAGE_BUF, (void *)&tmpSpare);
 
                                //check if the block is a bad block
diff --git a/drivers/block/sunxi_nand/src/include/nand_drv_cfg.h 
b/drivers/block/sunxi_nand/src/include/nand_drv_cfg.h
index dff1d77..d331409 100644
--- a/drivers/block/sunxi_nand/src/include/nand_drv_cfg.h
+++ b/drivers/block/sunxi_nand/src/include/nand_drv_cfg.h
@@ -46,10 +46,10 @@
 #define MAX_LOG_BLK_CNT                     (16)
 
 //define the value of the count of the block mapping table cache
-#define BLOCK_MAP_TBL_CACHE_CNT             (MAX_ZONE_CNT)
+#define BLOCK_MAP_TBL_CACHE_CNT             (4)
 
 //define the max value of the count of the page mapping table cache
-#define PAGE_MAP_TBL_CACHE_CNT              (MAX_LOG_BLK_CNT * MAX_ZONE_CNT)
+#define PAGE_MAP_TBL_CACHE_CNT              (4)
 
 //check if block mapping table cache is valid
 #if (BLOCK_MAP_TBL_CACHE_CNT < 1)
diff --git a/drivers/block/sunxi_nand/src/include/nand_logic.h 
b/drivers/block/sunxi_nand/src/include/nand_logic.h
index e5413ea..abb1c57 100644
--- a/drivers/block/sunxi_nand/src/include/nand_logic.h
+++ b/drivers/block/sunxi_nand/src/include/nand_logic.h
@@ -232,7 +232,7 @@ __s32 LML_FlushPageCache(void);
 *               < 0     read failed.
 
************************************************************************************************************************
 */
-__s32 LML_PageRead(__u32 nPage, __u32 nBitmap, void* pBuf);
+__s32 LML_PageRead(__u32 nPage, __u64 nBitmap, void* pBuf);
 
 
 /*
@@ -251,7 +251,7 @@ __s32 LML_PageRead(__u32 nPage, __u32 nBitmap, void* pBuf);
 *               < 0     write failed.
 
************************************************************************************************************************
 */
-__s32 LML_PageWrite(__u32 nPage, __u32 nBitmap, void* pBuf);
+__s32 LML_PageWrite(__u32 nPage, __u64 nBitmap, void* pBuf);
 
 
 /*
diff --git a/drivers/block/sunxi_nand/src/include/nand_physic.h 
b/drivers/block/sunxi_nand/src/include/nand_physic.h
index 08dbdf3..58fa9ad 100644
--- a/drivers/block/sunxi_nand/src/include/nand_physic.h
+++ b/drivers/block/sunxi_nand/src/include/nand_physic.h
@@ -49,10 +49,10 @@ extern struct __NandPageCachePool_t PageCachePool;
 #define SECTOR_CNT_OF_SUPER_PAGE            (NandStorageInfo.SectorCntPerPage 
* NandStorageInfo.PlaneCntPerDie)
 
 //define the sector bitmap for a single page
-#define FULL_BITMAP_OF_SINGLE_PAGE          
((__u32)((1<<SECTOR_CNT_OF_SINGLE_PAGE) - 1))
+#define FULL_BITMAP_OF_SINGLE_PAGE          
((__u64)(((__u64)1<<(SECTOR_CNT_OF_SINGLE_PAGE - 1)) | 
(((__u64)1<<(SECTOR_CNT_OF_SINGLE_PAGE - 1)) - 1)))
 
 //define the sector bitmap for a super page, the sector count of a super page 
may be equal to 32
-#define FULL_BITMAP_OF_SUPER_PAGE           
((__u32)((1<<(SECTOR_CNT_OF_SUPER_PAGE - 1)) | ((1<<(SECTOR_CNT_OF_SUPER_PAGE - 
1)) - 1)))
+#define FULL_BITMAP_OF_SUPER_PAGE           
((__u64)(((__u64)1<<(SECTOR_CNT_OF_SUPER_PAGE - 1)) | 
(((__u64)1<<(SECTOR_CNT_OF_SUPER_PAGE - 1)) - 1)))
 
 //define the block number offset for the multi-plane operation
 #define MULTI_PLANE_BLOCK_OFFSET            
(NandStorageInfo.OptPhyOpPar.MultiPlaneBlockOffset)
diff --git a/drivers/block/sunxi_nand/src/include/nand_simple.h 
b/drivers/block/sunxi_nand/src/include/nand_simple.h
index 9adcd33..4804fa0 100644
--- a/drivers/block/sunxi_nand/src/include/nand_simple.h
+++ b/drivers/block/sunxi_nand/src/include/nand_simple.h
@@ -30,10 +30,10 @@
 #define BADBLOCK -2
 
 struct boot_physical_param{
-       __u8   chip; //chip no
-       __u16  block; // block no within chip
-       __u16  page; // apge no within block
-       __u16  sectorbitmap; //done't care
+       __u32   chip; //chip no
+       __u32  block; // block no within chip
+       __u32  page; // apge no within block
+       __u64  sectorbitmap; //done't care
        void   *mainbuf; //data buf
        void   *oobbuf; //oob buf
 };
diff --git a/drivers/block/sunxi_nand/src/include/nand_type.h 
b/drivers/block/sunxi_nand/src/include/nand_type.h
index 0c0fd24..4c851e4 100644
--- a/drivers/block/sunxi_nand/src/include/nand_type.h
+++ b/drivers/block/sunxi_nand/src/include/nand_type.h
@@ -45,26 +45,26 @@ struct __OptionalPhyOpPar_t
 
 typedef struct
 {
-    __u8        ChipCnt;                            //the count of the total 
nand flash chips are currently connecting on the CE pin
-    __u16       ChipConnectInfo;                    //chip connect 
information, bit == 1 means there is a chip connecting on the CE pin
-       __u8            RbCnt;
-       __u8            RbConnectInfo;                                          
//the connect  information of the all rb  chips are connected
-    __u8        RbConnectMode;                                         //the 
rb connect  mode
-       __u8        BankCntPerChip;                     //the count of the 
banks in one nand chip, multiple banks can support Inter-Leave
-    __u8        DieCntPerChip;                      //the count of the dies in 
one nand chip, block management is based on Die
-    __u8        PlaneCntPerDie;                     //the count of planes in 
one die, multiple planes can support multi-plane operation
-    __u8        SectorCntPerPage;                   //the count of sectors in 
one single physic page, one sector is 0.5k
-    __u16       PageCntPerPhyBlk;                   //the count of physic 
pages in one physic block
-    __u16       BlkCntPerDie;                       //the count of the physic 
blocks in one die, include valid block and invalid block
-    __u16       OperationOpt;                       //the mask of the 
operation types which current nand flash can support support
-    __u8        FrequencePar;                       //the parameter of the 
hardware access clock, based on 'MHz'
-    __u8        EccMode;                            //the Ecc Mode for the 
nand flash chip, 0: bch-16, 1:bch-28, 2:bch_32
+    __u32        ChipCnt;                            //the count of the total 
nand flash chips are currently connecting on the CE pin
+    __u32       ChipConnectInfo;                    //chip connect 
information, bit == 1 means there is a chip connecting on the CE pin
+       __u32           RbCnt;
+       __u32           RbConnectInfo;                                          
//the connect  information of the all rb  chips are connected
+    __u32        RbConnectMode;                                                
//the rb connect  mode
+       __u32        BankCntPerChip;                     //the count of the 
banks in one nand chip, multiple banks can support Inter-Leave
+    __u32        DieCntPerChip;                      //the count of the dies 
in one nand chip, block management is based on Die
+    __u32        PlaneCntPerDie;                     //the count of planes in 
one die, multiple planes can support multi-plane operation
+    __u32        SectorCntPerPage;                   //the count of sectors in 
one single physic page, one sector is 0.5k
+    __u32       PageCntPerPhyBlk;                   //the count of physic 
pages in one physic block
+    __u32       BlkCntPerDie;                       //the count of the physic 
blocks in one die, include valid block and invalid block
+    __u32       OperationOpt;                       //the mask of the 
operation types which current nand flash can support support
+    __u32        FrequencePar;                       //the parameter of the 
hardware access clock, based on 'MHz'
+    __u32        EccMode;                            //the Ecc Mode for the 
nand flash chip, 0: bch-16, 1:bch-28, 2:bch_32
     __u8        NandChipId[8];                      //the nand chip id of 
current connecting nand chip
-    __u16       ValidBlkRatio;                      //the ratio of the valid 
physical blocks, based on 1024
+    __u32       ValidBlkRatio;                      //the ratio of the valid 
physical blocks, based on 1024
        __u32           good_block_ratio;                                       
//good block ratio get from hwscan
        __u32           ReadRetryType;                                          
//the read retry type
        __u32       DDRType;
-       __u32           Reserved[32];
+       __u32           Reserved[23];
 }boot_nand_para_t;
 
 typedef struct boot_flash_info{
@@ -78,22 +78,22 @@ typedef struct boot_flash_info{
 //define the nand flash storage system information
 struct __NandStorageInfo_t
 {
-    __u8        ChipCnt;                            //the count of the total 
nand flash chips are currently connecting on the CE pin
-    __u16       ChipConnectInfo;                    //chip connect 
information, bit == 1 means there is a chip connecting on the CE pin
-       __u8            RbCnt;
-       __u8            RbConnectInfo;                                          
//the connect  information of the all rb  chips are connected
-    __u8        RbConnectMode;                                         //the 
rb connect  mode
-       __u8        BankCntPerChip;                     //the count of the 
banks in one nand chip, multiple banks can support Inter-Leave
-    __u8        DieCntPerChip;                      //the count of the dies in 
one nand chip, block management is based on Die
-    __u8        PlaneCntPerDie;                     //the count of planes in 
one die, multiple planes can support multi-plane operation
-    __u8        SectorCntPerPage;                   //the count of sectors in 
one single physic page, one sector is 0.5k
-    __u16       PageCntPerPhyBlk;                   //the count of physic 
pages in one physic block
-    __u16       BlkCntPerDie;                       //the count of the physic 
blocks in one die, include valid block and invalid block
-    __u16       OperationOpt;                       //the mask of the 
operation types which current nand flash can support support
-    __u8        FrequencePar;                       //the parameter of the 
hardware access clock, based on 'MHz'
-    __u8        EccMode;                            //the Ecc Mode for the 
nand flash chip, 0: bch-16, 1:bch-28, 2:bch_32
+    __u32        ChipCnt;                            //the count of the total 
nand flash chips are currently connecting on the CE pin
+    __u32       ChipConnectInfo;                    //chip connect 
information, bit == 1 means there is a chip connecting on the CE pin
+       __u32           RbCnt;
+       __u32           RbConnectInfo;                                          
//the connect  information of the all rb  chips are connected
+    __u32        RbConnectMode;                                                
//the rb connect  mode
+       __u32        BankCntPerChip;                     //the count of the 
banks in one nand chip, multiple banks can support Inter-Leave
+    __u32        DieCntPerChip;                      //the count of the dies 
in one nand chip, block management is based on Die
+    __u32        PlaneCntPerDie;                     //the count of planes in 
one die, multiple planes can support multi-plane operation
+    __u32        SectorCntPerPage;                   //the count of sectors in 
one single physic page, one sector is 0.5k
+    __u32       PageCntPerPhyBlk;                   //the count of physic 
pages in one physic block
+    __u32       BlkCntPerDie;                       //the count of the physic 
blocks in one die, include valid block and invalid block
+    __u32       OperationOpt;                       //the mask of the 
operation types which current nand flash can support support
+    __u32        FrequencePar;                       //the parameter of the 
hardware access clock, based on 'MHz'
+    __u32        EccMode;                            //the Ecc Mode for the 
nand flash chip, 0: bch-16, 1:bch-28, 2:bch_32
     __u8        NandChipId[8];                      //the nand chip id of 
current connecting nand chip
-    __u16       ValidBlkRatio;                         //the ratio of the 
valid physical blocks, based on 1024
+    __u32       ValidBlkRatio;                         //the ratio of the 
valid physical blocks, based on 1024
     __u32              ReadRetryType;                                          
//the read retry type
     __u32       DDRType;
     struct __OptionalPhyOpPar_t OptPhyOpPar;        //the parameters for some 
optional operation
@@ -130,7 +130,7 @@ struct __PhysicOpPara_t
     __u8        BankNum;                            //the number of the bank 
current accessed, bank NO. is different of chip NO.
     __u8        PageNum;                            //the number of the page 
current accessed, the page is based on single-plane or multi-plane
     __u16       BlkNum;                             //the number of the physic 
block, the block is based on single-plane or multi-plane
-    __u32       SectBitmap;                         //the bitmap of the sector 
in the page which need access data
+    __u64       SectBitmap;                         //the bitmap of the sector 
in the page which need access data
     void        *MDataPtr;                          //the pointer to main data 
buffer, it is the start address of a page size based buffer
     void        *SDataPtr;                          //the pointer to spare 
data buffer, it will be set to NULL if needn't access spare data
 };
@@ -228,14 +228,14 @@ struct __PageMapTblCachePool_t
 struct __GlobalLogicPageType_t
 {
     __u32       LogicPageNum;                       //the global page number 
of the logic page, it is based on super page size
-    __u32       SectorBitmap;                       //the bitmap of the sector 
in the logic page which data need access
+    __u64       SectorBitmap;                       //the bitmap of the sector 
in the logic page which data need access
 };
 
 
 //define the global logcial page based on zone and block parameter type
 struct __LogicPageType_t
 {
-    __u32       SectBitmap;                         //the bitmap marks which 
sectors' data in the logical page need access
+    __u64       SectBitmap;                         //the bitmap marks which 
sectors' data in the logical page need access
     __u16       BlockNum;                           //the value of the number 
of the logical block which the page is belonged to
     __u16       PageNum;                            //the value of the number 
of the page in the logical block
     __u8        ZoneNum;                            //the value of the number 
of the zone, which the page is belonged to
@@ -265,7 +265,7 @@ struct __NandPhyInfoPar_t
     __u8        SectCntPerPage;                     //the count of the sectors 
in one single physical page
     __u16       PageCntPerBlk;                      //the count of the pages 
in one single physical block
     __u16       BlkCntPerDie;                       //the count fo the 
physical blocks in one nand flash Die
-    __u16       OperationOpt;                       //the bitmap that marks 
which optional operation that the nand flash can support
+    __u32       OperationOpt;                       //the bitmap that marks 
which optional operation that the nand flash can support
     __u16       ValidBlkRatio;                      //the valid block ratio, 
based on 1024 blocks
     __u16       AccessFreq;                         //the highest access 
frequence of the nand flash chip, based on MHz
     __u16       EccMode;                            //the Ecc Mode for the 
nand flash chip, 0: bch-16, 1:bch-28, 2:bch_32
diff --git a/drivers/block/sunxi_nand/src/logic/logic_cache.c 
b/drivers/block/sunxi_nand/src/logic/logic_cache.c
index 7ca2a9c..c2ebe0c 100644
--- a/drivers/block/sunxi_nand/src/logic/logic_cache.c
+++ b/drivers/block/sunxi_nand/src/logic/logic_cache.c
@@ -35,23 +35,23 @@ typedef struct
        __u32   size;
 
        __u32   hit_page;
-       __u32   secbitmap;
+       __u64   secbitmap;
 
        __u32   access_count;
 }__nand_cache_t;
 
-__u32 g_w_access_cnt;
+__u32 g_w_access_cnt=0;
 
-__nand_cache_t nand_w_cache[N_NAND_W_CACHE];
-__nand_cache_t nand_r_cache;
+__nand_cache_t nand_w_cache[N_NAND_W_CACHE]={0};
+__nand_cache_t nand_r_cache={0};
 
-__u32 _get_valid_bits(__u32 secbitmap)
+__u32 _get_valid_bits(__u64 secbitmap)
 {
        __u32 validbit = 0;
 
        while(secbitmap)
        {
-               if(secbitmap & 0x1)
+               if(secbitmap & (__u64)0x1)
                        validbit++;
                secbitmap >>= 1;
        }
@@ -59,11 +59,11 @@ __u32 _get_valid_bits(__u32 secbitmap)
        return validbit;
 }
 
-__u32 _get_first_valid_bit(__u32 secbitmap)
+__u32 _get_first_valid_bit(__u64 secbitmap)
 {
        __u32 firstbit = 0;
 
-       while(!(secbitmap & 0x1))
+       while(!(secbitmap & (__u64)0x1))
        {
                secbitmap >>= 1;
                firstbit++;
@@ -84,9 +84,7 @@ __s32 _flush_w_cache(void)
                                
LML_PageRead(nand_w_cache[i].hit_page,(nand_w_cache[i].secbitmap ^ 
FULL_BITMAP_OF_LOGIC_PAGE)&FULL_BITMAP_OF_LOGIC_PAGE,nand_w_cache[i].data);
 
                        
LML_PageWrite(nand_w_cache[i].hit_page,FULL_BITMAP_OF_LOGIC_PAGE,nand_w_cache[i].data);
-                       nand_w_cache[i].hit_page = 0xffffffff;
-                       nand_w_cache[i].secbitmap = 0;
-                       nand_w_cache[i].access_count = 0;
+
 
                        /*disable read cache with current page*/
                        if (nand_r_cache.hit_page == nand_w_cache[i].hit_page){
@@ -94,6 +92,11 @@ __s32 _flush_w_cache(void)
                                        nand_r_cache.secbitmap = 0;
                        }
 
+
+                       nand_w_cache[i].hit_page = 0xffffffff;
+                       nand_w_cache[i].secbitmap = 0;
+                       nand_w_cache[i].access_count = 0;
+
                }
        }
 
@@ -110,9 +113,7 @@ __s32 _flush_w_cache_simple(__u32 i)
                        
LML_PageRead(nand_w_cache[i].hit_page,(nand_w_cache[i].secbitmap ^ 
FULL_BITMAP_OF_LOGIC_PAGE)&FULL_BITMAP_OF_LOGIC_PAGE,nand_w_cache[i].data);
 
                
LML_PageWrite(nand_w_cache[i].hit_page,FULL_BITMAP_OF_LOGIC_PAGE,nand_w_cache[i].data);
-               nand_w_cache[i].hit_page = 0xffffffff;
-               nand_w_cache[i].secbitmap = 0;
-               nand_w_cache[i].access_count = 0;
+
 
                /*disable read cache with current page*/
                if (nand_r_cache.hit_page == nand_w_cache[i].hit_page){
@@ -120,6 +121,10 @@ __s32 _flush_w_cache_simple(__u32 i)
                                nand_r_cache.secbitmap = 0;
                }
 
+               nand_w_cache[i].hit_page = 0xffffffff;
+               nand_w_cache[i].secbitmap = 0;
+               nand_w_cache[i].access_count = 0;
+
        }
 
        return 0;
@@ -141,12 +146,13 @@ void _get_data_from_cache(__u32 blk, __u32 nblk, void 
*buf)
 {
        __u32 i;
        __u32 sec;
-       __u32 page,SecBitmap,SecWithinPage;
+       __u32 page,SecWithinPage;
+       __u64 SecBitmap;
 
        for(sec = blk; sec < blk + nblk; sec++)
        {
                SecWithinPage = sec % SECTOR_CNT_OF_LOGIC_PAGE;
-               SecBitmap = (1 << SecWithinPage);
+               SecBitmap = ((__u64)1 << SecWithinPage);
                page = sec / SECTOR_CNT_OF_LOGIC_PAGE;
                for (i = 0; i < N_NAND_W_CACHE; i++)
                {
@@ -159,7 +165,7 @@ void _get_data_from_cache(__u32 blk, __u32 nblk, void *buf)
        }
 }
 
-void _get_one_page(__u32 page,__u32 SecBitmap,__u8 *data)
+void _get_one_page(__u32 page,__u64 SecBitmap,__u8 *data)
 {
        __u32 i;
        __u8 *tmp = data;
@@ -169,7 +175,7 @@ void _get_one_page(__u32 page,__u32 SecBitmap,__u8 *data)
        {
                for(i = 0;i < SECTOR_CNT_OF_LOGIC_PAGE; i++)
                {
-                       if(SecBitmap & (1<<i))
+                       if(SecBitmap & ((__u64)1<<i))
                        {
                                MEMCPY(tmp + (i<<9),nand_r_cache.data + 
(i<<9),512);
                        }
@@ -190,7 +196,7 @@ void _get_one_page(__u32 page,__u32 SecBitmap,__u8 *data)
 
                        for(i = 0;i < SECTOR_CNT_OF_LOGIC_PAGE; i++)
                        {
-                               if(SecBitmap & (1<<i))
+                               if(SecBitmap & ((__u64)1<<i))
                                {
                                        MEMCPY(tmp + (i<<9),nand_r_cache.data + 
(i<<9),512);
                                }
@@ -205,7 +211,8 @@ __s32 NAND_CacheRead(__u32 blk, __u32 nblk, void *buf)
 {
        __u32   nSector,StartSec;
        __u32   page;
-       __u32   SecBitmap,SecWithinPage;
+       __u32   SecWithinPage;
+       __u64   SecBitmap;
        __u8    *pdata;
 
        nSector         = nblk;
@@ -218,7 +225,7 @@ __s32 NAND_CacheRead(__u32 blk, __u32 nblk, void *buf)
        while(nSector)
        {
                SecWithinPage = StartSec % SECTOR_CNT_OF_LOGIC_PAGE;
-               SecBitmap |= (1 << SecWithinPage);
+               SecBitmap |= ((__u64)1 << SecWithinPage);
                page = StartSec / SECTOR_CNT_OF_LOGIC_PAGE;
 
                /*close page if last sector*/
@@ -250,7 +257,7 @@ __s32 NAND_CacheRead(__u32 blk, __u32 nblk, void *buf)
 
 }
 
-__s32 _fill_nand_cache(__u32 page, __u32 secbitmap, __u8 *pdata)
+__s32 _fill_nand_cache(__u32 page, __u64 secbitmap, __u8 *pdata)
 {
        __u8    hit;
        __u8    i;
@@ -344,7 +351,8 @@ __s32 NAND_CacheWrite(__u32 blk, __u32 nblk, void *buf)
 {
        __u32   nSector,StartSec;
        __u32   page;
-       __u32   SecBitmap,SecWithinPage;
+       __u32   SecWithinPage;
+       __u64   SecBitmap;
        __u32   i;
        __u8    *pdata;
        //__u32  hit = 0;
@@ -359,7 +367,7 @@ __s32 NAND_CacheWrite(__u32 blk, __u32 nblk, void *buf)
        while(nSector)
        {
                SecWithinPage = StartSec % SECTOR_CNT_OF_LOGIC_PAGE;
-               SecBitmap |= (1 << SecWithinPage);
+               SecBitmap |= ((__u64)1 << SecWithinPage);
                page = StartSec / SECTOR_CNT_OF_LOGIC_PAGE;
 
 
diff --git a/drivers/block/sunxi_nand/src/logic/logic_ctl.c 
b/drivers/block/sunxi_nand/src/logic/logic_ctl.c
index af57d59..c9c2d91 100644
--- a/drivers/block/sunxi_nand/src/logic/logic_ctl.c
+++ b/drivers/block/sunxi_nand/src/logic/logic_ctl.c
@@ -23,9 +23,9 @@
 #include <linux/module.h>
 #include "../include/nand_logic.h"
 
-struct __NandDriverGlobal_t     NandDriverInfo;
-struct __LogicArchitecture_t    LogicArchiPar;
-struct __ZoneTblPstInfo_t       ZoneTblPstInfo[MAX_ZONE_CNT];
+struct __NandDriverGlobal_t     NandDriverInfo={0};
+struct __LogicArchitecture_t    LogicArchiPar={0};
+struct __ZoneTblPstInfo_t       ZoneTblPstInfo[MAX_ZONE_CNT]={0};
 //define the parameter for manage the cached page
 static struct __GlobalLogicPageType_t  CachePage;
 
@@ -55,7 +55,8 @@ static struct __LogicCtlPar_t LogicalCtl;
 static __s32 _CalculateSectPar(__u32 nSectNum, __u32 nSectCnt, struct 
__GlobalLogicPageType_t *pHeadPage,
                                     __u32 *pMidPageCnt, struct 
__GlobalLogicPageType_t *pTailPage)
 {
-    __u32   tmpSectCnt, tmpBitmap;
+    __u32   tmpSectCnt;
+       __u64   tmpBitmap;
 
     LOGICCTL_DBG("[LOGICCTL_DBG]: Calculate logical sectors parameter, 
Lba:0x%x, Cnt:0x%x\n", nSectNum, nSectCnt);
 
@@ -122,7 +123,7 @@ static __s32 _CalculateSectPar(__u32 nSectNum, __u32 
nSectCnt, struct __GlobalLo
 *               < 0     calcualte page parameter failed.
 
************************************************************************************************************************
 */
-static __s32 _CalculateLogicPagePar(struct __LogicPageType_t *pLogicPage, 
__u32 nPage, __u32 nBitmap)
+static __s32 _CalculateLogicPagePar(struct __LogicPageType_t *pLogicPage, 
__u32 nPage, __u64 nBitmap)
 {
     __u32   tmpPage, tmpBlk, tmpZone;
 
@@ -158,14 +159,14 @@ static __s32 _CalculateLogicPagePar(struct 
__LogicPageType_t *pLogicPage, __u32
 *               < 0     update page data failed.
 
************************************************************************************************************************
 */
-static __s32 _UpdateReadPageData(__u32 nSectBitmap, void * pBuf)
+static __s32 _UpdateReadPageData(__u64 nSectBitmap, void * pBuf)
 {
     __s32   i;
     __u8    *tmpSrc = LML_WRITE_PAGE_CACHE, *tmpDst = pBuf;
 
     for(i=0; i<SECTOR_CNT_OF_LOGIC_PAGE; i++)
     {
-        if(nSectBitmap & CachePage.SectorBitmap & (1<<i))
+        if(nSectBitmap & CachePage.SectorBitmap & ((__u64)1<<i))
         {
             MEMCPY(tmpDst, tmpSrc, SECTOR_SIZE);
         }
@@ -193,7 +194,7 @@ static __s32 _UpdateReadPageData(__u32 nSectBitmap, void * 
pBuf)
 *               < 0     merge page data failed.
 
************************************************************************************************************************
 */
-static __s32 _MergeCachePageData(__u32 nPage, __u32 nBitmap, __u8 *pBuf)
+static __s32 _MergeCachePageData(__u32 nPage, __u64 nBitmap, __u8 *pBuf)
 {
     __s32   i;
     __u8    *tmpSrc = pBuf, *tmpDst = LML_WRITE_PAGE_CACHE;
@@ -208,7 +209,7 @@ static __s32 _MergeCachePageData(__u32 nPage, __u32 
nBitmap, __u8 *pBuf)
 
     for(i=0; i<SECTOR_CNT_OF_LOGIC_PAGE; i++)
     {
-        if(nBitmap & (1<<i))
+        if(nBitmap & ((__u64)1<<i))
         {
             //the sector of the write page is valid, copy data to the page 
cache
             MEMCPY(tmpDst, tmpSrc, SECTOR_SIZE);
@@ -241,7 +242,8 @@ static __s32 _MergeCachePageData(__u32 nPage, __u32 
nBitmap, __u8 *pBuf)
 static __s32 _WritePageCacheToNand(void)
 {
     __s32   result = 0;
-    __u32   tmpPage, tmpBitmap;
+    __u32   tmpPage;
+       __u64   tmpBitmap;
     __u8    *tmpBuf;
 
     tmpPage = CachePage.LogicPageNum;
@@ -452,7 +454,7 @@ __s32 LML_CalculatePhyOpPar(struct __PhysicOpPara_t 
*pPhyPar, __u32 nZone, __u32
 __s32 LML_VirtualPageRead(struct __PhysicOpPara_t *pVirtualPage)
 {
     __s32 i, result;
-    __u32 tmpBitmap;
+    __u64 tmpBitmap;
     __u8  *tmpSpare, *tmpSrcData, *tmpDstData, *tmpSrcPtr[4], *tmpDstPtr[4];
     struct __PhysicOpPara_t tmpPhyPage;
 
@@ -467,7 +469,7 @@ __s32 LML_VirtualPageRead(struct __PhysicOpPara_t 
*pVirtualPage)
         //process the pointer to spare area data
         for(i=0; i<2; i++)
         {
-            if(tmpBitmap & (1<<i))
+            if(tmpBitmap & ((__u64)1<<i))
             {
                 tmpSrcPtr[i] = LML_SPARE_BUF + 4 * i;
                 tmpDstPtr[i] = tmpSpare + 4 * i;
@@ -480,7 +482,7 @@ __s32 LML_VirtualPageRead(struct __PhysicOpPara_t 
*pVirtualPage)
 
         for(i=0; i<2; i++)
         {
-            if(tmpBitmap & (1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
+            if(tmpBitmap & ((__u64)1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
             {
                 tmpSrcPtr[i+2] = LML_SPARE_BUF + 4 * (i + 
SECTOR_CNT_OF_SINGLE_PAGE);
                 tmpDstPtr[i+2] = tmpSpare + 8 + 4 * i;
@@ -542,7 +544,7 @@ __s32 LML_VirtualPageRead(struct __PhysicOpPara_t 
*pVirtualPage)
 __s32 LML_VirtualPageWrite( struct __PhysicOpPara_t *pVirtualPage)
 {
     __s32 i, result;
-    __u32 tmpBitmap;
+    __u64 tmpBitmap;
     __u8  *tmpSpare, *tmpSrcData, *tmpDstData, *tmpSrcPtr[4], *tmpDstPtr[4];
     struct __PhysicOpPara_t tmpPhyPage;
 
@@ -558,7 +560,7 @@ __s32 LML_VirtualPageWrite( struct __PhysicOpPara_t 
*pVirtualPage)
         //process the pointer to spare area data
         for(i=0; i<2; i++)
         {
-            if(tmpBitmap & (1<<i))
+            if(tmpBitmap & ((__u64)1<<i))
             {
                 tmpSrcPtr[i] = tmpSpare + 4 * i;
                 tmpDstPtr[i] = LML_SPARE_BUF + 4 * i;
@@ -571,7 +573,7 @@ __s32 LML_VirtualPageWrite( struct __PhysicOpPara_t 
*pVirtualPage)
 
         for(i=0; i<2; i++)
         {
-            if(tmpBitmap & (1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
+            if(tmpBitmap & ((__u64)1<<(i + SECTOR_CNT_OF_SINGLE_PAGE)))
             {
                 tmpSrcPtr[i+2] = tmpSpare + 8 + 4 * i;
                 tmpDstPtr[i+2] = LML_SPARE_BUF + 4 * (i + 
SECTOR_CNT_OF_SINGLE_PAGE);
@@ -733,7 +735,7 @@ static __s32 _CloseWritePage(void)
 *               < 0     read failed.
 
************************************************************************************************************************
 */
-__s32 LML_PageRead(__u32 nPage, __u32 nBitmap, void* pBuf)
+__s32 LML_PageRead(__u32 nPage, __u64 nBitmap, void* pBuf)
 {
     __s32 result;
     __u32 tmpSuperBlk, tmpSuperPage;
@@ -851,7 +853,7 @@ __s32 LML_PageRead(__u32 nPage, __u32 nBitmap, void* pBuf)
 *               < 0     write failed.
 
************************************************************************************************************************
 */
-__s32 LML_PageWrite(__u32 nPage, __u32 nBitmap, void* pBuf)
+__s32 LML_PageWrite(__u32 nPage, __u64 nBitmap, void* pBuf)
 {
     __s32 result;
     struct __LogicPageType_t tmpLogicPage;
@@ -1101,7 +1103,8 @@ __s32 LML_FlushPageCache(void)
 __s32 LML_Read(__u32 nSectNum, __u32 nSectorCnt, void* pBuf)
 {
     __s32   i, result;
-    __u32   tmpMidPageCnt, tmpPageNum, tmpBitmap, tmpPageCnt;
+    __u32   tmpMidPageCnt, tmpPageNum, tmpPageCnt;
+       __u64   tmpBitmap;
     __u8    *tmpBuf;
     struct __GlobalLogicPageType_t tmpHeadPage, tmpTailPage;
 
@@ -1133,7 +1136,7 @@ __s32 LML_Read(__u32 nSectNum, __u32 nSectorCnt, void* 
pBuf)
     //calculate the buffer address for page align
     for(i=0; i<SECTOR_CNT_OF_LOGIC_PAGE; i++)
     {
-        if(tmpHeadPage.SectorBitmap & (1<<i))
+        if(tmpHeadPage.SectorBitmap & ((__u64)1<<i))
         {
             break;
         }
@@ -1231,7 +1234,8 @@ void echo_write_data (__u32 nSectNum, __u32 nSectorCnt, 
void* pBuf)
 __s32 LML_Write(__u32 nSectNum, __u32 nSectorCnt, void* pBuf)
 {
     __s32   i, result;
-    __u32   tmpMidPageCnt, tmpPageNum, tmpBitmap, tmpPageCnt;
+    __u32   tmpMidPageCnt, tmpPageNum, tmpPageCnt;
+       __u64   tmpBitmap;
     __u8    *tmpBuf;
     struct __GlobalLogicPageType_t tmpHeadPage, tmpTailPage;
 
@@ -1260,7 +1264,7 @@ __s32 LML_Write(__u32 nSectNum, __u32 nSectorCnt, void* 
pBuf)
     //calculate the buffer address for page align
     for(i=0; i<SECTOR_CNT_OF_LOGIC_PAGE; i++)
     {
-        if(tmpHeadPage.SectorBitmap & (1<<i))
+        if(tmpHeadPage.SectorBitmap & ((__u64)1<<i))
         {
             break;
         }
@@ -1440,6 +1444,8 @@ __u32 NAND_GetDiskSize(void)
     disksize = (SECTOR_CNT_OF_SINGLE_PAGE * PAGE_CNT_OF_PHY_BLK * 
BLOCK_CNT_OF_DIE * \
             DIE_CNT_OF_CHIP * NandStorageInfo.ChipCnt  / 1024 * 
DATA_BLK_CNT_OF_ZONE);
 
+    printk(KERN_ERR "%s: disksize=%d\n", __func__, disksize);
+
     return disksize;
 }
 
diff --git a/drivers/block/sunxi_nand/src/logic/mapping.c 
b/drivers/block/sunxi_nand/src/logic/mapping.c
index 6a441d8..aaed2b8 100644
--- a/drivers/block/sunxi_nand/src/logic/mapping.c
+++ b/drivers/block/sunxi_nand/src/logic/mapping.c
@@ -24,8 +24,8 @@
 
 extern struct __NandDriverGlobal_t     NandDriverInfo;
 
-struct __BlkMapTblCachePool_t BlkMapTblCachePool;
-struct __PageMapTblCachePool_t PageMapTblCachePool;
+struct __BlkMapTblCachePool_t BlkMapTblCachePool={0};
+struct __PageMapTblCachePool_t PageMapTblCachePool={0};
 
 void dump(void *buf, __u32 len , __u8 nbyte,__u8 linelen)
 {
diff --git a/drivers/block/sunxi_nand/src/physic/nand_phy.c 
b/drivers/block/sunxi_nand/src/physic/nand_phy.c
index 287209d..341f8ff 100644
--- a/drivers/block/sunxi_nand/src/physic/nand_phy.c
+++ b/drivers/block/sunxi_nand/src/physic/nand_phy.c
@@ -88,7 +88,7 @@ __s32 _read_single_page_seq(struct boot_physical_param 
*readop,__u8 dma_wait_mod
        __u32 random_seed;
 
        //__u8 *sparebuf;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
        __u32 list_len,i;
@@ -162,7 +162,7 @@ __s32 _read_single_page_1K(struct boot_physical_param 
*readop,__u8 dma_wait_mode
        __s32 ret;
        __u32 rb;
        __u32 random_seed;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
        __u32 list_len,i;
@@ -238,7 +238,7 @@ __s32 _read_single_page_spare(struct boot_physical_param 
*readop,__u8 dma_wait_m
        __u32 k = 0;
        __u32 rb;
        __u32 random_seed;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 default_value[16];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
@@ -557,7 +557,7 @@ __s32 _read_sectors(struct boot_physical_param *readop,__u8 
dma_wait_mode)
        __u32  k;
        __u32 rb;
        __u32 random_seed;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 default_value[16];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
@@ -774,7 +774,7 @@ __s32 _two_plane_read(struct __PhysicOpPara_t 
*pPageAdr,__u8 dma_wait_mode)
        __u32 chip;
        __u32 rb;
        __u32 list_len,i,plane_cnt;
-       __u32 bitmap_in_single_page;
+       __u64 bitmap_in_single_page;
        __u32 block_in_chip;
 
        NFC_CMD_LIST cmd_list[8];
@@ -854,7 +854,7 @@ __s32  PHY_PageRead(struct __PhysicOpPara_t *pPageAdr)
        __u32 chip;
        __u32 block_in_chip;
        __u32 plane_cnt,i;
-       __u32 bitmap_in_single_page;
+       __u64 bitmap_in_single_page;
        struct __NandUserData_t *sparebuf;
        struct __NandUserData_t oob_buf;
        struct boot_physical_param readop;
@@ -1064,7 +1064,7 @@ __s32 _read_sectors_for_spare(struct boot_physical_param 
*readop,__u8 dma_wait_m
        /*send 05 + 2addr- e0 get 512 byte data*/
        list_len = 4;
        for (i = 0; i < 2; i++){
-               if (readop->sectorbitmap & (1 << i)){
+               if (readop->sectorbitmap & ((__u64)1 << i)){
 
                        /*get main data addr*/
                        _cal_addr_in_chip_for_spare(0,0,i<<1,addr1,2);
@@ -1289,7 +1289,7 @@ __s32  PHY_PageReadSpare(struct __PhysicOpPara_t 
*pPageAdr)
        __u32 chip;
        __u32 block_in_chip;
        __u32 plane_cnt,i;
-       __u32 bitmap_in_single_page;
+       __u64 bitmap_in_single_page;
        struct __NandUserData_t *sparebuf;
        struct __NandUserData_t oob_buf;
        struct boot_physical_param readop;
diff --git a/drivers/block/sunxi_nand/src/physic/nand_simple_r.c 
b/drivers/block/sunxi_nand/src/physic/nand_simple_r.c
index 88051e6..f8e0fa6 100644
--- a/drivers/block/sunxi_nand/src/physic/nand_simple_r.c
+++ b/drivers/block/sunxi_nand/src/physic/nand_simple_r.c
@@ -372,7 +372,7 @@ __s32 _read_single_page(struct boot_physical_param 
*readop,__u8 dma_wait_mode)
        __u32 k = 0;
        __u32 rb;
        __u32 random_seed;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 default_value[16];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
diff --git a/drivers/block/sunxi_nand/src/physic/nand_simple_w.c 
b/drivers/block/sunxi_nand/src/physic/nand_simple_w.c
index 0ad0700..0aa038f 100644
--- a/drivers/block/sunxi_nand/src/physic/nand_simple_w.c
+++ b/drivers/block/sunxi_nand/src/physic/nand_simple_w.c
@@ -46,7 +46,7 @@ __s32 _write_signle_page (struct boot_physical_param 
*writeop,__u32 program1,__u
        __u32 rb;
        __u32 random_seed;
        //__u8 *sparebuf;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
        __u32 list_len,i,addr_cycle;
@@ -101,7 +101,7 @@ __s32 _write_signle_page_seq (struct boot_physical_param 
*writeop,__u32 program1
        __u32 rb;
        __u32 random_seed;
        //__u8 *sparebuf;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
        __u32 list_len,i,addr_cycle;
@@ -157,7 +157,7 @@ __s32 _write_signle_page_1K (struct boot_physical_param 
*writeop,__u32 program1,
        __u32 rb;
        __u32 random_seed;
        //__u8 *sparebuf;
-       __u8 sparebuf[4*16];
+       __u8 sparebuf[4*32];
        __u8 addr[5];
        NFC_CMD_LIST cmd_list[4];
        __u32 list_len,i,addr_cycle;
-- 
1.7.9.5

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to