aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorHidetoshi Shimokawa <simokawa@FreeBSD.org>2002-11-12 11:08:50 +0000
committerHidetoshi Shimokawa <simokawa@FreeBSD.org>2002-11-12 11:08:50 +0000
commitc3b09522729bdc1c7c7796d2fe83e50f6c69c0e1 (patch)
tree3777d5e70ca445ef01154dba2582605eb6affa23 /sys/dev
parent2de8725950f4a8d664023d135c4c0c0f100f9067 (diff)
downloadsrc-c3b09522729bdc1c7c7796d2fe83e50f6c69c0e1.tar.gz
src-c3b09522729bdc1c7c7796d2fe83e50f6c69c0e1.zip
Change interface of fwmem_read_*() functions to be usable from other part
of the module.
Notes
Notes: svn path=/head/; revision=106804
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/firewire/fwmem.c73
1 files changed, 36 insertions, 37 deletions
diff --git a/sys/dev/firewire/fwmem.c b/sys/dev/firewire/fwmem.c
index 6005fc85d4c4..15181a6e3352 100644
--- a/sys/dev/firewire/fwmem.c
+++ b/sys/dev/firewire/fwmem.c
@@ -68,31 +68,30 @@ SYSCTL_INT(_debug, OID_AUTO, fwmem_debug, CTLFLAG_RW, &fwmem_debug, 0,
struct fw_xfer *
fwmem_read_quad(
struct firewire_comm *fc,
+ u_int8_t spd,
int dst,
u_int16_t dst_hi,
- u_int32_t dst_lo
- )
+ u_int32_t dst_lo,
+ void (*hand)(struct fw_xfer *))
{
struct fw_xfer *xfer;
struct fw_pkt *fp;
- int err = 0;
xfer = fw_xfer_alloc();
- if (xfer == NULL) {
- err = ENOMEM;
+ if (xfer == NULL)
return NULL;
- }
+
xfer->fc = fc;
xfer->dst = FWLOCALBUS | dst;
- xfer->spd = fwmem_speed; /* XXX */
+ xfer->spd = spd;
xfer->send.len = 12;
xfer->send.buf = malloc(xfer->send.len, M_DEVBUF, M_NOWAIT | M_ZERO);
- if (xfer->send.buf == NULL) {
- err = ENOMEM;
+
+ if (xfer->send.buf == NULL)
goto error;
- }
+
xfer->send.off = 0;
- xfer->act.hand = fw_asy_callback;
+ xfer->act.hand = hand;
xfer->retry_req = fw_asybusy;
xfer->sc = NULL;
@@ -104,13 +103,10 @@ fwmem_read_quad(
if (fwmem_debug)
printf("fwmem: %d %04x:%08x\n", dst, dst_hi, dst_lo);
- err = fw_asyreq(fc, -1, xfer);
- if (err)
- goto error;
- err = tsleep((caddr_t)xfer, FWPRI, "fwmem", hz);
- if (err == 0) {
+
+ if (fw_asyreq(fc, -1, xfer) == 0)
return xfer;
- }
+
error:
fw_xfer_free(xfer);
return NULL;
@@ -119,30 +115,29 @@ error:
struct fw_xfer *
fwmem_read_block(
struct firewire_comm *fc,
+ u_int8_t spd,
int dst,
u_int16_t dst_hi,
u_int32_t dst_lo,
- int len
- )
+ int len,
+ void (*hand)(struct fw_xfer *))
{
struct fw_xfer *xfer;
struct fw_pkt *fp;
- int err = 0;
xfer = fw_xfer_alloc();
- if (xfer == NULL) {
- err = ENOMEM;
+ if (xfer == NULL)
return NULL;
- }
+
xfer->fc = fc;
xfer->dst = FWLOCALBUS | dst;
- xfer->spd = fwmem_speed; /* XXX */
+ xfer->spd = spd;
xfer->send.len = 16;
xfer->send.buf = malloc(xfer->send.len, M_DEVBUF, M_NOWAIT | M_ZERO);
- if (xfer->send.buf == NULL) {
- err = ENOMEM;
+
+ if (xfer->send.buf == NULL)
goto error;
- }
+
xfer->send.off = 0;
xfer->act.hand = fw_asy_callback;
xfer->retry_req = fw_asybusy;
@@ -157,13 +152,9 @@ fwmem_read_block(
if (fwmem_debug)
printf("fwmem: %d %04x:%08x %d\n", dst, dst_hi, dst_lo, len);
- err = fw_asyreq(fc, -1, xfer);
- if (err)
- goto error;
- err = tsleep((caddr_t)xfer, FWPRI, "fwmem", hz);
- if (err == 0) {
+ if (fw_asyreq(fc, -1, xfer) == 0)
return xfer;
- }
+
error:
fw_xfer_free(xfer);
return NULL;
@@ -210,8 +201,12 @@ fwmem_read (dev_t dev, struct uio *uio, int ioflag)
dst_hi = (offset >> 32) & 0xffff;
dst_lo = offset & 0xffffffff;
#if USE_QUAD
- xfer = fwmem_read_quad(fc, fwmem_node, dst_hi, dst_lo);
- if (xfer == NULL || xfer->resp != 0 || xfer->recv.buf == NULL)
+ xfer = fwmem_read_quad(fc, fwmem_speed, fwmem_node,
+ dst_hi, dst_lo, fw_asy_callback);
+ if (xfer == NULL)
+ return EINVAL;
+ err = tsleep((caddr_t)xfer, FWPRI, "fwmem", hz);
+ if (err !=0 || xfer->resp != 0 || xfer->recv.buf == NULL)
return EINVAL; /* XXX */
err = uiomove(xfer->recv.buf + xfer->recv.off + 4*3 + pad,
4 - pad, uio);
@@ -219,8 +214,12 @@ fwmem_read (dev_t dev, struct uio *uio, int ioflag)
len = uio->uio_resid;
if (len > MAXLEN)
len = MAXLEN;
- xfer = fwmem_read_block(fc, fwmem_node, dst_hi, dst_lo, len);
- if (xfer == NULL || xfer->resp != 0 || xfer->recv.buf == NULL)
+ xfer = fwmem_read_block(fc, fwmem_speed, fwmem_node,
+ dst_hi, dst_lo, len, fw_asy_callback);
+ if (xfer == NULL)
+ return EINVAL;
+ err = tsleep((caddr_t)xfer, FWPRI, "fwmem", hz);
+ if (err != 0 || xfer->resp != 0 || xfer->recv.buf == NULL)
return EINVAL; /* XXX */
err = uiomove(xfer->recv.buf + xfer->recv.off + 4*4 + pad,
len - pad, uio);