* Which filesystem can live on one flash sector? @ 2002-12-10 6:02 fred 2002-12-10 7:46 ` Jörn Engel 2002-12-10 17:28 ` Russ Dill 0 siblings, 2 replies; 13+ messages in thread From: fred @ 2002-12-10 6:02 UTC (permalink / raw) To: linuxppc-embedded, linux-mtd Hi, I am using CRAMFS plus RAMFS on my board. And there is only one sector left for saving configuration data. Can I put a file system, e.g. JFFS, on it? BR, Fred ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Which filesystem can live on one flash sector? 2002-12-10 6:02 Which filesystem can live on one flash sector? fred @ 2002-12-10 7:46 ` Jörn Engel 2002-12-10 17:28 ` Russ Dill 1 sibling, 0 replies; 13+ messages in thread From: Jörn Engel @ 2002-12-10 7:46 UTC (permalink / raw) To: fred; +Cc: linuxppc-embedded, linux-mtd On Tue, 10 December 2002 14:02:05 +0800, fred wrote: > > I am using CRAMFS plus RAMFS on my board. > And there is only one sector left for saving configuration data. > Can I put a file system, e.g. JFFS, on it? You can use ext2 or minix. The just ain't no journaling with only one erase block, so forget about jffs[12], ext3 and so on. Jörn -- My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. -- Edsger W. Dijkstra ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Which filesystem can live on one flash sector? 2002-12-10 6:02 Which filesystem can live on one flash sector? fred 2002-12-10 7:46 ` Jörn Engel @ 2002-12-10 17:28 ` Russ Dill 2002-12-10 23:29 ` NAND and concat Christian Gan 1 sibling, 1 reply; 13+ messages in thread From: Russ Dill @ 2002-12-10 17:28 UTC (permalink / raw) To: fred; +Cc: linuxppc-embedded, linux-mtd On Mon, 2002-12-09 at 23:02, fred wrote: > Hi, > > I am using CRAMFS plus RAMFS on my board. > And there is only one sector left for saving configuration data. > Can I put a file system, e.g. JFFS, on it? I'd make another block free and then do some sort of journalling from userspace (each data block has a header with crc, size, header crc, and revision). If you flash it boot block flash, the boot block may be the place to find a couple small free sectors. ^ permalink raw reply [flat|nested] 13+ messages in thread
* NAND and concat 2002-12-10 17:28 ` Russ Dill @ 2002-12-10 23:29 ` Christian Gan 2002-12-10 23:58 ` Charles Manning 2002-12-11 12:46 ` Robert Kaiser 0 siblings, 2 replies; 13+ messages in thread From: Christian Gan @ 2002-12-10 23:29 UTC (permalink / raw) To: linux-mtd, yaffs list Quick, but possibly loaded question: Is anyone working on concat for NAND flashes? I looked though and realised that there is no functionality at the moment for NAND (i.e. no support for read/write oob etc). ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: NAND and concat 2002-12-10 23:29 ` NAND and concat Christian Gan @ 2002-12-10 23:58 ` Charles Manning 2002-12-11 15:58 ` Christian Gan 2002-12-11 12:46 ` Robert Kaiser 1 sibling, 1 reply; 13+ messages in thread From: Charles Manning @ 2002-12-10 23:58 UTC (permalink / raw) To: Christian Gan, linux-mtd, yaffs list I'm not sure I understand what you mean by concat for NAND. Do you mean being able to read/write directly to the char device? Certainly handling OOB and pages makes things a bit different. Someone wrote a nand dumper which maybe does what you want (or can be persuaded :-). The yaffs format tool uses the char interface. It needs to expand to load up a mkyaffsimage image into flash. -- CHarles ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: NAND and concat 2002-12-10 23:58 ` Charles Manning @ 2002-12-11 15:58 ` Christian Gan 0 siblings, 0 replies; 13+ messages in thread From: Christian Gan @ 2002-12-11 15:58 UTC (permalink / raw) To: linux-mtd, yaffs list Sorry Charles, I think the title should have been "NAND and mtdconcat". :) > -----Original Message----- > From: linux-mtd-admin@lists.infradead.org > [mailto:linux-mtd-admin@lists.infradead.org]On Behalf Of Charles Manning > Sent: Tuesday, December 10, 2002 5:58 PM > To: Christian Gan; linux-mtd@lists.infradead.org; yaffs list > Subject: Re: NAND and concat > > > I'm not sure I understand what you mean by concat for NAND. Do > you mean being > able to read/write directly to the char device? > > Certainly handling OOB and pages makes things a bit different. > Someone wrote > a nand dumper which maybe does what you want (or can be persuaded > :-). The > yaffs format tool uses the char interface. It needs to expand to > load up a > mkyaffsimage image into flash. > > -- CHarles > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: NAND and concat 2002-12-10 23:29 ` NAND and concat Christian Gan 2002-12-10 23:58 ` Charles Manning @ 2002-12-11 12:46 ` Robert Kaiser 2002-12-11 15:57 ` Christian Gan 2003-03-05 19:21 ` [PATCH] NAND and mtdconcat Christian Gan 1 sibling, 2 replies; 13+ messages in thread From: Robert Kaiser @ 2002-12-11 12:46 UTC (permalink / raw) To: Christian Gan, linux-mtd, yaffs list Am Mittwoch, 11. Dezember 2002 00:29 schrieb Christian Gan: > Is anyone working on concat for NAND flashes? Probably not. > I looked though and realised > that there is no functionality at the moment for NAND (i.e. no support for > read/write oob etc). I must admit that I knew nothing about NAND flashes when I wrote the concat stuff (and this hasn't improved much in the meantime) :-(. OTOH, all the concat stuff does is to redirect calls to the hardware drivers, so, except for the maintaining of OOB data, what NAND specific functionality would be needed ? Rob ---------------------------------------------------------------- Robert Kaiser email: rkaiser@sysgo.de SYSGO AG Am Pfaffenstein 14 phone: (49) 6136 9948-762 D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10 ^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: NAND and concat 2002-12-11 12:46 ` Robert Kaiser @ 2002-12-11 15:57 ` Christian Gan 2003-03-05 19:21 ` [PATCH] NAND and mtdconcat Christian Gan 1 sibling, 0 replies; 13+ messages in thread From: Christian Gan @ 2002-12-11 15:57 UTC (permalink / raw) To: rkaiser, linux-mtd, yaffs list I haven't really given it much thought either, but off the top of my head: 1. read_ecc and write_ecc 2. read_oob and write_oob But really, I think this may be OK to do. Since I need something like this for my project anyways I can give it a shot and test. Everything else should be useable as is. If anyone can think of anything I should watch out for, advice would be great. > -----Original Message----- > From: linux-mtd-admin@lists.infradead.org > [mailto:linux-mtd-admin@lists.infradead.org]On Behalf Of Robert Kaiser > Sent: Wednesday, December 11, 2002 6:47 AM > To: Christian Gan; linux-mtd@lists.infradead.org; yaffs list > Subject: Re: NAND and concat > > > Am Mittwoch, 11. Dezember 2002 00:29 schrieb Christian Gan: > > Is anyone working on concat for NAND flashes? > > Probably not. > > > I looked though and realised > > that there is no functionality at the moment for NAND (i.e. no > support for > > read/write oob etc). > > I must admit that I knew nothing about NAND flashes when I wrote > the concat > stuff (and this hasn't improved much in the meantime) :-(. > > OTOH, all the concat stuff does is to redirect calls to the > hardware drivers, > so, except for the maintaining of OOB data, what NAND specific > functionality > would be needed ? > > Rob > > ---------------------------------------------------------------- > Robert Kaiser email: rkaiser@sysgo.de > SYSGO AG > Am Pfaffenstein 14 phone: (49) 6136 9948-762 > D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10 > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] NAND and mtdconcat 2002-12-11 12:46 ` Robert Kaiser 2002-12-11 15:57 ` Christian Gan @ 2003-03-05 19:21 ` Christian Gan 2003-03-06 12:10 ` Robert Kaiser 1 sibling, 1 reply; 13+ messages in thread From: Christian Gan @ 2003-03-05 19:21 UTC (permalink / raw) To: linux-mtd This is a multi-part message in MIME format. ------=_NextPart_000_0132_01C2E31A.116CC0F0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hello all, Attached is a patch for mtdconcat.c that supports NAND functions for the oob. I've tested it on my own bench and it seems to work great on two 64MB NANDs concatenated into one MTD. Robert, since you were the original author of this file, can you verify it for me? Thanks! ------=_NextPart_000_0132_01C2E31A.116CC0F0 Content-Type: application/octet-stream; name="mtdconcat.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="mtdconcat.diff" Index: mtdconcat.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /home/cvs/mtd/drivers/mtd/mtdconcat.c,v=0A= retrieving revision 1.3=0A= diff -u -r1.3 mtdconcat.c=0A= --- mtdconcat.c 21 May 2002 21:04:25 -0000 1.3=0A= +++ mtdconcat.c 5 Mar 2003 19:13:45 -0000=0A= @@ -52,6 +52,8 @@=0A= size_t *retlen, u_char *buf)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= int err =3D -EINVAL;=0A= int i;=0A= =0A= @@ -59,20 +61,21 @@=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= - size_t size, retsize;=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= =0A= if (from >=3D subdev->size)=0A= - {=0A= + { /* Not destined for this subdev */=0A= size =3D 0;=0A= from -=3D subdev->size;=0A= }=0A= else=0A= {=0A= if (from + len > subdev->size)=0A= - size =3D subdev->size - from;=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= else=0A= - size =3D len;=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= =0A= err =3D subdev->read(subdev, from, size, &retsize, buf);=0A= =0A= @@ -96,6 +99,8 @@=0A= size_t *retlen, const u_char *buf)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= int err =3D -EINVAL;=0A= int i;=0A= =0A= @@ -106,8 +111,9 @@=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= - size_t size, retsize;=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= =0A= if (to >=3D subdev->size)=0A= {=0A= @@ -142,6 +148,226 @@=0A= return err;=0A= }=0A= =0A= +static int concat_read_ecc (struct mtd_info *mtd, loff_t from, size_t = len,=0A= + size_t *retlen, u_char *buf, u_char *eccbuf, int oobsel)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= +=0A= + if (from >=3D subdev->size)=0A= + { /* Not destined for this subdev */=0A= + size =3D 0;=0A= + from -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (from + len > subdev->size)=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= + else=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= + =0A= + if (subdev->read_ecc)=0A= + err =3D subdev->read_ecc(subdev, from, size, &retsize, buf, = eccbuf, oobsel);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + if (eccbuf)=0A= + {=0A= + eccbuf +=3D subdev->oobsize;=0A= + /* in nand.c at least, eccbufs are tagged with 2 = (int)eccstatus',=0A= + we must account for these */=0A= + eccbuf +=3D 2 * (sizeof(int)); =0A= + }=0A= + from =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_write_ecc (struct mtd_info *mtd, loff_t to, size_t = len,=0A= + size_t *retlen, const u_char *buf, u_char *eccbuf, int = oobsel)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + if (!(mtd->flags & MTD_WRITEABLE))=0A= + return -EROFS;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= +=0A= + if (to >=3D subdev->size)=0A= + {=0A= + size =3D 0;=0A= + to -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (to + len > subdev->size)=0A= + size =3D subdev->size - to;=0A= + else=0A= + size =3D len;=0A= +=0A= + if (!(subdev->flags & MTD_WRITEABLE))=0A= + err =3D -EROFS;=0A= + else if (subdev->write_ecc)=0A= + err =3D subdev->write_ecc(subdev, to, size, &retsize, buf, eccbuf, = oobsel);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + if (eccbuf)=0A= + eccbuf +=3D subdev->oobsize;=0A= + to =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_read_oob (struct mtd_info *mtd, loff_t from, size_t = len,=0A= + size_t *retlen, u_char *buf)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= +=0A= + if (from >=3D subdev->size)=0A= + { /* Not destined for this subdev */=0A= + size =3D 0;=0A= + from -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (from + len > subdev->size)=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= + else=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= + =0A= + if (subdev->read_oob)=0A= + err =3D subdev->read_oob(subdev, from, size, &retsize, buf);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + from =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_write_oob (struct mtd_info *mtd, loff_t to, size_t = len, =0A= + size_t *retlen, const u_char *buf)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size, retsize;=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + if (!(mtd->flags & MTD_WRITEABLE))=0A= + return -EROFS;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= + retsize =3D 0;=0A= +=0A= + if (to >=3D subdev->size)=0A= + {=0A= + size =3D 0;=0A= + to -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (to + len > subdev->size)=0A= + size =3D subdev->size - to;=0A= + else=0A= + size =3D len;=0A= +=0A= + if (!(subdev->flags & MTD_WRITEABLE))=0A= + err =3D -EROFS;=0A= + else if (subdev->write_oob)=0A= + err =3D subdev->write_oob(subdev, to, size, &retsize, buf);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + to =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +=0A= static void concat_erase_callback (struct erase_info *instr)=0A= {=0A= wake_up((wait_queue_head_t *)instr->priv);=0A= @@ -316,6 +542,8 @@=0A= static int concat_lock (struct mtd_info *mtd, loff_t ofs, size_t len)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size;=0A= int i, err =3D -EINVAL;=0A= =0A= if ((len + ofs) > mtd->size) =0A= @@ -323,8 +551,8 @@=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= - size_t size;=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= =0A= if (ofs >=3D subdev->size)=0A= {=0A= @@ -357,6 +585,8 @@=0A= static int concat_unlock (struct mtd_info *mtd, loff_t ofs, size_t len)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL;=0A= + size_t size;=0A= int i, err =3D 0;=0A= =0A= if ((len + ofs) > mtd->size) =0A= @@ -364,8 +594,8 @@=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= - size_t size;=0A= + subdev =3D concat->subdev[i];=0A= + size =3D 0;=0A= =0A= if (ofs >=3D subdev->size)=0A= {=0A= @@ -398,11 +628,12 @@=0A= static void concat_sync(struct mtd_info *mtd)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL; =0A= int i;=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= + subdev =3D concat->subdev[i];=0A= subdev->sync(subdev);=0A= }=0A= }=0A= @@ -410,11 +641,12 @@=0A= static int concat_suspend(struct mtd_info *mtd)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL; =0A= int i, rc =3D 0;=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= + subdev =3D concat->subdev[i];=0A= if((rc =3D subdev->suspend(subdev)) < 0)=0A= return rc;=0A= }=0A= @@ -424,11 +656,12 @@=0A= static void concat_resume(struct mtd_info *mtd)=0A= {=0A= struct mtd_concat *concat =3D CONCAT(mtd);=0A= + struct mtd_info *subdev =3D NULL; =0A= int i;=0A= =0A= for(i =3D 0; i < concat->num_subdev; i++)=0A= {=0A= - struct mtd_info *subdev =3D concat->subdev[i];=0A= + subdev =3D concat->subdev[i]; =0A= subdev->resume(subdev);=0A= }=0A= }=0A= @@ -526,9 +759,13 @@=0A= * because they are messy to implement and they are not=0A= * used to a great extent anyway.=0A= */=0A= - concat->mtd.erase =3D concat_erase;=0A= - concat->mtd.read =3D concat_read;=0A= - concat->mtd.write =3D concat_write;=0A= + concat->mtd.erase =3D concat_erase;=0A= + concat->mtd.read =3D concat_read; =0A= + concat->mtd.write =3D concat_write;=0A= + concat->mtd.read_ecc =3D concat_read_ecc; =0A= + concat->mtd.write_ecc =3D concat_write_ecc;=0A= + concat->mtd.read_oob =3D concat_read_oob; =0A= + concat->mtd.write_oob =3D concat_write_oob;=0A= concat->mtd.sync =3D concat_sync;=0A= concat->mtd.lock =3D concat_lock;=0A= concat->mtd.unlock =3D concat_unlock;=0A= ------=_NextPart_000_0132_01C2E31A.116CC0F0-- ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] NAND and mtdconcat 2003-03-05 19:21 ` [PATCH] NAND and mtdconcat Christian Gan @ 2003-03-06 12:10 ` Robert Kaiser 2003-03-06 23:10 ` Christian Gan 0 siblings, 1 reply; 13+ messages in thread From: Robert Kaiser @ 2003-03-06 12:10 UTC (permalink / raw) To: linux-mtd Christian, Am Mittwoch, 5. M?rz 2003 20:21 schrieb Christian Gan: > Hello all, > > Attached is a patch for mtdconcat.c that supports NAND functions for the > oob. I've tested it on my own bench and it seems to work great on two 64MB > NANDs concatenated into one MTD. > > Robert, since you were the original author of this file, can you verify it > for me? Looks OK to me. I can't test it right now as I don't have any suitable HW available, but I'll take your word that it works ;-) One question though, you made changes like this: @@ -410,11 +641,12 @@ static int concat_suspend(struct mtd_info *mtd) { struct mtd_concat *concat = CONCAT(mtd); + struct mtd_info *subdev = NULL; int i, rc = 0; for(i = 0; i < concat->num_subdev; i++) { - struct mtd_info *subdev = concat->subdev[i]; + subdev = concat->subdev[i]; if((rc = subdev->suspend(subdev)) < 0) return rc; } @@ -424,11 +656,12 @@ all over the place. Why? This might generate slightly more code and be slower (not that it would be noticeable though). Other than that, I have no objections. Rob ---------------------------------------------------------------- Robert Kaiser email: rkaiser@sysgo.de SYSGO AG Am Pfaffenstein 14 phone: (49) 6136 9948-762 D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] NAND and mtdconcat 2003-03-06 12:10 ` Robert Kaiser @ 2003-03-06 23:10 ` Christian Gan 0 siblings, 0 replies; 13+ messages in thread From: Christian Gan @ 2003-03-06 23:10 UTC (permalink / raw) To: linux-mtd This is a multi-part message in MIME format. ------=_NextPart_000_015B_01C2E403.4B14E2D0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hey all, Updated patch included with Robert's suggestions. I agree that either style is a non-factor in performance, so I might as well use the original style because it's cleaner. Thanks! Christian > -----Original Message----- > From: linux-mtd-admin at lists.infradead.org > [mailto:linux-mtd-admin at lists.infradead.org]On Behalf Of Robert Kaiser > Sent: Thursday, March 06, 2003 6:10 AM > To: Christian Gan; rkaiser at sysgo.de; linux-mtd at lists.infradead.org; > yaffs list > Subject: Re: [PATCH] NAND and mtdconcat > > > Christian, > > > Am Mittwoch, 5. M?rz 2003 20:21 schrieb Christian Gan: > > Hello all, > > > > Attached is a patch for mtdconcat.c that supports NAND functions for the > > oob. I've tested it on my own bench and it seems to work great > on two 64MB > > NANDs concatenated into one MTD. > > > > Robert, since you were the original author of this file, can > you verify it > > for me? > > Looks OK to me. I can't test it right now as I don't have any suitable HW > available, but I'll take your word that it works ;-) > > One question though, you made changes like this: > > > @@ -410,11 +641,12 @@ > static int concat_suspend(struct mtd_info *mtd) > { > struct mtd_concat *concat = CONCAT(mtd); > + struct mtd_info *subdev = NULL; > int i, rc = 0; > > for(i = 0; i < concat->num_subdev; i++) > { > - struct mtd_info *subdev = concat->subdev[i]; > + subdev = concat->subdev[i]; > if((rc = subdev->suspend(subdev)) < 0) > return rc; > } > @@ -424,11 +656,12 @@ > > all over the place. Why? This might generate slightly more code > and be slower > (not that it would be noticeable though). > > Other than that, I have no objections. > > Rob > > > ---------------------------------------------------------------- > Robert Kaiser email: rkaiser at sysgo.de > SYSGO AG > Am Pfaffenstein 14 phone: (49) 6136 9948-762 > D-55270 Klein-Winternheim / Germany fax: (49) 6136 9948-10 > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ > ------=_NextPart_000_015B_01C2E403.4B14E2D0 Content-Type: application/octet-stream; name="mtdconcat.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="mtdconcat.diff" Index: mtdconcat.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /home/cvs/mtd/drivers/mtd/mtdconcat.c,v=0A= retrieving revision 1.3=0A= diff -u -r1.3 mtdconcat.c=0A= --- mtdconcat.c 21 May 2002 21:04:25 -0000 1.3=0A= +++ mtdconcat.c 6 Mar 2003 19:50:31 -0000=0A= @@ -63,16 +63,16 @@=0A= size_t size, retsize;=0A= =0A= if (from >=3D subdev->size)=0A= - {=0A= + { /* Not destined for this subdev */=0A= size =3D 0;=0A= from -=3D subdev->size;=0A= }=0A= else=0A= {=0A= if (from + len > subdev->size)=0A= - size =3D subdev->size - from;=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= else=0A= - size =3D len;=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= =0A= err =3D subdev->read(subdev, from, size, &retsize, buf);=0A= =0A= @@ -142,6 +142,214 @@=0A= return err;=0A= }=0A= =0A= +static int concat_read_ecc (struct mtd_info *mtd, loff_t from, size_t = len,=0A= + size_t *retlen, u_char *buf, u_char *eccbuf, int oobsel)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + struct mtd_info *subdev =3D concat->subdev[i];=0A= + size_t size, retsize;=0A= + =0A= + if (from >=3D subdev->size)=0A= + { /* Not destined for this subdev */=0A= + size =3D 0;=0A= + from -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (from + len > subdev->size)=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= + else=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= + =0A= + if (subdev->read_ecc)=0A= + err =3D subdev->read_ecc(subdev, from, size, &retsize, buf, = eccbuf, oobsel);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + if (eccbuf)=0A= + {=0A= + eccbuf +=3D subdev->oobsize;=0A= + /* in nand.c at least, eccbufs are tagged with 2 = (int)eccstatus',=0A= + we must account for these */=0A= + eccbuf +=3D 2 * (sizeof(int)); =0A= + }=0A= + from =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_write_ecc (struct mtd_info *mtd, loff_t to, size_t = len,=0A= + size_t *retlen, const u_char *buf, u_char *eccbuf, int = oobsel)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + if (!(mtd->flags & MTD_WRITEABLE))=0A= + return -EROFS;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + struct mtd_info *subdev =3D concat->subdev[i];=0A= + size_t size, retsize;=0A= + =0A= + if (to >=3D subdev->size)=0A= + {=0A= + size =3D 0;=0A= + to -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (to + len > subdev->size)=0A= + size =3D subdev->size - to;=0A= + else=0A= + size =3D len;=0A= +=0A= + if (!(subdev->flags & MTD_WRITEABLE))=0A= + err =3D -EROFS;=0A= + else if (subdev->write_ecc)=0A= + err =3D subdev->write_ecc(subdev, to, size, &retsize, buf, eccbuf, = oobsel);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + if (eccbuf)=0A= + eccbuf +=3D subdev->oobsize;=0A= + to =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_read_oob (struct mtd_info *mtd, loff_t from, size_t = len,=0A= + size_t *retlen, u_char *buf)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + struct mtd_info *subdev =3D concat->subdev[i];=0A= + size_t size, retsize;=0A= + =0A= + if (from >=3D subdev->size)=0A= + { /* Not destined for this subdev */=0A= + size =3D 0;=0A= + from -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (from + len > subdev->size)=0A= + size =3D subdev->size - from; /* First part goes into this subdev */=0A= + else=0A= + size =3D len; /* Entire transaction goes into this subdev */=0A= + =0A= + if (subdev->read_oob)=0A= + err =3D subdev->read_oob(subdev, from, size, &retsize, buf);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + from =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +static int concat_write_oob (struct mtd_info *mtd, loff_t to, size_t = len, =0A= + size_t *retlen, const u_char *buf)=0A= +{=0A= + struct mtd_concat *concat =3D CONCAT(mtd);=0A= + int err =3D -EINVAL;=0A= + int i;=0A= +=0A= + if (!(mtd->flags & MTD_WRITEABLE))=0A= + return -EROFS;=0A= +=0A= + *retlen =3D 0;=0A= +=0A= + for(i =3D 0; i < concat->num_subdev; i++)=0A= + {=0A= + struct mtd_info *subdev =3D concat->subdev[i];=0A= + size_t size, retsize;=0A= + =0A= + if (to >=3D subdev->size)=0A= + {=0A= + size =3D 0;=0A= + to -=3D subdev->size;=0A= + }=0A= + else=0A= + {=0A= + if (to + len > subdev->size)=0A= + size =3D subdev->size - to;=0A= + else=0A= + size =3D len;=0A= +=0A= + if (!(subdev->flags & MTD_WRITEABLE))=0A= + err =3D -EROFS;=0A= + else if (subdev->write_oob)=0A= + err =3D subdev->write_oob(subdev, to, size, &retsize, buf);=0A= + else=0A= + err =3D -EINVAL;=0A= +=0A= + if(err)=0A= + break;=0A= +=0A= + *retlen +=3D retsize;=0A= + len -=3D size;=0A= + if(len =3D=3D 0)=0A= + break;=0A= +=0A= + err =3D -EINVAL;=0A= + buf +=3D size;=0A= + to =3D 0;=0A= + }=0A= + }=0A= + return err;=0A= +}=0A= +=0A= +=0A= static void concat_erase_callback (struct erase_info *instr)=0A= {=0A= wake_up((wait_queue_head_t *)instr->priv);=0A= @@ -526,9 +734,13 @@=0A= * because they are messy to implement and they are not=0A= * used to a great extent anyway.=0A= */=0A= - concat->mtd.erase =3D concat_erase;=0A= - concat->mtd.read =3D concat_read;=0A= - concat->mtd.write =3D concat_write;=0A= + concat->mtd.erase =3D concat_erase;=0A= + concat->mtd.read =3D concat_read; =0A= + concat->mtd.write =3D concat_write;=0A= + concat->mtd.read_ecc =3D concat_read_ecc; =0A= + concat->mtd.write_ecc =3D concat_write_ecc;=0A= + concat->mtd.read_oob =3D concat_read_oob; =0A= + concat->mtd.write_oob =3D concat_write_oob;=0A= concat->mtd.sync =3D concat_sync;=0A= concat->mtd.lock =3D concat_lock;=0A= concat->mtd.unlock =3D concat_unlock;=0A= ------=_NextPart_000_015B_01C2E403.4B14E2D0-- ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20021210071208.F30D7154A1@dragon.actrix.co.nz>]
* RE: Which filesystem can live on one flash sector? [not found] <20021210071208.F30D7154A1@dragon.actrix.co.nz> @ 2002-12-10 13:56 ` fred 2002-12-10 14:18 ` Jörn Engel 0 siblings, 1 reply; 13+ messages in thread From: fred @ 2002-12-10 13:56 UTC (permalink / raw) To: manningc2; +Cc: linux-mtd Ok, I understand I can't run JFFS at only one sector. In fact, I have 64k space left for saving configuration data. The size of a sector is 64k normally except the bottom sectors that are 8k, 4k, 4k, 16k, 32k. So you see, I have five sectors to run JFFS rather than one 64k sector. Then, is it possible to run JFFS on these sectors? -----Original Message----- From: Charles Manning [mailto:manningc2@actrix.gen.nz] Sent: Tuesday, December 10, 2002 3:07 PM To: fred@sc23.sc.mcel.mot.com Subject: Re: Which filesystem can live on one flash sector? On Tue, 10 Dec 2002 19:02, you wrote: > Hi, > > I am using CRAMFS plus RAMFS on my board. > And there is only one sector left for saving configuration data. > Can I put a file system, e.g. JFFS, on it? I don't see how any fs - alive or dead - could live in one sector. You need at least one free sector to do garbage collection. (more for any real file system). Sounds to me like you'll just have to use it as raw flash. -- Charles ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Which filesystem can live on one flash sector? 2002-12-10 13:56 ` Which filesystem can live on one flash sector? fred @ 2002-12-10 14:18 ` Jörn Engel 0 siblings, 0 replies; 13+ messages in thread From: Jörn Engel @ 2002-12-10 14:18 UTC (permalink / raw) To: fred; +Cc: linux-mtd On Tue, 10 December 2002 21:56:31 +0800, fred wrote: > > Ok, I understand I can't run JFFS at only one sector. > > In fact, I have 64k space left for saving configuration data. > The size of a sector is 64k normally except the bottom sectors that are 8k, > 4k, 4k, 16k, 32k. > So you see, I have five sectors to run JFFS rather than one 64k sector. > Then, is it possible to run JFFS on these sectors? Yes, jffs (not jffs2) would be working on those sectors. But I fear that the partition code doesn't treat them seperately, so jffs will only see one sector and won't work. You should tweak the partition code or provide your own mapping driver to get it working. Something like that Jörn -- Everything should be made as simple as possible, but not simpler. -- Albert Einstein ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2003-03-06 23:10 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-10 6:02 Which filesystem can live on one flash sector? fred
2002-12-10 7:46 ` Jörn Engel
2002-12-10 17:28 ` Russ Dill
2002-12-10 23:29 ` NAND and concat Christian Gan
2002-12-10 23:58 ` Charles Manning
2002-12-11 15:58 ` Christian Gan
2002-12-11 12:46 ` Robert Kaiser
2002-12-11 15:57 ` Christian Gan
2003-03-05 19:21 ` [PATCH] NAND and mtdconcat Christian Gan
2003-03-06 12:10 ` Robert Kaiser
2003-03-06 23:10 ` Christian Gan
[not found] <20021210071208.F30D7154A1@dragon.actrix.co.nz>
2002-12-10 13:56 ` Which filesystem can live on one flash sector? fred
2002-12-10 14:18 ` Jörn Engel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox