Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/subr_bus.c
Show First 20 Lines • Show All 261 Lines • ▼ Show 20 Lines | |||||
device_sysctl_handler(SYSCTL_HANDLER_ARGS) | device_sysctl_handler(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct sbuf sb; | struct sbuf sb; | ||||
device_t dev = (device_t)arg1; | device_t dev = (device_t)arg1; | ||||
int error; | int error; | ||||
sbuf_new_for_sysctl(&sb, NULL, 1024, req); | sbuf_new_for_sysctl(&sb, NULL, 1024, req); | ||||
sbuf_clear_flags(&sb, SBUF_INCLUDENUL); | sbuf_clear_flags(&sb, SBUF_INCLUDENUL); | ||||
bus_topo_lock(); | |||||
switch (arg2) { | switch (arg2) { | ||||
case DEVICE_SYSCTL_DESC: | case DEVICE_SYSCTL_DESC: | ||||
sbuf_cat(&sb, dev->desc ? dev->desc : ""); | sbuf_cat(&sb, dev->desc ? dev->desc : ""); | ||||
break; | break; | ||||
case DEVICE_SYSCTL_DRIVER: | case DEVICE_SYSCTL_DRIVER: | ||||
sbuf_cat(&sb, dev->driver ? dev->driver->name : ""); | sbuf_cat(&sb, dev->driver ? dev->driver->name : ""); | ||||
break; | break; | ||||
case DEVICE_SYSCTL_LOCATION: | case DEVICE_SYSCTL_LOCATION: | ||||
bus_child_location(dev, &sb); | bus_child_location(dev, &sb); | ||||
break; | break; | ||||
case DEVICE_SYSCTL_PNPINFO: | case DEVICE_SYSCTL_PNPINFO: | ||||
bus_child_pnpinfo(dev, &sb); | bus_child_pnpinfo(dev, &sb); | ||||
break; | break; | ||||
case DEVICE_SYSCTL_PARENT: | case DEVICE_SYSCTL_PARENT: | ||||
sbuf_cat(&sb, dev->parent ? dev->parent->nameunit : ""); | sbuf_cat(&sb, dev->parent ? dev->parent->nameunit : ""); | ||||
break; | break; | ||||
default: | default: | ||||
sbuf_delete(&sb); | error = EINVAL; | ||||
return (EINVAL); | goto out; | ||||
} | } | ||||
error = sbuf_finish(&sb); | error = sbuf_finish(&sb); | ||||
out: | |||||
bus_topo_unlock(); | |||||
sbuf_delete(&sb); | sbuf_delete(&sb); | ||||
return (error); | return (error); | ||||
} | } | ||||
static void | static void | ||||
device_sysctl_init(device_t dev) | device_sysctl_init(device_t dev) | ||||
{ | { | ||||
devclass_t dc = dev->devclass; | devclass_t dc = dev->devclass; | ||||
int domain; | int domain; | ||||
if (dev->sysctl_tree != NULL) | if (dev->sysctl_tree != NULL) | ||||
return; | return; | ||||
devclass_sysctl_init(dc); | devclass_sysctl_init(dc); | ||||
sysctl_ctx_init(&dev->sysctl_ctx); | sysctl_ctx_init(&dev->sysctl_ctx); | ||||
dev->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&dev->sysctl_ctx, | dev->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&dev->sysctl_ctx, | ||||
SYSCTL_CHILDREN(dc->sysctl_tree), OID_AUTO, | SYSCTL_CHILDREN(dc->sysctl_tree), OID_AUTO, | ||||
dev->nameunit + strlen(dc->name), | dev->nameunit + strlen(dc->name), | ||||
CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "", "device_index"); | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "", "device_index"); | ||||
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | ||||
OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | OID_AUTO, "%desc", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
dev, DEVICE_SYSCTL_DESC, device_sysctl_handler, "A", | dev, DEVICE_SYSCTL_DESC, device_sysctl_handler, "A", | ||||
"device description"); | "device description"); | ||||
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | ||||
OID_AUTO, "%driver", | OID_AUTO, "%driver", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A", | dev, DEVICE_SYSCTL_DRIVER, device_sysctl_handler, "A", | ||||
"device driver name"); | "device driver name"); | ||||
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | ||||
OID_AUTO, "%location", | OID_AUTO, "%location", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A", | dev, DEVICE_SYSCTL_LOCATION, device_sysctl_handler, "A", | ||||
"device location relative to parent"); | "device location relative to parent"); | ||||
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | ||||
OID_AUTO, "%pnpinfo", | OID_AUTO, "%pnpinfo", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
dev, DEVICE_SYSCTL_PNPINFO, device_sysctl_handler, "A", | dev, DEVICE_SYSCTL_PNPINFO, device_sysctl_handler, "A", | ||||
"device identification"); | "device identification"); | ||||
SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | SYSCTL_ADD_PROC(&dev->sysctl_ctx, SYSCTL_CHILDREN(dev->sysctl_tree), | ||||
OID_AUTO, "%parent", | OID_AUTO, "%parent", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
dev, DEVICE_SYSCTL_PARENT, device_sysctl_handler, "A", | dev, DEVICE_SYSCTL_PARENT, device_sysctl_handler, "A", | ||||
"parent device"); | "parent device"); | ||||
if (bus_get_domain(dev, &domain) == 0) | if (bus_get_domain(dev, &domain) == 0) | ||||
SYSCTL_ADD_INT(&dev->sysctl_ctx, | SYSCTL_ADD_INT(&dev->sysctl_ctx, | ||||
SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain", | SYSCTL_CHILDREN(dev->sysctl_tree), OID_AUTO, "%domain", | ||||
CTLFLAG_RD, NULL, domain, "NUMA domain"); | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, domain, "NUMA domain"); | ||||
} | } | ||||
static void | static void | ||||
device_sysctl_update(device_t dev) | device_sysctl_update(device_t dev) | ||||
{ | { | ||||
devclass_t dc = dev->devclass; | devclass_t dc = dev->devclass; | ||||
if (dev->sysctl_tree == NULL) | if (dev->sysctl_tree == NULL) | ||||
▲ Show 20 Lines • Show All 5,727 Lines • Show Last 20 Lines |