Lines Matching +full:mode +full:- +full:flag

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
5 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
67 "FireWire driver debug flag");
130 /* IEEE-1394a Table C-2 Gap count as a function of hops*/
150 STAILQ_FOREACH(fwdev, &fc->devices, link)
151 if (fwdev->dst == dst && fwdev->status != FWDEVINVAL)
167 STAILQ_FOREACH(fwdev, &fc->devices, link)
168 if (FW_EUI64_EQUAL(fwdev->eui, *eui))
174 if (fwdev->status == FWDEVINVAL)
194 if (xfer->hand == NULL) {
198 fp = &xfer->send.hdr;
200 tcode = fp->mode.common.tcode & 0xf;
201 info = &fc->tcode[tcode];
202 if (info->flag == 0) {
208 if ((fc->status < FWBUSEXPLORE) &&
209 ((tcode != FWTCODE_RREQQ) || (fp->mode.rreqq.dest_hi != 0xffff) ||
210 (fp->mode.rreqq.dest_lo < 0xf0000000) ||
211 (fp->mode.rreqq.dest_lo >= 0xf0001000))) {
212 xfer->resp = EAGAIN;
213 xfer->flag = FWXF_BUSY;
217 if (info->flag & FWTI_REQ)
218 xferq = fc->atq;
220 xferq = fc->ats;
221 len = info->hdr_len;
222 if (xfer->send.pay_len > MAXREC(fc->maxrec)) {
226 if (info->flag & FWTI_BLOCK_STR)
227 len = fp->mode.stream.len;
228 else if (info->flag & FWTI_BLOCK_ASY)
229 len = fp->mode.rresb.len;
232 if (len != xfer->send.pay_len) {
234 len, xfer->send.pay_len, tcode_str[tcode], tcode);
238 if (xferq->start == NULL) {
239 printf("xferq->start == NULL\n");
242 if (!(xferq->queued < xferq->maxq)) {
243 device_printf(fc->bdev, "Discard a packet (queued=%d)\n",
244 xferq->queued);
248 xfer->tl = -1;
249 if (info->flag & FWTI_TLABEL) {
254 xfer->resp = 0;
255 xfer->fc = fc;
256 xfer->q = xferq;
268 struct mtx *lock = &xfer->fc->wait_lock;
271 xfer->flag |= FWXF_WAKE;
281 struct mtx *lock = &xfer->fc->wait_lock;
285 while ((xfer->flag & FWXF_WAKE) == 0)
298 struct firewire_comm *fc = xfer->fc;
302 xfer->flag = FWXF_INQ;
303 STAILQ_INSERT_TAIL(&xfer->q->q, xfer, link);
305 xfer->q->queued++;
309 if (xfer->mbuf == NULL)
310 xfer->q->start(fc);
327 /* Just use a per-packet callout? */
345 mtx_lock(&fc->tlabel_lock);
346 for (i = 0; i < nitems(fc->tlabels); i++) {
347 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
348 if ((xfer->flag & FWXF_SENT) == 0)
351 if (timevalcmp(&xfer->tv, &tv, >))
354 device_printf(fc->bdev,
355 "split transaction timeout: tl=0x%x flag=0x%02x\n",
356 i, xfer->flag);
357 fw_dump_hdr(&xfer->send.hdr, "send");
358 xfer->resp = ETIMEDOUT;
359 xfer->tl = -1;
360 STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel);
364 mtx_unlock(&fc->tlabel_lock);
365 fc->timeout(fc);
368 xfer->hand(xfer);
386 taskqueue_enqueue(fc->taskqueue, &fc->task_timeout);
390 callout_reset(&fc->timeout_callout, hz / WATCHDOG_HZ,
406 sc->fc = fc;
407 fc->status = FWBUSNOTREADY;
410 if (fc->nisodma > FWMAXNDMA)
411 fc->nisodma = FWMAXNDMA;
415 fc->crom_src_buf = malloc(sizeof(struct crom_src_buf),
417 if (fc->crom_src_buf == NULL) {
418 device_printf(fc->dev,
422 fc->topology_map = malloc(sizeof(struct fw_topology_map),
424 if (fc->topology_map == NULL) {
425 device_printf(fc->dev, "%s: unable to allocate topology map\n",
427 free(fc->crom_src_buf, M_FW);
430 fc->speed_map = malloc(sizeof(struct fw_speed_map),
432 if (fc->speed_map == NULL) {
433 device_printf(fc->dev, "%s: unable to allocate speed map\n",
435 free(fc->crom_src_buf, M_FW);
436 free(fc->topology_map, M_FW);
440 mtx_init(&fc->wait_lock, "fwwait", NULL, MTX_DEF);
441 mtx_init(&fc->tlabel_lock, "fwtlabel", NULL, MTX_DEF);
442 CALLOUT_INIT(&fc->timeout_callout);
443 CALLOUT_INIT(&fc->bmr_callout);
444 CALLOUT_INIT(&fc->busprobe_callout);
445 TASK_INIT(&fc->task_timeout, 0, firewire_xfer_timeout, fc);
447 callout_reset(&sc->fc->timeout_callout, hz,
448 firewire_watchdog, sc->fc);
451 kproc_create(fw_bus_probe_thread, fc, &fc->probe_thread,
464 fc->ibr(fc);
481 device_set_ivars(child, sc->fc);
494 sc->fc->status = FWBUSNOTREADY;
513 fc = sc->fc;
514 mtx_lock(&fc->wait_lock);
515 fc->status = FWBUSDETACH;
517 if (msleep(fc->probe_thread, &fc->wait_lock, PWAIT, "fwthr", hz * 60))
519 mtx_unlock(&fc->wait_lock);
521 if (fc->arq != 0 && fc->arq->maxq > 0)
530 callout_stop(&fc->timeout_callout);
531 callout_stop(&fc->bmr_callout);
532 callout_stop(&fc->busprobe_callout);
535 for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL;
540 free(fc->topology_map, M_FW);
541 free(fc->speed_map, M_FW);
542 free(fc->crom_src_buf, M_FW);
544 mtx_destroy(&fc->tlabel_lock);
545 mtx_destroy(&fc->wait_lock);
554 while ((xfer = STAILQ_FIRST(&xferq->q)) != NULL) {
555 STAILQ_REMOVE_HEAD(&xferq->q, link);
557 xferq->queued--;
559 xfer->resp = EAGAIN;
560 xfer->flag = FWXF_SENTERR;
575 fw_xferq_drain(fc->atq);
576 fw_xferq_drain(fc->ats);
577 for (i = 0; i < fc->nisodma; i++)
578 fw_xferq_drain(fc->it[i]);
581 mtx_lock(&fc->tlabel_lock);
583 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
585 printf("tl=%d flag=%d\n", i, xfer->flag);
586 xfer->tl = -1;
587 xfer->resp = EAGAIN;
588 STAILQ_REMOVE_HEAD(&fc->tlabels[i], tlabel);
591 mtx_unlock(&fc->tlabel_lock);
594 xfer->hand(xfer);
608 fc->irm = -1;
610 fc->max_node = -1;
612 for (i = 2; i < 0x100 / 4 - 2; i++) {
647 src = &fc->crom_src_buf->src;
651 src->hdr.info_len = 4;
653 src->businfo.bus_name = CSR_BUS_NAME_IEEE1394;
655 src->businfo.irmc = 1;
656 src->businfo.cmc = 1;
657 src->businfo.isc = 1;
658 src->businfo.bmc = 1;
659 src->businfo.pmc = 0;
660 src->businfo.cyc_clk_acc = 100;
661 src->businfo.max_rec = fc->maxrec;
662 src->businfo.max_rom = MAXROM_4;
664 src->businfo.generation = FW_GENERATION_CHANGEABLE;
665 src->businfo.link_spd = fc->speed;
667 src->businfo.eui64.hi = fc->eui.hi;
668 src->businfo.eui64.lo = fc->eui.lo;
670 STAILQ_INIT(&src->chunk_list);
672 fc->crom_src = src;
673 fc->crom_root = &fc->crom_src_buf->root;
683 buf = fc->crom_src_buf;
684 src = fc->crom_src;
685 root = fc->crom_root;
687 STAILQ_INIT(&src->chunk_list);
694 crom_add_simple_text(src, root, &buf->vendor, "FreeBSD Project");
697 crom_add_simple_text(src, root, &buf->hw, prison0.pr_hostname);
714 if (fc->status == FWBUSMGRELECT)
715 callout_stop(&fc->bmr_callout);
717 fc->status = new_status;
720 if (fc->status == FWBUSNOTREADY)
725 if (device_get_children(fc->bdev, &devlistp, &devcnt) == 0) {
729 if (fdc->post_busreset != NULL)
730 fdc->post_busreset(fdc);
735 src = &fc->crom_src_buf->src;
740 * See 1394a-2000 8.3.2.5.4 for more details.
745 * that is not 1394a-2000 compliant.
752 src = &fc->crom_src_buf->src;
754 if (bcmp(newrom, fc->config_rom, CROMSIZE) != 0) {
756 src->businfo.generation++;
759 if (src->businfo.generation < FW_GENERATION_CHANGEABLE)
760 src->businfo.generation = FW_GENERATION_CHANGEABLE;
764 bcopy(newrom, fc->config_rom, CROMSIZE);
778 fc->arq->queued = 0;
779 fc->ars->queued = 0;
780 fc->atq->queued = 0;
781 fc->ats->queued = 0;
783 fc->arq->buf = NULL;
784 fc->ars->buf = NULL;
785 fc->atq->buf = NULL;
786 fc->ats->buf = NULL;
788 fc->arq->flag = 0;
789 fc->ars->flag = 0;
790 fc->atq->flag = 0;
791 fc->ats->flag = 0;
793 STAILQ_INIT(&fc->atq->q);
794 STAILQ_INIT(&fc->ats->q);
796 for (i = 0; i < fc->nisodma; i++) {
797 fc->it[i]->queued = 0;
798 fc->ir[i]->queued = 0;
800 fc->it[i]->start = NULL;
801 fc->ir[i]->start = NULL;
803 fc->it[i]->buf = NULL;
804 fc->ir[i]->buf = NULL;
806 fc->it[i]->flag = FWXFERQ_STREAM;
807 fc->ir[i]->flag = FWXFERQ_STREAM;
809 STAILQ_INIT(&fc->it[i]->q);
810 STAILQ_INIT(&fc->ir[i]->q);
813 fc->arq->maxq = FWMAXQUEUE;
814 fc->ars->maxq = FWMAXQUEUE;
815 fc->atq->maxq = FWMAXQUEUE;
816 fc->ats->maxq = FWMAXQUEUE;
818 for (i = 0; i < fc->nisodma; i++) {
819 fc->ir[i]->maxq = FWMAXQUEUE;
820 fc->it[i]->maxq = FWMAXQUEUE;
828 STAILQ_INIT(&fc->devices);
831 STAILQ_INIT(&fc->binds);
833 STAILQ_INIT(&fc->tlabels[i]);
851 fc->crom_src_buf = NULL;
863 xfer->hand = fw_vmaccess;
864 xfer->fc = fc;
865 xfer->sc = NULL;
867 fwb->start_hi = 0x2;
868 fwb->start_lo = 0;
869 fwb->addrlen = 0xffffffff;
870 fwb->xfer = xfer;
875 #define BIND_CMP(addr, fwb) (((addr) < (fwb)->start)? -1 : \
876 ((fwb)->end < (addr)) ? 1 : 0)
889 STAILQ_FOREACH(tfw, &fc->binds, fclist)
907 if (fwb->start > fwb->end) {
913 STAILQ_FOREACH(tfw, &fc->binds, fclist) {
914 if (fwb->end < tfw->start)
919 STAILQ_INSERT_HEAD(&fc->binds, fwb, fclist);
920 else if (prev->end < fwb->start)
921 STAILQ_INSERT_AFTER(&fc->binds, prev, fwb, fclist);
944 STAILQ_FOREACH(tfw, &fc->binds, fclist)
946 STAILQ_REMOVE(&fc->binds, fwb, fw_bind, fclist);
957 for (xfer = STAILQ_FIRST(&fwb->xferlist); xfer != NULL; xfer = next) {
961 STAILQ_INIT(&fwb->xferlist);
981 xfer->fc = fc;
982 xfer->sc = sc;
983 xfer->hand = hand;
1010 fp->mode.hdr.dst & 0x3f,
1011 fp->mode.hdr.tlrt >> 2, fp->mode.hdr.tlrt & 3,
1012 fp->mode.hdr.tcode, fp->mode.hdr.pri,
1013 fp->mode.hdr.src);
1024 mtx_lock(&fc->tlabel_lock);
1025 if (xfer->tl < 0) {
1026 mtx_unlock(&fc->tlabel_lock);
1030 STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel)
1035 "(tlabel=%d, flag=0x%x)\n",
1036 __FUNCTION__, xfer->tl, xfer->flag);
1037 fw_dump_hdr(&xfer->send.hdr, "send");
1038 fw_dump_hdr(&xfer->recv.hdr, "recv");
1040 mtx_unlock(&fc->tlabel_lock);
1044 STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel);
1045 xfer->tl = -1;
1046 mtx_unlock(&fc->tlabel_lock);
1060 mtx_lock(&fc->tlabel_lock);
1061 STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel)
1062 if (xfer->send.hdr.mode.hdr.dst == node) {
1063 mtx_unlock(&fc->tlabel_lock);
1065 KASSERT(xfer->tl == tlabel,
1066 ("xfer->tl 0x%x != 0x%x", xfer->tl, tlabel));
1068 req = xfer->send.hdr.mode.hdr.tcode;
1069 if (xfer->fc->tcode[req].valid_res != tcode) {
1080 mtx_unlock(&fc->tlabel_lock);
1099 xfer->malloc = type;
1100 xfer->tl = -1;
1113 xfer->send.pay_len = send_len;
1114 xfer->recv.pay_len = recv_len;
1116 xfer->send.payload = malloc(send_len, type, M_NOWAIT | M_ZERO);
1117 if (xfer->send.payload == NULL) {
1123 xfer->recv.payload = malloc(recv_len, type, M_NOWAIT);
1124 if (xfer->recv.payload == NULL) {
1125 if (xfer->send.payload != NULL)
1126 free(xfer->send.payload, type);
1140 if (xfer->hand == NULL) {
1145 if (xfer->fc == NULL)
1146 panic("fw_xfer_done: why xfer->fc is NULL?");
1148 fw_tl_free(xfer->fc, xfer);
1149 xfer->hand(xfer);
1159 if (xfer->fc != NULL) {
1160 FW_GLOCK(xfer->fc);
1161 if (xfer->flag & FWXF_INQ) {
1162 STAILQ_REMOVE(&xfer->q->q, xfer, fw_xfer, link);
1163 xfer->flag &= ~FWXF_INQ;
1165 xfer->q->queued--;
1168 FW_GUNLOCK(xfer->fc);
1174 fw_tl_free(xfer->fc, xfer);
1176 if (xfer->flag & FWXF_START)
1185 xfer->flag = FWXF_INIT;
1186 xfer->resp = 0;
1200 if (xfer->send.payload != NULL)
1201 free(xfer->send.payload, xfer->malloc);
1202 if (xfer->recv.payload != NULL)
1203 free(xfer->recv.payload, xfer->malloc);
1204 free(xfer, xfer->malloc);
1215 free(xfer, xfer->malloc);
1222 printf("asyreq done flag=0x%02x resp=%d\n",
1223 xfer->flag, xfer->resp);
1237 fc->status = FWBUSPHYCONF;
1242 xfer->fc = fc;
1243 xfer->hand = fw_asy_callback_free;
1245 fp = &xfer->send.hdr;
1246 fp->mode.ld[1] = 0;
1248 fp->mode.ld[1] |= (1 << 23) | (root_node & 0x3f) << 24;
1250 fp->mode.ld[1] |= (1 << 22) | (gap_count & 0x3f) << 16;
1251 fp->mode.ld[2] = ~fp->mode.ld[1];
1253 fp->mode.common.tcode |= FWTCODE_PHY;
1256 device_printf(fc->bdev, "%s: root_node=%d gap_count=%d\n",
1258 fw_asyreq(fc, -1, xfer);
1269 if (s->p0.sequel) {
1270 if (s->p1.sequence_num == FW_SELF_ID_PAGE0) {
1273 s->p1.phy_id, s->p1.port3, s->p1.port4,
1274 s->p1.port5, s->p1.port6, s->p1.port7,
1275 s->p1.port8, s->p1.port9, s->p1.port10);
1276 } else if (s->p2.sequence_num == FW_SELF_ID_PAGE1) {
1278 s->p2.phy_id, s->p2.port11, s->p2.port12,
1279 s->p2.port13, s->p2.port14, s->p2.port15);
1282 s->p1.phy_id, s->p1.sequence_num);
1287 s->p0.phy_id, s->p0.link_active, s->p0.gap_count,
1288 s->p0.phy_speed, s->p0.contender,
1289 s->p0.power_class, s->p0.port0, s->p0.port1,
1290 s->p0.port2, s->p0.initiated_reset, s->p0.more_packets);
1303 fc->sid_cnt = len / (sizeof(uint32_t) * 2);
1304 fc->max_node = fc->nodeid & 0x3f;
1305 CSRARC(fc, NODE_IDS) = ((uint32_t)fc->nodeid) << 16;
1306 fc->status = FWBUSCYMELECT;
1307 fc->topology_map->crc_len = 2;
1308 fc->topology_map->generation++;
1309 fc->topology_map->self_id_count = 0;
1310 fc->topology_map->node_count= 0;
1311 fc->speed_map->generation++;
1312 fc->speed_map->crc_len = 1 + (64 * 64 + 3) / 4;
1313 self_id = &fc->topology_map->self_id[0];
1314 for (i = 0; i < fc->sid_cnt; i++) {
1316 device_printf(fc->bdev,
1317 "%s: ERROR invalid self-id packet\n", __func__);
1322 fc->topology_map->crc_len++;
1323 if (self_id->p0.sequel == 0) {
1324 fc->topology_map->node_count++;
1328 node = self_id->p0.phy_id;
1329 if (fc->max_node < node)
1330 fc->max_node = self_id->p0.phy_id;
1332 fc->speed_map->speed[node][node] =
1333 self_id->p0.phy_speed;
1335 fc->speed_map->speed[j][node] =
1336 fc->speed_map->speed[node][j] =
1337 min(fc->speed_map->speed[j][j],
1338 self_id->p0.phy_speed);
1340 if ((fc->irm == -1 || self_id->p0.phy_id > fc->irm) &&
1341 (self_id->p0.link_active && self_id->p0.contender))
1342 fc->irm = self_id->p0.phy_id;
1343 if (self_id->p0.port0 >= 0x2)
1345 if (self_id->p0.port1 >= 0x2)
1347 if (self_id->p0.port2 >= 0x2)
1351 i_branch += (c_port - 2);
1354 fc->topology_map->self_id_count++;
1357 fc->topology_map->crc = fw_crc16(
1358 (uint32_t *)&fc->topology_map->generation,
1359 fc->topology_map->crc_len * 4);
1360 fc->speed_map->crc = fw_crc16(
1361 (uint32_t *)&fc->speed_map->generation,
1362 fc->speed_map->crc_len * 4);
1364 p = (uint32_t *)fc->topology_map;
1365 for (i = 0; i <= fc->topology_map->crc_len; i++)
1367 p = (uint32_t *)fc->speed_map;
1370 /* don't byte-swap uint8_t array */
1371 bcopy(p, &CSRARC(fc, SPED_MAP + 8), (fc->speed_map->crc_len - 1) * 4);
1373 fc->max_hop = fc->max_node - i_branch;
1374 device_printf(fc->bdev, "%d nodes, maxhop <= %d %s irm(%d) %s\n",
1375 fc->max_node + 1, fc->max_hop,
1376 (fc->irm == -1) ? "Not IRM capable" : "cable IRM",
1377 fc->irm, (fc->irm == fc->nodeid) ? " (me) " : "");
1379 if (try_bmr && (fc->irm != -1) && (CSRARC(fc, BUS_MGR_ID) == 0x3f)) {
1380 if (fc->irm == fc->nodeid) {
1381 fc->status = FWBUSMGRDONE;
1382 CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, fc->irm);
1385 fc->status = FWBUSMGRELECT;
1386 callout_reset(&fc->bmr_callout, hz / 8,
1390 fc->status = FWBUSMGRDONE;
1392 callout_reset(&fc->busprobe_callout, hz / 4, fw_bus_probe, fc);
1407 fc->status = FWBUSEXPLORE;
1411 device_printf(fc->bdev, "%s:"
1414 STAILQ_FOREACH(fwdev, &fc->devices, link)
1415 if (fwdev->status != FWDEVINVAL) {
1416 fwdev->status = FWDEVINVAL;
1417 fwdev->rcnt = 0;
1419 device_printf(fc->bdev, "%s:"
1421 __func__, fwdev->eui.hi, fwdev->eui.lo);
1424 device_printf(fc->bdev, "%s:"
1426 __func__, fwdev->eui.hi, fwdev->eui.lo);
1442 xfer = fwmem_read_quad(fwdev, NULL, -1, 0xffff,
1445 return (-1);
1448 if (xfer->resp == 0)
1451 error = xfer->resp;
1467 dir = (struct csrdirectory *)&fwdev->csrrom[offset / sizeof(uint32_t)];
1471 return (-1);
1474 reg = (struct csrreg *)&fwdev->csrrom[offset / sizeof(uint32_t)];
1476 (uint32_t *)reg, dir->crc_len);
1478 return (-1);
1482 off = CSRROMOFF + offset + sizeof(uint32_t) * (dir->crc_len - 1);
1483 if (fwdev->rommax < off)
1484 fwdev->rommax = off;
1489 for (i = 0; i < dir->crc_len; i++, offset += sizeof(uint32_t)) {
1500 return (-1);
1504 return (-1);
1520 fc = dfwdev->fc;
1521 csr = dfwdev->csrrom;
1522 node = dfwdev->dst;
1527 dfwdev->status = FWDEVINVAL;
1528 return (-1);
1531 if (hdr->info_len != 4) {
1533 device_printf(fc->bdev,
1535 __func__, node, hdr->info_len);
1536 dfwdev->status = FWDEVINVAL;
1537 return (-1);
1543 dfwdev->status = FWDEVINVAL;
1544 return (-1);
1547 if (binfo->bus_name != CSR_BUS_NAME_IEEE1394) {
1548 dfwdev->status = FWDEVINVAL;
1549 return (-1);
1553 device_printf(fc->bdev, "%s: node(%d) BUS INFO BLOCK:\n"
1558 binfo->irmc, binfo->cmc, binfo->isc,
1559 binfo->bmc, binfo->pmc, binfo->cyc_clk_acc,
1560 binfo->max_rec, binfo->max_rom,
1561 binfo->generation, binfo->link_spd);
1563 STAILQ_FOREACH(fwdev, &fc->devices, link)
1564 if (FW_EUI64_EQUAL(fwdev->eui, binfo->eui64))
1571 device_printf(fc->bdev, "%s: node%d: no memory\n",
1573 return (-1);
1575 fwdev->fc = fc;
1576 fwdev->eui = binfo->eui64;
1577 fwdev->dst = dfwdev->dst;
1578 fwdev->maxrec = dfwdev->maxrec;
1579 fwdev->status = dfwdev->status;
1582 * Pre-1394a-2000 didn't have link_spd in
1585 * 1394a-2000 compliant devices only use
1589 if (binfo->link_spd == FWSPD_S100 /* 0 */) {
1590 device_printf(fc->bdev, "%s: "
1591 "Pre 1394a-2000 detected\n", __func__);
1592 fwdev->speed = fc->speed_map->speed[fc->nodeid][node];
1594 fwdev->speed = binfo->link_spd;
1599 while (fwdev->speed > FWSPD_S100 /* 0 */) {
1603 device_printf(fc->bdev,
1604 "%s: fwdev->speed(%s) decremented due to negotiation\n",
1605 __func__, linkspeed[fwdev->speed]);
1606 fwdev->speed--;
1614 * fc->devices TAILQ, then we will add it.
1617 STAILQ_FOREACH(tfwdev, &fc->devices, link) {
1618 if (tfwdev->eui.hi > fwdev->eui.hi ||
1619 (tfwdev->eui.hi == fwdev->eui.hi &&
1620 tfwdev->eui.lo > fwdev->eui.lo))
1625 STAILQ_INSERT_HEAD(&fc->devices, fwdev, link);
1627 STAILQ_INSERT_AFTER(&fc->devices, pfwdev, fwdev, link);
1629 fwdev->dst = node;
1630 fwdev->status = FWDEVINIT;
1632 if (bcmp(&csr[0], &fwdev->csrrom[0], sizeof(uint32_t) * 5) == 0) {
1634 device_printf(fc->dev,
1640 bzero(&fwdev->csrrom[0], CROMSIZE);
1643 bcopy(&csr[0], &fwdev->csrrom[0], sizeof(uint32_t) * 5);
1644 fwdev->rommax = CSRROMOFF + sizeof(uint32_t) * 4;
1650 device_printf(fc->dev, "%s: explore csrblock failed err(%d)\n",
1652 fwdev->status = FWDEVINVAL;
1653 fwdev->csrrom[0] = 0;
1668 for (i = 0; i < fc->topology_map->self_id_count; i++) {
1669 s = &fc->topology_map->self_id[i];
1670 if (s->p0.sequel)
1672 if (s->p0.phy_id == node)
1693 for (node = 0; node <= fc->max_node; node++) {
1695 if (node == fc->nodeid) {
1697 device_printf(fc->bdev, "%s:"
1698 "found myself node(%d) fc->nodeid(%d) fc->max_node(%d)\n",
1699 __func__, node, fc->nodeid, fc->max_node);
1702 device_printf(fc->bdev, "%s:"
1703 "node(%d) fc->max_node(%d) found\n",
1704 __func__, node, fc->max_node);
1707 if (!fwsid || !fwsid->p0.link_active) {
1709 device_printf(fc->bdev,
1726 device_printf(fc->bdev,
1742 mtx_lock(&fc->wait_lock);
1743 while (fc->status != FWBUSDETACH) {
1744 if (fc->status == FWBUSEXPLORE) {
1745 mtx_unlock(&fc->wait_lock);
1747 fc->status = FWBUSEXPDONE;
1751 mtx_lock(&fc->wait_lock);
1753 msleep((void *)fc, &fc->wait_lock, PWAIT|PCATCH, "-", 0);
1755 mtx_unlock(&fc->wait_lock);
1760 * To attach sub-devices layer onto IEEE1394 bus.
1771 for (fwdev = STAILQ_FIRST(&fc->devices); fwdev != NULL; fwdev = next) {
1773 if (fwdev->status == FWDEVINIT) {
1774 fwdev->status = FWDEVATTACHED;
1775 } else if (fwdev->status == FWDEVINVAL) {
1776 fwdev->rcnt++;
1778 device_printf(fc->bdev, "%s:"
1779 "fwdev->rcnt(%d), hold_count(%d)\n",
1780 __func__, fwdev->rcnt, hold_count);
1781 if (fwdev->rcnt > hold_count) {
1786 STAILQ_REMOVE(&fc->devices, fwdev, fw_device,
1793 err = device_get_children(fc->bdev, &devlistp, &devcnt);
1798 if (fdc->post_explore != NULL)
1799 fdc->post_explore(fdc);
1818 dst = xfer->send.hdr.mode.hdr.dst & 0x3f;
1820 mtx_lock(&fc->tlabel_lock);
1821 new_tlabel = (fc->last_tlabel[dst] + 1) & 0x3f;
1822 STAILQ_FOREACH(txfer, &fc->tlabels[new_tlabel], tlabel)
1823 if ((txfer->send.hdr.mode.hdr.dst & 0x3f) == dst)
1826 fc->last_tlabel[dst] = new_tlabel;
1827 STAILQ_INSERT_TAIL(&fc->tlabels[new_tlabel], xfer, tlabel);
1828 mtx_unlock(&fc->tlabel_lock);
1830 xfer->tl = new_tlabel;
1831 xfer->send.hdr.mode.hdr.tlrt = new_tlabel << 2;
1836 mtx_unlock(&fc->tlabel_lock);
1841 return (-1);
1852 rb->xfer->recv.spd = rb->spd;
1854 pkt = (struct fw_pkt *)rb->vec->iov_base;
1855 tinfo = &rb->fc->tcode[pkt->mode.hdr.tcode];
1858 p = (u_char *)&rb->xfer->recv.hdr;
1859 bcopy(rb->vec->iov_base, p, tinfo->hdr_len);
1860 rb->vec->iov_base = (u_char *)rb->vec->iov_base + tinfo->hdr_len;
1861 rb->vec->iov_len -= tinfo->hdr_len;
1864 p = (u_char *)rb->xfer->recv.payload;
1865 res = rb->xfer->recv.pay_len;
1868 if (pkt->mode.hdr.tcode == FWTCODE_RRESQ &&
1870 *(uint32_t *)p = pkt->mode.rresq.data;
1871 rb->xfer->recv.pay_len = sizeof(uint32_t);
1875 if ((tinfo->flag & FWTI_BLOCK_ASY) == 0)
1878 plen = pkt->mode.rresb.len;
1880 for (i = 0; i < rb->nvec; i++, rb->vec++) {
1881 len = MIN(rb->vec->iov_len, plen);
1883 device_printf(rb->fc->bdev, "%s:"
1885 __func__, rb->xfer->recv.pay_len, len - res);
1888 bcopy(rb->vec->iov_base, p, len);
1890 res -= len;
1891 plen -= len;
1895 rb->xfer->recv.pay_len -= res;
1922 fp = (struct fw_pkt *)rb->vec[0].iov_base;
1923 tcode = fp->mode.common.tcode;
1929 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
1930 fp->mode.hdr.tlrt >> 2, fp->mode.hdr.tcode);
1931 if (rb->xfer == NULL) {
1932 device_printf(rb->fc->bdev, "%s: unknown response "
1936 fp->mode.hdr.src,
1937 fp->mode.hdr.tlrt >> 2,
1938 fp->mode.hdr.tlrt & 3,
1939 fp->mode.rresq.data);
1941 printf("try ad-hoc work around!!\n");
1942 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
1943 (fp->mode.hdr.tlrt >> 2)^3);
1944 if (rb->xfer == NULL) {
1953 if (rb->xfer->recv.hdr.mode.wres.rtcode != RESP_CMP)
1954 rb->xfer->resp = EIO;
1956 rb->xfer->resp = 0;
1958 oldstate = rb->xfer->flag;
1959 rb->xfer->flag = FWXF_RCVD;
1962 fw_xfer_done(rb->xfer);
1967 printf("not sent yet tl=%x\n", rb->xfer->tl);
1971 device_printf(rb->fc->bdev, "%s: "
1972 "unexpected flag 0x%02x\n", __func__,
1973 rb->xfer->flag);
1981 bind = fw_bindlookup(rb->fc, fp->mode.rreqq.dest_hi,
1982 fp->mode.rreqq.dest_lo);
1984 device_printf(rb->fc->bdev, "%s: "
1988 fp->mode.wreqq.dest_hi,
1989 fp->mode.wreqq.dest_lo,
1991 fp->mode.hdr.src,
1992 ntohl(fp->mode.wreqq.data));
1994 if (rb->fc->status == FWBUSINIT) {
1995 device_printf(rb->fc->bdev,
2000 rb->xfer = fw_xfer_alloc(M_FWXFER);
2001 if (rb->xfer == NULL) {
2004 rb->xfer->send.spd = rb->spd;
2005 rb->xfer->send.pay_len = 0;
2006 resfp = &rb->xfer->send.hdr;
2010 resfp->mode.hdr.tcode = FWTCODE_WRES;
2013 resfp->mode.hdr.tcode = FWTCODE_RRESQ;
2016 resfp->mode.hdr.tcode = FWTCODE_RRESB;
2019 resfp->mode.hdr.tcode = FWTCODE_LRES;
2022 resfp->mode.hdr.dst = fp->mode.hdr.src;
2023 resfp->mode.hdr.tlrt = fp->mode.hdr.tlrt;
2024 resfp->mode.hdr.pri = fp->mode.hdr.pri;
2025 resfp->mode.rresb.rtcode = RESP_ADDRESS_ERROR;
2026 resfp->mode.rresb.extcode = 0;
2027 resfp->mode.rresb.len = 0;
2029 rb->xfer->hand = fw_xferwake;
2031 rb->xfer->hand = fw_xfer_free;
2032 if (fw_asyreq(rb->fc, -1, rb->xfer))
2033 fw_xfer_free(rb->xfer);
2038 for (i = 0; i < rb->nvec; i++)
2039 len += rb->vec[i].iov_len;
2041 rb->xfer = STAILQ_FIRST(&bind->xferlist);
2042 if (rb->xfer == NULL) {
2043 device_printf(rb->fc->bdev, "%s: "
2047 STAILQ_REMOVE_HEAD(&bind->xferlist, link);
2049 rb->xfer->hand(rb->xfer);
2056 xferq = rb->fc->ir[sub];
2061 if (xferq->queued >= xferq->maxq) {
2066 per packet mode */
2067 rb->xfer = fw_xfer_alloc_buf(M_FWXFER, 0, /* XXX */
2069 if (rb->xfer == NULL)
2073 xferq->queued++;
2074 STAILQ_INSERT_TAIL(&xferq->q, rb->xfer, link);
2076 sc = device_get_softc(rb->fc->bdev);
2077 if (SEL_WAITING(&xferq->rsel))
2078 selwakeuppri(&xferq->rsel, FWPRI);
2079 if (xferq->flag & FWXFERQ_WAKEUP) {
2080 xferq->flag &= ~FWXFERQ_WAKEUP;
2083 if (xferq->flag & FWXFERQ_HANDLER) {
2084 xferq->hand(xferq);
2091 device_printf(rb->fc->bdev,"%s: unknown tcode %d\n",
2108 fc = xfer->fc;
2109 if (xfer->resp != 0)
2111 if (xfer->recv.payload == NULL)
2113 if (xfer->recv.hdr.mode.lres.rtcode != FWRCODE_COMPLETE)
2116 bmr = ntohl(xfer->recv.payload[0]);
2118 bmr = fc->nodeid;
2120 CSRARC(fc, BUS_MGR_ID) = fc->set_bmr(fc, bmr & 0x3f);
2126 device_printf(fc->bdev, "bus manager election failed\n");
2145 xfer->send.spd = 0;
2146 fc->status = FWBUSMGRELECT;
2148 fp = &xfer->send.hdr;
2149 fp->mode.lreq.dest_hi = 0xffff;
2150 fp->mode.lreq.tlrt = 0;
2151 fp->mode.lreq.tcode = FWTCODE_LREQ;
2152 fp->mode.lreq.pri = 0;
2153 fp->mode.lreq.src = 0;
2154 fp->mode.lreq.len = 8;
2155 fp->mode.lreq.extcode = EXTCODE_CMP_SWAP;
2156 fp->mode.lreq.dst = FWLOCALBUS | fc->irm;
2157 fp->mode.lreq.dest_lo = 0xf0000000 | BUS_MGR_ID;
2158 xfer->send.payload[0] = htonl(0x3f);
2159 xfer->send.payload[1] = htonl(fc->nodeid);
2160 xfer->hand = fw_try_bmr_callback;
2162 err = fw_asyreq(fc, -1, xfer);
2179 uint32_t *ld = (uint32_t *)xfer->recv.buf;
2182 xfer->spd, xfer->recv.len, ntohl(ld[0]), ntohl(ld[1]), ntohl(ld[2]),
2186 if (xfer->resp != 0) {
2190 if (xfer->recv.buf == NULL) {
2194 rfp = (struct fw_pkt *)xfer->recv.buf;
2195 switch (rfp->mode.hdr.tcode) {
2198 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2199 xfer->send.len = 12;
2200 sfp = (struct fw_pkt *)xfer->send.buf;
2201 bcopy(rfp->mode.wreqb.payload,
2202 (caddr_t)ntohl(rfp->mode.wreqb.dest_lo),s
2203 ntohs(rfp->mode.wreqb.len));
2204 sfp->mode.wres.tcode = FWTCODE_WRES;
2205 sfp->mode.wres.rtcode = 0;
2208 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2209 xfer->send.len = 12;
2210 sfp->mode.wres.tcode = FWTCODE_WRES;
2211 *((uint32_t *)(ntohl(rfp->mode.wreqb.dest_lo))) =
2212 rfp->mode.wreqq.data;
2213 sfp->mode.wres.rtcode = 0;
2216 xfer->send.buf = malloc(16 + rfp->mode.rreqb.len,
2218 xfer->send.len = 16 + ntohs(rfp->mode.rreqb.len);
2219 sfp = (struct fw_pkt *)xfer->send.buf;
2220 bcopy((caddr_t)ntohl(rfp->mode.rreqb.dest_lo),
2221 sfp->mode.rresb.payload,
2222 ntohs(rfp->mode.rreqb.len));
2223 sfp->mode.rresb.tcode = FWTCODE_RRESB;
2224 sfp->mode.rresb.len = rfp->mode.rreqb.len;
2225 sfp->mode.rresb.rtcode = 0;
2226 sfp->mode.rresb.extcode = 0;
2229 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
2230 xfer->send.len = 16;
2231 sfp = (struct fw_pkt *)xfer->send.buf;
2232 sfp->mode.rresq.data =
2233 *(uint32_t *)(ntohl(rfp->mode.rreqq.dest_lo));
2234 sfp->mode.wres.tcode = FWTCODE_RRESQ;
2235 sfp->mode.rresb.rtcode = 0;
2241 sfp->mode.hdr.dst = rfp->mode.hdr.src;
2242 xfer->dst = ntohs(rfp->mode.hdr.src);
2243 xfer->hand = fw_xfer_free;
2245 sfp->mode.hdr.tlrt = rfp->mode.hdr.tlrt;
2246 sfp->mode.hdr.pri = 0;
2248 fw_asyreq(xfer->fc, -1, xfer);
2255 * CRC16 check-sum for IEEE1394 register blocks.
2264 for (shift = 28; shift >= 0; shift -= 4) {
2288 self_id = fw_find_self_id(fc, fc->max_node);
2289 if (fc->max_node > 0) {
2291 if (self_id->p0.link_active && self_id->p0.contender)
2292 cmstr = fc->max_node;
2294 device_printf(fc->bdev,
2297 cmstr = fc->nodeid;
2301 cmstr = -1;
2303 device_printf(fc->bdev, "bus manager %d %s\n",
2305 (CSRARC(fc, BUS_MGR_ID) != fc->nodeid) ? "(me)" : "");
2306 if (CSRARC(fc, BUS_MGR_ID) != fc->nodeid) {
2312 if (fc->max_hop <= MAX_GAPHOP)
2313 fw_phy_config(fc, cmstr, gap_cnt[fc->max_hop]);
2315 if (cmstr == fc->nodeid || cmstr == -1)
2340 xferqa = &fc->it[0];
2342 xferqa = &fc->ir[0];
2345 for (i = 0; i < fc->nisodma; i++) {
2347 if ((xferq->flag & FWXFERQ_OPEN) == 0) {
2348 xferq->flag |= FWXFERQ_OPEN;
2352 if (i == fc->nisodma) {
2354 i = -1;
2361 fw_modevent(module_t mode, int type, void *data)