Annotation of sys/dev/sbus/magmareg.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: magmareg.h,v 1.8 2006/03/04 13:00:55 miod Exp $ */
2:
3: /* magmareg.h
4: *
5: * Copyright (c) 1998 Iain Hibbert
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Iain Hibbert
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: *
33: */
34:
35: #ifdef MAGMA_DEBUG
36: #define dprintf(x) printf x
37: #else
38: #define dprintf(x)
39: #endif
40:
41: /* The mapping of minor device number -> card and port is done as
42: * follows by default:
43: *
44: * +---+---+---+---+---+---+---+---+
45: * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
46: * +---+---+---+---+---+---+---+---+
47: * | | | | | | | |
48: * | | | | +---+---+---+---> port number
49: * | | | |
50: * | | | +-------------------> dialout (on tty ports)
51: * | | |
52: * | | +-----------------------> unused
53: * | |
54: * +---+---------------------------> card number
55: *
56: */
57:
58: #define MAGMA_MAX_CARDS 4
59: #define MAGMA_MAX_TTY 16
60: #define MAGMA_MAX_BPP 2
61: #define MAGMA_MAX_CD1400 4
62: #define MAGMA_MAX_CD1190 2
63:
64: #define MAGMA_CARD(x) ((minor(x) >> 6) & 0x03)
65: #define MAGMA_PORT(x) (minor(x) & 0x0f)
66:
67: #define MTTY_DIALOUT(x) (minor(x) & 0x10)
68:
69: /*
70: * Supported Card Types
71: */
72: struct magma_board_info {
73: const char *mb_sbusname; /* sbus name */
74: const char *mb_name; /* cardname to match against */
75: const char *mb_realname; /* english card name */
76: int mb_nser; /* number of serial ports */
77: int mb_npar; /* number of parallel ports */
78: int mb_ncd1400; /* number of CD1400 chips */
79: int mb_svcackr; /* svcackr offset */
80: int mb_svcackt; /* svcackt offset */
81: int mb_svcackm; /* svcackm offset */
82: int mb_cd1400[MAGMA_MAX_CD1400];/* cd1400 chip register offsets */
83: int mb_ncd1190; /* number of CD1190 chips */
84: int mb_cd1190[MAGMA_MAX_CD1190];/* cd1190 chip register offsets */
85: };
86:
87: /*
88: * cd1400 chip data
89: */
90: struct cd1400 {
91: bus_space_handle_t cd_regh; /* chip register handle */
92: bus_space_tag_t cd_regt; /* chip register tag */
93: int cd_chiprev; /* chip revision */
94: int cd_clock; /* clock speed in MHz */
95: int cd_parmode; /* parallel mode operation */
96: };
97:
98: /*
99: * cd1190 chip data
100: */
101: struct cd1190 {
102: bus_space_handle_t cd_regh; /* chip register handle */
103: bus_space_tag_t cd_regt; /* chip register tag */
104: int cd_chiprev; /* chip revision */
105: };
106:
107: /* software state for each card */
108: struct magma_softc {
109: struct device ms_dev; /* required. must be first in softc */
110:
111: bus_space_tag_t sc_bustag; /* our bus tag */
112: bus_space_handle_t sc_iohandle; /* whole card registers */
113: void *sc_ih; /* interrupt vector */
114: void *sc_sih; /* softintr vector */
115:
116: /* cd1400 chip info */
117: int ms_ncd1400;
118: struct cd1400 ms_cd1400[MAGMA_MAX_CD1400];
119: bus_space_handle_t sc_svcackrh; /* CD1400 service acknowledge receive */
120: bus_space_handle_t sc_svcackth; /* CD1400 service acknowledge transmit */
121: bus_space_handle_t sc_svcackmh; /* CD1400 service acknowledge modem */
122:
123:
124: /* cd1190 chip info */
125: int ms_ncd1190;
126: struct cd1190 ms_cd1190[MAGMA_MAX_CD1190];
127:
128: const struct magma_board_info *ms_board; /* what am I? */
129:
130: struct mtty_softc *ms_mtty;
131: struct mbpp_softc *ms_mbpp;
132:
133: struct intrhand ms_hardint; /* hard interrupt handler */
134: struct intrhand ms_softint; /* soft interrupt handler */
135: };
136:
137: #define MTTY_RBUF_SIZE (2 * 512)
138: #define MTTY_RX_FIFO_THRESHOLD 6
139: #define MTTY_RX_DTR_THRESHOLD 9
140:
141: struct mtty_port {
142: struct cd1400 *mp_cd1400; /* ptr to chip */
143: int mp_channel; /* and channel */
144: struct tty *mp_tty;
145:
146: int mp_openflags; /* default tty flags */
147: int mp_flags; /* port flags */
148: int mp_carrier; /* state of carrier */
149:
150: u_char *mp_rbuf; /* ring buffer start */
151: u_char *mp_rend; /* ring buffer end */
152: u_char *mp_rget; /* ring buffer read pointer */
153: u_char *mp_rput; /* ring buffer write pointer */
154:
155: u_char *mp_txp; /* transmit character pointer */
156: int mp_txc; /* transmit character counter */
157: };
158:
159: #define MTTYF_CARRIER_CHANGED (1<<0)
160: #define MTTYF_SET_BREAK (1<<1)
161: #define MTTYF_CLR_BREAK (1<<2)
162: #define MTTYF_DONE (1<<3)
163: #define MTTYF_STOP (1<<4)
164: #define MTTYF_RING_OVERFLOW (1<<5)
165:
166: struct mtty_softc {
167: struct device ms_dev; /* device info */
168: int ms_nports; /* tty ports */
169: struct mtty_port ms_port[MAGMA_MAX_TTY];
170: };
171:
172: #define MBPP_RX_FIFO_THRESHOLD 25
173:
174: struct mbpp_port {
175: struct cd1400 *mp_cd1400; /* for LC2+1Sp card */
176: struct cd1190 *mp_cd1190; /* all the others */
177:
178: int mp_flags;
179:
180: struct bpp_param mp_param;
181: #define mp_burst mp_param.bp_burst
182: #define mp_timeout mp_param.bp_timeout
183: #define mp_delay mp_param.bp_delay
184:
185: u_char *mp_ptr; /* pointer to io data */
186: int mp_cnt; /* count of io chars */
187:
188: struct timeout mp_timeout_tmo; /* for mbpp_timeout() */
189: struct timeout mp_start_tmo; /* for mbpp_start() */
190: };
191:
192: #define MBPPF_OPEN (1<<0)
193: #define MBPPF_TIMEOUT (1<<1)
194: #define MBPPF_UIO (1<<2)
195: #define MBPPF_DELAY (1<<3)
196: #define MBPPF_WAKEUP (1<<4)
197:
198: struct mbpp_softc {
199: struct device ms_dev; /* device info */
200: int ms_nports; /* parallel ports */
201: struct mbpp_port ms_port[MAGMA_MAX_BPP];
202: };
203:
204: /* internal function prototypes */
205:
206: int cd1400_compute_baud(speed_t, int, int *, int *);
207: __inline void cd1400_write_ccr(struct cd1400 *, u_char);
208: __inline u_char cd1400_read_reg(struct cd1400 *, int);
209: __inline void cd1400_write_reg(struct cd1400 *, int, u_char);
210: void cd1400_enable_transmitter(struct cd1400 *, int);
211:
212: int magma_match(struct device *, void *, void *);
213: void magma_attach(struct device *, struct device *, void *);
214: int magma_hard(void *);
215: void magma_soft(void *);
216:
217: int mtty_match(struct device *, void *, void *);
218: void mtty_attach(struct device *, struct device *, void *);
219: int mtty_modem_control(struct mtty_port *, int, int);
220: int mtty_param(struct tty *, struct termios *);
221: void mtty_start(struct tty *);
222:
223: int mbpp_match(struct device *, void *, void *);
224: void mbpp_attach(struct device *, struct device *, void *);
225: int mbpp_rw(dev_t, struct uio *);
226: void mbpp_timeout(void *);
227: void mbpp_start(void *);
228: int mbpp_send(struct mbpp_port *, caddr_t, int);
229: int mbpp_recv(struct mbpp_port *, caddr_t, int);
230: int mbpp_hztoms(int);
231: int mbpp_mstohz(int);
232:
233: #define CD1400_REGMAPSIZE 0x80
234: #define CD1190_REGMAPSIZE 0x20
CVSweb