rk29: enable apanic
author黄涛 <huangtao@rock-chips.com>
Mon, 14 Feb 2011 04:01:58 +0000 (12:01 +0800)
committer黄涛 <huangtao@rock-chips.com>
Mon, 14 Feb 2011 04:02:26 +0000 (12:02 +0800)
arch/arm/configs/rk29_Winaccord_defconfig
arch/arm/configs/rk29_aigo_defconfig
arch/arm/configs/rk29_malata_defconfig
arch/arm/configs/rk29_sdk_defconfig
drivers/misc/apanic.c
drivers/mtd/rknand/rknand_base.c

index d2c48bb02a935e5bb2b7820663696c2fd0ac284b..f310b3cdadc349fc51f0783947706f6e14c01a8e 100644 (file)
@@ -567,7 +567,8 @@ CONFIG_ANDROID_PMEM=y
 # CONFIG_KERNEL_DEBUGGER_CORE is not set
 # CONFIG_ISL29003 is not set
 # CONFIG_UID_STAT is not set
-# CONFIG_APANIC is not set
+CONFIG_APANIC=y
+CONFIG_APANIC_PLABEL="kpanic"
 # CONFIG_STE is not set
 # CONFIG_C2PORT is not set
 
index 7cb62988d5c0bff0c419226a307ab9b6b4584676..c774e957774b7a710e7f912bcb8d44149a90db69 100644 (file)
@@ -592,7 +592,8 @@ CONFIG_ANDROID_PMEM=y
 # CONFIG_ISL29003 is not set
 # CONFIG_UID_STAT is not set
 # CONFIG_WL127X_RFKILL is not set
-# CONFIG_APANIC is not set
+CONFIG_APANIC=y
+CONFIG_APANIC_PLABEL="kpanic"
 # CONFIG_STE is not set
 # CONFIG_C2PORT is not set
 
index b941a2e301526ce1a0f1d3d0ee9194b27299a58b..f29b276aaabeb06ed86be6a6d1197b1ccc57bccd 100644 (file)
@@ -593,7 +593,8 @@ CONFIG_ANDROID_PMEM=y
 # CONFIG_ISL29003 is not set
 # CONFIG_UID_STAT is not set
 # CONFIG_WL127X_RFKILL is not set
-# CONFIG_APANIC is not set
+CONFIG_APANIC=y
+CONFIG_APANIC_PLABEL="kpanic"
 # CONFIG_STE is not set
 # CONFIG_C2PORT is not set
 
index 12603fa1c37c83345887a5d9b4dd4a2d1184dd5d..c62ebc514a35352a46721ea2a132e7ed6bdcbfd9 100755 (executable)
@@ -592,7 +592,8 @@ CONFIG_ANDROID_PMEM=y
 # CONFIG_ISL29003 is not set
 # CONFIG_UID_STAT is not set
 # CONFIG_WL127X_RFKILL is not set
-# CONFIG_APANIC is not set
+CONFIG_APANIC=y
+CONFIG_APANIC_PLABEL="kpanic"
 # CONFIG_STE is not set
 # CONFIG_C2PORT is not set
 
index ee3a4a440675f0994f22a186876f75e8fce5ad55..0eb7ed6be672617a4315fd4167c2ce81a3019175 100644 (file)
@@ -193,8 +193,13 @@ static int apanic_proc_read(char *buffer, char **start, off_t offset,
                ctx->mtd->writesize,
                &len, ctx->bounce);
 
+#ifdef CONFIG_MTD_RKNAND
+       if (count > (ctx->mtd->writesize - page_offset))
+               count = ctx->mtd->writesize - page_offset;
+#else
        if (page_offset)
                count -= page_offset;
+#endif
        memcpy(buffer, ctx->bounce + page_offset, count);
 
        *start = count;
@@ -209,6 +214,11 @@ static int apanic_proc_read(char *buffer, char **start, off_t offset,
 static void mtd_panic_erase(void)
 {
        struct apanic_data *ctx = &drv_ctx;
+#ifdef CONFIG_MTD_RKNAND
+       size_t wlen;
+       memset(ctx->bounce, 0, sizeof(struct panic_header));
+       ctx->mtd->write(ctx->mtd, 0, sizeof(struct panic_header), &wlen, ctx->bounce);
+#else
        struct erase_info erase;
        DECLARE_WAITQUEUE(wait, current);
        wait_queue_head_t wait_q;
@@ -260,6 +270,7 @@ static void mtd_panic_erase(void)
                schedule();
                remove_wait_queue(&wait_q, &wait);
        }
+#endif
        printk(KERN_DEBUG "apanic: %s partition erased\n",
               CONFIG_APANIC_PLABEL);
 out:
@@ -331,14 +342,18 @@ static void mtd_panic_notify_add(struct mtd_info *mtd)
 
        if (hdr->magic != PANIC_MAGIC) {
                printk(KERN_INFO "apanic: No panic data available\n");
+#ifndef CONFIG_MTD_RKNAND
                mtd_panic_erase();
+#endif
                return;
        }
 
        if (hdr->version != PHDR_VERSION) {
                printk(KERN_INFO "apanic: Version mismatch (%d != %d)\n",
                       hdr->version, PHDR_VERSION);
+#ifndef CONFIG_MTD_RKNAND
                mtd_panic_erase();
+#endif
                return;
        }
 
@@ -378,8 +393,10 @@ static void mtd_panic_notify_add(struct mtd_info *mtd)
                }
        }
 
+#ifndef CONFIG_MTD_RKNAND
        if (!proc_entry_created)
                mtd_panic_erase();
+#endif
 
        return;
 out_err:
index 86059db8ba8df90eae484e1db2e5ddaeecd27989..5d9221b0fee101ad8103f8e7ee8268d2871dc09c 100755 (executable)
@@ -362,6 +362,31 @@ static void rk28xxnand_sync(struct mtd_info *mtd)
 #endif\r
 }\r
 \r
+extern void FtlWriteCacheEn(int);\r
+static int rk28xxnand_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)\r
+{\r
+       int sector = len >> 9;\r
+       int LBA = (int)(to >> 9);\r
+\r
+       if (sector) {\r
+               FtlWriteCacheEn(0);\r
+               NandWrite(LBA, sector, (void *)buf);\r
+               FtlWriteCacheEn(1);\r
+       }\r
+       *retlen = len;\r
+       return 0;\r
+}\r
+\r
+static int rk28xxnand_block_isbad(struct mtd_info *mtd, loff_t ofs)\r
+{\r
+       return 0;\r
+}\r
+\r
+static int rk28xxnand_block_markbad(struct mtd_info *mtd, loff_t ofs)\r
+{\r
+       return 0;\r
+}\r
+\r
 static int rk28xxnand_init(struct rknand_info *nand_info)\r
 {\r
        struct mtd_info    *mtd = &nand_info->mtd;\r
@@ -401,15 +426,15 @@ static int rk28xxnand_init(struct rknand_info *nand_info)
        mtd->write = rk28xxnand_write;\r
        mtd->read_oob = NULL;\r
        mtd->write_oob = NULL;\r
-       mtd->panic_write = NULL;\r
+       mtd->panic_write = rk28xxnand_panic_write;\r
 \r
        mtd->sync = rk28xxnand_sync;\r
        mtd->lock = NULL;\r
        mtd->unlock = NULL;\r
        mtd->suspend = NULL;\r
        mtd->resume = NULL;\r
-       mtd->block_isbad = NULL;\r
-       mtd->block_markbad = NULL;\r
+       mtd->block_isbad = rk28xxnand_block_isbad;\r
+       mtd->block_markbad = rk28xxnand_block_markbad;\r
        mtd->owner = THIS_MODULE;\r
 \r
 #ifdef PAGE_REMAP\r