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