Home | History | Annotate | Line # | Download | only in qbus
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