18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * devinfo_usb.h : USB devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
00687e57f8c568d4f8fb446b6530a2942842292fartem# include <config.h>
00687e57f8c568d4f8fb446b6530a2942842292fartem#endif
00687e57f8c568d4f8fb446b6530a2942842292fartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libdevinfo.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <unistd.h>
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems#include <dirent.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/types.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/mkdev.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/stat.h>
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz#include <sys/usb/usbai.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../device_info.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../ids.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hotplug.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_usb.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic HalDevice *devinfo_usb_if_add(HalDevice *d, di_node_t node, gchar *devfs_path,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar *if_devfs_path, int ifnum);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic HalDevice *devinfo_usb_scsa2usb_add(HalDevice *d, di_node_t node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic HalDevice *devinfo_usb_printer_add(HalDevice *usbd, di_node_t node);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic HalDevice *devinfo_usb_input_add(HalDevice *usbd, di_node_t node);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystemsstatic HalDevice *devinfo_usb_video4linux_add(HalDevice *usbd, di_node_t node);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsconst gchar *devinfo_printer_prnio_get_prober(HalDevice *d, int *timeout);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsconst gchar *devinfo_keyboard_get_prober(HalDevice *d, int *timeout);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic void set_usb_properties(HalDevice *d, di_node_t node, gchar *devfs_path, char *driver_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDevinfoDevHandler devinfo_usb_handler = {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_usb_add,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
42a7bded1b1244af097afdc88654381a3d3879f9jacobsDevinfoDevHandler devinfo_usb_printer_handler = {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_usb_add,
42a7bded1b1244af097afdc88654381a3d3879f9jacobs NULL,
42a7bded1b1244af097afdc88654381a3d3879f9jacobs NULL,
42a7bded1b1244af097afdc88654381a3d3879f9jacobs NULL,
42a7bded1b1244af097afdc88654381a3d3879f9jacobs NULL,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_printer_prnio_get_prober
42a7bded1b1244af097afdc88654381a3d3879f9jacobs};
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun MicrosystemsDevinfoDevHandler devinfo_usb_keyboard_handler = {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_usb_add,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_keyboard_get_prober
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems};
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobsstatic gboolean
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobsis_usb_node(di_node_t node)
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs{
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs int rc;
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs char *s;
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs /*
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs * USB device nodes will have "compatible" propety values that
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs * begins with "usb".
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz rc = di_prop_lookup_strings(DDI_DEV_T_ANY, node, "compatible", &s);
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs while (rc-- > 0) {
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs if (strncmp(s, "usb", 3) == 0) {
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs return (TRUE);
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs }
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs s += (strlen(s) + 1);
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs }
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs return (FALSE);
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs}
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic char *
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystemsget_usb_devlink(char *devfs_path, const char *dir_name)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *result = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems DIR *dp;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if ((dp = opendir(dir_name)) != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems struct dirent *ep;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems while ((ep = readdir(dp)) != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char path[MAXPATHLEN], lpath[MAXPATHLEN];
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems strncpy(path, dir_name, strlen(dir_name));
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems strncat(path, ep->d_name, strlen(ep->d_name));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems memset(lpath, 0, sizeof (lpath));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((readlink(path, lpath, sizeof (lpath)) > 0) &&
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (strstr(lpath, devfs_path) != NULL)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems result = strdup(path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems break;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems memset(path, 0, sizeof (path));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems closedir(dp);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (result);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_usb_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d, *nd = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *s;
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs int *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *driver_name, *binding_name;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char if_devfs_path[HAL_PATH_MAX];
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_devlink_handle_t hdl;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz double k;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (is_usb_node(node) == FALSE) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz driver_name = di_driver_name (node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "interface", &i) < 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* It is a USB device node. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz d = hal_device_new ();
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_set_default_properties (d, parent, node, devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "usb_device");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_STR(d, node, s, "usb-product-name", "info.product");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_STR(d, node, s, "usb-product-name", "usb_device.product");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_STR(d, node, s, "usb-vendor-name", "usb_device.vendor");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "usb-vendor-id", "usb_device.vendor_id");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "usb-product-id", "usb_device.product_id");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "usb-revision-id", "usb_device.device_revision_bcd");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_STR(d, node, s, "usb-serialno", "usb_device.serial");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "usb-port-count", "usb_device.num_ports");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "usb-num-configs", "usb_device.num_configurations");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz PROP_INT(d, node, i, "assigned-address", "usb_device.bus_number");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "usb-release", &i) > 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz k = (double)bcd(*i);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_double (d, "usb_device.version", k / 100);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "low-speed", &i) >= 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz k = 1.5;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "high-speed", &i) >= 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz k = 480.0;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* It is the full speed device. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz k = 12.0;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_double (d, "usb_device.speed", k);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz set_usb_properties (d, node, devfs_path, driver_name);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* wait for the ugen node's creation */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((driver_name != NULL) && (strcmp (driver_name, "usb_mid") == 0)) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (hdl = di_devlink_init (devfs_path, DI_MAKE_LINK)) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_devlink_fini (&hdl);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_add_enqueue (d, devfs_path, &devinfo_usb_handler);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* add to TDL so preprobing callouts and prober can access it */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_store_add (hald_get_tdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (((binding_name = di_binding_name (node)) != NULL) &&
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz (strncmp (binding_name, "usbif,", sizeof ("usbif,") - 1) == 0)) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz snprintf (if_devfs_path, sizeof (if_devfs_path), "%s:if%d",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devfs_path, 0);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((nd = devinfo_usb_if_add (d, node, if_devfs_path,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if_devfs_path, 0)) != NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz d = nd;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz nd = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devfs_path = if_devfs_path;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* It is a USB interface node or IA node. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int *j;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_ints (DDI_DEV_T_ANY, node, "interface-count", &j) > 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /*
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * The USB IA node properties are not defined in
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * HAL spec so far. So IA node udi has "ia" sign
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * now, different from the IF node udi with "if".
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz snprintf (if_devfs_path, sizeof (if_devfs_path),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "%s:ia%d", devfs_path, *i);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz snprintf (if_devfs_path, sizeof (if_devfs_path),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "%s:if%d", devfs_path, *i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz d = devinfo_usb_if_add (parent, node, devfs_path, if_devfs_path, *i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* driver specific */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (driver_name != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strcmp (driver_name, "scsa2usb") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems nd = devinfo_usb_scsa2usb_add (d, node);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else if (strcmp (driver_name, "usbprn") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems nd = devinfo_usb_printer_add (d, node);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else if (strcmp(driver_name, "hid") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (hdl = di_devlink_init(devfs_path, DI_MAKE_LINK)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems di_devlink_fini(&hdl);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems nd = devinfo_usb_input_add(d, node);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems } else if (strcmp(driver_name, "usbvc") == 0) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if (hdl = di_devlink_init(devfs_path, DI_MAKE_LINK)) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems di_devlink_fini(&hdl);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems nd = devinfo_usb_video4linux_add(d, node);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nd != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (nd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic void
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzset_usb_properties(HalDevice *d, di_node_t node, gchar *devfs_path, char *driver_name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz usb_dev_descr_t *dev_descrp = NULL; /* device descriptor */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz usb_cfg_descr_t *cfg_descrp = NULL; /* configuration descriptor */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz unsigned char *rdata = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char *p;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int i = 0;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.port_number",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz atoi (devfs_path + strlen (devfs_path) -1));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_bytes (DDI_DEV_T_ANY, node, "usb-dev-descriptor",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz &rdata) > 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_descrp = (usb_dev_descr_t *)rdata;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (dev_descrp != NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.device_class",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_descrp->bDeviceClass);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.device_subclass",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_descrp->bDeviceSubClass);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.device_protocol",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_descrp->bDeviceProtocol);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_prop_lookup_bytes (DDI_DEV_T_ANY, node, "usb-raw-cfg-descriptors",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz &rdata) > 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz cfg_descrp = (usb_cfg_descr_t *)(rdata);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (cfg_descrp != NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.configuration_value",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz cfg_descrp->bConfigurationValue);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.max_power",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz cfg_descrp->bMaxPower);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.num_interfaces",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz cfg_descrp->bNumInterfaces);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_bool (d, "usb_device.can_wake_up",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz (cfg_descrp->bmAttributes & 0x20) ? TRUE : FALSE);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_bool (d, "usb_device.is_self_powered",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz (cfg_descrp->bmAttributes & 0x40) ? TRUE : FALSE);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* get the node's usb tree level by counting hub numbers */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz do {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (p = strstr (devfs_path, "/hub@")) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devfs_path = p + strlen ("/hub@");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz i ++;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } while (p != NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((driver_name != NULL) && (strcmp (driver_name, "hubd") == 0) && (i > 0))
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz i --;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb_device.level_number", i);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz}
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic usb_if_descr_t *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzparse_usb_if_descr(di_node_t node, int ifnum)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz unsigned char *rdata = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz usb_if_descr_t *if_descrp=NULL; /* interface descriptor */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems di_node_t tmp_node = DI_NODE_NIL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz uint8_t num, length, type;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int rlen;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar *devpath = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((rlen = di_prop_lookup_bytes (DDI_DEV_T_ANY, node,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "usb-raw-cfg-descriptors", &rdata)) < 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char *p;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int i;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((devpath = di_devfs_path (node)) == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Look up its parent that may be a USB IA or USB mid. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz for (i = 0; i < 2; i++) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz p = strrchr (devpath, '/');
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (p == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz *p = '\0';
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((tmp_node = di_init (devpath, DINFOCPYALL)) == DI_NODE_NIL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((rlen = di_prop_lookup_bytes (DDI_DEV_T_ANY, tmp_node,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "usb-raw-cfg-descriptors", &rdata)) > 0)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz break;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_fini (tmp_node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (rdata == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz do {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz length = (uint8_t)*rdata;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz type = (uint8_t)*(rdata + 1);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (type == USB_DESCR_TYPE_IF) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz num = (uint8_t)*(rdata + 2);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (num == ifnum) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp = (usb_if_descr_t *)rdata;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz break;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz rdata += length;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz rlen -= length;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } while ((length > 0 ) && (rlen > 0));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzout:
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (devpath != NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_devfs_path_free (devpath);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (tmp_node != DI_NODE_NIL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_fini (tmp_node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return (if_descrp);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz}
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic HalDevice *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzdevinfo_usb_if_add(HalDevice *parent, di_node_t node, gchar *devfs_path,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar *if_devfs_path, int ifnum)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HalDevice *d = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char udi[HAL_PATH_MAX];
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz const char *parent_info;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz usb_if_descr_t *if_descrp=NULL; /* interface descriptor */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_set_default_properties (d, parent, node, if_devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Set the existed physical device path. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "usb");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.product", "USB Device Interface");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Set usb interface properties to interface node. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (strstr (if_devfs_path, ":ia") == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp = parse_usb_if_descr (node, ifnum);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (if_descrp != NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb.interface.class",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp->bInterfaceClass);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb.interface.subclass",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp->bInterfaceSubClass);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb.interface.protocol",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp->bInterfaceProtocol);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "usb.interface.number",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if_descrp->bInterfaceNumber);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* copy parent's usb_device.* properties */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent_info = hal_device_property_get_string (parent, "info.subsystem");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (parent_info != NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (strcmp (parent_info, "usb_device") == 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_merge_with_rewrite (d, parent, "usb.", "usb_device.");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else if (strcmp (parent_info, "usb") == 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* for the case that the parent is IA node */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_merge_with_rewrite (d, parent, "usb.", "usb.");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_add_enqueue (d, devfs_path, &devinfo_usb_handler);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* add to TDL so preprobing callouts and prober can access it */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_store_add (hald_get_tdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
42a7bded1b1244af097afdc88654381a3d3879f9jacobsstatic void
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsget_dev_link_path(di_node_t node, char *nodetype, char *re, char **devlink, char **minor_path, char **minor_name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_devlink_handle_t devlink_hdl;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int major;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_minor_t minor;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_t devt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
42a7bded1b1244af097afdc88654381a3d3879f9jacobs *devlink = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz *minor_path = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *minor_name = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz major = di_driver_major(node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz minor = DI_MINOR_NIL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devt = di_minor_devt(minor);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (major != major(devt)) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz continue;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (di_minor_type(minor) != DDM_MINOR) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz continue;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((*minor_path = di_devfs_minor_path(minor)) == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz continue;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strcmp(di_minor_nodetype(minor), nodetype) == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *devlink = get_devlink(devlink_hdl, re, *minor_path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /*
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems * During hotplugging, devlink could be NULL for usb
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * devices due to devlink database has not yet been
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * updated when hal try to read from it although the
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * actually dev link path has been created. In such a
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * situation, we will read the devlink name from
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * /dev/usb directory.
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems */
3fb52c733c5435ce279a4641b57941b1befa5c9fRaymond Chen if ((*devlink == NULL) && (re != NULL) &&
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems ((strstr(re, "hid") != NULL) || (strstr(re, "video") != NULL))) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems *devlink = get_usb_devlink(*minor_path, "/dev/usb/");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (*devlink != NULL) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *minor_name = di_minor_name(minor);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems break;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
42a7bded1b1244af097afdc88654381a3d3879f9jacobs di_devfs_path_free (*minor_path);
c74d5d46b91a456f2ccf1a2416478fad8d1b3b11jacobs *minor_path = NULL;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_devlink_fini (&devlink_hdl);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs}
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystemsstatic HalDevice *
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystemsdevinfo_usb_video4linux_add(HalDevice *usbd, di_node_t node)
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems{
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems HalDevice *d = NULL;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems int major;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems di_minor_t minor;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems dev_t devt;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char *devlink = NULL;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char *dev_videolink = NULL;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char *minor_path = NULL;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char *minor_name = NULL;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char udi[HAL_PATH_MAX];
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems char *s;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems get_dev_link_path(node, "usb_video",
3fb52c733c5435ce279a4641b57941b1befa5c9fRaymond Chen "^usb/video[0-9]+", &devlink, &minor_path, &minor_name);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if ((minor_path == NULL) || (devlink == NULL)) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems goto out;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems HAL_DEBUG(("devlink %s, minor_name %s", devlink, minor_name));
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if (strcmp(minor_name, "usbvc") != 0) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems goto out;
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems d = hal_device_new();
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems devinfo_set_default_properties(d, usbd, node, minor_path);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.subsystem", "video4linux");
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.category", "video4linux");
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_add_capability(d, "video4linux");
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems /* Get logic link under /dev (/dev/video+) */
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems dev_videolink = get_usb_devlink(strstr(devlink, "usb"), "/dev/");
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_property_set_string(d, "video4linux.device", dev_videolink);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems "%s_video4linux", hal_device_get_udi(usbd));
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_set_udi(d, udi);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.udi", udi);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems PROP_STR(d, node, s, "usb-product-name", "info.product");
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems devinfo_add_enqueue(d, minor_path, &devinfo_usb_handler);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystemsout:
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if (devlink) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems free(devlink);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems if (minor_path) {
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems di_devfs_path_free(minor_path);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems return (d);
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems}
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic HalDevice *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsdevinfo_usb_input_add(HalDevice *usbd, di_node_t node)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HalDevice *d = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems int major;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems di_minor_t minor;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems dev_t devt;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *devlink = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *minor_path = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *minor_name = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char udi[HAL_PATH_MAX];
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems get_dev_link_path(node, "ddi_pseudo",
3fb52c733c5435ce279a4641b57941b1befa5c9fRaymond Chen "^usb/hid[0-9]+", &devlink, &minor_path, &minor_name);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((minor_path == NULL) || (devlink == NULL)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HAL_DEBUG(("devlink %s, minor_name %s", devlink, minor_name));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if ((strcmp(minor_name, "keyboard") != 0) &&
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems (strcmp(minor_name, "mouse") != 0)) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems goto out;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems d = hal_device_new();
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_set_default_properties(d, usbd, node, minor_path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.subsystem", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.category", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strcmp(minor_name, "keyboard") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input.keyboard");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input.keys");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "button");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else if (strcmp(minor_name, "mouse") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability (d, "input.mouse");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.device", devlink);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.originating_device",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_get_udi(usbd));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems "%s_logicaldev_input", hal_device_get_udi(usbd));
3622ad5add770690d66e34e2176b6441269ffa35Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_set_udi(d, udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.udi", udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strcmp(minor_name, "keyboard") == 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_add_enqueue(d, minor_path, &devinfo_usb_keyboard_handler);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems } else {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_add_enqueue(d, minor_path, &devinfo_usb_handler);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems /* add to TDL so preprobing callouts and prober can access it */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_store_add(hald_get_tdl(), d);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsout:
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (devlink) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems free(devlink);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (minor_path) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems di_devfs_path_free(minor_path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (d);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
42a7bded1b1244af097afdc88654381a3d3879f9jacobsstatic HalDevice *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzdevinfo_usb_scsa2usb_add(HalDevice *usbd, di_node_t node)
42a7bded1b1244af097afdc88654381a3d3879f9jacobs{
42a7bded1b1244af097afdc88654381a3d3879f9jacobs HalDevice *d = NULL;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs di_devlink_handle_t devlink_hdl;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz int major;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_minor_t minor;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_t devt;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char *minor_path = NULL;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *minor_name = NULL;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs char *devlink = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char udi[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
3fb52c733c5435ce279a4641b57941b1befa5c9fRaymond Chen get_dev_link_path(node, "ddi_ctl:devctl:scsi",
3fb52c733c5435ce279a4641b57941b1befa5c9fRaymond Chen "^usb/mass-storage[0-9]+", &devlink, &minor_path, &minor_name);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((devlink == NULL) || (minor_path == NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, usbd, node, minor_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "scsi_host.solaris.device", devlink);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.category", "scsi_host");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_int (d, "scsi_host.host", 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "%s/scsi_host%d", hal_device_get_udi (usbd),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_get_int (d, "scsi_host.host"));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_set_udi (d, udi);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.udi", udi);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.product", "SCSI Host Adapter");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, minor_path, &devinfo_usb_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (devlink) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (minor_path) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_devfs_path_free (minor_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
42a7bded1b1244af097afdc88654381a3d3879f9jacobsstatic HalDevice *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzdevinfo_usb_printer_add(HalDevice *parent, di_node_t node)
42a7bded1b1244af097afdc88654381a3d3879f9jacobs{
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs char *properties[] = { "vendor", "product", "serial", NULL };
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs int i;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs HalDevice *d = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char udi[HAL_PATH_MAX];
42a7bded1b1244af097afdc88654381a3d3879f9jacobs char *s;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *devlink = NULL, *minor_path = NULL, *minor_name = NULL;
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs const char *subsystem;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems get_dev_link_path(node, "ddi_printer", "printers/.+", &devlink, &minor_path, &minor_name);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((devlink == NULL) || (minor_path == NULL)) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs goto out;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs d = hal_device_new ();
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs devinfo_set_default_properties (d, parent, node, minor_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.category", "printer");
42a7bded1b1244af097afdc88654381a3d3879f9jacobs hal_device_add_capability (d, "printer");
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs /* add printer properties */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "printer.device", devlink);
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs /* copy parent's selected usb* properties to printer properties */
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs subsystem = hal_device_property_get_string (parent, "info.subsystem");
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs for (i = 0; properties[i] != NULL; i++) {
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs char src[32], dst[32]; /* "subsystem.property" names */
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs snprintf(src, sizeof (src), "%s.%s", subsystem, properties[i]);
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs snprintf(dst, sizeof (dst), "printer.%s", properties[i]);
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs hal_device_copy_property(parent, src, d, dst);
d5c32991787e092564403b5c520497689dba69a6Norm Jacobs }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs devinfo_add_enqueue (d, minor_path, &devinfo_usb_printer_handler);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobsout:
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (devlink) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs free(devlink);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (minor_path) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs di_devfs_path_free (minor_path);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs return (d);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs}
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobsconst gchar *
42a7bded1b1244af097afdc88654381a3d3879f9jacobsdevinfo_printer_prnio_get_prober (HalDevice *d, int *timeout)
42a7bded1b1244af097afdc88654381a3d3879f9jacobs{
42a7bded1b1244af097afdc88654381a3d3879f9jacobs *timeout = 5 * 1000; /* 5 second timeout */
42a7bded1b1244af097afdc88654381a3d3879f9jacobs return ("hald-probe-printer");
42a7bded1b1244af097afdc88654381a3d3879f9jacobs}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsconst gchar *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsdevinfo_keyboard_get_prober(HalDevice *d, int *timeout)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems *timeout = 5 * 1000; /* 5 second timeout */
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return ("hald-probe-xkb");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}