summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsimokawa <simokawa@FreeBSD.org>2003-07-12 09:34:44 +0000
committersimokawa <simokawa@FreeBSD.org>2003-07-12 09:34:44 +0000
commit830a5c883e25b2642cd224f4106a0f0e31e4db1c (patch)
tree138bb173d082f60a4cfe6f8e3a7dadef56f919df /sys
parent043fe49d632271f6d3cdc39b84baa093dc4cbd60 (diff)
downloadFreeBSD-src-830a5c883e25b2642cd224f4106a0f0e31e4db1c.zip
FreeBSD-src-830a5c883e25b2642cd224f4106a0f0e31e4db1c.tar.gz
Allow retrieval of local Configuration ROM.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/firewire/fwdev.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/sys/dev/firewire/fwdev.c b/sys/dev/firewire/fwdev.c
index 02b927e..eeb9aac 100644
--- a/sys/dev/firewire/fwdev.c
+++ b/sys/dev/firewire/fwdev.c
@@ -349,6 +349,7 @@ fw_ioctl (dev_t dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
struct fw_xfer *xfer;
struct fw_pkt *fp;
struct fw_devinfo *devinfo;
+ void *ptr;
struct fw_devlstreq *fwdevlst = (struct fw_devlstreq *)data;
struct fw_asyreq *asyreq = (struct fw_asyreq *)data;
@@ -631,18 +632,32 @@ error:
if (FW_EUI64_EQUAL(fwdev->eui, crom_buf->eui))
break;
if (fwdev == NULL) {
- err = FWNODE_INVAL;
- break;
+ if (!FW_EUI64_EQUAL(sc->fc->eui, crom_buf->eui)) {
+ err = FWNODE_INVAL;
+ break;
+ }
+ /* myself */
+ ptr = malloc(CROMSIZE, M_FW, M_WAITOK);
+ len = CROMSIZE;
+ for (i = 0; i < CROMSIZE/4; i++)
+ ((u_int32_t *)ptr)[i]
+ = ntohl(sc->fc->config_rom[i]);
+ } else {
+ /* found */
+ ptr = (void *)&fwdev->csrrom[0];
+ if (fwdev->rommax < CSRROMOFF)
+ len = 0;
+ else
+ len = fwdev->rommax - CSRROMOFF + 4;
}
- if (fwdev->rommax < CSRROMOFF)
- len = 0;
- else
- len = fwdev->rommax - CSRROMOFF + 4;
if (crom_buf->len < len)
len = crom_buf->len;
else
crom_buf->len = len;
- err = copyout(&fwdev->csrrom[0], crom_buf->ptr, len);
+ err = copyout(ptr, crom_buf->ptr, len);
+ if (fwdev == NULL)
+ /* myself */
+ free(ptr, M_FW);
break;
default:
sc->fc->ioctl (dev, cmd, data, flag, td);
OpenPOWER on IntegriCloud