1 /* $OpenBSD: magmareg.h,v 1.4 2002/01/25 02:37:43 jason 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 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 /* 205 * useful macros 206 */ 207 #define SET(t, f) ((t) |= (f)) 208 #define CLR(t, f) ((t) &= ~(f)) 209 #define ISSET(t, f) ((t) & (f)) 210 211 /* internal function prototypes */ 212 213 int cd1400_compute_baud __P((speed_t, int, int *, int *)); 214 __inline void cd1400_write_ccr __P((struct cd1400 *, u_char)); 215 __inline u_char cd1400_read_reg __P((struct cd1400 *, int)); 216 __inline void cd1400_write_reg __P((struct cd1400 *, int, u_char)); 217 void cd1400_enable_transmitter __P((struct cd1400 *, int)); 218 219 int magma_match __P((struct device *, void *, void *)); 220 void magma_attach __P((struct device *, struct device *, void *)); 221 int magma_hard __P((void *)); 222 void magma_soft __P((void *)); 223 224 int mtty_match __P((struct device *, void *, void *)); 225 void mtty_attach __P((struct device *, struct device *, void *)); 226 int mtty_modem_control __P((struct mtty_port *, int, int)); 227 int mtty_param __P((struct tty *, struct termios *)); 228 void mtty_start __P((struct tty *)); 229 230 int mbpp_match __P((struct device *, void *, void *)); 231 void mbpp_attach __P((struct device *, struct device *, void *)); 232 int mbpp_rw __P((dev_t, struct uio *)); 233 void mbpp_timeout __P((void *)); 234 void mbpp_start __P((void *)); 235 int mbpp_send __P((struct mbpp_port *, caddr_t, int)); 236 int mbpp_recv __P((struct mbpp_port *, caddr_t, int)); 237 int mbpp_hztoms __P((int)); 238 int mbpp_mstohz __P((int)); 239 240 #define CD1400_REGMAPSIZE 0x80 241 #define CD1190_REGMAPSIZE 0x20 242