aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mvebu
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu')
-rw-r--r--target/linux/mvebu/patches-4.4/110-pxa3xxx_nand-handle-PIO-delays.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-4.4/110-pxa3xxx_nand-handle-PIO-delays.patch b/target/linux/mvebu/patches-4.4/110-pxa3xxx_nand-handle-PIO-delays.patch
new file mode 100644
index 0000000000..7fa56970c1
--- /dev/null
+++ b/target/linux/mvebu/patches-4.4/110-pxa3xxx_nand-handle-PIO-delays.patch
@@ -0,0 +1,36 @@
+Handle delays/excessive latency during flash command processing with PIO.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+
+--- a/drivers/mtd/nand/pxa3xx_nand.c
++++ b/drivers/mtd/nand/pxa3xx_nand.c
+@@ -227,6 +227,7 @@ struct pxa3xx_nand_info {
+ int use_dma; /* use DMA ? */
+ int use_spare; /* use spare ? */
+ int need_wait;
++ int pio_progress;
+
+ /* Amount of real data per full chunk */
+ unsigned int chunk_size;
+@@ -769,6 +770,7 @@ static irqreturn_t pxa3xx_nand_irq_threa
+ {
+ struct pxa3xx_nand_info *info = data;
+
++ info->pio_progress = 1;
+ handle_data_pio(info);
+
+ info->state = STATE_CMD_DONE;
+@@ -1175,8 +1177,13 @@ static void nand_cmdfunc(struct mtd_info
+ info->need_wait = 1;
+ pxa3xx_nand_start(info);
+
++retry:
++ info->pio_progress = 0;
+ if (!wait_for_completion_timeout(&info->cmd_complete,
+ CHIP_DELAY_TIMEOUT)) {
++ if (info->pio_progress)
++ goto retry;
++
+ dev_err(&info->pdev->dev, "Wait time out!!!\n");
+ /* Stop State Machine for next command cycle */
+ pxa3xx_nand_stop(info);