xref: /inferno-os/libnandfs/local.h (revision 28942ead413418b56c5be78e8c4c400881fba72e)
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