Writing Device Drivers

prop_op() Entry Point

ddi_prop_op(9F) can be used as a device driver's prop_op(9E) entry point when ddi_prop_op() is defined within the driver's cb_ops(9S) structure. ddi_prop_op() allows leaf devices to search for and obtain a property value from the device's property list.

It is sometimes useful for a device driver to define a driver-specific prop_op() routine within cb_ops rather than invoking ddi_prop_op(). For example, this is appropriate if a driver maintains a property whose value changes frequently. Changing such a value with ddi_prop_update() would not be efficient. In this case, the driver is responsible for updating the property value and should maintain a copy of the property value either within its soft state structure or in a driver variable.

The prop_op(9E) entry point reports the values of certain driver or device properties to the system. In many cases, the ddi_prop_op(9F) routine may be used as the driver's prop_op() entry point in the cb_ops(9S) structure. ddi_prop_op() performs all of the required processing and is sufficient for drivers that do not need to perform any special processing when handling a device property request.

However, there are cases when the driver must provide a prop_op() entry point. For example, if a driver maintains a property whose value changes frequently, updating the property with ddi_prop_update(9F) each time the value changes may not be efficient. Instead, the driver can maintain a local copy of the property in the instance's soft state. The driver updates the shadow copy in the soft state when the value of the property changes and does not call one of the ddi_prop_update() routines. In this case, the prop_op() entry point would need to intercept requests for this property and call one of the ddi_prop_update() routines to update the value of the property before passing the request to ddi_prop_op() to process the property request.

In Example 4–1, prop_op() intercepts requests for the temperature property. The driver updates a variable in the state structure whenever the property changes but only updates the property when a request is made. It then uses the system routine ddi_prop_op() to process the property request. If the property request is not specific to a device, the driver does not intercept the request. This is indicated when the value of the dev parameter is equal to DDI_DEV_T_ANY (the wildcard device number).


Example 4–1 prop_op(9E) Routine

static int
xxprop_op(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op,
    int flags, char *name, caddr_t valuep, int *lengthp)
{
        minor_t instance;
        struct xxstate *xsp;
        if (dev != DDI_DEV_T_ANY) {
                return (ddi_prop_op(dev, dip, prop_op, flags, name,
                    valuep, lengthp));
        }

        instance = getminor(dev);
        xsp = ddi_get_soft_state(statep, instance);
        if (xsp == NULL)
                return (DDI_PROP_NOTFOUND);
        if (strcmp(name, "temperature") == 0) {
                ddi_prop_update_int(dev, dip, name, temperature);
        }

        /* other cases */    
}