add support for drvctl properties

This commit is contained in:
jnemeth 2007-03-02 09:17:00 +00:00
parent a03b3ed095
commit 3d61218161

View File

@ -1,4 +1,4 @@
/* $NetBSD: fdc.c,v 1.3 2007/03/02 07:17:19 jnemeth Exp $ */
/* $NetBSD: fdc.c,v 1.4 2007/03/02 09:17:00 jnemeth Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@ -108,7 +108,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: fdc.c,v 1.3 2007/03/02 07:17:19 jnemeth Exp $");
__KERNEL_RCSID(0, "$NetBSD: fdc.c,v 1.4 2007/03/02 09:17:00 jnemeth Exp $");
#include "opt_ddb.h"
#include "opt_md.h"
@ -154,6 +154,8 @@ __KERNEL_RCSID(0, "$NetBSD: fdc.c,v 1.3 2007/03/02 07:17:19 jnemeth Exp $");
#include <sparc64/dev/fdcvar.h>
#endif
#include <prop/proplib.h>
#define FDUNIT(dev) (minor(dev) / 8)
#define FDTYPE(dev) (minor(dev) % 8)
@ -397,6 +399,7 @@ static void establish_chip_type(
bus_addr_t,
bus_size_t,
bus_space_handle_t);
static void fd_set_properties(struct fd_softc *);
#ifdef MEMORY_DISK_HOOKS
int fd_read_md_image(size_t *, caddr_t *);
@ -976,6 +979,8 @@ fdattach(struct device *parent, struct device *self, void *aux)
*/
mountroothook_establish(fd_mountroot_hook, &fd->sc_dv);
fd_set_properties(fd);
/* Make sure the drive motor gets turned off at shutdown time. */
fd->sc_sdhook = shutdownhook_establish(fd_motor_off, fd);
}
@ -2551,3 +2556,59 @@ fd_read_md_image(size_t *sizep, caddr_t *addrp)
return 0;
}
#endif /* MEMORY_DISK_HOOKS */
static void
fd_set_properties(struct fd_softc *fd)
{
prop_dictionary_t disk_info, odisk_info, geom;
struct fd_type *fdt;
int secsize;
fdt = fd->sc_deftype;
disk_info = prop_dictionary_create();
geom = prop_dictionary_create();
prop_dictionary_set_uint64(geom, "sectors-per-unit",
fdt->size);
switch (fdt->secsize) {
case 2:
secsize = 512;
break;
case 3:
secsize = 1024;
break;
default:
secsize = 0;
}
prop_dictionary_set_uint32(geom, "sector-size",
secsize);
prop_dictionary_set_uint16(geom, "sectors-per-track",
fdt->sectrac);
prop_dictionary_set_uint16(geom, "tracks-per-cylinder",
fdt->heads);
prop_dictionary_set_uint64(geom, "cylinders-per-unit",
fdt->cylinders);
prop_dictionary_set(disk_info, "geometry", geom);
prop_object_release(geom);
prop_dictionary_set(device_properties(&fd->sc_dv),
"disk-info", disk_info);
/*
* Don't release disk_info here; we keep a reference to it.
* disk_detach() will release it when we go away.
*/
odisk_info = fd->sc_dk.dk_info;
fd->sc_dk.dk_info = disk_info;
if (odisk_info)
prop_object_release(odisk_info);
}