ドライバは通常、そのドライバの attach (9E) ハンドラでデバイス ID を初期化して登録します。先に説明したように、ドライバは持続的なデバイス ID の登録を担当します。そのため、ドライバでは、一意の ID (WWN) を直接提供できるデバイスと、作成された ID が安定した記憶領域に書き込まれたり、その記憶領域から読み取られたりするデバイスの両方の処理が必要になることがあります。
デバイスがドライバに一意の識別子を提供できる場合、ドライバは単にこの識別子を使用してデバイス ID を初期化し、その ID を Oracle Solaris DDI に登録できます。
/*
* The device provides a guaranteed unique identifier,
* in this case a SCSI3-WWN. The WWN for the device has been
* stored in the device's soft state.
*/
if (ddi_devid_init(dip, DEVID_SCSI3_WWN, un->un_wwn_len, un->un_wwn,
&un->un_devid) != DDI_SUCCESS)
return (DDI_FAILURE);
(void) ddi_devid_register(dip, un->un_devid);
ドライバはまた、一意の ID を直接提供しないデバイスのデバイス ID を登録する可能性もあります。これらの ID を登録するには、そのデバイスが少量のデータを予約領域に格納したり、取得したりできることが必要です。それにより、ドライバは組み立てられたデバイス ID を作成し、それを予約領域に書き込むことができます。
/*
* 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);