1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "nandfs.h"
4 #include "nandecc.h"
5 #include "local.h"
6
7 char *
nandfsreadpage(Nandfs * nandfs,void * buf,NandfsTags * tags,long block,int page,int reportbad,LogfsLowLevelReadResult * result)8 nandfsreadpage(Nandfs *nandfs, void *buf, NandfsTags *tags, long block, int page, int reportbad, LogfsLowLevelReadResult *result)
9 {
10 ulong ecc1, ecc2, storedecc1, storedecc2;
11 NandEccError e1, e2;
12 ulong rawoffset;
13 NandfsAuxiliary hdr;
14 char *errmsg;
15
16 rawoffset = nandfs->rawblocksize * (nandfs->baseblock + block) + NandfsFullSize * page;
17 errmsg = (*nandfs->read)(nandfs->magic, buf, NandfsPageSize, rawoffset);
18 if (errmsg)
19 return errmsg;
20 errmsg = (*nandfs->read)(nandfs->magic, &hdr, sizeof(hdr), rawoffset + NandfsPageSize);
21 if (errmsg)
22 return errmsg;
23 ecc1 = nandecc(buf);
24 ecc2 = nandecc((uchar *)buf + 256);
25 storedecc1 = getlittle3(hdr.ecc1);
26 storedecc2 = getlittle3(hdr.ecc2);
27 e1 = nandecccorrect(buf, ecc1, &storedecc1, reportbad);
28 e2 = nandecccorrect((uchar *)buf + 256, ecc2, &storedecc2, reportbad);
29 if (e1 == NandEccErrorBad || e2 == NandEccErrorBad)
30 *result = LogfsLowLevelReadResultHardError;
31 else if (e1 != NandEccErrorGood || e2 != NandEccErrorGood)
32 *result = LogfsLowLevelReadResultSoftError;
33 else
34 *result = LogfsLowLevelReadResultOk;
35 if (tags) {
36 *result = _nandfscorrectauxiliary(&hdr);
37 _nandfsextracttags(&hdr, tags);
38 }
39 return nil;
40 }
41
42 char *
nandfsreadpagerange(Nandfs * nandfs,void * buf,long block,int page,int offset,int count,LogfsLowLevelReadResult * result)43 nandfsreadpagerange(Nandfs *nandfs, void *buf, long block, int page, int offset, int count, LogfsLowLevelReadResult *result)
44 {
45 char *errmsg;
46 uchar tmpbuf[NandfsPageSize];
47 errmsg = nandfsreadpage(nandfs, tmpbuf, nil, block, page, 1, result);
48 if (errmsg == nil)
49 memmove(buf, tmpbuf + offset, count);
50 return errmsg;
51 }
52
53