61 } smb_clone_t;
62
63 static dev_info_t *smb_devi;
64 static smb_clone_t *smb_clones;
65 static int smb_nclones;
66
67 /*ARGSUSED*/
68 static int
69 smb_open(dev_t *dp, int flag, int otyp, cred_t *cred)
70 {
71 minor_t c;
72
73 if (ksmbios == NULL)
74 return (ENXIO);
75
76 /*
77 * Locate and reserve a clone structure. We skip clone 0 as that is
78 * the real minor number, and we assign a new minor to each clone.
79 */
80 for (c = 1; c < smb_nclones; c++) {
81 if (casptr(&smb_clones[c].c_hdl, NULL, ksmbios) == NULL)
82 break;
83 }
84
85 if (c >= smb_nclones)
86 return (EAGAIN);
87
88 smb_clones[c].c_eplen = P2ROUNDUP(sizeof (smbios_entry_t), 16);
89 smb_clones[c].c_stlen = smbios_buflen(smb_clones[c].c_hdl);
90
91 *dp = makedevice(getemajor(*dp), c);
92
93 (void) ddi_prop_update_int(*dp, smb_devi, "size",
94 smb_clones[c].c_eplen + smb_clones[c].c_stlen);
95
96 return (0);
97 }
98
99 /*ARGSUSED*/
100 static int
101 smb_close(dev_t dev, int flag, int otyp, cred_t *cred)
|
61 } smb_clone_t;
62
63 static dev_info_t *smb_devi;
64 static smb_clone_t *smb_clones;
65 static int smb_nclones;
66
67 /*ARGSUSED*/
68 static int
69 smb_open(dev_t *dp, int flag, int otyp, cred_t *cred)
70 {
71 minor_t c;
72
73 if (ksmbios == NULL)
74 return (ENXIO);
75
76 /*
77 * Locate and reserve a clone structure. We skip clone 0 as that is
78 * the real minor number, and we assign a new minor to each clone.
79 */
80 for (c = 1; c < smb_nclones; c++) {
81 if (atomic_cas_ptr(&smb_clones[c].c_hdl, NULL, ksmbios) == NULL)
82 break;
83 }
84
85 if (c >= smb_nclones)
86 return (EAGAIN);
87
88 smb_clones[c].c_eplen = P2ROUNDUP(sizeof (smbios_entry_t), 16);
89 smb_clones[c].c_stlen = smbios_buflen(smb_clones[c].c_hdl);
90
91 *dp = makedevice(getemajor(*dp), c);
92
93 (void) ddi_prop_update_int(*dp, smb_devi, "size",
94 smb_clones[c].c_eplen + smb_clones[c].c_stlen);
95
96 return (0);
97 }
98
99 /*ARGSUSED*/
100 static int
101 smb_close(dev_t dev, int flag, int otyp, cred_t *cred)
|