muti-page-rw.diff follow-up
I hope my modifications doesnt break nftl. I needed modifications to make jffs work on the DOC. I am going to do the same to the DOCmil driver when I have read through the docs. I have broken the ecc functions in the doc2000 driver im afraid. I am fixing it now and I will send patches when I am done. The diff is against mtd-snapshot-20000725.
kernel/doc2000.c +70 -25
@@ -496,18 +496,37 @@unsigned long docptr;struct Nand *mychip; +loff_t subfrom; +size_t sublen; +u_char *pos; +int multipage =0 ; +loff_t end = from + len; + docptr = this->virtadr; + *retlen =0 ; + sublen = len; + subfrom = from; + pos = buf; +/* Don't allow read past end of device */ if (from >= this->totlen)return -EINVAL ; - -/* Don't allow a single read to cross a 512-byte block boundary */ -if (from + len > ( (from |0x1ff ) +1 )) - len = ((from |0x1ff ) +1 ) - from; +if ((subfrom + sublen) > ((subfrom |0x1ff ) +1 )) { + multipage =1 ; + sublen = ((subfrom |0x1ff ) +1 ) - subfrom; + } +do { + if ((subfrom + 512) > end) { + multipage = 0; + sublen = end - subfrom; + if (!sublen) break; + } + + /* Find the chip which is to be used and select it */ - mychip = &this->chips[from >> (this->chipshift)]; + mychip = &this->chips[subfrom >> (this->chipshift)]; if (this->curfloor != mychip->floor) { DoC_SelectFloor(docptr, mychip->floor);
@@ -527,15 +546,15 @@WriteDOC (DOC_ECC_EN , docptr, ECCConf); } -DoC_Command (docptr, (from >>8 ) &1 ,CDSN_CTRL_WP ); -DoC_Address (docptr,3 , from,CDSN_CTRL_WP ,CDSN_CTRL_ECC_IO ); +DoC_Command (docptr, (subfrom >>8 ) &1 ,CDSN_CTRL_WP ); +DoC_Address (docptr,3 , subfrom,CDSN_CTRL_WP ,CDSN_CTRL_ECC_IO ); -for (di=0 ; di < len ; di++) { - buf[di] = ReadDOC(docptr, 2k_CDSN_IO); +for (di=0 ; di < sublen ; di++) { + pos[di] = ReadDOC(docptr, 2k_CDSN_IO); }/* Let the caller know we completed it */ - *retlen = len; + *retlen += sublen;if (eccbuf) {/* Read the ECC data through the DiskOnChip ECC logic */
@@ -571,6 +590,14 @@ } +if (multipage){ + subfrom += sublen; + pos += sublen; + sublen =512 ; + } + +}while (multipage); +return 0 ; }
@@ -587,24 +614,36 @@unsigned long docptr;struct Nand *mychip; +loff_t subto; +size_t sublen; +u_char *pos; +int multipage =0 ; +loff_t end = to + len; + docptr = this->virtadr; + *retlen =0 ; + sublen = len; + subto = to; + pos = buf; +/* Don't allow write past end of device */ if (to >= this->totlen)return -EINVAL ; -#if 0 -/* Don't allow a single write to cross a 512-byte block boundary */ -if (to + len > ( (to |0x1ff ) +1 )) - len = ((to |0x1ff ) +1 ) - to; - -#else -/* Don't allow writes which aren't exactly one block */ -if (to &0x1ff || len !=0x200 ) -return -EINVAL ; -#endif +if ((subto + sublen) > ((subto |0x1ff ) +1 )) { + multipage =1 ; + sublen = ((subto |0x1ff ) +1 ) - subto; + } +do { + if ((subto + 512) > end) { + multipage = 0; + sublen = end - subto; + if (!sublen) break; + } + /* Find the chip which is to be used and select it */ - mychip = &this->chips[to >> (this->chipshift)]; + mychip = &this->chips[subto >> (this->chipshift)]; if (this->curfloor != mychip->floor) { DoC_SelectFloor(docptr, mychip->floor);
@@ -628,10 +667,10 @@ }DoC_Command (docptr,NAND_CMD_SEQIN ,0 ); -DoC_Address (docptr,3 , to,0 ,CDSN_CTRL_ECC_IO ); +DoC_Address (docptr,3 , subto,0 ,CDSN_CTRL_ECC_IO ); -for (di=0 ; di < len ; di++) { - WriteDOC(buf[di], docptr, 2k_CDSN_IO); +for (di=0 ; di < sublen ; di++) { + WriteDOC(pos[di], docptr, 2k_CDSN_IO); }
@@ -675,8 +714,14 @@ }/* Let the caller know we completed it */ - *retlen = len; + *retlen += sublen; +if (multipage){ + subto += sublen; + pos += sublen; + sublen =512 ; + } +}while (multipage);return 0 ; }
Quoted 7 lines · Rogelio M. Serrano Jr.
I hope my modifications doesnt break nftl. I needed modifications to make jffs work on the DOC. I am going to do the same to the DOCmil driver when I have read through the docs. I have broken the ecc functions in the doc2000 driver im afraid. I am fixing it now and I will send patches when I am done. The diff is against mtd-snapshot-20000725.
I will try the DoC Mil part. Rogelio, please be careful that the ECC logic and CDSNIO register should be programmed "as is" in the source I sent to you. Or it will not work at all.
P.S. there seems to be some small bugs in the DoC Mil driver and I think I have found the solution. I will send you a patch soon.
P.S. 2. David, did you commit the patch to CVS ??
Ollie
To unsubscribe, send "unsubscribe mtd" to [email protected]
Quoted 4 lines · [email protected] said:
P.S. there seems to be some small bugs in the DoC Mil driver and I
think I have found the solution. I will send you a patch soon.
P.S. 2. David, did you commit the patch to CVS ??
I didn't - sorry, I got back from OLS on Monday, spent most of Monday sleeping and haven't caught up yet. Should I wait for your new patch.
Anyone else who sent me patches which I haven't yet applied - please could you resend your latest version, made against the most recent snapshot?
Rogelio - could you test NFTL or find someone to do so and let me know when it's safe to merge your new patch?
--
dwmw2
To unsubscribe, send "unsubscribe mtd" to [email protected]
Quoted 5 lines · David Woodhouse
Quoted 2 lines · [email protected] said:
P.S. there seems to be some small bugs in the DoC Mil driver and I
think I have found the solution. I will send you a patch soon.
Quoted 8 lines
Quoted 1 line
P.S. 2. David, did you commit the patch to CVS ??I didn't - sorry, I got back from OLS on Monday, spent most of Monday sleeping and haven't caught up yet. Should I wait for your new patch.
Anyone else who sent me patches which I haven't yet applied - please could you resend your latest version, made against the most recent snapshot?
Attached. The ECC logic should be really correct this time.
Ollie