[PATCH] MPC813 NAND fixes

Mike Hench mhench at engagenet.com
Thu Mar 20 02:28:19 EST 2008


 

 

________________________________

From: Mike Hench 
Sent: Wednesday, March 19, 2008 10:22 AM
To: 'mhench at wi.rr.com'
Subject: [PATCH] MPC813 NAND fixes

 

Fix a race condition in fsl_elbc_run_command

Declare a variable written by an interrupt volatile.

Added parentheses to make timeout non-zero

Fix incorrect usage of clearbits32 that bashed option register

Remove work around for bashed register

 

Signed-off-by: Mike Hench <mhench at elutions.com>

 

---

 

--- linux-2.6.25-rc5.orig/drivers/mtd/nand/fsl_elbc_nand.c   2008-03-10
00:22:27.000000000 -0500

+++ linux-2.6.25-rc5/drivers/mtd/nand/fsl_elbc_nand.c       2008-03-19
10:08:22.000000000 -0500

@@ -264,7 +264,7 @@ struct fsl_elbc_ctrl {

            struct elbc_regs __iomem *regs;

            int irq;

            wait_queue_head_t irq_wait;

-           unsigned int irq_status; /* status read from LTESR by irq
handler */

+          volatile unsigned int irq_status; /* status read from LTESR
by irq handler */

            u8 __iomem *addr;        /* Address of assigned FCM buffer
*/

            unsigned int page;       /* Last page written to / read from
*/

            unsigned int read_bytes; /* Number of bytes read during
command   */

@@ -379,13 +379,13 @@ static int fsl_elbc_run_command(struct m

                     in_be32(&lbc->fbar), in_be32(&lbc->fpar),

                     in_be32(&lbc->fbcr), priv->bank);

 

+          ctrl->irq_status = 0;

            /* execute special operation */

            out_be32(&lbc->lsor, priv->bank);

 

            /* wait for FCM complete flag or timeout */

-           ctrl->irq_status = 0;

            wait_event_timeout(ctrl->irq_wait, ctrl->irq_status,

-                              FCM_TIMEOUT_MSECS * HZ/1000);

+                             (FCM_TIMEOUT_MSECS * HZ)/1000);

            ctrl->status = ctrl->irq_status;

 

            /* store mdr value in case it was needed */

@@ -861,7 +861,7 @@ static int fsl_elbc_chip_init_tail(struc

            /* adjust Option Register and ECC to match Flash page size
*/

            if (mtd->writesize == 512) {

                        priv->page_size = 0;

-                       clrbits32(&lbc->bank[priv->bank].or,
~OR_FCM_PGS);

+                      clrbits32(&lbc->bank[priv->bank].or, OR_FCM_PGS);

            } else if (mtd->writesize == 2048) {

                        priv->page_size = 1;

                        setbits32(&lbc->bank[priv->bank].or,
OR_FCM_PGS);

@@ -882,11 +882,6 @@ static int fsl_elbc_chip_init_tail(struc

                        return -1;

            }

 

-           /* The default u-boot configuration on MPC8313ERDB causes
errors;

-           * more delay is needed.  This should be safe for other
boards

-           * as well.

-           */

-           setbits32(&lbc->bank[priv->bank].or, 0x70);

            return 0;

 }

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20080319/166b5e2f/attachment.htm>


More information about the Linuxppc-dev mailing list