1/*	$NetBSD: fdvar.h,v 1.6 2008/04/28 20:23:37 martin Exp $	*/
2
3/*-
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Paul Kranenburg.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#define	FDC_BSIZE	512
33#define	FDC_MAXIOSIZE	NBPG	/* XXX should be MAXBSIZE */
34
35#define FDC_NSTATUS	10
36
37#ifndef _LOCORE
38struct fdcio {
39	/*
40	 * 82072 (sun4c,sun3x) and 82077 (sun4m) controllers have different
41	 * register layout; so we cache some here.
42	 */
43	volatile uint8_t	*fdcio_reg_msr;
44	volatile uint8_t	*fdcio_reg_fifo;
45	volatile uint8_t	*fdcio_reg_dor;	/* 82077 only */
46	volatile uint8_t	*fdcio_reg_fcr; /* sun3x floppy control reg */
47	volatile uint8_t	*fdcio_reg_fvr; /* sun3x floppy int. vector */
48
49	/*
50	 * Interrupt state.
51	 */
52	int	fdcio_istate;
53
54	/*
55	 * IO state.
56	 */
57	char	*fdcio_data;		/* pseudo-DMA data */
58	int	fdcio_tc;		/* pseudo-DMA Terminal Count */
59	u_char	fdcio_status[FDC_NSTATUS];	/* copy of registers */
60	int	fdcio_nstat;		/* # of valid status bytes */
61
62	/*
63	 * Statictics.
64	 */
65	struct	evcnt	fdcio_intrcnt;
66};
67#endif /* _LOCORE */
68
69/* istate values */
70#define ISTATE_IDLE		0	/* No HW interrupt expected */
71#define ISTATE_SPURIOUS		1	/* Spurious HW interrupt detected */
72#define ISTATE_SENSEI		2	/* Do SENSEI on next HW interrupt */
73#define ISTATE_DMA		3	/* Pseudo-DMA in progress */
74#define ISTATE_DONE		4	/* Interrupt processing complete */
75
76
77#define FD_MAX_NSEC 36		/* highest known number of spt - allow for */
78				/* 2.88 MB drives */
79
80#ifndef _LOCORE
81struct ne7_fd_formb {
82	int cyl, head;
83	int transfer_rate;	/* fdreg.h: FDC_???KBPS */
84
85	union {
86		struct fd_form_data {
87			/*
88			 * DO NOT CHANGE THE LAYOUT OF THIS STRUCTS
89			 * it is hardware-dependent since it exactly
90			 * matches the byte sequence to write to FDC
91			 * during its `format track' operation
92			 */
93			u_char secshift; /* 0 -> 128, ...; usually 2 -> 512 */
94			u_char nsecs;	/* must be <= FD_MAX_NSEC */
95			u_char gaplen;	/* GAP 3 length; usually 84 */
96			u_char fillbyte; /* usually 0xf6 */
97			struct fd_idfield_data {
98				/*
99				 * data to write into id fields;
100				 * for obscure formats, they mustn't match
101				 * the real values (but mostly do)
102				 */
103				u_char cylno;	/* 0 thru 79 (or 39) */
104				u_char headno;	/* 0, or 1 */
105				u_char secno;	/* starting at 1! */
106				u_char secsize;	/* usually 2 */
107			} idfields[FD_MAX_NSEC]; /* 0 <= idx < nsecs used */
108		} structured;
109		u_char raw[1];	/* to have continuous indexed access */
110	} format_info;
111};
112
113/* make life easier */
114#define fd_formb_secshift   format_info.structured.secshift
115#define fd_formb_nsecs      format_info.structured.nsecs
116#define fd_formb_gaplen     format_info.structured.gaplen
117#define fd_formb_fillbyte   format_info.structured.fillbyte
118/* these data must be filled in for(i = 0; i < fd_formb_nsecs; i++) */
119#define fd_formb_cylno(i)   format_info.structured.idfields[i].cylno
120#define fd_formb_headno(i)  format_info.structured.idfields[i].headno
121#define fd_formb_secno(i)   format_info.structured.idfields[i].secno
122#define fd_formb_secsize(i) format_info.structured.idfields[i].secsize
123#endif /* _LOCORE */
124