Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * Storage Device.
3
 */
4
typedef struct SDev SDev;
5
typedef struct SDifc SDifc;
6
typedef struct SDio SDio;
7
typedef struct SDpart SDpart;
8
typedef struct SDperm SDperm;
9
typedef struct SDreq SDreq;
10
typedef struct SDunit SDunit;
11
 
12
struct SDperm {
13
	char*	name;
14
	char*	user;
15
	ulong	perm;
16
};
17
 
18
struct SDpart {
19
	uvlong	start;
20
	uvlong	end;
21
	SDperm;
22
	int	valid;
23
	ulong	vers;
24
};
25
 
26
struct SDunit {
27
	SDev*	dev;
28
	int	subno;
29
	uchar	inquiry[255];		/* format follows SCSI spec */
30
	uchar	sense[18];		/* format follows SCSI spec */
31
	SDperm;
32
 
33
	QLock	ctl;
34
	uvlong	sectors;
35
	ulong	secsize;
36
	SDpart*	part;			/* nil or array of size npart */
37
	int	npart;
38
	ulong	vers;
39
	SDperm	ctlperm;
40
 
41
	QLock	raw;			/* raw read or write in progress */
42
	ulong	rawinuse;		/* really just a test-and-set */
43
	int	state;
44
	SDreq*	req;
45
	SDperm	rawperm;
46
};
47
 
48
/*
49
 * Each controller is represented by a SDev.
50
 */
51
struct SDev {
52
	Ref	r;			/* Number of callers using device */
53
	SDifc*	ifc;			/* pnp/legacy */
54
	void*	ctlr;
55
	int	idno;
56
	char	name[8];
57
	SDev*	next;
58
 
59
	QLock;				/* enable/disable */
60
	int	enabled;
61
	int	nunit;			/* Number of units */
62
	QLock	unitlock;		/* `Loading' of units */
63
	int*	unitflg;		/* Unit flags */
64
	SDunit**unit;
65
};
66
 
67
struct SDifc {
68
	char*	name;
69
 
70
	SDev*	(*pnp)(void);
71
	SDev*	(*legacy)(int, int);
72
	int	(*enable)(SDev*);
73
	int	(*disable)(SDev*);
74
 
75
	int	(*verify)(SDunit*);
76
	int	(*online)(SDunit*);
77
	int	(*rio)(SDreq*);
78
	int	(*rctl)(SDunit*, char*, int);
79
	int	(*wctl)(SDunit*, Cmdbuf*);
80
 
81
	long	(*bio)(SDunit*, int, int, void*, long, uvlong);
82
	SDev*	(*probe)(DevConf*);
83
	void	(*clear)(SDev*);
84
	char*	(*rtopctl)(SDev*, char*, char*);
85
	int	(*wtopctl)(SDev*, Cmdbuf*);
86
};
87
 
88
struct SDreq {
89
	SDunit*	unit;
90
	int	lun;
91
	int	write;
92
	uchar	cmd[16];
93
	int	clen;
94
	void*	data;
95
	int	dlen;
96
 
97
	int	flags;
98
 
99
	int	status;
100
	long	rlen;
101
	uchar	sense[256];
102
};
103
 
104
enum {
105
	SDnosense	= 0x00000001,
106
	SDvalidsense	= 0x00010000,
107
 
108
	SDinq0periphqual= 0xe0,
109
	SDinq0periphtype= 0x1f,
110
	SDinq1removable	= 0x80,
111
 
112
	/* periphtype values */
113
	SDperdisk	= 0,	/* Direct access (disk) */
114
	SDpertape	= 1,	/* Sequential eg, tape */
115
	SDperpr		= 2,	/* Printer */
116
	SDperworm	= 4,	/* Worm */
117
	SDpercd		= 5,	/* CD-ROM */
118
	SDpermo		= 7,	/* rewriteable MO */
119
	SDperjuke	= 8,	/* medium-changer */
120
};
121
 
122
enum {
123
	SDretry		= -5,		/* internal to controllers */
124
	SDmalloc	= -4,
125
	SDeio		= -3,
126
	SDtimeout	= -2,
127
	SDnostatus	= -1,
128
 
129
	SDok		= 0,
130
 
131
	SDcheck		= 0x02,		/* check condition */
132
	SDbusy		= 0x08,		/* busy */
133
 
134
	SDmaxio		= 2048*1024,
135
	SDnpart		= 16,
136
};
137
 
138
/*
139
 * Allow the default #defines for sdmalloc & sdfree to be overridden by
140
 * system-specific versions.  This can be used to avoid extra copying
141
 * by making sure sd buffers are cache-aligned (some ARM systems) or
142
 * page-aligned (xen) for DMA.
143
 */
144
#ifndef sdmalloc
145
#define sdmalloc(n)	malloc(n)
146
#define sdfree(p)	free(p)
147
#endif
148
 
149
/*
150
 * mmc/sd/sdio host controller interface
151
 */
152
 
153
struct SDio {
154
	char	*name;
155
	int	(*init)(void);
156
	void	(*enable)(void);
157
	int	(*inquiry)(char*, int);
158
	int	(*cmd)(u32int, u32int, u32int*);
159
	void	(*iosetup)(int, void*, int, int);
160
	void	(*io)(int, uchar*, int);
161
};
162
 
163
extern SDio sdio;
164
 
165
/* devsd.c */
166
extern void sdadddevs(SDev*);
167
extern void sdaddconf(SDunit*);
168
extern void sdaddallconfs(void (*f)(SDunit*));
169
extern void sdaddpart(SDunit*, char*, uvlong, uvlong);
170
extern int sdsetsense(SDreq*, int, int, int, int);
171
extern int sdmodesense(SDreq*, uchar*, void*, int);
172
extern int sdfakescsi(SDreq*, void*, int);
173
 
174
/* sdscsi.c */
175
extern int scsiverify(SDunit*);
176
extern int scsionline(SDunit*);
177
extern long scsibio(SDunit*, int, int, void*, long, uvlong);
178
extern SDev* scsiid(SDev*, SDifc*);