summaryrefslogtreecommitdiff
blob: 59be26dbd8170e112fad357632890d92bb83b464 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
commit a3ea9ecc75a414e35ae763a92a2c3fa05a7ca0b3
Author: Joe Marcus Clarke <marcus@FreeBSD.org>
Date:   Fri Dec 25 11:21:23 2009 -0500

    Fix (or workaround) quite a few bugs with newusb interaction
    
    * Allow the newusb module to compile with the recent input changes from
      kFreeBSD.
    * Make sure usb2 devices attach properly to the device tree with the correct
      parent.
    * Properly detect when newusb devices are added and removed.

diff --git a/hald/freebsd/hf-usb2.c b/hald/freebsd/hf-usb2.c
index fff49e0..f1a02e2 100644
--- a/hald/freebsd/hf-usb2.c
+++ b/hald/freebsd/hf-usb2.c
@@ -98,10 +98,10 @@ hf_usb2_probe_interfaces(HalDevice *parent)
 	  if (driver)
             {
 	      if (! strcmp(driver, "ukbd"))
-                hf_device_set_input(device, "keyboard", NULL);
-	      else if (! strcmp(driver, "ums"))
+                hf_device_set_input(device, "keyboard", "keys", devname);
+	      else if (! strcmp(driver, "ums") || ! strcmp(driver, "atp"))
                 {
-                  hf_device_set_input(device, "mouse", devname);
+                  hf_device_set_input(device, "mouse", NULL, devname);
 	          hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL);
 	        }
 	      else if (! strcmp(driver, "uhid"))
@@ -192,11 +192,12 @@ hf_usb2_probe (void)
       addr = libusb20_dev_get_address(pdev);
 
       if (addr == 1)
-        parent = hf_devtree_find_parent_from_info(hald_get_gdl(), "usbus", bus);
+        parent = hf_devtree_find_from_info(hald_get_gdl(), "usbus", bus);
       else
         parent = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number",
           HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number",
-	  HAL_PROPERTY_TYPE_INT32, addr - 1, NULL);
+	  HAL_PROPERTY_TYPE_INT32, addr - 1, "info.bus",
+	  HAL_PROPERTY_TYPE_STRING, "usb_device", NULL);
       if (! parent || hal_device_property_get_bool(parent, "info.ignore"))
         continue;
 
@@ -216,7 +217,13 @@ hf_usb2_devd_add (const char *name,
   HalDevice *parent_device;
   int bus, addr, pbus, paddr;
 
-  if (strncmp(name, "ugen", strlen("ugen")))
+  if (! parent)
+    return FALSE;
+
+  if (strncmp(name, "ugen", strlen("ugen")) &&
+      ! strncmp(parent, "uhub", strlen("uhub")))
+    return TRUE;
+  else if (strncmp(name, "ugen", strlen("ugen")))
     return FALSE;
   else if (strncmp(parent, "ugen", strlen("ugen")))
     return TRUE;
@@ -232,7 +239,8 @@ hf_usb2_devd_add (const char *name,
 
   parent_device = hf_device_store_match(hald_get_gdl(),
     "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, pbus,
-    "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, NULL);
+    "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, "info.bus",
+    HAL_PROPERTY_TYPE_STRING, "usb_device", NULL);
 
   if (parent_device && ! hal_device_property_get_bool(parent_device,
       "info.ignore"))
@@ -255,8 +263,6 @@ hf_usb2_devd_remove (const char *name,
 
   if (strncmp(name, "ugen", strlen("ugen")))
     return FALSE;
-  else if (strncmp(parent, "ugen", strlen("ugen")))
-    return TRUE;
 
   if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2)
     return FALSE;
@@ -265,7 +271,8 @@ hf_usb2_devd_remove (const char *name,
 
   device = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number",
     HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number",
-    HAL_PROPERTY_TYPE_INT32, addr, NULL);
+    HAL_PROPERTY_TYPE_INT32, addr, "info.bus",
+    HAL_PROPERTY_TYPE_STRING, "usb_device", NULL);
 
   if (device)
     {
@@ -276,6 +283,23 @@ hf_usb2_devd_remove (const char *name,
   return FALSE;
 }
 
+static gboolean
+hf_usb2_devd_notify (const char *system,
+		     const char *subsystem,
+		     const char *type,
+		     const char *data)
+{
+  if (! data || strcmp(system, "DEVFS") || strcmp(subsystem, "CDEV") ||
+      (strcmp(type, "CREATE") && strcmp(type, "DESTROY")))
+    return FALSE;
+
+  if (! strncmp(data, "cdev=ugen", strlen("cdev=ugen")) ||
+      ! strncmp(data, "cdev=usb", strlen("cdev=usb")))
+    return TRUE;
+
+  return FALSE;
+}
+
 HFHandler hf_usb2_handler = {
   .privileged_init	= hf_usb2_privileged_init,
   .probe		= hf_usb2_probe
@@ -283,5 +307,6 @@ HFHandler hf_usb2_handler = {
 
 HFDevdHandler hf_usb2_devd_handler = {
   .add =	hf_usb2_devd_add,
-  .remove =	hf_usb2_devd_remove
+  .remove =	hf_usb2_devd_remove,
+  .notify =     hf_usb2_devd_notify
 };