firewire.c revision 1.14.6.3 1 1.14.6.3 joerg /* $NetBSD: firewire.c,v 1.14.6.3 2007/11/14 19:26:54 joerg Exp $ */
2 1.1 kiyohara /*-
3 1.1 kiyohara * Copyright (c) 2003 Hidetoshi Shimokawa
4 1.1 kiyohara * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
5 1.1 kiyohara * All rights reserved.
6 1.1 kiyohara *
7 1.1 kiyohara * Redistribution and use in source and binary forms, with or without
8 1.1 kiyohara * modification, are permitted provided that the following conditions
9 1.1 kiyohara * are met:
10 1.1 kiyohara * 1. Redistributions of source code must retain the above copyright
11 1.1 kiyohara * notice, this list of conditions and the following disclaimer.
12 1.1 kiyohara * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 kiyohara * notice, this list of conditions and the following disclaimer in the
14 1.1 kiyohara * documentation and/or other materials provided with the distribution.
15 1.1 kiyohara * 3. All advertising materials mentioning features or use of this software
16 1.1 kiyohara * must display the acknowledgement as bellow:
17 1.1 kiyohara *
18 1.1 kiyohara * This product includes software developed by K. Kobayashi and H. Shimokawa
19 1.1 kiyohara *
20 1.1 kiyohara * 4. The name of the author may not be used to endorse or promote products
21 1.1 kiyohara * derived from this software without specific prior written permission.
22 1.1 kiyohara *
23 1.1 kiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 1.1 kiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 1.1 kiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 1.1 kiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27 1.1 kiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 1.1 kiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 1.1 kiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.1 kiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31 1.1 kiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 1.1 kiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 1.1 kiyohara * POSSIBILITY OF SUCH DAMAGE.
34 1.1 kiyohara *
35 1.14.6.2 joerg * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.101 2007/10/20 23:23:14 julian Exp $
36 1.1 kiyohara *
37 1.1 kiyohara */
38 1.1 kiyohara
39 1.1 kiyohara #if defined(__FreeBSD__)
40 1.1 kiyohara #include <sys/param.h>
41 1.1 kiyohara #include <sys/systm.h>
42 1.1 kiyohara #include <sys/types.h>
43 1.1 kiyohara
44 1.1 kiyohara #include <sys/kernel.h>
45 1.1 kiyohara #include <sys/module.h>
46 1.1 kiyohara #include <sys/malloc.h>
47 1.1 kiyohara #include <sys/conf.h>
48 1.1 kiyohara #include <sys/sysctl.h>
49 1.1 kiyohara #include <sys/kthread.h>
50 1.1 kiyohara
51 1.14.6.2 joerg #include <sys/kdb.h>
52 1.14.6.2 joerg
53 1.1 kiyohara #if defined(__DragonFly__) || __FreeBSD_version < 500000
54 1.1 kiyohara #include <machine/clock.h> /* for DELAY() */
55 1.1 kiyohara #endif
56 1.1 kiyohara
57 1.1 kiyohara #include <sys/bus.h> /* used by smbus and newbus */
58 1.14.6.1 joerg #include <sys/bus.h>
59 1.1 kiyohara
60 1.1 kiyohara #ifdef __DragonFly__
61 1.1 kiyohara #include "fw_port.h"
62 1.1 kiyohara #include "firewire.h"
63 1.1 kiyohara #include "firewirereg.h"
64 1.1 kiyohara #include "fwmem.h"
65 1.1 kiyohara #include "iec13213.h"
66 1.1 kiyohara #include "iec68113.h"
67 1.1 kiyohara #else
68 1.1 kiyohara #include <dev/firewire/fw_port.h>
69 1.1 kiyohara #include <dev/firewire/firewire.h>
70 1.1 kiyohara #include <dev/firewire/firewirereg.h>
71 1.1 kiyohara #include <dev/firewire/fwmem.h>
72 1.1 kiyohara #include <dev/firewire/iec13213.h>
73 1.1 kiyohara #include <dev/firewire/iec68113.h>
74 1.1 kiyohara #endif
75 1.1 kiyohara #elif defined(__NetBSD__)
76 1.1 kiyohara #include <sys/param.h>
77 1.1 kiyohara #include <sys/device.h>
78 1.1 kiyohara #include <sys/errno.h>
79 1.1 kiyohara #include <sys/conf.h>
80 1.1 kiyohara #include <sys/kernel.h>
81 1.1 kiyohara #include <sys/kthread.h>
82 1.1 kiyohara #include <sys/malloc.h>
83 1.1 kiyohara #include <sys/queue.h>
84 1.1 kiyohara #include <sys/sysctl.h>
85 1.1 kiyohara #include <sys/systm.h>
86 1.1 kiyohara
87 1.14.6.1 joerg #include <sys/bus.h>
88 1.1 kiyohara
89 1.1 kiyohara #include <dev/ieee1394/fw_port.h>
90 1.1 kiyohara #include <dev/ieee1394/firewire.h>
91 1.1 kiyohara #include <dev/ieee1394/firewirereg.h>
92 1.1 kiyohara #include <dev/ieee1394/fwmem.h>
93 1.1 kiyohara #include <dev/ieee1394/iec13213.h>
94 1.1 kiyohara #include <dev/ieee1394/iec68113.h>
95 1.1 kiyohara
96 1.1 kiyohara #include "locators.h"
97 1.1 kiyohara #endif
98 1.1 kiyohara
99 1.1 kiyohara struct crom_src_buf {
100 1.1 kiyohara struct crom_src src;
101 1.1 kiyohara struct crom_chunk root;
102 1.1 kiyohara struct crom_chunk vendor;
103 1.1 kiyohara struct crom_chunk hw;
104 1.1 kiyohara };
105 1.1 kiyohara
106 1.1 kiyohara int firewire_debug=0, try_bmr=1, hold_count=3;
107 1.1 kiyohara #if defined(__FreeBSD__)
108 1.1 kiyohara SYSCTL_INT(_debug, OID_AUTO, firewire_debug, CTLFLAG_RW, &firewire_debug, 0,
109 1.1 kiyohara "FireWire driver debug flag");
110 1.1 kiyohara SYSCTL_NODE(_hw, OID_AUTO, firewire, CTLFLAG_RD, 0, "FireWire Subsystem");
111 1.1 kiyohara SYSCTL_INT(_hw_firewire, OID_AUTO, try_bmr, CTLFLAG_RW, &try_bmr, 0,
112 1.1 kiyohara "Try to be a bus manager");
113 1.1 kiyohara SYSCTL_INT(_hw_firewire, OID_AUTO, hold_count, CTLFLAG_RW, &hold_count, 0,
114 1.1 kiyohara "Number of count of bus resets for removing lost device information");
115 1.1 kiyohara
116 1.1 kiyohara MALLOC_DEFINE(M_FW, "firewire", "FireWire");
117 1.1 kiyohara MALLOC_DEFINE(M_FWXFER, "fw_xfer", "XFER/FireWire");
118 1.1 kiyohara #elif defined(__NetBSD__)
119 1.1 kiyohara /*
120 1.1 kiyohara * Setup sysctl(3) MIB, hw.ieee1394if.*
121 1.1 kiyohara *
122 1.1 kiyohara * TBD condition CTLFLAG_PERMANENT on being an LKM or not
123 1.1 kiyohara */
124 1.1 kiyohara SYSCTL_SETUP(sysctl_ieee1394if, "sysctl ieee1394if(4) subtree setup")
125 1.1 kiyohara {
126 1.1 kiyohara int rc, ieee1394if_node_num;
127 1.1 kiyohara const struct sysctlnode *node;
128 1.1 kiyohara
129 1.1 kiyohara if ((rc = sysctl_createv(clog, 0, NULL, NULL,
130 1.1 kiyohara CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw", NULL,
131 1.1 kiyohara NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0) {
132 1.1 kiyohara goto err;
133 1.1 kiyohara }
134 1.1 kiyohara
135 1.1 kiyohara if ((rc = sysctl_createv(clog, 0, NULL, &node,
136 1.1 kiyohara CTLFLAG_PERMANENT, CTLTYPE_NODE, "ieee1394if",
137 1.1 kiyohara SYSCTL_DESCR("ieee1394if controls"),
138 1.1 kiyohara NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0) {
139 1.1 kiyohara goto err;
140 1.1 kiyohara }
141 1.1 kiyohara ieee1394if_node_num = node->sysctl_num;
142 1.1 kiyohara
143 1.1 kiyohara /* ieee1394if try bus manager flag */
144 1.1 kiyohara if ((rc = sysctl_createv(clog, 0, NULL, &node,
145 1.1 kiyohara CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
146 1.1 kiyohara "try_bmr", SYSCTL_DESCR("Try to be a bus manager"),
147 1.1 kiyohara NULL, 0, &try_bmr,
148 1.1 kiyohara 0, CTL_HW, ieee1394if_node_num, CTL_CREATE, CTL_EOL)) != 0) {
149 1.1 kiyohara goto err;
150 1.1 kiyohara }
151 1.1 kiyohara
152 1.1 kiyohara /* ieee1394if hold count */
153 1.1 kiyohara if ((rc = sysctl_createv(clog, 0, NULL, &node,
154 1.1 kiyohara CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
155 1.1 kiyohara "hold_count", SYSCTL_DESCR("Number of count of "
156 1.1 kiyohara "bus resets for removing lost device information"),
157 1.1 kiyohara NULL, 0, &hold_count,
158 1.1 kiyohara 0, CTL_HW, ieee1394if_node_num, CTL_CREATE, CTL_EOL)) != 0) {
159 1.1 kiyohara goto err;
160 1.1 kiyohara }
161 1.1 kiyohara
162 1.1 kiyohara /* ieee1394if driver debug flag */
163 1.1 kiyohara if ((rc = sysctl_createv(clog, 0, NULL, &node,
164 1.1 kiyohara CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
165 1.1 kiyohara "ieee1394_debug", SYSCTL_DESCR("ieee1394if driver debug flag"),
166 1.1 kiyohara NULL, 0, &firewire_debug,
167 1.1 kiyohara 0, CTL_HW, ieee1394if_node_num, CTL_CREATE, CTL_EOL)) != 0) {
168 1.1 kiyohara goto err;
169 1.1 kiyohara }
170 1.1 kiyohara
171 1.1 kiyohara return;
172 1.1 kiyohara
173 1.1 kiyohara err:
174 1.1 kiyohara printf("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
175 1.1 kiyohara }
176 1.1 kiyohara
177 1.1 kiyohara MALLOC_DEFINE(M_FW, "ieee1394", "IEEE1394");
178 1.1 kiyohara MALLOC_DEFINE(M_FWXFER, "fw_xfer", "XFER/IEEE1394");
179 1.1 kiyohara #endif
180 1.1 kiyohara
181 1.1 kiyohara #define FW_MAXASYRTY 4
182 1.1 kiyohara
183 1.1 kiyohara #if defined(__FreeBSD__)
184 1.1 kiyohara devclass_t firewire_devclass;
185 1.1 kiyohara
186 1.1 kiyohara static void firewire_identify (driver_t *, device_t);
187 1.1 kiyohara static int firewire_probe (device_t);
188 1.1 kiyohara static int firewire_attach (device_t);
189 1.1 kiyohara static int firewire_detach (device_t);
190 1.1 kiyohara static int firewire_resume (device_t);
191 1.1 kiyohara #if 0
192 1.1 kiyohara static int firewire_shutdown (device_t);
193 1.1 kiyohara #endif
194 1.1 kiyohara static device_t firewire_add_child (device_t, int, const char *, int);
195 1.1 kiyohara #elif defined(__NetBSD__)
196 1.1 kiyohara int firewirematch (struct device *, struct cfdata *, void *);
197 1.1 kiyohara void firewireattach (struct device *, struct device *, void *);
198 1.1 kiyohara int firewiredetach (struct device *, int);
199 1.1 kiyohara int firewire_print (void *, const char *);
200 1.14.6.2 joerg int firewire_resume(struct firewire_comm *);
201 1.1 kiyohara #endif
202 1.14.6.2 joerg static void firewire_xfer_timeout(void *, int);
203 1.1 kiyohara static void fw_try_bmr (void *);
204 1.1 kiyohara static void fw_try_bmr_callback (struct fw_xfer *);
205 1.1 kiyohara static void fw_asystart (struct fw_xfer *);
206 1.1 kiyohara static int fw_get_tlabel (struct firewire_comm *, struct fw_xfer *);
207 1.1 kiyohara static void fw_bus_probe (struct firewire_comm *);
208 1.1 kiyohara static void fw_attach_dev (struct firewire_comm *);
209 1.1 kiyohara static void fw_bus_probe_thread(void *);
210 1.1 kiyohara #ifdef FW_VMACCESS
211 1.1 kiyohara static void fw_vmaccess (struct fw_xfer *);
212 1.1 kiyohara #endif
213 1.1 kiyohara static int fw_bmr (struct firewire_comm *);
214 1.14.6.2 joerg static void fw_dump_hdr(struct fw_pkt *, const char *);
215 1.1 kiyohara
216 1.1 kiyohara #if defined(__FreeBSD__)
217 1.1 kiyohara static device_method_t firewire_methods[] = {
218 1.1 kiyohara /* Device interface */
219 1.1 kiyohara DEVMETHOD(device_identify, firewire_identify),
220 1.1 kiyohara DEVMETHOD(device_probe, firewire_probe),
221 1.1 kiyohara DEVMETHOD(device_attach, firewire_attach),
222 1.1 kiyohara DEVMETHOD(device_detach, firewire_detach),
223 1.1 kiyohara DEVMETHOD(device_suspend, bus_generic_suspend),
224 1.1 kiyohara DEVMETHOD(device_resume, firewire_resume),
225 1.1 kiyohara DEVMETHOD(device_shutdown, bus_generic_shutdown),
226 1.1 kiyohara
227 1.1 kiyohara /* Bus interface */
228 1.1 kiyohara DEVMETHOD(bus_add_child, firewire_add_child),
229 1.1 kiyohara DEVMETHOD(bus_print_child, bus_generic_print_child),
230 1.1 kiyohara
231 1.1 kiyohara { 0, 0 }
232 1.1 kiyohara };
233 1.1 kiyohara #elif defined(__NetBSD__)
234 1.1 kiyohara CFATTACH_DECL(ieee1394if, sizeof (struct firewire_softc),
235 1.1 kiyohara firewirematch, firewireattach, firewiredetach, NULL);
236 1.1 kiyohara #endif
237 1.2 drochner const char *fw_linkspeed[] = {
238 1.1 kiyohara "S100", "S200", "S400", "S800",
239 1.1 kiyohara "S1600", "S3200", "undef", "undef"
240 1.1 kiyohara };
241 1.1 kiyohara
242 1.1 kiyohara static const char *tcode_str[] = {
243 1.1 kiyohara "WREQQ", "WREQB", "WRES", "undef",
244 1.1 kiyohara "RREQQ", "RREQB", "RRESQ", "RRESB",
245 1.1 kiyohara "CYCS", "LREQ", "STREAM", "LRES",
246 1.1 kiyohara "undef", "undef", "PHY", "undef"
247 1.1 kiyohara };
248 1.1 kiyohara
249 1.1 kiyohara /* IEEE-1394a Table C-2 Gap count as a function of hops*/
250 1.1 kiyohara #define MAX_GAPHOP 15
251 1.1 kiyohara u_int gap_cnt[] = { 5, 5, 7, 8, 10, 13, 16, 18,
252 1.1 kiyohara 21, 24, 26, 29, 32, 35, 37, 40};
253 1.1 kiyohara
254 1.1 kiyohara #if defined(__FreeBSD__)
255 1.1 kiyohara static driver_t firewire_driver = {
256 1.1 kiyohara "firewire",
257 1.1 kiyohara firewire_methods,
258 1.1 kiyohara sizeof(struct firewire_softc),
259 1.1 kiyohara };
260 1.1 kiyohara #endif
261 1.1 kiyohara
262 1.1 kiyohara /*
263 1.1 kiyohara * Lookup fwdev by node id.
264 1.1 kiyohara */
265 1.1 kiyohara struct fw_device *
266 1.1 kiyohara fw_noderesolve_nodeid(struct firewire_comm *fc, int dst)
267 1.1 kiyohara {
268 1.1 kiyohara struct fw_device *fwdev;
269 1.1 kiyohara int s;
270 1.1 kiyohara
271 1.1 kiyohara s = splfw();
272 1.14.6.2 joerg FW_GLOCK(fc);
273 1.1 kiyohara STAILQ_FOREACH(fwdev, &fc->devices, link)
274 1.1 kiyohara if (fwdev->dst == dst && fwdev->status != FWDEVINVAL)
275 1.1 kiyohara break;
276 1.14.6.2 joerg FW_GUNLOCK(fc);
277 1.1 kiyohara splx(s);
278 1.1 kiyohara
279 1.1 kiyohara return fwdev;
280 1.1 kiyohara }
281 1.1 kiyohara
282 1.1 kiyohara /*
283 1.1 kiyohara * Lookup fwdev by EUI64.
284 1.1 kiyohara */
285 1.1 kiyohara struct fw_device *
286 1.1 kiyohara fw_noderesolve_eui64(struct firewire_comm *fc, struct fw_eui64 *eui)
287 1.1 kiyohara {
288 1.1 kiyohara struct fw_device *fwdev;
289 1.1 kiyohara int s;
290 1.1 kiyohara
291 1.1 kiyohara s = splfw();
292 1.1 kiyohara STAILQ_FOREACH(fwdev, &fc->devices, link)
293 1.1 kiyohara if (FW_EUI64_EQUAL(fwdev->eui, *eui))
294 1.1 kiyohara break;
295 1.1 kiyohara splx(s);
296 1.1 kiyohara
297 1.1 kiyohara if(fwdev == NULL) return NULL;
298 1.1 kiyohara if(fwdev->status == FWDEVINVAL) return NULL;
299 1.1 kiyohara return fwdev;
300 1.1 kiyohara }
301 1.1 kiyohara
302 1.1 kiyohara /*
303 1.1 kiyohara * Async. request procedure for userland application.
304 1.1 kiyohara */
305 1.1 kiyohara int
306 1.11 christos fw_asyreq(struct firewire_comm *fc, int sub, struct fw_xfer *xfer)
307 1.1 kiyohara {
308 1.1 kiyohara int err = 0;
309 1.1 kiyohara struct fw_xferq *xferq;
310 1.14.6.2 joerg int len;
311 1.1 kiyohara struct fw_pkt *fp;
312 1.1 kiyohara int tcode;
313 1.2 drochner const struct tcode_info *info;
314 1.1 kiyohara
315 1.1 kiyohara if(xfer == NULL) return EINVAL;
316 1.1 kiyohara if(xfer->hand == NULL){
317 1.1 kiyohara printf("hand == NULL\n");
318 1.1 kiyohara return EINVAL;
319 1.1 kiyohara }
320 1.1 kiyohara fp = &xfer->send.hdr;
321 1.1 kiyohara
322 1.1 kiyohara tcode = fp->mode.common.tcode & 0xf;
323 1.1 kiyohara info = &fc->tcode[tcode];
324 1.1 kiyohara if (info->flag == 0) {
325 1.1 kiyohara printf("invalid tcode=%x\n", tcode);
326 1.1 kiyohara return EINVAL;
327 1.1 kiyohara }
328 1.14.6.2 joerg
329 1.14.6.2 joerg /* XXX allow bus explore packets only after bus rest */
330 1.14.6.2 joerg if ((fc->status < FWBUSEXPLORE) &&
331 1.14.6.2 joerg ((tcode != FWTCODE_RREQQ) || (fp->mode.rreqq.dest_hi != 0xffff) ||
332 1.14.6.2 joerg (fp->mode.rreqq.dest_lo < 0xf0000000) ||
333 1.14.6.2 joerg (fp->mode.rreqq.dest_lo >= 0xf0001000))) {
334 1.14.6.2 joerg xfer->resp = EAGAIN;
335 1.14.6.2 joerg xfer->flag = FWXF_BUSY;
336 1.14.6.2 joerg return (EAGAIN);
337 1.14.6.2 joerg }
338 1.14.6.2 joerg
339 1.1 kiyohara if (info->flag & FWTI_REQ)
340 1.1 kiyohara xferq = fc->atq;
341 1.1 kiyohara else
342 1.1 kiyohara xferq = fc->ats;
343 1.1 kiyohara len = info->hdr_len;
344 1.1 kiyohara if (xfer->send.pay_len > MAXREC(fc->maxrec)) {
345 1.1 kiyohara printf("send.pay_len > maxrec\n");
346 1.1 kiyohara return EINVAL;
347 1.1 kiyohara }
348 1.1 kiyohara if (info->flag & FWTI_BLOCK_STR)
349 1.1 kiyohara len = fp->mode.stream.len;
350 1.1 kiyohara else if (info->flag & FWTI_BLOCK_ASY)
351 1.1 kiyohara len = fp->mode.rresb.len;
352 1.1 kiyohara else
353 1.1 kiyohara len = 0;
354 1.1 kiyohara if (len != xfer->send.pay_len){
355 1.1 kiyohara printf("len(%d) != send.pay_len(%d) %s(%x)\n",
356 1.1 kiyohara len, xfer->send.pay_len, tcode_str[tcode], tcode);
357 1.1 kiyohara return EINVAL;
358 1.1 kiyohara }
359 1.1 kiyohara
360 1.1 kiyohara if(xferq->start == NULL){
361 1.1 kiyohara printf("xferq->start == NULL\n");
362 1.1 kiyohara return EINVAL;
363 1.1 kiyohara }
364 1.1 kiyohara if(!(xferq->queued < xferq->maxq)){
365 1.14.6.2 joerg fw_printf(fc->bdev, "Discard a packet (queued=%d)\n",
366 1.1 kiyohara xferq->queued);
367 1.14.6.2 joerg return EAGAIN;
368 1.1 kiyohara }
369 1.1 kiyohara
370 1.14.6.2 joerg xfer->tl = -1;
371 1.1 kiyohara if (info->flag & FWTI_TLABEL) {
372 1.14.6.2 joerg if (fw_get_tlabel(fc, xfer) < 0)
373 1.1 kiyohara return EAGAIN;
374 1.1 kiyohara }
375 1.1 kiyohara
376 1.1 kiyohara xfer->resp = 0;
377 1.1 kiyohara xfer->fc = fc;
378 1.1 kiyohara xfer->q = xferq;
379 1.1 kiyohara
380 1.1 kiyohara fw_asystart(xfer);
381 1.1 kiyohara return err;
382 1.1 kiyohara }
383 1.1 kiyohara /*
384 1.1 kiyohara * Wakeup blocked process.
385 1.1 kiyohara */
386 1.1 kiyohara void
387 1.14.6.2 joerg fw_xferwake(struct fw_xfer *xfer)
388 1.14.6.2 joerg {
389 1.14.6.2 joerg fw_mtx_t lock = &xfer->fc->wait_lock;
390 1.14.6.2 joerg
391 1.14.6.2 joerg fw_mtx_lock(lock);
392 1.14.6.2 joerg xfer->flag |= FWXF_WAKE;
393 1.14.6.2 joerg fw_mtx_unlock(lock);
394 1.14.6.2 joerg
395 1.1 kiyohara wakeup(xfer);
396 1.1 kiyohara return;
397 1.1 kiyohara }
398 1.1 kiyohara
399 1.14.6.2 joerg int
400 1.14.6.2 joerg fw_xferwait(struct fw_xfer *xfer)
401 1.14.6.2 joerg {
402 1.14.6.2 joerg fw_mtx_t lock = &xfer->fc->wait_lock;
403 1.14.6.2 joerg int err = 0;
404 1.14.6.2 joerg
405 1.14.6.2 joerg fw_mtx_lock(lock);
406 1.14.6.2 joerg if ((xfer->flag & FWXF_WAKE) == 0)
407 1.14.6.2 joerg err = fw_msleep((void *)xfer, lock, PWAIT|PCATCH, "fw_xferwait", 0);
408 1.14.6.2 joerg fw_mtx_unlock(lock);
409 1.14.6.2 joerg
410 1.14.6.2 joerg return (err);
411 1.14.6.2 joerg }
412 1.14.6.2 joerg
413 1.1 kiyohara /*
414 1.1 kiyohara * Async. request with given xfer structure.
415 1.1 kiyohara */
416 1.1 kiyohara static void
417 1.1 kiyohara fw_asystart(struct fw_xfer *xfer)
418 1.1 kiyohara {
419 1.1 kiyohara struct firewire_comm *fc = xfer->fc;
420 1.1 kiyohara int s;
421 1.1 kiyohara s = splfw();
422 1.14.6.2 joerg /* Protect from interrupt/timeout */
423 1.14.6.2 joerg FW_GLOCK(fc);
424 1.14.6.2 joerg xfer->flag = FWXF_INQ;
425 1.1 kiyohara STAILQ_INSERT_TAIL(&xfer->q->q, xfer, link);
426 1.14.6.2 joerg #if 0
427 1.1 kiyohara xfer->q->queued ++;
428 1.14.6.2 joerg #endif
429 1.14.6.2 joerg FW_GUNLOCK(fc);
430 1.1 kiyohara splx(s);
431 1.1 kiyohara /* XXX just queue for mbuf */
432 1.1 kiyohara if (xfer->mbuf == NULL)
433 1.1 kiyohara xfer->q->start(fc);
434 1.1 kiyohara return;
435 1.1 kiyohara }
436 1.1 kiyohara
437 1.1 kiyohara #if defined(__FreeBSD__)
438 1.1 kiyohara static void
439 1.1 kiyohara firewire_identify(driver_t *driver, device_t parent)
440 1.1 kiyohara {
441 1.1 kiyohara BUS_ADD_CHILD(parent, 0, "firewire", -1);
442 1.1 kiyohara }
443 1.1 kiyohara
444 1.1 kiyohara static int
445 1.1 kiyohara firewire_probe(device_t dev)
446 1.1 kiyohara {
447 1.1 kiyohara device_set_desc(dev, "IEEE1394(FireWire) bus");
448 1.1 kiyohara return (0);
449 1.1 kiyohara }
450 1.1 kiyohara #elif defined(__NetBSD__)
451 1.1 kiyohara int
452 1.11 christos firewirematch(struct device *parent, struct cfdata *cf,
453 1.10 christos void *aux)
454 1.1 kiyohara {
455 1.1 kiyohara struct fwbus_attach_args *faa = (struct fwbus_attach_args *)aux;
456 1.1 kiyohara
457 1.1 kiyohara if (strcmp(faa->name, "ieee1394if") == 0)
458 1.1 kiyohara return (1);
459 1.1 kiyohara return (0);
460 1.1 kiyohara }
461 1.1 kiyohara #endif
462 1.1 kiyohara
463 1.1 kiyohara static void
464 1.14.6.2 joerg firewire_xfer_timeout(void *arg, int pending)
465 1.1 kiyohara {
466 1.14.6.2 joerg struct firewire_comm *fc = (struct firewire_comm *)arg;
467 1.14.6.2 joerg struct fw_xfer *xfer, *txfer;
468 1.1 kiyohara struct timeval tv;
469 1.1 kiyohara struct timeval split_timeout;
470 1.14.6.2 joerg STAILQ_HEAD(, fw_xfer) xfer_timeout;
471 1.1 kiyohara int i, s;
472 1.1 kiyohara
473 1.1 kiyohara split_timeout.tv_sec = 0;
474 1.1 kiyohara split_timeout.tv_usec = 200 * 1000; /* 200 msec */
475 1.1 kiyohara
476 1.1 kiyohara microtime(&tv);
477 1.14.6.2 joerg fw_timevalsub(&tv, &split_timeout);
478 1.14.6.2 joerg STAILQ_INIT(&xfer_timeout);
479 1.1 kiyohara
480 1.1 kiyohara s = splfw();
481 1.14.6.2 joerg fw_mtx_lock(&fc->tlabel_lock);
482 1.1 kiyohara for (i = 0; i < 0x40; i ++) {
483 1.1 kiyohara while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
484 1.14.6.2 joerg if ((xfer->flag & FWXF_SENT) == 0)
485 1.1 kiyohara /* not sent yet */
486 1.1 kiyohara break;
487 1.14.6.2 joerg if (fw_timevalcmp(&xfer->tv, &tv, >))
488 1.14.6.2 joerg /* the rests are newer than this */
489 1.14.6.2 joerg break;
490 1.14.6.2 joerg fw_printf(fc->bdev,
491 1.14.6.2 joerg "split transaction timeout: "
492 1.14.6.2 joerg "tl=0x%x flag=0x%02x\n", i, xfer->flag);
493 1.14.6.2 joerg fw_dump_hdr(&xfer->send.hdr, "send");
494 1.1 kiyohara xfer->resp = ETIMEDOUT;
495 1.14.6.2 joerg STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel);
496 1.14.6.2 joerg STAILQ_INSERT_TAIL(&xfer_timeout, xfer, tlabel);
497 1.1 kiyohara }
498 1.1 kiyohara }
499 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
500 1.1 kiyohara splx(s);
501 1.14.6.2 joerg fc->timeout(fc);
502 1.14.6.2 joerg
503 1.14.6.2 joerg STAILQ_FOREACH_SAFE(xfer, &xfer_timeout, tlabel, txfer)
504 1.14.6.2 joerg xfer->hand(xfer);
505 1.1 kiyohara }
506 1.1 kiyohara
507 1.14.6.2 joerg #define WATCHDOG_HZ 10
508 1.1 kiyohara static void
509 1.1 kiyohara firewire_watchdog(void *arg)
510 1.1 kiyohara {
511 1.1 kiyohara struct firewire_comm *fc;
512 1.14.6.2 joerg static int watchdog_clock = 0;
513 1.1 kiyohara
514 1.1 kiyohara fc = (struct firewire_comm *)arg;
515 1.1 kiyohara
516 1.1 kiyohara /*
517 1.1 kiyohara * At boot stage, the device interrupt is disabled and
518 1.1 kiyohara * We encounter a timeout easily. To avoid this,
519 1.1 kiyohara * ignore clock interrupt for a while.
520 1.1 kiyohara */
521 1.14.6.2 joerg if (watchdog_clock > WATCHDOG_HZ * 15)
522 1.14.6.2 joerg fw_taskqueue_enqueue(fc->taskqueue, &fc->task_timeout);
523 1.14.6.2 joerg else
524 1.14.6.2 joerg watchdog_clock ++;
525 1.1 kiyohara
526 1.14.6.2 joerg fw_callout_reset(&fc->timeout_callout, hz / WATCHDOG_HZ,
527 1.1 kiyohara (void *)firewire_watchdog, (void *)fc);
528 1.1 kiyohara }
529 1.1 kiyohara
530 1.1 kiyohara /*
531 1.1 kiyohara * The attach routine.
532 1.1 kiyohara */
533 1.1 kiyohara FW_ATTACH(firewire)
534 1.1 kiyohara {
535 1.1 kiyohara FW_ATTACH_START(firewire, sc, fwa);
536 1.1 kiyohara FIREWIRE_ATTACH_START;
537 1.1 kiyohara
538 1.1 kiyohara sc->fc = fc;
539 1.1 kiyohara fc->status = FWBUSNOTREADY;
540 1.1 kiyohara
541 1.1 kiyohara if( fc->nisodma > FWMAXNDMA) fc->nisodma = FWMAXNDMA;
542 1.1 kiyohara
543 1.1 kiyohara FWDEV_MAKEDEV(sc);
544 1.1 kiyohara
545 1.14.6.2 joerg fw_mtx_init(&fc->wait_lock, "fwwait", NULL, MTX_DEF);
546 1.14.6.2 joerg fw_mtx_init(&fc->tlabel_lock, "fwtlabel", NULL, MTX_DEF);
547 1.14.6.2 joerg fw_callout_init(&fc->timeout_callout);
548 1.14.6.2 joerg fw_callout_init(&fc->bmr_callout);
549 1.14.6.2 joerg fw_callout_init(&fc->busprobe_callout);
550 1.14.6.2 joerg FW_TASK_INIT(&fc->task_timeout, 0, firewire_xfer_timeout, (void *)fc);
551 1.1 kiyohara
552 1.14.6.2 joerg fw_callout_reset(&sc->fc->timeout_callout, hz,
553 1.1 kiyohara (void *)firewire_watchdog, (void *)sc->fc);
554 1.1 kiyohara
555 1.14.6.2 joerg /* create thread */
556 1.14.6.2 joerg fw_kthread_create(fw_bus_probe_thread, (void *)fc, &fc->probe_thread,
557 1.14.6.2 joerg "fw%d_probe", fw_get_unit(fc->bdev));
558 1.14.6.2 joerg fw_config_pending_incr();
559 1.1 kiyohara
560 1.1 kiyohara FIREWIRE_GENERIC_ATTACH;
561 1.1 kiyohara
562 1.1 kiyohara /* bus_reset */
563 1.14.6.2 joerg fw_busreset(fc, FWBUSNOTREADY);
564 1.1 kiyohara fc->ibr(fc);
565 1.1 kiyohara
566 1.14.6.3 joerg #ifdef __NetBSD__
567 1.14.6.3 joerg if (!pnp_device_register(self, NULL, NULL))
568 1.14.6.3 joerg aprint_error_dev(self, "couldn't establish power handler\n");
569 1.14.6.3 joerg #endif
570 1.14.6.3 joerg
571 1.1 kiyohara FW_ATTACH_RETURN(0);
572 1.1 kiyohara }
573 1.1 kiyohara
574 1.1 kiyohara #if defined(__FreeBSD__)
575 1.1 kiyohara /*
576 1.1 kiyohara * Attach it as child.
577 1.1 kiyohara */
578 1.1 kiyohara static device_t
579 1.1 kiyohara firewire_add_child(device_t dev, int order, const char *name, int unit)
580 1.1 kiyohara {
581 1.1 kiyohara device_t child;
582 1.1 kiyohara struct firewire_softc *sc;
583 1.1 kiyohara struct fw_attach_args fwa;
584 1.1 kiyohara
585 1.1 kiyohara sc = (struct firewire_softc *)device_get_softc(dev);
586 1.1 kiyohara child = device_add_child(dev, name, unit);
587 1.1 kiyohara if (child) {
588 1.1 kiyohara fwa.name = name;
589 1.1 kiyohara fwa.fc = sc->fc;
590 1.1 kiyohara fwa.fwdev = NULL;
591 1.1 kiyohara device_set_ivars(child, &fwa);
592 1.1 kiyohara device_probe_and_attach(child);
593 1.1 kiyohara }
594 1.1 kiyohara
595 1.1 kiyohara return child;
596 1.1 kiyohara }
597 1.1 kiyohara
598 1.1 kiyohara static int
599 1.1 kiyohara firewire_resume(device_t dev)
600 1.1 kiyohara {
601 1.1 kiyohara struct firewire_softc *sc;
602 1.1 kiyohara
603 1.1 kiyohara sc = (struct firewire_softc *)device_get_softc(dev);
604 1.1 kiyohara sc->fc->status = FWBUSNOTREADY;
605 1.1 kiyohara
606 1.1 kiyohara bus_generic_resume(dev);
607 1.1 kiyohara
608 1.1 kiyohara return(0);
609 1.1 kiyohara }
610 1.1 kiyohara #endif
611 1.1 kiyohara
612 1.1 kiyohara /*
613 1.1 kiyohara * Dettach it.
614 1.1 kiyohara */
615 1.1 kiyohara FW_DETACH(firewire)
616 1.1 kiyohara {
617 1.1 kiyohara FW_DETACH_START(firewire, sc);
618 1.1 kiyohara struct firewire_comm *fc;
619 1.1 kiyohara struct fw_device *fwdev, *fwdev_next;
620 1.1 kiyohara
621 1.1 kiyohara fc = sc->fc;
622 1.14.6.2 joerg fw_mtx_lock(&fc->wait_lock);
623 1.1 kiyohara fc->status = FWBUSDETACH;
624 1.14.6.2 joerg wakeup(fc);
625 1.14.6.2 joerg if (fw_msleep(fc->probe_thread,
626 1.14.6.2 joerg &fc->wait_lock, PWAIT, "fwthr", hz * 60))
627 1.14.6.2 joerg printf("firewire probe thread didn't die\n");
628 1.14.6.2 joerg fw_mtx_unlock(&fc->wait_lock);
629 1.1 kiyohara
630 1.1 kiyohara FWDEV_DESTROYDEV(sc);
631 1.1 kiyohara FIREWIRE_GENERIC_DETACH;
632 1.1 kiyohara
633 1.14.6.2 joerg fw_callout_stop(&fc->timeout_callout);
634 1.14.6.2 joerg fw_callout_stop(&fc->bmr_callout);
635 1.14.6.2 joerg fw_callout_stop(&fc->busprobe_callout);
636 1.1 kiyohara
637 1.1 kiyohara /* XXX xfree_free and untimeout on all xfers */
638 1.1 kiyohara for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL;
639 1.1 kiyohara fwdev = fwdev_next) {
640 1.1 kiyohara fwdev_next = STAILQ_NEXT(fwdev, link);
641 1.1 kiyohara free(fwdev, M_FW);
642 1.1 kiyohara }
643 1.1 kiyohara free(fc->topology_map, M_FW);
644 1.1 kiyohara free(fc->speed_map, M_FW);
645 1.1 kiyohara free(fc->crom_src_buf, M_FW);
646 1.1 kiyohara
647 1.14.6.2 joerg fw_mtx_destroy(&fc->wait_lock);
648 1.14.6.2 joerg fw_mtx_destroy(&fc->tlabel_lock);
649 1.1 kiyohara return(0);
650 1.1 kiyohara }
651 1.1 kiyohara #if defined(__FreeBSD__)
652 1.1 kiyohara #if 0
653 1.1 kiyohara static int
654 1.1 kiyohara firewire_shutdown( device_t dev )
655 1.1 kiyohara {
656 1.1 kiyohara return 0;
657 1.1 kiyohara }
658 1.1 kiyohara #endif
659 1.1 kiyohara #elif defined(__NetBSD__)
660 1.1 kiyohara int
661 1.1 kiyohara firewire_print(void *aux, const char *pnp)
662 1.1 kiyohara {
663 1.9 kiyohara struct fw_attach_args *fwa = (struct fw_attach_args *)aux;
664 1.1 kiyohara
665 1.1 kiyohara if (pnp)
666 1.9 kiyohara aprint_normal("%s at %s", fwa->name, pnp);
667 1.1 kiyohara
668 1.1 kiyohara return UNCONF;
669 1.13 kiyohara }
670 1.14.6.2 joerg
671 1.14.6.2 joerg int
672 1.14.6.2 joerg firewire_resume(struct firewire_comm *fc)
673 1.14.6.2 joerg {
674 1.14.6.2 joerg
675 1.14.6.2 joerg fc->status = FWBUSNOTREADY;
676 1.14.6.2 joerg return 0;
677 1.14.6.2 joerg }
678 1.1 kiyohara #endif
679 1.1 kiyohara
680 1.1 kiyohara static void
681 1.1 kiyohara fw_xferq_drain(struct fw_xferq *xferq)
682 1.1 kiyohara {
683 1.1 kiyohara struct fw_xfer *xfer;
684 1.1 kiyohara
685 1.1 kiyohara while ((xfer = STAILQ_FIRST(&xferq->q)) != NULL) {
686 1.1 kiyohara STAILQ_REMOVE_HEAD(&xferq->q, link);
687 1.14.6.2 joerg #if 0
688 1.1 kiyohara xferq->queued --;
689 1.14.6.2 joerg #endif
690 1.1 kiyohara xfer->resp = EAGAIN;
691 1.14.6.2 joerg xfer->flag = FWXF_SENTERR;
692 1.1 kiyohara fw_xfer_done(xfer);
693 1.1 kiyohara }
694 1.1 kiyohara }
695 1.1 kiyohara
696 1.1 kiyohara void
697 1.1 kiyohara fw_drain_txq(struct firewire_comm *fc)
698 1.1 kiyohara {
699 1.14.6.2 joerg struct fw_xfer *xfer, *txfer;
700 1.14.6.2 joerg STAILQ_HEAD(, fw_xfer) xfer_drain;
701 1.1 kiyohara int i;
702 1.1 kiyohara
703 1.14.6.2 joerg STAILQ_INIT(&xfer_drain);
704 1.14.6.2 joerg
705 1.14.6.2 joerg FW_GLOCK(fc);
706 1.1 kiyohara fw_xferq_drain(fc->atq);
707 1.1 kiyohara fw_xferq_drain(fc->ats);
708 1.1 kiyohara for(i = 0; i < fc->nisodma; i++)
709 1.1 kiyohara fw_xferq_drain(fc->it[i]);
710 1.14.6.2 joerg FW_GUNLOCK(fc);
711 1.14.6.2 joerg
712 1.14.6.2 joerg fw_mtx_lock(&fc->tlabel_lock);
713 1.14.6.2 joerg for (i = 0; i < 0x40; i ++)
714 1.14.6.2 joerg while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
715 1.14.6.2 joerg if (firewire_debug)
716 1.14.6.2 joerg printf("tl=%d flag=%d\n", i, xfer->flag);
717 1.14.6.2 joerg xfer->resp = EAGAIN;
718 1.14.6.2 joerg STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel);
719 1.14.6.2 joerg STAILQ_INSERT_TAIL(&xfer_drain, xfer, tlabel);
720 1.14.6.2 joerg }
721 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
722 1.14.6.2 joerg
723 1.14.6.2 joerg STAILQ_FOREACH_SAFE(xfer, &xfer_drain, tlabel, txfer)
724 1.14.6.2 joerg xfer->hand(xfer);
725 1.1 kiyohara }
726 1.1 kiyohara
727 1.1 kiyohara static void
728 1.1 kiyohara fw_reset_csr(struct firewire_comm *fc)
729 1.1 kiyohara {
730 1.1 kiyohara int i;
731 1.1 kiyohara
732 1.1 kiyohara CSRARC(fc, STATE_CLEAR)
733 1.1 kiyohara = 1 << 23 | 0 << 17 | 1 << 16 | 1 << 15 | 1 << 14 ;
734 1.1 kiyohara CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR);
735 1.1 kiyohara CSRARC(fc, NODE_IDS) = 0x3f;
736 1.1 kiyohara
737 1.1 kiyohara CSRARC(fc, TOPO_MAP + 8) = 0;
738 1.1 kiyohara fc->irm = -1;
739 1.1 kiyohara
740 1.1 kiyohara fc->max_node = -1;
741 1.1 kiyohara
742 1.1 kiyohara for(i = 2; i < 0x100/4 - 2 ; i++){
743 1.1 kiyohara CSRARC(fc, SPED_MAP + i * 4) = 0;
744 1.1 kiyohara }
745 1.1 kiyohara CSRARC(fc, STATE_CLEAR) = 1 << 23 | 0 << 17 | 1 << 16 | 1 << 15 | 1 << 14 ;
746 1.1 kiyohara CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR);
747 1.1 kiyohara CSRARC(fc, RESET_START) = 0;
748 1.1 kiyohara CSRARC(fc, SPLIT_TIMEOUT_HI) = 0;
749 1.1 kiyohara CSRARC(fc, SPLIT_TIMEOUT_LO) = 800 << 19;
750 1.1 kiyohara CSRARC(fc, CYCLE_TIME) = 0x0;
751 1.1 kiyohara CSRARC(fc, BUS_TIME) = 0x0;
752 1.1 kiyohara CSRARC(fc, BUS_MGR_ID) = 0x3f;
753 1.1 kiyohara CSRARC(fc, BANDWIDTH_AV) = 4915;
754 1.1 kiyohara CSRARC(fc, CHANNELS_AV_HI) = 0xffffffff;
755 1.1 kiyohara CSRARC(fc, CHANNELS_AV_LO) = 0xffffffff;
756 1.1 kiyohara CSRARC(fc, IP_CHANNELS) = (1 << 31);
757 1.1 kiyohara
758 1.1 kiyohara CSRARC(fc, CONF_ROM) = 0x04 << 24;
759 1.1 kiyohara CSRARC(fc, CONF_ROM + 4) = 0x31333934; /* means strings 1394 */
760 1.1 kiyohara CSRARC(fc, CONF_ROM + 8) = 1 << 31 | 1 << 30 | 1 << 29 |
761 1.1 kiyohara 1 << 28 | 0xff << 16 | 0x09 << 8;
762 1.1 kiyohara CSRARC(fc, CONF_ROM + 0xc) = 0;
763 1.1 kiyohara
764 1.1 kiyohara /* DV depend CSRs see blue book */
765 1.1 kiyohara CSRARC(fc, oPCR) &= ~DV_BROADCAST_ON;
766 1.1 kiyohara CSRARC(fc, iPCR) &= ~DV_BROADCAST_ON;
767 1.1 kiyohara
768 1.1 kiyohara CSRARC(fc, STATE_CLEAR) &= ~(1 << 23 | 1 << 15 | 1 << 14 );
769 1.1 kiyohara CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR);
770 1.1 kiyohara }
771 1.1 kiyohara
772 1.1 kiyohara static void
773 1.1 kiyohara fw_init_crom(struct firewire_comm *fc)
774 1.1 kiyohara {
775 1.1 kiyohara struct crom_src *src;
776 1.1 kiyohara
777 1.1 kiyohara fc->crom_src_buf = (struct crom_src_buf *)
778 1.1 kiyohara malloc(sizeof(struct crom_src_buf), M_FW, M_WAITOK | M_ZERO);
779 1.1 kiyohara if (fc->crom_src_buf == NULL)
780 1.1 kiyohara return;
781 1.1 kiyohara
782 1.1 kiyohara src = &fc->crom_src_buf->src;
783 1.1 kiyohara bzero(src, sizeof(struct crom_src));
784 1.1 kiyohara
785 1.1 kiyohara /* BUS info sample */
786 1.1 kiyohara src->hdr.info_len = 4;
787 1.1 kiyohara
788 1.1 kiyohara src->businfo.bus_name = CSR_BUS_NAME_IEEE1394;
789 1.1 kiyohara
790 1.1 kiyohara src->businfo.irmc = 1;
791 1.1 kiyohara src->businfo.cmc = 1;
792 1.1 kiyohara src->businfo.isc = 1;
793 1.1 kiyohara src->businfo.bmc = 1;
794 1.1 kiyohara src->businfo.pmc = 0;
795 1.1 kiyohara src->businfo.cyc_clk_acc = 100;
796 1.1 kiyohara src->businfo.max_rec = fc->maxrec;
797 1.1 kiyohara src->businfo.max_rom = MAXROM_4;
798 1.1 kiyohara src->businfo.generation = 1;
799 1.1 kiyohara src->businfo.link_spd = fc->speed;
800 1.1 kiyohara
801 1.1 kiyohara src->businfo.eui64.hi = fc->eui.hi;
802 1.1 kiyohara src->businfo.eui64.lo = fc->eui.lo;
803 1.1 kiyohara
804 1.1 kiyohara STAILQ_INIT(&src->chunk_list);
805 1.1 kiyohara
806 1.1 kiyohara fc->crom_src = src;
807 1.1 kiyohara fc->crom_root = &fc->crom_src_buf->root;
808 1.1 kiyohara }
809 1.1 kiyohara
810 1.1 kiyohara static void
811 1.1 kiyohara fw_reset_crom(struct firewire_comm *fc)
812 1.1 kiyohara {
813 1.1 kiyohara struct crom_src_buf *buf;
814 1.1 kiyohara struct crom_src *src;
815 1.1 kiyohara struct crom_chunk *root;
816 1.1 kiyohara
817 1.1 kiyohara if (fc->crom_src_buf == NULL)
818 1.1 kiyohara fw_init_crom(fc);
819 1.1 kiyohara
820 1.1 kiyohara buf = fc->crom_src_buf;
821 1.1 kiyohara src = fc->crom_src;
822 1.1 kiyohara root = fc->crom_root;
823 1.1 kiyohara
824 1.1 kiyohara STAILQ_INIT(&src->chunk_list);
825 1.1 kiyohara
826 1.1 kiyohara bzero(root, sizeof(struct crom_chunk));
827 1.1 kiyohara crom_add_chunk(src, NULL, root, 0);
828 1.1 kiyohara crom_add_entry(root, CSRKEY_NCAP, 0x0083c0); /* XXX */
829 1.1 kiyohara /* private company_id */
830 1.1 kiyohara crom_add_entry(root, CSRKEY_VENDOR, CSRVAL_VENDOR_PRIVATE);
831 1.1 kiyohara crom_add_simple_text(src, root, &buf->vendor, PROJECT_STR);
832 1.1 kiyohara crom_add_entry(root, CSRKEY_HW, OS_VER);
833 1.1 kiyohara crom_add_simple_text(src, root, &buf->hw, hostname);
834 1.1 kiyohara }
835 1.1 kiyohara
836 1.1 kiyohara /*
837 1.1 kiyohara * Called after bus reset.
838 1.1 kiyohara */
839 1.1 kiyohara void
840 1.14.6.2 joerg fw_busreset(struct firewire_comm *fc, uint32_t new_status)
841 1.1 kiyohara {
842 1.1 kiyohara struct firewire_dev_comm *fdc;
843 1.1 kiyohara struct crom_src *src;
844 1.1 kiyohara void *newrom;
845 1.1 kiyohara
846 1.1 kiyohara switch(fc->status){
847 1.1 kiyohara case FWBUSMGRELECT:
848 1.14.6.2 joerg fw_callout_stop(&fc->bmr_callout);
849 1.1 kiyohara break;
850 1.1 kiyohara default:
851 1.1 kiyohara break;
852 1.1 kiyohara }
853 1.14.6.2 joerg fc->status = new_status;
854 1.1 kiyohara fw_reset_csr(fc);
855 1.1 kiyohara fw_reset_crom(fc);
856 1.1 kiyohara
857 1.2 drochner FIREWIRE_CHILDREN_FOREACH_FUNC(post_busreset, fdc);
858 1.1 kiyohara
859 1.1 kiyohara newrom = malloc(CROMSIZE, M_FW, M_NOWAIT | M_ZERO);
860 1.1 kiyohara src = &fc->crom_src_buf->src;
861 1.1 kiyohara crom_load(src, (uint32_t *)newrom, CROMSIZE);
862 1.1 kiyohara if (bcmp(newrom, fc->config_rom, CROMSIZE) != 0) {
863 1.1 kiyohara /* bump generation and reload */
864 1.1 kiyohara src->businfo.generation ++;
865 1.1 kiyohara /* generation must be between 0x2 and 0xF */
866 1.1 kiyohara if (src->businfo.generation < 2)
867 1.1 kiyohara src->businfo.generation ++;
868 1.1 kiyohara crom_load(src, (uint32_t *)newrom, CROMSIZE);
869 1.1 kiyohara bcopy(newrom, (void *)fc->config_rom, CROMSIZE);
870 1.1 kiyohara }
871 1.1 kiyohara free(newrom, M_FW);
872 1.1 kiyohara }
873 1.1 kiyohara
874 1.1 kiyohara /* Call once after reboot */
875 1.1 kiyohara void fw_init(struct firewire_comm *fc)
876 1.1 kiyohara {
877 1.1 kiyohara int i;
878 1.1 kiyohara #ifdef FW_VMACCESS
879 1.1 kiyohara struct fw_xfer *xfer;
880 1.1 kiyohara struct fw_bind *fwb;
881 1.1 kiyohara #endif
882 1.1 kiyohara
883 1.1 kiyohara fc->arq->queued = 0;
884 1.1 kiyohara fc->ars->queued = 0;
885 1.1 kiyohara fc->atq->queued = 0;
886 1.1 kiyohara fc->ats->queued = 0;
887 1.1 kiyohara
888 1.1 kiyohara fc->arq->buf = NULL;
889 1.1 kiyohara fc->ars->buf = NULL;
890 1.1 kiyohara fc->atq->buf = NULL;
891 1.1 kiyohara fc->ats->buf = NULL;
892 1.1 kiyohara
893 1.1 kiyohara fc->arq->flag = 0;
894 1.1 kiyohara fc->ars->flag = 0;
895 1.1 kiyohara fc->atq->flag = 0;
896 1.1 kiyohara fc->ats->flag = 0;
897 1.1 kiyohara
898 1.1 kiyohara STAILQ_INIT(&fc->atq->q);
899 1.1 kiyohara STAILQ_INIT(&fc->ats->q);
900 1.1 kiyohara
901 1.1 kiyohara for( i = 0 ; i < fc->nisodma ; i ++ ){
902 1.1 kiyohara fc->it[i]->queued = 0;
903 1.1 kiyohara fc->ir[i]->queued = 0;
904 1.1 kiyohara
905 1.1 kiyohara fc->it[i]->start = NULL;
906 1.1 kiyohara fc->ir[i]->start = NULL;
907 1.1 kiyohara
908 1.1 kiyohara fc->it[i]->buf = NULL;
909 1.1 kiyohara fc->ir[i]->buf = NULL;
910 1.1 kiyohara
911 1.1 kiyohara fc->it[i]->flag = FWXFERQ_STREAM;
912 1.1 kiyohara fc->ir[i]->flag = FWXFERQ_STREAM;
913 1.1 kiyohara
914 1.1 kiyohara STAILQ_INIT(&fc->it[i]->q);
915 1.1 kiyohara STAILQ_INIT(&fc->ir[i]->q);
916 1.1 kiyohara }
917 1.1 kiyohara
918 1.1 kiyohara fc->arq->maxq = FWMAXQUEUE;
919 1.1 kiyohara fc->ars->maxq = FWMAXQUEUE;
920 1.1 kiyohara fc->atq->maxq = FWMAXQUEUE;
921 1.1 kiyohara fc->ats->maxq = FWMAXQUEUE;
922 1.1 kiyohara
923 1.1 kiyohara for( i = 0 ; i < fc->nisodma ; i++){
924 1.1 kiyohara fc->ir[i]->maxq = FWMAXQUEUE;
925 1.1 kiyohara fc->it[i]->maxq = FWMAXQUEUE;
926 1.1 kiyohara }
927 1.1 kiyohara /* Initialize csr registers */
928 1.1 kiyohara fc->topology_map = (struct fw_topology_map *)malloc(
929 1.1 kiyohara sizeof(struct fw_topology_map),
930 1.1 kiyohara M_FW, M_NOWAIT | M_ZERO);
931 1.1 kiyohara fc->speed_map = (struct fw_speed_map *)malloc(
932 1.1 kiyohara sizeof(struct fw_speed_map),
933 1.1 kiyohara M_FW, M_NOWAIT | M_ZERO);
934 1.1 kiyohara CSRARC(fc, TOPO_MAP) = 0x3f1 << 16;
935 1.1 kiyohara CSRARC(fc, TOPO_MAP + 4) = 1;
936 1.1 kiyohara CSRARC(fc, SPED_MAP) = 0x3f1 << 16;
937 1.1 kiyohara CSRARC(fc, SPED_MAP + 4) = 1;
938 1.1 kiyohara
939 1.1 kiyohara STAILQ_INIT(&fc->devices);
940 1.1 kiyohara
941 1.1 kiyohara /* Initialize Async handlers */
942 1.1 kiyohara STAILQ_INIT(&fc->binds);
943 1.1 kiyohara for( i = 0 ; i < 0x40 ; i++){
944 1.1 kiyohara STAILQ_INIT(&fc->tlabels[i]);
945 1.1 kiyohara }
946 1.1 kiyohara
947 1.1 kiyohara /* DV depend CSRs see blue book */
948 1.1 kiyohara #if 0
949 1.1 kiyohara CSRARC(fc, oMPR) = 0x3fff0001; /* # output channel = 1 */
950 1.1 kiyohara CSRARC(fc, oPCR) = 0x8000007a;
951 1.1 kiyohara for(i = 4 ; i < 0x7c/4 ; i+=4){
952 1.1 kiyohara CSRARC(fc, i + oPCR) = 0x8000007a;
953 1.1 kiyohara }
954 1.1 kiyohara
955 1.1 kiyohara CSRARC(fc, iMPR) = 0x00ff0001; /* # input channel = 1 */
956 1.1 kiyohara CSRARC(fc, iPCR) = 0x803f0000;
957 1.1 kiyohara for(i = 4 ; i < 0x7c/4 ; i+=4){
958 1.1 kiyohara CSRARC(fc, i + iPCR) = 0x0;
959 1.1 kiyohara }
960 1.1 kiyohara #endif
961 1.1 kiyohara
962 1.1 kiyohara fc->crom_src_buf = NULL;
963 1.1 kiyohara
964 1.1 kiyohara #ifdef FW_VMACCESS
965 1.1 kiyohara xfer = fw_xfer_alloc();
966 1.1 kiyohara if(xfer == NULL) return;
967 1.1 kiyohara
968 1.1 kiyohara fwb = (struct fw_bind *)malloc(sizeof (struct fw_bind), M_FW, M_NOWAIT);
969 1.1 kiyohara if(fwb == NULL){
970 1.1 kiyohara fw_xfer_free(xfer);
971 1.1 kiyohara return;
972 1.1 kiyohara }
973 1.1 kiyohara xfer->hand = fw_vmaccess;
974 1.1 kiyohara xfer->fc = fc;
975 1.1 kiyohara xfer->sc = NULL;
976 1.1 kiyohara
977 1.1 kiyohara fwb->start_hi = 0x2;
978 1.1 kiyohara fwb->start_lo = 0;
979 1.1 kiyohara fwb->addrlen = 0xffffffff;
980 1.1 kiyohara fwb->xfer = xfer;
981 1.1 kiyohara fw_bindadd(fc, fwb);
982 1.1 kiyohara #endif
983 1.1 kiyohara }
984 1.1 kiyohara
985 1.1 kiyohara #define BIND_CMP(addr, fwb) (((addr) < (fwb)->start)?-1:\
986 1.1 kiyohara ((fwb)->end < (addr))?1:0)
987 1.1 kiyohara
988 1.1 kiyohara /*
989 1.1 kiyohara * To lookup bound process from IEEE1394 address.
990 1.1 kiyohara */
991 1.1 kiyohara struct fw_bind *
992 1.1 kiyohara fw_bindlookup(struct firewire_comm *fc, uint16_t dest_hi, uint32_t dest_lo)
993 1.1 kiyohara {
994 1.1 kiyohara u_int64_t addr;
995 1.14.6.2 joerg struct fw_bind *tfw, *r = NULL;
996 1.1 kiyohara
997 1.1 kiyohara addr = ((u_int64_t)dest_hi << 32) | dest_lo;
998 1.14.6.2 joerg FW_GLOCK(fc);
999 1.1 kiyohara STAILQ_FOREACH(tfw, &fc->binds, fclist)
1000 1.14.6.2 joerg if (BIND_CMP(addr, tfw) == 0) {
1001 1.14.6.2 joerg r = tfw;
1002 1.14.6.2 joerg break;
1003 1.14.6.2 joerg }
1004 1.14.6.2 joerg FW_GUNLOCK(fc);
1005 1.14.6.2 joerg return(r);
1006 1.1 kiyohara }
1007 1.1 kiyohara
1008 1.1 kiyohara /*
1009 1.1 kiyohara * To bind IEEE1394 address block to process.
1010 1.1 kiyohara */
1011 1.1 kiyohara int
1012 1.1 kiyohara fw_bindadd(struct firewire_comm *fc, struct fw_bind *fwb)
1013 1.1 kiyohara {
1014 1.1 kiyohara struct fw_bind *tfw, *prev = NULL;
1015 1.14.6.2 joerg int r = 0;
1016 1.1 kiyohara
1017 1.1 kiyohara if (fwb->start > fwb->end) {
1018 1.1 kiyohara printf("%s: invalid range\n", __func__);
1019 1.1 kiyohara return EINVAL;
1020 1.1 kiyohara }
1021 1.1 kiyohara
1022 1.14.6.2 joerg FW_GLOCK(fc);
1023 1.1 kiyohara STAILQ_FOREACH(tfw, &fc->binds, fclist) {
1024 1.1 kiyohara if (fwb->end < tfw->start)
1025 1.1 kiyohara break;
1026 1.1 kiyohara prev = tfw;
1027 1.1 kiyohara }
1028 1.14.6.2 joerg if (prev == NULL)
1029 1.1 kiyohara STAILQ_INSERT_HEAD(&fc->binds, fwb, fclist);
1030 1.14.6.2 joerg else if (prev->end < fwb->start)
1031 1.1 kiyohara STAILQ_INSERT_AFTER(&fc->binds, prev, fwb, fclist);
1032 1.14.6.2 joerg else {
1033 1.14.6.2 joerg printf("%s: bind failed\n", __func__);
1034 1.14.6.2 joerg r = EBUSY;
1035 1.1 kiyohara }
1036 1.14.6.2 joerg FW_GUNLOCK(fc);
1037 1.14.6.2 joerg return (r);
1038 1.1 kiyohara }
1039 1.1 kiyohara
1040 1.1 kiyohara /*
1041 1.1 kiyohara * To free IEEE1394 address block.
1042 1.1 kiyohara */
1043 1.1 kiyohara int
1044 1.1 kiyohara fw_bindremove(struct firewire_comm *fc, struct fw_bind *fwb)
1045 1.1 kiyohara {
1046 1.1 kiyohara #if 0
1047 1.1 kiyohara struct fw_xfer *xfer, *next;
1048 1.1 kiyohara #endif
1049 1.1 kiyohara struct fw_bind *tfw;
1050 1.1 kiyohara int s;
1051 1.1 kiyohara
1052 1.1 kiyohara s = splfw();
1053 1.14.6.2 joerg FW_GLOCK(fc);
1054 1.1 kiyohara STAILQ_FOREACH(tfw, &fc->binds, fclist)
1055 1.1 kiyohara if (tfw == fwb) {
1056 1.1 kiyohara STAILQ_REMOVE(&fc->binds, fwb, fw_bind, fclist);
1057 1.1 kiyohara goto found;
1058 1.1 kiyohara }
1059 1.1 kiyohara
1060 1.1 kiyohara printf("%s: no such binding\n", __func__);
1061 1.14.6.2 joerg FW_GUNLOCK(fc);
1062 1.1 kiyohara splx(s);
1063 1.1 kiyohara return (1);
1064 1.1 kiyohara found:
1065 1.1 kiyohara #if 0
1066 1.1 kiyohara /* shall we do this? */
1067 1.1 kiyohara for (xfer = STAILQ_FIRST(&fwb->xferlist); xfer != NULL; xfer = next) {
1068 1.1 kiyohara next = STAILQ_NEXT(xfer, link);
1069 1.1 kiyohara fw_xfer_free(xfer);
1070 1.1 kiyohara }
1071 1.1 kiyohara STAILQ_INIT(&fwb->xferlist);
1072 1.1 kiyohara #endif
1073 1.14.6.2 joerg FW_GUNLOCK(fc);
1074 1.1 kiyohara
1075 1.1 kiyohara splx(s);
1076 1.1 kiyohara return 0;
1077 1.1 kiyohara }
1078 1.1 kiyohara
1079 1.1 kiyohara int
1080 1.1 kiyohara fw_xferlist_add(struct fw_xferlist *q, struct malloc_type *type,
1081 1.1 kiyohara int slen, int rlen, int n,
1082 1.1 kiyohara struct firewire_comm *fc, void *sc, void (*hand)(struct fw_xfer *))
1083 1.1 kiyohara {
1084 1.1 kiyohara int i, s;
1085 1.1 kiyohara struct fw_xfer *xfer;
1086 1.1 kiyohara
1087 1.1 kiyohara for (i = 0; i < n; i++) {
1088 1.1 kiyohara xfer = fw_xfer_alloc_buf(type, slen, rlen);
1089 1.1 kiyohara if (xfer == NULL)
1090 1.1 kiyohara return (n);
1091 1.1 kiyohara xfer->fc = fc;
1092 1.1 kiyohara xfer->sc = sc;
1093 1.1 kiyohara xfer->hand = hand;
1094 1.1 kiyohara s = splfw();
1095 1.1 kiyohara STAILQ_INSERT_TAIL(q, xfer, link);
1096 1.1 kiyohara splx(s);
1097 1.1 kiyohara }
1098 1.1 kiyohara return (n);
1099 1.1 kiyohara }
1100 1.1 kiyohara
1101 1.1 kiyohara void
1102 1.1 kiyohara fw_xferlist_remove(struct fw_xferlist *q)
1103 1.1 kiyohara {
1104 1.1 kiyohara struct fw_xfer *xfer, *next;
1105 1.1 kiyohara
1106 1.1 kiyohara for (xfer = STAILQ_FIRST(q); xfer != NULL; xfer = next) {
1107 1.1 kiyohara next = STAILQ_NEXT(xfer, link);
1108 1.1 kiyohara fw_xfer_free_buf(xfer);
1109 1.1 kiyohara }
1110 1.1 kiyohara STAILQ_INIT(q);
1111 1.1 kiyohara }
1112 1.1 kiyohara
1113 1.1 kiyohara /*
1114 1.14.6.2 joerg * dump packet header
1115 1.14.6.2 joerg */
1116 1.14.6.2 joerg static void
1117 1.14.6.2 joerg fw_dump_hdr(struct fw_pkt *fp, const char *prefix)
1118 1.14.6.2 joerg {
1119 1.14.6.2 joerg printf("%s: dst=0x%02x tl=0x%02x rt=%d tcode=0x%x pri=0x%x "
1120 1.14.6.2 joerg "src=0x%03x\n", prefix,
1121 1.14.6.2 joerg fp->mode.hdr.dst & 0x3f,
1122 1.14.6.2 joerg fp->mode.hdr.tlrt >> 2, fp->mode.hdr.tlrt & 3,
1123 1.14.6.2 joerg fp->mode.hdr.tcode, fp->mode.hdr.pri,
1124 1.14.6.2 joerg fp->mode.hdr.src);
1125 1.14.6.2 joerg }
1126 1.14.6.2 joerg
1127 1.14.6.2 joerg /*
1128 1.1 kiyohara * To free transaction label.
1129 1.1 kiyohara */
1130 1.1 kiyohara static void
1131 1.1 kiyohara fw_tl_free(struct firewire_comm *fc, struct fw_xfer *xfer)
1132 1.1 kiyohara {
1133 1.1 kiyohara struct fw_xfer *txfer;
1134 1.1 kiyohara int s;
1135 1.1 kiyohara
1136 1.1 kiyohara if (xfer->tl < 0)
1137 1.1 kiyohara return;
1138 1.1 kiyohara
1139 1.1 kiyohara s = splfw();
1140 1.14.6.2 joerg fw_mtx_lock(&fc->tlabel_lock);
1141 1.1 kiyohara #if 1 /* make sure the label is allocated */
1142 1.1 kiyohara STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel)
1143 1.1 kiyohara if(txfer == xfer)
1144 1.1 kiyohara break;
1145 1.1 kiyohara if (txfer == NULL) {
1146 1.14.6.2 joerg printf("%s: the xfer is not in the queue "
1147 1.14.6.2 joerg "(tlabel=%d, flag=0x%x)\n",
1148 1.14.6.2 joerg __FUNCTION__, xfer->tl, xfer->flag);
1149 1.14.6.2 joerg fw_dump_hdr(&xfer->send.hdr, "send");
1150 1.14.6.2 joerg fw_dump_hdr(&xfer->recv.hdr, "recv");
1151 1.14.6.2 joerg kdb_backtrace();
1152 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1153 1.1 kiyohara splx(s);
1154 1.1 kiyohara return;
1155 1.1 kiyohara }
1156 1.1 kiyohara #endif
1157 1.1 kiyohara
1158 1.1 kiyohara STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel);
1159 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1160 1.1 kiyohara splx(s);
1161 1.1 kiyohara return;
1162 1.1 kiyohara }
1163 1.1 kiyohara
1164 1.1 kiyohara /*
1165 1.1 kiyohara * To obtain XFER structure by transaction label.
1166 1.1 kiyohara */
1167 1.1 kiyohara static struct fw_xfer *
1168 1.14.6.2 joerg fw_tl2xfer(struct firewire_comm *fc, int node, int tlabel, int tcode)
1169 1.1 kiyohara {
1170 1.1 kiyohara struct fw_xfer *xfer;
1171 1.1 kiyohara int s = splfw();
1172 1.14.6.2 joerg int req;
1173 1.1 kiyohara
1174 1.14.6.2 joerg fw_mtx_lock(&fc->tlabel_lock);
1175 1.1 kiyohara STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel)
1176 1.1 kiyohara if(xfer->send.hdr.mode.hdr.dst == node) {
1177 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1178 1.1 kiyohara splx(s);
1179 1.14.6.2 joerg FW_KASSERT(xfer->tl == tlabel,
1180 1.14.6.2 joerg ("xfer->tl 0x%x != 0x%x", xfer->tl, tlabel));
1181 1.14.6.2 joerg /* extra sanity check */
1182 1.14.6.2 joerg req = xfer->send.hdr.mode.hdr.tcode;
1183 1.14.6.2 joerg if (xfer->fc->tcode[req].valid_res != tcode) {
1184 1.14.6.2 joerg printf("%s: invalid response tcode "
1185 1.14.6.2 joerg "(0x%x for 0x%x)\n", __FUNCTION__,
1186 1.14.6.2 joerg tcode, req);
1187 1.14.6.2 joerg return(NULL);
1188 1.14.6.2 joerg }
1189 1.14.6.2 joerg
1190 1.1 kiyohara if (firewire_debug > 2)
1191 1.1 kiyohara printf("fw_tl2xfer: found tl=%d\n", tlabel);
1192 1.1 kiyohara return(xfer);
1193 1.1 kiyohara }
1194 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1195 1.1 kiyohara if (firewire_debug > 1)
1196 1.1 kiyohara printf("fw_tl2xfer: not found tl=%d\n", tlabel);
1197 1.1 kiyohara splx(s);
1198 1.1 kiyohara return(NULL);
1199 1.1 kiyohara }
1200 1.1 kiyohara
1201 1.1 kiyohara /*
1202 1.1 kiyohara * To allocate IEEE1394 XFER structure.
1203 1.1 kiyohara */
1204 1.1 kiyohara struct fw_xfer *
1205 1.1 kiyohara fw_xfer_alloc(struct malloc_type *type)
1206 1.1 kiyohara {
1207 1.1 kiyohara struct fw_xfer *xfer;
1208 1.1 kiyohara
1209 1.1 kiyohara xfer = malloc(sizeof(struct fw_xfer), type, M_NOWAIT | M_ZERO);
1210 1.1 kiyohara if (xfer == NULL)
1211 1.1 kiyohara return xfer;
1212 1.1 kiyohara
1213 1.1 kiyohara xfer->malloc = type;
1214 1.1 kiyohara
1215 1.1 kiyohara return xfer;
1216 1.1 kiyohara }
1217 1.1 kiyohara
1218 1.1 kiyohara struct fw_xfer *
1219 1.1 kiyohara fw_xfer_alloc_buf(struct malloc_type *type, int send_len, int recv_len)
1220 1.1 kiyohara {
1221 1.1 kiyohara struct fw_xfer *xfer;
1222 1.1 kiyohara
1223 1.1 kiyohara xfer = fw_xfer_alloc(type);
1224 1.1 kiyohara if (xfer == NULL)
1225 1.1 kiyohara return(NULL);
1226 1.1 kiyohara xfer->send.pay_len = send_len;
1227 1.1 kiyohara xfer->recv.pay_len = recv_len;
1228 1.1 kiyohara if (send_len > 0) {
1229 1.1 kiyohara xfer->send.payload = malloc(send_len, type, M_NOWAIT | M_ZERO);
1230 1.1 kiyohara if (xfer->send.payload == NULL) {
1231 1.1 kiyohara fw_xfer_free(xfer);
1232 1.1 kiyohara return(NULL);
1233 1.1 kiyohara }
1234 1.1 kiyohara }
1235 1.1 kiyohara if (recv_len > 0) {
1236 1.1 kiyohara xfer->recv.payload = malloc(recv_len, type, M_NOWAIT);
1237 1.1 kiyohara if (xfer->recv.payload == NULL) {
1238 1.1 kiyohara if (xfer->send.payload != NULL)
1239 1.1 kiyohara free(xfer->send.payload, type);
1240 1.1 kiyohara fw_xfer_free(xfer);
1241 1.1 kiyohara return(NULL);
1242 1.1 kiyohara }
1243 1.1 kiyohara }
1244 1.1 kiyohara return(xfer);
1245 1.1 kiyohara }
1246 1.1 kiyohara
1247 1.1 kiyohara /*
1248 1.1 kiyohara * IEEE1394 XFER post process.
1249 1.1 kiyohara */
1250 1.1 kiyohara void
1251 1.1 kiyohara fw_xfer_done(struct fw_xfer *xfer)
1252 1.1 kiyohara {
1253 1.1 kiyohara if (xfer->hand == NULL) {
1254 1.1 kiyohara printf("hand == NULL\n");
1255 1.1 kiyohara return;
1256 1.1 kiyohara }
1257 1.1 kiyohara
1258 1.1 kiyohara if (xfer->fc == NULL)
1259 1.1 kiyohara panic("fw_xfer_done: why xfer->fc is NULL?");
1260 1.1 kiyohara
1261 1.1 kiyohara fw_tl_free(xfer->fc, xfer);
1262 1.1 kiyohara xfer->hand(xfer);
1263 1.1 kiyohara }
1264 1.1 kiyohara
1265 1.1 kiyohara void
1266 1.1 kiyohara fw_xfer_unload(struct fw_xfer* xfer)
1267 1.1 kiyohara {
1268 1.1 kiyohara int s;
1269 1.1 kiyohara
1270 1.1 kiyohara if(xfer == NULL ) return;
1271 1.14.6.2 joerg if(xfer->flag & FWXF_INQ){
1272 1.1 kiyohara printf("fw_xfer_free FWXF_INQ\n");
1273 1.1 kiyohara s = splfw();
1274 1.14.6.2 joerg FW_GLOCK(xfer->fc);
1275 1.1 kiyohara STAILQ_REMOVE(&xfer->q->q, xfer, fw_xfer, link);
1276 1.14.6.2 joerg #if 0
1277 1.1 kiyohara xfer->q->queued --;
1278 1.14.6.2 joerg #endif
1279 1.14.6.2 joerg FW_GUNLOCK(xfer->fc);
1280 1.1 kiyohara splx(s);
1281 1.1 kiyohara }
1282 1.1 kiyohara if (xfer->fc != NULL) {
1283 1.1 kiyohara #if 1
1284 1.14.6.2 joerg if(xfer->flag == FWXF_START)
1285 1.1 kiyohara /*
1286 1.1 kiyohara * This could happen if:
1287 1.1 kiyohara * 1. We call fwohci_arcv() before fwohci_txd().
1288 1.1 kiyohara * 2. firewire_watch() is called.
1289 1.1 kiyohara */
1290 1.1 kiyohara printf("fw_xfer_free FWXF_START\n");
1291 1.1 kiyohara #endif
1292 1.1 kiyohara }
1293 1.14.6.2 joerg xfer->flag = FWXF_INIT;
1294 1.1 kiyohara xfer->resp = 0;
1295 1.1 kiyohara }
1296 1.1 kiyohara /*
1297 1.1 kiyohara * To free IEEE1394 XFER structure.
1298 1.1 kiyohara */
1299 1.1 kiyohara void
1300 1.1 kiyohara fw_xfer_free_buf( struct fw_xfer* xfer)
1301 1.1 kiyohara {
1302 1.1 kiyohara if (xfer == NULL) {
1303 1.1 kiyohara printf("%s: xfer == NULL\n", __func__);
1304 1.1 kiyohara return;
1305 1.1 kiyohara }
1306 1.1 kiyohara fw_xfer_unload(xfer);
1307 1.1 kiyohara if(xfer->send.payload != NULL){
1308 1.1 kiyohara free(xfer->send.payload, xfer->malloc);
1309 1.1 kiyohara }
1310 1.1 kiyohara if(xfer->recv.payload != NULL){
1311 1.1 kiyohara free(xfer->recv.payload, xfer->malloc);
1312 1.1 kiyohara }
1313 1.1 kiyohara free(xfer, xfer->malloc);
1314 1.1 kiyohara }
1315 1.1 kiyohara
1316 1.1 kiyohara void
1317 1.1 kiyohara fw_xfer_free( struct fw_xfer* xfer)
1318 1.1 kiyohara {
1319 1.1 kiyohara if (xfer == NULL) {
1320 1.1 kiyohara printf("%s: xfer == NULL\n", __func__);
1321 1.1 kiyohara return;
1322 1.1 kiyohara }
1323 1.1 kiyohara fw_xfer_unload(xfer);
1324 1.1 kiyohara free(xfer, xfer->malloc);
1325 1.1 kiyohara }
1326 1.1 kiyohara
1327 1.1 kiyohara void
1328 1.1 kiyohara fw_asy_callback_free(struct fw_xfer *xfer)
1329 1.1 kiyohara {
1330 1.1 kiyohara #if 0
1331 1.14.6.2 joerg printf("asyreq done flag=%d resp=%d\n",
1332 1.14.6.2 joerg xfer->flag, xfer->resp);
1333 1.1 kiyohara #endif
1334 1.1 kiyohara fw_xfer_free(xfer);
1335 1.1 kiyohara }
1336 1.1 kiyohara
1337 1.1 kiyohara /*
1338 1.1 kiyohara * To configure PHY.
1339 1.1 kiyohara */
1340 1.1 kiyohara static void
1341 1.1 kiyohara fw_phy_config(struct firewire_comm *fc, int root_node, int gap_count)
1342 1.1 kiyohara {
1343 1.1 kiyohara struct fw_xfer *xfer;
1344 1.1 kiyohara struct fw_pkt *fp;
1345 1.1 kiyohara
1346 1.1 kiyohara fc->status = FWBUSPHYCONF;
1347 1.1 kiyohara
1348 1.1 kiyohara xfer = fw_xfer_alloc(M_FWXFER);
1349 1.1 kiyohara if (xfer == NULL)
1350 1.1 kiyohara return;
1351 1.1 kiyohara xfer->fc = fc;
1352 1.1 kiyohara xfer->hand = fw_asy_callback_free;
1353 1.1 kiyohara
1354 1.1 kiyohara fp = &xfer->send.hdr;
1355 1.1 kiyohara fp->mode.ld[1] = 0;
1356 1.1 kiyohara if (root_node >= 0)
1357 1.1 kiyohara fp->mode.ld[1] |= (root_node & 0x3f) << 24 | 1 << 23;
1358 1.1 kiyohara if (gap_count >= 0)
1359 1.1 kiyohara fp->mode.ld[1] |= 1 << 22 | (gap_count & 0x3f) << 16;
1360 1.1 kiyohara fp->mode.ld[2] = ~fp->mode.ld[1];
1361 1.1 kiyohara /* XXX Dangerous, how to pass PHY packet to device driver */
1362 1.1 kiyohara fp->mode.common.tcode |= FWTCODE_PHY;
1363 1.1 kiyohara
1364 1.1 kiyohara if (firewire_debug)
1365 1.1 kiyohara printf("send phy_config root_node=%d gap_count=%d\n",
1366 1.1 kiyohara root_node, gap_count);
1367 1.1 kiyohara fw_asyreq(fc, -1, xfer);
1368 1.1 kiyohara }
1369 1.1 kiyohara
1370 1.1 kiyohara #if 0
1371 1.1 kiyohara /*
1372 1.1 kiyohara * Dump self ID.
1373 1.1 kiyohara */
1374 1.1 kiyohara static void
1375 1.1 kiyohara fw_print_sid(uint32_t sid)
1376 1.1 kiyohara {
1377 1.1 kiyohara union fw_self_id *s;
1378 1.1 kiyohara s = (union fw_self_id *) &sid;
1379 1.1 kiyohara printf("node:%d link:%d gap:%d spd:%d del:%d con:%d pwr:%d"
1380 1.1 kiyohara " p0:%d p1:%d p2:%d i:%d m:%d\n",
1381 1.1 kiyohara s->p0.phy_id, s->p0.link_active, s->p0.gap_count,
1382 1.1 kiyohara s->p0.phy_speed, s->p0.phy_delay, s->p0.contender,
1383 1.1 kiyohara s->p0.power_class, s->p0.port0, s->p0.port1,
1384 1.1 kiyohara s->p0.port2, s->p0.initiated_reset, s->p0.more_packets);
1385 1.1 kiyohara }
1386 1.1 kiyohara #endif
1387 1.1 kiyohara
1388 1.1 kiyohara /*
1389 1.1 kiyohara * To receive self ID.
1390 1.1 kiyohara */
1391 1.1 kiyohara void fw_sidrcv(struct firewire_comm* fc, uint32_t *sid, u_int len)
1392 1.1 kiyohara {
1393 1.1 kiyohara uint32_t *p;
1394 1.1 kiyohara union fw_self_id *self_id;
1395 1.1 kiyohara u_int i, j, node, c_port = 0, i_branch = 0;
1396 1.1 kiyohara
1397 1.1 kiyohara fc->sid_cnt = len /(sizeof(uint32_t) * 2);
1398 1.1 kiyohara fc->max_node = fc->nodeid & 0x3f;
1399 1.1 kiyohara CSRARC(fc, NODE_IDS) = ((uint32_t)fc->nodeid) << 16;
1400 1.1 kiyohara fc->status = FWBUSCYMELECT;
1401 1.1 kiyohara fc->topology_map->crc_len = 2;
1402 1.1 kiyohara fc->topology_map->generation ++;
1403 1.1 kiyohara fc->topology_map->self_id_count = 0;
1404 1.1 kiyohara fc->topology_map->node_count = 0;
1405 1.1 kiyohara fc->speed_map->generation ++;
1406 1.1 kiyohara fc->speed_map->crc_len = 1 + (64*64 + 3) / 4;
1407 1.1 kiyohara self_id = &fc->topology_map->self_id[0];
1408 1.1 kiyohara for(i = 0; i < fc->sid_cnt; i ++){
1409 1.1 kiyohara if (sid[1] != ~sid[0]) {
1410 1.1 kiyohara printf("fw_sidrcv: invalid self-id packet\n");
1411 1.1 kiyohara sid += 2;
1412 1.1 kiyohara continue;
1413 1.1 kiyohara }
1414 1.1 kiyohara *self_id = *((union fw_self_id *)sid);
1415 1.1 kiyohara fc->topology_map->crc_len++;
1416 1.1 kiyohara if(self_id->p0.sequel == 0){
1417 1.1 kiyohara fc->topology_map->node_count ++;
1418 1.1 kiyohara c_port = 0;
1419 1.1 kiyohara #if 0
1420 1.1 kiyohara fw_print_sid(sid[0]);
1421 1.1 kiyohara #endif
1422 1.1 kiyohara node = self_id->p0.phy_id;
1423 1.1 kiyohara if(fc->max_node < node){
1424 1.1 kiyohara fc->max_node = self_id->p0.phy_id;
1425 1.1 kiyohara }
1426 1.1 kiyohara /* XXX I'm not sure this is the right speed_map */
1427 1.1 kiyohara fc->speed_map->speed[node][node]
1428 1.1 kiyohara = self_id->p0.phy_speed;
1429 1.1 kiyohara for (j = 0; j < node; j ++) {
1430 1.1 kiyohara fc->speed_map->speed[j][node]
1431 1.1 kiyohara = fc->speed_map->speed[node][j]
1432 1.1 kiyohara = min(fc->speed_map->speed[j][j],
1433 1.1 kiyohara self_id->p0.phy_speed);
1434 1.1 kiyohara }
1435 1.1 kiyohara if ((fc->irm == -1 || self_id->p0.phy_id > fc->irm) &&
1436 1.1 kiyohara (self_id->p0.link_active && self_id->p0.contender)) {
1437 1.1 kiyohara fc->irm = self_id->p0.phy_id;
1438 1.1 kiyohara }
1439 1.1 kiyohara if(self_id->p0.port0 >= 0x2){
1440 1.1 kiyohara c_port++;
1441 1.1 kiyohara }
1442 1.1 kiyohara if(self_id->p0.port1 >= 0x2){
1443 1.1 kiyohara c_port++;
1444 1.1 kiyohara }
1445 1.1 kiyohara if(self_id->p0.port2 >= 0x2){
1446 1.1 kiyohara c_port++;
1447 1.1 kiyohara }
1448 1.1 kiyohara }
1449 1.1 kiyohara if(c_port > 2){
1450 1.1 kiyohara i_branch += (c_port - 2);
1451 1.1 kiyohara }
1452 1.1 kiyohara sid += 2;
1453 1.1 kiyohara self_id++;
1454 1.1 kiyohara fc->topology_map->self_id_count ++;
1455 1.1 kiyohara }
1456 1.14.6.2 joerg fw_printf(fc->bdev, "%d nodes", fc->max_node + 1);
1457 1.1 kiyohara /* CRC */
1458 1.1 kiyohara fc->topology_map->crc = fw_crc16(
1459 1.1 kiyohara (uint32_t *)&fc->topology_map->generation,
1460 1.1 kiyohara fc->topology_map->crc_len * 4);
1461 1.1 kiyohara fc->speed_map->crc = fw_crc16(
1462 1.1 kiyohara (uint32_t *)&fc->speed_map->generation,
1463 1.1 kiyohara fc->speed_map->crc_len * 4);
1464 1.1 kiyohara /* byteswap and copy to CSR */
1465 1.1 kiyohara p = (uint32_t *)fc->topology_map;
1466 1.1 kiyohara for (i = 0; i <= fc->topology_map->crc_len; i++)
1467 1.1 kiyohara CSRARC(fc, TOPO_MAP + i * 4) = htonl(*p++);
1468 1.1 kiyohara p = (uint32_t *)fc->speed_map;
1469 1.1 kiyohara CSRARC(fc, SPED_MAP) = htonl(*p++);
1470 1.1 kiyohara CSRARC(fc, SPED_MAP + 4) = htonl(*p++);
1471 1.1 kiyohara /* don't byte-swap uint8_t array */
1472 1.1 kiyohara bcopy(p, &CSRARC(fc, SPED_MAP + 8), (fc->speed_map->crc_len - 1)*4);
1473 1.1 kiyohara
1474 1.1 kiyohara fc->max_hop = fc->max_node - i_branch;
1475 1.1 kiyohara printf(", maxhop <= %d", fc->max_hop);
1476 1.1 kiyohara
1477 1.1 kiyohara if(fc->irm == -1 ){
1478 1.1 kiyohara printf(", Not found IRM capable node");
1479 1.1 kiyohara }else{
1480 1.1 kiyohara printf(", cable IRM = %d", fc->irm);
1481 1.1 kiyohara if (fc->irm == fc->nodeid)
1482 1.1 kiyohara printf(" (me)");
1483 1.1 kiyohara }
1484 1.1 kiyohara printf("\n");
1485 1.1 kiyohara
1486 1.1 kiyohara if (try_bmr && (fc->irm != -1) && (CSRARC(fc, BUS_MGR_ID) == 0x3f)) {
1487 1.1 kiyohara if (fc->irm == fc->nodeid) {
1488 1.1 kiyohara fc->status = FWBUSMGRDONE;
1489 1.1 kiyohara CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, fc->irm);
1490 1.1 kiyohara fw_bmr(fc);
1491 1.1 kiyohara } else {
1492 1.1 kiyohara fc->status = FWBUSMGRELECT;
1493 1.14.6.2 joerg fw_callout_reset(&fc->bmr_callout, hz/8,
1494 1.1 kiyohara (void *)fw_try_bmr, (void *)fc);
1495 1.1 kiyohara }
1496 1.1 kiyohara } else
1497 1.1 kiyohara fc->status = FWBUSMGRDONE;
1498 1.1 kiyohara
1499 1.14.6.2 joerg fw_callout_reset(&fc->busprobe_callout, hz/4,
1500 1.1 kiyohara (void *)fw_bus_probe, (void *)fc);
1501 1.1 kiyohara }
1502 1.1 kiyohara
1503 1.1 kiyohara /*
1504 1.1 kiyohara * To probe devices on the IEEE1394 bus.
1505 1.1 kiyohara */
1506 1.1 kiyohara static void
1507 1.1 kiyohara fw_bus_probe(struct firewire_comm *fc)
1508 1.1 kiyohara {
1509 1.1 kiyohara int s;
1510 1.1 kiyohara struct fw_device *fwdev;
1511 1.1 kiyohara
1512 1.1 kiyohara s = splfw();
1513 1.1 kiyohara fc->status = FWBUSEXPLORE;
1514 1.1 kiyohara
1515 1.1 kiyohara /* Invalidate all devices, just after bus reset. */
1516 1.1 kiyohara STAILQ_FOREACH(fwdev, &fc->devices, link)
1517 1.1 kiyohara if (fwdev->status != FWDEVINVAL) {
1518 1.1 kiyohara fwdev->status = FWDEVINVAL;
1519 1.1 kiyohara fwdev->rcnt = 0;
1520 1.1 kiyohara }
1521 1.1 kiyohara splx(s);
1522 1.1 kiyohara
1523 1.1 kiyohara wakeup((void *)fc);
1524 1.1 kiyohara }
1525 1.1 kiyohara
1526 1.1 kiyohara static int
1527 1.1 kiyohara fw_explore_read_quads(struct fw_device *fwdev, int offset,
1528 1.1 kiyohara uint32_t *quad, int n)
1529 1.1 kiyohara {
1530 1.1 kiyohara struct fw_xfer *xfer;
1531 1.1 kiyohara uint32_t tmp;
1532 1.1 kiyohara int i, error;
1533 1.1 kiyohara
1534 1.1 kiyohara
1535 1.1 kiyohara for (i = 0; i < n; i ++, offset += sizeof(uint32_t)) {
1536 1.1 kiyohara xfer = fwmem_read_quad(fwdev, NULL, -1,
1537 1.1 kiyohara 0xffff, 0xf0000000 | offset, (void *)&tmp,
1538 1.14.6.2 joerg fw_xferwake);
1539 1.1 kiyohara if (xfer == NULL)
1540 1.1 kiyohara return (-1);
1541 1.14.6.2 joerg fw_xferwait(xfer);
1542 1.1 kiyohara
1543 1.1 kiyohara if (xfer->resp == 0)
1544 1.1 kiyohara quad[i] = ntohl(tmp);
1545 1.1 kiyohara
1546 1.1 kiyohara error = xfer->resp;
1547 1.1 kiyohara fw_xfer_free(xfer);
1548 1.1 kiyohara if (error)
1549 1.1 kiyohara return (error);
1550 1.1 kiyohara }
1551 1.1 kiyohara return (0);
1552 1.1 kiyohara }
1553 1.1 kiyohara
1554 1.1 kiyohara
1555 1.1 kiyohara static int
1556 1.1 kiyohara fw_explore_csrblock(struct fw_device *fwdev, int offset, int recur)
1557 1.1 kiyohara {
1558 1.1 kiyohara int err, i, off;
1559 1.1 kiyohara struct csrdirectory *dir;
1560 1.1 kiyohara struct csrreg *reg;
1561 1.1 kiyohara
1562 1.1 kiyohara
1563 1.1 kiyohara dir = (struct csrdirectory *)&fwdev->csrrom[offset/sizeof(uint32_t)];
1564 1.1 kiyohara err = fw_explore_read_quads(fwdev, CSRROMOFF + offset,
1565 1.1 kiyohara (uint32_t *)dir, 1);
1566 1.1 kiyohara if (err)
1567 1.1 kiyohara return (-1);
1568 1.1 kiyohara
1569 1.1 kiyohara offset += sizeof(uint32_t);
1570 1.1 kiyohara reg = (struct csrreg *)&fwdev->csrrom[offset/sizeof(uint32_t)];
1571 1.1 kiyohara err = fw_explore_read_quads(fwdev, CSRROMOFF + offset,
1572 1.1 kiyohara (uint32_t *)reg, dir->crc_len);
1573 1.1 kiyohara if (err)
1574 1.1 kiyohara return (-1);
1575 1.1 kiyohara
1576 1.1 kiyohara /* XXX check CRC */
1577 1.1 kiyohara
1578 1.1 kiyohara off = CSRROMOFF + offset + sizeof(uint32_t) * (dir->crc_len - 1);
1579 1.1 kiyohara if (fwdev->rommax < off)
1580 1.1 kiyohara fwdev->rommax = off;
1581 1.1 kiyohara
1582 1.1 kiyohara if (recur == 0)
1583 1.1 kiyohara return (0);
1584 1.1 kiyohara
1585 1.1 kiyohara for (i = 0; i < dir->crc_len; i ++, offset += sizeof(uint32_t)) {
1586 1.14.6.2 joerg if ((reg[i].key & CSRTYPE_MASK) == CSRTYPE_D)
1587 1.1 kiyohara recur = 1;
1588 1.14.6.2 joerg else if ((reg[i].key & CSRTYPE_MASK) == CSRTYPE_L)
1589 1.1 kiyohara recur = 0;
1590 1.1 kiyohara else
1591 1.1 kiyohara continue;
1592 1.1 kiyohara
1593 1.1 kiyohara off = offset + reg[i].val * sizeof(uint32_t);
1594 1.1 kiyohara if (off > CROMSIZE) {
1595 1.1 kiyohara printf("%s: invalid offset %d\n", __FUNCTION__, off);
1596 1.1 kiyohara return(-1);
1597 1.1 kiyohara }
1598 1.1 kiyohara err = fw_explore_csrblock(fwdev, off, recur);
1599 1.1 kiyohara if (err)
1600 1.1 kiyohara return (-1);
1601 1.1 kiyohara }
1602 1.1 kiyohara return (0);
1603 1.1 kiyohara }
1604 1.1 kiyohara
1605 1.1 kiyohara static int
1606 1.1 kiyohara fw_explore_node(struct fw_device *dfwdev)
1607 1.1 kiyohara {
1608 1.1 kiyohara struct firewire_comm *fc;
1609 1.1 kiyohara struct fw_device *fwdev, *pfwdev, *tfwdev;
1610 1.1 kiyohara uint32_t *csr;
1611 1.1 kiyohara struct csrhdr *hdr;
1612 1.1 kiyohara struct bus_info *binfo;
1613 1.1 kiyohara int err, node, spd;
1614 1.1 kiyohara
1615 1.1 kiyohara fc = dfwdev->fc;
1616 1.1 kiyohara csr = dfwdev->csrrom;
1617 1.1 kiyohara node = dfwdev->dst;
1618 1.1 kiyohara
1619 1.1 kiyohara /* First quad */
1620 1.1 kiyohara err = fw_explore_read_quads(dfwdev, CSRROMOFF, &csr[0], 1);
1621 1.1 kiyohara if (err)
1622 1.1 kiyohara return (-1);
1623 1.1 kiyohara hdr = (struct csrhdr *)&csr[0];
1624 1.1 kiyohara if (hdr->info_len != 4) {
1625 1.1 kiyohara if (firewire_debug)
1626 1.1 kiyohara printf("node%d: wrong bus info len(%d)\n",
1627 1.1 kiyohara node, hdr->info_len);
1628 1.1 kiyohara return (-1);
1629 1.1 kiyohara }
1630 1.1 kiyohara
1631 1.1 kiyohara /* bus info */
1632 1.1 kiyohara err = fw_explore_read_quads(dfwdev, CSRROMOFF + 0x04, &csr[1], 4);
1633 1.1 kiyohara if (err)
1634 1.1 kiyohara return (-1);
1635 1.1 kiyohara binfo = (struct bus_info *)&csr[1];
1636 1.1 kiyohara if (binfo->bus_name != CSR_BUS_NAME_IEEE1394) {
1637 1.1 kiyohara if (firewire_debug)
1638 1.1 kiyohara printf("node%d: invalid bus name 0x%08x\n",
1639 1.1 kiyohara node, binfo->bus_name);
1640 1.1 kiyohara return (-1);
1641 1.1 kiyohara }
1642 1.1 kiyohara spd = fc->speed_map->speed[fc->nodeid][node];
1643 1.1 kiyohara STAILQ_FOREACH(fwdev, &fc->devices, link)
1644 1.1 kiyohara if (FW_EUI64_EQUAL(fwdev->eui, binfo->eui64))
1645 1.1 kiyohara break;
1646 1.1 kiyohara if (fwdev == NULL) {
1647 1.1 kiyohara /* new device */
1648 1.1 kiyohara fwdev = malloc(sizeof(struct fw_device), M_FW,
1649 1.1 kiyohara M_NOWAIT | M_ZERO);
1650 1.1 kiyohara if (fwdev == NULL) {
1651 1.1 kiyohara if (firewire_debug)
1652 1.1 kiyohara printf("node%d: no memory\n", node);
1653 1.1 kiyohara return (-1);
1654 1.1 kiyohara }
1655 1.1 kiyohara fwdev->fc = fc;
1656 1.1 kiyohara fwdev->eui = binfo->eui64;
1657 1.1 kiyohara fwdev->status = FWDEVNEW;
1658 1.1 kiyohara /* insert into sorted fwdev list */
1659 1.1 kiyohara pfwdev = NULL;
1660 1.1 kiyohara STAILQ_FOREACH(tfwdev, &fc->devices, link) {
1661 1.1 kiyohara if (tfwdev->eui.hi > fwdev->eui.hi ||
1662 1.1 kiyohara (tfwdev->eui.hi == fwdev->eui.hi &&
1663 1.1 kiyohara tfwdev->eui.lo > fwdev->eui.lo))
1664 1.1 kiyohara break;
1665 1.1 kiyohara pfwdev = tfwdev;
1666 1.1 kiyohara }
1667 1.1 kiyohara if (pfwdev == NULL)
1668 1.1 kiyohara STAILQ_INSERT_HEAD(&fc->devices, fwdev, link);
1669 1.1 kiyohara else
1670 1.1 kiyohara STAILQ_INSERT_AFTER(&fc->devices, pfwdev, fwdev, link);
1671 1.1 kiyohara
1672 1.14.6.2 joerg fw_printf(fc->bdev, "New %s device ID:%08x%08x\n",
1673 1.2 drochner fw_linkspeed[spd],
1674 1.1 kiyohara fwdev->eui.hi, fwdev->eui.lo);
1675 1.1 kiyohara
1676 1.1 kiyohara } else
1677 1.1 kiyohara fwdev->status = FWDEVINIT;
1678 1.1 kiyohara fwdev->dst = node;
1679 1.1 kiyohara fwdev->speed = spd;
1680 1.1 kiyohara
1681 1.1 kiyohara /* unchanged ? */
1682 1.1 kiyohara if (bcmp(&csr[0], &fwdev->csrrom[0], sizeof(uint32_t) * 5) == 0) {
1683 1.1 kiyohara if (firewire_debug)
1684 1.1 kiyohara printf("node%d: crom unchanged\n", node);
1685 1.1 kiyohara return (0);
1686 1.1 kiyohara }
1687 1.1 kiyohara
1688 1.1 kiyohara bzero(&fwdev->csrrom[0], CROMSIZE);
1689 1.1 kiyohara
1690 1.1 kiyohara /* copy first quad and bus info block */
1691 1.1 kiyohara bcopy(&csr[0], &fwdev->csrrom[0], sizeof(uint32_t) * 5);
1692 1.1 kiyohara fwdev->rommax = CSRROMOFF + sizeof(uint32_t) * 4;
1693 1.1 kiyohara
1694 1.1 kiyohara err = fw_explore_csrblock(fwdev, 0x14, 1); /* root directory */
1695 1.1 kiyohara
1696 1.1 kiyohara if (err) {
1697 1.1 kiyohara fwdev->status = FWDEVINVAL;
1698 1.1 kiyohara fwdev->csrrom[0] = 0;
1699 1.1 kiyohara }
1700 1.1 kiyohara return (err);
1701 1.1 kiyohara
1702 1.1 kiyohara }
1703 1.1 kiyohara
1704 1.1 kiyohara /*
1705 1.1 kiyohara * Find the self_id packet for a node, ignoring sequels.
1706 1.1 kiyohara */
1707 1.1 kiyohara static union fw_self_id *
1708 1.1 kiyohara fw_find_self_id(struct firewire_comm *fc, int node)
1709 1.1 kiyohara {
1710 1.1 kiyohara uint32_t i;
1711 1.1 kiyohara union fw_self_id *s;
1712 1.1 kiyohara
1713 1.1 kiyohara for (i = 0; i < fc->topology_map->self_id_count; i++) {
1714 1.1 kiyohara s = &fc->topology_map->self_id[i];
1715 1.1 kiyohara if (s->p0.sequel)
1716 1.1 kiyohara continue;
1717 1.1 kiyohara if (s->p0.phy_id == node)
1718 1.1 kiyohara return s;
1719 1.1 kiyohara }
1720 1.1 kiyohara return 0;
1721 1.1 kiyohara }
1722 1.1 kiyohara
1723 1.1 kiyohara static void
1724 1.1 kiyohara fw_explore(struct firewire_comm *fc)
1725 1.1 kiyohara {
1726 1.1 kiyohara int node, err, s, i, todo, todo2, trys;
1727 1.1 kiyohara char nodes[63];
1728 1.8 christos struct fw_device *dfwdev;
1729 1.14.6.2 joerg union fw_self_id *fwsid;
1730 1.1 kiyohara
1731 1.1 kiyohara todo = 0;
1732 1.8 christos dfwdev = malloc(sizeof(*dfwdev), M_TEMP, M_NOWAIT);
1733 1.8 christos if (dfwdev == NULL)
1734 1.8 christos return;
1735 1.1 kiyohara /* setup dummy fwdev */
1736 1.8 christos dfwdev->fc = fc;
1737 1.8 christos dfwdev->speed = 0;
1738 1.8 christos dfwdev->maxrec = 8; /* 512 */
1739 1.8 christos dfwdev->status = FWDEVINIT;
1740 1.1 kiyohara
1741 1.1 kiyohara for (node = 0; node <= fc->max_node; node ++) {
1742 1.1 kiyohara /* We don't probe myself and linkdown nodes */
1743 1.1 kiyohara if (node == fc->nodeid)
1744 1.1 kiyohara continue;
1745 1.14.6.2 joerg fwsid = fw_find_self_id(fc, node);
1746 1.14.6.2 joerg if (!fwsid || !fwsid->p0.link_active) {
1747 1.1 kiyohara if (firewire_debug)
1748 1.1 kiyohara printf("node%d: link down\n", node);
1749 1.1 kiyohara continue;
1750 1.1 kiyohara }
1751 1.1 kiyohara nodes[todo++] = node;
1752 1.1 kiyohara }
1753 1.1 kiyohara
1754 1.1 kiyohara s = splfw();
1755 1.1 kiyohara for (trys = 0; todo > 0 && trys < 3; trys ++) {
1756 1.1 kiyohara todo2 = 0;
1757 1.1 kiyohara for (i = 0; i < todo; i ++) {
1758 1.8 christos dfwdev->dst = nodes[i];
1759 1.8 christos err = fw_explore_node(dfwdev);
1760 1.1 kiyohara if (err)
1761 1.1 kiyohara nodes[todo2++] = nodes[i];
1762 1.1 kiyohara if (firewire_debug)
1763 1.1 kiyohara printf("%s: node %d, err = %d\n",
1764 1.1 kiyohara __FUNCTION__, node, err);
1765 1.1 kiyohara }
1766 1.1 kiyohara todo = todo2;
1767 1.1 kiyohara }
1768 1.1 kiyohara splx(s);
1769 1.8 christos free(dfwdev, M_TEMP);
1770 1.1 kiyohara }
1771 1.1 kiyohara
1772 1.1 kiyohara static void
1773 1.1 kiyohara fw_bus_probe_thread(void *arg)
1774 1.1 kiyohara {
1775 1.1 kiyohara struct firewire_comm *fc;
1776 1.1 kiyohara
1777 1.1 kiyohara fc = (struct firewire_comm *)arg;
1778 1.1 kiyohara
1779 1.14.6.2 joerg fw_config_pending_decr();
1780 1.1 kiyohara
1781 1.14.6.2 joerg fw_mtx_lock(&fc->wait_lock);
1782 1.14.6.2 joerg while (fc->status != FWBUSDETACH) {
1783 1.1 kiyohara if (fc->status == FWBUSEXPLORE) {
1784 1.14.6.2 joerg fw_mtx_unlock(&fc->wait_lock);
1785 1.1 kiyohara fw_explore(fc);
1786 1.1 kiyohara fc->status = FWBUSEXPDONE;
1787 1.1 kiyohara if (firewire_debug)
1788 1.1 kiyohara printf("bus_explore done\n");
1789 1.1 kiyohara fw_attach_dev(fc);
1790 1.14.6.2 joerg fw_mtx_lock(&fc->wait_lock);
1791 1.14.6.2 joerg }
1792 1.14.6.2 joerg fw_msleep((void *)fc, &fc->wait_lock, PWAIT|PCATCH, "-", 0);
1793 1.1 kiyohara }
1794 1.14.6.2 joerg fw_mtx_unlock(&fc->wait_lock);
1795 1.14.6.2 joerg fw_kthread_exit(0);
1796 1.1 kiyohara }
1797 1.1 kiyohara
1798 1.1 kiyohara
1799 1.1 kiyohara /*
1800 1.1 kiyohara * To attach sub-devices layer onto IEEE1394 bus.
1801 1.1 kiyohara */
1802 1.1 kiyohara static void
1803 1.1 kiyohara fw_attach_dev(struct firewire_comm *fc)
1804 1.1 kiyohara {
1805 1.1 kiyohara struct fw_device *fwdev, *next;
1806 1.1 kiyohara struct firewire_dev_comm *fdc;
1807 1.1 kiyohara struct fw_attach_args fwa;
1808 1.1 kiyohara
1809 1.1 kiyohara fwa.name = "sbp";
1810 1.1 kiyohara fwa.fc = fc;
1811 1.1 kiyohara
1812 1.1 kiyohara for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; fwdev = next) {
1813 1.1 kiyohara next = STAILQ_NEXT(fwdev, link);
1814 1.1 kiyohara switch (fwdev->status) {
1815 1.1 kiyohara case FWDEVNEW:
1816 1.1 kiyohara FIREWIRE_SBP_ATTACH;
1817 1.1 kiyohara
1818 1.1 kiyohara case FWDEVINIT:
1819 1.1 kiyohara case FWDEVATTACHED:
1820 1.1 kiyohara fwdev->status = FWDEVATTACHED;
1821 1.1 kiyohara break;
1822 1.1 kiyohara
1823 1.1 kiyohara case FWDEVINVAL:
1824 1.1 kiyohara fwdev->rcnt ++;
1825 1.1 kiyohara break;
1826 1.1 kiyohara
1827 1.1 kiyohara default:
1828 1.1 kiyohara /* XXX */
1829 1.1 kiyohara break;
1830 1.1 kiyohara }
1831 1.1 kiyohara }
1832 1.1 kiyohara
1833 1.2 drochner FIREWIRE_CHILDREN_FOREACH_FUNC(post_explore, fdc);
1834 1.1 kiyohara
1835 1.1 kiyohara for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; fwdev = next) {
1836 1.1 kiyohara next = STAILQ_NEXT(fwdev, link);
1837 1.1 kiyohara if (fwdev->rcnt > 0 && fwdev->rcnt > hold_count) {
1838 1.1 kiyohara /*
1839 1.1 kiyohara * Remove devices which have not been seen
1840 1.1 kiyohara * for a while.
1841 1.1 kiyohara */
1842 1.1 kiyohara FIREWIRE_SBP_DETACH;
1843 1.1 kiyohara STAILQ_REMOVE(&fc->devices, fwdev, fw_device, link);
1844 1.1 kiyohara free(fwdev, M_FW);
1845 1.1 kiyohara }
1846 1.1 kiyohara }
1847 1.1 kiyohara
1848 1.1 kiyohara return;
1849 1.1 kiyohara }
1850 1.1 kiyohara
1851 1.1 kiyohara /*
1852 1.1 kiyohara * To allocate unique transaction label.
1853 1.1 kiyohara */
1854 1.1 kiyohara static int
1855 1.1 kiyohara fw_get_tlabel(struct firewire_comm *fc, struct fw_xfer *xfer)
1856 1.1 kiyohara {
1857 1.14.6.2 joerg u_int dst, new_tlabel;
1858 1.1 kiyohara struct fw_xfer *txfer;
1859 1.1 kiyohara int s;
1860 1.1 kiyohara
1861 1.14.6.2 joerg dst = xfer->send.hdr.mode.hdr.dst & 0x3f;
1862 1.1 kiyohara s = splfw();
1863 1.14.6.2 joerg fw_mtx_lock(&fc->tlabel_lock);
1864 1.14.6.2 joerg new_tlabel = (fc->last_tlabel[dst] + 1) & 0x3f;
1865 1.14.6.2 joerg STAILQ_FOREACH(txfer, &fc->tlabels[new_tlabel], tlabel)
1866 1.14.6.2 joerg if ((txfer->send.hdr.mode.hdr.dst & 0x3f) == dst)
1867 1.14.6.2 joerg break;
1868 1.14.6.2 joerg if(txfer == NULL) {
1869 1.14.6.2 joerg fc->last_tlabel[dst] = new_tlabel;
1870 1.14.6.2 joerg STAILQ_INSERT_TAIL(&fc->tlabels[new_tlabel], xfer, tlabel);
1871 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1872 1.14.6.2 joerg splx(s);
1873 1.14.6.2 joerg xfer->tl = new_tlabel;
1874 1.14.6.2 joerg xfer->send.hdr.mode.hdr.tlrt = new_tlabel << 2;
1875 1.14.6.2 joerg if (firewire_debug > 1)
1876 1.14.6.2 joerg printf("fw_get_tlabel: dst=%d tl=%d\n", dst, new_tlabel);
1877 1.14.6.2 joerg return (new_tlabel);
1878 1.1 kiyohara }
1879 1.14.6.2 joerg fw_mtx_unlock(&fc->tlabel_lock);
1880 1.1 kiyohara splx(s);
1881 1.1 kiyohara
1882 1.1 kiyohara if (firewire_debug > 1)
1883 1.1 kiyohara printf("fw_get_tlabel: no free tlabel\n");
1884 1.14.6.2 joerg return (-1);
1885 1.1 kiyohara }
1886 1.1 kiyohara
1887 1.1 kiyohara static void
1888 1.1 kiyohara fw_rcv_copy(struct fw_rcv_buf *rb)
1889 1.1 kiyohara {
1890 1.1 kiyohara struct fw_pkt *pkt;
1891 1.1 kiyohara u_char *p;
1892 1.2 drochner const struct tcode_info *tinfo;
1893 1.1 kiyohara u_int res, i, len, plen;
1894 1.1 kiyohara
1895 1.1 kiyohara rb->xfer->recv.spd = rb->spd;
1896 1.1 kiyohara
1897 1.1 kiyohara pkt = (struct fw_pkt *)rb->vec->iov_base;
1898 1.1 kiyohara tinfo = &rb->fc->tcode[pkt->mode.hdr.tcode];
1899 1.1 kiyohara
1900 1.1 kiyohara /* Copy header */
1901 1.1 kiyohara p = (u_char *)&rb->xfer->recv.hdr;
1902 1.1 kiyohara bcopy(rb->vec->iov_base, p, tinfo->hdr_len);
1903 1.1 kiyohara rb->vec->iov_base = (u_char *)rb->vec->iov_base + tinfo->hdr_len;
1904 1.1 kiyohara rb->vec->iov_len -= tinfo->hdr_len;
1905 1.1 kiyohara
1906 1.1 kiyohara /* Copy payload */
1907 1.1 kiyohara p = (u_char *)rb->xfer->recv.payload;
1908 1.1 kiyohara res = rb->xfer->recv.pay_len;
1909 1.1 kiyohara
1910 1.1 kiyohara /* special handling for RRESQ */
1911 1.1 kiyohara if (pkt->mode.hdr.tcode == FWTCODE_RRESQ &&
1912 1.1 kiyohara p != NULL && res >= sizeof(uint32_t)) {
1913 1.1 kiyohara *(uint32_t *)p = pkt->mode.rresq.data;
1914 1.1 kiyohara rb->xfer->recv.pay_len = sizeof(uint32_t);
1915 1.1 kiyohara return;
1916 1.1 kiyohara }
1917 1.1 kiyohara
1918 1.1 kiyohara if ((tinfo->flag & FWTI_BLOCK_ASY) == 0)
1919 1.1 kiyohara return;
1920 1.1 kiyohara
1921 1.1 kiyohara plen = pkt->mode.rresb.len;
1922 1.1 kiyohara
1923 1.1 kiyohara for (i = 0; i < rb->nvec; i++, rb->vec++) {
1924 1.1 kiyohara len = MIN(rb->vec->iov_len, plen);
1925 1.1 kiyohara if (res < len) {
1926 1.1 kiyohara printf("rcv buffer(%d) is %d bytes short.\n",
1927 1.1 kiyohara rb->xfer->recv.pay_len, len - res);
1928 1.1 kiyohara len = res;
1929 1.1 kiyohara }
1930 1.7 christos if (p) {
1931 1.7 christos bcopy(rb->vec->iov_base, p, len);
1932 1.7 christos p += len;
1933 1.7 christos }
1934 1.1 kiyohara res -= len;
1935 1.1 kiyohara plen -= len;
1936 1.1 kiyohara if (res == 0 || plen == 0)
1937 1.1 kiyohara break;
1938 1.1 kiyohara }
1939 1.1 kiyohara rb->xfer->recv.pay_len -= res;
1940 1.1 kiyohara
1941 1.1 kiyohara }
1942 1.1 kiyohara
1943 1.1 kiyohara /*
1944 1.1 kiyohara * Generic packet receiving process.
1945 1.1 kiyohara */
1946 1.1 kiyohara void
1947 1.1 kiyohara fw_rcv(struct fw_rcv_buf *rb)
1948 1.1 kiyohara {
1949 1.1 kiyohara struct fw_pkt *fp, *resfp;
1950 1.1 kiyohara struct fw_bind *bind;
1951 1.1 kiyohara int tcode;
1952 1.1 kiyohara int i, len, oldstate;
1953 1.1 kiyohara #if 0
1954 1.1 kiyohara {
1955 1.1 kiyohara uint32_t *qld;
1956 1.1 kiyohara int i;
1957 1.1 kiyohara qld = (uint32_t *)buf;
1958 1.1 kiyohara printf("spd %d len:%d\n", spd, len);
1959 1.1 kiyohara for( i = 0 ; i <= len && i < 32; i+= 4){
1960 1.1 kiyohara printf("0x%08x ", ntohl(qld[i/4]));
1961 1.1 kiyohara if((i % 16) == 15) printf("\n");
1962 1.1 kiyohara }
1963 1.1 kiyohara if((i % 16) != 15) printf("\n");
1964 1.1 kiyohara }
1965 1.1 kiyohara #endif
1966 1.1 kiyohara fp = (struct fw_pkt *)rb->vec[0].iov_base;
1967 1.1 kiyohara tcode = fp->mode.common.tcode;
1968 1.1 kiyohara switch (tcode) {
1969 1.1 kiyohara case FWTCODE_WRES:
1970 1.1 kiyohara case FWTCODE_RRESQ:
1971 1.1 kiyohara case FWTCODE_RRESB:
1972 1.1 kiyohara case FWTCODE_LRES:
1973 1.1 kiyohara rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
1974 1.14.6.2 joerg fp->mode.hdr.tlrt >> 2, fp->mode.hdr.tcode);
1975 1.1 kiyohara if(rb->xfer == NULL) {
1976 1.1 kiyohara printf("fw_rcv: unknown response "
1977 1.1 kiyohara "%s(%x) src=0x%x tl=0x%x rt=%d data=0x%x\n",
1978 1.1 kiyohara tcode_str[tcode], tcode,
1979 1.1 kiyohara fp->mode.hdr.src,
1980 1.1 kiyohara fp->mode.hdr.tlrt >> 2,
1981 1.1 kiyohara fp->mode.hdr.tlrt & 3,
1982 1.1 kiyohara fp->mode.rresq.data);
1983 1.14.6.2 joerg #if 0
1984 1.1 kiyohara printf("try ad-hoc work around!!\n");
1985 1.1 kiyohara rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
1986 1.1 kiyohara (fp->mode.hdr.tlrt >> 2)^3);
1987 1.1 kiyohara if (rb->xfer == NULL) {
1988 1.1 kiyohara printf("no use...\n");
1989 1.1 kiyohara return;
1990 1.1 kiyohara }
1991 1.1 kiyohara #else
1992 1.1 kiyohara return;
1993 1.1 kiyohara #endif
1994 1.1 kiyohara }
1995 1.1 kiyohara fw_rcv_copy(rb);
1996 1.1 kiyohara if (rb->xfer->recv.hdr.mode.wres.rtcode != RESP_CMP)
1997 1.1 kiyohara rb->xfer->resp = EIO;
1998 1.1 kiyohara else
1999 1.1 kiyohara rb->xfer->resp = 0;
2000 1.1 kiyohara /* make sure the packet is drained in AT queue */
2001 1.14.6.2 joerg oldstate = rb->xfer->flag;
2002 1.14.6.2 joerg rb->xfer->flag = FWXF_RCVD;
2003 1.1 kiyohara switch (oldstate) {
2004 1.1 kiyohara case FWXF_SENT:
2005 1.1 kiyohara fw_xfer_done(rb->xfer);
2006 1.1 kiyohara break;
2007 1.1 kiyohara case FWXF_START:
2008 1.1 kiyohara #if 0
2009 1.1 kiyohara if (firewire_debug)
2010 1.1 kiyohara printf("not sent yet tl=%x\n", rb->xfer->tl);
2011 1.1 kiyohara #endif
2012 1.1 kiyohara break;
2013 1.1 kiyohara default:
2014 1.14.6.2 joerg printf("unexpected flag 0x%02x\n", rb->xfer->flag);
2015 1.1 kiyohara }
2016 1.1 kiyohara return;
2017 1.1 kiyohara case FWTCODE_WREQQ:
2018 1.1 kiyohara case FWTCODE_WREQB:
2019 1.1 kiyohara case FWTCODE_RREQQ:
2020 1.1 kiyohara case FWTCODE_RREQB:
2021 1.1 kiyohara case FWTCODE_LREQ:
2022 1.1 kiyohara bind = fw_bindlookup(rb->fc, fp->mode.rreqq.dest_hi,
2023 1.1 kiyohara fp->mode.rreqq.dest_lo);
2024 1.1 kiyohara if(bind == NULL){
2025 1.1 kiyohara #if 1
2026 1.1 kiyohara printf("Unknown service addr 0x%04x:0x%08x %s(%x)"
2027 1.1 kiyohara #if defined(__DragonFly__) || \
2028 1.1 kiyohara (defined(__FreeBSD__) && __FreeBSD_version < 500000)
2029 1.1 kiyohara " src=0x%x data=%lx\n",
2030 1.1 kiyohara #else
2031 1.1 kiyohara " src=0x%x data=%x\n",
2032 1.1 kiyohara #endif
2033 1.1 kiyohara fp->mode.wreqq.dest_hi, fp->mode.wreqq.dest_lo,
2034 1.1 kiyohara tcode_str[tcode], tcode,
2035 1.1 kiyohara fp->mode.hdr.src, ntohl(fp->mode.wreqq.data));
2036 1.1 kiyohara #endif
2037 1.14.6.2 joerg if (rb->fc->status == FWBUSINIT) {
2038 1.1 kiyohara printf("fw_rcv: cannot respond(bus reset)!\n");
2039 1.1 kiyohara return;
2040 1.1 kiyohara }
2041 1.1 kiyohara rb->xfer = fw_xfer_alloc(M_FWXFER);
2042 1.1 kiyohara if(rb->xfer == NULL){
2043 1.1 kiyohara return;
2044 1.1 kiyohara }
2045 1.1 kiyohara rb->xfer->send.spd = rb->spd;
2046 1.1 kiyohara rb->xfer->send.pay_len = 0;
2047 1.1 kiyohara resfp = &rb->xfer->send.hdr;
2048 1.1 kiyohara switch (tcode) {
2049 1.1 kiyohara case FWTCODE_WREQQ:
2050 1.1 kiyohara case FWTCODE_WREQB:
2051 1.1 kiyohara resfp->mode.hdr.tcode = FWTCODE_WRES;
2052 1.1 kiyohara break;
2053 1.1 kiyohara case FWTCODE_RREQQ:
2054 1.1 kiyohara resfp->mode.hdr.tcode = FWTCODE_RRESQ;
2055 1.1 kiyohara break;
2056 1.1 kiyohara case FWTCODE_RREQB:
2057 1.1 kiyohara resfp->mode.hdr.tcode = FWTCODE_RRESB;
2058 1.1 kiyohara break;
2059 1.1 kiyohara case FWTCODE_LREQ:
2060 1.1 kiyohara resfp->mode.hdr.tcode = FWTCODE_LRES;
2061 1.1 kiyohara break;
2062 1.1 kiyohara }
2063 1.1 kiyohara resfp->mode.hdr.dst = fp->mode.hdr.src;
2064 1.1 kiyohara resfp->mode.hdr.tlrt = fp->mode.hdr.tlrt;
2065 1.1 kiyohara resfp->mode.hdr.pri = fp->mode.hdr.pri;
2066 1.1 kiyohara resfp->mode.rresb.rtcode = RESP_ADDRESS_ERROR;
2067 1.1 kiyohara resfp->mode.rresb.extcode = 0;
2068 1.1 kiyohara resfp->mode.rresb.len = 0;
2069 1.1 kiyohara /*
2070 1.14.6.2 joerg rb->xfer->hand = fw_xferwake;
2071 1.1 kiyohara */
2072 1.1 kiyohara rb->xfer->hand = fw_xfer_free;
2073 1.1 kiyohara if(fw_asyreq(rb->fc, -1, rb->xfer)){
2074 1.1 kiyohara fw_xfer_free(rb->xfer);
2075 1.1 kiyohara return;
2076 1.1 kiyohara }
2077 1.1 kiyohara return;
2078 1.1 kiyohara }
2079 1.1 kiyohara len = 0;
2080 1.1 kiyohara for (i = 0; i < rb->nvec; i ++)
2081 1.1 kiyohara len += rb->vec[i].iov_len;
2082 1.1 kiyohara rb->xfer = STAILQ_FIRST(&bind->xferlist);
2083 1.1 kiyohara if (rb->xfer == NULL) {
2084 1.1 kiyohara #if 1
2085 1.1 kiyohara printf("Discard a packet for this bind.\n");
2086 1.1 kiyohara #endif
2087 1.1 kiyohara return;
2088 1.1 kiyohara }
2089 1.1 kiyohara STAILQ_REMOVE_HEAD(&bind->xferlist, link);
2090 1.1 kiyohara fw_rcv_copy(rb);
2091 1.1 kiyohara rb->xfer->hand(rb->xfer);
2092 1.1 kiyohara return;
2093 1.1 kiyohara #if 0 /* shouldn't happen ?? or for GASP */
2094 1.1 kiyohara case FWTCODE_STREAM:
2095 1.1 kiyohara {
2096 1.1 kiyohara struct fw_xferq *xferq;
2097 1.1 kiyohara
2098 1.1 kiyohara xferq = rb->fc->ir[sub];
2099 1.1 kiyohara #if 0
2100 1.1 kiyohara printf("stream rcv dma %d len %d off %d spd %d\n",
2101 1.1 kiyohara sub, len, off, spd);
2102 1.1 kiyohara #endif
2103 1.1 kiyohara if(xferq->queued >= xferq->maxq) {
2104 1.1 kiyohara printf("receive queue is full\n");
2105 1.1 kiyohara return;
2106 1.1 kiyohara }
2107 1.1 kiyohara /* XXX get xfer from xfer queue, we don't need copy for
2108 1.1 kiyohara per packet mode */
2109 1.1 kiyohara rb->xfer = fw_xfer_alloc_buf(M_FWXFER, 0, /* XXX */
2110 1.1 kiyohara vec[0].iov_len);
2111 1.1 kiyohara if (rb->xfer == NULL)
2112 1.1 kiyohara return;
2113 1.1 kiyohara fw_rcv_copy(rb)
2114 1.1 kiyohara s = splfw();
2115 1.1 kiyohara xferq->queued++;
2116 1.1 kiyohara STAILQ_INSERT_TAIL(&xferq->q, rb->xfer, link);
2117 1.1 kiyohara splx(s);
2118 1.1 kiyohara sc = device_get_softc(rb->fc->bdev);
2119 1.1 kiyohara #if defined(__DragonFly__) || \
2120 1.1 kiyohara (defined(__FreeBSD__) && __FreeBSD_version < 500000)
2121 1.1 kiyohara if (&xferq->rsel.si_pid != 0)
2122 1.1 kiyohara #else
2123 1.1 kiyohara if (SEL_WAITING(&xferq->rsel))
2124 1.1 kiyohara #endif
2125 1.1 kiyohara selwakeuppri(&xferq->rsel, FWPRI);
2126 1.1 kiyohara if (xferq->flag & FWXFERQ_WAKEUP) {
2127 1.1 kiyohara xferq->flag &= ~FWXFERQ_WAKEUP;
2128 1.12 christos wakeup((void *)xferq);
2129 1.1 kiyohara }
2130 1.1 kiyohara if (xferq->flag & FWXFERQ_HANDLER) {
2131 1.1 kiyohara xferq->hand(xferq);
2132 1.1 kiyohara }
2133 1.1 kiyohara return;
2134 1.1 kiyohara break;
2135 1.1 kiyohara }
2136 1.1 kiyohara #endif
2137 1.1 kiyohara default:
2138 1.1 kiyohara printf("fw_rcv: unknow tcode %d\n", tcode);
2139 1.1 kiyohara break;
2140 1.1 kiyohara }
2141 1.1 kiyohara }
2142 1.1 kiyohara
2143 1.1 kiyohara /*
2144 1.1 kiyohara * Post process for Bus Manager election process.
2145 1.1 kiyohara */
2146 1.1 kiyohara static void
2147 1.1 kiyohara fw_try_bmr_callback(struct fw_xfer *xfer)
2148 1.1 kiyohara {
2149 1.1 kiyohara struct firewire_comm *fc;
2150 1.1 kiyohara int bmr;
2151 1.1 kiyohara
2152 1.1 kiyohara if (xfer == NULL)
2153 1.1 kiyohara return;
2154 1.1 kiyohara fc = xfer->fc;
2155 1.1 kiyohara if (xfer->resp != 0)
2156 1.1 kiyohara goto error;
2157 1.1 kiyohara if (xfer->recv.payload == NULL)
2158 1.1 kiyohara goto error;
2159 1.1 kiyohara if (xfer->recv.hdr.mode.lres.rtcode != FWRCODE_COMPLETE)
2160 1.1 kiyohara goto error;
2161 1.1 kiyohara
2162 1.1 kiyohara bmr = ntohl(xfer->recv.payload[0]);
2163 1.1 kiyohara if (bmr == 0x3f)
2164 1.1 kiyohara bmr = fc->nodeid;
2165 1.1 kiyohara
2166 1.1 kiyohara CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, bmr & 0x3f);
2167 1.1 kiyohara fw_xfer_free_buf(xfer);
2168 1.1 kiyohara fw_bmr(fc);
2169 1.1 kiyohara return;
2170 1.1 kiyohara
2171 1.1 kiyohara error:
2172 1.14.6.2 joerg fw_printf(fc->bdev, "bus manager election failed\n");
2173 1.1 kiyohara fw_xfer_free_buf(xfer);
2174 1.1 kiyohara }
2175 1.1 kiyohara
2176 1.1 kiyohara
2177 1.1 kiyohara /*
2178 1.1 kiyohara * To candidate Bus Manager election process.
2179 1.1 kiyohara */
2180 1.1 kiyohara static void
2181 1.1 kiyohara fw_try_bmr(void *arg)
2182 1.1 kiyohara {
2183 1.1 kiyohara struct fw_xfer *xfer;
2184 1.1 kiyohara struct firewire_comm *fc = (struct firewire_comm *)arg;
2185 1.1 kiyohara struct fw_pkt *fp;
2186 1.1 kiyohara int err = 0;
2187 1.1 kiyohara
2188 1.1 kiyohara xfer = fw_xfer_alloc_buf(M_FWXFER, 8, 4);
2189 1.1 kiyohara if(xfer == NULL){
2190 1.1 kiyohara return;
2191 1.1 kiyohara }
2192 1.1 kiyohara xfer->send.spd = 0;
2193 1.1 kiyohara fc->status = FWBUSMGRELECT;
2194 1.1 kiyohara
2195 1.1 kiyohara fp = &xfer->send.hdr;
2196 1.1 kiyohara fp->mode.lreq.dest_hi = 0xffff;
2197 1.1 kiyohara fp->mode.lreq.tlrt = 0;
2198 1.1 kiyohara fp->mode.lreq.tcode = FWTCODE_LREQ;
2199 1.1 kiyohara fp->mode.lreq.pri = 0;
2200 1.1 kiyohara fp->mode.lreq.src = 0;
2201 1.1 kiyohara fp->mode.lreq.len = 8;
2202 1.1 kiyohara fp->mode.lreq.extcode = EXTCODE_CMP_SWAP;
2203 1.1 kiyohara fp->mode.lreq.dst = FWLOCALBUS | fc->irm;
2204 1.1 kiyohara fp->mode.lreq.dest_lo = 0xf0000000 | BUS_MGR_ID;
2205 1.1 kiyohara xfer->send.payload[0] = htonl(0x3f);
2206 1.1 kiyohara xfer->send.payload[1] = htonl(fc->nodeid);
2207 1.1 kiyohara xfer->hand = fw_try_bmr_callback;
2208 1.1 kiyohara
2209 1.1 kiyohara err = fw_asyreq(fc, -1, xfer);
2210 1.1 kiyohara if(err){
2211 1.1 kiyohara fw_xfer_free_buf(xfer);
2212 1.1 kiyohara return;
2213 1.1 kiyohara }
2214 1.1 kiyohara return;
2215 1.1 kiyohara }
2216 1.1 kiyohara
2217 1.1 kiyohara #ifdef FW_VMACCESS
2218 1.1 kiyohara /*
2219 1.1 kiyohara * Software implementation for physical memory block access.
2220 1.1 kiyohara * XXX:Too slow, usef for debug purpose only.
2221 1.1 kiyohara */
2222 1.1 kiyohara static void
2223 1.1 kiyohara fw_vmaccess(struct fw_xfer *xfer){
2224 1.1 kiyohara struct fw_pkt *rfp, *sfp = NULL;
2225 1.1 kiyohara uint32_t *ld = (uint32_t *)xfer->recv.buf;
2226 1.1 kiyohara
2227 1.1 kiyohara printf("vmaccess spd:%2x len:%03x data:%08x %08x %08x %08x\n",
2228 1.1 kiyohara xfer->spd, xfer->recv.len, ntohl(ld[0]), ntohl(ld[1]), ntohl(ld[2]), ntohl(ld[3]));
2229 1.1 kiyohara printf("vmaccess data:%08x %08x %08x %08x\n", ntohl(ld[4]), ntohl(ld[5]), ntohl(ld[6]), ntohl(ld[7]));
2230 1.1 kiyohara if(xfer->resp != 0){
2231 1.1 kiyohara fw_xfer_free( xfer);
2232 1.1 kiyohara return;
2233 1.1 kiyohara }
2234 1.1 kiyohara if(xfer->recv.buf == NULL){
2235 1.1 kiyohara fw_xfer_free( xfer);
2236 1.1 kiyohara return;
2237 1.1 kiyohara }
2238 1.1 kiyohara rfp = (struct fw_pkt *)xfer->recv.buf;
2239 1.1 kiyohara switch(rfp->mode.hdr.tcode){
2240 1.1 kiyohara /* XXX need fix for 64bit arch */
2241 1.1 kiyohara case FWTCODE_WREQB:
2242 1.1 kiyohara xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2243 1.1 kiyohara xfer->send.len = 12;
2244 1.1 kiyohara sfp = (struct fw_pkt *)xfer->send.buf;
2245 1.1 kiyohara bcopy(rfp->mode.wreqb.payload,
2246 1.12 christos (void *)ntohl(rfp->mode.wreqb.dest_lo), ntohs(rfp->mode.wreqb.len));
2247 1.1 kiyohara sfp->mode.wres.tcode = FWTCODE_WRES;
2248 1.1 kiyohara sfp->mode.wres.rtcode = 0;
2249 1.1 kiyohara break;
2250 1.1 kiyohara case FWTCODE_WREQQ:
2251 1.1 kiyohara xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2252 1.1 kiyohara xfer->send.len = 12;
2253 1.1 kiyohara sfp->mode.wres.tcode = FWTCODE_WRES;
2254 1.1 kiyohara *((uint32_t *)(ntohl(rfp->mode.wreqb.dest_lo))) = rfp->mode.wreqq.data;
2255 1.1 kiyohara sfp->mode.wres.rtcode = 0;
2256 1.1 kiyohara break;
2257 1.1 kiyohara case FWTCODE_RREQB:
2258 1.1 kiyohara xfer->send.buf = malloc(16 + rfp->mode.rreqb.len, M_FW, M_NOWAIT);
2259 1.1 kiyohara xfer->send.len = 16 + ntohs(rfp->mode.rreqb.len);
2260 1.1 kiyohara sfp = (struct fw_pkt *)xfer->send.buf;
2261 1.12 christos bcopy((void *)ntohl(rfp->mode.rreqb.dest_lo),
2262 1.1 kiyohara sfp->mode.rresb.payload, (uint16_t)ntohs(rfp->mode.rreqb.len));
2263 1.1 kiyohara sfp->mode.rresb.tcode = FWTCODE_RRESB;
2264 1.1 kiyohara sfp->mode.rresb.len = rfp->mode.rreqb.len;
2265 1.1 kiyohara sfp->mode.rresb.rtcode = 0;
2266 1.1 kiyohara sfp->mode.rresb.extcode = 0;
2267 1.1 kiyohara break;
2268 1.1 kiyohara case FWTCODE_RREQQ:
2269 1.1 kiyohara xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
2270 1.1 kiyohara xfer->send.len = 16;
2271 1.1 kiyohara sfp = (struct fw_pkt *)xfer->send.buf;
2272 1.1 kiyohara sfp->mode.rresq.data = *(uint32_t *)(ntohl(rfp->mode.rreqq.dest_lo));
2273 1.1 kiyohara sfp->mode.wres.tcode = FWTCODE_RRESQ;
2274 1.1 kiyohara sfp->mode.rresb.rtcode = 0;
2275 1.1 kiyohara break;
2276 1.1 kiyohara default:
2277 1.1 kiyohara fw_xfer_free( xfer);
2278 1.1 kiyohara return;
2279 1.1 kiyohara }
2280 1.1 kiyohara sfp->mode.hdr.dst = rfp->mode.hdr.src;
2281 1.1 kiyohara xfer->dst = ntohs(rfp->mode.hdr.src);
2282 1.1 kiyohara xfer->hand = fw_xfer_free;
2283 1.1 kiyohara
2284 1.1 kiyohara sfp->mode.hdr.tlrt = rfp->mode.hdr.tlrt;
2285 1.1 kiyohara sfp->mode.hdr.pri = 0;
2286 1.1 kiyohara
2287 1.1 kiyohara fw_asyreq(xfer->fc, -1, xfer);
2288 1.1 kiyohara /**/
2289 1.1 kiyohara return;
2290 1.1 kiyohara }
2291 1.1 kiyohara #endif
2292 1.1 kiyohara
2293 1.1 kiyohara /*
2294 1.1 kiyohara * CRC16 check-sum for IEEE1394 register blocks.
2295 1.1 kiyohara */
2296 1.1 kiyohara uint16_t
2297 1.1 kiyohara fw_crc16(uint32_t *ptr, uint32_t len){
2298 1.1 kiyohara uint32_t i, sum, crc = 0;
2299 1.1 kiyohara int shift;
2300 1.1 kiyohara len = (len + 3) & ~3;
2301 1.1 kiyohara for(i = 0 ; i < len ; i+= 4){
2302 1.1 kiyohara for( shift = 28 ; shift >= 0 ; shift -= 4){
2303 1.1 kiyohara sum = ((crc >> 12) ^ (ptr[i/4] >> shift)) & 0xf;
2304 1.1 kiyohara crc = (crc << 4) ^ ( sum << 12 ) ^ ( sum << 5) ^ sum;
2305 1.1 kiyohara }
2306 1.1 kiyohara crc &= 0xffff;
2307 1.1 kiyohara }
2308 1.1 kiyohara return((uint16_t) crc);
2309 1.1 kiyohara }
2310 1.1 kiyohara
2311 1.1 kiyohara static int
2312 1.1 kiyohara fw_bmr(struct firewire_comm *fc)
2313 1.1 kiyohara {
2314 1.1 kiyohara struct fw_device fwdev;
2315 1.1 kiyohara union fw_self_id *self_id;
2316 1.1 kiyohara int cmstr;
2317 1.1 kiyohara uint32_t quad;
2318 1.1 kiyohara
2319 1.1 kiyohara /* Check to see if the current root node is cycle master capable */
2320 1.1 kiyohara self_id = fw_find_self_id(fc, fc->max_node);
2321 1.1 kiyohara if (fc->max_node > 0) {
2322 1.1 kiyohara /* XXX check cmc bit of businfo block rather than contender */
2323 1.1 kiyohara if (self_id->p0.link_active && self_id->p0.contender)
2324 1.1 kiyohara cmstr = fc->max_node;
2325 1.1 kiyohara else {
2326 1.14.6.2 joerg fw_printf(fc->bdev,
2327 1.1 kiyohara "root node is not cycle master capable\n");
2328 1.1 kiyohara /* XXX shall we be the cycle master? */
2329 1.1 kiyohara cmstr = fc->nodeid;
2330 1.1 kiyohara /* XXX need bus reset */
2331 1.1 kiyohara }
2332 1.1 kiyohara } else
2333 1.1 kiyohara cmstr = -1;
2334 1.1 kiyohara
2335 1.14.6.2 joerg fw_printf(fc->bdev, "bus manager %d ", CSRARC(fc, BUS_MGR_ID));
2336 1.1 kiyohara if(CSRARC(fc, BUS_MGR_ID) != fc->nodeid) {
2337 1.1 kiyohara /* We are not the bus manager */
2338 1.1 kiyohara printf("\n");
2339 1.1 kiyohara return(0);
2340 1.1 kiyohara }
2341 1.1 kiyohara printf("(me)\n");
2342 1.1 kiyohara
2343 1.1 kiyohara /* Optimize gapcount */
2344 1.1 kiyohara if(fc->max_hop <= MAX_GAPHOP )
2345 1.1 kiyohara fw_phy_config(fc, cmstr, gap_cnt[fc->max_hop]);
2346 1.1 kiyohara /* If we are the cycle master, nothing to do */
2347 1.1 kiyohara if (cmstr == fc->nodeid || cmstr == -1)
2348 1.1 kiyohara return 0;
2349 1.1 kiyohara /* Bus probe has not finished, make dummy fwdev for cmstr */
2350 1.1 kiyohara bzero(&fwdev, sizeof(fwdev));
2351 1.1 kiyohara fwdev.fc = fc;
2352 1.1 kiyohara fwdev.dst = cmstr;
2353 1.1 kiyohara fwdev.speed = 0;
2354 1.1 kiyohara fwdev.maxrec = 8; /* 512 */
2355 1.1 kiyohara fwdev.status = FWDEVINIT;
2356 1.1 kiyohara /* Set cmstr bit on the cycle master */
2357 1.1 kiyohara quad = htonl(1 << 8);
2358 1.1 kiyohara fwmem_write_quad(&fwdev, NULL, 0/*spd*/,
2359 1.1 kiyohara 0xffff, 0xf0000000 | STATE_SET, &quad, fw_asy_callback_free);
2360 1.1 kiyohara
2361 1.1 kiyohara return 0;
2362 1.1 kiyohara }
2363 1.1 kiyohara
2364 1.14.6.2 joerg int
2365 1.14.6.2 joerg fw_open_isodma(struct firewire_comm *fc, int tx)
2366 1.14.6.2 joerg {
2367 1.14.6.2 joerg struct fw_xferq **xferqa;
2368 1.14.6.2 joerg struct fw_xferq *xferq;
2369 1.14.6.2 joerg int i;
2370 1.14.6.2 joerg
2371 1.14.6.2 joerg if (tx)
2372 1.14.6.2 joerg xferqa = &fc->it[0];
2373 1.14.6.2 joerg else
2374 1.14.6.2 joerg xferqa = &fc->ir[0];
2375 1.14.6.2 joerg
2376 1.14.6.2 joerg FW_GLOCK(fc);
2377 1.14.6.2 joerg for (i = 0; i < fc->nisodma; i ++) {
2378 1.14.6.2 joerg xferq = xferqa[i];
2379 1.14.6.2 joerg if ((xferq->flag & FWXFERQ_OPEN) == 0) {
2380 1.14.6.2 joerg xferq->flag |= FWXFERQ_OPEN;
2381 1.14.6.2 joerg break;
2382 1.14.6.2 joerg }
2383 1.14.6.2 joerg }
2384 1.14.6.2 joerg if (i == fc->nisodma) {
2385 1.14.6.2 joerg printf("no free dma channel (tx=%d)\n", tx);
2386 1.14.6.2 joerg i = -1;
2387 1.14.6.2 joerg }
2388 1.14.6.2 joerg FW_GUNLOCK(fc);
2389 1.14.6.2 joerg return (i);
2390 1.14.6.2 joerg }
2391 1.14.6.2 joerg
2392 1.1 kiyohara #if defined(__FreeBSD__)
2393 1.1 kiyohara static int
2394 1.1 kiyohara fw_modevent(module_t mode, int type, void *data)
2395 1.1 kiyohara {
2396 1.1 kiyohara int err = 0;
2397 1.1 kiyohara #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2398 1.1 kiyohara static eventhandler_tag fwdev_ehtag = NULL;
2399 1.1 kiyohara #endif
2400 1.1 kiyohara
2401 1.1 kiyohara switch (type) {
2402 1.1 kiyohara case MOD_LOAD:
2403 1.1 kiyohara #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2404 1.1 kiyohara fwdev_ehtag = EVENTHANDLER_REGISTER(dev_clone,
2405 1.1 kiyohara fwdev_clone, 0, 1000);
2406 1.1 kiyohara #endif
2407 1.1 kiyohara break;
2408 1.1 kiyohara case MOD_UNLOAD:
2409 1.1 kiyohara #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2410 1.1 kiyohara if (fwdev_ehtag != NULL)
2411 1.1 kiyohara EVENTHANDLER_DEREGISTER(dev_clone, fwdev_ehtag);
2412 1.1 kiyohara #endif
2413 1.1 kiyohara break;
2414 1.1 kiyohara case MOD_SHUTDOWN:
2415 1.1 kiyohara break;
2416 1.1 kiyohara default:
2417 1.1 kiyohara return (EOPNOTSUPP);
2418 1.1 kiyohara }
2419 1.1 kiyohara return (err);
2420 1.1 kiyohara }
2421 1.1 kiyohara
2422 1.1 kiyohara
2423 1.1 kiyohara #ifdef __DragonFly__
2424 1.1 kiyohara DECLARE_DUMMY_MODULE(firewire);
2425 1.1 kiyohara #endif
2426 1.1 kiyohara DRIVER_MODULE(firewire,fwohci,firewire_driver,firewire_devclass,fw_modevent,0);
2427 1.1 kiyohara MODULE_VERSION(firewire, 1);
2428 1.1 kiyohara #endif
2429