summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsimokawa <simokawa@FreeBSD.org>2003-02-09 10:14:22 +0000
committersimokawa <simokawa@FreeBSD.org>2003-02-09 10:14:22 +0000
commit51e766f699e3222372b15ccd29d5b01a3e4757e9 (patch)
treed6376e3201a3f938d6a37020bb3abe585f637cf3 /sys
parent734283166f1c23f24e04df0b454374719bdd11d6 (diff)
downloadFreeBSD-src-51e766f699e3222372b15ccd29d5b01a3e4757e9.zip
FreeBSD-src-51e766f699e3222372b15ccd29d5b01a3e4757e9.tar.gz
Add new ioctl to specify target EUI64 for fwmem.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/firewire/firewire.c4
-rw-r--r--sys/dev/firewire/firewire.h3
-rw-r--r--sys/dev/firewire/firewirereg.h2
-rw-r--r--sys/dev/firewire/fwdev.c2
-rw-r--r--sys/dev/firewire/fwmem.c34
5 files changed, 33 insertions, 12 deletions
diff --git a/sys/dev/firewire/firewire.c b/sys/dev/firewire/firewire.c
index fba88e2..861006f 100644
--- a/sys/dev/firewire/firewire.c
+++ b/sys/dev/firewire/firewire.c
@@ -150,14 +150,14 @@ fw_noderesolve_nodeid(struct firewire_comm *fc, int dst)
* Lookup fwdev by EUI64.
*/
struct fw_device *
-fw_noderesolve_eui64(struct firewire_comm *fc, struct fw_eui64 eui)
+fw_noderesolve_eui64(struct firewire_comm *fc, struct fw_eui64 *eui)
{
struct fw_device *fwdev;
int s;
s = splfw();
STAILQ_FOREACH(fwdev, &fc->devices, link)
- if (FW_EUI64_EQUAL(fwdev->eui, eui))
+ if (FW_EUI64_EQUAL(fwdev->eui, *eui))
break;
splx(s);
diff --git a/sys/dev/firewire/firewire.h b/sys/dev/firewire/firewire.h
index f96e331..b10aa6c 100644
--- a/sys/dev/firewire/firewire.h
+++ b/sys/dev/firewire/firewire.h
@@ -471,6 +471,9 @@ struct fw_crom_buf {
#define FW_GTPMAP _IOR('S', 5, struct fw_topology_map)
#define FW_GCROM _IOWR('S', 7, struct fw_crom_buf)
+#define FW_SDEUI64 _IOW('S', 20, struct fw_eui64)
+#define FW_GDEUI64 _IOR('S', 21, struct fw_eui64)
+
#define FWOHCI_RDREG _IOWR('S', 80, struct fw_reg_req_t)
#define FWOHCI_WRREG _IOWR('S', 81, struct fw_reg_req_t)
diff --git a/sys/dev/firewire/firewirereg.h b/sys/dev/firewire/firewirereg.h
index 64b7cca..4631e00 100644
--- a/sys/dev/firewire/firewirereg.h
+++ b/sys/dev/firewire/firewirereg.h
@@ -324,7 +324,7 @@ void fw_xfer_timeout __P((void *));
void fw_xfer_done __P((struct fw_xfer *));
void fw_asy_callback __P((struct fw_xfer *));
struct fw_device *fw_noderesolve_nodeid __P((struct firewire_comm *, int));
-struct fw_device *fw_noderesolve_eui64 __P((struct firewire_comm *, struct fw_eui64));
+struct fw_device *fw_noderesolve_eui64 __P((struct firewire_comm *, struct fw_eui64 *));
struct fw_bind *fw_bindlookup __P((struct firewire_comm *, u_int32_t, u_int32_t));
diff --git a/sys/dev/firewire/fwdev.c b/sys/dev/firewire/fwdev.c
index 7b7bc71..31b3a2c 100644
--- a/sys/dev/firewire/fwdev.c
+++ b/sys/dev/firewire/fwdev.c
@@ -746,7 +746,7 @@ fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
break;
case FWASREQEUI:
fwdev = fw_noderesolve_eui64(sc->fc,
- asyreq->req.dst.eui);
+ &asyreq->req.dst.eui);
if (fwdev == NULL) {
device_printf(sc->fc->bdev,
"cannot find node\n");
diff --git a/sys/dev/firewire/fwmem.c b/sys/dev/firewire/fwmem.c
index 05571f2c..dd3a27a 100644
--- a/sys/dev/firewire/fwmem.c
+++ b/sys/dev/firewire/fwmem.c
@@ -61,7 +61,7 @@ SYSCTL_NODE(_hw_firewire, OID_AUTO, fwmem, CTLFLAG_RD, 0,
"FireWire Memory Access");
SYSCTL_UINT(_hw_firewire_fwmem, OID_AUTO, eui64_hi, CTLFLAG_RW,
&fwmem_eui64.hi, 0, "Fwmem target EUI64 high");
-SYSCTL_UINT(_hw_firewire_fwmem, OID_AUTO, eui64_low, CTLFLAG_RW,
+SYSCTL_UINT(_hw_firewire_fwmem, OID_AUTO, eui64_lo, CTLFLAG_RW,
&fwmem_eui64.lo, 0, "Fwmem target EUI64 low");
SYSCTL_INT(_hw_firewire_fwmem, OID_AUTO, speed, CTLFLAG_RW, &fwmem_speed, 0,
"Fwmem link speed");
@@ -250,15 +250,22 @@ fwmem_write_block(
int
fwmem_open (dev_t dev, int flags, int fmt, fw_proc *td)
{
- int err = 0;
- return err;
+ struct fw_eui64 *eui;
+
+ eui = (struct fw_eui64 *)malloc(sizeof(struct fw_eui64), M_FW, 0);
+ if (eui == NULL)
+ return ENOMEM;
+ bcopy(&fwmem_eui64, eui, sizeof(struct fw_eui64));
+ dev->si_drv1 = (void *)eui;
+
+ return (0);
}
int
fwmem_close (dev_t dev, int flags, int fmt, fw_proc *td)
{
- int err = 0;
- return err;
+ free(dev->si_drv1, M_FW);
+ return (0);
}
#define MAXLEN 2048
@@ -277,7 +284,7 @@ fwmem_read (dev_t dev, struct uio *uio, int ioflag)
int len;
sc = devclass_get_softc(firewire_devclass, unit);
- fwdev = fw_noderesolve_eui64(sc->fc, fwmem_eui64);
+ fwdev = fw_noderesolve_eui64(sc->fc, (struct fw_eui64 *)dev->si_drv1);
if (fwdev == NULL) {
if (fwmem_debug)
printf("fwmem: no such device ID:%08x%08x\n",
@@ -340,7 +347,7 @@ fwmem_write (dev_t dev, struct uio *uio, int ioflag)
int len;
sc = devclass_get_softc(firewire_devclass, unit);
- fwdev = fw_noderesolve_eui64(sc->fc, fwmem_eui64);
+ fwdev = fw_noderesolve_eui64(sc->fc, (struct fw_eui64 *)dev->si_drv1);
if (fwdev == NULL) {
if (fwmem_debug)
printf("fwmem: no such device ID:%08x%08x\n",
@@ -393,7 +400,18 @@ fwmem_write (dev_t dev, struct uio *uio, int ioflag)
int
fwmem_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
{
- return EINVAL;
+ int err = 0;
+ switch (cmd) {
+ case FW_SDEUI64:
+ bcopy(data, dev->si_drv1, sizeof(struct fw_eui64));
+ break;
+ case FW_GDEUI64:
+ bcopy(dev->si_drv1, data, sizeof(struct fw_eui64));
+ break;
+ default:
+ err = EINVAL;
+ }
+ return(err);
}
int
fwmem_poll (dev_t dev, int events, fw_proc *td)
OpenPOWER on IntegriCloud