Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 332687
b: refs/heads/master
c: aa6d01f
h: refs/heads/master
i:
  332685: 8c887d2
  332683: 9eca118
  332679: 3beef21
  332671: 98c4c07
v: v3
  • Loading branch information
Mike Dunn authored and David Woodhouse committed Sep 29, 2012
1 parent 890b760 commit 368ace9
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 036a1ac1f4ac8cdfed4574738c63aba2e81a13e4
refs/heads/master: aa6d01fa435a6f701128829f8d9d04208fd53176
33 changes: 6 additions & 27 deletions trunk/drivers/mtd/nand/docg4.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,9 @@ static int correct_data(struct mtd_info *mtd, uint8_t *buf, int page)
* bit flips(s) are not reported in stats.
*/

if (doc->oob_buf[15]) {
if (nand->oob_poi[15]) {
int bit, numsetbits = 0;
unsigned long written_flag = doc->oob_buf[15];
unsigned long written_flag = nand->oob_poi[15];
for_each_set_bit(bit, &written_flag, 8)
numsetbits++;
if (numsetbits > 4) { /* assume blank */
Expand Down Expand Up @@ -428,7 +428,7 @@ static int correct_data(struct mtd_info *mtd, uint8_t *buf, int page)
/* if error within oob area preceeding ecc bytes... */
if (errpos[i] > DOCG4_PAGE_SIZE * 8)
change_bit(errpos[i] - DOCG4_PAGE_SIZE * 8,
(unsigned long *)doc->oob_buf);
(unsigned long *)nand->oob_poi);

else /* error in page data */
change_bit(errpos[i], (unsigned long *)buf);
Expand Down Expand Up @@ -748,18 +748,12 @@ static int read_page(struct mtd_info *mtd, struct nand_chip *nand,

docg4_read_buf(mtd, buf, DOCG4_PAGE_SIZE); /* read the page data */

/*
* Diskonchips read oob immediately after a page read. Mtd
* infrastructure issues a separate command for reading oob after the
* page is read. So we save the oob bytes in a local buffer and just
* copy it if the next command reads oob from the same page.
*/

/* this device always reads oob after page data */
/* first 14 oob bytes read from I/O reg */
docg4_read_buf(mtd, doc->oob_buf, 14);
docg4_read_buf(mtd, nand->oob_poi, 14);

/* last 2 read from another reg */
buf16 = (uint16_t *)(doc->oob_buf + 14);
buf16 = (uint16_t *)(nand->oob_poi + 14);
*buf16 = readw(docptr + DOCG4_MYSTERY_REG);

write_nop(docptr);
Expand Down Expand Up @@ -807,21 +801,6 @@ static int docg4_read_oob(struct mtd_info *mtd, struct nand_chip *nand,

dev_dbg(doc->dev, "%s: page %x\n", __func__, page);

/*
* Oob bytes are read as part of a normal page read. If the previous
* nand command was a read of the page whose oob is now being read, just
* copy the oob bytes that we saved in a local buffer and avoid a
* separate oob read.
*/
if (doc->last_command.command == NAND_CMD_READ0 &&
doc->last_command.page == page) {
memcpy(nand->oob_poi, doc->oob_buf, 16);
return 0;
}

/*
* Separate read of oob data only.
*/
docg4_command(mtd, NAND_CMD_READ0, nand->ecc.size, page);

writew(DOC_ECCCONF0_READ_MODE | DOCG4_OOB_SIZE, docptr + DOC_ECCCONF0);
Expand Down

0 comments on commit 368ace9

Please sign in to comment.