Re: latest mtd changes broke collie

From: Todd Poynor
Date: Wed Nov 09 2005 - 21:59:04 EST


Pavel Machek wrote:
Latest mtd changes break collie...it now oopses during boot. This
reverts the bad patch.

What tree was this generated against? It doesn't seem to match recent linux-mtd or kernel.org trees. It looks like the tree used had different version of a couple fixes recently added to linux-mtd (removal of bogus udelays and 32-bit status datatype).

I'm guessing the important part is to add a missing spin_unlock_bh(), which is definitely a bug in the mtd code, but this code is so different than linux-mtd CVS that it seems more resyncing is needed. As it stands now, force-fitting this patch would still leave an unbalanced spin_lock_bh() without other changes. And it does look like this driver hasn't been converted to modern mtd apis.


Signed-off-by: Pavel Machek <pavel@xxxxxxx>

diff --git a/drivers/mtd/chips/sharp.c b/drivers/mtd/chips/sharp.c
--- a/drivers/mtd/chips/sharp.c
+++ b/drivers/mtd/chips/sharp.c
@@ -4,7 +4,7 @@
* Copyright 2000,2001 David A. Schleef <ds@xxxxxxxxxxx>
* 2000,2001 Lineo, Inc.
*
- * $Id: sharp.c,v 1.16 2005/11/07 11:14:23 gleixner Exp $
+ * $Id: sharp.c,v 1.14 2004/08/09 13:19:43 dwmw2 Exp $
*
* Devices supported:
* LH28F016SCT Symmetrical block flash memory, 2Mx8
@@ -32,7 +32,6 @@
#include <linux/mtd/cfi.h>
#include <linux/delay.h>
#include <linux/init.h>
-#include <linux/slab.h>
#define CMD_RESET 0xffffffff
#define CMD_READ_ID 0x90909090
@@ -234,7 +233,7 @@ static int sharp_probe_map(struct map_in
/* This function returns with the chip->mutex lock held. */
static int sharp_wait(struct map_info *map, struct flchip *chip)
{
- int status, i;
+ __u32 status;
unsigned long timeo = jiffies + HZ;
DECLARE_WAITQUEUE(wait, current);
int adr = 0;
@@ -247,11 +246,13 @@ retry:
map_write32(map, CMD_READ_STATUS, adr);
chip->state = FL_STATUS;
case FL_STATUS:
- for(i=0;i<100;i++){
- status = map_read32(map,adr);
- if((status & SR_READY)==SR_READY)
- break;
- udelay(1);
+ status = map_read32(map,adr);
+ if ((status & SR_READY) == SR_READY)
+ break;
+ spin_unlock_bh(chip->mutex);
+ if (time_after(jiffies, timeo)) {
+ printk("Waiting for chip to be ready timed out in erase\n");
+ return -EIO;
}
sharp_udelay(1);
goto retry;
@@ -491,11 +492,7 @@ static inline int sharp_do_wait_for_read
spin_lock_bh(chip->mutex);
remove_wait_queue(&chip->wq, &wait);
-
- if (signal_pending(current)){
- ret = -EINTR;
- goto out;
- }
+ set_current_state(TASK_RUNNING);
}
ret = -ETIME;
out:





--
Todd
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/