1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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**
|