A driver might also register device IDs for devices that do not directly supply a unique ID. Registering these IDs requires the device to be capable of storing and retrieving a small amount of data in a reserved area. The driver can then create a fabricated device ID and write it to the reserved area.
/*
* the device doesn't supply a unique ID, attempt to read
* a fabricated ID from the device's reserved data.
*/
if (xxx_read_deviceid(un, &devid_buf) == XXX_OK) {
if (ddi_devid_valid(devid_buf) == DDI_SUCCESS) {
devid_sz = ddi_devi_sizeof(devid_buf);
un->un_devid = kmem_alloc(devid_sz, KM_SLEEP);
bcopy(devid_buf, un->un_devid, devid_sz);
ddi_devid_register(dip, un->un_devid);
return (XXX_OK);
}
}
/*
* we failed to read a valid device ID from the device
* fabricate an ID, store it on the device, and register
* it with the DDI
*/
if (ddi_devid_init(dip, DEVID_FAB, 0, NULL, &un->un_devid)
== DDI_FAILURE) {
return (XXX_FAILURE);
}
if (xxx_write_deviceid(un) != XXX_OK) {
ddi_devid_free(un->un_devid);
un->un_devid = NULL;
return (XXX_FAILURE);
}
ddi_devid_register(dip, un->un_devid);
return (XXX_OK);