diff options
author | simokawa <simokawa@FreeBSD.org> | 2007-04-30 12:26:29 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2007-04-30 12:26:29 +0000 |
commit | 37df08c6a99595f207325509062f26183afa33a4 (patch) | |
tree | c0002e292eef00eba3b5e5b48cb27964dd1bc8d9 /sys/dev/firewire | |
parent | ac682a1ec200e43e37b2f788e0e44503baf4665e (diff) | |
download | FreeBSD-src-37df08c6a99595f207325509062f26183afa33a4.zip FreeBSD-src-37df08c6a99595f207325509062f26183afa33a4.tar.gz |
MFp4: Simplify tlabel handling
- Remove struct tl_label and runtime malloc() for it.
- Include tl_lable list in struct fw_xfer.
- Don't free unallocated tlabel.
MFC after: 1 week
Diffstat (limited to 'sys/dev/firewire')
-rw-r--r-- | sys/dev/firewire/firewire.c | 60 | ||||
-rw-r--r-- | sys/dev/firewire/firewirereg.h | 10 |
2 files changed, 30 insertions, 40 deletions
diff --git a/sys/dev/firewire/firewire.c b/sys/dev/firewire/firewire.c index f23b0e9..152293d 100644 --- a/sys/dev/firewire/firewire.c +++ b/sys/dev/firewire/firewire.c @@ -198,7 +198,7 @@ fw_asyreq(struct firewire_comm *fc, int sub, struct fw_xfer *xfer) { int err = 0; struct fw_xferq *xferq; - int tl = 0, len; + int tl = -1, len; struct fw_pkt *fp; int tcode; struct tcode_info *info; @@ -330,7 +330,6 @@ static void firewire_xfer_timeout(struct firewire_comm *fc) { struct fw_xfer *xfer; - struct tlabel *tl; struct timeval tv; struct timeval split_timeout; int i, s; @@ -343,8 +342,7 @@ firewire_xfer_timeout(struct firewire_comm *fc) s = splfw(); for (i = 0; i < 0x40; i ++) { - while ((tl = STAILQ_FIRST(&fc->tlabels[i])) != NULL) { - xfer = tl->xfer; + while ((xfer = STAILQ_FIRST(&fc->tlabels[i])) != NULL) { if (timevalcmp(&xfer->tv, &tv, >)) /* the rests are newer than this */ break; @@ -910,18 +908,26 @@ found: static void fw_tl_free(struct firewire_comm *fc, struct fw_xfer *xfer) { - struct tlabel *tl; - int s = splfw(); + struct fw_xfer *txfer; + int s; - for( tl = STAILQ_FIRST(&fc->tlabels[xfer->tl]); tl != NULL; - tl = STAILQ_NEXT(tl, link)){ - if(tl->xfer == xfer){ - STAILQ_REMOVE(&fc->tlabels[xfer->tl], tl, tlabel, link); - free(tl, M_FW); - splx(s); - return; - } + if (xfer->tl < 0) + return; + + s = splfw(); +#if 1 /* make sure the label is allocated */ + STAILQ_FOREACH(txfer, &fc->tlabels[xfer->tl], tlabel) + if(txfer == xfer) + break; + if (txfer == NULL) { + printf("%s: the xfer is not in the tlabel(%d)\n", + __FUNCTION__, xfer->tl); + splx(s); + return; } +#endif + + STAILQ_REMOVE(&fc->tlabels[xfer->tl], xfer, fw_xfer, tlabel); splx(s); return; } @@ -933,19 +939,15 @@ static struct fw_xfer * fw_tl2xfer(struct firewire_comm *fc, int node, int tlabel) { struct fw_xfer *xfer; - struct tlabel *tl; int s = splfw(); - for( tl = STAILQ_FIRST(&fc->tlabels[tlabel]); tl != NULL; - tl = STAILQ_NEXT(tl, link)){ - if(tl->xfer->send.hdr.mode.hdr.dst == node){ - xfer = tl->xfer; + STAILQ_FOREACH(xfer, &fc->tlabels[tlabel], tlabel) + if(xfer->send.hdr.mode.hdr.dst == node) { splx(s); if (firewire_debug > 2) printf("fw_tl2xfer: found tl=%d\n", tlabel); return(xfer); } - } if (firewire_debug > 1) printf("fw_tl2xfer: not found tl=%d\n", tlabel); splx(s); @@ -1683,27 +1685,19 @@ static int fw_get_tlabel(struct firewire_comm *fc, struct fw_xfer *xfer) { u_int i; - struct tlabel *tl, *tmptl; + struct fw_xfer *txfer; int s; static uint32_t label = 0; s = splfw(); for( i = 0 ; i < 0x40 ; i ++){ label = (label + 1) & 0x3f; - for(tmptl = STAILQ_FIRST(&fc->tlabels[label]); - tmptl != NULL; tmptl = STAILQ_NEXT(tmptl, link)){ - if (tmptl->xfer->send.hdr.mode.hdr.dst == + STAILQ_FOREACH(txfer, &fc->tlabels[label], tlabel) + if (txfer->send.hdr.mode.hdr.dst == xfer->send.hdr.mode.hdr.dst) break; - } - if(tmptl == NULL) { - tl = malloc(sizeof(struct tlabel),M_FW,M_NOWAIT); - if (tl == NULL) { - splx(s); - return (-1); - } - tl->xfer = xfer; - STAILQ_INSERT_TAIL(&fc->tlabels[label], tl, link); + if(txfer == NULL) { + STAILQ_INSERT_TAIL(&fc->tlabels[label], xfer, tlabel); splx(s); if (firewire_debug > 1) printf("fw_get_tlabel: dst=%d tl=%d\n", diff --git a/sys/dev/firewire/firewirereg.h b/sys/dev/firewire/firewirereg.h index b2dbc67..534eecf 100644 --- a/sys/dev/firewire/firewirereg.h +++ b/sys/dev/firewire/firewirereg.h @@ -134,7 +134,7 @@ struct firewire_comm{ struct fw_eui64 eui; struct fw_xferq *arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH]; - STAILQ_HEAD(, tlabel) tlabels[0x40]; + STAILQ_HEAD(, fw_xfer) tlabels[0x40]; STAILQ_HEAD(, fw_bind) binds; STAILQ_HEAD(, fw_device) devices; u_int sid_cnt; @@ -217,11 +217,6 @@ struct fw_bulkxfer{ int resp; }; -struct tlabel{ - struct fw_xfer *xfer; - STAILQ_ENTRY(tlabel) link; -}; - struct fw_bind{ u_int64_t start; u_int64_t end; @@ -249,7 +244,7 @@ struct fw_xfer{ #define FWXF_BUSY 8 #define FWXF_RCVD 10 uint8_t state; - uint8_t tl; + int8_t tl; void (*hand) (struct fw_xfer *); struct { struct fw_pkt hdr; @@ -259,6 +254,7 @@ struct fw_xfer{ } send, recv; struct mbuf *mbuf; STAILQ_ENTRY(fw_xfer) link; + STAILQ_ENTRY(fw_xfer) tlabel; struct malloc_type *malloc; }; |