Lines Matching refs:xfer

184 fw_asyreq(struct firewire_comm *fc, int sub, struct fw_xfer *xfer)
193 if (xfer == NULL)
195 if (xfer->hand == NULL) {
199 fp = &xfer->send.hdr;
213 xfer->resp = EAGAIN;
214 xfer->flag = FWXF_BUSY;
223 if (xfer->send.pay_len > MAXREC(fc->maxrec)) {
233 if (len != xfer->send.pay_len) {
235 len, xfer->send.pay_len, tcode_str[tcode], tcode);
249 xfer->tl = -1;
251 if (fw_get_tlabel(fc, xfer) < 0)
255 xfer->resp = 0;
256 xfer->fc = fc;
257 xfer->q = xferq;
259 fw_asystart(xfer);
267 fw_xferwake(struct fw_xfer *xfer)
269 struct mtx *lock = &xfer->fc->wait_lock;
272 xfer->flag |= FWXF_WAKE;
275 wakeup(xfer);
280 fw_xferwait(struct fw_xfer *xfer)
282 struct mtx *lock = &xfer->fc->wait_lock;
286 while ((xfer->flag & FWXF_WAKE) == 0)
287 err = msleep(xfer, lock, PWAIT|PCATCH, "fw_xferwait", 0);
294 * Async. request with given xfer structure.
297 fw_asystart(struct fw_xfer *xfer)
299 struct firewire_comm *fc = xfer->fc;
303 xfer->flag = FWXF_INQ;
304 STAILQ_INSERT_TAIL(&xfer->q->q, xfer, link);
306 xfer->q->queued++;
310 if (xfer->mbuf == NULL)
311 xfer->q->start(fc);
333 struct fw_xfer *xfer, *txfer;
348 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
349 if ((xfer->flag & FWXF_SENT) == 0)
352 if (timevalcmp(&xfer->tv, &tv, >))
357 i, xfer->flag);
358 fw_dump_hdr(&xfer->send.hdr, "send");
359 xfer->resp = ETIMEDOUT;
360 xfer->tl = -1;
362 STAILQ_INSERT_TAIL(&xfer_timeout, xfer, tlabel);
368 STAILQ_FOREACH_SAFE(xfer, &xfer_timeout, tlabel, txfer)
369 xfer->hand(xfer);
553 struct fw_xfer *xfer;
555 while ((xfer = STAILQ_FIRST(&xferq->q)) != NULL) {
560 xfer->resp = EAGAIN;
561 xfer->flag = FWXF_SENTERR;
562 fw_xfer_done(xfer);
569 struct fw_xfer *xfer, *txfer;
584 while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) {
586 printf("tl=%d flag=%d\n", i, xfer->flag);
587 xfer->tl = -1;
588 xfer->resp = EAGAIN;
590 STAILQ_INSERT_TAIL(&xfer_drain, xfer, tlabel);
594 STAILQ_FOREACH_SAFE(xfer, &xfer_drain, tlabel, txfer)
595 xfer->hand(xfer);
775 struct fw_xfer *xfer;
855 xfer = fw_xfer_alloc();
856 if (xfer == NULL)
861 fw_xfer_free(xfer);
864 xfer->hand = fw_vmaccess;
865 xfer->fc = fc;
866 xfer->sc = NULL;
871 fwb->xfer = xfer;
938 struct fw_xfer *xfer, *next;
958 for (xfer = STAILQ_FIRST(&fwb->xferlist); xfer != NULL; xfer = next) {
959 next = STAILQ_NEXT(xfer, link);
960 fw_xfer_free(xfer);
976 struct fw_xfer *xfer;
979 xfer = fw_xfer_alloc_buf(type, slen, rlen);
980 if (xfer == NULL)
982 xfer->fc = fc;
983 xfer->sc = sc;
984 xfer->hand = hand;
986 STAILQ_INSERT_TAIL(q, xfer, link);
995 struct fw_xfer *xfer, *next;
997 for (xfer = STAILQ_FIRST(q); xfer != NULL; xfer = next) {
998 next = STAILQ_NEXT(xfer, link);
999 fw_xfer_free_buf(xfer);
1021 fw_tl_free(struct firewire_comm *fc, struct fw_xfer *xfer)
1026 if (xfer->tl < 0) {
1031 STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel)
1032 if (txfer == xfer)
1035 printf("%s: the xfer is not in the queue "
1037 __FUNCTION__, xfer->tl, xfer->flag);
1038 fw_dump_hdr(&xfer->send.hdr, "send");
1039 fw_dump_hdr(&xfer->recv.hdr, "recv");
1045 STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel);
1046 xfer->tl = -1;
1057 struct fw_xfer *xfer;
1062 STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel)
1063 if (xfer->send.hdr.mode.hdr.dst == node) {
1066 KASSERT(xfer->tl == tlabel,
1067 ("xfer->tl 0x%x != 0x%x", xfer->tl, tlabel));
1069 req = xfer->send.hdr.mode.hdr.tcode;
1070 if (xfer->fc->tcode[req].valid_res != tcode) {
1079 return (xfer);
1094 struct fw_xfer *xfer;
1096 xfer = malloc(sizeof(struct fw_xfer), type, M_NOWAIT | M_ZERO);
1097 if (xfer == NULL)
1098 return xfer;
1100 xfer->malloc = type;
1101 xfer->tl = -1;
1103 return xfer;
1109 struct fw_xfer *xfer;
1111 xfer = fw_xfer_alloc(type);
1112 if (xfer == NULL)
1114 xfer->send.pay_len = send_len;
1115 xfer->recv.pay_len = recv_len;
1117 xfer->send.payload = malloc(send_len, type, M_NOWAIT | M_ZERO);
1118 if (xfer->send.payload == NULL) {
1119 fw_xfer_free(xfer);
1124 xfer->recv.payload = malloc(recv_len, type, M_NOWAIT);
1125 if (xfer->recv.payload == NULL) {
1126 if (xfer->send.payload != NULL)
1127 free(xfer->send.payload, type);
1128 fw_xfer_free(xfer);
1132 return (xfer);
1139 fw_xfer_done(struct fw_xfer *xfer)
1141 if (xfer->hand == NULL) {
1146 if (xfer->fc == NULL)
1147 panic("fw_xfer_done: why xfer->fc is NULL?");
1149 fw_tl_free(xfer->fc, xfer);
1150 xfer->hand(xfer);
1154 fw_xfer_unload(struct fw_xfer *xfer)
1157 if (xfer == NULL)
1160 if (xfer->fc != NULL) {
1161 FW_GLOCK(xfer->fc);
1162 if (xfer->flag & FWXF_INQ) {
1163 STAILQ_REMOVE(&xfer->q->q, xfer, fw_xfer, link);
1164 xfer->flag &= ~FWXF_INQ;
1166 xfer->q->queued--;
1169 FW_GUNLOCK(xfer->fc);
1173 * xfer after it's freed.
1175 fw_tl_free(xfer->fc, xfer);
1177 if (xfer->flag & FWXF_START)
1186 xfer->flag = FWXF_INIT;
1187 xfer->resp = 0;
1194 fw_xfer_free_buf(struct fw_xfer *xfer)
1196 if (xfer == NULL) {
1197 printf("%s: xfer == NULL\n", __func__);
1200 fw_xfer_unload(xfer);
1201 if (xfer->send.payload != NULL)
1202 free(xfer->send.payload, xfer->malloc);
1203 if (xfer->recv.payload != NULL)
1204 free(xfer->recv.payload, xfer->malloc);
1205 free(xfer, xfer->malloc);
1209 fw_xfer_free(struct fw_xfer *xfer)
1211 if (xfer == NULL) {
1212 printf("%s: xfer == NULL\n", __func__);
1215 fw_xfer_unload(xfer);
1216 free(xfer, xfer->malloc);
1220 fw_asy_callback_free(struct fw_xfer *xfer)
1224 xfer->flag, xfer->resp);
1226 fw_xfer_free(xfer);
1235 struct fw_xfer *xfer;
1240 xfer = fw_xfer_alloc(M_FWXFER);
1241 if (xfer == NULL)
1243 xfer->fc = fc;
1244 xfer->hand = fw_asy_callback_free;
1246 fp = &xfer->send.hdr;
1259 fw_asyreq(fc, -1, xfer);
1438 struct fw_xfer *xfer;
1443 xfer = fwmem_read_quad(fwdev, NULL, -1, 0xffff,
1445 if (xfer == NULL)
1447 fw_xferwait(xfer);
1449 if (xfer->resp == 0)
1452 error = xfer->resp;
1453 fw_xfer_free(xfer);
1813 fw_get_tlabel(struct firewire_comm *fc, struct fw_xfer *xfer)
1819 dst = xfer->send.hdr.mode.hdr.dst & 0x3f;
1828 STAILQ_INSERT_TAIL(&fc->tlabels[new_tlabel], xfer, tlabel);
1831 xfer->tl = new_tlabel;
1832 xfer->send.hdr.mode.hdr.tlrt = new_tlabel << 2;
1853 rb->xfer->recv.spd = rb->spd;
1859 p = (u_char *)&rb->xfer->recv.hdr;
1865 p = (u_char *)rb->xfer->recv.payload;
1866 res = rb->xfer->recv.pay_len;
1872 rb->xfer->recv.pay_len = sizeof(uint32_t);
1886 __func__, rb->xfer->recv.pay_len, len - res);
1896 rb->xfer->recv.pay_len -= res;
1929 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
1931 if (rb->xfer == NULL) {
1942 rb->xfer = fw_tl2xfer(rb->fc, fp->mode.hdr.src,
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);
1973 rb->xfer->flag);
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;
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);
2039 rb->xfer = STAILQ_FIRST(&bind->xferlist);
2040 if (rb->xfer == NULL) {
2047 rb->xfer->hand(rb->xfer);
2063 /* XXX get xfer from xfer queue, we don't need copy for
2065 rb->xfer = fw_xfer_alloc_buf(M_FWXFER, 0, /* XXX */
2067 if (rb->xfer == NULL)
2072 STAILQ_INSERT_TAIL(&xferq->q, rb->xfer, link);
2099 fw_try_bmr_callback(struct fw_xfer *xfer)
2104 if (xfer == NULL)
2106 fc = xfer->fc;
2107 if (xfer->resp != 0)
2109 if (xfer->recv.payload == NULL)
2111 if (xfer->recv.hdr.mode.lres.rtcode != FWRCODE_COMPLETE)
2114 bmr = ntohl(xfer->recv.payload[0]);
2119 fw_xfer_free_buf(xfer);
2125 fw_xfer_free_buf(xfer);
2135 struct fw_xfer *xfer;
2140 xfer = fw_xfer_alloc_buf(M_FWXFER, 8, 4);
2141 if (xfer == NULL)
2143 xfer->send.spd = 0;
2146 fp = &xfer->send.hdr;
2156 xfer->send.payload[0] = htonl(0x3f);
2157 xfer->send.payload[1] = htonl(fc->nodeid);
2158 xfer->hand = fw_try_bmr_callback;
2160 err = fw_asyreq(fc, -1, xfer);
2162 fw_xfer_free_buf(xfer);
2174 fw_vmaccess(struct fw_xfer *xfer)
2177 uint32_t *ld = (uint32_t *)xfer->recv.buf;
2180 xfer->spd, xfer->recv.len, ntohl(ld[0]), ntohl(ld[1]), ntohl(ld[2]),
2184 if (xfer->resp != 0) {
2185 fw_xfer_free(xfer);
2188 if (xfer->recv.buf == NULL) {
2189 fw_xfer_free(xfer);
2192 rfp = (struct fw_pkt *)xfer->recv.buf;
2196 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2197 xfer->send.len = 12;
2198 sfp = (struct fw_pkt *)xfer->send.buf;
2206 xfer->send.buf = malloc(12, M_FW, M_NOWAIT);
2207 xfer->send.len = 12;
2214 xfer->send.buf = malloc(16 + rfp->mode.rreqb.len,
2216 xfer->send.len = 16 + ntohs(rfp->mode.rreqb.len);
2217 sfp = (struct fw_pkt *)xfer->send.buf;
2227 xfer->send.buf = malloc(16, M_FW, M_NOWAIT);
2228 xfer->send.len = 16;
2229 sfp = (struct fw_pkt *)xfer->send.buf;
2236 fw_xfer_free(xfer);
2240 xfer->dst = ntohs(rfp->mode.hdr.src);
2241 xfer->hand = fw_xfer_free;
2246 fw_asyreq(xfer->fc, -1, xfer);