2 * Copyright (c) 2003 Hidetoshi Shimokawa
3 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 * must display the acknowledgement as bellow:
17 * This product includes software developed by K. Kobayashi and H. Shimokawa
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
34 * $FreeBSD: src/sys/dev/firewire/firewire.c,v 1.68 2004/01/08 14:58:09 simokawa Exp $
35 * $DragonFly: src/sys/bus/firewire/firewire.c,v 1.21 2008/01/06 16:55:49 swildner Exp $
39 #include <sys/param.h>
40 #include <sys/systm.h>
41 #include <sys/types.h>
43 #include <sys/kernel.h>
44 #include <sys/malloc.h>
46 #include <sys/bus.h> /* used by smbus and newbus */
47 #include <sys/sysctl.h>
48 #include <sys/thread2.h>
50 #if defined(__DragonFly__) || __FreeBSD_version < 500000
51 #include <machine/clock.h> /* for DELAY() */
56 #include "firewirereg.h"
61 #include <dev/firewire/firewire.h>
62 #include <dev/firewire/firewirereg.h>
63 #include <dev/firewire/fwmem.h>
64 #include <dev/firewire/iec13213.h>
65 #include <dev/firewire/iec68113.h>
70 struct crom_chunk root
;
71 struct crom_chunk vendor
;
75 int firewire_debug
=0, try_bmr
=1, hold_count
=3;
76 SYSCTL_INT(_debug
, OID_AUTO
, firewire_debug
, CTLFLAG_RW
, &firewire_debug
, 0,
77 "FireWire driver debug flag");
78 SYSCTL_NODE(_hw
, OID_AUTO
, firewire
, CTLFLAG_RD
, 0, "FireWire Subsystem");
79 SYSCTL_INT(_hw_firewire
, OID_AUTO
, try_bmr
, CTLFLAG_RW
, &try_bmr
, 0,
80 "Try to be a bus manager");
81 SYSCTL_INT(_hw_firewire
, OID_AUTO
, hold_count
, CTLFLAG_RW
, &hold_count
, 0,
82 "Number of count of bus resets for removing lost device information");
84 MALLOC_DEFINE(M_FW
, "firewire", "FireWire");
85 MALLOC_DEFINE(M_FWXFER
, "fw_xfer", "XFER/FireWire");
87 #define FW_MAXASYRTY 4
89 devclass_t firewire_devclass
;
91 static int firewire_probe (device_t
);
92 static int firewire_attach (device_t
);
93 static int firewire_detach (device_t
);
94 static int firewire_resume (device_t
);
96 static int firewire_shutdown (device_t
);
98 static device_t
firewire_add_child (device_t
, device_t
, int, const char *, int);
99 static void fw_try_bmr (void *);
100 static void fw_try_bmr_callback (struct fw_xfer
*);
101 static void fw_asystart (struct fw_xfer
*);
102 static int fw_get_tlabel (struct firewire_comm
*, struct fw_xfer
*);
103 static void fw_bus_probe (struct firewire_comm
*);
104 static void fw_bus_explore (struct firewire_comm
*);
105 static void fw_bus_explore_callback (struct fw_xfer
*);
106 static void fw_attach_dev (struct firewire_comm
*);
108 static void fw_vmaccess (struct fw_xfer
*);
110 struct fw_xfer
*asyreqq (struct firewire_comm
*, u_int8_t
, u_int8_t
, u_int8_t
,
111 u_int32_t
, u_int32_t
, void (*)(struct fw_xfer
*));
112 static int fw_bmr (struct firewire_comm
*);
115 * note: bus_generic_identify() will automatically install a "firewire"
116 * device under any attached fwohci device.
118 static device_method_t firewire_methods
[] = {
119 /* Device interface */
120 DEVMETHOD(device_identify
, bus_generic_identify
),
121 DEVMETHOD(device_probe
, firewire_probe
),
122 DEVMETHOD(device_attach
, firewire_attach
),
123 DEVMETHOD(device_detach
, firewire_detach
),
124 DEVMETHOD(device_suspend
, bus_generic_suspend
),
125 DEVMETHOD(device_resume
, firewire_resume
),
126 DEVMETHOD(device_shutdown
, bus_generic_shutdown
),
129 DEVMETHOD(bus_add_child
, firewire_add_child
),
130 DEVMETHOD(bus_print_child
, bus_generic_print_child
),
134 char *linkspeed
[] = {
135 "S100", "S200", "S400", "S800",
136 "S1600", "S3200", "undef", "undef"
139 static char *tcode_str
[] = {
140 "WREQQ", "WREQB", "WRES", "undef",
141 "RREQQ", "RREQB", "RRESQ", "RRESB",
142 "CYCS", "LREQ", "STREAM", "LRES",
143 "undef", "undef", "PHY", "undef"
146 /* IEEE-1394a Table C-2 Gap count as a function of hops*/
147 #define MAX_GAPHOP 15
148 u_int gap_cnt
[] = { 5, 5, 7, 8, 10, 13, 16, 18,
149 21, 24, 26, 29, 32, 35, 37, 40};
151 static driver_t firewire_driver
= {
154 sizeof(struct firewire_softc
),
158 * Lookup fwdev by node id.
161 fw_noderesolve_nodeid(struct firewire_comm
*fc
, int dst
)
163 struct fw_device
*fwdev
;
166 STAILQ_FOREACH(fwdev
, &fc
->devices
, link
)
167 if (fwdev
->dst
== dst
&& fwdev
->status
!= FWDEVINVAL
)
175 * Lookup fwdev by EUI64.
178 fw_noderesolve_eui64(struct firewire_comm
*fc
, struct fw_eui64
*eui
)
180 struct fw_device
*fwdev
;
183 STAILQ_FOREACH(fwdev
, &fc
->devices
, link
)
184 if (FW_EUI64_EQUAL(fwdev
->eui
, *eui
))
188 if(fwdev
== NULL
) return NULL
;
189 if(fwdev
->status
== FWDEVINVAL
) return NULL
;
194 * Async. request procedure for userland application.
197 fw_asyreq(struct firewire_comm
*fc
, int sub
, struct fw_xfer
*xfer
)
200 struct fw_xferq
*xferq
;
204 struct tcode_info
*info
;
206 if(xfer
== NULL
) return EINVAL
;
207 if(xfer
->act
.hand
== NULL
){
208 kprintf("act.hand == NULL\n");
211 fp
= &xfer
->send
.hdr
;
213 tcode
= fp
->mode
.common
.tcode
& 0xf;
214 info
= &fc
->tcode
[tcode
];
215 if (info
->flag
== 0) {
216 kprintf("invalid tcode=%x\n", tcode
);
219 if (info
->flag
& FWTI_REQ
)
224 if (xfer
->send
.pay_len
> MAXREC(fc
->maxrec
)) {
225 kprintf("send.pay_len > maxrec\n");
228 if (info
->flag
& FWTI_BLOCK_STR
)
229 len
= fp
->mode
.stream
.len
;
230 else if (info
->flag
& FWTI_BLOCK_ASY
)
231 len
= fp
->mode
.rresb
.len
;
234 if (len
!= xfer
->send
.pay_len
){
235 kprintf("len(%d) != send.pay_len(%d) %s(%x)\n",
236 len
, xfer
->send
.pay_len
, tcode_str
[tcode
], tcode
);
240 if(xferq
->start
== NULL
){
241 kprintf("xferq->start == NULL\n");
244 if(!(xferq
->queued
< xferq
->maxq
)){
245 device_printf(fc
->bdev
, "Discard a packet (queued=%d)\n",
250 microtime(&xfer
->tv
);
251 if (info
->flag
& FWTI_TLABEL
) {
252 if((tl
= fw_get_tlabel(fc
, xfer
)) == -1 )
254 fp
->mode
.hdr
.tlrt
= tl
<< 2;
261 xfer
->retry_req
= fw_asybusy
;
267 * Wakeup blocked process.
270 fw_asy_callback(struct fw_xfer
*xfer
){
275 * Postpone to later retry.
278 fw_asybusy(struct fw_xfer
*xfer
)
280 kprintf("fw_asybusy\n");
282 xfer->ch = timeout((timeout_t *)fw_asystart, (void *)xfer, 20000);
292 * Async. request with given xfer structure.
295 fw_asystart(struct fw_xfer
*xfer
)
297 struct firewire_comm
*fc
= xfer
->fc
;
299 if(xfer
->retry
++ >= fc
->max_asyretry
){
300 device_printf(fc
->bdev
, "max_asyretry exceeded\n");
302 xfer
->state
= FWXF_BUSY
;
303 xfer
->act
.hand(xfer
);
306 #if 0 /* XXX allow bus explore packets only after bus rest */
307 if (fc
->status
< FWBUSEXPLORE
) {
309 xfer
->state
= FWXF_BUSY
;
310 if (xfer
->act
.hand
!= NULL
)
311 xfer
->act
.hand(xfer
);
316 xfer
->state
= FWXF_INQ
;
317 STAILQ_INSERT_TAIL(&xfer
->q
->q
, xfer
, link
);
320 /* XXX just queue for mbuf */
321 if (xfer
->mbuf
== NULL
)
327 firewire_probe(device_t dev
)
329 device_set_desc(dev
, "IEEE1394(FireWire) bus");
334 firewire_xfer_timeout(struct firewire_comm
*fc
)
336 struct fw_xfer
*xfer
;
339 struct timeval split_timeout
;
342 split_timeout
.tv_sec
= 0;
343 split_timeout
.tv_usec
= 200 * 1000; /* 200 msec */
346 timevalsub(&tv
, &split_timeout
);
349 for (i
= 0; i
< 0x40; i
++) {
350 while ((tl
= STAILQ_FIRST(&fc
->tlabels
[i
])) != NULL
) {
352 if (timevalcmp(&xfer
->tv
, &tv
, >))
353 /* the rests are newer than this */
355 if (xfer
->state
== FWXF_START
)
358 device_printf(fc
->bdev
,
359 "split transaction timeout dst=0x%x tl=0x%x state=%d\n",
360 xfer
->send
.hdr
.mode
.hdr
.dst
, i
, xfer
->state
);
361 xfer
->resp
= ETIMEDOUT
;
362 STAILQ_REMOVE_HEAD(&fc
->tlabels
[i
], link
);
369 #define WATCHDOC_HZ 10
371 firewire_watchdog(void *arg
)
373 struct firewire_comm
*fc
;
374 static int watchdoc_clock
= 0;
376 fc
= (struct firewire_comm
*)arg
;
379 * At boot stage, the device interrupt is disabled and
380 * We encounter a timeout easily. To avoid this,
381 * ignore clock interrupt for a while.
383 if (watchdoc_clock
> WATCHDOC_HZ
* 15) {
384 firewire_xfer_timeout(fc
);
389 callout_reset(&fc
->timeout_callout
, hz
/ WATCHDOC_HZ
,
390 (void *)firewire_watchdog
, (void *)fc
);
394 * The attach routine.
397 firewire_attach(device_t dev
)
400 struct firewire_softc
*sc
= device_get_softc(dev
);
401 device_t pa
= device_get_parent(dev
);
402 struct firewire_comm
*fc
;
404 fc
= (struct firewire_comm
*)device_get_softc(pa
);
406 fc
->status
= FWBUSNOTREADY
;
408 unit
= device_get_unit(dev
);
409 if( fc
->nisodma
> FWMAXNDMA
) fc
->nisodma
= FWMAXNDMA
;
413 CALLOUT_INIT(&sc
->fc
->timeout_callout
);
414 CALLOUT_INIT(&sc
->fc
->bmr_callout
);
415 CALLOUT_INIT(&sc
->fc
->retry_probe_callout
);
416 CALLOUT_INIT(&sc
->fc
->busprobe_callout
);
418 callout_reset(&sc
->fc
->timeout_callout
, hz
,
419 (void *)firewire_watchdog
, (void *)sc
->fc
);
421 /* Locate our children */
422 bus_generic_probe(dev
);
424 /* launch attachement of the added children */
425 bus_generic_attach(dev
);
435 * Attach it as child.
438 firewire_add_child(device_t bus
, device_t parent
, int order
, const char *name
, int unit
)
441 struct firewire_softc
*sc
;
443 sc
= (struct firewire_softc
*)device_get_softc(parent
);
444 child
= device_add_child(parent
, name
, unit
);
446 device_set_ivars(child
, sc
->fc
);
447 device_probe_and_attach(child
);
454 firewire_resume(device_t dev
)
456 struct firewire_softc
*sc
;
458 sc
= (struct firewire_softc
*)device_get_softc(dev
);
459 sc
->fc
->status
= FWBUSNOTREADY
;
461 bus_generic_resume(dev
);
470 firewire_detach(device_t dev
)
472 struct firewire_softc
*sc
;
473 struct csrdir
*csrd
, *next
;
474 struct fw_device
*fwdev
, *fwdev_next
;
477 sc
= (struct firewire_softc
*)device_get_softc(dev
);
478 if ((err
= fwdev_destroydev(sc
)) != 0)
481 if ((err
= bus_generic_detach(dev
)) != 0)
484 callout_stop(&sc
->fc
->timeout_callout
);
485 callout_stop(&sc
->fc
->bmr_callout
);
486 callout_stop(&sc
->fc
->retry_probe_callout
);
487 callout_stop(&sc
->fc
->busprobe_callout
);
489 /* XXX xfree_free and callout_stop on all xfers */
490 for (fwdev
= STAILQ_FIRST(&sc
->fc
->devices
); fwdev
!= NULL
;
491 fwdev
= fwdev_next
) {
492 fwdev_next
= STAILQ_NEXT(fwdev
, link
);
495 for (csrd
= SLIST_FIRST(&sc
->fc
->csrfree
); csrd
!= NULL
; csrd
= next
) {
496 next
= SLIST_NEXT(csrd
, link
);
499 kfree(sc
->fc
->topology_map
, M_FW
);
500 kfree(sc
->fc
->speed_map
, M_FW
);
501 kfree(sc
->fc
->crom_src_buf
, M_FW
);
506 firewire_shutdown( device_t dev
)
514 fw_xferq_drain(struct fw_xferq
*xferq
)
516 struct fw_xfer
*xfer
;
518 while ((xfer
= STAILQ_FIRST(&xferq
->q
)) != NULL
) {
519 STAILQ_REMOVE_HEAD(&xferq
->q
, link
);
522 xfer
->state
= FWXF_SENTERR
;
528 fw_drain_txq(struct firewire_comm
*fc
)
532 fw_xferq_drain(fc
->atq
);
533 fw_xferq_drain(fc
->ats
);
534 for(i
= 0; i
< fc
->nisodma
; i
++)
535 fw_xferq_drain(fc
->it
[i
]);
539 fw_reset_csr(struct firewire_comm
*fc
)
543 CSRARC(fc
, STATE_CLEAR
)
544 = 1 << 23 | 0 << 17 | 1 << 16 | 1 << 15 | 1 << 14 ;
545 CSRARC(fc
, STATE_SET
) = CSRARC(fc
, STATE_CLEAR
);
546 CSRARC(fc
, NODE_IDS
) = 0x3f;
548 CSRARC(fc
, TOPO_MAP
+ 8) = 0;
553 for(i
= 2; i
< 0x100/4 - 2 ; i
++){
554 CSRARC(fc
, SPED_MAP
+ i
* 4) = 0;
556 CSRARC(fc
, STATE_CLEAR
) = 1 << 23 | 0 << 17 | 1 << 16 | 1 << 15 | 1 << 14 ;
557 CSRARC(fc
, STATE_SET
) = CSRARC(fc
, STATE_CLEAR
);
558 CSRARC(fc
, RESET_START
) = 0;
559 CSRARC(fc
, SPLIT_TIMEOUT_HI
) = 0;
560 CSRARC(fc
, SPLIT_TIMEOUT_LO
) = 800 << 19;
561 CSRARC(fc
, CYCLE_TIME
) = 0x0;
562 CSRARC(fc
, BUS_TIME
) = 0x0;
563 CSRARC(fc
, BUS_MGR_ID
) = 0x3f;
564 CSRARC(fc
, BANDWIDTH_AV
) = 4915;
565 CSRARC(fc
, CHANNELS_AV_HI
) = 0xffffffff;
566 CSRARC(fc
, CHANNELS_AV_LO
) = 0xffffffff;
567 CSRARC(fc
, IP_CHANNELS
) = (1 << 31);
569 CSRARC(fc
, CONF_ROM
) = 0x04 << 24;
570 CSRARC(fc
, CONF_ROM
+ 4) = 0x31333934; /* means strings 1394 */
571 CSRARC(fc
, CONF_ROM
+ 8) = 1 << 31 | 1 << 30 | 1 << 29 |
572 1 << 28 | 0xff << 16 | 0x09 << 8;
573 CSRARC(fc
, CONF_ROM
+ 0xc) = 0;
575 /* DV depend CSRs see blue book */
576 CSRARC(fc
, oPCR
) &= ~DV_BROADCAST_ON
;
577 CSRARC(fc
, iPCR
) &= ~DV_BROADCAST_ON
;
579 CSRARC(fc
, STATE_CLEAR
) &= ~(1 << 23 | 1 << 15 | 1 << 14 );
580 CSRARC(fc
, STATE_SET
) = CSRARC(fc
, STATE_CLEAR
);
584 fw_init_crom(struct firewire_comm
*fc
)
586 struct crom_src
*src
;
588 fc
->crom_src_buf
= (struct crom_src_buf
*)
589 kmalloc(sizeof(struct crom_src_buf
), M_FW
, M_WAITOK
| M_ZERO
);
591 src
= &fc
->crom_src_buf
->src
;
592 bzero(src
, sizeof(struct crom_src
));
594 /* BUS info sample */
595 src
->hdr
.info_len
= 4;
597 src
->businfo
.bus_name
= CSR_BUS_NAME_IEEE1394
;
599 src
->businfo
.irmc
= 1;
600 src
->businfo
.cmc
= 1;
601 src
->businfo
.isc
= 1;
602 src
->businfo
.bmc
= 1;
603 src
->businfo
.pmc
= 0;
604 src
->businfo
.cyc_clk_acc
= 100;
605 src
->businfo
.max_rec
= fc
->maxrec
;
606 src
->businfo
.max_rom
= MAXROM_4
;
607 src
->businfo
.generation
= 1;
608 src
->businfo
.link_spd
= fc
->speed
;
610 src
->businfo
.eui64
.hi
= fc
->eui
.hi
;
611 src
->businfo
.eui64
.lo
= fc
->eui
.lo
;
613 STAILQ_INIT(&src
->chunk_list
);
616 fc
->crom_root
= &fc
->crom_src_buf
->root
;
620 fw_reset_crom(struct firewire_comm
*fc
)
622 struct crom_src_buf
*buf
;
623 struct crom_src
*src
;
624 struct crom_chunk
*root
;
626 if (fc
->crom_src_buf
== NULL
)
629 buf
= fc
->crom_src_buf
;
631 root
= fc
->crom_root
;
633 STAILQ_INIT(&src
->chunk_list
);
635 bzero(root
, sizeof(struct crom_chunk
));
636 crom_add_chunk(src
, NULL
, root
, 0);
637 crom_add_entry(root
, CSRKEY_NCAP
, 0x0083c0); /* XXX */
638 /* private company_id */
639 crom_add_entry(root
, CSRKEY_VENDOR
, CSRVAL_VENDOR_PRIVATE
);
641 crom_add_simple_text(src
, root
, &buf
->vendor
, "DragonFly Project");
642 crom_add_entry(root
, CSRKEY_HW
, __DragonFly_cc_version
);
644 crom_add_simple_text(src
, root
, &buf
->vendor
, "FreeBSD Project");
645 crom_add_entry(root
, CSRKEY_HW
, __FreeBSD_version
);
647 crom_add_simple_text(src
, root
, &buf
->hw
, hostname
);
651 * Called after bus reset.
654 fw_busreset(struct firewire_comm
*fc
)
656 struct firewire_dev_comm
*fdc
;
657 struct crom_src
*src
;
664 callout_stop(&fc
->bmr_callout
);
669 fc
->status
= FWBUSRESET
;
673 if (device_get_children(fc
->bdev
, &devlistp
, &devcnt
) == 0) {
674 for( i
= 0 ; i
< devcnt
; i
++)
675 if (device_get_state(devlistp
[i
]) >= DS_ATTACHED
) {
676 fdc
= device_get_softc(devlistp
[i
]);
677 if (fdc
->post_busreset
!= NULL
)
678 fdc
->post_busreset(fdc
);
680 kfree(devlistp
, M_TEMP
);
683 newrom
= kmalloc(CROMSIZE
, M_FW
, M_WAITOK
| M_ZERO
);
684 src
= &fc
->crom_src_buf
->src
;
685 crom_load(src
, (u_int32_t
*)newrom
, CROMSIZE
);
686 if (bcmp(newrom
, fc
->config_rom
, CROMSIZE
) != 0) {
687 /* bump generation and reload */
688 src
->businfo
.generation
++;
689 /* generation must be between 0x2 and 0xF */
690 if (src
->businfo
.generation
< 2)
691 src
->businfo
.generation
++;
692 crom_load(src
, (u_int32_t
*)newrom
, CROMSIZE
);
693 bcopy(newrom
, (void *)fc
->config_rom
, CROMSIZE
);
698 /* Call once after reboot */
700 fw_init(struct firewire_comm
*fc
)
705 struct fw_xfer
*xfer
;
709 fc
->max_asyretry
= FW_MAXASYRTY
;
726 STAILQ_INIT(&fc
->atq
->q
);
727 STAILQ_INIT(&fc
->ats
->q
);
729 for( i
= 0 ; i
< fc
->nisodma
; i
++ ){
730 fc
->it
[i
]->queued
= 0;
731 fc
->ir
[i
]->queued
= 0;
733 fc
->it
[i
]->start
= NULL
;
734 fc
->ir
[i
]->start
= NULL
;
736 fc
->it
[i
]->buf
= NULL
;
737 fc
->ir
[i
]->buf
= NULL
;
739 fc
->it
[i
]->flag
= FWXFERQ_STREAM
;
740 fc
->ir
[i
]->flag
= FWXFERQ_STREAM
;
742 STAILQ_INIT(&fc
->it
[i
]->q
);
743 STAILQ_INIT(&fc
->ir
[i
]->q
);
745 STAILQ_INIT(&fc
->it
[i
]->binds
);
746 STAILQ_INIT(&fc
->ir
[i
]->binds
);
749 fc
->arq
->maxq
= FWMAXQUEUE
;
750 fc
->ars
->maxq
= FWMAXQUEUE
;
751 fc
->atq
->maxq
= FWMAXQUEUE
;
752 fc
->ats
->maxq
= FWMAXQUEUE
;
754 for( i
= 0 ; i
< fc
->nisodma
; i
++){
755 fc
->ir
[i
]->maxq
= FWMAXQUEUE
;
756 fc
->it
[i
]->maxq
= FWMAXQUEUE
;
758 /* Initialize csr registers */
759 fc
->topology_map
= kmalloc(sizeof(struct fw_topology_map
),
760 M_FW
, M_WAITOK
| M_ZERO
);
761 fc
->speed_map
= kmalloc(sizeof(struct fw_speed_map
),
762 M_FW
, M_WAITOK
| M_ZERO
);
763 CSRARC(fc
, TOPO_MAP
) = 0x3f1 << 16;
764 CSRARC(fc
, TOPO_MAP
+ 4) = 1;
765 CSRARC(fc
, SPED_MAP
) = 0x3f1 << 16;
766 CSRARC(fc
, SPED_MAP
+ 4) = 1;
768 STAILQ_INIT(&fc
->devices
);
770 /* Initialize csr ROM work space */
771 SLIST_INIT(&fc
->ongocsr
);
772 SLIST_INIT(&fc
->csrfree
);
773 for( i
= 0 ; i
< FWMAXCSRDIR
; i
++){
774 csrd
= kmalloc(sizeof(struct csrdir
), M_FW
, M_WAITOK
);
775 SLIST_INSERT_HEAD(&fc
->csrfree
, csrd
, link
);
778 /* Initialize Async handlers */
779 STAILQ_INIT(&fc
->binds
);
780 for( i
= 0 ; i
< 0x40 ; i
++){
781 STAILQ_INIT(&fc
->tlabels
[i
]);
784 /* DV depend CSRs see blue book */
786 CSRARC(fc
, oMPR
) = 0x3fff0001; /* # output channel = 1 */
787 CSRARC(fc
, oPCR
) = 0x8000007a;
788 for(i
= 4 ; i
< 0x7c/4 ; i
+=4){
789 CSRARC(fc
, i
+ oPCR
) = 0x8000007a;
792 CSRARC(fc
, iMPR
) = 0x00ff0001; /* # input channel = 1 */
793 CSRARC(fc
, iPCR
) = 0x803f0000;
794 for(i
= 4 ; i
< 0x7c/4 ; i
+=4){
795 CSRARC(fc
, i
+ iPCR
) = 0x0;
799 fc
->crom_src_buf
= NULL
;
802 xfer
= fw_xfer_alloc();
803 if(xfer
== NULL
) return;
805 fwb
= kmalloc(sizeof (struct fw_bind
), M_FW
, M_WAITOK
);
806 xfer
->act
.hand
= fw_vmaccess
;
812 fwb
->addrlen
= 0xffffffff;
818 #define BIND_CMP(addr, fwb) (((addr) < (fwb)->start)?-1:\
819 ((fwb)->end < (addr))?1:0)
822 * To lookup binded process from IEEE1394 address.
825 fw_bindlookup(struct firewire_comm
*fc
, u_int16_t dest_hi
, u_int32_t dest_lo
)
830 addr
= ((u_int64_t
)dest_hi
<< 32) | dest_lo
;
831 STAILQ_FOREACH(tfw
, &fc
->binds
, fclist
)
832 if (tfw
->act_type
!= FWACT_NULL
&& BIND_CMP(addr
, tfw
) == 0)
838 * To bind IEEE1394 address block to process.
841 fw_bindadd(struct firewire_comm
*fc
, struct fw_bind
*fwb
)
843 struct fw_bind
*tfw
, *prev
= NULL
;
845 if (fwb
->start
> fwb
->end
) {
846 kprintf("%s: invalid range\n", __func__
);
850 STAILQ_FOREACH(tfw
, &fc
->binds
, fclist
) {
851 if (fwb
->end
< tfw
->start
)
856 STAILQ_INSERT_HEAD(&fc
->binds
, fwb
, fclist
);
859 if (prev
->end
< fwb
->start
) {
860 STAILQ_INSERT_AFTER(&fc
->binds
, prev
, fwb
, fclist
);
864 kprintf("%s: bind failed\n", __func__
);
868 if (fwb
->act_type
== FWACT_CH
)
869 STAILQ_INSERT_HEAD(&fc
->ir
[fwb
->sub
]->binds
, fwb
, chlist
);
874 * To free IEEE1394 address block.
877 fw_bindremove(struct firewire_comm
*fc
, struct fw_bind
*fwb
)
880 struct fw_xfer
*xfer
, *next
;
885 STAILQ_FOREACH(tfw
, &fc
->binds
, fclist
)
887 STAILQ_REMOVE(&fc
->binds
, fwb
, fw_bind
, fclist
);
891 kprintf("%s: no such bind\n", __func__
);
896 /* shall we do this? */
897 for (xfer
= STAILQ_FIRST(&fwb
->xferlist
); xfer
!= NULL
; xfer
= next
) {
898 next
= STAILQ_NEXT(xfer
, link
);
901 STAILQ_INIT(&fwb
->xferlist
);
909 * To free transaction label.
912 fw_tl_free(struct firewire_comm
*fc
, struct fw_xfer
*xfer
)
917 for( tl
= STAILQ_FIRST(&fc
->tlabels
[xfer
->tl
]); tl
!= NULL
;
918 tl
= STAILQ_NEXT(tl
, link
)){
919 if(tl
->xfer
== xfer
){
920 STAILQ_REMOVE(&fc
->tlabels
[xfer
->tl
], tl
, tlabel
, link
);
929 * To obtain XFER structure by transaction label.
931 static struct fw_xfer
*
932 fw_tl2xfer(struct firewire_comm
*fc
, int node
, int tlabel
)
934 struct fw_xfer
*xfer
;
939 for( tl
= STAILQ_FIRST(&fc
->tlabels
[tlabel
]); tl
!= NULL
;
940 tl
= STAILQ_NEXT(tl
, link
)){
941 if(tl
->xfer
->send
.hdr
.mode
.hdr
.dst
== node
){
944 if (firewire_debug
> 2)
945 kprintf("fw_tl2xfer: found tl=%d\n", tlabel
);
949 if (firewire_debug
> 1)
950 kprintf("fw_tl2xfer: not found tl=%d\n", tlabel
);
956 * To allocate IEEE1394 XFER structure.
959 fw_xfer_alloc(struct malloc_type
*type
)
961 struct fw_xfer
*xfer
;
963 xfer
= kmalloc(sizeof(struct fw_xfer
), type
, M_INTWAIT
| M_ZERO
);
970 fw_xfer_alloc_buf(struct malloc_type
*type
, int send_len
, int recv_len
)
972 struct fw_xfer
*xfer
;
974 xfer
= fw_xfer_alloc(type
);
975 xfer
->send
.pay_len
= send_len
;
976 xfer
->recv
.pay_len
= recv_len
;
980 xfer
->send
.payload
= kmalloc(send_len
, type
, M_INTWAIT
| M_ZERO
);
981 if (xfer
->send
.payload
== NULL
) {
987 xfer
->recv
.payload
= kmalloc(recv_len
, type
, M_INTWAIT
);
988 if (xfer
->recv
.payload
== NULL
) {
989 if (xfer
->send
.payload
!= NULL
)
990 kfree(xfer
->send
.payload
, type
);
999 * IEEE1394 XFER post process.
1002 fw_xfer_done(struct fw_xfer
*xfer
)
1004 if (xfer
->act
.hand
== NULL
) {
1005 kprintf("act.hand == NULL\n");
1009 if (xfer
->fc
== NULL
)
1010 panic("fw_xfer_done: why xfer->fc is NULL?");
1012 xfer
->act
.hand(xfer
);
1016 fw_xfer_unload(struct fw_xfer
* xfer
)
1018 if(xfer
== NULL
) return;
1019 if(xfer
->state
== FWXF_INQ
){
1020 kprintf("fw_xfer_free FWXF_INQ\n");
1022 STAILQ_REMOVE(&xfer
->q
->q
, xfer
, fw_xfer
, link
);
1026 if (xfer
->fc
!= NULL
) {
1028 if(xfer
->state
== FWXF_START
)
1030 * This could happen if:
1031 * 1. We call fwohci_arcv() before fwohci_txd().
1032 * 2. firewire_watch() is called.
1034 kprintf("fw_xfer_free FWXF_START\n");
1036 fw_tl_free(xfer
->fc
, xfer
);
1038 xfer
->state
= FWXF_INIT
;
1043 * To free IEEE1394 XFER structure.
1046 fw_xfer_free_buf( struct fw_xfer
* xfer
)
1049 kprintf("%s: xfer == NULL\n", __func__
);
1052 fw_xfer_unload(xfer
);
1053 if(xfer
->send
.payload
!= NULL
){
1054 kfree(xfer
->send
.payload
, xfer
->malloc
);
1056 if(xfer
->recv
.payload
!= NULL
){
1057 kfree(xfer
->recv
.payload
, xfer
->malloc
);
1059 kfree(xfer
, xfer
->malloc
);
1063 fw_xfer_free( struct fw_xfer
* xfer
)
1066 kprintf("%s: xfer == NULL\n", __func__
);
1069 fw_xfer_unload(xfer
);
1070 kfree(xfer
, xfer
->malloc
);
1074 fw_asy_callback_free(struct fw_xfer
*xfer
)
1077 kprintf("asyreq done state=%d resp=%d\n",
1078 xfer
->state
, xfer
->resp
);
1087 fw_phy_config(struct firewire_comm
*fc
, int root_node
, int gap_count
)
1089 struct fw_xfer
*xfer
;
1092 fc
->status
= FWBUSPHYCONF
;
1094 xfer
= fw_xfer_alloc(M_FWXFER
);
1098 xfer
->retry_req
= fw_asybusy
;
1099 xfer
->act
.hand
= fw_asy_callback_free
;
1101 fp
= &xfer
->send
.hdr
;
1104 fp
->mode
.ld
[1] |= (root_node
& 0x3f) << 24 | 1 << 23;
1106 fp
->mode
.ld
[1] |= 1 << 22 | (gap_count
& 0x3f) << 16;
1107 fp
->mode
.ld
[2] = ~fp
->mode
.ld
[1];
1108 /* XXX Dangerous, how to pass PHY packet to device driver */
1109 fp
->mode
.common
.tcode
|= FWTCODE_PHY
;
1112 kprintf("send phy_config root_node=%d gap_count=%d\n",
1113 root_node
, gap_count
);
1114 fw_asyreq(fc
, -1, xfer
);
1122 fw_print_sid(u_int32_t sid
)
1124 union fw_self_id
*s
;
1125 s
= (union fw_self_id
*) &sid
;
1126 kprintf("node:%d link:%d gap:%d spd:%d del:%d con:%d pwr:%d"
1127 " p0:%d p1:%d p2:%d i:%d m:%d\n",
1128 s
->p0
.phy_id
, s
->p0
.link_active
, s
->p0
.gap_count
,
1129 s
->p0
.phy_speed
, s
->p0
.phy_delay
, s
->p0
.contender
,
1130 s
->p0
.power_class
, s
->p0
.port0
, s
->p0
.port1
,
1131 s
->p0
.port2
, s
->p0
.initiated_reset
, s
->p0
.more_packets
);
1136 * To receive self ID.
1139 fw_sidrcv(struct firewire_comm
* fc
, u_int32_t
*sid
, u_int len
)
1142 union fw_self_id
*self_id
;
1143 u_int i
, j
, node
, c_port
= 0, i_branch
= 0;
1145 fc
->sid_cnt
= len
/(sizeof(u_int32_t
) * 2);
1146 fc
->status
= FWBUSINIT
;
1147 fc
->max_node
= fc
->nodeid
& 0x3f;
1148 CSRARC(fc
, NODE_IDS
) = ((u_int32_t
)fc
->nodeid
) << 16;
1149 fc
->status
= FWBUSCYMELECT
;
1150 fc
->topology_map
->crc_len
= 2;
1151 fc
->topology_map
->generation
++;
1152 fc
->topology_map
->self_id_count
= 0;
1153 fc
->topology_map
->node_count
= 0;
1154 fc
->speed_map
->generation
++;
1155 fc
->speed_map
->crc_len
= 1 + (64*64 + 3) / 4;
1156 self_id
= &fc
->topology_map
->self_id
[0];
1157 for(i
= 0; i
< fc
->sid_cnt
; i
++){
1158 if (sid
[1] != ~sid
[0]) {
1159 kprintf("fw_sidrcv: invalid self-id packet\n");
1163 *self_id
= *((union fw_self_id
*)sid
);
1164 fc
->topology_map
->crc_len
++;
1165 if(self_id
->p0
.sequel
== 0){
1166 fc
->topology_map
->node_count
++;
1169 fw_print_sid(sid
[0]);
1171 node
= self_id
->p0
.phy_id
;
1172 if(fc
->max_node
< node
){
1173 fc
->max_node
= self_id
->p0
.phy_id
;
1175 /* XXX I'm not sure this is the right speed_map */
1176 fc
->speed_map
->speed
[node
][node
]
1177 = self_id
->p0
.phy_speed
;
1178 for (j
= 0; j
< node
; j
++) {
1179 fc
->speed_map
->speed
[j
][node
]
1180 = fc
->speed_map
->speed
[node
][j
]
1181 = min(fc
->speed_map
->speed
[j
][j
],
1182 self_id
->p0
.phy_speed
);
1184 if ((fc
->irm
== -1 || self_id
->p0
.phy_id
> fc
->irm
) &&
1185 (self_id
->p0
.link_active
&& self_id
->p0
.contender
)) {
1186 fc
->irm
= self_id
->p0
.phy_id
;
1188 if(self_id
->p0
.port0
>= 0x2){
1191 if(self_id
->p0
.port1
>= 0x2){
1194 if(self_id
->p0
.port2
>= 0x2){
1199 i_branch
+= (c_port
- 2);
1203 fc
->topology_map
->self_id_count
++;
1205 device_printf(fc
->bdev
, "%d nodes", fc
->max_node
+ 1);
1207 fc
->topology_map
->crc
= fw_crc16(
1208 (u_int32_t
*)&fc
->topology_map
->generation
,
1209 fc
->topology_map
->crc_len
* 4);
1210 fc
->speed_map
->crc
= fw_crc16(
1211 (u_int32_t
*)&fc
->speed_map
->generation
,
1212 fc
->speed_map
->crc_len
* 4);
1213 /* byteswap and copy to CSR */
1214 p
= (u_int32_t
*)fc
->topology_map
;
1215 for (i
= 0; i
<= fc
->topology_map
->crc_len
; i
++)
1216 CSRARC(fc
, TOPO_MAP
+ i
* 4) = htonl(*p
++);
1217 p
= (u_int32_t
*)fc
->speed_map
;
1218 CSRARC(fc
, SPED_MAP
) = htonl(*p
++);
1219 CSRARC(fc
, SPED_MAP
+ 4) = htonl(*p
++);
1220 /* don't byte-swap u_int8_t array */
1221 bcopy(p
, &CSRARC(fc
, SPED_MAP
+ 8), (fc
->speed_map
->crc_len
- 1)*4);
1223 fc
->max_hop
= fc
->max_node
- i_branch
;
1224 kprintf(", maxhop <= %d", fc
->max_hop
);
1227 kprintf(", Not found IRM capable node");
1229 kprintf(", cable IRM = %d", fc
->irm
);
1230 if (fc
->irm
== fc
->nodeid
)
1235 if (try_bmr
&& (fc
->irm
!= -1) && (CSRARC(fc
, BUS_MGR_ID
) == 0x3f)) {
1236 if (fc
->irm
== fc
->nodeid
) {
1237 fc
->status
= FWBUSMGRDONE
;
1238 CSRARC(fc
, BUS_MGR_ID
) = fc
->set_bmr(fc
, fc
->irm
);
1241 fc
->status
= FWBUSMGRELECT
;
1242 callout_reset(&fc
->bmr_callout
, hz
/8,
1243 (void *)fw_try_bmr
, (void *)fc
);
1246 fc
->status
= FWBUSMGRDONE
;
1248 callout_reset(&fc
->busprobe_callout
, hz
/4,
1249 (void *)fw_bus_probe
, (void *)fc
);
1253 * To probe devices on the IEEE1394 bus.
1256 fw_bus_probe(struct firewire_comm
*fc
)
1258 struct fw_device
*fwdev
;
1261 fc
->status
= FWBUSEXPLORE
;
1262 fc
->retry_count
= 0;
1264 /* Invalidate all devices, just after bus reset. */
1265 STAILQ_FOREACH(fwdev
, &fc
->devices
, link
)
1266 if (fwdev
->status
!= FWDEVINVAL
) {
1267 fwdev
->status
= FWDEVINVAL
;
1272 fc
->ongoaddr
= CSRROMOFF
;
1274 fc
->ongoeui
.hi
= 0xffffffff; fc
->ongoeui
.lo
= 0xffffffff;
1280 * To collect device informations on the IEEE1394 bus.
1283 fw_bus_explore(struct firewire_comm
*fc
)
1286 struct fw_device
*fwdev
, *pfwdev
, *tfwdev
;
1288 struct fw_xfer
*xfer
;
1291 if(fc
->status
!= FWBUSEXPLORE
)
1295 if(fc
->ongonode
== fc
->nodeid
) fc
->ongonode
++;
1297 if(fc
->ongonode
> fc
->max_node
) goto done
;
1298 if(fc
->ongonode
>= 0x3f) goto done
;
1301 /* XXX we need to check phy_id first */
1302 if (!fc
->topology_map
->self_id
[fc
->ongonode
].p0
.link_active
) {
1304 kprintf("node%d: link down\n", fc
->ongonode
);
1309 if(fc
->ongoaddr
<= CSRROMOFF
&&
1310 fc
->ongoeui
.hi
== 0xffffffff &&
1311 fc
->ongoeui
.lo
== 0xffffffff ){
1312 fc
->ongoaddr
= CSRROMOFF
;
1313 addr
= 0xf0000000 | fc
->ongoaddr
;
1314 }else if(fc
->ongoeui
.hi
== 0xffffffff ){
1315 fc
->ongoaddr
= CSRROMOFF
+ 0xc;
1316 addr
= 0xf0000000 | fc
->ongoaddr
;
1317 }else if(fc
->ongoeui
.lo
== 0xffffffff ){
1318 fc
->ongoaddr
= CSRROMOFF
+ 0x10;
1319 addr
= 0xf0000000 | fc
->ongoaddr
;
1320 }else if(fc
->ongodev
== NULL
){
1321 STAILQ_FOREACH(fwdev
, &fc
->devices
, link
)
1322 if (FW_EUI64_EQUAL(fwdev
->eui
, fc
->ongoeui
))
1325 fwdev
->dst
= fc
->ongonode
;
1326 fwdev
->status
= FWDEVINIT
;
1327 fc
->ongodev
= fwdev
;
1328 fc
->ongoaddr
= CSRROMOFF
;
1329 addr
= 0xf0000000 | fc
->ongoaddr
;
1332 fwdev
= kmalloc(sizeof(struct fw_device
), M_FW
,
1336 fwdev
->dst
= fc
->ongonode
;
1337 fwdev
->eui
.hi
= fc
->ongoeui
.hi
; fwdev
->eui
.lo
= fc
->ongoeui
.lo
;
1338 fwdev
->status
= FWDEVINIT
;
1339 fwdev
->speed
= fc
->speed_map
->speed
[fc
->nodeid
][fc
->ongonode
];
1342 STAILQ_FOREACH(tfwdev
, &fc
->devices
, link
) {
1343 if (tfwdev
->eui
.hi
> fwdev
->eui
.hi
||
1344 (tfwdev
->eui
.hi
== fwdev
->eui
.hi
&&
1345 tfwdev
->eui
.lo
> fwdev
->eui
.lo
))
1350 STAILQ_INSERT_HEAD(&fc
->devices
, fwdev
, link
);
1352 STAILQ_INSERT_AFTER(&fc
->devices
, pfwdev
, fwdev
, link
);
1354 device_printf(fc
->bdev
, "New %s device ID:%08x%08x\n",
1355 linkspeed
[fwdev
->speed
],
1356 fc
->ongoeui
.hi
, fc
->ongoeui
.lo
);
1358 fc
->ongodev
= fwdev
;
1359 fc
->ongoaddr
= CSRROMOFF
;
1360 addr
= 0xf0000000 | fc
->ongoaddr
;
1362 addr
= 0xf0000000 | fc
->ongoaddr
;
1366 xfer
= asyreqq(fc
, FWSPD_S100
, 0, 0,
1367 ((FWLOCALBUS
| fc
->ongonode
) << 16) | 0xffff , addr
,
1368 fw_bus_explore_callback
);
1369 if(xfer
== NULL
) goto done
;
1371 xfer
= fw_xfer_alloc(M_FWXFER
);
1376 fp
= &xfer
->send
.hdr
;
1377 fp
->mode
.rreqq
.dest_hi
= 0xffff;
1378 fp
->mode
.rreqq
.tlrt
= 0;
1379 fp
->mode
.rreqq
.tcode
= FWTCODE_RREQQ
;
1380 fp
->mode
.rreqq
.pri
= 0;
1381 fp
->mode
.rreqq
.src
= 0;
1382 fp
->mode
.rreqq
.dst
= FWLOCALBUS
| fc
->ongonode
;
1383 fp
->mode
.rreqq
.dest_lo
= addr
;
1384 xfer
->act
.hand
= fw_bus_explore_callback
;
1387 kprintf("node%d: explore addr=0x%x\n",
1388 fc
->ongonode
, fc
->ongoaddr
);
1389 err
= fw_asyreq(fc
, -1, xfer
);
1391 fw_xfer_free( xfer
);
1397 /* fw_attach_devs */
1398 fc
->status
= FWBUSEXPDONE
;
1400 kprintf("bus_explore done\n");
1406 /* Portable Async. request read quad */
1408 asyreqq(struct firewire_comm
*fc
, u_int8_t spd
, u_int8_t tl
, u_int8_t rt
,
1409 u_int32_t addr_hi
, u_int32_t addr_lo
,
1410 void (*hand
) (struct fw_xfer
*))
1412 struct fw_xfer
*xfer
;
1416 xfer
= fw_xfer_alloc(M_FWXFER
);
1420 xfer
->send
.spd
= spd
; /* XXX:min(spd, fc->spd) */
1421 fp
= &xfer
->send
.hdr
;
1422 fp
->mode
.rreqq
.dest_hi
= addr_hi
& 0xffff;
1423 if(tl
& FWP_TL_VALID
){
1424 fp
->mode
.rreqq
.tlrt
= (tl
& 0x3f) << 2;
1426 fp
->mode
.rreqq
.tlrt
= 0;
1428 fp
->mode
.rreqq
.tlrt
|= rt
& 0x3;
1429 fp
->mode
.rreqq
.tcode
= FWTCODE_RREQQ
;
1430 fp
->mode
.rreqq
.pri
= 0;
1431 fp
->mode
.rreqq
.src
= 0;
1432 fp
->mode
.rreqq
.dst
= addr_hi
>> 16;
1433 fp
->mode
.rreqq
.dest_lo
= addr_lo
;
1434 xfer
->act
.hand
= hand
;
1436 err
= fw_asyreq(fc
, -1, xfer
);
1438 fw_xfer_free( xfer
);
1445 * Callback for the IEEE1394 bus information collection.
1448 fw_bus_explore_callback(struct fw_xfer
*xfer
)
1450 struct firewire_comm
*fc
;
1451 struct fw_pkt
*sfp
,*rfp
;
1452 struct csrhdr
*chdr
;
1453 struct csrdir
*csrd
;
1454 struct csrreg
*csrreg
;
1459 kprintf("xfer == NULL\n");
1465 kprintf("node%d: callback addr=0x%x\n",
1466 fc
->ongonode
, fc
->ongoaddr
);
1468 if(xfer
->resp
!= 0){
1469 kprintf("node%d: resp=%d addr=0x%x\n",
1470 fc
->ongonode
, xfer
->resp
, fc
->ongoaddr
);
1474 sfp
= &xfer
->send
.hdr
;
1475 rfp
= &xfer
->recv
.hdr
;
1480 qld
= (u_int32_t
*)xfer
->recv
.buf
;
1481 kprintf("len:%d\n", xfer
->recv
.len
);
1482 for( i
= 0 ; i
<= xfer
->recv
.len
&& i
< 32; i
+= 4){
1483 kprintf("0x%08x ", rfp
->mode
.ld
[i
/4]);
1484 if((i
% 16) == 15) kprintf("\n");
1486 if((i
% 16) != 15) kprintf("\n");
1489 if(fc
->ongodev
== NULL
){
1490 if(sfp
->mode
.rreqq
.dest_lo
== (0xf0000000 | CSRROMOFF
)){
1491 rfp
->mode
.rresq
.data
= ntohl(rfp
->mode
.rresq
.data
);
1492 chdr
= (struct csrhdr
*)(&rfp
->mode
.rresq
.data
);
1493 /* If CSR is minimal confinguration, more investgation is not needed. */
1494 if(chdr
->info_len
== 1){
1496 kprintf("node%d: minimal config\n",
1500 fc
->ongoaddr
= CSRROMOFF
+ 0xc;
1502 }else if(sfp
->mode
.rreqq
.dest_lo
== (0xf0000000 |(CSRROMOFF
+ 0xc))){
1503 fc
->ongoeui
.hi
= ntohl(rfp
->mode
.rresq
.data
);
1504 fc
->ongoaddr
= CSRROMOFF
+ 0x10;
1505 }else if(sfp
->mode
.rreqq
.dest_lo
== (0xf0000000 |(CSRROMOFF
+ 0x10))){
1506 fc
->ongoeui
.lo
= ntohl(rfp
->mode
.rresq
.data
);
1507 if (fc
->ongoeui
.hi
== 0 && fc
->ongoeui
.lo
== 0) {
1509 kprintf("node%d: eui64 is zero.\n",
1513 fc
->ongoaddr
= CSRROMOFF
;
1516 if (fc
->ongoaddr
== CSRROMOFF
&&
1517 fc
->ongodev
->csrrom
[0] == ntohl(rfp
->mode
.rresq
.data
)) {
1518 fc
->ongodev
->status
= FWDEVATTACHED
;
1521 fc
->ongodev
->csrrom
[(fc
->ongoaddr
- CSRROMOFF
)/4] = ntohl(rfp
->mode
.rresq
.data
);
1522 if(fc
->ongoaddr
> fc
->ongodev
->rommax
){
1523 fc
->ongodev
->rommax
= fc
->ongoaddr
;
1525 csrd
= SLIST_FIRST(&fc
->ongocsr
);
1526 if((csrd
= SLIST_FIRST(&fc
->ongocsr
)) == NULL
){
1527 chdr
= (struct csrhdr
*)(fc
->ongodev
->csrrom
);
1530 chdr
= (struct csrhdr
*)&fc
->ongodev
->csrrom
[(csrd
->off
- CSRROMOFF
)/4];
1533 if(fc
->ongoaddr
> (CSRROMOFF
+ 0x14) && fc
->ongoaddr
!= offset
){
1534 csrreg
= (struct csrreg
*)&fc
->ongodev
->csrrom
[(fc
->ongoaddr
- CSRROMOFF
)/4];
1535 if( csrreg
->key
== 0x81 || csrreg
->key
== 0xd1){
1536 csrd
= SLIST_FIRST(&fc
->csrfree
);
1540 csrd
->ongoaddr
= fc
->ongoaddr
;
1541 fc
->ongoaddr
+= csrreg
->val
* 4;
1542 csrd
->off
= fc
->ongoaddr
;
1543 SLIST_REMOVE_HEAD(&fc
->csrfree
, link
);
1544 SLIST_INSERT_HEAD(&fc
->ongocsr
, csrd
, link
);
1550 if(((fc
->ongoaddr
- offset
)/4 > chdr
->crc_len
) &&
1551 (fc
->ongodev
->rommax
< 0x414)){
1552 if(fc
->ongodev
->rommax
<= 0x414){
1553 csrd
= SLIST_FIRST(&fc
->csrfree
);
1554 if(csrd
== NULL
) goto nextnode
;
1555 csrd
->off
= fc
->ongoaddr
;
1556 csrd
->ongoaddr
= fc
->ongoaddr
;
1557 SLIST_REMOVE_HEAD(&fc
->csrfree
, link
);
1558 SLIST_INSERT_HEAD(&fc
->ongocsr
, csrd
, link
);
1563 while(((fc
->ongoaddr
- offset
)/4 > chdr
->crc_len
)){
1567 fc
->ongoaddr
= csrd
->ongoaddr
+ 4;
1568 SLIST_REMOVE_HEAD(&fc
->ongocsr
, link
);
1569 SLIST_INSERT_HEAD(&fc
->csrfree
, csrd
, link
);
1570 csrd
= SLIST_FIRST(&fc
->ongocsr
);
1571 if((csrd
= SLIST_FIRST(&fc
->ongocsr
)) == NULL
){
1572 chdr
= (struct csrhdr
*)(fc
->ongodev
->csrrom
);
1575 chdr
= (struct csrhdr
*)&(fc
->ongodev
->csrrom
[(csrd
->off
- CSRROMOFF
)/4]);
1579 if((fc
->ongoaddr
- CSRROMOFF
) > CSRROMSIZE
){
1584 fw_xfer_free( xfer
);
1589 if (fc
->ongodev
!= NULL
)
1590 fc
->ongodev
->status
= FWDEVINVAL
;
1592 fw_xfer_free( xfer
);
1594 /* housekeeping work space */
1595 fc
->ongoaddr
= CSRROMOFF
;
1597 fc
->ongoeui
.hi
= 0xffffffff; fc
->ongoeui
.lo
= 0xffffffff;
1598 while((csrd
= SLIST_FIRST(&fc
->ongocsr
)) != NULL
){
1599 SLIST_REMOVE_HEAD(&fc
->ongocsr
, link
);
1600 SLIST_INSERT_HEAD(&fc
->csrfree
, csrd
, link
);
1607 * To attach sub-devices layer onto IEEE1394 bus.
1610 fw_attach_dev(struct firewire_comm
*fc
)
1612 struct fw_device
*fwdev
, *next
;
1616 struct firewire_dev_comm
*fdc
;
1618 for (fwdev
= STAILQ_FIRST(&fc
->devices
); fwdev
!= NULL
; fwdev
= next
) {
1619 next
= STAILQ_NEXT(fwdev
, link
);
1620 if (fwdev
->status
== FWDEVINIT
) {
1621 fwdev
->status
= FWDEVATTACHED
;
1622 } else if (fwdev
->status
== FWDEVINVAL
) {
1624 if (fwdev
->rcnt
> hold_count
) {
1626 * Remove devices which have not been seen
1629 STAILQ_REMOVE(&fc
->devices
, fwdev
, fw_device
,
1636 err
= device_get_children(fc
->bdev
, &devlistp
, &devcnt
);
1639 for( i
= 0 ; i
< devcnt
; i
++){
1640 if (device_get_state(devlistp
[i
]) >= DS_ATTACHED
) {
1641 fdc
= device_get_softc(devlistp
[i
]);
1642 if (fdc
->post_explore
!= NULL
)
1643 fdc
->post_explore(fdc
);
1646 kfree(devlistp
, M_TEMP
);
1648 if (fc
->retry_count
> 0) {
1649 kprintf("probe failed for %d node\n", fc
->retry_count
);
1651 callout_reset(&fc
->retry_probe_callout
, hz
*2,
1652 (void *)fc
->ibr
, (void *)fc
);
1659 * To allocate uniq transaction label.
1662 fw_get_tlabel(struct firewire_comm
*fc
, struct fw_xfer
*xfer
)
1665 struct tlabel
*tl
, *tmptl
;
1666 static u_int32_t label
= 0;
1669 for( i
= 0 ; i
< 0x40 ; i
++){
1670 label
= (label
+ 1) & 0x3f;
1671 for(tmptl
= STAILQ_FIRST(&fc
->tlabels
[label
]);
1672 tmptl
!= NULL
; tmptl
= STAILQ_NEXT(tmptl
, link
)){
1673 if (tmptl
->xfer
->send
.hdr
.mode
.hdr
.dst
==
1674 xfer
->send
.hdr
.mode
.hdr
.dst
)
1678 tl
= kmalloc(sizeof(struct tlabel
), M_FW
, M_WAITOK
);
1680 STAILQ_INSERT_TAIL(&fc
->tlabels
[label
], tl
, link
);
1682 if (firewire_debug
> 1)
1683 kprintf("fw_get_tlabel: dst=%d tl=%d\n",
1684 xfer
->send
.hdr
.mode
.hdr
.dst
, label
);
1690 kprintf("fw_get_tlabel: no free tlabel\n");
1695 fw_rcv_copy(struct fw_rcv_buf
*rb
)
1699 struct tcode_info
*tinfo
;
1700 u_int res
, i
, len
, plen
;
1702 rb
->xfer
->recv
.spd
-= rb
->spd
;
1704 pkt
= (struct fw_pkt
*)rb
->vec
->iov_base
;
1705 tinfo
= &rb
->fc
->tcode
[pkt
->mode
.hdr
.tcode
];
1708 p
= (u_char
*)&rb
->xfer
->recv
.hdr
;
1709 bcopy(rb
->vec
->iov_base
, p
, tinfo
->hdr_len
);
1710 rb
->vec
->iov_base
= (uint8_t *)rb
->vec
->iov_base
+ tinfo
->hdr_len
;
1711 rb
->vec
->iov_len
-= tinfo
->hdr_len
;
1714 p
= (u_char
*)rb
->xfer
->recv
.payload
;
1715 res
= rb
->xfer
->recv
.pay_len
;
1717 /* special handling for RRESQ */
1718 if (pkt
->mode
.hdr
.tcode
== FWTCODE_RRESQ
&&
1719 p
!= NULL
&& res
>= sizeof(u_int32_t
)) {
1720 *(u_int32_t
*)p
= pkt
->mode
.rresq
.data
;
1721 rb
->xfer
->recv
.pay_len
= sizeof(u_int32_t
);
1725 if ((tinfo
->flag
& FWTI_BLOCK_ASY
) == 0)
1728 plen
= pkt
->mode
.rresb
.len
;
1730 for (i
= 0; i
< rb
->nvec
; i
++, rb
->vec
++) {
1731 len
= MIN(rb
->vec
->iov_len
, plen
);
1733 kprintf("rcv buffer(%d) is %d bytes short.\n",
1734 rb
->xfer
->recv
.pay_len
, len
- res
);
1737 bcopy(rb
->vec
->iov_base
, p
, len
);
1741 if (res
== 0 || plen
== 0)
1744 rb
->xfer
->recv
.pay_len
-= res
;
1749 * Generic packet receving process.
1752 fw_rcv(struct fw_rcv_buf
*rb
)
1754 struct fw_pkt
*fp
, *resfp
;
1755 struct fw_bind
*bind
;
1757 int i
, len
, oldstate
;
1762 qld
= (u_int32_t
*)buf
;
1763 kprintf("spd %d len:%d\n", spd
, len
);
1764 for( i
= 0 ; i
<= len
&& i
< 32; i
+= 4){
1765 kprintf("0x%08x ", ntohl(qld
[i
/4]));
1766 if((i
% 16) == 15) kprintf("\n");
1768 if((i
% 16) != 15) kprintf("\n");
1771 fp
= (struct fw_pkt
*)rb
->vec
[0].iov_base
;
1772 tcode
= fp
->mode
.common
.tcode
;
1778 rb
->xfer
= fw_tl2xfer(rb
->fc
, fp
->mode
.hdr
.src
,
1779 fp
->mode
.hdr
.tlrt
>> 2);
1780 if(rb
->xfer
== NULL
) {
1781 kprintf("fw_rcv: unknown response "
1782 "%s(%x) src=0x%x tl=0x%x rt=%d data=0x%x\n",
1783 tcode_str
[tcode
], tcode
,
1785 fp
->mode
.hdr
.tlrt
>> 2,
1786 fp
->mode
.hdr
.tlrt
& 3,
1787 fp
->mode
.rresq
.data
);
1789 kprintf("try ad-hoc work around!!\n");
1790 rb
->xfer
= fw_tl2xfer(rb
->fc
, fp
->mode
.hdr
.src
,
1791 (fp
->mode
.hdr
.tlrt
>> 2)^3);
1792 if (rb
->xfer
== NULL
) {
1793 kprintf("no use...\n");
1801 if (rb
->xfer
->recv
.hdr
.mode
.wres
.rtcode
!= RESP_CMP
)
1802 rb
->xfer
->resp
= EIO
;
1805 /* make sure the packet is drained in AT queue */
1806 oldstate
= rb
->xfer
->state
;
1807 rb
->xfer
->state
= FWXF_RCVD
;
1810 fw_xfer_done(rb
->xfer
);
1815 kprintf("not sent yet tl=%x\n", rb
->xfer
->tl
);
1819 kprintf("unexpected state %d\n", rb
->xfer
->state
);
1827 bind
= fw_bindlookup(rb
->fc
, fp
->mode
.rreqq
.dest_hi
,
1828 fp
->mode
.rreqq
.dest_lo
);
1830 kprintf("Unknown service addr 0x%04x:0x%08x %s(%x)"
1831 " src=0x%x data=%x\n",
1832 fp
->mode
.wreqq
.dest_hi
, fp
->mode
.wreqq
.dest_lo
,
1833 tcode_str
[tcode
], tcode
,
1834 fp
->mode
.hdr
.src
, ntohl(fp
->mode
.wreqq
.data
));
1835 if (rb
->fc
->status
== FWBUSRESET
) {
1836 kprintf("fw_rcv: cannot respond(bus reset)!\n");
1839 rb
->xfer
= fw_xfer_alloc(M_FWXFER
);
1840 if(rb
->xfer
== NULL
){
1843 rb
->xfer
->send
.spd
= rb
->spd
;
1844 rb
->xfer
->send
.pay_len
= 0;
1845 resfp
= &rb
->xfer
->send
.hdr
;
1849 resfp
->mode
.hdr
.tcode
= FWTCODE_WRES
;
1852 resfp
->mode
.hdr
.tcode
= FWTCODE_RRESQ
;
1855 resfp
->mode
.hdr
.tcode
= FWTCODE_RRESB
;
1858 resfp
->mode
.hdr
.tcode
= FWTCODE_LRES
;
1861 resfp
->mode
.hdr
.dst
= fp
->mode
.hdr
.src
;
1862 resfp
->mode
.hdr
.tlrt
= fp
->mode
.hdr
.tlrt
;
1863 resfp
->mode
.hdr
.pri
= fp
->mode
.hdr
.pri
;
1864 resfp
->mode
.rresb
.rtcode
= RESP_ADDRESS_ERROR
;
1865 resfp
->mode
.rresb
.extcode
= 0;
1866 resfp
->mode
.rresb
.len
= 0;
1868 rb->xfer->act.hand = fw_asy_callback;
1870 rb
->xfer
->act
.hand
= fw_xfer_free
;
1871 if(fw_asyreq(rb
->fc
, -1, rb
->xfer
)){
1872 fw_xfer_free(rb
->xfer
);
1878 for (i
= 0; i
< rb
->nvec
; i
++)
1879 len
+= rb
->vec
[i
].iov_len
;
1880 switch(bind
->act_type
){
1883 rb
->xfer
= STAILQ_FIRST(&bind
->xferlist
);
1884 if (rb
->xfer
== NULL
) {
1885 kprintf("Discard a packet for this bind.\n");
1889 STAILQ_REMOVE_HEAD(&bind
->xferlist
, link
);
1892 rb
->xfer
->act
.hand(rb
->xfer
);
1896 if(rb
->fc
->ir
[bind
->sub
]->queued
>=
1897 rb
->fc
->ir
[bind
->sub
]->maxq
){
1898 device_printf(rb
->fc
->bdev
,
1899 "Discard a packet %x %d\n",
1901 rb
->fc
->ir
[bind
->sub
]->queued
);
1905 rb
->xfer
= STAILQ_FIRST(&bind
->xferlist
);
1906 if (rb
->xfer
== NULL
) {
1907 kprintf("Discard packet for this bind\n");
1910 STAILQ_REMOVE_HEAD(&bind
->xferlist
, link
);
1914 rb
->fc
->ir
[bind
->sub
]->queued
++;
1915 STAILQ_INSERT_TAIL(&rb
->fc
->ir
[bind
->sub
]->q
,
1919 wakeup((caddr_t
)rb
->fc
->ir
[bind
->sub
]);
1928 #if 0 /* shouldn't happen ?? or for GASP */
1929 case FWTCODE_STREAM
:
1931 struct fw_xferq
*xferq
;
1933 xferq
= rb
->fc
->ir
[sub
];
1935 kprintf("stream rcv dma %d len %d off %d spd %d\n",
1936 sub
, len
, off
, spd
);
1938 if(xferq
->queued
>= xferq
->maxq
) {
1939 kprintf("receive queue is full\n");
1942 /* XXX get xfer from xfer queue, we don't need copy for
1944 rb
->xfer
= fw_xfer_alloc_buf(M_FWXFER
, 0, /* XXX */
1946 if (rb
->xfer
== NULL
) goto err
;
1950 STAILQ_INSERT_TAIL(&xferq
->q
, rb
->xfer
, link
);
1952 sc
= device_get_softc(rb
->fc
->bdev
);
1953 #if defined(__DragonFly__) || __FreeBSD_version < 500000
1954 if (&xferq
->rsel
.si_pid
!= 0)
1956 if (SEL_WAITING(&xferq
->rsel
))
1958 selwakeuppri(&xferq
->rsel
, FWPRI
);
1959 if (xferq
->flag
& FWXFERQ_WAKEUP
) {
1960 xferq
->flag
&= ~FWXFERQ_WAKEUP
;
1961 wakeup((caddr_t
)xferq
);
1963 if (xferq
->flag
& FWXFERQ_HANDLER
) {
1971 kprintf("fw_rcv: unknow tcode %d\n", tcode
);
1979 * Post process for Bus Manager election process.
1982 fw_try_bmr_callback(struct fw_xfer
*xfer
)
1984 struct firewire_comm
*fc
;
1990 if (xfer
->resp
!= 0)
1992 if (xfer
->recv
.payload
== NULL
)
1994 if (xfer
->recv
.hdr
.mode
.lres
.rtcode
!= FWRCODE_COMPLETE
)
1997 bmr
= ntohl(xfer
->recv
.payload
[0]);
2001 CSRARC(fc
, BUS_MGR_ID
) = fc
->set_bmr(fc
, bmr
& 0x3f);
2002 fw_xfer_free_buf(xfer
);
2007 device_printf(fc
->bdev
, "bus manager election failed\n");
2008 fw_xfer_free_buf(xfer
);
2013 * To candidate Bus Manager election process.
2016 fw_try_bmr(void *arg
)
2018 struct fw_xfer
*xfer
;
2019 struct firewire_comm
*fc
= (struct firewire_comm
*)arg
;
2023 xfer
= fw_xfer_alloc_buf(M_FWXFER
, 8, 4);
2028 fc
->status
= FWBUSMGRELECT
;
2030 fp
= &xfer
->send
.hdr
;
2031 fp
->mode
.lreq
.dest_hi
= 0xffff;
2032 fp
->mode
.lreq
.tlrt
= 0;
2033 fp
->mode
.lreq
.tcode
= FWTCODE_LREQ
;
2034 fp
->mode
.lreq
.pri
= 0;
2035 fp
->mode
.lreq
.src
= 0;
2036 fp
->mode
.lreq
.len
= 8;
2037 fp
->mode
.lreq
.extcode
= EXTCODE_CMP_SWAP
;
2038 fp
->mode
.lreq
.dst
= FWLOCALBUS
| fc
->irm
;
2039 fp
->mode
.lreq
.dest_lo
= 0xf0000000 | BUS_MGR_ID
;
2040 xfer
->send
.payload
[0] = htonl(0x3f);
2041 xfer
->send
.payload
[1] = htonl(fc
->nodeid
);
2042 xfer
->act
.hand
= fw_try_bmr_callback
;
2044 err
= fw_asyreq(fc
, -1, xfer
);
2046 fw_xfer_free_buf(xfer
);
2054 * Software implementation for physical memory block access.
2055 * XXX:Too slow, usef for debug purpose only.
2058 fw_vmaccess(struct fw_xfer
*xfer
){
2059 struct fw_pkt
*rfp
, *sfp
= NULL
;
2060 u_int32_t
*ld
= (u_int32_t
*)xfer
->recv
.buf
;
2062 kprintf("vmaccess spd:%2x len:%03x data:%08x %08x %08x %08x\n",
2063 xfer
->spd
, xfer
->recv
.len
, ntohl(ld
[0]), ntohl(ld
[1]), ntohl(ld
[2]), ntohl(ld
[3]));
2064 kprintf("vmaccess data:%08x %08x %08x %08x\n", ntohl(ld
[4]), ntohl(ld
[5]), ntohl(ld
[6]), ntohl(ld
[7]));
2065 if(xfer
->resp
!= 0){
2066 fw_xfer_free( xfer
);
2069 if(xfer
->recv
.buf
== NULL
){
2070 fw_xfer_free( xfer
);
2073 rfp
= (struct fw_pkt
*)xfer
->recv
.buf
;
2074 switch(rfp
->mode
.hdr
.tcode
){
2075 /* XXX need fix for 64bit arch */
2077 xfer
->send
.buf
= kmalloc(12, M_FW
, M_WAITOK
);
2078 xfer
->send
.len
= 12;
2079 sfp
= (struct fw_pkt
*)xfer
->send
.buf
;
2080 bcopy(rfp
->mode
.wreqb
.payload
,
2081 (caddr_t
)ntohl(rfp
->mode
.wreqb
.dest_lo
), ntohs(rfp
->mode
.wreqb
.len
));
2082 sfp
->mode
.wres
.tcode
= FWTCODE_WRES
;
2083 sfp
->mode
.wres
.rtcode
= 0;
2086 xfer
->send
.buf
= kmalloc(12, M_FW
, M_WAITOK
);
2087 xfer
->send
.len
= 12;
2088 sfp
->mode
.wres
.tcode
= FWTCODE_WRES
;
2089 *((u_int32_t
*)(ntohl(rfp
->mode
.wreqb
.dest_lo
))) = rfp
->mode
.wreqq
.data
;
2090 sfp
->mode
.wres
.rtcode
= 0;
2093 xfer
->send
.buf
= kmalloc(16 + rfp
->mode
.rreqb
.len
, M_FW
, M_WAITOK
);
2094 xfer
->send
.len
= 16 + ntohs(rfp
->mode
.rreqb
.len
);
2095 sfp
= (struct fw_pkt
*)xfer
->send
.buf
;
2096 bcopy((caddr_t
)ntohl(rfp
->mode
.rreqb
.dest_lo
),
2097 sfp
->mode
.rresb
.payload
, (u_int16_t
)ntohs(rfp
->mode
.rreqb
.len
));
2098 sfp
->mode
.rresb
.tcode
= FWTCODE_RRESB
;
2099 sfp
->mode
.rresb
.len
= rfp
->mode
.rreqb
.len
;
2100 sfp
->mode
.rresb
.rtcode
= 0;
2101 sfp
->mode
.rresb
.extcode
= 0;
2104 xfer
->send
.buf
= kmalloc(16, M_FW
, M_WAITOK
);
2105 xfer
->send
.len
= 16;
2106 sfp
= (struct fw_pkt
*)xfer
->send
.buf
;
2107 sfp
->mode
.rresq
.data
= *(u_int32_t
*)(ntohl(rfp
->mode
.rreqq
.dest_lo
));
2108 sfp
->mode
.wres
.tcode
= FWTCODE_RRESQ
;
2109 sfp
->mode
.rresb
.rtcode
= 0;
2112 fw_xfer_free( xfer
);
2115 sfp
->mode
.hdr
.dst
= rfp
->mode
.hdr
.src
;
2116 xfer
->dst
= ntohs(rfp
->mode
.hdr
.src
);
2117 xfer
->act
.hand
= fw_xfer_free
;
2118 xfer
->retry_req
= fw_asybusy
;
2120 sfp
->mode
.hdr
.tlrt
= rfp
->mode
.hdr
.tlrt
;
2121 sfp
->mode
.hdr
.pri
= 0;
2123 fw_asyreq(xfer
->fc
, -1, xfer
);
2130 * CRC16 check-sum for IEEE1394 register blocks.
2133 fw_crc16(u_int32_t
*ptr
, u_int32_t len
){
2134 u_int32_t i
, sum
, crc
= 0;
2136 len
= (len
+ 3) & ~3;
2137 for(i
= 0 ; i
< len
; i
+= 4){
2138 for( shift
= 28 ; shift
>= 0 ; shift
-= 4){
2139 sum
= ((crc
>> 12) ^ (ptr
[i
/4] >> shift
)) & 0xf;
2140 crc
= (crc
<< 4) ^ ( sum
<< 12 ) ^ ( sum
<< 5) ^ sum
;
2144 return((u_int16_t
) crc
);
2148 fw_bmr(struct firewire_comm
*fc
)
2150 struct fw_device fwdev
;
2151 union fw_self_id
*self_id
;
2155 /* Check to see if the current root node is cycle master capable */
2156 self_id
= &fc
->topology_map
->self_id
[fc
->max_node
];
2157 if (fc
->max_node
> 0) {
2158 /* XXX check cmc bit of businfo block rather than contender */
2159 if (self_id
->p0
.link_active
&& self_id
->p0
.contender
)
2160 cmstr
= fc
->max_node
;
2162 device_printf(fc
->bdev
,
2163 "root node is not cycle master capable\n");
2164 /* XXX shall we be the cycle master? */
2166 /* XXX need bus reset */
2171 device_printf(fc
->bdev
, "bus manager %d ", CSRARC(fc
, BUS_MGR_ID
));
2172 if(CSRARC(fc
, BUS_MGR_ID
) != fc
->nodeid
) {
2173 /* We are not the bus manager */
2179 /* Optimize gapcount */
2180 if(fc
->max_hop
<= MAX_GAPHOP
)
2181 fw_phy_config(fc
, cmstr
, gap_cnt
[fc
->max_hop
]);
2182 /* If we are the cycle master, nothing to do */
2183 if (cmstr
== fc
->nodeid
|| cmstr
== -1)
2185 /* Bus probe has not finished, make dummy fwdev for cmstr */
2186 bzero(&fwdev
, sizeof(fwdev
));
2190 fwdev
.maxrec
= 8; /* 512 */
2191 fwdev
.status
= FWDEVINIT
;
2192 /* Set cmstr bit on the cycle master */
2193 quad
= htonl(1 << 8);
2194 fwmem_write_quad(&fwdev
, NULL
, 0/*spd*/,
2195 0xffff, 0xf0000000 | STATE_SET
, &quad
, fw_asy_callback_free
);
2201 fw_modevent(module_t mode
, int type
, void *data
)
2204 #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2205 static eventhandler_tag fwdev_ehtag
= NULL
;
2210 #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2211 fwdev_ehtag
= EVENTHANDLER_REGISTER(dev_clone
,
2212 fwdev_clone
, 0, 1000);
2216 #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
2217 if (fwdev_ehtag
!= NULL
)
2218 EVENTHANDLER_DEREGISTER(dev_clone
, fwdev_ehtag
);
2228 * This causes the firewire identify to be called for any attached fwohci
2229 * device in the system.
2231 DECLARE_DUMMY_MODULE(firewire
);
2232 DRIVER_MODULE(firewire
,fwohci
,firewire_driver
,firewire_devclass
,fw_modevent
,0);
2233 MODULE_VERSION(firewire
, 1);