[MTD] Introduce writesize
At least two flashes exists that have the concept of a minimum write unit, similar to NAND pages, but no other NAND characteristics. Therefore, rename the minimum write unit to "writesize" for all flashes, including NAND. Signed-off-by: Joern Engel <joern@wh.fh-wedel.de>
This commit is contained in:
@@ -560,9 +560,9 @@ static void nand_command(struct mtd_info *mtd, unsigned command, int column, int
|
||||
if (command == NAND_CMD_SEQIN) {
|
||||
int readcmd;
|
||||
|
||||
if (column >= mtd->oobblock) {
|
||||
if (column >= mtd->writesize) {
|
||||
/* OOB area */
|
||||
column -= mtd->oobblock;
|
||||
column -= mtd->writesize;
|
||||
readcmd = NAND_CMD_READOOB;
|
||||
} else if (column < 256) {
|
||||
/* First 256 bytes --> READ0 */
|
||||
@@ -658,7 +658,7 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned command, int column,
|
||||
|
||||
/* Emulate NAND_CMD_READOOB */
|
||||
if (command == NAND_CMD_READOOB) {
|
||||
column += mtd->oobblock;
|
||||
column += mtd->writesize;
|
||||
command = NAND_CMD_READ0;
|
||||
}
|
||||
|
||||
@@ -889,7 +889,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this, int pag
|
||||
/* No ecc, write all */
|
||||
case NAND_ECC_NONE:
|
||||
printk(KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n");
|
||||
this->write_buf(mtd, this->data_poi, mtd->oobblock);
|
||||
this->write_buf(mtd, this->data_poi, mtd->writesize);
|
||||
break;
|
||||
|
||||
/* Software ecc 3/256, write all */
|
||||
@@ -900,7 +900,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *this, int pag
|
||||
oob_buf[oob_config[eccidx]] = ecc_code[i];
|
||||
datidx += this->eccsize;
|
||||
}
|
||||
this->write_buf(mtd, this->data_poi, mtd->oobblock);
|
||||
this->write_buf(mtd, this->data_poi, mtd->writesize);
|
||||
break;
|
||||
default:
|
||||
eccbytes = this->eccbytes;
|
||||
@@ -1161,9 +1161,9 @@ int nand_do_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
page = realpage & this->pagemask;
|
||||
|
||||
/* Get raw starting column */
|
||||
col = from & (mtd->oobblock - 1);
|
||||
col = from & (mtd->writesize - 1);
|
||||
|
||||
end = mtd->oobblock;
|
||||
end = mtd->writesize;
|
||||
ecc = this->eccsize;
|
||||
eccbytes = this->eccbytes;
|
||||
|
||||
@@ -1321,7 +1321,7 @@ int nand_do_read_ecc(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
buf[read++] = data_poi[j];
|
||||
this->pagebuf = realpage;
|
||||
} else
|
||||
read += mtd->oobblock;
|
||||
read += mtd->writesize;
|
||||
|
||||
/* Apply delay or wait for ready/busy pin
|
||||
* Do this before the AUTOINCR check, so no problems
|
||||
@@ -1479,7 +1479,7 @@ int nand_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len, s
|
||||
int chip = (int)(from >> this->chip_shift);
|
||||
int sndcmd = 1;
|
||||
int cnt = 0;
|
||||
int pagesize = mtd->oobblock + mtd->oobsize;
|
||||
int pagesize = mtd->writesize + mtd->oobsize;
|
||||
int blockcheck = (1 << (this->phys_erase_shift - this->page_shift)) - 1;
|
||||
|
||||
/* Do not allow reads past end of device */
|
||||
@@ -1581,7 +1581,7 @@ static u_char *nand_prepare_oobbuf(struct mtd_info *mtd, u_char *fsbuf, struct n
|
||||
return this->oob_buf;
|
||||
}
|
||||
|
||||
#define NOTALIGNED(x) (x & (mtd->oobblock-1)) != 0
|
||||
#define NOTALIGNED(x) (x & (mtd->writesize-1)) != 0
|
||||
|
||||
/**
|
||||
* nand_write - [MTD Interface] compability function for nand_write_ecc
|
||||
@@ -1694,7 +1694,7 @@ static int nand_write_ecc(struct mtd_info *mtd, loff_t to, size_t len,
|
||||
/* Next oob page */
|
||||
oob += mtd->oobsize;
|
||||
/* Update written bytes count */
|
||||
written += mtd->oobblock;
|
||||
written += mtd->writesize;
|
||||
if (written == len)
|
||||
goto cmp;
|
||||
|
||||
@@ -1805,7 +1805,7 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, size_t *r
|
||||
|
||||
if (NAND_MUST_PAD(this)) {
|
||||
/* Write out desired data */
|
||||
this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->oobblock, page & this->pagemask);
|
||||
this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page & this->pagemask);
|
||||
/* prepad 0xff for partial programming */
|
||||
this->write_buf(mtd, ffchars, column);
|
||||
/* write data */
|
||||
@@ -1814,7 +1814,7 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len, size_t *r
|
||||
this->write_buf(mtd, ffchars, mtd->oobsize - (len + column));
|
||||
} else {
|
||||
/* Write out desired data */
|
||||
this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->oobblock + column, page & this->pagemask);
|
||||
this->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize + column, page & this->pagemask);
|
||||
/* write data */
|
||||
this->write_buf(mtd, buf, len);
|
||||
}
|
||||
@@ -1947,7 +1947,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
|
||||
/* If the given tuple is >= pagesize then
|
||||
* write it out from the iov
|
||||
*/
|
||||
if ((vecs->iov_len - len) >= mtd->oobblock) {
|
||||
if ((vecs->iov_len - len) >= mtd->writesize) {
|
||||
/* Calc number of pages we can write
|
||||
* out of this iov in one go */
|
||||
numpages = (vecs->iov_len - len) >> this->page_shift;
|
||||
@@ -1967,8 +1967,8 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
|
||||
&oobbuf[oob], oobsel, i != numpages);
|
||||
if (ret)
|
||||
goto out;
|
||||
this->data_poi += mtd->oobblock;
|
||||
len += mtd->oobblock;
|
||||
this->data_poi += mtd->writesize;
|
||||
len += mtd->writesize;
|
||||
oob += mtd->oobsize;
|
||||
page++;
|
||||
}
|
||||
@@ -1983,7 +1983,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
|
||||
* tuple until we have a full page to write
|
||||
*/
|
||||
int cnt = 0;
|
||||
while (cnt < mtd->oobblock) {
|
||||
while (cnt < mtd->writesize) {
|
||||
if (vecs->iov_base != NULL && vecs->iov_len)
|
||||
this->data_buf[cnt++] = ((u_char *) vecs->iov_base)[len++];
|
||||
/* Check, if we have to switch to the next tuple */
|
||||
@@ -2009,7 +2009,7 @@ static int nand_writev_ecc(struct mtd_info *mtd, const struct kvec *vecs, unsign
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
written += mtd->oobblock * numpages;
|
||||
written += mtd->writesize * numpages;
|
||||
/* All done ? */
|
||||
if (!count)
|
||||
break;
|
||||
@@ -2411,10 +2411,10 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
/* The 4th id byte is the important one */
|
||||
extid = this->read_byte(mtd);
|
||||
/* Calc pagesize */
|
||||
mtd->oobblock = 1024 << (extid & 0x3);
|
||||
mtd->writesize = 1024 << (extid & 0x3);
|
||||
extid >>= 2;
|
||||
/* Calc oobsize */
|
||||
mtd->oobsize = (8 << (extid & 0x01)) * (mtd->oobblock >> 9);
|
||||
mtd->oobsize = (8 << (extid & 0x01)) * (mtd->writesize >> 9);
|
||||
extid >>= 2;
|
||||
/* Calc blocksize. Blocksize is multiples of 64KiB */
|
||||
mtd->erasesize = (64 * 1024) << (extid & 0x03);
|
||||
@@ -2426,8 +2426,8 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
/* Old devices have this data hardcoded in the
|
||||
* device id table */
|
||||
mtd->erasesize = nand_flash_ids[i].erasesize;
|
||||
mtd->oobblock = nand_flash_ids[i].pagesize;
|
||||
mtd->oobsize = mtd->oobblock / 32;
|
||||
mtd->writesize = nand_flash_ids[i].pagesize;
|
||||
mtd->oobsize = mtd->writesize / 32;
|
||||
busw = nand_flash_ids[i].options & NAND_BUSWIDTH_16;
|
||||
}
|
||||
|
||||
@@ -2451,12 +2451,12 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
}
|
||||
|
||||
/* Calculate the address shift from the page size */
|
||||
this->page_shift = ffs(mtd->oobblock) - 1;
|
||||
this->page_shift = ffs(mtd->writesize) - 1;
|
||||
this->bbt_erase_shift = this->phys_erase_shift = ffs(mtd->erasesize) - 1;
|
||||
this->chip_shift = ffs(this->chipsize) - 1;
|
||||
|
||||
/* Set the bad block position */
|
||||
this->badblockpos = mtd->oobblock > 512 ? NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
|
||||
this->badblockpos = mtd->writesize > 512 ? NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
|
||||
|
||||
/* Get chip options, preserve non chip based options */
|
||||
this->options &= ~NAND_CHIPOPTIONS_MSK;
|
||||
@@ -2476,7 +2476,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
this->erase_cmd = single_erase_cmd;
|
||||
|
||||
/* Do not replace user supplied command function ! */
|
||||
if (mtd->oobblock > 512 && this->cmdfunc == nand_command)
|
||||
if (mtd->writesize > 512 && this->cmdfunc == nand_command)
|
||||
this->cmdfunc = nand_command_lp;
|
||||
|
||||
printk(KERN_INFO "NAND device: Manufacturer ID:"
|
||||
@@ -2519,7 +2519,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
|
||||
if (!this->data_buf) {
|
||||
size_t len;
|
||||
len = mtd->oobblock + mtd->oobsize;
|
||||
len = mtd->writesize + mtd->oobsize;
|
||||
this->data_buf = kmalloc(len, GFP_KERNEL);
|
||||
if (!this->data_buf) {
|
||||
if (this->options & NAND_OOBBUF_ALLOC)
|
||||
@@ -2575,9 +2575,9 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
|
||||
switch (this->eccmode) {
|
||||
case NAND_ECC_HW12_2048:
|
||||
if (mtd->oobblock < 2048) {
|
||||
if (mtd->writesize < 2048) {
|
||||
printk(KERN_WARNING "2048 byte HW ECC not possible on %d byte page size, fallback to SW ECC\n",
|
||||
mtd->oobblock);
|
||||
mtd->writesize);
|
||||
this->eccmode = NAND_ECC_SOFT;
|
||||
this->calculate_ecc = nand_calculate_ecc;
|
||||
this->correct_data = nand_correct_data;
|
||||
@@ -2588,7 +2588,7 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
case NAND_ECC_HW3_512:
|
||||
case NAND_ECC_HW6_512:
|
||||
case NAND_ECC_HW8_512:
|
||||
if (mtd->oobblock == 256) {
|
||||
if (mtd->writesize == 256) {
|
||||
printk(KERN_WARNING "512 byte HW ECC not possible on 256 Byte pagesize, fallback to SW ECC \n");
|
||||
this->eccmode = NAND_ECC_SOFT;
|
||||
this->calculate_ecc = nand_calculate_ecc;
|
||||
@@ -2638,16 +2638,16 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
|
||||
/* Set the number of read / write steps for one page to ensure ECC generation */
|
||||
switch (this->eccmode) {
|
||||
case NAND_ECC_HW12_2048:
|
||||
this->eccsteps = mtd->oobblock / 2048;
|
||||
this->eccsteps = mtd->writesize / 2048;
|
||||
break;
|
||||
case NAND_ECC_HW3_512:
|
||||
case NAND_ECC_HW6_512:
|
||||
case NAND_ECC_HW8_512:
|
||||
this->eccsteps = mtd->oobblock / 512;
|
||||
this->eccsteps = mtd->writesize / 512;
|
||||
break;
|
||||
case NAND_ECC_HW3_256:
|
||||
case NAND_ECC_SOFT:
|
||||
this->eccsteps = mtd->oobblock / 256;
|
||||
this->eccsteps = mtd->writesize / 256;
|
||||
break;
|
||||
|
||||
case NAND_ECC_NONE:
|
||||
|
Reference in New Issue
Block a user