Lines Matching refs:fc

197 	struct firewire_comm *fc = device_private(parent);  in firewireattach()  local
204 fc->bdev = sc->dev = self; in firewireattach()
205 sc->fc = fc; in firewireattach()
208 fc->status = FWBUSNOTREADY; in firewireattach()
210 if (fc->nisodma > FWMAXNDMA) in firewireattach()
211 fc->nisodma = FWMAXNDMA; in firewireattach()
213 fc->crom_src_buf = malloc(sizeof(struct crom_src_buf), in firewireattach()
215 fc->topology_map =malloc(sizeof(struct fw_topology_map), in firewireattach()
217 fc->speed_map = malloc(sizeof(struct fw_speed_map), in firewireattach()
220 mutex_init(&fc->tlabel_lock, MUTEX_DEFAULT, IPL_VM); in firewireattach()
221 mutex_init(&fc->fc_mtx, MUTEX_DEFAULT, IPL_VM); in firewireattach()
222 mutex_init(&fc->wait_lock, MUTEX_DEFAULT, IPL_VM); in firewireattach()
223 cv_init(&fc->fc_cv, "ieee1394"); in firewireattach()
225 callout_init(&fc->timeout_callout, CALLOUT_MPSAFE); in firewireattach()
226 callout_setfunc(&fc->timeout_callout, firewire_watchdog, fc); in firewireattach()
227 callout_init(&fc->bmr_callout, CALLOUT_MPSAFE); in firewireattach()
228 callout_setfunc(&fc->bmr_callout, fw_try_bmr, fc); in firewireattach()
229 callout_init(&fc->busprobe_callout, CALLOUT_MPSAFE); in firewireattach()
230 callout_setfunc(&fc->busprobe_callout, (void *)fw_bus_probe, fc); in firewireattach()
232 callout_schedule(&fc->timeout_callout, hz); in firewireattach()
239 fc, &fc->probe_thread, "fw%dprobe", device_unit(fc->bdev))) { in firewireattach()
247 faa.fc = fc; in firewireattach()
256 fw_busreset(fc, FWBUSNOTREADY); in firewireattach()
257 fc->ibr(fc); in firewireattach()
269 struct firewire_comm *fc; in firewiredetach() local
274 fc = sc->fc; in firewiredetach()
275 mutex_enter(&fc->wait_lock); in firewiredetach()
276 fc->status = FWBUSDETACH; in firewiredetach()
277 cv_signal(&fc->fc_cv); in firewiredetach()
278 while (fc->status != FWBUSDETACHOK) { in firewiredetach()
279 err = cv_timedwait_sig(&fc->fc_cv, &fc->wait_lock, hz * 60); in firewiredetach()
286 mutex_exit(&fc->wait_lock); in firewiredetach()
296 callout_stop(&fc->timeout_callout); in firewiredetach()
297 callout_stop(&fc->bmr_callout); in firewiredetach()
298 callout_stop(&fc->busprobe_callout); in firewiredetach()
301 for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; in firewiredetach()
306 free(fc->topology_map, M_FW); in firewiredetach()
307 free(fc->speed_map, M_FW); in firewiredetach()
308 free(fc->crom_src_buf, M_FW); in firewiredetach()
310 cv_destroy(&fc->fc_cv); in firewiredetach()
311 mutex_destroy(&fc->wait_lock); in firewiredetach()
312 mutex_destroy(&fc->fc_mtx); in firewiredetach()
313 mutex_destroy(&fc->tlabel_lock); in firewiredetach()
329 firewire_resume(struct firewire_comm *fc) in firewire_resume() argument
332 fc->status = FWBUSNOTREADY; in firewire_resume()
341 fw_noderesolve_nodeid(struct firewire_comm *fc, int dst) in fw_noderesolve_nodeid() argument
345 mutex_enter(&fc->fc_mtx); in fw_noderesolve_nodeid()
346 STAILQ_FOREACH(fwdev, &fc->devices, link) in fw_noderesolve_nodeid()
349 mutex_exit(&fc->fc_mtx); in fw_noderesolve_nodeid()
358 fw_noderesolve_eui64(struct firewire_comm *fc, struct fw_eui64 *eui) in fw_noderesolve_eui64() argument
362 mutex_enter(&fc->fc_mtx); in fw_noderesolve_eui64()
363 STAILQ_FOREACH(fwdev, &fc->devices, link) in fw_noderesolve_eui64()
366 mutex_exit(&fc->fc_mtx); in fw_noderesolve_eui64()
379 fw_asyreq(struct firewire_comm *fc, int sub, struct fw_xfer *xfer) in fw_asyreq() argument
390 aprint_error_dev(fc->bdev, "hand == NULL\n"); in fw_asyreq()
396 info = &fc->tcode[tcode]; in fw_asyreq()
398 aprint_error_dev(fc->bdev, "invalid tcode=%x\n", tcode); in fw_asyreq()
403 if ((fc->status < FWBUSEXPLORE) && in fw_asyreq()
413 xferq = fc->atq; in fw_asyreq()
415 xferq = fc->ats; in fw_asyreq()
417 if (xfer->send.pay_len > MAXREC(fc->maxrec)) { in fw_asyreq()
418 aprint_error_dev(fc->bdev, "send.pay_len > maxrec\n"); in fw_asyreq()
428 aprint_error_dev(fc->bdev, in fw_asyreq()
435 aprint_error_dev(fc->bdev, "xferq->start == NULL\n"); in fw_asyreq()
439 aprint_error_dev(fc->bdev, "Discard a packet (queued=%d)\n", in fw_asyreq()
446 if (fw_get_tlabel(fc, xfer) < 0) in fw_asyreq()
450 xfer->fc = fc; in fw_asyreq()
464 mutex_enter(&xfer->fc->wait_lock); in fw_xferwake()
467 mutex_exit(&xfer->fc->wait_lock); in fw_xferwake()
475 struct firewire_comm *fc = xfer->fc; in fw_xferwait() local
478 mutex_enter(&fc->wait_lock); in fw_xferwait()
480 err = cv_wait_sig(&xfer->cv, &fc->wait_lock); in fw_xferwait()
481 mutex_exit(&fc->wait_lock); in fw_xferwait()
487 fw_drain_txq(struct firewire_comm *fc) in fw_drain_txq() argument
495 mutex_enter(&fc->atq->q_mtx); in fw_drain_txq()
496 fw_xferq_drain(fc->atq); in fw_drain_txq()
497 mutex_exit(&fc->atq->q_mtx); in fw_drain_txq()
498 mutex_enter(&fc->ats->q_mtx); in fw_drain_txq()
499 fw_xferq_drain(fc->ats); in fw_drain_txq()
500 mutex_exit(&fc->ats->q_mtx); in fw_drain_txq()
501 for (i = 0; i < fc->nisodma; i++) in fw_drain_txq()
502 fw_xferq_drain(fc->it[i]); in fw_drain_txq()
504 mutex_enter(&fc->tlabel_lock); in fw_drain_txq()
506 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) { in fw_drain_txq()
510 STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel); in fw_drain_txq()
513 mutex_exit(&fc->tlabel_lock); in fw_drain_txq()
523 fw_busreset(struct firewire_comm *fc, uint32_t new_status) in fw_busreset() argument
525 struct firewire_softc *sc = device_private(fc->bdev); in fw_busreset()
531 if (fc->status == FWBUSMGRELECT) in fw_busreset()
532 callout_stop(&fc->bmr_callout); in fw_busreset()
534 fc->status = new_status; in fw_busreset()
535 fw_reset_csr(fc); in fw_busreset()
537 if (fc->status == FWBUSNOTREADY) in fw_busreset()
538 fw_init_crom(fc); in fw_busreset()
540 fw_reset_crom(fc); in fw_busreset()
565 src = &fc->crom_src_buf->src; in fw_busreset()
567 if (memcmp(newrom, fc->config_rom, CROMSIZE) != 0) { in fw_busreset()
570 memcpy((void *)fc->config_rom, newrom, CROMSIZE); in fw_busreset()
577 fw_init(struct firewire_comm *fc) in fw_init() argument
581 fc->arq->queued = 0; in fw_init()
582 fc->ars->queued = 0; in fw_init()
583 fc->atq->queued = 0; in fw_init()
584 fc->ats->queued = 0; in fw_init()
586 fc->arq->buf = NULL; in fw_init()
587 fc->ars->buf = NULL; in fw_init()
588 fc->atq->buf = NULL; in fw_init()
589 fc->ats->buf = NULL; in fw_init()
591 fc->arq->flag = 0; in fw_init()
592 fc->ars->flag = 0; in fw_init()
593 fc->atq->flag = 0; in fw_init()
594 fc->ats->flag = 0; in fw_init()
596 STAILQ_INIT(&fc->atq->q); in fw_init()
597 STAILQ_INIT(&fc->ats->q); in fw_init()
598 mutex_init(&fc->arq->q_mtx, MUTEX_DEFAULT, IPL_VM); in fw_init()
599 mutex_init(&fc->ars->q_mtx, MUTEX_DEFAULT, IPL_VM); in fw_init()
600 mutex_init(&fc->atq->q_mtx, MUTEX_DEFAULT, IPL_VM); in fw_init()
601 mutex_init(&fc->ats->q_mtx, MUTEX_DEFAULT, IPL_VM); in fw_init()
603 fc->arq->maxq = FWMAXQUEUE; in fw_init()
604 fc->ars->maxq = FWMAXQUEUE; in fw_init()
605 fc->atq->maxq = FWMAXQUEUE; in fw_init()
606 fc->ats->maxq = FWMAXQUEUE; in fw_init()
608 CSRARC(fc, TOPO_MAP) = 0x3f1 << 16; in fw_init()
609 CSRARC(fc, TOPO_MAP + 4) = 1; in fw_init()
610 CSRARC(fc, SPED_MAP) = 0x3f1 << 16; in fw_init()
611 CSRARC(fc, SPED_MAP + 4) = 1; in fw_init()
613 STAILQ_INIT(&fc->devices); in fw_init()
616 STAILQ_INIT(&fc->binds); in fw_init()
618 STAILQ_INIT(&fc->tlabels[i]); in fw_init()
622 CSRARC(fc, oMPR) = 0x3fff0001; /* # output channel = 1 */ in fw_init()
623 CSRARC(fc, oPCR) = 0x8000007a; in fw_init()
625 CSRARC(fc, i + oPCR) = 0x8000007a; in fw_init()
627 CSRARC(fc, iMPR) = 0x00ff0001; /* # input channel = 1 */ in fw_init()
628 CSRARC(fc, iPCR) = 0x803f0000; in fw_init()
630 CSRARC(fc, i + iPCR) = 0x0; in fw_init()
633 fc->crom_src_buf = NULL; in fw_init()
641 fw_init_isodma(struct firewire_comm *fc) in fw_init_isodma() argument
645 for (i = 0; i < fc->nisodma; i++) { in fw_init_isodma()
646 fc->it[i]->queued = 0; in fw_init_isodma()
647 fc->ir[i]->queued = 0; in fw_init_isodma()
649 fc->it[i]->start = NULL; in fw_init_isodma()
650 fc->ir[i]->start = NULL; in fw_init_isodma()
652 fc->it[i]->buf = NULL; in fw_init_isodma()
653 fc->ir[i]->buf = NULL; in fw_init_isodma()
655 fc->it[i]->flag = FWXFERQ_STREAM; in fw_init_isodma()
656 fc->ir[i]->flag = FWXFERQ_STREAM; in fw_init_isodma()
658 STAILQ_INIT(&fc->it[i]->q); in fw_init_isodma()
659 STAILQ_INIT(&fc->ir[i]->q); in fw_init_isodma()
661 fc->ir[i]->maxq = FWMAXQUEUE; in fw_init_isodma()
662 fc->it[i]->maxq = FWMAXQUEUE; in fw_init_isodma()
664 cv_init(&fc->ir[i]->cv, "fw_read"); in fw_init_isodma()
665 cv_init(&fc->it[i]->cv, "fw_write"); in fw_init_isodma()
670 fw_destroy_isodma(struct firewire_comm *fc) in fw_destroy_isodma() argument
674 for (i = 0; i < fc->nisodma; i++) { in fw_destroy_isodma()
675 cv_destroy(&fc->ir[i]->cv); in fw_destroy_isodma()
676 cv_destroy(&fc->it[i]->cv); in fw_destroy_isodma()
681 fw_destroy(struct firewire_comm *fc) in fw_destroy() argument
683 mutex_destroy(&fc->arq->q_mtx); in fw_destroy()
684 mutex_destroy(&fc->ars->q_mtx); in fw_destroy()
685 mutex_destroy(&fc->atq->q_mtx); in fw_destroy()
686 mutex_destroy(&fc->ats->q_mtx); in fw_destroy()
696 fw_bindlookup(struct firewire_comm *fc, uint16_t dest_hi, uint32_t dest_lo) in fw_bindlookup() argument
702 mutex_enter(&fc->fc_mtx); in fw_bindlookup()
703 STAILQ_FOREACH(tfw, &fc->binds, fclist) in fw_bindlookup()
708 mutex_exit(&fc->fc_mtx); in fw_bindlookup()
716 fw_bindadd(struct firewire_comm *fc, struct fw_bind *fwb) in fw_bindadd() argument
722 aprint_error_dev(fc->bdev, "invalid range\n"); in fw_bindadd()
726 mutex_enter(&fc->fc_mtx); in fw_bindadd()
727 STAILQ_FOREACH(tfw, &fc->binds, fclist) { in fw_bindadd()
733 STAILQ_INSERT_HEAD(&fc->binds, fwb, fclist); in fw_bindadd()
735 STAILQ_INSERT_AFTER(&fc->binds, prev, fwb, fclist); in fw_bindadd()
737 aprint_error_dev(fc->bdev, "bind failed\n"); in fw_bindadd()
740 mutex_exit(&fc->fc_mtx); in fw_bindadd()
748 fw_bindremove(struct firewire_comm *fc, struct fw_bind *fwb) in fw_bindremove() argument
755 mutex_enter(&fc->fc_mtx); in fw_bindremove()
756 STAILQ_FOREACH(tfw, &fc->binds, fclist) in fw_bindremove()
758 STAILQ_REMOVE(&fc->binds, fwb, fw_bind, fclist); in fw_bindremove()
759 mutex_exit(&fc->fc_mtx); in fw_bindremove()
763 mutex_exit(&fc->fc_mtx); in fw_bindremove()
764 aprint_error_dev(fc->bdev, "no such binding\n"); in fw_bindremove()
781 int rlen, int n, struct firewire_comm *fc, void *sc, in fw_xferlist_add() argument
791 xfer->fc = fc; in fw_xferlist_add()
866 aprint_error_dev(xfer->fc->bdev, "hand == NULL\n"); in fw_xfer_done()
870 if (xfer->fc == NULL) in fw_xfer_done()
873 fw_tl_free(xfer->fc, xfer); in fw_xfer_done()
884 aprint_error_dev(xfer->fc->bdev, "fw_xfer_free FWXF_INQ\n"); in fw_xfer_unload()
892 if (xfer->fc != NULL) { in fw_xfer_unload()
900 aprint_error_dev(xfer->fc->bdev, in fw_xfer_unload()
957 fw_sidrcv(struct firewire_comm* fc, uint32_t *sid, u_int len) in fw_sidrcv() argument
963 fc->sid_cnt = len / (sizeof(uint32_t) * 2); in fw_sidrcv()
964 fc->max_node = fc->nodeid & 0x3f; in fw_sidrcv()
965 CSRARC(fc, NODE_IDS) = ((uint32_t)fc->nodeid) << 16; in fw_sidrcv()
966 fc->status = FWBUSCYMELECT; in fw_sidrcv()
967 fc->topology_map->crc_len = 2; in fw_sidrcv()
968 fc->topology_map->generation++; in fw_sidrcv()
969 fc->topology_map->self_id_count = 0; in fw_sidrcv()
970 fc->topology_map->node_count = 0; in fw_sidrcv()
971 fc->speed_map->generation++; in fw_sidrcv()
972 fc->speed_map->crc_len = 1 + (64*64 + 3) / 4; in fw_sidrcv()
973 self_id = fc->topology_map->self_id; in fw_sidrcv()
974 for (i = 0; i < fc->sid_cnt; i++) { in fw_sidrcv()
976 aprint_error_dev(fc->bdev, in fw_sidrcv()
982 fc->topology_map->crc_len++; in fw_sidrcv()
984 fc->topology_map->node_count++; in fw_sidrcv()
989 if (fc->max_node < node) in fw_sidrcv()
990 fc->max_node = self_id->p0.phy_id; in fw_sidrcv()
992 fc->speed_map->speed[node][node] = in fw_sidrcv()
995 fc->speed_map->speed[j][node] = in fw_sidrcv()
996 fc->speed_map->speed[node][j] = in fw_sidrcv()
997 uimin(fc->speed_map->speed[j][j], in fw_sidrcv()
999 if ((fc->irm == -1 || self_id->p0.phy_id > fc->irm) && in fw_sidrcv()
1001 fc->irm = self_id->p0.phy_id; in fw_sidrcv()
1013 fc->topology_map->self_id_count++; in fw_sidrcv()
1016 fc->topology_map->crc = in fw_sidrcv()
1017 fw_crc16((uint32_t *)&fc->topology_map->generation, in fw_sidrcv()
1018 fc->topology_map->crc_len * 4); in fw_sidrcv()
1019 fc->speed_map->crc = fw_crc16((uint32_t *)&fc->speed_map->generation, in fw_sidrcv()
1020 fc->speed_map->crc_len * 4); in fw_sidrcv()
1022 p = (uint32_t *)fc->topology_map; in fw_sidrcv()
1023 for (i = 0; i <= fc->topology_map->crc_len; i++) in fw_sidrcv()
1024 CSRARC(fc, TOPO_MAP + i * 4) = htonl(*p++); in fw_sidrcv()
1025 p = (uint32_t *)fc->speed_map; in fw_sidrcv()
1026 CSRARC(fc, SPED_MAP) = htonl(*p++); in fw_sidrcv()
1027 CSRARC(fc, SPED_MAP + 4) = htonl(*p++); in fw_sidrcv()
1029 memcpy(&CSRARC(fc, SPED_MAP + 8), p, (fc->speed_map->crc_len - 1) * 4); in fw_sidrcv()
1031 fc->max_hop = fc->max_node - i_branch; in fw_sidrcv()
1032 aprint_normal_dev(fc->bdev, "%d nodes, maxhop <= %d %s irm(%d)%s\n", in fw_sidrcv()
1033 fc->max_node + 1, fc->max_hop, in fw_sidrcv()
1034 (fc->irm == -1) ? "Not IRM capable" : "cable IRM", in fw_sidrcv()
1035 fc->irm, in fw_sidrcv()
1036 (fc->irm == fc->nodeid) ? " (me)" : ""); in fw_sidrcv()
1038 if (try_bmr && (fc->irm != -1) && (CSRARC(fc, BUS_MGR_ID) == 0x3f)) { in fw_sidrcv()
1039 if (fc->irm == fc->nodeid) { in fw_sidrcv()
1040 fc->status = FWBUSMGRDONE; in fw_sidrcv()
1041 CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, fc->irm); in fw_sidrcv()
1042 fw_bmr(fc); in fw_sidrcv()
1044 fc->status = FWBUSMGRELECT; in fw_sidrcv()
1045 callout_schedule(&fc->bmr_callout, hz/8); in fw_sidrcv()
1048 fc->status = FWBUSMGRDONE; in fw_sidrcv()
1050 callout_schedule(&fc->busprobe_callout, hz/4); in fw_sidrcv()
1083 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src, in fw_rcv()
1086 aprint_error_dev(rb->fc->bdev, "unknown response" in fw_rcv()
1095 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src, in fw_rcv()
1124 aprint_error_dev(rb->fc->bdev, in fw_rcv()
1133 bind = fw_bindlookup(rb->fc, fp->mode.rreqq.dest_hi, in fw_rcv()
1137 aprint_error_dev(rb->fc->bdev, "Unknown service addr" in fw_rcv()
1143 if (rb->fc->status == FWBUSINIT) { in fw_rcv()
1144 aprint_error_dev(rb->fc->bdev, in fw_rcv()
1179 if (fw_asyreq(rb->fc, -1, rb->xfer)) { in fw_rcv()
1193 aprint_error_dev(rb->fc->bdev, in fw_rcv()
1205 aprint_error_dev(rb->fc->bdev, "unknown tcode %d\n", tcode); in fw_rcv()
1231 fw_open_isodma(struct firewire_comm *fc, int tx) in fw_open_isodma() argument
1238 xferqa = fc->it; in fw_open_isodma()
1240 xferqa = fc->ir; in fw_open_isodma()
1242 mutex_enter(&fc->fc_mtx); in fw_open_isodma()
1243 for (i = 0; i < fc->nisodma; i++) { in fw_open_isodma()
1250 if (i == fc->nisodma) { in fw_open_isodma()
1251 aprint_error_dev(fc->bdev, "no free dma channel (tx=%d)\n", tx); in fw_open_isodma()
1254 mutex_exit(&fc->fc_mtx); in fw_open_isodma()
1264 struct firewire_comm *fc = xfer->fc; in fw_asystart() local
1276 xfer->q->start(fc); in fw_asystart()
1281 firewire_xfer_timeout(struct firewire_comm *fc) in firewire_xfer_timeout() argument
1296 mutex_enter(&fc->tlabel_lock); in firewire_xfer_timeout()
1298 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) { in firewire_xfer_timeout()
1305 aprint_error_dev(fc->bdev, in firewire_xfer_timeout()
1310 STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel); in firewire_xfer_timeout()
1314 mutex_exit(&fc->tlabel_lock); in firewire_xfer_timeout()
1315 fc->timeout(fc); in firewire_xfer_timeout()
1325 struct firewire_comm *fc; in firewire_watchdog() local
1328 fc = (struct firewire_comm *)arg; in firewire_watchdog()
1336 firewire_xfer_timeout(fc); in firewire_watchdog()
1340 callout_schedule(&fc->timeout_callout, hz / WATCHDOG_HZ); in firewire_watchdog()
1360 fw_reset_csr(struct firewire_comm *fc) in fw_reset_csr() argument
1364 CSRARC(fc, STATE_CLEAR) = in fw_reset_csr()
1366 CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR); in fw_reset_csr()
1367 CSRARC(fc, NODE_IDS) = 0x3f; in fw_reset_csr()
1369 CSRARC(fc, TOPO_MAP + 8) = 0; in fw_reset_csr()
1370 fc->irm = -1; in fw_reset_csr()
1372 fc->max_node = -1; in fw_reset_csr()
1375 CSRARC(fc, SPED_MAP + i * 4) = 0; in fw_reset_csr()
1376 CSRARC(fc, STATE_CLEAR) = in fw_reset_csr()
1378 CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR); in fw_reset_csr()
1379 CSRARC(fc, RESET_START) = 0; in fw_reset_csr()
1380 CSRARC(fc, SPLIT_TIMEOUT_HI) = 0; in fw_reset_csr()
1381 CSRARC(fc, SPLIT_TIMEOUT_LO) = 800 << 19; in fw_reset_csr()
1382 CSRARC(fc, CYCLE_TIME) = 0x0; in fw_reset_csr()
1383 CSRARC(fc, BUS_TIME) = 0x0; in fw_reset_csr()
1384 CSRARC(fc, BUS_MGR_ID) = 0x3f; in fw_reset_csr()
1385 CSRARC(fc, BANDWIDTH_AV) = 4915; in fw_reset_csr()
1386 CSRARC(fc, CHANNELS_AV_HI) = 0xffffffff; in fw_reset_csr()
1387 CSRARC(fc, CHANNELS_AV_LO) = 0xffffffff; in fw_reset_csr()
1388 CSRARC(fc, IP_CHANNELS) = (1U << 31); in fw_reset_csr()
1390 CSRARC(fc, CONF_ROM) = 0x04 << 24; in fw_reset_csr()
1391 CSRARC(fc, CONF_ROM + 4) = 0x31333934; /* means strings 1394 */ in fw_reset_csr()
1392 CSRARC(fc, CONF_ROM + 8) = in fw_reset_csr()
1394 CSRARC(fc, CONF_ROM + 0xc) = 0; in fw_reset_csr()
1397 CSRARC(fc, oPCR) &= ~DV_BROADCAST_ON; in fw_reset_csr()
1398 CSRARC(fc, iPCR) &= ~DV_BROADCAST_ON; in fw_reset_csr()
1400 CSRARC(fc, STATE_CLEAR) &= ~(1 << 23 | 1 << 15 | 1 << 14); in fw_reset_csr()
1401 CSRARC(fc, STATE_SET) = CSRARC(fc, STATE_CLEAR); in fw_reset_csr()
1405 fw_init_crom(struct firewire_comm *fc) in fw_init_crom() argument
1409 src = &fc->crom_src_buf->src; in fw_init_crom()
1423 src->businfo.max_rec = fc->maxrec; in fw_init_crom()
1426 src->businfo.link_spd = fc->speed; in fw_init_crom()
1428 src->businfo.eui64.hi = fc->eui.hi; in fw_init_crom()
1429 src->businfo.eui64.lo = fc->eui.lo; in fw_init_crom()
1433 fc->crom_src = src; in fw_init_crom()
1434 fc->crom_root = &fc->crom_src_buf->root; in fw_init_crom()
1438 fw_reset_crom(struct firewire_comm *fc) in fw_reset_crom() argument
1444 buf = fc->crom_src_buf; in fw_reset_crom()
1445 src = fc->crom_src; in fw_reset_crom()
1446 root = fc->crom_root; in fw_reset_crom()
1479 fw_tl_free(struct firewire_comm *fc, struct fw_xfer *xfer) in fw_tl_free() argument
1486 mutex_enter(&fc->tlabel_lock); in fw_tl_free()
1488 STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel) in fw_tl_free()
1492 mutex_exit(&fc->tlabel_lock); in fw_tl_free()
1493 aprint_error_dev(fc->bdev, in fw_tl_free()
1503 STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel); in fw_tl_free()
1504 mutex_exit(&fc->tlabel_lock); in fw_tl_free()
1512 fw_tl2xfer(struct firewire_comm *fc, int node, int tlabel, int tcode) in fw_tl2xfer() argument
1517 mutex_enter(&fc->tlabel_lock); in fw_tl2xfer()
1518 STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel) in fw_tl2xfer()
1520 mutex_exit(&fc->tlabel_lock); in fw_tl2xfer()
1524 if (xfer->fc->tcode[req].valid_res != tcode) { in fw_tl2xfer()
1525 aprint_error_dev(fc->bdev, in fw_tl2xfer()
1535 mutex_exit(&fc->tlabel_lock); in fw_tl2xfer()
1545 fw_phy_config(struct firewire_comm *fc, int root_node, int gap_count) in fw_phy_config() argument
1550 fc->status = FWBUSPHYCONF; in fw_phy_config()
1555 xfer->fc = fc; in fw_phy_config()
1570 fw_asyreq(fc, -1, xfer); in fw_phy_config()
1609 fw_bus_probe(struct firewire_comm *fc) in fw_bus_probe() argument
1613 mutex_enter(&fc->wait_lock); in fw_bus_probe()
1614 fc->status = FWBUSEXPLORE; in fw_bus_probe()
1619 mutex_enter(&fc->fc_mtx); in fw_bus_probe()
1620 STAILQ_FOREACH(fwdev, &fc->devices, link) in fw_bus_probe()
1631 mutex_exit(&fc->fc_mtx); in fw_bus_probe()
1633 cv_signal(&fc->fc_cv); in fw_bus_probe()
1634 mutex_exit(&fc->wait_lock); in fw_bus_probe()
1704 aprint_error_dev(fwdev->fc->bdev, "invalid offset %d\n", in fw_explore_csrblock()
1718 struct firewire_comm *fc; in fw_explore_node() local
1725 fc = dfwdev->fc; in fw_explore_node()
1732 aprint_error_dev(fc->bdev, in fw_explore_node()
1749 aprint_error_dev(fc->bdev, "node%d: error reading 0x04\n", in fw_explore_node()
1756 aprint_error_dev(fc->bdev, "node%d: invalid bus name 0x%08x\n", in fw_explore_node()
1771 mutex_enter(&fc->fc_mtx); in fw_explore_node()
1772 STAILQ_FOREACH(fwdev, &fc->devices, link) in fw_explore_node()
1775 mutex_exit(&fc->fc_mtx); in fw_explore_node()
1779 fwdev->fc = fc; in fw_explore_node()
1793 aprint_normal_dev(fc->bdev, in fw_explore_node()
1795 fwdev->speed = fc->speed_map->speed[fc->nodeid][node]; in fw_explore_node()
1806 aprint_error_dev(fc->bdev, "fwdev->speed(%s)" in fw_explore_node()
1818 mutex_enter(&fc->fc_mtx); in fw_explore_node()
1819 STAILQ_FOREACH(tfwdev, &fc->devices, link) { in fw_explore_node()
1827 STAILQ_INSERT_HEAD(&fc->devices, fwdev, link); in fw_explore_node()
1829 STAILQ_INSERT_AFTER(&fc->devices, pfwdev, fwdev, link); in fw_explore_node()
1830 mutex_exit(&fc->fc_mtx); in fw_explore_node()
1832 aprint_normal_dev(fc->bdev, "New %s device ID:%08x%08x\n", in fw_explore_node()
1866 fw_find_self_id(struct firewire_comm *fc, int node) in fw_find_self_id() argument
1871 for (i = 0; i < fc->topology_map->self_id_count; i++) { in fw_find_self_id()
1872 s = &fc->topology_map->self_id[i]; in fw_find_self_id()
1882 fw_explore(struct firewire_comm *fc) in fw_explore() argument
1893 dfwdev->fc = fc; in fw_explore()
1898 for (node = 0; node <= fc->max_node; node++) { in fw_explore()
1900 if (node == fc->nodeid) { in fw_explore()
1904 node, fc->nodeid, fc->max_node); in fw_explore()
1908 node, fc->max_node); in fw_explore()
1909 fwsid = fw_find_self_id(fc, node); in fw_explore()
1936 struct firewire_comm *fc = (struct firewire_comm *)arg; in fw_bus_probe_thread() local
1952 config_pending_decr(fc->bdev); in fw_bus_probe_thread()
1954 mutex_enter(&fc->wait_lock); in fw_bus_probe_thread()
1955 while (fc->status != FWBUSDETACH) { in fw_bus_probe_thread()
1956 if (fc->status == FWBUSEXPLORE) { in fw_bus_probe_thread()
1957 mutex_exit(&fc->wait_lock); in fw_bus_probe_thread()
1958 fw_explore(fc); in fw_bus_probe_thread()
1959 fc->status = FWBUSEXPDONE; in fw_bus_probe_thread()
1962 fw_attach_dev(fc); in fw_bus_probe_thread()
1963 mutex_enter(&fc->wait_lock); in fw_bus_probe_thread()
1965 cv_wait_sig(&fc->fc_cv, &fc->wait_lock); in fw_bus_probe_thread()
1967 fc->status = FWBUSDETACHOK; in fw_bus_probe_thread()
1968 cv_signal(&fc->fc_cv); in fw_bus_probe_thread()
1969 mutex_exit(&fc->wait_lock); in fw_bus_probe_thread()
2019 fw_attach_dev(struct firewire_comm *fc) in fw_attach_dev() argument
2021 struct firewire_softc *sc = device_private(fc->bdev); in fw_attach_dev()
2029 fwa.fc = fc; in fw_attach_dev()
2031 mutex_enter(&fc->fc_mtx); in fw_attach_dev()
2032 for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; fwdev = next) { in fw_attach_dev()
2034 mutex_exit(&fc->fc_mtx); in fw_attach_dev()
2057 mutex_enter(&fc->fc_mtx); in fw_attach_dev()
2066 mutex_exit(&fc->fc_mtx); in fw_attach_dev()
2086 mutex_enter(&fc->fc_mtx); in fw_attach_dev()
2088 mutex_exit(&fc->fc_mtx); in fw_attach_dev()
2096 for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; fwdev = next) { in fw_attach_dev()
2120 STAILQ_REMOVE(&fc->devices, fwdev, fw_device, link); in fw_attach_dev()
2132 fw_get_tlabel(struct firewire_comm *fc, struct fw_xfer *xfer) in fw_get_tlabel() argument
2138 mutex_enter(&fc->tlabel_lock); in fw_get_tlabel()
2139 new_tlabel = (fc->last_tlabel[dst] + 1) & 0x3f; in fw_get_tlabel()
2140 STAILQ_FOREACH(txfer, &fc->tlabels[new_tlabel], tlabel) in fw_get_tlabel()
2144 fc->last_tlabel[dst] = new_tlabel; in fw_get_tlabel()
2145 STAILQ_INSERT_TAIL(&fc->tlabels[new_tlabel], xfer, tlabel); in fw_get_tlabel()
2146 mutex_exit(&fc->tlabel_lock); in fw_get_tlabel()
2154 mutex_exit(&fc->tlabel_lock); in fw_get_tlabel()
2172 tinfo = &rb->fc->tcode[pkt->mode.hdr.tcode]; in fw_rcv_copy()
2200 aprint_error_dev(rb->fc->bdev, in fw_rcv_copy()
2224 struct firewire_comm *fc; in fw_try_bmr_callback() local
2229 fc = xfer->fc; in fw_try_bmr_callback()
2239 bmr = fc->nodeid; in fw_try_bmr_callback()
2241 CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, bmr & 0x3f); in fw_try_bmr_callback()
2243 fw_bmr(fc); in fw_try_bmr_callback()
2247 aprint_error_dev(fc->bdev, "bus manager election failed\n"); in fw_try_bmr_callback()
2259 struct firewire_comm *fc = (struct firewire_comm *)arg; in fw_try_bmr() local
2267 fc->status = FWBUSMGRELECT; in fw_try_bmr()
2277 fp->mode.lreq.dst = FWLOCALBUS | fc->irm; in fw_try_bmr()
2280 xfer->send.payload[1] = htonl(fc->nodeid); in fw_try_bmr()
2283 err = fw_asyreq(fc, -1, xfer); in fw_try_bmr()
2298 fw_bmr(struct firewire_comm *fc) in fw_bmr() argument
2306 self_id = fw_find_self_id(fc, fc->max_node); in fw_bmr()
2307 if (fc->max_node > 0) { in fw_bmr()
2310 cmstr = fc->max_node; in fw_bmr()
2312 aprint_normal_dev(fc->bdev, in fw_bmr()
2315 cmstr = fc->nodeid; in fw_bmr()
2321 aprint_normal_dev(fc->bdev, "bus manager %d%s\n", in fw_bmr()
2322 CSRARC(fc, BUS_MGR_ID), in fw_bmr()
2323 (CSRARC(fc, BUS_MGR_ID) != fc->nodeid) ? " (me)" : ""); in fw_bmr()
2324 if (CSRARC(fc, BUS_MGR_ID) != fc->nodeid) in fw_bmr()
2329 if (fc->max_hop <= MAX_GAPHOP) in fw_bmr()
2330 fw_phy_config(fc, cmstr, gap_cnt[fc->max_hop]); in fw_bmr()
2332 if (cmstr == fc->nodeid || cmstr == -1) in fw_bmr()
2336 fwdev.fc = fc; in fw_bmr()