1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "nandfs.h"
437da2899SCharles.Forsyth #include "local.h"
537da2899SCharles.Forsyth
637da2899SCharles.Forsyth /*
737da2899SCharles.Forsyth * update the tags in a page's auxiliary area
837da2899SCharles.Forsyth * only touch the fields if they contain some zeros, and compute the hamming codes
937da2899SCharles.Forsyth * as well
1037da2899SCharles.Forsyth */
1137da2899SCharles.Forsyth
1237da2899SCharles.Forsyth char *
nandfswritepageauxiliary(Nandfs * nandfs,NandfsTags * tags,long absblock,int page)1337da2899SCharles.Forsyth nandfswritepageauxiliary(Nandfs *nandfs, NandfsTags *tags, long absblock, int page)
1437da2899SCharles.Forsyth {
1537da2899SCharles.Forsyth NandfsAuxiliary hdr;
1637da2899SCharles.Forsyth ulong tmp;
1737da2899SCharles.Forsyth ushort htmp;
1837da2899SCharles.Forsyth
1937da2899SCharles.Forsyth memset(&hdr, 0xff, sizeof(hdr));
2037da2899SCharles.Forsyth if (tags->path < NandfsPathMask) {
2137da2899SCharles.Forsyth tmp = _nandfshamming31_26calc((tags->path << 6)) | (1 << 5);
2237da2899SCharles.Forsyth putbig4(hdr.parth, tmp);
2337da2899SCharles.Forsyth }
2437da2899SCharles.Forsyth if (tags->nerase < NandfsNeraseMask || tags->magic != 0xff) {
2537da2899SCharles.Forsyth tmp = _nandfshamming31_26calc((tags->magic << 24) | (tags->nerase << 6)) | (1 << 5);
2637da2899SCharles.Forsyth htmp = tmp >> 16;
2737da2899SCharles.Forsyth putbig2(hdr.nerasemagicmsw, htmp);
2837da2899SCharles.Forsyth putbig2(hdr.nerasemagiclsw, tmp);
2937da2899SCharles.Forsyth }
3037da2899SCharles.Forsyth if (tags->tag != 0xff)
3137da2899SCharles.Forsyth hdr.tag = tags->tag;
3237da2899SCharles.Forsyth return (*nandfs->write)(nandfs->magic, &hdr, sizeof(hdr), nandfs->rawblocksize * absblock + page * NandfsFullSize + NandfsPageSize);
3337da2899SCharles.Forsyth }
34