maplevar.h revision 1.6 1 /* $NetBSD: maplevar.h,v 1.6 2003/02/11 01:21:46 itohy Exp $ */
2
3 /*-
4 * Copyright (c) 2002 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by ITOH Yasufumi.
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 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 /*-
40 * Copyright (c) 2001 Marcus Comstedt
41 * All rights reserved.
42 *
43 * Redistribution and use in source and binary forms, with or without
44 * modification, are permitted provided that the following conditions
45 * are met:
46 * 1. Redistributions of source code must retain the above copyright
47 * notice, this list of conditions and the following disclaimer.
48 * 2. Redistributions in binary form must reproduce the above copyright
49 * notice, this list of conditions and the following disclaimer in the
50 * documentation and/or other materials provided with the distribution.
51 * 3. All advertising materials mentioning features or use of this software
52 * must display the following acknowledgement:
53 * This product includes software developed by Marcus Comstedt.
54 * 4. Neither the name of The NetBSD Foundation nor the names of its
55 * contributors may be used to endorse or promote products derived
56 * from this software without specific prior written permission.
57 *
58 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
59 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
60 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
61 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
62 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
63 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
64 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
65 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
66 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
67 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
68 * POSSIBILITY OF SUCH DAMAGE.
69 */
70
71 #include <sys/queue.h>
72
73 #define MAPLE_PORTS 4
74 #define MAPLE_SUBUNITS 6
75
76 #define MAPLE_NFUNC 32
77
78 struct maple_func {
79 int f_funcno;
80 struct maple_unit *f_unit;
81 struct device *f_dev;
82
83 /* callback */
84 void (*f_callback)(void *, struct maple_response *,
85 int /*len*/, int /*flags*/);
86 void *f_arg;
87
88 u_int32_t f_work; /* for periodic GETCOND and ping */
89
90 /* periodic command request */
91 enum maple_periodic_stat {
92 MAPLE_PERIODIC_NONE,
93 MAPLE_PERIODIC_INQ,
94 MAPLE_PERIODIC_DEFERED
95 } f_periodic_stat;
96 TAILQ_ENTRY(maple_func) f_periodicq;
97
98 /* command request */
99 int f_command;
100 int f_datalen;
101 void *f_dataaddr;
102 enum maple_command_stat {
103 MAPLE_CMDSTAT_NONE, /* not in queue */
104 MAPLE_CMDSTAT_ASYNC, /* process immediately */
105 MAPLE_CMDSTAT_PERIODIC_DEFERED, /* periodic but process imdtly*/
106 MAPLE_CMDSTAT_ASYNC_PERIODICQ, /* async but on periodic queue*/
107 MAPLE_CMDSTAT_PERIODIC /* process on periodic timing */
108 } f_cmdstat;
109 TAILQ_ENTRY(maple_func) f_cmdq;
110 };
111
112 /* work-around problem with 3rd party memory cards */
113 #define MAPLE_MEMCARD_PING_HACK
114
115 struct maple_unit {
116 int port, subunit;
117 struct maple_func u_func[MAPLE_NFUNC];
118 u_int32_t getcond_func_set;
119 int u_ping_func; /* function used for ping */
120 u_int32_t u_noping; /* stop ping (bitmap of function) */
121 #ifdef MAPLE_MEMCARD_PING_HACK
122 enum maple_ping_stat {
123 MAPLE_PING_NORMAL, /* ping with GETCOND */
124 MAPLE_PING_MEMCARD, /* memory card, possibly 3rd party */
125 MAPLE_PING_MINFO /* poorly implemented 3rd party card */
126 } u_ping_stat;
127 #endif
128 struct maple_devinfo devinfo;
129
130 /* DMA status / function */
131 enum maple_dma_stat {
132 MAPLE_DMA_IDLE, /* not in queue */
133 MAPLE_DMA_RETRY, /* retrying last command (sc_retryq) */
134 MAPLE_DMA_PERIODIC, /* periodic GETCOND */
135 MAPLE_DMA_ACMD, /* asynchronous command */
136 MAPLE_DMA_PCMD, /* command on periodic timing */
137 MAPLE_DMA_PROBE, /* checking for insertion */
138 MAPLE_DMA_PING /* checking for removal */
139 } u_dma_stat;
140 int u_dma_func;
141
142 SIMPLEQ_ENTRY(maple_unit) u_dmaq;
143
144 /* start of each receive buffer */
145 u_int32_t *u_rxbuf;
146 u_int32_t u_rxbuf_phys;
147
148 /* for restarting command */
149 int u_command;
150 int u_datalen;
151 void *u_dataaddr;
152 enum maple_dma_stat u_saved_dma_stat;
153 int u_retrycnt;
154 #define MAPLE_RETRY_MAX 100 /* ~2s */
155 /*
156 * The 2s retry is rather too long, but required to avoid
157 * unwanted detach/attach.
158 * If a Visual Memory (without cells) is inserted to a controller,
159 * the controller (including the base device and the other unit
160 * in the slot) stops responding for near 1 second. If two VM are
161 * inserted in succession, the period becomes near 2s.
162 */
163
164 /* queue for probe/ping */
165 enum maple_queue_stat {
166 MAPLE_QUEUE_NONE, /* not in queue */
167 MAPLE_QUEUE_PROBE, /* checking for insertion */
168 MAPLE_QUEUE_PING /* checking for removal */
169 } u_queuestat;
170 TAILQ_ENTRY(maple_unit) u_q;
171 int u_proberetry; /* retry count (subunit != 0) */
172 #define MAPLE_PROBERETRY_MAX 5
173 };
174
175 struct maple_softc {
176 struct device sc_dev;
177
178 struct callout maple_callout_ch;
179 struct proc *event_thread;
180
181 int8_t sc_port_unit_map[MAPLE_PORTS];
182 int sc_port_units[MAPLE_PORTS];
183 int sc_port_units_open[MAPLE_PORTS];
184
185 struct maple_unit sc_unit[MAPLE_PORTS][MAPLE_SUBUNITS];
186
187 u_int32_t *sc_txbuf; /* start of allocated transmit buffer */
188 u_int32_t *sc_txpos; /* current write position in tx buffer */
189 u_int32_t *sc_txlink; /* start of last written frame */
190
191 u_int32_t sc_txbuf_phys; /* 29-bit physical address */
192
193 void *sc_intrhand;
194 int sc_dmadone; /* wchan */
195
196 int sc_event; /* periodic event is active / wchan */
197
198 SIMPLEQ_HEAD(maple_dmaq_head, maple_unit) sc_dmaq, sc_retryq;
199 TAILQ_HEAD(maple_unitq_head, maple_unit) sc_probeq, sc_pingq;
200 TAILQ_HEAD(maple_fnq_head, maple_func) sc_periodicq, sc_periodicdeferq;
201 TAILQ_HEAD(maple_cmdq_head, maple_func) sc_acmdq, sc_pcmdq;
202 };
203