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);
 
 |