summaryrefslogtreecommitdiff
path: root/sys/src/cmd/atazz/atazz.h
blob: 16c21f1f54879d2466ca3667e93e93f244571761 (plain)
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**