1*28942eadSforsyth typedef struct NandfsBlockData NandfsBlockData; 2*28942eadSforsyth typedef struct NandfsAuxiliary NandfsAuxiliary; 3*28942eadSforsyth 4*28942eadSforsyth struct NandfsBlockData { 537da2899SCharles.Forsyth ulong path; 637da2899SCharles.Forsyth short tag; 737da2899SCharles.Forsyth ulong nerase; 837da2899SCharles.Forsyth int partial; 9*28942eadSforsyth }; 1037da2899SCharles.Forsyth 1137da2899SCharles.Forsyth struct Nandfs { 1237da2899SCharles.Forsyth LogfsLowLevel ll; 13*28942eadSforsyth char *(*read)(void*, void*, long, ulong); 14*28942eadSforsyth char *(*write)(void*, void*, long, ulong); 15*28942eadSforsyth char *(*erase)(void*, long blockaddr); 16*28942eadSforsyth char *(*sync)(void*); 1737da2899SCharles.Forsyth void *magic; 1837da2899SCharles.Forsyth long rawblocksize; 1937da2899SCharles.Forsyth long baseblock; 2037da2899SCharles.Forsyth long limitblock; 2137da2899SCharles.Forsyth NandfsBlockData *blockdata; 2237da2899SCharles.Forsyth int trace; 2337da2899SCharles.Forsyth int worseblocks; 2437da2899SCharles.Forsyth int printbad; 2537da2899SCharles.Forsyth }; 2637da2899SCharles.Forsyth 27*28942eadSforsyth struct NandfsAuxiliary { 2837da2899SCharles.Forsyth uchar parth[4]; // ggpppppp pppppppp pppppppp pp1hhhhh (bigendian) self-protected 2937da2899SCharles.Forsyth uchar tag; // self-protecting 3037da2899SCharles.Forsyth uchar blockstatus; // self-protecting 3137da2899SCharles.Forsyth uchar nerasemagicmsw[2]; // see nerasemagiclsw 3237da2899SCharles.Forsyth uchar ecc2[3]; // self-protecting 3337da2899SCharles.Forsyth uchar nerasemagiclsw[2]; // mmmmmm mmeeeeee eeeeeeeeee ee1hhhhh (bigendian) self-protected 3437da2899SCharles.Forsyth uchar ecc1[3]; // self-protecting 35*28942eadSforsyth }; 3637da2899SCharles.Forsyth 3737da2899SCharles.Forsyth #define getbig2(p) (((p)[0] << 8) | (p)[1]) 3837da2899SCharles.Forsyth #define getbig4(p) (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | (p)[3]) 3937da2899SCharles.Forsyth #define getlittle3(p) (((p)[2] << 16) | ((p)[1] << 8) | (p)[0]) 4037da2899SCharles.Forsyth #define putlittle3(p, q) ((p)[0] = (q), (p)[1] = (q) >> 8, (p)[2] = (q) >> 16) 4137da2899SCharles.Forsyth #define putbig2(p, q) ((p)[0] = (q) >> 8, (p)[1] = (q)) 4237da2899SCharles.Forsyth #define putbig4(p, q) ((p)[0] = (q) >> 24, (p)[1] = (q) >> 16, (p)[2] = (q) >> 8, (p)[3] = (q)) 4337da2899SCharles.Forsyth 44*28942eadSforsyth LogfsLowLevelReadResult _nandfscorrectauxiliary(NandfsAuxiliary*); 4537da2899SCharles.Forsyth 4637da2899SCharles.Forsyth extern uchar _nandfsvalidtags[]; 4737da2899SCharles.Forsyth extern int _nandfsvalidtagscount; 4837da2899SCharles.Forsyth 4937da2899SCharles.Forsyth ulong _nandfshamming31_26calc(ulong in); 5037da2899SCharles.Forsyth int _nandfshamming31_26correct(ulong *in); 5137da2899SCharles.Forsyth 52*28942eadSforsyth void _nandfsextracttags(NandfsAuxiliary*, NandfsTags*); 5337da2899SCharles.Forsyth 5437da2899SCharles.Forsyth extern char Enomem[], Eperm[], Eio[]; 55