[PATCH] pxa3xx_nand: add debug messege

Lei Wen leiwen at marvell.com
Tue Mar 30 08:58:58 EDT 2010


Add debug messege to those key route to help find out problem.

Signed-off-by: Lei Wen <leiwen at marvell.com>
Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
---
 drivers/mtd/nand/pxa3xx_nand.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
index fb1af4c..0674b52 100644
--- a/drivers/mtd/nand/pxa3xx_nand.c
+++ b/drivers/mtd/nand/pxa3xx_nand.c
@@ -30,6 +30,12 @@
 #define NAND_STOP_DELAY		(2 * HZ/50)
 #define PAGE_CHUNK_SIZE		(2048)
 #define BCH_THRESHOLD           (8)
+#undef PXA3XX_NAND_DEBUG
+#ifdef PXA3XX_NAND_DEBUG
+#define DBG_NAND(x)	do{x;}while(0)
+#else
+#define DBG_NAND(x)
+#endif

 /* registers and bit definitions */
 #define NDCR		(0x00) /* Control register */
@@ -411,6 +417,8 @@ static void pxa3xx_nand_start(struct pxa3xx_nand *nand)
 	}

 	/* clear status bits and run */
+	DBG_NAND(printk("@@@ndcr set: %x, ndeccctrl set %x\n",
+				ndcr, ndeccctrl));
 	nand_writel(nand, NDCR, 0);
 	nand_writel(nand, NDECCCTRL, ndeccctrl);
 	nand_writel(nand, NDSR, NDSR_MASK);
@@ -456,6 +464,8 @@ static void handle_data_pio(struct pxa3xx_nand *nand)
 {
 	struct pxa3xx_nand_info *info = nand->info[nand->chip_select];

+	DBG_NAND(printk("data size %x, oob size %x\n",
+				nand->data_size, nand->oob_size));
 	if (nand->state & STATE_IS_WRITE) {
 		__raw_writesl(nand->mmio_base + NDDB, info->data_buff,
 				DIV_ROUND_UP(nand->data_size, 4));
@@ -492,6 +502,8 @@ static void start_data_dma(struct pxa3xx_nand
*nand, int dir_out)
 		desc->dcmd |= DCMD_INCTRGADDR | DCMD_FLOWSRC;
 	}

+	DBG_NAND(printk("DMA START:DMA dcmd %x, dsadr %x, dtadr %x, len %x\n",
+				desc->dcmd, desc->dsadr, desc->dtadr, dma_len));
 	DRCMR(nand->drcmr_dat) = DRCMR_MAPVLD | info->data_dma_ch;
 	DDADR(info->data_dma_ch) = info->data_desc_addr;
 	DCSR(info->data_dma_ch) |= DCSR_RUN;
@@ -505,6 +517,7 @@ static void pxa3xx_nand_data_dma_irq(int channel,
void *data)
 	dcsr = DCSR(channel);
 	DCSR(channel) = dcsr;

+	DBG_NAND(printk("DMA IRQ: dcsr %x\n", dcsr));
 	if (dcsr & DCSR_BUSERR) {
 		nand->retcode = ERR_DMABUSERR;
 	}
@@ -528,6 +541,8 @@ static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
 	info            = nand->info[cs];

 	status = nand_readl(nand, NDSR);
+	DBG_NAND(if (status != 0)
+		printk("\t\tstatus %x, cs %x\n", status, cs));
 	nand->bad_count = (status & NDSR_ERR_CNT_MASK) >> 16;
 	if (status & NDSR_DBERR)
 		nand->retcode = ERR_DBERR;
@@ -562,6 +577,8 @@ static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
 		nand_writel(nand, NDCB0, info->ndcb0);
 		nand_writel(nand, NDCB0, info->ndcb1);
 		nand_writel(nand, NDCB0, info->ndcb2);
+		DBG_NAND(printk("\tndcb0 %x ndcb1 %x ndcb2 %x\n",
+				info->ndcb0, info->ndcb1, info->ndcb2));
 	}

 	/* clear NDSR to let the controller exit the IRQ */
@@ -754,6 +771,7 @@ static void pxa3xx_nand_cmdfunc(struct mtd_info
*mtd, unsigned command,
 		nand_writel(nand, NDTR1CS0, info->ndtr1cs0);
 	}

+	DBG_NAND(printk("command %x, page %x\n", command, page_addr));
 	exec_cmd = prepare_command_pool(nand, command, column, page_addr);
 	if (exec_cmd) {
 		init_completion(&nand->cmd_complete);
@@ -940,6 +958,7 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,
 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);

 	if (nand->retcode == ERR_SBERR) {
+		DBG_NAND(printk("###correctable error detected\n"););
 		switch (nand->use_ecc) {
 		case ECC_BCH:
 			if (nand->bad_count > BCH_THRESHOLD)
@@ -956,8 +975,10 @@ static int pxa3xx_nand_read_page_hwecc(struct
mtd_info *mtd,
 		int buf_blank;

 		buf_blank = is_buf_blank(buf, mtd->writesize);
-		if (!buf_blank)
+		if (!buf_blank) {
+			DBG_NAND(printk("###uncorrectable error!!!\n"));
 			mtd->ecc_stats.failed++;
+		}
 	}

 	return 0;
-- 
1.5.6.5



More information about the linux-mtd mailing list