| .. | .. |
|---|
| 112 | 112 | /* HYF2GQ4UHCCAE */ |
|---|
| 113 | 113 | { 0xC9, 0x5A, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, |
|---|
| 114 | 114 | /* HYF4GQ4UAACBE */ |
|---|
| 115 | | - { 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 }, |
|---|
| 116 | | - /* HYF2GQ4IAACAE */ |
|---|
| 117 | | - { 0xC9, 0x82, 0x00, 4, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, |
|---|
| 118 | | - /* HYF1GQ4IDACAE */ |
|---|
| 119 | | - { 0xC9, 0x81, 0x00, 4, 0x40, 1, 1024, 0x4C, 20, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, |
|---|
| 115 | + { 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0x4, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 }, |
|---|
| 120 | 116 | |
|---|
| 121 | 117 | /* FS35ND01G-S1 */ |
|---|
| 122 | 118 | { 0xCD, 0xB1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x10, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status5 }, |
|---|
| .. | .. |
|---|
| 153 | 149 | { 0xE5, 0xF4, 0x00, 4, 0x40, 2, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, |
|---|
| 154 | 150 | /* DS35M1GB-IB */ |
|---|
| 155 | 151 | { 0xE5, 0xA1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, |
|---|
| 156 | | - /* DS35Q12B-IB */ |
|---|
| 157 | | - { 0xE5, 0xF5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, |
|---|
| 158 | | - /* DS35M12B-IB */ |
|---|
| 159 | | - { 0xE5, 0xA5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, |
|---|
| 160 | 152 | |
|---|
| 161 | 153 | /* EM73C044VCC-H */ |
|---|
| 162 | 154 | { 0xD5, 0x22, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, |
|---|
| .. | .. |
|---|
| 214 | 206 | { 0xEA, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, |
|---|
| 215 | 207 | /* TX25G01 */ |
|---|
| 216 | 208 | { 0xA1, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 }, |
|---|
| 217 | | - /* ANV1GCP0CLG, HYF1GQ4UTXCAE */ |
|---|
| 218 | | - { 0x01, 0x15, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status9 }, |
|---|
| 219 | | - /* S35ML02G3, ANV1GCP0CLG */ |
|---|
| 220 | | - { 0x01, 0x25, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, |
|---|
| 209 | + /* S35ML02G3 */ |
|---|
| 210 | + { 0x01, 0x25, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, |
|---|
| 221 | 211 | /* S35ML04G3 */ |
|---|
| 222 | | - { 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, |
|---|
| 223 | | - /* GSS01GSAK1 */ |
|---|
| 224 | | - { 0x52, 0xBA, 0x13, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, |
|---|
| 225 | | - /* GSS02GSAK1 */ |
|---|
| 226 | | - { 0x52, 0xBA, 0x23, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, |
|---|
| 212 | + { 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, |
|---|
| 227 | 213 | }; |
|---|
| 228 | 214 | |
|---|
| 229 | 215 | static struct nand_info *p_nand_info; |
|---|
| .. | .. |
|---|
| 877 | 863 | if (p_nand_info->id0 == MID_GIGADEV) { |
|---|
| 878 | 864 | sfc_nand_read_cache(addr, (u32 *)sfc_nand_dev.recheck_buffer, 0, data_area_size); |
|---|
| 879 | 865 | if (memcmp(sfc_nand_dev.recheck_buffer, p_page_buf, data_area_size)) { |
|---|
| 880 | | - rkflash_print_error("%s %x cache bitflip\n", __func__, addr); |
|---|
| 866 | + rkflash_print_error("%s cache bitflip1\n", __func__); |
|---|
| 881 | 867 | msleep(1000); |
|---|
| 882 | 868 | sfc_request(&op, plane, p_page_buf, page_size); |
|---|
| 883 | 869 | } |
|---|
| .. | .. |
|---|
| 946 | 932 | sfc_nand_rw_preset(); |
|---|
| 947 | 933 | |
|---|
| 948 | 934 | sfc_nand_wait_busy(&status, 1000 * 1000); |
|---|
| 949 | | - if (sfc_nand_dev.manufacturer == 0x01 && status) |
|---|
| 950 | | - sfc_nand_wait_busy(&status, 1000 * 1000); |
|---|
| 951 | | - |
|---|
| 952 | 935 | ecc_result = p_nand_info->ecc_status(); |
|---|
| 953 | 936 | |
|---|
| 954 | 937 | op.sfcmd.d32 = 0; |
|---|
| .. | .. |
|---|
| 983 | 966 | u32 sec_per_page = p_nand_info->sec_per_page; |
|---|
| 984 | 967 | u32 data_size = sec_per_page * SFC_NAND_SECTOR_SIZE; |
|---|
| 985 | 968 | struct nand_mega_area *meta = &p_nand_info->meta; |
|---|
| 969 | + int retries = 0; |
|---|
| 986 | 970 | |
|---|
| 971 | +retry: |
|---|
| 987 | 972 | ret = sfc_nand_read_page_raw(cs, addr, gp_page_buf); |
|---|
| 988 | 973 | memcpy(p_data, gp_page_buf, data_size); |
|---|
| 989 | 974 | p_spare[0] = gp_page_buf[(data_size + meta->off0) / 4]; |
|---|
| .. | .. |
|---|
| 1005 | 990 | |
|---|
| 1006 | 991 | if (p_spare) |
|---|
| 1007 | 992 | rkflash_print_hex("spare:", p_spare, 4, 2); |
|---|
| 993 | + if (ret == SFC_NAND_ECC_ERROR && retries < 1) { |
|---|
| 994 | + retries++; |
|---|
| 995 | + goto retry; |
|---|
| 996 | + } |
|---|
| 1008 | 997 | } |
|---|
| 1009 | 998 | |
|---|
| 1010 | 999 | return ret; |
|---|