44 { "usb", NULL, "usb_ac", DRV_EXACT,
45 ILEVEL_0, usb_process },
46 { "usb", NULL, "usb_as", DRV_EXACT,
47 ILEVEL_0, usb_process },
48 { "usb", NULL, "ddivs_usbc", DRV_EXACT,
49 ILEVEL_0, usb_process },
50 { "usb", NULL, "usbvc", DRV_EXACT,
51 ILEVEL_0, usb_process },
52 { "usb", NULL, "hid", DRV_EXACT,
53 ILEVEL_0, usb_process },
54 { "usb", NULL, "hwarc", DRV_EXACT,
55 ILEVEL_0, usb_process },
56 { "usb", NULL, "wusb_ca", DRV_EXACT,
57 ILEVEL_0, usb_process },
58 { "usb", DDI_NT_NEXUS, "hubd", DRV_EXACT|TYPE_EXACT,
59 ILEVEL_0, usb_process },
60 { "usb", DDI_NT_NEXUS, "ohci", DRV_EXACT|TYPE_EXACT,
61 ILEVEL_0, usb_process },
62 { "usb", DDI_NT_NEXUS, "ehci", DRV_EXACT|TYPE_EXACT,
63 ILEVEL_0, usb_process },
64 { "usb", DDI_NT_SCSI_NEXUS, "scsa2usb", DRV_EXACT|TYPE_EXACT,
65 ILEVEL_0, usb_process },
66 { "usb", DDI_NT_UGEN, "scsa2usb", DRV_EXACT|TYPE_EXACT,
67 ILEVEL_0, usb_process },
68 { "usb", DDI_NT_NEXUS, "uhci", DRV_EXACT|TYPE_EXACT,
69 ILEVEL_0, usb_process },
70 { "usb", DDI_NT_UGEN, "ugen", DRV_EXACT|TYPE_EXACT,
71 ILEVEL_0, usb_process },
72 { "usb", DDI_NT_NEXUS, "usb_mid", DRV_EXACT|TYPE_EXACT,
73 ILEVEL_0, usb_process },
74 { "usb", DDI_NT_UGEN, "usb_mid", DRV_EXACT|TYPE_EXACT,
75 ILEVEL_0, usb_process },
76 { "usb", DDI_NT_PRINTER, "usbprn", DRV_EXACT|TYPE_EXACT,
77 ILEVEL_0, usb_process },
78 { "usb", DDI_NT_UGEN, "usbprn", DRV_EXACT|TYPE_EXACT,
79 ILEVEL_0, usb_process },
80 { "usb", DDI_NT_NEXUS, "hwahc", DRV_EXACT|TYPE_EXACT,
81 ILEVEL_0, usb_process },
82 };
83
172 static devfsadm_enumerate_t wusb_ca_rules[1] =
173 {"^usb$/^wusb_ca([0-9]+)$", 1, MATCH_ALL};
174
175 DEVFSADM_REMOVE_INIT_V0(usb_remove_cbt);
176
177 int
178 minor_init(void)
179 {
180 devfsadm_print(debug_mid, "usb_link: minor_init\n");
181 return (DEVFSADM_SUCCESS);
182 }
183
184 int
185 minor_fini(void)
186 {
187 devfsadm_print(debug_mid, "usb_link: minor_fini\n");
188 return (DEVFSADM_SUCCESS);
189 }
190
191 typedef enum {
192 DRIVER_HUBD = 0,
193 DRIVER_OHCI = 1,
194 DRIVER_EHCI = 2,
195 DRIVER_UHCI = 3,
196 DRIVER_USB_AC = 4,
197 DRIVER_USB_AS = 5,
198 DRIVER_HID = 6,
199 DRIVER_USB_MID = 7,
200 DRIVER_DDIVS_USBC = 8,
201 DRIVER_SCSA2USB = 9,
202 DRIVER_USBPRN = 10,
203 DRIVER_UGEN = 11,
204 DRIVER_VIDEO = 12,
205 DRIVER_HWAHC = 13,
206 DRIVER_HWARC = 14,
207 DRIVER_WUSB_CA = 15,
208 DRIVER_UNKNOWN = 16
209 } driver_defs_t;
210
211 typedef struct {
212 char *driver_name;
213 int index;
214 } driver_name_table_entry_t;
215
216 driver_name_table_entry_t driver_name_table[] = {
217 { "hubd", DRIVER_HUBD },
218 { "ohci", DRIVER_OHCI },
219 { "ehci", DRIVER_EHCI },
220 { "uhci", DRIVER_UHCI },
221 { "usb_ac", DRIVER_USB_AC },
222 { "usb_as", DRIVER_USB_AS },
223 { "hid", DRIVER_HID },
224 { "usb_mid", DRIVER_USB_MID },
225 { "ddivs_usbc", DRIVER_DDIVS_USBC },
226 { "scsa2usb", DRIVER_SCSA2USB },
227 { "usbprn", DRIVER_USBPRN },
228 { "ugen", DRIVER_UGEN },
229 { "usbvc", DRIVER_VIDEO },
230 { "hwahc", DRIVER_HWAHC },
231 { "hwarc", DRIVER_HWARC },
232 { "wusb_ca", DRIVER_WUSB_CA },
233 { NULL, DRIVER_UNKNOWN }
234 };
235
236 /*
237 * This function is called for every usb minor node.
238 * Calls enumerate to assign a logical usb id, and then
239 * devfsadm_mklink to make the link.
240 */
241 static int
242 usb_process(di_minor_t minor, di_node_t node)
243 {
244 devfsadm_enumerate_t rules[1];
245 char *l_path, *p_path, *buf, *devfspath;
246 char *minor_nm, *drvr_nm, *name = (char *)NULL;
247 int i, index;
248 int flags = 0;
249 int create_secondary_link = 0;
250
251 minor_nm = di_minor_name(minor);
252 drvr_nm = di_driver_name(node);
253 if ((minor_nm == NULL) || (drvr_nm == NULL)) {
254 return (DEVFSADM_CONTINUE);
255 }
256
257 devfsadm_print(debug_mid, "usb_process: minor=%s node=%s type=%s\n",
258 minor_nm, di_node_name(node), di_minor_nodetype(minor));
259
260 devfspath = di_devfs_path(node);
261 if (devfspath == NULL) {
262 devfsadm_print(debug_mid,
263 "USB_process: devfspath is NULL\n");
264 return (DEVFSADM_CONTINUE);
265 }
266
267 l_path = (char *)malloc(PATH_MAX);
290 if ((driver_name_table[i].driver_name == NULL) ||
291 (strcmp(drvr_nm, driver_name_table[i].driver_name) == 0)) {
292 index = driver_name_table[i].index;
293 break;
294 }
295 }
296
297 if (strcmp(di_minor_nodetype(minor), DDI_NT_UGEN) == 0) {
298 ugen_create_link(p_path, minor_nm, node, minor);
299 free(l_path);
300 free(p_path);
301 return (DEVFSADM_CONTINUE);
302 }
303
304 /* Figure out which rules to apply */
305 switch (index) {
306 case DRIVER_HUBD:
307 case DRIVER_OHCI:
308 case DRIVER_EHCI:
309 case DRIVER_UHCI:
310 rules[0] = hub_rules[0]; /* For HUBs */
311 name = "hub";
312
313 break;
314 case DRIVER_USB_AC:
315 if (strcmp(minor_nm, "sound,audio") == 0) {
316 rules[0] = audio_rules[0];
317 name = "audio"; /* For audio */
318 create_secondary_link = 1;
319 } else if (strcmp(minor_nm, "sound,audioctl") == 0) {
320 rules[0] = audio_control_rules[0];
321 name = "audio-control"; /* For audio */
322 create_secondary_link = 1;
323 } else if (strcmp(minor_nm, "mux") == 0) {
324 rules[0] = audio_mux_rules[0];
325 name = "audio-mux"; /* For audio */
326 } else {
327 free(l_path);
328 free(p_path);
329 return (DEVFSADM_CONTINUE);
|
44 { "usb", NULL, "usb_ac", DRV_EXACT,
45 ILEVEL_0, usb_process },
46 { "usb", NULL, "usb_as", DRV_EXACT,
47 ILEVEL_0, usb_process },
48 { "usb", NULL, "ddivs_usbc", DRV_EXACT,
49 ILEVEL_0, usb_process },
50 { "usb", NULL, "usbvc", DRV_EXACT,
51 ILEVEL_0, usb_process },
52 { "usb", NULL, "hid", DRV_EXACT,
53 ILEVEL_0, usb_process },
54 { "usb", NULL, "hwarc", DRV_EXACT,
55 ILEVEL_0, usb_process },
56 { "usb", NULL, "wusb_ca", DRV_EXACT,
57 ILEVEL_0, usb_process },
58 { "usb", DDI_NT_NEXUS, "hubd", DRV_EXACT|TYPE_EXACT,
59 ILEVEL_0, usb_process },
60 { "usb", DDI_NT_NEXUS, "ohci", DRV_EXACT|TYPE_EXACT,
61 ILEVEL_0, usb_process },
62 { "usb", DDI_NT_NEXUS, "ehci", DRV_EXACT|TYPE_EXACT,
63 ILEVEL_0, usb_process },
64 { "usb", DDI_NT_NEXUS, "xhci", DRV_EXACT|TYPE_EXACT,
65 ILEVEL_0, usb_process },
66 { "usb", DDI_NT_SCSI_NEXUS, "scsa2usb", DRV_EXACT|TYPE_EXACT,
67 ILEVEL_0, usb_process },
68 { "usb", DDI_NT_UGEN, "scsa2usb", DRV_EXACT|TYPE_EXACT,
69 ILEVEL_0, usb_process },
70 { "usb", DDI_NT_NEXUS, "uhci", DRV_EXACT|TYPE_EXACT,
71 ILEVEL_0, usb_process },
72 { "usb", DDI_NT_UGEN, "ugen", DRV_EXACT|TYPE_EXACT,
73 ILEVEL_0, usb_process },
74 { "usb", DDI_NT_NEXUS, "usb_mid", DRV_EXACT|TYPE_EXACT,
75 ILEVEL_0, usb_process },
76 { "usb", DDI_NT_UGEN, "usb_mid", DRV_EXACT|TYPE_EXACT,
77 ILEVEL_0, usb_process },
78 { "usb", DDI_NT_PRINTER, "usbprn", DRV_EXACT|TYPE_EXACT,
79 ILEVEL_0, usb_process },
80 { "usb", DDI_NT_UGEN, "usbprn", DRV_EXACT|TYPE_EXACT,
81 ILEVEL_0, usb_process },
82 { "usb", DDI_NT_NEXUS, "hwahc", DRV_EXACT|TYPE_EXACT,
83 ILEVEL_0, usb_process },
84 };
85
174 static devfsadm_enumerate_t wusb_ca_rules[1] =
175 {"^usb$/^wusb_ca([0-9]+)$", 1, MATCH_ALL};
176
177 DEVFSADM_REMOVE_INIT_V0(usb_remove_cbt);
178
179 int
180 minor_init(void)
181 {
182 devfsadm_print(debug_mid, "usb_link: minor_init\n");
183 return (DEVFSADM_SUCCESS);
184 }
185
186 int
187 minor_fini(void)
188 {
189 devfsadm_print(debug_mid, "usb_link: minor_fini\n");
190 return (DEVFSADM_SUCCESS);
191 }
192
193 typedef enum {
194 DRIVER_HUBD,
195 DRIVER_OHCI,
196 DRIVER_EHCI,
197 DRIVER_UHCI,
198 DRIVER_XHCI,
199 DRIVER_USB_AC,
200 DRIVER_USB_AS,
201 DRIVER_HID,
202 DRIVER_USB_MID,
203 DRIVER_DDIVS_USBC,
204 DRIVER_SCSA2USB,
205 DRIVER_USBPRN,
206 DRIVER_UGEN,
207 DRIVER_VIDEO,
208 DRIVER_HWAHC,
209 DRIVER_HWARC,
210 DRIVER_WUSB_CA,
211 DRIVER_UNKNOWN
212 } driver_defs_t;
213
214 typedef struct {
215 char *driver_name;
216 driver_defs_t index;
217 } driver_name_table_entry_t;
218
219 driver_name_table_entry_t driver_name_table[] = {
220 { "hubd", DRIVER_HUBD },
221 { "ohci", DRIVER_OHCI },
222 { "ehci", DRIVER_EHCI },
223 { "uhci", DRIVER_UHCI },
224 { "xhci", DRIVER_XHCI },
225 { "usb_ac", DRIVER_USB_AC },
226 { "usb_as", DRIVER_USB_AS },
227 { "hid", DRIVER_HID },
228 { "usb_mid", DRIVER_USB_MID },
229 { "ddivs_usbc", DRIVER_DDIVS_USBC },
230 { "scsa2usb", DRIVER_SCSA2USB },
231 { "usbprn", DRIVER_USBPRN },
232 { "ugen", DRIVER_UGEN },
233 { "usbvc", DRIVER_VIDEO },
234 { "hwahc", DRIVER_HWAHC },
235 { "hwarc", DRIVER_HWARC },
236 { "wusb_ca", DRIVER_WUSB_CA },
237 { NULL, DRIVER_UNKNOWN }
238 };
239
240 /*
241 * This function is called for every usb minor node.
242 * Calls enumerate to assign a logical usb id, and then
243 * devfsadm_mklink to make the link.
244 */
245 static int
246 usb_process(di_minor_t minor, di_node_t node)
247 {
248 devfsadm_enumerate_t rules[1];
249 char *l_path, *p_path, *buf, *devfspath;
250 char *minor_nm, *drvr_nm, *name = (char *)NULL;
251 int i;
252 driver_defs_t index;
253 int flags = 0;
254 int create_secondary_link = 0;
255
256 minor_nm = di_minor_name(minor);
257 drvr_nm = di_driver_name(node);
258 if ((minor_nm == NULL) || (drvr_nm == NULL)) {
259 return (DEVFSADM_CONTINUE);
260 }
261
262 devfsadm_print(debug_mid, "usb_process: minor=%s node=%s type=%s\n",
263 minor_nm, di_node_name(node), di_minor_nodetype(minor));
264
265 devfspath = di_devfs_path(node);
266 if (devfspath == NULL) {
267 devfsadm_print(debug_mid,
268 "USB_process: devfspath is NULL\n");
269 return (DEVFSADM_CONTINUE);
270 }
271
272 l_path = (char *)malloc(PATH_MAX);
295 if ((driver_name_table[i].driver_name == NULL) ||
296 (strcmp(drvr_nm, driver_name_table[i].driver_name) == 0)) {
297 index = driver_name_table[i].index;
298 break;
299 }
300 }
301
302 if (strcmp(di_minor_nodetype(minor), DDI_NT_UGEN) == 0) {
303 ugen_create_link(p_path, minor_nm, node, minor);
304 free(l_path);
305 free(p_path);
306 return (DEVFSADM_CONTINUE);
307 }
308
309 /* Figure out which rules to apply */
310 switch (index) {
311 case DRIVER_HUBD:
312 case DRIVER_OHCI:
313 case DRIVER_EHCI:
314 case DRIVER_UHCI:
315 case DRIVER_XHCI:
316 rules[0] = hub_rules[0]; /* For HUBs */
317 name = "hub";
318
319 break;
320 case DRIVER_USB_AC:
321 if (strcmp(minor_nm, "sound,audio") == 0) {
322 rules[0] = audio_rules[0];
323 name = "audio"; /* For audio */
324 create_secondary_link = 1;
325 } else if (strcmp(minor_nm, "sound,audioctl") == 0) {
326 rules[0] = audio_control_rules[0];
327 name = "audio-control"; /* For audio */
328 create_secondary_link = 1;
329 } else if (strcmp(minor_nm, "mux") == 0) {
330 rules[0] = audio_mux_rules[0];
331 name = "audio-mux"; /* For audio */
332 } else {
333 free(l_path);
334 free(p_path);
335 return (DEVFSADM_CONTINUE);
|