chiark / gitweb /
login: properly detect MIMO USB displays
authorLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 23:19:11 +0000 (01:19 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 23:20:37 +0000 (01:20 +0200)
MIMO USB displays use a generic VID/PID for the hub component. With a
bit of trickery we can detect them by the VID/PID of the graphics
component.

Makefile.am
TODO
src/login/.gitignore
src/login/71-seat.rules [deleted file]
src/login/71-seat.rules.in [new file with mode: 0644]

index 015640f535d8de649b271811d37e00e72893d6db..e6d99503f130688a86079a3392af14a0f521a34d 100644 (file)
@@ -2883,10 +2883,10 @@ rootlibexec_PROGRAMS += \
 
 dist_udevrules_DATA += \
        src/login/70-uaccess.rules \
-       src/login/71-seat.rules \
        src/login/70-power-switch.rules
 
 nodist_udevrules_DATA += \
+       src/login/71-seat.rules \
        src/login/73-seat-late.rules
 
 MANPAGES += \
@@ -2943,12 +2943,14 @@ EXTRA_DIST += \
        src/login/logind-gperf.gperf \
        src/login/libsystemd-login.pc.in \
        src/login/libsystemd-login.sym \
+       src/login/71-seat.rules.in \
        src/login/73-seat-late.rules.in \
        units/systemd-logind.service.in \
        units/systemd-user-sessions.service.in
 
 CLEANFILES += \
        src/login/logind-gperf.c \
+       src/login/71-seat.rules \
        src/login/73-seat-late.rules
 endif
 # ------------------------------------------------------------------------------
diff --git a/TODO b/TODO
index 44dc7bc19ae4144b93aa89d6f29679a0f1675f36..56cf0b82003ecb8d4baa3ce1d2448ac33936fe9e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,5 +1,4 @@
 Fedora 18:
-* fix mimo VID/PID check that claims "innocent" hubs
 * chrony/ntp target?
 
 Bugfixes:
@@ -51,8 +50,6 @@ Features:
         - implement .d/ auto includes for unit files
         - add syntax to reset ExecStart= lists (and similar)
 
-* properly detect mimo devices, the current VID/PID check is too broad
-
 * manipulate CPU governor during boot, set it to performance
 
 * steal SBF management from the kernel
index 6fb49e5acee59644634a2aeb4b1565833ea25cf5..d3840c7afc3227888297979fc71bf4b73ef1506c 100644 (file)
@@ -1,4 +1,5 @@
 /libsystemd-login.pc
 /logind-gperf.c
 /org.freedesktop.login1.policy
+/71-seat.rules
 /73-seat-late.rules
diff --git a/src/login/71-seat.rules b/src/login/71-seat.rules
deleted file mode 100644 (file)
index 3f07ca1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#  This file is part of systemd.
-#
-#  systemd is free software; you can redistribute it and/or modify it
-#  under the terms of the GNU Lesser General Public License as published by
-#  the Free Software Foundation; either version 2.1 of the License, or
-#  (at your option) any later version.
-
-ACTION=="remove", GOTO="seat_end"
-
-TAG=="uaccess", SUBSYSTEM!="sound", TAG+="seat"
-SUBSYSTEM=="sound", KERNEL=="card*", TAG+="seat"
-SUBSYSTEM=="input", KERNEL=="input*", TAG+="seat"
-SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat"
-SUBSYSTEM=="usb", ATTR{bDeviceClass}=="09", TAG+="seat"
-
-# 'Plugable' USB hub, sound, network, graphics adapter
-SUBSYSTEM=="usb", ATTR{idVendor}=="2230", ATTR{idProduct}=="000[13]", ENV{ID_AUTOSEAT}="1"
-
-# Mimo 720, with integrated USB hub, displaylink graphics, and e2i touchscreen
-SUBSYSTEM=="usb", ATTR{idVendor}=="058f", ATTR{idProduct}=="6254", ENV{ID_AUTOSEAT}="1"
-
-TAG=="seat", ENV{ID_PATH}=="", IMPORT{builtin}="path_id"
-TAG=="seat", ENV{ID_FOR_SEAT}=="", ENV{ID_PATH_TAG}!="", ENV{ID_FOR_SEAT}="$env{SUBSYSTEM}-$env{ID_PATH_TAG}"
-
-LABEL="seat_end"
diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in
new file mode 100644 (file)
index 0000000..03005b6
--- /dev/null
@@ -0,0 +1,46 @@
+#  This file is part of systemd.
+#
+#  systemd is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as published by
+#  the Free Software Foundation; either version 2.1 of the License, or
+#  (at your option) any later version.
+
+ACTION=="remove", GOTO="seat_end"
+
+TAG=="uaccess", SUBSYSTEM!="sound", TAG+="seat"
+SUBSYSTEM=="sound", KERNEL=="card*", TAG+="seat"
+SUBSYSTEM=="input", KERNEL=="input*", TAG+="seat"
+SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat"
+SUBSYSTEM=="usb", ATTR{bDeviceClass}=="09", TAG+="seat"
+
+# 'Plugable' USB hub, sound, network, graphics adapter
+SUBSYSTEM=="usb", ATTR{idVendor}=="2230", ATTR{idProduct}=="000[13]", ENV{ID_AUTOSEAT}="1"
+
+# Mimo 720, with integrated USB hub, displaylink graphics, and e2i
+# touchscreen. This device carries no proper VID/PID in the USB hub,
+# but it does carry good ID data in the graphics component, hence we
+# check it from the parent. There's a bit of a race here however,
+# given that the child devices might not exist yet at the time this
+# rule is executed. To work around this we'll trigger the parent from
+# the child if we notice that the parent wasn't recognized yet.
+
+# Match parent
+SUBSYSTEM=="usb", ATTR{idVendor}=="058f", ATTR{idProduct}=="6254", \
+                  ATTR{%k.2/idVendor}=="17e9", ATTR{%k.2/idProduct}=="401a", ATTR{%k.2/product}=="mimo inc", \
+                  ENV{ID_AUTOSEAT}="1", ENV{ID_AVOID_LOOP}="1"
+
+# Match child, look for parent's ID_AVOID_LOOP
+SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", ATTR{idProduct}=="401a", ATTR{product}=="mimo inc", \
+                  ATTR{../idVendor}=="058f", ATTR{../idProduct}=="6254", \
+                  IMPORT{parent}="ID_AVOID_LOOP"
+
+# Match child, retrigger parent
+SUBSYSTEM=="usb", ATTR{idVendor}=="17e9", ATTR{idProduct}=="401a", ATTR{product}=="mimo inc", \
+                  ATTR{../idVendor}=="058f", ATTR{../idProduct}=="6254", \
+                  ENV{ID_AVOID_LOOP}=="", \
+                  RUN+="@bindir@/udevadm trigger --parent-match=%p/.."
+
+TAG=="seat", ENV{ID_PATH}=="", IMPORT{builtin}="path_id"
+TAG=="seat", ENV{ID_FOR_SEAT}=="", ENV{ID_PATH_TAG}!="", ENV{ID_FOR_SEAT}="$env{SUBSYSTEM}-$env{ID_PATH_TAG}"
+
+LABEL="seat_end"