@@ -1096,7 +1096,8 @@ static void config_nand_page_read(struct qcom_nand_controller *nandc)
1096
1096
* Helper to prepare DMA descriptors for configuring registers
1097
1097
* before reading each codeword in NAND page.
1098
1098
*/
1099
- static void config_nand_cw_read (struct qcom_nand_controller * nandc )
1099
+ static void
1100
+ config_nand_cw_read (struct qcom_nand_controller * nandc , bool use_ecc )
1100
1101
{
1101
1102
if (nandc -> props -> is_bam )
1102
1103
write_reg_dma (nandc , NAND_READ_LOCATION_0 , 4 ,
@@ -1105,19 +1106,25 @@ static void config_nand_cw_read(struct qcom_nand_controller *nandc)
1105
1106
write_reg_dma (nandc , NAND_FLASH_CMD , 1 , NAND_BAM_NEXT_SGL );
1106
1107
write_reg_dma (nandc , NAND_EXEC_CMD , 1 , NAND_BAM_NEXT_SGL );
1107
1108
1108
- read_reg_dma (nandc , NAND_FLASH_STATUS , 2 , 0 );
1109
- read_reg_dma (nandc , NAND_ERASED_CW_DETECT_STATUS , 1 ,
1110
- NAND_BAM_NEXT_SGL );
1109
+ if (use_ecc ) {
1110
+ read_reg_dma (nandc , NAND_FLASH_STATUS , 2 , 0 );
1111
+ read_reg_dma (nandc , NAND_ERASED_CW_DETECT_STATUS , 1 ,
1112
+ NAND_BAM_NEXT_SGL );
1113
+ } else {
1114
+ read_reg_dma (nandc , NAND_FLASH_STATUS , 1 , NAND_BAM_NEXT_SGL );
1115
+ }
1111
1116
}
1112
1117
1113
1118
/*
1114
1119
* Helper to prepare dma descriptors to configure registers needed for reading a
1115
1120
* single codeword in page
1116
1121
*/
1117
- static void config_nand_single_cw_page_read (struct qcom_nand_controller * nandc )
1122
+ static void
1123
+ config_nand_single_cw_page_read (struct qcom_nand_controller * nandc ,
1124
+ bool use_ecc )
1118
1125
{
1119
1126
config_nand_page_read (nandc );
1120
- config_nand_cw_read (nandc );
1127
+ config_nand_cw_read (nandc , use_ecc );
1121
1128
}
1122
1129
1123
1130
/*
@@ -1198,7 +1205,7 @@ static int nandc_param(struct qcom_nand_host *host)
1198
1205
nandc -> buf_count = 512 ;
1199
1206
memset (nandc -> data_buffer , 0xff , nandc -> buf_count );
1200
1207
1201
- config_nand_single_cw_page_read (nandc );
1208
+ config_nand_single_cw_page_read (nandc , false );
1202
1209
1203
1210
read_data_dma (nandc , FLASH_BUF_ACC , nandc -> data_buffer ,
1204
1211
nandc -> buf_count , 0 );
@@ -1563,6 +1570,23 @@ struct read_stats {
1563
1570
__le32 erased_cw ;
1564
1571
};
1565
1572
1573
+ /* reads back FLASH_STATUS register set by the controller */
1574
+ static int check_flash_errors (struct qcom_nand_host * host , int cw_cnt )
1575
+ {
1576
+ struct nand_chip * chip = & host -> chip ;
1577
+ struct qcom_nand_controller * nandc = get_qcom_nand_controller (chip );
1578
+ int i ;
1579
+
1580
+ for (i = 0 ; i < cw_cnt ; i ++ ) {
1581
+ u32 flash = le32_to_cpu (nandc -> reg_read_buf [i ]);
1582
+
1583
+ if (flash & (FS_OP_ERR | FS_MPU_ERR ))
1584
+ return - EIO ;
1585
+ }
1586
+
1587
+ return 0 ;
1588
+ }
1589
+
1566
1590
/*
1567
1591
* reads back status registers set by the controller to notify page read
1568
1592
* errors. this is equivalent to what 'ecc->correct()' would do.
@@ -1729,7 +1753,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf,
1729
1753
}
1730
1754
}
1731
1755
1732
- config_nand_cw_read (nandc );
1756
+ config_nand_cw_read (nandc , true );
1733
1757
1734
1758
if (data_buf )
1735
1759
read_data_dma (nandc , FLASH_BUF_ACC , data_buf ,
@@ -1791,7 +1815,7 @@ static int copy_last_cw(struct qcom_nand_host *host, int page)
1791
1815
set_address (host , host -> cw_size * (ecc -> steps - 1 ), page );
1792
1816
update_rw_regs (host , 1 , true);
1793
1817
1794
- config_nand_single_cw_page_read (nandc );
1818
+ config_nand_single_cw_page_read (nandc , host -> use_ecc );
1795
1819
1796
1820
read_data_dma (nandc , FLASH_BUF_ACC , nandc -> data_buffer , size , 0 );
1797
1821
@@ -1874,7 +1898,7 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd,
1874
1898
nandc_set_read_loc (nandc , 3 , read_loc , oob_size2 , 1 );
1875
1899
}
1876
1900
1877
- config_nand_cw_read (nandc );
1901
+ config_nand_cw_read (nandc , false );
1878
1902
1879
1903
read_data_dma (nandc , reg_off , data_buf , data_size1 , 0 );
1880
1904
reg_off += data_size1 ;
@@ -1893,12 +1917,13 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd,
1893
1917
}
1894
1918
1895
1919
ret = submit_descs (nandc );
1896
- if (ret )
1897
- dev_err (nandc -> dev , "failure to read raw page\n" );
1898
-
1899
1920
free_descs (nandc );
1921
+ if (ret ) {
1922
+ dev_err (nandc -> dev , "failure to read raw page\n" );
1923
+ return ret ;
1924
+ }
1900
1925
1901
- return ret ;
1926
+ return check_flash_errors ( host , ecc -> steps ) ;
1902
1927
}
1903
1928
1904
1929
/* implements ecc->read_oob() */
@@ -2117,7 +2142,6 @@ static int qcom_nandc_block_bad(struct mtd_info *mtd, loff_t ofs)
2117
2142
struct qcom_nand_controller * nandc = get_qcom_nand_controller (chip );
2118
2143
struct nand_ecc_ctrl * ecc = & chip -> ecc ;
2119
2144
int page , ret , bbpos , bad = 0 ;
2120
- u32 flash_status ;
2121
2145
2122
2146
page = (int )(ofs >> chip -> page_shift ) & chip -> pagemask ;
2123
2147
@@ -2134,9 +2158,7 @@ static int qcom_nandc_block_bad(struct mtd_info *mtd, loff_t ofs)
2134
2158
if (ret )
2135
2159
goto err ;
2136
2160
2137
- flash_status = le32_to_cpu (nandc -> reg_read_buf [0 ]);
2138
-
2139
- if (flash_status & (FS_OP_ERR | FS_MPU_ERR )) {
2161
+ if (check_flash_errors (host , 1 )) {
2140
2162
dev_warn (nandc -> dev , "error when trying to read BBM\n" );
2141
2163
goto err ;
2142
2164
}
0 commit comments