| .. | .. |
|---|
| 311 | 311 | return ret; |
|---|
| 312 | 312 | } |
|---|
| 313 | 313 | |
|---|
| 314 | | -static int sfc_nand_wait_busy(u8 *data, int timeout) |
|---|
| 314 | +static int sfc_nand_wait_busy_sleep(u8 *data, int timeout, int sleep_us) |
|---|
| 315 | 315 | { |
|---|
| 316 | 316 | int ret; |
|---|
| 317 | 317 | int i; |
|---|
| .. | .. |
|---|
| 319 | 319 | |
|---|
| 320 | 320 | *data = 0; |
|---|
| 321 | 321 | |
|---|
| 322 | | - for (i = 0; i < timeout; i++) { |
|---|
| 322 | + for (i = 0; i < timeout; i += sleep_us) { |
|---|
| 323 | + usleep_range(sleep_us, sleep_us + 50); |
|---|
| 324 | + |
|---|
| 323 | 325 | ret = sfc_nand_read_feature(0xC0, &status); |
|---|
| 324 | 326 | |
|---|
| 325 | 327 | if (ret != SFC_OK) |
|---|
| .. | .. |
|---|
| 329 | 331 | |
|---|
| 330 | 332 | if (!(status & (1 << 0))) |
|---|
| 331 | 333 | return SFC_OK; |
|---|
| 332 | | - |
|---|
| 333 | | - sfc_delay(1); |
|---|
| 334 | 334 | } |
|---|
| 335 | 335 | |
|---|
| 336 | 336 | return SFC_NAND_WAIT_TIME_OUT; |
|---|
| .. | .. |
|---|
| 794 | 794 | if (ret != SFC_OK) |
|---|
| 795 | 795 | return ret; |
|---|
| 796 | 796 | |
|---|
| 797 | | - ret = sfc_nand_wait_busy(&status, 1000 * 1000); |
|---|
| 797 | + ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 1000); |
|---|
| 798 | 798 | |
|---|
| 799 | 799 | if (status & (1 << 2)) |
|---|
| 800 | 800 | return SFC_NAND_PROG_ERASE_ERROR; |
|---|
| .. | .. |
|---|
| 851 | 851 | op.sfctrl.d32 = 0; |
|---|
| 852 | 852 | op.sfctrl.b.datalines = sfc_nand_dev.prog_lines; |
|---|
| 853 | 853 | op.sfctrl.b.addrbits = 16; |
|---|
| 854 | + op.sfctrl.b.enbledma = 0; |
|---|
| 854 | 855 | plane = p_nand_info->plane_per_die == 2 ? ((addr >> 6) & 0x1) << 12 : 0; |
|---|
| 855 | 856 | sfc_request(&op, plane, p_page_buf, page_size); |
|---|
| 856 | 857 | |
|---|
| .. | .. |
|---|
| 880 | 881 | if (ret != SFC_OK) |
|---|
| 881 | 882 | return ret; |
|---|
| 882 | 883 | |
|---|
| 883 | | - ret = sfc_nand_wait_busy(&status, 1000 * 1000); |
|---|
| 884 | + ret = sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 200); |
|---|
| 885 | + |
|---|
| 884 | 886 | if (status & (1 << 3)) |
|---|
| 885 | 887 | return SFC_NAND_PROG_ERASE_ERROR; |
|---|
| 886 | 888 | |
|---|
| .. | .. |
|---|
| 931 | 933 | sfc_get_version() < SFC_VER_3) |
|---|
| 932 | 934 | sfc_nand_rw_preset(); |
|---|
| 933 | 935 | |
|---|
| 934 | | - sfc_nand_wait_busy(&status, 1000 * 1000); |
|---|
| 936 | + sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50); |
|---|
| 937 | + if (sfc_nand_dev.manufacturer == 0x01 && status) |
|---|
| 938 | + sfc_nand_wait_busy_sleep(&status, 1000 * 1000, 50); |
|---|
| 939 | + |
|---|
| 935 | 940 | ecc_result = p_nand_info->ecc_status(); |
|---|
| 936 | 941 | |
|---|
| 937 | 942 | op.sfcmd.d32 = 0; |
|---|
| .. | .. |
|---|
| 942 | 947 | op.sfctrl.d32 = 0; |
|---|
| 943 | 948 | op.sfctrl.b.datalines = sfc_nand_dev.read_lines; |
|---|
| 944 | 949 | op.sfctrl.b.addrbits = 16; |
|---|
| 950 | + op.sfctrl.b.enbledma = 0; |
|---|
| 945 | 951 | |
|---|
| 946 | 952 | plane = p_nand_info->plane_per_die == 2 ? ((row >> 6) & 0x1) << 12 : 0; |
|---|
| 947 | 953 | ret = sfc_request(&op, plane | column, p_page_buf, len); |
|---|