diff options
author | simokawa <simokawa@FreeBSD.org> | 2003-02-09 10:14:22 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2003-02-09 10:14:22 +0000 |
commit | 51e766f699e3222372b15ccd29d5b01a3e4757e9 (patch) | |
tree | d6376e3201a3f938d6a37020bb3abe585f637cf3 /sys/dev/firewire/fwmem.c | |
parent | 734283166f1c23f24e04df0b454374719bdd11d6 (diff) | |
download | FreeBSD-src-51e766f699e3222372b15ccd29d5b01a3e4757e9.zip FreeBSD-src-51e766f699e3222372b15ccd29d5b01a3e4757e9.tar.gz |
Add new ioctl to specify target EUI64 for fwmem.
Diffstat (limited to 'sys/dev/firewire/fwmem.c')
-rw-r--r-- | sys/dev/firewire/fwmem.c | 34 |
1 files changed, 26 insertions, 8 deletions
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) |