diff options
author | google <google@daverabbitz.ath.cx> | 2012-09-20 22:39:48 +1200 |
---|---|---|
committer | google <google@daverabbitz.ath.cx> | 2012-09-20 22:39:48 +1200 |
commit | fa7fb8b66b9ff50029532d09315f03896f2ac4c4 (patch) | |
tree | 262cfe8966f3c07a5ad6ed61fda028f6fa928a36 /sys/src/cmd/atazz/atazz.h | |
parent | 913afc39c9b4750e630c7f4ff3161a37602b006b (diff) |
Add Erik Quanstrom's atazz
(needed to disable power management/head unload on 2.5" drive)
Diffstat (limited to 'sys/src/cmd/atazz/atazz.h')
-rw-r--r-- | sys/src/cmd/atazz/atazz.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/sys/src/cmd/atazz/atazz.h b/sys/src/cmd/atazz/atazz.h new file mode 100644 index 000000000..16c21f1f5 --- /dev/null +++ b/sys/src/cmd/atazz/atazz.h @@ -0,0 +1,131 @@ +enum { + Cmdn = 1, + Cmdf, /* cfa only */ + Cmdp, /* packet */ + Cmd5sc, /* 512-byte sector size, set sector count */ +}; + +typedef struct Dev Dev; +struct Dev { + Sfis; + int fd; + uint secsize; + uvlong nsect; + uvlong wwn; +}; + +enum { + Cmdsz = 18, + Replysz = 18, +}; + +typedef struct Rcmd Rcmd; +struct Rcmd { + uchar sdcmd; /* sd command; 0xff means ata passthrough */ + uchar ataproto; /* ata protocol. non-data, pio, reset, dd, etc. */ + uchar fis[Fissize]; +}; + +typedef struct Req Req; +struct Req { + int rfd; + int wfd; + uchar fmtrw; + uvlong lba; + uvlong count; /* bytes; allow long sectors to work */ + uint nsect; + char haverfis; + uint fisbits; /* bitmask of manually set fields */ + Rcmd cmd; + Rcmd reply; + uchar *data; + uchar raw; +}; + +void sigfmt(Req*); +void idfmt(Req*); +void iofmt(Req*); +void sdfmt(Req*); +void smfmt(Req*); +void slfmt(Req*); +void glfmt(Req*); + +typedef struct Btab Btab; +struct Btab { + int bit; + char *name; +}; +char *sebtab(char*, char*, Btab*, int, uint); + +typedef struct Txtab Txtab; +typedef struct Fetab Fetab; + +struct Txtab { + int val; + char *name; + Fetab *fe; +}; + +struct Fetab { + int reg; + Txtab *tab; + int ntab; +}; + +/* sct “registers” */ +enum { + Sbase = 1<<5, + Sbyte = 0<<6, + Sw = 1<<6, + Sdw = 2<<6, + Sqw = 3<<6, + Ssz = 3<<6, + + Saction = 0 | Sbase | Sw, + Sfn = 1 | Sbase | Sw, + Slba = 2 | Sbase | Sqw, + Scnt = 6 | Sbase | Sqw, + Spat = 10 | Sbase | Sdw, + Ssc = 2 | Sbase | Sw, + Stimer = 3 | Sbase | Sw, + Sfe = 2 | Sbase | Sw, + Sstate = 3 | Sbase | Sw, + Soptf = 4 | Sbase | Sw, + Stabid = 2 | Sbase | Sw, + + Pbase = 1<<6, +}; + +void pw(uchar*, ushort); +void pdw(uchar*, uint); +void pqw(uchar*, uvlong); +ushort w(uchar*); +uint dw(uchar*); +uvlong qw(uchar*); + +/* + * botch. integrate with fis.h? + */ +enum { + Psct = 1<<6 + 8, +}; + +typedef struct Atatab Atatab; +struct Atatab { + ushort cc; + uchar flags; + uchar pktflags; + ushort protocol; + Fetab *tab; + void (*fmt)(Req*); + char *name; +}; + +int eprint(char *, ...); +int opendev(char*, Dev*); +int probe(void); + +extern int squelch; + +#pragma varargck argpos eprint 1 +#pragma varargck type "π" char** |