[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