xref: /plan9/sys/src/9/port/sd.h (revision 0cc6832d7c845a6250c7353daab06d4af2dfe5cb)
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*);
179