Re: [PATCH][RFC][ModemManager] udev rules: port to hwdb where applicable



On Sat, 2013-07-20 at 01:53 +0200, Tom Gundersen wrote:
Udev recently gained a hardware database, which is an efficent replacement for
the kind of rules shipped with modemmanager.

This patch ports all the relevant udev rules to hwdb format, which should
significantly speed up the processing of usb add events.

Which is nice, but it's significantly less clear and readable than the
udev rules, unfortunately.  Is there any way we can autogenerate the
hwdb stuff from the udev rules and just install that instead, but keep
editing the udev rules?

Dan

I also fixed up some bugs in the existing udev rule files found in the process.

Only rudimentary testing done as I don't have the right hardware, so testing and
comments very much appreciated!

The hwdb files were generated from the udev rules using the following search and
replace's in vim:

:%s/ATTRS{idVendor}=="\(\x\{4}\)", ENV{\(\w*\)}="\(\w*\)"/usb:v\U\1\E*\r \2=\3/g
:%s/ATTRS{idVendor}=="\(\x\{4}\)", ATTRS{idProduct}=="\(\x\{4}\)", 
ENV{\(\w*\)}="\(\w*\)"/usb:v\U\1\Ep\U\2\E*\r \3=\4/g
:%s/ATTRS{idVendor}=="\(\x\{4}\)", ATTRS{idProduct}=="\(\x\{4}\)", ENV{.MM_USBIFNUM}=="\(\x\{2}\)", 
ENV{\(\w*\)}="\(\w*\)"/usb:v\U\1\Ep\U\2\Ed*dc*dsc*d
p*ic*isc*ip*in\U\3\E\r \4=\5/g

and for plugins/huawei:

:%s/SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="\(\x\{2}\)", ATTRS{bInterfaceSubClass}=="\(\x\{2}\)", 
ATTRS{bInterfaceProtocol}=="\(\x\{2}\)", ENV{\(\w
*\)}="\(\w*\)"/usb:v12D1p*d*dc\U\1\Edsc\U\2\Edp\U\3\E\r \4=\5

(and some manual editing)
---
 configure.ac                                      |   1 +
 plugins/Makefile.am                               |  39 +++
 plugins/huawei/20-mm-huawei-net-port-types.hwdb   |  21 ++
 plugins/huawei/77-mm-huawei-net-port-types.rules  |   4 +-
 plugins/longcheer/20-mm-longcheer-port-types.hwdb | 350 +++++++++++++++++++++
 plugins/mbm/20-mm-ericsson-mbm.hwdb               | 166 ++++++++++
 plugins/nokia/20-mm-nokia-port-types.hwdb         |  42 +++
 plugins/simtech/20-mm-simtech-port-types.hwdb     |  43 +++
 plugins/telit/20-mm-telit-port-types.hwdb         |  70 +++++
 plugins/x22x/20-mm-x22x-port-types.hwdb           |  87 ++++++
 plugins/zte/20-mm-zte-port-types.hwdb             | 355 ++++++++++++++++++++++
 plugins/zte/77-mm-zte-port-types-2.rules          |   9 +
 plugins/zte/77-mm-zte-port-types.rules            |   3 -
 src/20-mm-usb-device-blacklist.hwdb               | 132 ++++++++
 src/20-mm-usb-serial-adapters-greylist.hwdb       |  40 +++
 src/77-mm-usb-device-blacklist.rules              |   4 +-
 src/Makefile.am                                   |  15 +-
 17 files changed, 1372 insertions(+), 9 deletions(-)
 create mode 100644 plugins/huawei/20-mm-huawei-net-port-types.hwdb
 create mode 100644 plugins/longcheer/20-mm-longcheer-port-types.hwdb
 create mode 100644 plugins/mbm/20-mm-ericsson-mbm.hwdb
 create mode 100644 plugins/nokia/20-mm-nokia-port-types.hwdb
 create mode 100644 plugins/simtech/20-mm-simtech-port-types.hwdb
 create mode 100644 plugins/telit/20-mm-telit-port-types.hwdb
 create mode 100644 plugins/x22x/20-mm-x22x-port-types.hwdb
 create mode 100644 plugins/zte/20-mm-zte-port-types.hwdb
 create mode 100644 plugins/zte/77-mm-zte-port-types-2.rules
 create mode 100644 src/20-mm-usb-device-blacklist.hwdb
 create mode 100644 src/20-mm-usb-serial-adapters-greylist.hwdb

diff --git a/configure.ac b/configure.ac
index 7237c45..a70e31f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -127,6 +127,7 @@ else
     UDEV_BASE_DIR="/lib/udev"
 fi
 AC_SUBST(UDEV_BASE_DIR)
+AM_CONDITIONAL(WITH_HWDB, [$PKG_CONFIG --atleast-version=196 udev])
 
 # systemd system unit directory
 AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [where systemd 
service files are]),
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 83f1fae..96c8af4 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -30,6 +30,8 @@ endif
 # UDev rules
 udevrulesdir = $(UDEV_BASE_DIR)/rules.d
 udevrules_DATA =
+hwdbdir = $(UDEV_BASE_DIR)/hwdb.d
+hwdb_DATA =
 
 # Unit tests
 noinst_PROGRAMS =
@@ -117,7 +119,11 @@ libmm_plugin_huawei_la_SOURCES = \
 libmm_plugin_huawei_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS)
 libmm_plugin_huawei_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
 
+if WITH_HWDB
+hwdb_DATA += huawei/20-mm-huawei-net-port-types.hwdb
+else
 udevrules_DATA += huawei/77-mm-huawei-net-port-types.rules
+endif
 
 noinst_PROGRAMS += test-modem-helpers-huawei
 test_modem_helpers_huawei_SOURCES = \
@@ -142,7 +148,12 @@ libmm_plugin_mbm_la_SOURCES = \
      mbm/mm-sim-mbm.h
 libmm_plugin_mbm_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS)
 libmm_plugin_mbm_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
+
+if WITH_HWDB
+hwdb_DATA += mbm/20-mm-ericsson-mbm.hwdb
+else
 udevrules_DATA += mbm/77-mm-ericsson-mbm.rules
+endif
 
 # Option
 libmm_plugin_option_la_SOURCES = \
@@ -211,7 +222,12 @@ libmm_plugin_nokia_icera_la_SOURCES = \
 libmm_plugin_nokia_icera_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS) $(ICERA_COMMON_COMPILER_FLAGS)
 libmm_plugin_nokia_icera_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
 libmm_plugin_nokia_icera_la_LIBADD = $(ICERA_COMMON_LIBADD_FLAGS)
+
+if WITH_HWDB
+hwdb_DATA += nokia/20-mm-nokia-port-types.hwdb
+else
 udevrules_DATA += nokia/77-mm-nokia-port-types.rules
+endif
 
 # Zte
 libmm_plugin_zte_la_SOURCES = \
@@ -226,7 +242,13 @@ libmm_plugin_zte_la_SOURCES = \
 libmm_plugin_zte_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS) $(ICERA_COMMON_COMPILER_FLAGS)
 libmm_plugin_zte_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
 libmm_plugin_zte_la_LIBADD = $(ICERA_COMMON_LIBADD_FLAGS)
+udevrules_DATA += zte/77-mm-zte-port-types-2.rules
+
+if WITH_HWDB
+hwdb_DATA += zte/20-mm-zte-port-types.hwdb
+else
 udevrules_DATA += zte/77-mm-zte-port-types.rules
+endif
 
 # Longcheer (and rebranded dongles)
 libmm_plugin_longcheer_la_SOURCES = \
@@ -236,7 +258,12 @@ libmm_plugin_longcheer_la_SOURCES = \
      longcheer/mm-broadband-modem-longcheer.c
 libmm_plugin_longcheer_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS)
 libmm_plugin_longcheer_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
+
+if WITH_HWDB
+hwdb_DATA += longcheer/20-mm-longcheer-port-types.hwdb
+else
 udevrules_DATA += longcheer/77-mm-longcheer-port-types.rules
+endif
 
 # AnyData CDMA
 libmm_plugin_anydata_la_SOURCES = \
@@ -264,7 +291,12 @@ libmm_plugin_simtech_la_SOURCES = \
      simtech/mm-broadband-modem-simtech.c
 libmm_plugin_simtech_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS)
 libmm_plugin_simtech_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
+
+if WITH_HWDB
+hwdb_DATA += simtech/20-mm-simtech-port-types.hwdb
+else
 udevrules_DATA += simtech/77-mm-simtech-port-types.rules
+endif
 
 # Alcatel/TCT/JRD x220D and possibly others
 libmm_plugin_x22x_la_SOURCES = \
@@ -274,7 +306,12 @@ libmm_plugin_x22x_la_SOURCES = \
      x22x/mm-broadband-modem-x22x.c
 libmm_plugin_x22x_la_CPPFLAGS = $(PLUGIN_COMMON_COMPILER_FLAGS)
 libmm_plugin_x22x_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
+
+if WITH_HWDB
+hwdb_DATA += x22x/20-mm-x22x-port-types.hwdb
+else
 udevrules_DATA += x22x/77-mm-x22x-port-types.rules
+endif
 
 # Pantech
 libmm_plugin_pantech_la_SOURCES = \
@@ -374,6 +411,8 @@ libmm_plugin_telit_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
 # Additional files to include in the distribution
 EXTRA_DIST += \
      $(udevrules_DATA)
+EXTRA_DIST += \
+     $(hwdb_DATA)
 
 # Unit tests
 TEST_PROGS += $(noinst_PROGRAMS)
diff --git a/plugins/huawei/20-mm-huawei-net-port-types.hwdb 
b/plugins/huawei/20-mm-huawei-net-port-types.hwdb
new file mode 100644
index 0000000..aa31894
--- /dev/null
+++ b/plugins/huawei/20-mm-huawei-net-port-types.hwdb
@@ -0,0 +1,21 @@
+# do not edit this file, it will be overwritten on update
+
+# Mark the modem and at port flags for ModemManager
+usb:v12D1p*d*dcFFdsc01dp01
+ ID_MM_HUAWEI_MODEM_PORT=1
+
+usb:v12D1p*d*dcFFdsc01dp02
+ ID_MM_HUAWEI_AT_PORT=1
+
+usb:v12D1p*d*dcFFdsc02dp01
+ ID_MM_HUAWEI_MODEM_PORT=1
+
+usb:v12D1p*d*dcFFdsc02dp02
+ ID_MM_HUAWEI_AT_PORT=1
+
+# Only the standard ECM or NCM port can support dial-up with AT NDISDUP through AT port
+usb:v12D1p*d*dc02dsc06dp00
+ ID_MM_HUAWEI_NDISDUP_SUPPORTED=1
+
+usb:v12D1p*d*dc02dsc0Ddp00
+ ID_MM_HUAWEI_NDISDUP_SUPPORTED=1
diff --git a/plugins/huawei/77-mm-huawei-net-port-types.rules 
b/plugins/huawei/77-mm-huawei-net-port-types.rules
index db0edce..6ee469e 100644
--- a/plugins/huawei/77-mm-huawei-net-port-types.rules
+++ b/plugins/huawei/77-mm-huawei-net-port-types.rules
@@ -10,7 +10,7 @@ SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="ff", ATTRS{bInterfaceSubClass}=="02"
 SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="ff", ATTRS{bInterfaceSubClass}=="02", 
ATTRS{bInterfaceProtocol}=="02", ENV{ID_MM_HUAWEI_AT_PORT}="1"
 
 # Only the standard ECM or NCM port can support dial-up with AT NDISDUP through AT port
-SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", 
ATTRS{bInterfaceSubClass}=="06",ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1"
-SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", 
ATTRS{bInterfaceSubClass}=="0d",ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1"
+SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", ATTRS{bInterfaceSubClass}=="06", 
ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1"
+SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="02", ATTRS{bInterfaceSubClass}=="0d", 
ATTRS{bInterfaceProtocol}=="00", ENV{ID_MM_HUAWEI_NDISDUP_SUPPORTED}="1"
 
 LABEL="mm_huawei_port_types_end"
diff --git a/plugins/longcheer/20-mm-longcheer-port-types.hwdb 
b/plugins/longcheer/20-mm-longcheer-port-types.hwdb
new file mode 100644
index 0000000..6035fe0
--- /dev/null
+++ b/plugins/longcheer/20-mm-longcheer-port-types.hwdb
@@ -0,0 +1,350 @@
+# do not edit this file, it will be overwritten on update
+
+# Longcheer makes modules that other companies rebrand, like:
+#
+# Alcatel One Touch X020
+# Alcatel One Touch X030
+# MobiData MBD-200HU
+# ST Mobile Connect HSUPA USB Modem
+#
+# Most of these values were scraped from various Longcheer-based Windows
+# driver .inf files.  cmmdm.inf lists the actual data (ie PPP) ports, while
+# cmser.inf lists the aux ports that may be either AT-capable or not but
+# cannot be used for PPP.
+
+usb:v1C9Ep3197d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep3197d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep3197*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep6000d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep6000d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep6000*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep6060d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep6060d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep6060*
+ ID_MM_LONGCHEER_TAGGED=1
+
+# Alcatel One Touch X020
+usb:v1C9Ep6061d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep6061d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep6061*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep7001d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep7001d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7001d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7001*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep7002d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep7002d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7002d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7002d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7002*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep7101d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep7101d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7101d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7101*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep7102d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep7102d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7102d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7102d*dc*dsc*dp*ic*isc*ip*in06
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep7102*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep8000d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep8000d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8000d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8000*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep8001d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep8001d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8001d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8001*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep8002d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep8002d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8002d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep8002*
+ ID_MM_LONGCHEER_TAGGED=1
+
+# ChinaBird PL68
+usb:v1C9Ep9000d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9000d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9000*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9001d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9001d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9001d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9001*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9002d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9002d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9002d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9002*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9003d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9003d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9003d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9003d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9003*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9004d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9004d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9004*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9005d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9005d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9005*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9010d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9010d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9010d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9010*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9012d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9012d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9012d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9012*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9020d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9020d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9020d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9020*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9022d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9022d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9022d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9022*
+ ID_MM_LONGCHEER_TAGGED=1
+
+# Zoom products
+usb:v1C9Ep9602d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9602d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9602d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9602*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9603d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9603d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9603d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9603*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9604d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9604d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9604d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9604*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9605d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9605d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9605d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9605d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9605*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9606d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9606d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9606d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9606d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9606*
+ ID_MM_LONGCHEER_TAGGED=1
+
+usb:v1C9Ep9607d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1C9Ep9607d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9607d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9607d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9607d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1C9Ep9607*
+ ID_MM_LONGCHEER_TAGGED=1
+
+# Alcatel One Touch X060s
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_LONGCHEER_PORT_TYPE_MODEM=1
+
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_LONGCHEER_PORT_TYPE_AUX=1
+
+usb:v1BBBp0000*
+ ID_MM_LONGCHEER_TAGGED=1
diff --git a/plugins/mbm/20-mm-ericsson-mbm.hwdb b/plugins/mbm/20-mm-ericsson-mbm.hwdb
new file mode 100644
index 0000000..8d49129
--- /dev/null
+++ b/plugins/mbm/20-mm-ericsson-mbm.hwdb
@@ -0,0 +1,166 @@
+# do not edit this file, it will be overwritten on update
+
+# Ericsson F3507g
+usb:v0BDBp1900*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0BDBp1902*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F3607gw
+usb:v0BDBp1904*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0BDBp1905*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0BDBp1906*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F3307
+usb:v0BDBp190A*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0BDBp1909*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F3307 R2
+usb:v0BDBp1914*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson C3607w
+usb:v0BDBp1049*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson C3607w v2
+usb:v0BDBp190B*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F5521gw
+usb:v0BDBp190D*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0BDBp1911*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson H5321gw
+usb:v0BDBp1919*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson H5321w
+usb:v0BDBp191D*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F5321gw
+usb:v0BDBp1917*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson F5321w
+usb:v0BDBp191B*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson C5621gw
+usb:v0BDBp191F*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson C5621w
+usb:v0BDBp1921*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson H5321gw
+usb:v0BDBp1926*
+ ID_MM_ERICSSON_MBM=1
+
+# Ericsson C3304w
+usb:v0BDBp1928*
+ ID_MM_ERICSSON_MBM=1
+
+# Sony-Ericsson MD300
+usb:v0FCEpD0CF*
+ ID_MM_ERICSSON_MBM=1
+
+# Sony-Ericsson MD400
+usb:v0FCEpD0E1*
+ ID_MM_ERICSSON_MBM=1
+
+# Sony-Ericsson MD400G
+usb:v0FCEpD103*
+ ID_MM_ERICSSON_MBM=1
+
+# Dell 5560
+usb:v413Cp818E*
+ ID_MM_ERICSSON_MBM=1
+
+# Dell 5550
+usb:v413Cp818D*
+ ID_MM_ERICSSON_MBM=1
+
+# Dell 5530 HSDPA
+usb:v413Cp8147*
+ ID_MM_ERICSSON_MBM=1
+
+# Dell F3607gw
+usb:v413Cp8183*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v413Cp8184*
+ ID_MM_ERICSSON_MBM=1
+
+# Dell F3307
+usb:v413Cp818B*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v413Cp818C*
+ ID_MM_ERICSSON_MBM=1
+
+# HP hs2330 Mobile Broadband Module
+usb:v03F0p271D*
+ ID_MM_ERICSSON_MBM=1
+
+# HP hs2320 Mobile Broadband Module
+usb:v03F0p261D*
+ ID_MM_ERICSSON_MBM=1
+
+# HP hs2340 Mobile Broadband Module
+usb:v03F0p3A1D*
+ ID_MM_ERICSSON_MBM=1
+
+# HP hs2350 Mobile Broadband Module
+usb:v03F0p3D1D*
+ ID_MM_ERICSSON_MBM=1
+
+# HP lc2000 Mobile Broadband Module
+usb:v03F0p301D*
+ ID_MM_ERICSSON_MBM=1
+
+# HP lc2010 Mobile Broadband Module
+usb:v03F0p2F1D*
+ ID_MM_ERICSSON_MBM=1
+
+# Toshiba
+usb:v0930p130B*
+ ID_MM_ERICSSON_MBM=1
+
+# Toshiba F3607gw
+usb:v0930p130C*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0930p1311*
+ ID_MM_ERICSSON_MBM=1
+
+# Toshiba F3307
+usb:v0930p1315*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0930p1316*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0930p1317*
+ ID_MM_ERICSSON_MBM=1
+
+# Toshiba F5521gw
+usb:v0930p1313*
+ ID_MM_ERICSSON_MBM=1
+
+usb:v0930p1314*
+ ID_MM_ERICSSON_MBM=1
diff --git a/plugins/nokia/20-mm-nokia-port-types.hwdb b/plugins/nokia/20-mm-nokia-port-types.hwdb
new file mode 100644
index 0000000..e330ba0
--- /dev/null
+++ b/plugins/nokia/20-mm-nokia-port-types.hwdb
@@ -0,0 +1,42 @@
+# do not edit this file, it will be overwritten on update
+
+# For Nokia Internet Sticks (CS-xx) the modem/PPP port appears to always be USB interface 1
+
+usb:v0421p060Dd*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0611d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p061Ad*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p061Bd*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p061Fd*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0619d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0620d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0623d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0624d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p0625d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p062Ad*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p062Ed*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
+
+usb:v0421p062Fd*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_NOKIA_PORT_TYPE_MODEM=1
diff --git a/plugins/simtech/20-mm-simtech-port-types.hwdb b/plugins/simtech/20-mm-simtech-port-types.hwdb
new file mode 100644
index 0000000..69b1552
--- /dev/null
+++ b/plugins/simtech/20-mm-simtech-port-types.hwdb
@@ -0,0 +1,43 @@
+# do not edit this file, it will be overwritten on update
+
+# Simtech makes modules that other companies rebrand, like:
+#
+# A-LINK 3GU
+# SCT UM300
+#
+# Most of these values were scraped from various SimTech-based Windows
+# driver .inf files.  *mdm.inf lists the main command ports, while
+# *ser.inf lists the aux ports that may be used for PPP.
+
+# A-LINK 3GU
+usb:v1E0EpCEFEd*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_SIMTECH_PORT_TYPE_MODEM=1
+
+usb:v1E0EpCEFEd*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_SIMTECH_PORT_TYPE_AUX=1
+
+usb:v1E0EpCEFEd*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_SIMTECH_PORT_TYPE_AUX=1
+
+usb:v1E0EpCEFE*
+ ID_MM_SIMTECH_TAGGED=1
+
+# Prolink PH-300
+usb:v1E0Ep9100d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_SIMTECH_PORT_TYPE_MODEM=1
+
+usb:v1E0Ep9100d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_SIMTECH_PORT_TYPE_AUX=1
+
+usb:v1E0Ep9100*
+ ID_MM_SIMTECH_TAGGED=1
+
+# SCT UM300
+usb:v1E0Ep9200d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_SIMTECH_PORT_TYPE_MODEM=1
+
+usb:v1E0Ep9200d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_SIMTECH_PORT_TYPE_AUX=1
+
+usb:v1E0Ep9200*
+ ID_MM_SIMTECH_TAGGED=1
diff --git a/plugins/telit/20-mm-telit-port-types.hwdb b/plugins/telit/20-mm-telit-port-types.hwdb
new file mode 100644
index 0000000..a98d5b0
--- /dev/null
+++ b/plugins/telit/20-mm-telit-port-types.hwdb
@@ -0,0 +1,70 @@
+# do not edit this file, it will be overwritten on update
+
+# UC864-E, UC864-E-AUTO, UC864-K, UC864-WD, UC864-WDU
+usb:v1BC7p1003d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1003d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_TELIT_PORT_TYPE_AUX=1
+
+usb:v1BC7p1003*
+ ID_MM_TELIT_TAGGED=1
+
+# UC864-G
+usb:v1BC7p1004d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1004d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_TELIT_PORT_TYPE_NMEA=1
+
+usb:v1BC7p1004d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_TELIT_PORT_TYPE_AUX=1
+
+usb:v1BC7p1004*
+ ID_MM_TELIT_TAGGED=1
+
+# CC864-DUAL
+usb:v1BC7p1005d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1005d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_TELIT_PORT_TYPE_NMEA=1
+
+usb:v1BC7p1005d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_TELIT_PORT_TYPE_AUX=1
+
+usb:v1BC7p1005*
+ ID_MM_TELIT_TAGGED=1
+
+# CC864-SINGLE, CC864-KPS
+usb:v1BC7p1006d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1006d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_TELIT_PORT_TYPE_AUX=1
+
+usb:v1BC7p1006*
+ ID_MM_TELIT_TAGGED=1
+
+# DE910-DUAL
+usb:v1BC7p1010d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_TELIT_PORT_TYPE_NMEA=1
+
+usb:v1BC7p1010d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_TELIT_PORT_TYPE_AUX=1
+
+usb:v1BC7p1010d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1010*
+ ID_MM_TELIT_TAGGED=1
+
+# CE910-DUAL
+usb:v1BC7p1011d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_TELIT_PORT_TYPE_MODEM=1
+
+usb:v1BC7p1011*
+ ID_MM_TELIT_TAGGED=1
+
+# NOTE: Qualcomm Gobi-based devices like the LE920 should not be handled
+# by this plugin, but by the Gobi plugin.
diff --git a/plugins/x22x/20-mm-x22x-port-types.hwdb b/plugins/x22x/20-mm-x22x-port-types.hwdb
new file mode 100644
index 0000000..8417505
--- /dev/null
+++ b/plugins/x22x/20-mm-x22x-port-types.hwdb
@@ -0,0 +1,87 @@
+# do not edit this file, it will be overwritten on update
+
+# Alcatel One Touch X220D
+# Alcatel One Touch X200
+#
+# These values were scraped from the X220D's Windows .inf files.  jrdmdm.inf
+# lists the actual command and data (ie PPP) ports, while jrdser.inf lists the
+# aux ports that may be either AT-capable or not but cannot be used for PPP.
+
+# Generic JRD devices ---------------------------
+
+# Alcatel X200
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_X22X_PORT_TYPE_MODEM=1
+
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0000d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0000*
+ ID_MM_X22X_TAGGED=1
+
+usb:v1BBBp0017d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_X22X_PORT_TYPE_MODEM=1
+
+usb:v1BBBp0017d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0017d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0017d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0017d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp0017*
+ ID_MM_X22X_TAGGED=1
+
+# Archos G9
+usb:v1BBBp00B7d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_X22X_PORT_TYPE_MODEM=1
+
+usb:v1BBBp00B7d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp00B7d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_X22X_PORT_TYPE_NMEA=1
+
+usb:v1BBBp00B7d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_X22X_PORT_TYPE_VOICE=1
+
+usb:v1BBBp00B7d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v1BBBp00B7*
+ ID_MM_X22X_TAGGED=1
+
+# Olivetti devices ---------------------------
+
+# Olicard 200
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_X22X_PORT_TYPE_MODEM=1
+
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v0B3CpC005d*dc*dsc*dp*ic*isc*ip*in06
+ ID_MM_X22X_PORT_TYPE_AUX=1
+
+usb:v0B3CpC005*
+ ID_MM_X22X_TAGGED=1
diff --git a/plugins/zte/20-mm-zte-port-types.hwdb b/plugins/zte/20-mm-zte-port-types.hwdb
new file mode 100644
index 0000000..1af16dc
--- /dev/null
+++ b/plugins/zte/20-mm-zte-port-types.hwdb
@@ -0,0 +1,355 @@
+# do not edit this file, it will be overwritten on update
+
+usb:v19D2p0001d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0001d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0002d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0002d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0003d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0003d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0004d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0004d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0005d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0005d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0006d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0006d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0007d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0007d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0008d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0008d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0009d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0009d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p000Ad*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p000Ad*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0012d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0012d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0015d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0015d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0016d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0016d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0017d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0017d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0018d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0018d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0019d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0019d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0021d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0021d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0024d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0024d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0025d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0025d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0030d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0030d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0031d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0031d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0033d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0033d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0037d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0037d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0039d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0039d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0042d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0042d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0043d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0043d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0048d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0048d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0049d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0049d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0052d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0052d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0054d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0054d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0055d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0055d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0057d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0057d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0058d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0058d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0061d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0061d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0063d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0063d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0064d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0064d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0066d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0066d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0078d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0078d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0082d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0082d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0091d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0091d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0104d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0104d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0106d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0106d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0108d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0108d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0113d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0113d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0117d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0117d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0118d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0118d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0121d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0121d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0122d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0122d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0123d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0123d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0124d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0124d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0125d*dc*dsc*dp*ic*isc*ip*in05
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0125d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0126d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0126d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p0128d*dc*dsc*dp*ic*isc*ip*in04
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p0128d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p1007d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p1007d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p1008d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p1008d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p1010d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p1010d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p1515d*dc*dsc*dp*ic*isc*ip*in00
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p1515d*dc*dsc*dp*ic*isc*ip*in02
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p2002d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p2002d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
+
+usb:v19D2p2003d*dc*dsc*dp*ic*isc*ip*in03
+ ID_MM_ZTE_PORT_TYPE_MODEM=1
+
+usb:v19D2p2003d*dc*dsc*dp*ic*isc*ip*in01
+ ID_MM_ZTE_PORT_TYPE_AUX=1
diff --git a/plugins/zte/77-mm-zte-port-types-2.rules b/plugins/zte/77-mm-zte-port-types-2.rules
new file mode 100644
index 0000000..6a2ecc1
--- /dev/null
+++ b/plugins/zte/77-mm-zte-port-types-2.rules
@@ -0,0 +1,9 @@
+# do not edit this file, it will be overwritten on update
+
+ACTION!="add|change", GOTO="mm_zte_port_types_end"
+SUBSYSTEM!="tty", GOTO="mm_zte_port_types_end"
+
+# Icera-based devices that use DHCP, not AT%IPDPADDR
+ATTRS{product}=="K3805-z", ENV{ID_MM_ZTE_ICERA_DHCP}="1"
+
+LABEL="mm_zte_port_types_end"
diff --git a/plugins/zte/77-mm-zte-port-types.rules b/plugins/zte/77-mm-zte-port-types.rules
index 5e2284b..8c65aec 100644
--- a/plugins/zte/77-mm-zte-port-types.rules
+++ b/plugins/zte/77-mm-zte-port-types.rules
@@ -186,7 +186,4 @@ ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2002", ENV{.MM_USBIFNUM}=="01", ENV{
 ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2003", ENV{.MM_USBIFNUM}=="03", 
ENV{ID_MM_ZTE_PORT_TYPE_MODEM}="1"
 ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2003", ENV{.MM_USBIFNUM}=="01", 
ENV{ID_MM_ZTE_PORT_TYPE_AUX}="1"
 
-# Icera-based devices that use DHCP, not AT%IPDPADDR
-ATTRS{product}=="K3805-z", ENV{ID_MM_ZTE_ICERA_DHCP}="1"
-
 LABEL="mm_zte_port_types_end"
diff --git a/src/20-mm-usb-device-blacklist.hwdb b/src/20-mm-usb-device-blacklist.hwdb
new file mode 100644
index 0000000..8bb79de
--- /dev/null
+++ b/src/20-mm-usb-device-blacklist.hwdb
@@ -0,0 +1,132 @@
+# do not edit this file, it will be overwritten on update
+
+# APC UPS devices
+usb:v051D*
+ ID_MM_DEVICE_IGNORE=1
+
+# Sweex 1000VA
+usb:v0925p1234*
+ ID_MM_DEVICE_IGNORE=1
+
+# Agiler UPS
+usb:v05B8p0000*
+ ID_MM_DEVICE_IGNORE=1
+
+# Krauler UP-M500VA
+usb:v0001p0000*
+ ID_MM_DEVICE_IGNORE=1
+
+# Ablerex 625L USB
+usb:vFFFFp0000*
+ ID_MM_DEVICE_IGNORE=1
+
+# Belkin F6C1200-UNV
+usb:v0665p5161*
+ ID_MM_DEVICE_IGNORE=1
+
+# Various Liebert and Phoenixtec Power devices
+usb:v06DA*
+ ID_MM_DEVICE_IGNORE=1
+
+# Unitek Alpha 1200Sx
+usb:v0F03p0001*
+ ID_MM_DEVICE_IGNORE=1
+
+# Various Tripplite devices
+usb:v09AE*
+ ID_MM_DEVICE_IGNORE=1
+
+# Various MGE Office Protection Systems devices
+usb:v0463p0001*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v0463pFFFF*
+ ID_MM_DEVICE_IGNORE=1
+
+# CyberPower 900AVR/BC900D
+usb:v0764p0005*
+ ID_MM_DEVICE_IGNORE=1
+
+# CyberPower CP1200AVR/BC1200D
+usb:v0764p0501*
+ ID_MM_DEVICE_IGNORE=1
+
+# Various Belkin devices
+usb:v050Dp0980*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0900*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0910*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0912*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0551*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0751*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp0375*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v050Dp1100*
+ ID_MM_DEVICE_IGNORE=1
+
+# HP R/T 2200 INTL (like SMART2200RMXL2U)
+usb:v03F0p1F0A*
+ ID_MM_DEVICE_IGNORE=1
+
+# Powerware devices
+usb:v0592p0002*
+ ID_MM_DEVICE_IGNORE=1
+
+# Palm Treo 700/900/etc
+# Shouldn't be probed themselves, but you can install programs like
+# "MobileStream USB Modem" which changes the USB PID of the device to something
+# that isn't blacklisted.
+usb:v0830p0061*
+ ID_MM_DEVICE_IGNORE=1
+
+# GlobalScaleTechnologies SheevaPlug
+usb:v9E88p9E8F*
+ ID_MM_DEVICE_IGNORE=1
+
+# Atmel Corp at91sam SAMBA bootloader
+usb:v03EBp6124*
+ ID_MM_DEVICE_IGNORE=1
+
+# Dangerous Prototypes Bus Pirate v4
+usb:v04D8pFB00*
+ ID_MM_DEVICE_IGNORE=1
+
+# All devices from the Swiss Federal Institute of Technology
+usb:v0617*
+ ID_MM_DEVICE_IGNORE=1
+
+# West Mountain Radio devices
+usb:v10C4p814A*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v10C4p814B*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v2405p0003*
+ ID_MM_DEVICE_IGNORE=1
+
+# Arduinos
+usb:v2341*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v1B4Fp9207*
+ ID_MM_DEVICE_IGNORE=1
+
+usb:v1B4Fp9208*
+ ID_MM_DEVICE_IGNORE=1
+
+# Altair U-Boot device
+usb:v0216p0051*
+ ID_MM_DEVICE_IGNORE=1
diff --git a/src/20-mm-usb-serial-adapters-greylist.hwdb b/src/20-mm-usb-serial-adapters-greylist.hwdb
new file mode 100644
index 0000000..9de305a
--- /dev/null
+++ b/src/20-mm-usb-serial-adapters-greylist.hwdb
@@ -0,0 +1,40 @@
+# do not edit this file, it will be overwritten on update
+
+# Belkin F5U183 Serial Adapter
+usb:v050Dp0103*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# FTDI-based serial adapters
+#   FTDI does USB to serial converter ICs; and it's very likely that they'll
+#   never do modems themselves, so it should be safe to add a rule only based
+#   on the vendor Id.
+usb:v0403*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# ATEN Intl UC-232A (Prolific)
+usb:v0557p2008*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# Prolific USB to Serial adapter
+usb:v067Bp2303*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# Magic Control Technology Corp adapters
+usb:v0711*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# Cygnal Integrated Products, Inc. CP210x
+usb:v10C4pEA60*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# QinHeng Electronics HL-340
+usb:v1A86p7523*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# Atmel Corp. LUFA USB to Serial Adapter Project (Arduino)
+usb:v03EBp204B*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
+
+# Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
+usb:v0525pA4A7*
+ ID_MM_DEVICE_MANUAL_SCAN_ONLY=1
diff --git a/src/77-mm-usb-device-blacklist.rules b/src/77-mm-usb-device-blacklist.rules
index 30355b1..783c351 100644
--- a/src/77-mm-usb-device-blacklist.rules
+++ b/src/77-mm-usb-device-blacklist.rules
@@ -69,7 +69,7 @@ ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", ENV{ID_MM_DEVICE_IGNORE}="1"
 ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{ID_MM_DEVICE_IGNORE}="1"
 
 # Dangerous Prototypes Bus Pirate v4
-ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb00" ENV{ID_MM_DEVICE_IGNORE}="1"
+ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb00", ENV{ID_MM_DEVICE_IGNORE}="1"
 
 # All devices from the Swiss Federal Institute of Technology
 ATTRS{idVendor}=="0617", ENV{ID_MM_DEVICE_IGNORE}="1"
@@ -85,6 +85,6 @@ ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9207", ENV{ID_MM_DEVICE_IGNORE}="1"
 ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9208", ENV{ID_MM_DEVICE_IGNORE}="1"
 
 # Altair U-Boot device
-ATTRS{idVendor}=="0216", ATTRS{idProduct}=="0051" ENV{ID_MM_DEVICE_IGNORE}="1"
+ATTRS{idVendor}=="0216", ATTRS{idProduct}=="0051", ENV{ID_MM_DEVICE_IGNORE}="1"
 
 LABEL="mm_usb_device_blacklist_end"
diff --git a/src/Makefile.am b/src/Makefile.am
index 4531a99..4147593 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,11 +2,21 @@ SUBDIRS=. tests
 
 udevrulesdir = $(UDEV_BASE_DIR)/rules.d
 udevrules_DATA = \
-     77-mm-usb-device-blacklist.rules \
      77-mm-pcmcia-device-blacklist.rules \
      77-mm-platform-serial-whitelist.rules \
-     77-mm-usb-serial-adapters-greylist.rules \
      80-mm-candidate.rules
+hwdbdir = $(UDEV_BASE_DIR)/hwdb.d
+hwdb_DATA =
+
+if WITH_HWDB
+hwdb_DATA += \
+     20-mm-usb-device-blacklist.hwdb \
+     20-mm-usb-serial-adapters-greylist.hwdb
+else
+udevrules_DATA += \
+     77-mm-usb-device-blacklist.rules \
+     77-mm-usb-serial-adapters-greylist.rules
+endif
 
 noinst_LTLIBRARIES = libmodem-helpers.la libserial.la
 
@@ -272,6 +282,7 @@ endif
 
 EXTRA_DIST = \
      $(udevrules_DATA) \
+     $(hwdb_DATA) \
      mm-marshal.list
 
 CLEANFILES = \





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]