rf.c revision 1.4 1 1.4 ragge /* $NetBSD: rf.c,v 1.4 2003/08/13 08:08:48 ragge Exp $ */
2 1.1 ragge /*
3 1.1 ragge * Copyright (c) 2002 Jochen Kunz.
4 1.1 ragge * All rights reserved.
5 1.1 ragge *
6 1.1 ragge * Redistribution and use in source and binary forms, with or without
7 1.1 ragge * modification, are permitted provided that the following conditions
8 1.1 ragge * are met:
9 1.1 ragge * 1. Redistributions of source code must retain the above copyright
10 1.1 ragge * notice, this list of conditions and the following disclaimer.
11 1.1 ragge * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 ragge * notice, this list of conditions and the following disclaimer in the
13 1.1 ragge * documentation and/or other materials provided with the distribution.
14 1.1 ragge * 3. The name of Jochen Kunz may not be used to endorse or promote
15 1.1 ragge * products derived from this software without specific prior
16 1.1 ragge * written permission.
17 1.1 ragge *
18 1.1 ragge * THIS SOFTWARE IS PROVIDED BY JOCHEN KUNZ
19 1.1 ragge * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 1.1 ragge * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 1.1 ragge * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JOCHEN KUNZ
22 1.1 ragge * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 1.1 ragge * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 1.1 ragge * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 1.1 ragge * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 1.1 ragge * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 1.1 ragge * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 1.1 ragge * POSSIBILITY OF SUCH DAMAGE.
29 1.1 ragge */
30 1.1 ragge
31 1.1 ragge /*
32 1.1 ragge TODO:
33 1.1 ragge - Better LBN bound checking, block padding for SD disks.
34 1.1 ragge - Formating / "Set Density"
35 1.1 ragge - Better error handling / detaild error reason reportnig.
36 1.1 ragge */
37 1.3 lukem
38 1.3 lukem #include <sys/cdefs.h>
39 1.4 ragge __KERNEL_RCSID(0, "$NetBSD: rf.c,v 1.4 2003/08/13 08:08:48 ragge Exp $");
40 1.1 ragge
41 1.1 ragge /* autoconfig stuff */
42 1.1 ragge #include <sys/param.h>
43 1.1 ragge #include <sys/device.h>
44 1.1 ragge #include <sys/conf.h>
45 1.1 ragge #include "locators.h"
46 1.1 ragge #include "ioconf.h"
47 1.1 ragge
48 1.1 ragge /* bus_space / bus_dma */
49 1.1 ragge #include <machine/bus.h>
50 1.1 ragge
51 1.1 ragge /* UniBus / QBus specific stuff */
52 1.1 ragge #include <dev/qbus/ubavar.h>
53 1.1 ragge
54 1.1 ragge /* disk interface */
55 1.1 ragge #include <sys/types.h>
56 1.1 ragge #include <sys/disklabel.h>
57 1.1 ragge #include <sys/disk.h>
58 1.1 ragge
59 1.1 ragge /* general system data and functions */
60 1.1 ragge #include <sys/systm.h>
61 1.1 ragge #include <sys/ioctl.h>
62 1.1 ragge #include <sys/ioccom.h>
63 1.1 ragge
64 1.1 ragge /* physio / buffer handling */
65 1.1 ragge #include <sys/buf.h>
66 1.1 ragge
67 1.1 ragge /* tsleep / sleep / wakeup */
68 1.1 ragge #include <sys/proc.h>
69 1.1 ragge /* hz for above */
70 1.1 ragge #include <sys/kernel.h>
71 1.1 ragge
72 1.1 ragge /* bitdefinitions for RX211 */
73 1.1 ragge #include <dev/qbus/rfreg.h>
74 1.1 ragge
75 1.1 ragge
76 1.1 ragge #define RFS_DENS 0x0001 /* single or double density */
77 1.1 ragge #define RFS_AD 0x0002 /* density auto detect */
78 1.1 ragge #define RFS_NOTINIT 0x0000 /* not initialized */
79 1.1 ragge #define RFS_PROBING 0x0010 /* density detect / verify started */
80 1.1 ragge #define RFS_FBUF 0x0020 /* Fill Buffer */
81 1.1 ragge #define RFS_EBUF 0x0030 /* Empty Buffer */
82 1.1 ragge #define RFS_WSEC 0x0040 /* Write Sector */
83 1.1 ragge #define RFS_RSEC 0x0050 /* Read Sector */
84 1.1 ragge #define RFS_SMD 0x0060 /* Set Media Density */
85 1.1 ragge #define RFS_RSTAT 0x0070 /* Read Status */
86 1.1 ragge #define RFS_WDDS 0x0080 /* Write Deleted Data Sector */
87 1.1 ragge #define RFS_REC 0x0090 /* Read Error Code */
88 1.1 ragge #define RFS_IDLE 0x00a0 /* controller is idle */
89 1.1 ragge #define RFS_CMDS 0x00f0 /* command mask */
90 1.4 ragge #define RFS_OPEN_A 0x0100 /* partition a open */
91 1.4 ragge #define RFS_OPEN_B 0x0200 /* partition b open */
92 1.4 ragge #define RFS_OPEN_C 0x0400 /* partition c open */
93 1.4 ragge #define RFS_OPEN_MASK 0x0f00 /* mask for open partitions */
94 1.4 ragge #define RFS_OPEN_SHIFT 8 /* to shift 1 to get RFS_OPEN_A */
95 1.1 ragge #define RFS_SETCMD(rf, state) ((rf) = ((rf) & ~RFS_CMDS) | (state))
96 1.1 ragge
97 1.1 ragge
98 1.1 ragge
99 1.1 ragge /* autoconfig stuff */
100 1.1 ragge static int rfc_match(struct device *, struct cfdata *, void *);
101 1.1 ragge static void rfc_attach(struct device *, struct device *, void *);
102 1.1 ragge static int rf_match(struct device *, struct cfdata *, void *);
103 1.1 ragge static void rf_attach(struct device *, struct device *, void *);
104 1.1 ragge static int rf_print(void *, const char *);
105 1.1 ragge
106 1.1 ragge /* device interfce functions / interface to disk(9) */
107 1.1 ragge dev_type_open(rfopen);
108 1.1 ragge dev_type_close(rfclose);
109 1.1 ragge dev_type_read(rfread);
110 1.1 ragge dev_type_write(rfwrite);
111 1.1 ragge dev_type_ioctl(rfioctl);
112 1.1 ragge dev_type_strategy(rfstrategy);
113 1.1 ragge dev_type_dump(rfdump);
114 1.1 ragge dev_type_size(rfsize);
115 1.1 ragge
116 1.1 ragge
117 1.1 ragge /* Entries in block and character major device number switch table. */
118 1.1 ragge const struct bdevsw rf_bdevsw = {
119 1.1 ragge rfopen,
120 1.1 ragge rfclose,
121 1.1 ragge rfstrategy,
122 1.1 ragge rfioctl,
123 1.1 ragge rfdump,
124 1.1 ragge rfsize,
125 1.1 ragge D_DISK
126 1.1 ragge };
127 1.1 ragge
128 1.1 ragge const struct cdevsw rf_cdevsw = {
129 1.1 ragge rfopen,
130 1.1 ragge rfclose,
131 1.1 ragge rfread,
132 1.1 ragge rfwrite,
133 1.1 ragge rfioctl,
134 1.1 ragge nostop,
135 1.1 ragge notty,
136 1.1 ragge nopoll,
137 1.1 ragge nommap,
138 1.1 ragge nokqfilter,
139 1.1 ragge D_DISK
140 1.1 ragge };
141 1.1 ragge
142 1.1 ragge
143 1.1 ragge
144 1.1 ragge struct rfc_softc {
145 1.1 ragge struct device sc_dev; /* common device data */
146 1.1 ragge struct device *sc_childs[2]; /* child devices */
147 1.1 ragge struct evcnt sc_intr_count; /* Interrupt counter for statistics */
148 1.1 ragge struct buf *sc_curbuf; /* buf that is currently in work */
149 1.1 ragge bus_space_tag_t sc_iot; /* bus_space IO tag */
150 1.1 ragge bus_space_handle_t sc_ioh; /* bus_space IO handle */
151 1.1 ragge bus_dma_tag_t sc_dmat; /* bus_dma DMA tag */
152 1.1 ragge bus_dmamap_t sc_dmam; /* bus_dma DMA map */
153 1.1 ragge caddr_t sc_bufidx; /* current position in buffer data */
154 1.1 ragge int sc_curchild; /* child whos bufq is in work */
155 1.1 ragge int sc_bytesleft; /* bytes left to transfer */
156 1.1 ragge u_int8_t type; /* controller type, 1 or 2 */
157 1.1 ragge };
158 1.1 ragge
159 1.1 ragge
160 1.1 ragge
161 1.1 ragge CFATTACH_DECL(
162 1.1 ragge rfc,
163 1.1 ragge sizeof(struct rfc_softc),
164 1.1 ragge rfc_match,
165 1.1 ragge rfc_attach,
166 1.1 ragge NULL,
167 1.1 ragge NULL
168 1.1 ragge );
169 1.1 ragge
170 1.1 ragge
171 1.1 ragge
172 1.1 ragge struct rf_softc {
173 1.1 ragge struct device sc_dev; /* common device data */
174 1.1 ragge struct disk sc_disk; /* common disk device data */
175 1.1 ragge struct bufq_state sc_bufq; /* queue of pending transfers */
176 1.1 ragge int sc_state; /* state of drive */
177 1.1 ragge u_int8_t sc_dnum; /* drive number, 0 or 1 */
178 1.1 ragge };
179 1.1 ragge
180 1.1 ragge
181 1.1 ragge
182 1.1 ragge CFATTACH_DECL(
183 1.1 ragge rf,
184 1.1 ragge sizeof(struct rf_softc),
185 1.1 ragge rf_match,
186 1.1 ragge rf_attach,
187 1.1 ragge NULL,
188 1.1 ragge NULL
189 1.1 ragge );
190 1.1 ragge
191 1.1 ragge
192 1.1 ragge
193 1.1 ragge struct rfc_attach_args {
194 1.1 ragge u_int8_t type; /* controller type, 1 or 2 */
195 1.1 ragge u_int8_t dnum; /* drive number, 0 or 1 */
196 1.1 ragge };
197 1.1 ragge
198 1.1 ragge
199 1.1 ragge
200 1.1 ragge struct dkdriver rfdkdriver = {
201 1.1 ragge rfstrategy
202 1.1 ragge };
203 1.1 ragge
204 1.1 ragge
205 1.1 ragge
206 1.1 ragge /* helper functions */
207 1.1 ragge int rfc_sendcmd(struct rfc_softc *, int, int, int);
208 1.4 ragge struct rf_softc* get_new_buf( struct rfc_softc *);
209 1.1 ragge static void rfc_intr(void *);
210 1.1 ragge
211 1.1 ragge
212 1.1 ragge
213 1.1 ragge /*
214 1.1 ragge * Issue a reset command to the controller and look for the bits in
215 1.1 ragge * RX2CS and RX2ES.
216 1.1 ragge * RX2CS_RX02 and / or RX2CS_DD can be set,
217 1.1 ragge * RX2ES has to be set, all other bits must be 0
218 1.1 ragge */
219 1.1 ragge int
220 1.1 ragge rfc_match(struct device *parent, struct cfdata *match, void *aux)
221 1.1 ragge {
222 1.1 ragge struct uba_attach_args *ua = aux;
223 1.1 ragge int i;
224 1.1 ragge
225 1.1 ragge /* Issue reset command. */
226 1.1 ragge bus_space_write_2(ua->ua_iot, ua->ua_ioh, RX2CS, RX2CS_INIT);
227 1.1 ragge /* Wait for the controller to become ready, that is when
228 1.1 ragge * RX2CS_DONE, RX2ES_RDY and RX2ES_ID are set. */
229 1.1 ragge for (i = 0 ; i < 20 ; i++) {
230 1.1 ragge if ((bus_space_read_2(ua->ua_iot, ua->ua_ioh, RX2CS)
231 1.1 ragge & RX2CS_DONE) != 0
232 1.1 ragge && (bus_space_read_2(ua->ua_iot, ua->ua_ioh, RX2ES)
233 1.1 ragge & (RX2ES_RDY | RX2ES_ID)) != 0)
234 1.1 ragge break;
235 1.1 ragge DELAY(100000); /* wait 100ms */
236 1.1 ragge }
237 1.1 ragge /*
238 1.1 ragge * Give up if the timeout has elapsed
239 1.1 ragge * and the controller is not ready.
240 1.1 ragge */
241 1.1 ragge if (i >= 20)
242 1.1 ragge return(0);
243 1.1 ragge /*
244 1.1 ragge * Issue a Read Status command with interrupt enabled.
245 1.1 ragge * The uba(4) driver wants to catch the interrupt to get the
246 1.1 ragge * interrupt vector and level of the device
247 1.1 ragge */
248 1.1 ragge bus_space_write_2(ua->ua_iot, ua->ua_ioh, RX2CS,
249 1.1 ragge RX2CS_RSTAT | RX2CS_IE);
250 1.1 ragge /*
251 1.1 ragge * Wait for command to finish, ignore errors and
252 1.1 ragge * abort if the controller does not respond within the timeout
253 1.1 ragge */
254 1.1 ragge for (i = 0 ; i < 20 ; i++) {
255 1.1 ragge if ((bus_space_read_2(ua->ua_iot, ua->ua_ioh, RX2CS)
256 1.1 ragge & (RX2CS_DONE | RX2CS_IE)) != 0
257 1.1 ragge && (bus_space_read_2(ua->ua_iot, ua->ua_ioh, RX2ES)
258 1.1 ragge & RX2ES_RDY) != 0 )
259 1.1 ragge return(1);
260 1.1 ragge DELAY(100000); /* wait 100ms */
261 1.1 ragge }
262 1.1 ragge return(0);
263 1.1 ragge }
264 1.1 ragge
265 1.1 ragge
266 1.1 ragge
267 1.1 ragge /* #define RX02_PROBE 1 */
268 1.1 ragge #ifdef RX02_PROBE
269 1.1 ragge /*
270 1.1 ragge * Probe the density of an inserted floppy disk.
271 1.1 ragge * This is done by reading a sector from disk.
272 1.1 ragge * Return -1 on error, 0 on SD and 1 on DD.
273 1.1 ragge */
274 1.1 ragge int rfcprobedens(struct rfc_softc *, int);
275 1.1 ragge int
276 1.1 ragge rfcprobedens(struct rfc_softc *rfc_sc, int dnum)
277 1.1 ragge {
278 1.1 ragge int dens_flag;
279 1.1 ragge int i;
280 1.1 ragge
281 1.1 ragge dens_flag = 0;
282 1.1 ragge do {
283 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS,
284 1.1 ragge RX2CS_RSEC | (dens_flag == 0 ? 0 : RX2CS_DD)
285 1.1 ragge | (dnum == 0 ? 0 : RX2CS_US));
286 1.1 ragge /*
287 1.1 ragge * Transfer request set?
288 1.1 ragge * Wait 50us, the controller needs this time to setle
289 1.1 ragge */
290 1.1 ragge DELAY(50);
291 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
292 1.1 ragge & RX2CS_TR) == 0) {
293 1.1 ragge printf("%s: did not respond to Read Sector CMD(1)\n",
294 1.1 ragge rfc_sc->sc_dev.dv_xname);
295 1.1 ragge return(-1);
296 1.1 ragge }
297 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2SA, 1);
298 1.1 ragge /* Wait 50us, the controller needs this time to setle */
299 1.1 ragge DELAY(50);
300 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
301 1.1 ragge & RX2CS_TR) == 0) {
302 1.1 ragge printf("%s: did not respond to Read Sector CMD(2)\n",
303 1.1 ragge rfc_sc->sc_dev.dv_xname);
304 1.1 ragge return(-1);
305 1.1 ragge }
306 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2TA, 1);
307 1.1 ragge /* Wait for the command to finish */
308 1.1 ragge for (i = 0 ; i < 200 ; i++) {
309 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
310 1.1 ragge RX2CS) & RX2CS_DONE) != 0)
311 1.1 ragge break;
312 1.1 ragge DELAY(10000); /* wait 10ms */
313 1.1 ragge }
314 1.1 ragge if (i >= 200) {
315 1.1 ragge printf("%s: did not respond to Read Sector CMD(3)\n",
316 1.1 ragge rfc_sc->sc_dev.dv_xname);
317 1.1 ragge return(-1);
318 1.1 ragge }
319 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
320 1.1 ragge & RX2CS_ERR) == 0)
321 1.1 ragge return(dens_flag);
322 1.1 ragge } while (rfc_sc->type == 2 && dens_flag++ == 0);
323 1.1 ragge return(-1);
324 1.1 ragge }
325 1.1 ragge #endif /* RX02_PROBE */
326 1.1 ragge
327 1.1 ragge
328 1.1 ragge
329 1.1 ragge void
330 1.1 ragge rfc_attach(struct device *parent, struct device *self, void *aux)
331 1.1 ragge {
332 1.1 ragge struct rfc_softc *rfc_sc = (struct rfc_softc *)self;
333 1.1 ragge struct uba_attach_args *ua = aux;
334 1.1 ragge struct rfc_attach_args rfc_aa;
335 1.1 ragge int i;
336 1.1 ragge
337 1.1 ragge rfc_sc->sc_iot = ua->ua_iot;
338 1.1 ragge rfc_sc->sc_ioh = ua->ua_ioh;
339 1.1 ragge rfc_sc->sc_dmat = ua->ua_dmat;
340 1.1 ragge rfc_sc->sc_curbuf = NULL;
341 1.1 ragge /* Tell the QBus busdriver about our interrupt handler. */
342 1.1 ragge uba_intr_establish(ua->ua_icookie, ua->ua_cvec, rfc_intr, rfc_sc,
343 1.1 ragge &rfc_sc->sc_intr_count);
344 1.1 ragge /* Attach to the interrupt counter, see evcnt(9) */
345 1.1 ragge evcnt_attach_dynamic(&rfc_sc->sc_intr_count, EVCNT_TYPE_INTR,
346 1.1 ragge ua->ua_evcnt, rfc_sc->sc_dev.dv_xname, "intr");
347 1.1 ragge /* get a bus_dma(9) handle */
348 1.1 ragge i = bus_dmamap_create(rfc_sc->sc_dmat, RX2_BYTE_DD, 1, RX2_BYTE_DD, 0,
349 1.1 ragge BUS_DMA_ALLOCNOW, &rfc_sc->sc_dmam);
350 1.1 ragge if (i != 0) {
351 1.4 ragge printf("rfc_attach: Error creating bus dma map: %d\n", i);
352 1.1 ragge return;
353 1.1 ragge }
354 1.1 ragge
355 1.1 ragge /* Issue reset command. */
356 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS, RX2CS_INIT);
357 1.1 ragge /*
358 1.1 ragge * Wait for the controller to become ready, that is when
359 1.1 ragge * RX2CS_DONE, RX2ES_RDY and RX2ES_ID are set.
360 1.1 ragge */
361 1.1 ragge for (i = 0 ; i < 20 ; i++) {
362 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
363 1.1 ragge & RX2CS_DONE) != 0
364 1.1 ragge && (bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2ES)
365 1.1 ragge & (RX2ES_RDY | RX2ES_ID)) != 0)
366 1.1 ragge break;
367 1.1 ragge DELAY(100000); /* wait 100ms */
368 1.1 ragge }
369 1.1 ragge /*
370 1.1 ragge * Give up if the timeout has elapsed
371 1.1 ragge * and the controller is not ready.
372 1.1 ragge */
373 1.1 ragge if (i >= 20) {
374 1.1 ragge printf(": did not respond to INIT CMD\n");
375 1.1 ragge return;
376 1.1 ragge }
377 1.1 ragge /* Is ths a RX01 or a RX02? */
378 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
379 1.1 ragge & RX2CS_RX02) != 0) {
380 1.1 ragge rfc_sc->type = 2;
381 1.1 ragge rfc_aa.type = 2;
382 1.1 ragge } else {
383 1.1 ragge rfc_sc->type = 1;
384 1.1 ragge rfc_aa.type = 1;
385 1.1 ragge }
386 1.1 ragge printf(": RX0%d\n", rfc_sc->type);
387 1.1 ragge
388 1.1 ragge #ifndef RX02_PROBE
389 1.1 ragge /*
390 1.1 ragge * Bouth disk drievs and the controller are one physical unit.
391 1.1 ragge * If we found the controller, there will be bouth disk drievs.
392 1.1 ragge * So attach them.
393 1.1 ragge */
394 1.1 ragge rfc_aa.dnum = 0;
395 1.1 ragge rfc_sc->sc_childs[0] = config_found(&rfc_sc->sc_dev, &rfc_aa,rf_print);
396 1.1 ragge rfc_aa.dnum = 1;
397 1.1 ragge rfc_sc->sc_childs[1] = config_found(&rfc_sc->sc_dev, &rfc_aa,rf_print);
398 1.1 ragge #else /* RX02_PROBE */
399 1.1 ragge /*
400 1.1 ragge * There are clones of the DEC RX system with standard shugart
401 1.1 ragge * interface. In this case we can not be sure that there are
402 1.1 ragge * bouth disk drievs. So we want to do a detection of attached
403 1.1 ragge * drives. This is done by reading a sector from disk. This means
404 1.1 ragge * that there must be a formated disk in the drive at boot time.
405 1.1 ragge * This is bad, but I did not find an other way to detect the
406 1.1 ragge * (non)existence of a floppy drive.
407 1.1 ragge */
408 1.1 ragge if (rfcprobedens(rfc_sc, 0) >= 0) {
409 1.1 ragge rfc_aa.dnum = 0;
410 1.1 ragge rfc_sc->sc_childs[0] = config_found(&rfc_sc->sc_dev, &rfc_aa,
411 1.1 ragge rf_print);
412 1.1 ragge } else
413 1.1 ragge rfc_sc->sc_childs[0] = NULL;
414 1.1 ragge if (rfcprobedens(rfc_sc, 1) >= 0) {
415 1.1 ragge rfc_aa.dnum = 1;
416 1.1 ragge rfc_sc->sc_childs[1] = config_found(&rfc_sc->sc_dev, &rfc_aa,
417 1.1 ragge rf_print);
418 1.1 ragge } else
419 1.1 ragge rfc_sc->sc_childs[1] = NULL;
420 1.1 ragge #endif /* RX02_PROBE */
421 1.1 ragge return;
422 1.1 ragge }
423 1.1 ragge
424 1.1 ragge
425 1.1 ragge
426 1.1 ragge int
427 1.1 ragge rf_match(struct device *parent, struct cfdata *match, void *aux)
428 1.1 ragge {
429 1.1 ragge struct rfc_attach_args *rfc_aa = aux;
430 1.1 ragge
431 1.1 ragge /*
432 1.1 ragge * Only attach if the locator is wildcarded or
433 1.1 ragge * if the specified locator addresses the current device.
434 1.1 ragge */
435 1.1 ragge if (match->cf_loc[RFCCF_DRIVE] == RFCCF_DRIVE_DEFAULT ||
436 1.1 ragge match->cf_loc[RFCCF_DRIVE] == rfc_aa->dnum)
437 1.1 ragge return(1);
438 1.1 ragge return(0);
439 1.1 ragge }
440 1.1 ragge
441 1.1 ragge
442 1.1 ragge
443 1.1 ragge void
444 1.1 ragge rf_attach(struct device *parent, struct device *self, void *aux)
445 1.1 ragge {
446 1.1 ragge struct rf_softc *rf_sc = (struct rf_softc *)self;
447 1.1 ragge struct rfc_attach_args *rfc_aa = (struct rfc_attach_args *)aux;
448 1.1 ragge struct rfc_softc *rfc_sc;
449 1.1 ragge struct disklabel *dl;
450 1.1 ragge
451 1.1 ragge rfc_sc = (struct rfc_softc *)rf_sc->sc_dev.dv_parent;
452 1.1 ragge rf_sc->sc_dnum = rfc_aa->dnum;
453 1.1 ragge rf_sc->sc_state = 0;
454 1.1 ragge rf_sc->sc_disk.dk_name = rf_sc->sc_dev.dv_xname;
455 1.1 ragge rf_sc->sc_disk.dk_driver = &rfdkdriver;
456 1.1 ragge disk_attach(&rf_sc->sc_disk);
457 1.1 ragge dl = rf_sc->sc_disk.dk_label;
458 1.1 ragge dl->d_type = DTYPE_FLOPPY; /* drive type */
459 1.1 ragge dl->d_magic = DISKMAGIC; /* the magic number */
460 1.1 ragge dl->d_magic2 = DISKMAGIC;
461 1.1 ragge dl->d_typename[0] = 'R';
462 1.1 ragge dl->d_typename[1] = 'X';
463 1.1 ragge dl->d_typename[2] = '0';
464 1.1 ragge dl->d_typename[3] = rfc_sc->type == 1 ? '1' : '2'; /* type name */
465 1.1 ragge dl->d_typename[4] = '\0';
466 1.1 ragge dl->d_secsize = DEV_BSIZE; /* bytes per sector */
467 1.1 ragge /*
468 1.1 ragge * Fill in some values to have a initialized data structure. Some
469 1.1 ragge * values will be reset by rfopen() depending on the actual density.
470 1.1 ragge */
471 1.1 ragge dl->d_nsectors = RX2_SECTORS; /* sectors per track */
472 1.1 ragge dl->d_ntracks = 1; /* tracks per cylinder */
473 1.1 ragge dl->d_ncylinders = RX2_TRACKS; /* cylinders per unit */
474 1.1 ragge dl->d_secpercyl = RX2_SECTORS; /* sectors per cylinder */
475 1.1 ragge dl->d_secperunit = RX2_SECTORS * RX2_TRACKS; /* sectors per unit */
476 1.1 ragge dl->d_rpm = 360; /* rotational speed */
477 1.1 ragge dl->d_interleave = 1; /* hardware sector interleave */
478 1.1 ragge /* number of partitions in following */
479 1.1 ragge dl->d_npartitions = MAXPARTITIONS;
480 1.1 ragge dl->d_bbsize = 0; /* size of boot area at sn0, bytes */
481 1.1 ragge dl->d_sbsize = 0; /* max size of fs superblock, bytes */
482 1.1 ragge /* number of sectors in partition */
483 1.1 ragge dl->d_partitions[0].p_size = 501;
484 1.1 ragge dl->d_partitions[0].p_offset = 0; /* starting sector */
485 1.1 ragge dl->d_partitions[0].p_fsize = 0; /* fs basic fragment size */
486 1.1 ragge dl->d_partitions[0].p_fstype = 0; /* fs type */
487 1.1 ragge dl->d_partitions[0].p_frag = 0; /* fs fragments per block */
488 1.1 ragge dl->d_partitions[1].p_size = RX2_SECTORS * RX2_TRACKS / 2;
489 1.1 ragge dl->d_partitions[1].p_offset = 0; /* starting sector */
490 1.1 ragge dl->d_partitions[1].p_fsize = 0; /* fs basic fragment size */
491 1.1 ragge dl->d_partitions[1].p_fstype = 0; /* fs type */
492 1.1 ragge dl->d_partitions[1].p_frag = 0; /* fs fragments per block */
493 1.1 ragge dl->d_partitions[2].p_size = RX2_SECTORS * RX2_TRACKS;
494 1.1 ragge dl->d_partitions[2].p_offset = 0; /* starting sector */
495 1.1 ragge dl->d_partitions[2].p_fsize = 0; /* fs basic fragment size */
496 1.1 ragge dl->d_partitions[2].p_fstype = 0; /* fs type */
497 1.1 ragge dl->d_partitions[2].p_frag = 0; /* fs fragments per block */
498 1.1 ragge bufq_alloc(&rf_sc->sc_bufq, BUFQ_DISKSORT | BUFQ_SORT_CYLINDER);
499 1.1 ragge printf("\n");
500 1.1 ragge return;
501 1.1 ragge }
502 1.1 ragge
503 1.1 ragge
504 1.1 ragge
505 1.1 ragge int
506 1.1 ragge rf_print(void *aux, const char *name)
507 1.1 ragge {
508 1.1 ragge struct rfc_attach_args *rfc_aa = aux;
509 1.1 ragge
510 1.1 ragge if (name != NULL)
511 1.1 ragge aprint_normal("RX0%d at %s", rfc_aa->type, name);
512 1.1 ragge aprint_normal(" drive %d", rfc_aa->dnum);
513 1.1 ragge return(UNCONF);
514 1.1 ragge }
515 1.1 ragge
516 1.1 ragge
517 1.1 ragge
518 1.1 ragge /* Send a command to the controller */
519 1.1 ragge int
520 1.1 ragge rfc_sendcmd(struct rfc_softc *rfc_sc, int cmd, int data1, int data2)
521 1.1 ragge {
522 1.1 ragge
523 1.1 ragge /* Write command to CSR. */
524 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS, cmd);
525 1.1 ragge /* Wait 50us, the controller needs this time to setle. */
526 1.1 ragge DELAY(50);
527 1.1 ragge /* Write parameter 1 to DBR */
528 1.1 ragge if ((cmd & RX2CS_FC) != RX2CS_RSTAT) {
529 1.1 ragge /* Transfer request set? */
530 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
531 1.1 ragge & RX2CS_TR) == 0) {
532 1.1 ragge printf("%s: did not respond to CMD %x (1)\n",
533 1.1 ragge rfc_sc->sc_dev.dv_xname, cmd);
534 1.1 ragge return(-1);
535 1.1 ragge }
536 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2DB,
537 1.1 ragge data1);
538 1.1 ragge }
539 1.1 ragge /* Write parameter 2 to DBR */
540 1.1 ragge if ((cmd & RX2CS_FC) <= RX2CS_RSEC || (cmd & RX2CS_FC) == RX2CS_WDDS) {
541 1.1 ragge /* Wait 50us, the controller needs this time to setle. */
542 1.1 ragge DELAY(50);
543 1.1 ragge /* Transfer request set? */
544 1.1 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2CS)
545 1.1 ragge & RX2CS_TR) == 0) {
546 1.1 ragge printf("%s: did not respond to CMD %x (2)\n",
547 1.1 ragge rfc_sc->sc_dev.dv_xname, cmd);
548 1.1 ragge return(-1);
549 1.1 ragge }
550 1.1 ragge bus_space_write_2(rfc_sc->sc_iot, rfc_sc->sc_ioh, RX2DB,
551 1.1 ragge data2);
552 1.1 ragge }
553 1.1 ragge return(1);
554 1.1 ragge }
555 1.1 ragge
556 1.1 ragge
557 1.1 ragge
558 1.1 ragge void
559 1.1 ragge rfstrategy(struct buf *buf)
560 1.1 ragge {
561 1.1 ragge struct rf_softc *rf_sc;
562 1.1 ragge struct rfc_softc *rfc_sc;
563 1.1 ragge int i;
564 1.1 ragge
565 1.1 ragge i = DISKUNIT(buf->b_dev);
566 1.1 ragge if (i >= rf_cd.cd_ndevs || (rf_sc = rf_cd.cd_devs[i]) == NULL) {
567 1.1 ragge buf->b_flags |= B_ERROR;
568 1.1 ragge buf->b_error = ENXIO;
569 1.1 ragge biodone(buf);
570 1.1 ragge return;
571 1.1 ragge }
572 1.1 ragge rfc_sc = (struct rfc_softc *)rf_sc->sc_dev.dv_parent;
573 1.1 ragge /* We are going to operate on a non open dev? PANIC! */
574 1.4 ragge if ((rf_sc->sc_state & 1 << (DISKPART(buf->b_dev) + RFS_OPEN_SHIFT))
575 1.4 ragge == 0)
576 1.4 ragge panic("rfstrategy: can not operate on non-open drive %s "
577 1.4 ragge "partition %d", rf_sc->sc_dev.dv_xname,
578 1.4 ragge DISKPART(buf->b_dev));
579 1.1 ragge if (buf->b_bcount == 0) {
580 1.1 ragge biodone(buf);
581 1.1 ragge return;
582 1.1 ragge }
583 1.1 ragge /*
584 1.1 ragge * BUFQ_PUT() operates on b_rawblkno. rfstrategy() gets
585 1.1 ragge * only b_blkno that is partition relative. As a floppy does not
586 1.1 ragge * have partitions b_rawblkno == b_blkno.
587 1.1 ragge */
588 1.1 ragge buf->b_rawblkno = buf->b_blkno;
589 1.1 ragge /*
590 1.1 ragge * from sys/kern/subr_disk.c:
591 1.1 ragge * Seek sort for disks. We depend on the driver which calls us using
592 1.1 ragge * b_resid as the current cylinder number.
593 1.1 ragge */
594 1.1 ragge i = splbio();
595 1.1 ragge if (rfc_sc->sc_curbuf == NULL) {
596 1.1 ragge rfc_sc->sc_curchild = rf_sc->sc_dnum;
597 1.1 ragge rfc_sc->sc_curbuf = buf;
598 1.1 ragge rfc_sc->sc_bufidx = buf->b_un.b_addr;
599 1.1 ragge rfc_sc->sc_bytesleft = buf->b_bcount;
600 1.1 ragge rfc_intr(rfc_sc);
601 1.1 ragge } else {
602 1.1 ragge buf->b_resid = buf->b_blkno / RX2_SECTORS;
603 1.1 ragge BUFQ_PUT(&rf_sc->sc_bufq, buf);
604 1.4 ragge buf->b_resid = 0;
605 1.1 ragge }
606 1.1 ragge splx(i);
607 1.1 ragge return;
608 1.1 ragge }
609 1.1 ragge
610 1.1 ragge
611 1.1 ragge
612 1.4 ragge /*
613 1.4 ragge * Look if there is an other buffer in the bufferqueue of this drive
614 1.4 ragge * and start to process it if there is one.
615 1.4 ragge * If the bufferqueue is empty, look at the bufferqueue of the other drive
616 1.4 ragge * that is attached to this controller.
617 1.4 ragge * Start procesing the bufferqueue of the other drive if it isn't empty.
618 1.4 ragge * Return a pointer to the softc structure of the drive that is now
619 1.4 ragge * ready to process a buffer or NULL if there is no buffer in either queues.
620 1.4 ragge */
621 1.4 ragge struct rf_softc*
622 1.4 ragge get_new_buf( struct rfc_softc *rfc_sc)
623 1.4 ragge {
624 1.4 ragge struct rf_softc *rf_sc;
625 1.4 ragge struct rf_softc *other_drive;
626 1.4 ragge
627 1.4 ragge rf_sc = (struct rf_softc *)rfc_sc->sc_childs[rfc_sc->sc_curchild];
628 1.4 ragge rfc_sc->sc_curbuf = BUFQ_GET(&rf_sc->sc_bufq);
629 1.4 ragge if (rfc_sc->sc_curbuf != NULL) {
630 1.4 ragge rfc_sc->sc_bufidx = rfc_sc->sc_curbuf->b_un.b_addr;
631 1.4 ragge rfc_sc->sc_bytesleft = rfc_sc->sc_curbuf->b_bcount;
632 1.4 ragge } else {
633 1.4 ragge RFS_SETCMD(rf_sc->sc_state, RFS_IDLE);
634 1.4 ragge other_drive = (struct rf_softc *)
635 1.4 ragge rfc_sc->sc_childs[ rfc_sc->sc_curchild == 0 ? 1 : 0];
636 1.4 ragge if (other_drive != NULL
637 1.4 ragge && BUFQ_PEEK(&other_drive->sc_bufq) != NULL) {
638 1.4 ragge rfc_sc->sc_curchild = rfc_sc->sc_curchild == 0 ? 1 : 0;
639 1.4 ragge rf_sc = other_drive;
640 1.4 ragge rfc_sc->sc_curbuf = BUFQ_GET(&rf_sc->sc_bufq);
641 1.4 ragge rfc_sc->sc_bufidx = rfc_sc->sc_curbuf->b_un.b_addr;
642 1.4 ragge rfc_sc->sc_bytesleft = rfc_sc->sc_curbuf->b_bcount;
643 1.4 ragge } else
644 1.4 ragge return(NULL);
645 1.4 ragge }
646 1.4 ragge return(rf_sc);
647 1.4 ragge }
648 1.4 ragge
649 1.4 ragge
650 1.4 ragge
651 1.1 ragge void
652 1.1 ragge rfc_intr(void *intarg)
653 1.1 ragge {
654 1.1 ragge struct rfc_softc *rfc_sc = intarg;
655 1.1 ragge struct rf_softc *rf_sc;
656 1.1 ragge int i;
657 1.1 ragge
658 1.1 ragge rf_sc = (struct rf_softc *)rfc_sc->sc_childs[rfc_sc->sc_curchild];
659 1.4 ragge do {
660 1.4 ragge /*
661 1.4 ragge * First clean up from previous command...
662 1.4 ragge */
663 1.4 ragge switch (rf_sc->sc_state & RFS_CMDS) {
664 1.4 ragge case RFS_PROBING: /* density detect / verify started */
665 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 1);
666 1.4 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
667 1.4 ragge RX2CS) & RX2CS_ERR) == 0) {
668 1.4 ragge RFS_SETCMD(rf_sc->sc_state, RFS_IDLE);
669 1.4 ragge wakeup(rf_sc);
670 1.4 ragge } else {
671 1.4 ragge if (rfc_sc->type == 2
672 1.4 ragge && (rf_sc->sc_state & RFS_DENS) == 0
673 1.4 ragge && (rf_sc->sc_state & RFS_AD) != 0) {
674 1.4 ragge /* retry at DD */
675 1.4 ragge rf_sc->sc_state |= RFS_DENS;
676 1.4 ragge disk_busy(&rf_sc->sc_disk);
677 1.4 ragge if (rfc_sendcmd(rfc_sc, RX2CS_RSEC
678 1.4 ragge | RX2CS_IE | RX2CS_DD |
679 1.4 ragge (rf_sc->sc_dnum == 0 ? 0 :
680 1.4 ragge RX2CS_US), 1, 1) < 0) {
681 1.4 ragge disk_unbusy(&rf_sc->sc_disk,
682 1.4 ragge 0, 1);
683 1.4 ragge RFS_SETCMD(rf_sc->sc_state,
684 1.4 ragge RFS_NOTINIT);
685 1.4 ragge wakeup(rf_sc);
686 1.4 ragge }
687 1.4 ragge } else {
688 1.4 ragge printf("%s: density error.\n",
689 1.4 ragge rf_sc->sc_dev.dv_xname);
690 1.4 ragge RFS_SETCMD(rf_sc->sc_state,RFS_NOTINIT);
691 1.1 ragge wakeup(rf_sc);
692 1.1 ragge }
693 1.4 ragge }
694 1.4 ragge return;
695 1.4 ragge case RFS_IDLE: /* controller is idle */
696 1.4 ragge if (rfc_sc->sc_curbuf->b_bcount
697 1.4 ragge % ((rf_sc->sc_state & RFS_DENS) == 0
698 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD) != 0) {
699 1.4 ragge /*
700 1.4 ragge * can only handle blocks that are a multiple
701 1.4 ragge * of the physical block size
702 1.4 ragge */
703 1.1 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
704 1.1 ragge }
705 1.4 ragge RFS_SETCMD(rf_sc->sc_state, (rfc_sc->sc_curbuf->b_flags
706 1.4 ragge & B_READ) != 0 ? RFS_RSEC : RFS_FBUF);
707 1.1 ragge break;
708 1.4 ragge case RFS_RSEC: /* Read Sector */
709 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 1);
710 1.4 ragge /* check for errors */
711 1.4 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
712 1.4 ragge RX2CS) & RX2CS_ERR) != 0) {
713 1.4 ragge /* should do more verbose error reporting */
714 1.4 ragge printf("rfc_intr: Error reading secotr: %x\n",
715 1.4 ragge bus_space_read_2(rfc_sc->sc_iot,
716 1.4 ragge rfc_sc->sc_ioh, RX2ES) );
717 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
718 1.4 ragge }
719 1.4 ragge RFS_SETCMD(rf_sc->sc_state, RFS_EBUF);
720 1.1 ragge break;
721 1.4 ragge case RFS_WSEC: /* Write Sector */
722 1.4 ragge i = (rf_sc->sc_state & RFS_DENS) == 0
723 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD;
724 1.4 ragge disk_unbusy(&rf_sc->sc_disk, i, 0);
725 1.4 ragge /* check for errors */
726 1.4 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
727 1.4 ragge RX2CS) & RX2CS_ERR) != 0) {
728 1.4 ragge /* should do more verbose error reporting */
729 1.4 ragge printf("rfc_intr: Error writing secotr: %x\n",
730 1.4 ragge bus_space_read_2(rfc_sc->sc_iot,
731 1.4 ragge rfc_sc->sc_ioh, RX2ES) );
732 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
733 1.4 ragge break;
734 1.4 ragge }
735 1.4 ragge if (rfc_sc->sc_bytesleft > i) {
736 1.4 ragge rfc_sc->sc_bytesleft -= i;
737 1.4 ragge rfc_sc->sc_bufidx += i;
738 1.1 ragge } else {
739 1.4 ragge biodone(rfc_sc->sc_curbuf);
740 1.4 ragge rf_sc = get_new_buf( rfc_sc);
741 1.4 ragge if (rf_sc == NULL)
742 1.1 ragge return;
743 1.1 ragge }
744 1.4 ragge RFS_SETCMD(rf_sc->sc_state,
745 1.4 ragge (rfc_sc->sc_curbuf->b_flags & B_READ) != 0
746 1.4 ragge ? RFS_RSEC : RFS_FBUF);
747 1.4 ragge break;
748 1.4 ragge case RFS_FBUF: /* Fill Buffer */
749 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 0);
750 1.4 ragge bus_dmamap_unload(rfc_sc->sc_dmat, rfc_sc->sc_dmam);
751 1.4 ragge /* check for errors */
752 1.4 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
753 1.4 ragge RX2CS) & RX2CS_ERR) != 0) {
754 1.4 ragge /* should do more verbose error reporting */
755 1.4 ragge printf("rfc_intr: Error while DMA: %x\n",
756 1.4 ragge bus_space_read_2(rfc_sc->sc_iot,
757 1.4 ragge rfc_sc->sc_ioh, RX2ES));
758 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
759 1.4 ragge }
760 1.4 ragge RFS_SETCMD(rf_sc->sc_state, RFS_WSEC);
761 1.4 ragge break;
762 1.4 ragge case RFS_EBUF: /* Empty Buffer */
763 1.4 ragge i = (rf_sc->sc_state & RFS_DENS) == 0
764 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD;
765 1.4 ragge disk_unbusy(&rf_sc->sc_disk, i, 1);
766 1.4 ragge bus_dmamap_unload(rfc_sc->sc_dmat, rfc_sc->sc_dmam);
767 1.4 ragge /* check for errors */
768 1.4 ragge if ((bus_space_read_2(rfc_sc->sc_iot, rfc_sc->sc_ioh,
769 1.4 ragge RX2CS) & RX2CS_ERR) != 0) {
770 1.4 ragge /* should do more verbose error reporting */
771 1.4 ragge printf("rfc_intr: Error while DMA: %x\n",
772 1.4 ragge bus_space_read_2(rfc_sc->sc_iot,
773 1.4 ragge rfc_sc->sc_ioh, RX2ES));
774 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
775 1.4 ragge break;
776 1.4 ragge }
777 1.4 ragge if (rfc_sc->sc_bytesleft > i) {
778 1.4 ragge rfc_sc->sc_bytesleft -= i;
779 1.4 ragge rfc_sc->sc_bufidx += i;
780 1.1 ragge } else {
781 1.4 ragge biodone(rfc_sc->sc_curbuf);
782 1.4 ragge rf_sc = get_new_buf( rfc_sc);
783 1.4 ragge if (rf_sc == NULL)
784 1.1 ragge return;
785 1.1 ragge }
786 1.4 ragge RFS_SETCMD(rf_sc->sc_state,
787 1.4 ragge (rfc_sc->sc_curbuf->b_flags & B_READ) != 0
788 1.4 ragge ? RFS_RSEC : RFS_FBUF);
789 1.4 ragge break;
790 1.4 ragge case RFS_NOTINIT: /* Device is not open */
791 1.4 ragge case RFS_SMD: /* Set Media Density */
792 1.4 ragge case RFS_RSTAT: /* Read Status */
793 1.4 ragge case RFS_WDDS: /* Write Deleted Data Sector */
794 1.4 ragge case RFS_REC: /* Read Error Code */
795 1.4 ragge default:
796 1.4 ragge panic("Impossible state in rfc_intr(1).\n");
797 1.1 ragge }
798 1.1 ragge
799 1.4 ragge if ((rfc_sc->sc_curbuf->b_flags & B_ERROR) != 0) {
800 1.4 ragge /*
801 1.4 ragge * An error occured while processing this buffer.
802 1.4 ragge * Finish it and try to get a new buffer to process.
803 1.4 ragge * Return if there are no buffers in the queues.
804 1.4 ragge * This loops until the queues are empty or a new
805 1.4 ragge * action was successfully scheduled.
806 1.4 ragge */
807 1.4 ragge rfc_sc->sc_curbuf->b_resid = rfc_sc->sc_bytesleft;
808 1.4 ragge rfc_sc->sc_curbuf->b_error = EIO;
809 1.4 ragge biodone(rfc_sc->sc_curbuf);
810 1.4 ragge rf_sc = get_new_buf( rfc_sc);
811 1.4 ragge if (rf_sc == NULL)
812 1.4 ragge return;
813 1.4 ragge continue;
814 1.4 ragge }
815 1.1 ragge
816 1.4 ragge /*
817 1.4 ragge * ... then initiate next command.
818 1.4 ragge */
819 1.4 ragge switch (rf_sc->sc_state & RFS_CMDS) {
820 1.4 ragge case RFS_EBUF: /* Empty Buffer */
821 1.4 ragge i = bus_dmamap_load(rfc_sc->sc_dmat, rfc_sc->sc_dmam,
822 1.4 ragge rfc_sc->sc_bufidx, (rf_sc->sc_state & RFS_DENS) == 0
823 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD,
824 1.4 ragge rfc_sc->sc_curbuf->b_proc, BUS_DMA_NOWAIT);
825 1.4 ragge if (i != 0) {
826 1.4 ragge printf("rfc_intr: Error loading dmamap: %d\n",
827 1.4 ragge i);
828 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
829 1.4 ragge break;
830 1.4 ragge }
831 1.4 ragge disk_busy(&rf_sc->sc_disk);
832 1.4 ragge if (rfc_sendcmd(rfc_sc, RX2CS_EBUF | RX2CS_IE
833 1.4 ragge | ((rf_sc->sc_state & RFS_DENS) == 0 ? 0 : RX2CS_DD)
834 1.4 ragge | (rf_sc->sc_dnum == 0 ? 0 : RX2CS_US)
835 1.4 ragge | ((rfc_sc->sc_dmam->dm_segs[0].ds_addr
836 1.4 ragge & 0x30000) >>4), ((rf_sc->sc_state & RFS_DENS) == 0
837 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD) / 2,
838 1.4 ragge rfc_sc->sc_dmam->dm_segs[0].ds_addr & 0xffff) < 0) {
839 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 1);
840 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
841 1.4 ragge bus_dmamap_unload(rfc_sc->sc_dmat,
842 1.4 ragge rfc_sc->sc_dmam);
843 1.4 ragge }
844 1.4 ragge break;
845 1.4 ragge case RFS_FBUF: /* Fill Buffer */
846 1.4 ragge i = bus_dmamap_load(rfc_sc->sc_dmat, rfc_sc->sc_dmam,
847 1.4 ragge rfc_sc->sc_bufidx, (rf_sc->sc_state & RFS_DENS) == 0
848 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD,
849 1.4 ragge rfc_sc->sc_curbuf->b_proc, BUS_DMA_NOWAIT);
850 1.4 ragge if (i != 0) {
851 1.4 ragge printf("rfc_intr: Error loading dmamap: %d\n",
852 1.4 ragge i);
853 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
854 1.4 ragge break;
855 1.4 ragge }
856 1.4 ragge disk_busy(&rf_sc->sc_disk);
857 1.4 ragge if (rfc_sendcmd(rfc_sc, RX2CS_FBUF | RX2CS_IE
858 1.4 ragge | ((rf_sc->sc_state & RFS_DENS) == 0 ? 0 : RX2CS_DD)
859 1.4 ragge | (rf_sc->sc_dnum == 0 ? 0 : RX2CS_US)
860 1.4 ragge | ((rfc_sc->sc_dmam->dm_segs[0].ds_addr
861 1.4 ragge & 0x30000)>>4), ((rf_sc->sc_state & RFS_DENS) == 0
862 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD) / 2,
863 1.4 ragge rfc_sc->sc_dmam->dm_segs[0].ds_addr & 0xffff) < 0) {
864 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 0);
865 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
866 1.4 ragge bus_dmamap_unload(rfc_sc->sc_dmat,
867 1.4 ragge rfc_sc->sc_dmam);
868 1.4 ragge }
869 1.4 ragge break;
870 1.4 ragge case RFS_WSEC: /* Write Sector */
871 1.4 ragge i = (rfc_sc->sc_curbuf->b_bcount - rfc_sc->sc_bytesleft
872 1.4 ragge + rfc_sc->sc_curbuf->b_blkno * DEV_BSIZE) /
873 1.4 ragge ((rf_sc->sc_state & RFS_DENS) == 0
874 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD);
875 1.4 ragge if (i > RX2_TRACKS * RX2_SECTORS) {
876 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
877 1.4 ragge break;
878 1.4 ragge }
879 1.4 ragge disk_busy(&rf_sc->sc_disk);
880 1.4 ragge if (rfc_sendcmd(rfc_sc, RX2CS_WSEC | RX2CS_IE
881 1.4 ragge | (rf_sc->sc_dnum == 0 ? 0 : RX2CS_US)
882 1.4 ragge | ((rf_sc->sc_state& RFS_DENS) == 0 ? 0 : RX2CS_DD),
883 1.4 ragge i % RX2_SECTORS + 1, i / RX2_SECTORS) < 0) {
884 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 0);
885 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
886 1.4 ragge }
887 1.1 ragge break;
888 1.4 ragge case RFS_RSEC: /* Read Sector */
889 1.4 ragge i = (rfc_sc->sc_curbuf->b_bcount - rfc_sc->sc_bytesleft
890 1.4 ragge + rfc_sc->sc_curbuf->b_blkno * DEV_BSIZE) /
891 1.4 ragge ((rf_sc->sc_state & RFS_DENS) == 0
892 1.4 ragge ? RX2_BYTE_SD : RX2_BYTE_DD);
893 1.4 ragge if (i > RX2_TRACKS * RX2_SECTORS) {
894 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
895 1.4 ragge break;
896 1.4 ragge }
897 1.4 ragge disk_busy(&rf_sc->sc_disk);
898 1.4 ragge if (rfc_sendcmd(rfc_sc, RX2CS_RSEC | RX2CS_IE
899 1.4 ragge | (rf_sc->sc_dnum == 0 ? 0 : RX2CS_US)
900 1.4 ragge | ((rf_sc->sc_state& RFS_DENS) == 0 ? 0 : RX2CS_DD),
901 1.4 ragge i % RX2_SECTORS + 1, i / RX2_SECTORS) < 0) {
902 1.4 ragge disk_unbusy(&rf_sc->sc_disk, 0, 1);
903 1.4 ragge rfc_sc->sc_curbuf->b_flags |= B_ERROR;
904 1.4 ragge }
905 1.1 ragge break;
906 1.4 ragge case RFS_NOTINIT: /* Device is not open */
907 1.4 ragge case RFS_PROBING: /* density detect / verify started */
908 1.4 ragge case RFS_IDLE: /* controller is idle */
909 1.4 ragge case RFS_SMD: /* Set Media Density */
910 1.4 ragge case RFS_RSTAT: /* Read Status */
911 1.4 ragge case RFS_WDDS: /* Write Deleted Data Sector */
912 1.4 ragge case RFS_REC: /* Read Error Code */
913 1.4 ragge default:
914 1.4 ragge panic("Impossible state in rfc_intr(2).\n");
915 1.1 ragge }
916 1.4 ragge
917 1.4 ragge if ((rfc_sc->sc_curbuf->b_flags & B_ERROR) != 0) {
918 1.4 ragge /*
919 1.4 ragge * An error occured while processing this buffer.
920 1.4 ragge * Finish it and try to get a new buffer to process.
921 1.4 ragge * Return if there are no buffers in the queues.
922 1.4 ragge * This loops until the queues are empty or a new
923 1.4 ragge * action was successfully scheduled.
924 1.4 ragge */
925 1.1 ragge rfc_sc->sc_curbuf->b_resid = rfc_sc->sc_bytesleft;
926 1.4 ragge rfc_sc->sc_curbuf->b_error = EIO;
927 1.4 ragge biodone(rfc_sc->sc_curbuf);
928 1.4 ragge rf_sc = get_new_buf( rfc_sc);
929 1.4 ragge if (rf_sc == NULL)
930 1.4 ragge return;
931 1.4 ragge continue;
932 1.1 ragge }
933 1.4 ragge } while ( 1 == 0 /* CONSTCOND */ );
934 1.1 ragge return;
935 1.1 ragge }
936 1.1 ragge
937 1.1 ragge
938 1.1 ragge
939 1.1 ragge int
940 1.1 ragge rfdump(dev_t dev, daddr_t blkno, caddr_t va, size_t size)
941 1.1 ragge {
942 1.1 ragge
943 1.1 ragge /* A 0.5MB floppy is much to small to take a system dump... */
944 1.1 ragge return(ENXIO);
945 1.1 ragge }
946 1.1 ragge
947 1.1 ragge
948 1.1 ragge
949 1.1 ragge int
950 1.1 ragge rfsize(dev_t dev)
951 1.1 ragge {
952 1.1 ragge
953 1.1 ragge return(-1);
954 1.1 ragge }
955 1.1 ragge
956 1.1 ragge
957 1.1 ragge
958 1.1 ragge int
959 1.1 ragge rfopen(dev_t dev, int oflags, int devtype, struct proc *p)
960 1.1 ragge {
961 1.1 ragge struct rf_softc *rf_sc;
962 1.1 ragge struct rfc_softc *rfc_sc;
963 1.1 ragge struct disklabel *dl;
964 1.1 ragge int unit;
965 1.1 ragge
966 1.1 ragge unit = DISKUNIT(dev);
967 1.1 ragge if (unit >= rf_cd.cd_ndevs || (rf_sc = rf_cd.cd_devs[unit]) == NULL) {
968 1.1 ragge return(ENXIO);
969 1.1 ragge }
970 1.1 ragge rfc_sc = (struct rfc_softc *)rf_sc->sc_dev.dv_parent;
971 1.1 ragge dl = rf_sc->sc_disk.dk_label;
972 1.1 ragge switch (DISKPART(dev)) {
973 1.1 ragge case 0: /* Part. a is single density. */
974 1.4 ragge /* opening in single and double density is sensless */
975 1.4 ragge if ((rf_sc->sc_state & RFS_OPEN_B) != 0 )
976 1.4 ragge return(ENXIO);
977 1.1 ragge rf_sc->sc_state &= ~RFS_DENS;
978 1.1 ragge rf_sc->sc_state &= ~RFS_AD;
979 1.4 ragge rf_sc->sc_state |= RFS_OPEN_A;
980 1.1 ragge break;
981 1.1 ragge case 1: /* Part. b is double density. */
982 1.1 ragge /*
983 1.4 ragge * Opening a singe density only drive in double
984 1.4 ragge * density or simultaneous opening in single and
985 1.4 ragge * double density is sensless.
986 1.1 ragge */
987 1.4 ragge if (rfc_sc->type == 1
988 1.4 ragge || (rf_sc->sc_state & RFS_OPEN_A) != 0 )
989 1.1 ragge return(ENXIO);
990 1.1 ragge rf_sc->sc_state |= RFS_DENS;
991 1.1 ragge rf_sc->sc_state &= ~RFS_AD;
992 1.4 ragge rf_sc->sc_state |= RFS_OPEN_B;
993 1.1 ragge break;
994 1.1 ragge case 2: /* Part. c is auto density. */
995 1.1 ragge rf_sc->sc_state |= RFS_AD;
996 1.4 ragge rf_sc->sc_state |= RFS_OPEN_C;
997 1.1 ragge break;
998 1.1 ragge default:
999 1.1 ragge return(ENXIO);
1000 1.1 ragge break;
1001 1.1 ragge }
1002 1.1 ragge if ((rf_sc->sc_state & RFS_CMDS) == RFS_NOTINIT) {
1003 1.1 ragge rfc_sc->sc_curchild = rf_sc->sc_dnum;
1004 1.1 ragge /*
1005 1.1 ragge * Controller is idle and density is not detected.
1006 1.1 ragge * Start a density probe by issuing a read sector command
1007 1.1 ragge * and sleep until the density probe finished.
1008 1.1 ragge * Due to this it is imposible to open unformated media.
1009 1.1 ragge * As the RX02/02 is not able to format its own media,
1010 1.1 ragge * media must be purchased preformated. fsck DEC makreting!
1011 1.1 ragge */
1012 1.1 ragge RFS_SETCMD(rf_sc->sc_state, RFS_PROBING);
1013 1.1 ragge disk_busy(&rf_sc->sc_disk);
1014 1.1 ragge if (rfc_sendcmd(rfc_sc, RX2CS_RSEC | RX2CS_IE
1015 1.1 ragge | (rf_sc->sc_dnum == 0 ? 0 : RX2CS_US)
1016 1.1 ragge | ((rf_sc->sc_state & RFS_DENS) == 0 ? 0 : RX2CS_DD),
1017 1.1 ragge 1, 1) < 0) {
1018 1.1 ragge rf_sc->sc_state = 0;
1019 1.1 ragge return(ENXIO);
1020 1.1 ragge }
1021 1.1 ragge /* wait max. 2 sec for density probe to finish */
1022 1.1 ragge if (tsleep(rf_sc, PRIBIO | PCATCH, "density probe", 2 * hz)
1023 1.1 ragge != 0 || (rf_sc->sc_state & RFS_CMDS) == RFS_NOTINIT) {
1024 1.1 ragge /* timeout elapsed and / or somthing went wrong */
1025 1.1 ragge rf_sc->sc_state = 0;
1026 1.1 ragge return(ENXIO);
1027 1.1 ragge }
1028 1.1 ragge }
1029 1.1 ragge /* disklabel. We use different fake geometries for SD and DD. */
1030 1.1 ragge if ((rf_sc->sc_state & RFS_DENS) == 0) {
1031 1.1 ragge dl->d_nsectors = 10; /* sectors per track */
1032 1.1 ragge dl->d_secpercyl = 10; /* sectors per cylinder */
1033 1.1 ragge dl->d_ncylinders = 50; /* cylinders per unit */
1034 1.1 ragge dl->d_secperunit = 501; /* sectors per unit */
1035 1.1 ragge /* number of sectors in partition */
1036 1.1 ragge dl->d_partitions[2].p_size = 500;
1037 1.1 ragge } else {
1038 1.1 ragge dl->d_nsectors = RX2_SECTORS / 2; /* sectors per track */
1039 1.1 ragge dl->d_secpercyl = RX2_SECTORS / 2; /* sectors per cylinder */
1040 1.1 ragge dl->d_ncylinders = RX2_TRACKS; /* cylinders per unit */
1041 1.1 ragge /* sectors per unit */
1042 1.1 ragge dl->d_secperunit = RX2_SECTORS * RX2_TRACKS / 2;
1043 1.1 ragge /* number of sectors in partition */
1044 1.1 ragge dl->d_partitions[2].p_size = RX2_SECTORS * RX2_TRACKS / 2;
1045 1.1 ragge }
1046 1.1 ragge return(0);
1047 1.1 ragge }
1048 1.1 ragge
1049 1.1 ragge
1050 1.1 ragge
1051 1.1 ragge int
1052 1.1 ragge rfclose(dev_t dev, int fflag, int devtype, struct proc *p)
1053 1.1 ragge {
1054 1.1 ragge struct rf_softc *rf_sc;
1055 1.1 ragge int unit;
1056 1.1 ragge
1057 1.1 ragge unit = DISKUNIT(dev);
1058 1.1 ragge if (unit >= rf_cd.cd_ndevs || (rf_sc = rf_cd.cd_devs[unit]) == NULL) {
1059 1.1 ragge return(ENXIO);
1060 1.1 ragge }
1061 1.4 ragge if ((rf_sc->sc_state & 1 << (DISKPART(dev) + RFS_OPEN_SHIFT)) == 0)
1062 1.4 ragge panic("rfclose: can not close on non-open drive %s "
1063 1.4 ragge "partition %d", rf_sc->sc_dev.dv_xname, DISKPART(dev));
1064 1.4 ragge else
1065 1.4 ragge rf_sc->sc_state &= ~(1 << (DISKPART(dev) + RFS_OPEN_SHIFT));
1066 1.4 ragge if ((rf_sc->sc_state & RFS_OPEN_MASK) == 0)
1067 1.4 ragge rf_sc->sc_state = 0;
1068 1.1 ragge return(0);
1069 1.1 ragge }
1070 1.1 ragge
1071 1.1 ragge
1072 1.1 ragge
1073 1.1 ragge int
1074 1.1 ragge rfread(dev_t dev, struct uio *uio, int ioflag)
1075 1.1 ragge {
1076 1.1 ragge
1077 1.1 ragge return(physio(rfstrategy, NULL, dev, B_READ, minphys, uio));
1078 1.1 ragge }
1079 1.1 ragge
1080 1.1 ragge
1081 1.1 ragge
1082 1.1 ragge int
1083 1.1 ragge rfwrite(dev_t dev, struct uio *uio, int ioflag)
1084 1.1 ragge {
1085 1.1 ragge
1086 1.1 ragge return(physio(rfstrategy, NULL, dev, B_WRITE, minphys, uio));
1087 1.1 ragge }
1088 1.1 ragge
1089 1.1 ragge
1090 1.1 ragge
1091 1.1 ragge int
1092 1.1 ragge rfioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p)
1093 1.1 ragge {
1094 1.1 ragge struct rf_softc *rf_sc;
1095 1.1 ragge int unit;
1096 1.1 ragge
1097 1.1 ragge unit = DISKUNIT(dev);
1098 1.1 ragge if (unit >= rf_cd.cd_ndevs || (rf_sc = rf_cd.cd_devs[unit]) == NULL) {
1099 1.1 ragge return(ENXIO);
1100 1.1 ragge }
1101 1.1 ragge /* We are going to operate on a non open dev? PANIC! */
1102 1.4 ragge if ((rf_sc->sc_state & 1 << (DISKPART(dev) + RFS_OPEN_SHIFT)) == 0)
1103 1.4 ragge panic("rfioctl: can not operate on non-open drive %s "
1104 1.4 ragge "partition %d", rf_sc->sc_dev.dv_xname, DISKPART(dev));
1105 1.1 ragge switch (cmd) {
1106 1.1 ragge /* get and set disklabel; DIOCGPART used internally */
1107 1.1 ragge case DIOCGDINFO: /* get */
1108 1.1 ragge memcpy(data, rf_sc->sc_disk.dk_label,
1109 1.1 ragge sizeof(struct disklabel));
1110 1.1 ragge return(0);
1111 1.1 ragge case DIOCSDINFO: /* set */
1112 1.1 ragge return(0);
1113 1.1 ragge case DIOCWDINFO: /* set, update disk */
1114 1.1 ragge return(0);
1115 1.1 ragge case DIOCGPART: /* get partition */
1116 1.1 ragge ((struct partinfo *)data)->disklab = rf_sc->sc_disk.dk_label;
1117 1.1 ragge ((struct partinfo *)data)->part =
1118 1.1 ragge &rf_sc->sc_disk.dk_label->d_partitions[DISKPART(dev)];
1119 1.1 ragge return(0);
1120 1.1 ragge
1121 1.1 ragge /* do format operation, read or write */
1122 1.1 ragge case DIOCRFORMAT:
1123 1.1 ragge break;
1124 1.1 ragge case DIOCWFORMAT:
1125 1.1 ragge break;
1126 1.1 ragge
1127 1.1 ragge case DIOCSSTEP: /* set step rate */
1128 1.1 ragge break;
1129 1.1 ragge case DIOCSRETRIES: /* set # of retries */
1130 1.1 ragge break;
1131 1.1 ragge case DIOCKLABEL: /* keep/drop label on close? */
1132 1.1 ragge break;
1133 1.1 ragge case DIOCWLABEL: /* write en/disable label */
1134 1.1 ragge break;
1135 1.1 ragge
1136 1.1 ragge /* case DIOCSBAD: / * set kernel dkbad */
1137 1.1 ragge break; /* */
1138 1.1 ragge case DIOCEJECT: /* eject removable disk */
1139 1.1 ragge break;
1140 1.1 ragge case ODIOCEJECT: /* eject removable disk */
1141 1.1 ragge break;
1142 1.1 ragge case DIOCLOCK: /* lock/unlock pack */
1143 1.1 ragge break;
1144 1.1 ragge
1145 1.1 ragge /* get default label, clear label */
1146 1.1 ragge case DIOCGDEFLABEL:
1147 1.1 ragge break;
1148 1.1 ragge case DIOCCLRLABEL:
1149 1.1 ragge break;
1150 1.1 ragge default:
1151 1.1 ragge return(ENOTTY);
1152 1.1 ragge }
1153 1.1 ragge
1154 1.1 ragge return(ENOTTY);
1155 1.1 ragge }
1156 1.1 ragge
1157 1.1 ragge
1158