Deleted Added
full compact
firewire.c (110193) firewire.c (110195)
1/*
2 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
1/*
2 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 * $FreeBSD: head/sys/dev/firewire/firewire.c 110193 2003-02-01 14:42:49Z simokawa $
33 * $FreeBSD: head/sys/dev/firewire/firewire.c 110195 2003-02-01 15:04:33Z simokawa $
34 *
35 */
36
37#include <sys/param.h>
38#include <sys/systm.h>
39#include <sys/types.h>
40#include <sys/mbuf.h>
41#include <sys/socket.h>

--- 18 unchanged lines hidden (view full) ---

60
61int firewire_debug=0, try_bmr=1;
62SYSCTL_INT(_debug, OID_AUTO, firewire_debug, CTLFLAG_RW, &firewire_debug, 0,
63 "FireWire driver debug flag");
64SYSCTL_NODE(_hw, OID_AUTO, firewire, CTLFLAG_RD, 0, "FireWire Subsystem");
65SYSCTL_INT(_hw_firewire, OID_AUTO, try_bmr, CTLFLAG_RW, &try_bmr, 0,
66 "Try to be a bus manager");
67
34 *
35 */
36
37#include <sys/param.h>
38#include <sys/systm.h>
39#include <sys/types.h>
40#include <sys/mbuf.h>
41#include <sys/socket.h>

--- 18 unchanged lines hidden (view full) ---

60
61int firewire_debug=0, try_bmr=1;
62SYSCTL_INT(_debug, OID_AUTO, firewire_debug, CTLFLAG_RW, &firewire_debug, 0,
63 "FireWire driver debug flag");
64SYSCTL_NODE(_hw, OID_AUTO, firewire, CTLFLAG_RD, 0, "FireWire Subsystem");
65SYSCTL_INT(_hw_firewire, OID_AUTO, try_bmr, CTLFLAG_RW, &try_bmr, 0,
66 "Try to be a bus manager");
67
68MALLOC_DEFINE(M_FW, "firewire", "FireWire");
69
68#define FW_MAXASYRTY 4
69#define FW_MAXDEVRCNT 4
70
71#define XFER_TIMEOUT 0
72
73devclass_t firewire_devclass;
74
75static int firewire_match __P((device_t));

--- 353 unchanged lines hidden (view full) ---

429 destroy_dev(sc->dev[j]);
430 }
431#endif
432 /* XXX xfree_free and untimeout on all xfers */
433 callout_stop(&sc->fc->timeout_callout);
434 callout_stop(&sc->fc->bmr_callout);
435 callout_stop(&sc->fc->retry_probe_callout);
436 callout_stop(&sc->fc->busprobe_callout);
70#define FW_MAXASYRTY 4
71#define FW_MAXDEVRCNT 4
72
73#define XFER_TIMEOUT 0
74
75devclass_t firewire_devclass;
76
77static int firewire_match __P((device_t));

--- 353 unchanged lines hidden (view full) ---

431 destroy_dev(sc->dev[j]);
432 }
433#endif
434 /* XXX xfree_free and untimeout on all xfers */
435 callout_stop(&sc->fc->timeout_callout);
436 callout_stop(&sc->fc->bmr_callout);
437 callout_stop(&sc->fc->retry_probe_callout);
438 callout_stop(&sc->fc->busprobe_callout);
437 free(sc->fc->topology_map, M_DEVBUF);
438 free(sc->fc->speed_map, M_DEVBUF);
439 free(sc->fc->topology_map, M_FW);
440 free(sc->fc->speed_map, M_FW);
439 bus_generic_detach(dev);
440 return(0);
441}
442#if 0
443static int
444firewire_shutdown( device_t dev )
445{
446 return 0;

--- 158 unchanged lines hidden (view full) ---

605
606 for( i = 0 ; i < fc->nisodma ; i++){
607 fc->ir[i]->maxq = FWMAXQUEUE;
608 fc->it[i]->maxq = FWMAXQUEUE;
609 }
610/* Initialize csr registers */
611 fc->topology_map = (struct fw_topology_map *)malloc(
612 sizeof(struct fw_topology_map),
441 bus_generic_detach(dev);
442 return(0);
443}
444#if 0
445static int
446firewire_shutdown( device_t dev )
447{
448 return 0;

--- 158 unchanged lines hidden (view full) ---

607
608 for( i = 0 ; i < fc->nisodma ; i++){
609 fc->ir[i]->maxq = FWMAXQUEUE;
610 fc->it[i]->maxq = FWMAXQUEUE;
611 }
612/* Initialize csr registers */
613 fc->topology_map = (struct fw_topology_map *)malloc(
614 sizeof(struct fw_topology_map),
613 M_DEVBUF, M_NOWAIT | M_ZERO);
615 M_FW, M_NOWAIT | M_ZERO);
614 fc->speed_map = (struct fw_speed_map *)malloc(
615 sizeof(struct fw_speed_map),
616 fc->speed_map = (struct fw_speed_map *)malloc(
617 sizeof(struct fw_speed_map),
616 M_DEVBUF, M_NOWAIT | M_ZERO);
618 M_FW, M_NOWAIT | M_ZERO);
617 CSRARC(fc, TOPO_MAP) = 0x3f1 << 16;
618 CSRARC(fc, TOPO_MAP + 4) = 1;
619 CSRARC(fc, SPED_MAP) = 0x3f1 << 16;
620 CSRARC(fc, SPED_MAP + 4) = 1;
621
622 STAILQ_INIT(&fc->devices);
623 STAILQ_INIT(&fc->pending);
624
625/* Initialize csr ROM work space */
626 SLIST_INIT(&fc->ongocsr);
627 SLIST_INIT(&fc->csrfree);
628 for( i = 0 ; i < FWMAXCSRDIR ; i++){
619 CSRARC(fc, TOPO_MAP) = 0x3f1 << 16;
620 CSRARC(fc, TOPO_MAP + 4) = 1;
621 CSRARC(fc, SPED_MAP) = 0x3f1 << 16;
622 CSRARC(fc, SPED_MAP + 4) = 1;
623
624 STAILQ_INIT(&fc->devices);
625 STAILQ_INIT(&fc->pending);
626
627/* Initialize csr ROM work space */
628 SLIST_INIT(&fc->ongocsr);
629 SLIST_INIT(&fc->csrfree);
630 for( i = 0 ; i < FWMAXCSRDIR ; i++){
629 csrd = (struct csrdir *) malloc(sizeof(struct csrdir), M_DEVBUF,M_NOWAIT);
631 csrd = (struct csrdir *) malloc(sizeof(struct csrdir), M_FW,M_NOWAIT);
630 if(csrd == NULL) break;
631 SLIST_INSERT_HEAD(&fc->csrfree, csrd, link);
632 }
633
634/* Initialize Async handlers */
635 STAILQ_INIT(&fc->binds);
636 for( i = 0 ; i < 0x40 ; i++){
637 STAILQ_INIT(&fc->tlabels[i]);

--- 14 unchanged lines hidden (view full) ---

652 }
653#endif
654
655
656#ifdef FW_VMACCESS
657 xfer = fw_xfer_alloc();
658 if(xfer == NULL) return;
659
632 if(csrd == NULL) break;
633 SLIST_INSERT_HEAD(&fc->csrfree, csrd, link);
634 }
635
636/* Initialize Async handlers */
637 STAILQ_INIT(&fc->binds);
638 for( i = 0 ; i < 0x40 ; i++){
639 STAILQ_INIT(&fc->tlabels[i]);

--- 14 unchanged lines hidden (view full) ---

654 }
655#endif
656
657
658#ifdef FW_VMACCESS
659 xfer = fw_xfer_alloc();
660 if(xfer == NULL) return;
661
660 fwb = (struct fw_bind *)malloc(sizeof (struct fw_bind), M_DEVBUF, M_NOWAIT);
662 fwb = (struct fw_bind *)malloc(sizeof (struct fw_bind), M_FW, M_NOWAIT);
661 if(fwb == NULL){
662 fw_xfer_free(xfer);
663 }
664 xfer->act.hand = fw_vmaccess;
665 xfer->act_type = FWACT_XFER;
666 xfer->fc = fc;
667 xfer->sc = NULL;
668

--- 98 unchanged lines hidden (view full) ---

767{
768 struct tlabel *tl;
769 int s = splfw();
770
771 for( tl = STAILQ_FIRST(&fc->tlabels[xfer->tl]); tl != NULL;
772 tl = STAILQ_NEXT(tl, link)){
773 if(tl->xfer == xfer){
774 STAILQ_REMOVE(&fc->tlabels[xfer->tl], tl, tlabel, link);
663 if(fwb == NULL){
664 fw_xfer_free(xfer);
665 }
666 xfer->act.hand = fw_vmaccess;
667 xfer->act_type = FWACT_XFER;
668 xfer->fc = fc;
669 xfer->sc = NULL;
670

--- 98 unchanged lines hidden (view full) ---

769{
770 struct tlabel *tl;
771 int s = splfw();
772
773 for( tl = STAILQ_FIRST(&fc->tlabels[xfer->tl]); tl != NULL;
774 tl = STAILQ_NEXT(tl, link)){
775 if(tl->xfer == xfer){
776 STAILQ_REMOVE(&fc->tlabels[xfer->tl], tl, tlabel, link);
775 free(tl, M_DEVBUF);
777 free(tl, M_FW);
776 splx(s);
777 return;
778 }
779 }
780 splx(s);
781 return;
782}
783

--- 22 unchanged lines hidden (view full) ---

806/*
807 * To allocate IEEE1394 XFER structure.
808 */
809struct fw_xfer *
810fw_xfer_alloc()
811{
812 struct fw_xfer *xfer;
813
778 splx(s);
779 return;
780 }
781 }
782 splx(s);
783 return;
784}
785

--- 22 unchanged lines hidden (view full) ---

808/*
809 * To allocate IEEE1394 XFER structure.
810 */
811struct fw_xfer *
812fw_xfer_alloc()
813{
814 struct fw_xfer *xfer;
815
814 xfer = malloc(sizeof(struct fw_xfer), M_DEVBUF, M_NOWAIT | M_ZERO);
816 xfer = malloc(sizeof(struct fw_xfer), M_FW, M_NOWAIT | M_ZERO);
815 if (xfer == NULL)
816 return xfer;
817
818 xfer->time = time_second;
819 xfer->sub = -1;
820
821 return xfer;
822}

--- 43 unchanged lines hidden (view full) ---

866 printf("fw_xfer_free FWXF_START\n");
867#endif
868 s = splfw();
869 xfer->q->drain(xfer->fc, xfer);
870 splx(s);
871 }
872 }
873 if(xfer->send.buf != NULL){
817 if (xfer == NULL)
818 return xfer;
819
820 xfer->time = time_second;
821 xfer->sub = -1;
822
823 return xfer;
824}

--- 43 unchanged lines hidden (view full) ---

868 printf("fw_xfer_free FWXF_START\n");
869#endif
870 s = splfw();
871 xfer->q->drain(xfer->fc, xfer);
872 splx(s);
873 }
874 }
875 if(xfer->send.buf != NULL){
874 free(xfer->send.buf, M_DEVBUF);
876 free(xfer->send.buf, M_FW);
875 }
876 if(xfer->recv.buf != NULL){
877 }
878 if(xfer->recv.buf != NULL){
877 free(xfer->recv.buf, M_DEVBUF);
879 free(xfer->recv.buf, M_FW);
878 }
879 if(xfer->fc != NULL){
880 fw_tl_free(xfer->fc, xfer);
881 }
880 }
881 if(xfer->fc != NULL){
882 fw_tl_free(xfer->fc, xfer);
883 }
882 free(xfer, M_DEVBUF);
884 free(xfer, M_FW);
883}
884
885static void
886fw_asy_callback_free(struct fw_xfer *xfer)
887{
888#if 0
889 printf("asyreq done state=%d resp=%d\n",
890 xfer->state, xfer->resp);

--- 18 unchanged lines hidden (view full) ---

909 xfer = fw_xfer_alloc();
910 xfer->send.len = 12;
911 xfer->send.off = 0;
912 xfer->fc = fc;
913 xfer->retry_req = fw_asybusy;
914 xfer->act.hand = fw_asy_callback_free;
915
916 xfer->send.buf = malloc(sizeof(u_int32_t),
885}
886
887static void
888fw_asy_callback_free(struct fw_xfer *xfer)
889{
890#if 0
891 printf("asyreq done state=%d resp=%d\n",
892 xfer->state, xfer->resp);

--- 18 unchanged lines hidden (view full) ---

911 xfer = fw_xfer_alloc();
912 xfer->send.len = 12;
913 xfer->send.off = 0;
914 xfer->fc = fc;
915 xfer->retry_req = fw_asybusy;
916 xfer->act.hand = fw_asy_callback_free;
917
918 xfer->send.buf = malloc(sizeof(u_int32_t),
917 M_DEVBUF, M_NOWAIT | M_ZERO);
919 M_FW, M_NOWAIT | M_ZERO);
918 fp = (struct fw_pkt *)xfer->send.buf;
919 fp->mode.ld[1] = 0;
920 if (root_node >= 0)
921 fp->mode.ld[1] |= htonl((root_node & 0x3f) << 24 | 1 << 23);
922 if (gap_count >= 0)
923 fp->mode.ld[1] |= htonl(1 << 22 | (gap_count & 0x3f) << 16);
924 fp->mode.ld[2] = ~fp->mode.ld[1];
925/* XXX Dangerous, how to pass PHY packet to device driver */

--- 135 unchanged lines hidden (view full) ---

1061 }
1062 } else {
1063 fc->status = FWBUSMGRDONE;
1064#if 0
1065 device_printf(fc->bdev, "BMR = %x\n",
1066 CSRARC(fc, BUS_MGR_ID));
1067#endif
1068 }
920 fp = (struct fw_pkt *)xfer->send.buf;
921 fp->mode.ld[1] = 0;
922 if (root_node >= 0)
923 fp->mode.ld[1] |= htonl((root_node & 0x3f) << 24 | 1 << 23);
924 if (gap_count >= 0)
925 fp->mode.ld[1] |= htonl(1 << 22 | (gap_count & 0x3f) << 16);
926 fp->mode.ld[2] = ~fp->mode.ld[1];
927/* XXX Dangerous, how to pass PHY packet to device driver */

--- 135 unchanged lines hidden (view full) ---

1063 }
1064 } else {
1065 fc->status = FWBUSMGRDONE;
1066#if 0
1067 device_printf(fc->bdev, "BMR = %x\n",
1068 CSRARC(fc, BUS_MGR_ID));
1069#endif
1070 }
1069 free(buf, M_DEVBUF);
1071 free(buf, M_FW);
1070 if(fc->irm == ((CSRARC(fc, NODE_IDS) >> 16 ) & 0x3f)){
1071 /* I am BMGR */
1072 fw_bmr(fc);
1073 }
1074 callout_reset(&fc->busprobe_callout, hz/4,
1075 (void *)fw_bus_probe, (void *)fc);
1076}
1077

--- 18 unchanged lines hidden (view full) ---

1096 next = STAILQ_NEXT(fwdev, link);
1097 if (fwdev->status != FWDEVINVAL) {
1098 fwdev->status = FWDEVINVAL;
1099 fwdev->rcnt = 0;
1100 } else if(fwdev->rcnt < FW_MAXDEVRCNT) {
1101 fwdev->rcnt ++;
1102 } else {
1103 STAILQ_REMOVE(&fc->devices, fwdev, fw_device, link);
1072 if(fc->irm == ((CSRARC(fc, NODE_IDS) >> 16 ) & 0x3f)){
1073 /* I am BMGR */
1074 fw_bmr(fc);
1075 }
1076 callout_reset(&fc->busprobe_callout, hz/4,
1077 (void *)fw_bus_probe, (void *)fc);
1078}
1079

--- 18 unchanged lines hidden (view full) ---

1098 next = STAILQ_NEXT(fwdev, link);
1099 if (fwdev->status != FWDEVINVAL) {
1100 fwdev->status = FWDEVINVAL;
1101 fwdev->rcnt = 0;
1102 } else if(fwdev->rcnt < FW_MAXDEVRCNT) {
1103 fwdev->rcnt ++;
1104 } else {
1105 STAILQ_REMOVE(&fc->devices, fwdev, fw_device, link);
1104 free(fwdev, M_DEVBUF);
1106 free(fwdev, M_FW);
1105 }
1106 }
1107 fc->ongonode = 0;
1108 fc->ongoaddr = CSRROMOFF;
1109 fc->ongodev = NULL;
1110 fc->ongoeui.hi = 0xffffffff; fc->ongoeui.lo = 0xffffffff;
1111 fw_bus_explore(fc);
1112 splx(s);

--- 47 unchanged lines hidden (view full) ---

1160 fwdev->dst = fc->ongonode;
1161 fwdev->status = FWDEVATTACHED;
1162 fc->ongonode++;
1163 fc->ongoaddr = CSRROMOFF;
1164 fc->ongodev = NULL;
1165 fc->ongoeui.hi = 0xffffffff; fc->ongoeui.lo = 0xffffffff;
1166 goto loop;
1167 }
1107 }
1108 }
1109 fc->ongonode = 0;
1110 fc->ongoaddr = CSRROMOFF;
1111 fc->ongodev = NULL;
1112 fc->ongoeui.hi = 0xffffffff; fc->ongoeui.lo = 0xffffffff;
1113 fw_bus_explore(fc);
1114 splx(s);

--- 47 unchanged lines hidden (view full) ---

1162 fwdev->dst = fc->ongonode;
1163 fwdev->status = FWDEVATTACHED;
1164 fc->ongonode++;
1165 fc->ongoaddr = CSRROMOFF;
1166 fc->ongodev = NULL;
1167 fc->ongoeui.hi = 0xffffffff; fc->ongoeui.lo = 0xffffffff;
1168 goto loop;
1169 }
1168 fwdev = malloc(sizeof(struct fw_device), M_DEVBUF, M_NOWAIT);
1170 fwdev = malloc(sizeof(struct fw_device), M_FW, M_NOWAIT);
1169 if(fwdev == NULL)
1170 return;
1171 fwdev->fc = fc;
1172 fwdev->rommax = 0;
1173 fwdev->dst = fc->ongonode;
1174 fwdev->eui.hi = fc->ongoeui.hi; fwdev->eui.lo = fc->ongoeui.lo;
1175 fwdev->status = FWDEVINIT;
1176#if 0

--- 33 unchanged lines hidden (view full) ---

1210 if(xfer == NULL) goto done;
1211#else
1212 xfer = fw_xfer_alloc();
1213 if(xfer == NULL){
1214 goto done;
1215 }
1216 xfer->send.len = 16;
1217 xfer->spd = 0;
1171 if(fwdev == NULL)
1172 return;
1173 fwdev->fc = fc;
1174 fwdev->rommax = 0;
1175 fwdev->dst = fc->ongonode;
1176 fwdev->eui.hi = fc->ongoeui.hi; fwdev->eui.lo = fc->ongoeui.lo;
1177 fwdev->status = FWDEVINIT;
1178#if 0

--- 33 unchanged lines hidden (view full) ---

1212 if(xfer == NULL) goto done;
1213#else
1214 xfer = fw_xfer_alloc();
1215 if(xfer == NULL){
1216 goto done;
1217 }
1218 xfer->send.len = 16;
1219 xfer->spd = 0;
1218 xfer->send.buf = malloc(16, M_DEVBUF, M_NOWAIT);
1220 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
1219 if(xfer->send.buf == NULL){
1220 fw_xfer_free( xfer);
1221 return;
1222 }
1223
1224 xfer->send.off = 0;
1225 fp = (struct fw_pkt *)xfer->send.buf;
1226 fp->mode.rreqq.dest_hi = htons(0xffff);

--- 34 unchanged lines hidden (view full) ---

1261 int err;
1262
1263 xfer = fw_xfer_alloc();
1264 if(xfer == NULL){
1265 return NULL;
1266 }
1267 xfer->send.len = 16;
1268 xfer->spd = spd; /* XXX:min(spd, fc->spd) */
1221 if(xfer->send.buf == NULL){
1222 fw_xfer_free( xfer);
1223 return;
1224 }
1225
1226 xfer->send.off = 0;
1227 fp = (struct fw_pkt *)xfer->send.buf;
1228 fp->mode.rreqq.dest_hi = htons(0xffff);

--- 34 unchanged lines hidden (view full) ---

1263 int err;
1264
1265 xfer = fw_xfer_alloc();
1266 if(xfer == NULL){
1267 return NULL;
1268 }
1269 xfer->send.len = 16;
1270 xfer->spd = spd; /* XXX:min(spd, fc->spd) */
1269 xfer->send.buf = malloc(16, M_DEVBUF, M_NOWAIT);
1271 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
1270 if(xfer->send.buf == NULL){
1271 fw_xfer_free( xfer);
1272 return NULL;
1273 }
1274
1275 xfer->send.off = 0;
1276 fp = (struct fw_pkt *)xfer->send.buf;
1277 fp->mode.rreqq.dest_hi = htons(addr_hi & 0xffff);

--- 312 unchanged lines hidden (view full) ---

1590 s = splfw();
1591 for( i = 0 ; i < 0x40 ; i ++){
1592 label = (label + 1) & 0x3f;
1593 for(tmptl = STAILQ_FIRST(&fc->tlabels[label]);
1594 tmptl != NULL; tmptl = STAILQ_NEXT(tmptl, link)){
1595 if(tmptl->xfer->dst == xfer->dst) break;
1596 }
1597 if(tmptl == NULL) {
1272 if(xfer->send.buf == NULL){
1273 fw_xfer_free( xfer);
1274 return NULL;
1275 }
1276
1277 xfer->send.off = 0;
1278 fp = (struct fw_pkt *)xfer->send.buf;
1279 fp->mode.rreqq.dest_hi = htons(addr_hi & 0xffff);

--- 312 unchanged lines hidden (view full) ---

1592 s = splfw();
1593 for( i = 0 ; i < 0x40 ; i ++){
1594 label = (label + 1) & 0x3f;
1595 for(tmptl = STAILQ_FIRST(&fc->tlabels[label]);
1596 tmptl != NULL; tmptl = STAILQ_NEXT(tmptl, link)){
1597 if(tmptl->xfer->dst == xfer->dst) break;
1598 }
1599 if(tmptl == NULL) {
1598 tl = malloc(sizeof(struct tlabel),M_DEVBUF,M_NOWAIT);
1600 tl = malloc(sizeof(struct tlabel),M_FW,M_NOWAIT);
1599 if (tl == NULL) {
1600 splx(s);
1601 return (-1);
1602 }
1603 tl->xfer = xfer;
1604 STAILQ_INSERT_TAIL(&fc->tlabels[label], tl, link);
1605 splx(s);
1606 return(label);

--- 98 unchanged lines hidden (view full) ---

1705 printf("fw_rcv: cannot response(bus reset)!\n");
1706 goto err;
1707 }
1708 xfer = fw_xfer_alloc();
1709 if(xfer == NULL){
1710 return;
1711 }
1712 xfer->spd = spd;
1601 if (tl == NULL) {
1602 splx(s);
1603 return (-1);
1604 }
1605 tl->xfer = xfer;
1606 STAILQ_INSERT_TAIL(&fc->tlabels[label], tl, link);
1607 splx(s);
1608 return(label);

--- 98 unchanged lines hidden (view full) ---

1707 printf("fw_rcv: cannot response(bus reset)!\n");
1708 goto err;
1709 }
1710 xfer = fw_xfer_alloc();
1711 if(xfer == NULL){
1712 return;
1713 }
1714 xfer->spd = spd;
1713 xfer->send.buf = malloc(16, M_DEVBUF, M_NOWAIT);
1715 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
1714 resfp = (struct fw_pkt *)xfer->send.buf;
1715 switch(fp->mode.common.tcode){
1716 case FWTCODE_WREQQ:
1717 case FWTCODE_WREQB:
1718 resfp->mode.hdr.tcode = FWTCODE_WRES;
1719 xfer->send.len = 12;
1720 break;
1721 case FWTCODE_RREQQ:

--- 111 unchanged lines hidden (view full) ---

1833 return;
1834 break;
1835 }
1836 default:
1837 printf("fw_rcv: unknow tcode\n");
1838 break;
1839 }
1840err:
1716 resfp = (struct fw_pkt *)xfer->send.buf;
1717 switch(fp->mode.common.tcode){
1718 case FWTCODE_WREQQ:
1719 case FWTCODE_WREQB:
1720 resfp->mode.hdr.tcode = FWTCODE_WRES;
1721 xfer->send.len = 12;
1722 break;
1723 case FWTCODE_RREQQ:

--- 111 unchanged lines hidden (view full) ---

1835 return;
1836 break;
1837 }
1838 default:
1839 printf("fw_rcv: unknow tcode\n");
1840 break;
1841 }
1842err:
1841 free(buf, M_DEVBUF);
1843 free(buf, M_FW);
1842}
1843
1844/*
1845 * Post process for Bus Manager election process.
1846 */
1847static void
1848fw_try_bmr_callback(struct fw_xfer *xfer)
1849{

--- 43 unchanged lines hidden (view full) ---

1893 int err = 0;
1894
1895 xfer = fw_xfer_alloc();
1896 if(xfer == NULL){
1897 return;
1898 }
1899 xfer->send.len = 24;
1900 xfer->spd = 0;
1844}
1845
1846/*
1847 * Post process for Bus Manager election process.
1848 */
1849static void
1850fw_try_bmr_callback(struct fw_xfer *xfer)
1851{

--- 43 unchanged lines hidden (view full) ---

1895 int err = 0;
1896
1897 xfer = fw_xfer_alloc();
1898 if(xfer == NULL){
1899 return;
1900 }
1901 xfer->send.len = 24;
1902 xfer->spd = 0;
1901 xfer->send.buf = malloc(24, M_DEVBUF, M_NOWAIT);
1903 xfer->send.buf = malloc(24, M_FW, M_NOWAIT);
1902 if(xfer->send.buf == NULL){
1903 fw_xfer_free( xfer);
1904 return;
1905 }
1906
1907 fc->status = FWBUSMGRELECT;
1908
1909 xfer->send.off = 0;

--- 41 unchanged lines hidden (view full) ---

1951 if(xfer->recv.buf == NULL){
1952 fw_xfer_free( xfer);
1953 return;
1954 }
1955 rfp = (struct fw_pkt *)xfer->recv.buf;
1956 switch(rfp->mode.hdr.tcode){
1957 /* XXX need fix for 64bit arch */
1958 case FWTCODE_WREQB:
1904 if(xfer->send.buf == NULL){
1905 fw_xfer_free( xfer);
1906 return;
1907 }
1908
1909 fc->status = FWBUSMGRELECT;
1910
1911 xfer->send.off = 0;

--- 41 unchanged lines hidden (view full) ---

1953 if(xfer->recv.buf == NULL){
1954 fw_xfer_free( xfer);
1955 return;
1956 }
1957 rfp = (struct fw_pkt *)xfer->recv.buf;
1958 switch(rfp->mode.hdr.tcode){
1959 /* XXX need fix for 64bit arch */
1960 case FWTCODE_WREQB:
1959 xfer->send.buf = malloc(12, M_DEVBUF, M_NOWAIT);
1961 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
1960 xfer->send.len = 12;
1961 sfp = (struct fw_pkt *)xfer->send.buf;
1962 bcopy(rfp->mode.wreqb.payload,
1963 (caddr_t)ntohl(rfp->mode.wreqb.dest_lo), ntohs(rfp->mode.wreqb.len));
1964 sfp->mode.wres.tcode = FWTCODE_WRES;
1965 sfp->mode.wres.rtcode = 0;
1966 break;
1967 case FWTCODE_WREQQ:
1962 xfer->send.len = 12;
1963 sfp = (struct fw_pkt *)xfer->send.buf;
1964 bcopy(rfp->mode.wreqb.payload,
1965 (caddr_t)ntohl(rfp->mode.wreqb.dest_lo), ntohs(rfp->mode.wreqb.len));
1966 sfp->mode.wres.tcode = FWTCODE_WRES;
1967 sfp->mode.wres.rtcode = 0;
1968 break;
1969 case FWTCODE_WREQQ:
1968 xfer->send.buf = malloc(12, M_DEVBUF, M_NOWAIT);
1970 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
1969 xfer->send.len = 12;
1970 sfp->mode.wres.tcode = FWTCODE_WRES;
1971 *((u_int32_t *)(ntohl(rfp->mode.wreqb.dest_lo))) = rfp->mode.wreqq.data;
1972 sfp->mode.wres.rtcode = 0;
1973 break;
1974 case FWTCODE_RREQB:
1971 xfer->send.len = 12;
1972 sfp->mode.wres.tcode = FWTCODE_WRES;
1973 *((u_int32_t *)(ntohl(rfp->mode.wreqb.dest_lo))) = rfp->mode.wreqq.data;
1974 sfp->mode.wres.rtcode = 0;
1975 break;
1976 case FWTCODE_RREQB:
1975 xfer->send.buf = malloc(16 + rfp->mode.rreqb.len, M_DEVBUF, M_NOWAIT);
1977 xfer->send.buf = malloc(16 + rfp->mode.rreqb.len, M_FW, M_NOWAIT);
1976 xfer->send.len = 16 + ntohs(rfp->mode.rreqb.len);
1977 sfp = (struct fw_pkt *)xfer->send.buf;
1978 bcopy((caddr_t)ntohl(rfp->mode.rreqb.dest_lo),
1979 sfp->mode.rresb.payload, (u_int16_t)ntohs(rfp->mode.rreqb.len));
1980 sfp->mode.rresb.tcode = FWTCODE_RRESB;
1981 sfp->mode.rresb.len = rfp->mode.rreqb.len;
1982 sfp->mode.rresb.rtcode = 0;
1983 sfp->mode.rresb.extcode = 0;
1984 break;
1985 case FWTCODE_RREQQ:
1978 xfer->send.len = 16 + ntohs(rfp->mode.rreqb.len);
1979 sfp = (struct fw_pkt *)xfer->send.buf;
1980 bcopy((caddr_t)ntohl(rfp->mode.rreqb.dest_lo),
1981 sfp->mode.rresb.payload, (u_int16_t)ntohs(rfp->mode.rreqb.len));
1982 sfp->mode.rresb.tcode = FWTCODE_RRESB;
1983 sfp->mode.rresb.len = rfp->mode.rreqb.len;
1984 sfp->mode.rresb.rtcode = 0;
1985 sfp->mode.rresb.extcode = 0;
1986 break;
1987 case FWTCODE_RREQQ:
1986 xfer->send.buf = malloc(16, M_DEVBUF, M_NOWAIT);
1988 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
1987 xfer->send.len = 16;
1988 sfp = (struct fw_pkt *)xfer->send.buf;
1989 sfp->mode.rresq.data = *(u_int32_t *)(ntohl(rfp->mode.rreqq.dest_lo));
1990 sfp->mode.wres.tcode = FWTCODE_RRESQ;
1991 sfp->mode.rresb.rtcode = 0;
1992 break;
1993 default:
1994 fw_xfer_free( xfer);

--- 68 unchanged lines hidden ---
1989 xfer->send.len = 16;
1990 sfp = (struct fw_pkt *)xfer->send.buf;
1991 sfp->mode.rresq.data = *(u_int32_t *)(ntohl(rfp->mode.rreqq.dest_lo));
1992 sfp->mode.wres.tcode = FWTCODE_RRESQ;
1993 sfp->mode.rresb.rtcode = 0;
1994 break;
1995 default:
1996 fw_xfer_free( xfer);

--- 68 unchanged lines hidden ---