From 14d8a3e732387c88cc15bf629e7c9f68635c20b2 Mon Sep 17 00:00:00 2001 From: Shibby Date: Wed, 15 Jun 2016 11:15:39 +0200 Subject: [PATCH] usb_modeswitch ver. 2.4.0 with data package 2016-06-12 --- .../src-rt-6.x.4708/router/usbmodeswitch/ChangeLog | 13 ++ .../src-rt-6.x.4708/router/usbmodeswitch/README | 3 +- .../usbmodeswitch/data/40-usb_modeswitch.rules | 44 +++-- .../router/usbmodeswitch/data/ChangeLog | 13 ++ .../router/usbmodeswitch/data/Makefile | 2 +- .../router/usbmodeswitch/data/gen-rules.tcl | 2 +- .../usbmodeswitch/data/usb_modeswitch.d/046d:c261 | 5 + .../usbmodeswitch/data/usb_modeswitch.d/05c6:98ff | 4 + .../usbmodeswitch/data/usb_modeswitch.d/05c6:f000 | 5 +- .../usbmodeswitch/data/usb_modeswitch.d/10a9:6080 | 2 +- .../usbmodeswitch/data/usb_modeswitch.d/12d1:1573 | 4 +- .../usbmodeswitch/data/usb_modeswitch.d/12d1:15c1 | 2 + .../usbmodeswitch/data/usb_modeswitch.d/12d1:1f1e | 2 +- .../usbmodeswitch/data/usb_modeswitch.d/19d2:1595 | 4 +- .../usbmodeswitch/data/usb_modeswitch.d/1bbb:025e | 4 + .../usbmodeswitch/data/usb_modeswitch.d/2001:a401 | 3 +- .../usbmodeswitch/data/usb_modeswitch.d/2001:a406 | 4 + .../usbmodeswitch/data/usb_modeswitch.d/2001:a407 | 4 + .../usbmodeswitch/data/usb_modeswitch.d/2001:a40a | 4 + .../usbmodeswitch/data/usb_modeswitch.d/2001:a40d | 4 + .../router/usbmodeswitch/usb_modeswitch.c | 134 +++++++------ .../router/usbmodeswitch/usb_modeswitch.h | 2 +- .../router/usbmodeswitch/usb_modeswitch.sh | 54 ++---- .../router/usbmodeswitch/usb_modeswitch.tcl | 216 ++------------------- 24 files changed, 207 insertions(+), 327 deletions(-) create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/046d:c261 create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:98ff create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:15c1 create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/1bbb:025e create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a406 create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a407 create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40a create mode 100644 release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40d mode change 100755 => 100644 release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.c diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/ChangeLog b/release/src-rt-6.x.4708/router/usbmodeswitch/ChangeLog index 11fcd76e04..42ee92af89 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/ChangeLog +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/ChangeLog @@ -2,6 +2,19 @@ History of USB_ModeSwitch ========================= +Version 2.4.0, 2016/06/12 + ATTENTION: All ad-hoc driver binding code (using new_id driver attribute) + removed - was a potential source of side effects and should now be + obsoleted by good kernel support for modems; Added "dummy" setting for + config files, to conditionally refrain from handling a device (see this + topic: www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?f=4&t=2458 ); + extended StandardEject sequence to include LUN 1, required for some D-Link + devices; add device class 239 ("miscellaneous") to sanity check (thanks to + Daniel Drake for reporting); udev shell script - removed driver binding, + removed almost all waiting and forking, improved check for systemd (thanks + to Daniel Drake for problem analysis and solution, see this topic/patch: + www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=16777#p16777 , + gist.github.com/dsd/9f83c4830ab78ce94078aedb2cf16a8f ) Version 2.3.0, 2016/01/12 ATTENTION: -I flag is now history and being ignored - determining SCSI attributes is really an 'outside task'; -n flag (NeedResponse) is being diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/README b/release/src-rt-6.x.4708/router/usbmodeswitch/README index 1c0294e2ba..da6fb35133 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/README +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/README @@ -239,6 +239,7 @@ Code, fixes and ideas contributed by: Adam Goode Leonid Lisovskiy Vladislav Grishenko + Daniel Drake Device information contributors are named in the "device_reference.txt" file. @@ -267,4 +268,4 @@ Or find it as the file COPYING in this folder. -Last revised: 2015-06-27, Josua Dietze +Last revised: 2016-06-12, Josua Dietze diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/40-usb_modeswitch.rules b/release/src-rt-6.x.4708/router/usbmodeswitch/data/40-usb_modeswitch.rules index daa3b9ac87..94bd742686 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/40-usb_modeswitch.rules +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/40-usb_modeswitch.rules @@ -1,6 +1,6 @@ -# Part of usb-modeswitch-data, version 20160112 +# Part of usb-modeswitch-data, version 20160612 # -# Works with usb_modeswitch versions >= 2.2.2 (extension of PantechMode) +# Works with usb_modeswitch versions >= 2.4.0 (extension of StandardEject) # ACTION!="add|change", GOTO="modeswitch_rules_end" @@ -8,16 +8,7 @@ ACTION!="add|change", GOTO="modeswitch_rules_end" # transfer; checked against a list of known modems, or else no action KERNEL=="ttyUSB*", ATTRS{bNumConfigurations}=="*", PROGRAM="usb_modeswitch --symlink-name %p %s{idVendor} %s{idProduct} %E{PRODUCT}", SYMLINK+="%c" -SUBSYSTEM!="usb", GOTO="modeswitch_rules_end" - -# Adds the device ID to the "option" driver after a warm boot -# in cases when the device is yet unknown to the driver; checked -# against a list of known modems, or else no action -ATTR{bInterfaceClass}=="ff", ATTR{bInterfaceNumber}=="00", ATTRS{bNumConfigurations}=="*", RUN+="usb_modeswitch --driver-bind %p %s{idVendor} %s{idProduct} %E{PRODUCT}" - - -# Don't continue on "change" event, prevent trigger by changed configuration -ACTION!="add", GOTO="modeswitch_rules_end" +SUBSYSTEM!="usb", ACTION!="add",, GOTO="modeswitch_rules_end" # Generic entry for most Huawei devices, excluding Android phones @@ -71,7 +62,7 @@ ATTR{idVendor}=="0421", ATTR{idProduct}=="0632", RUN+="usb_modeswitch '%b/%k'" # Nokia CS-21M-02 ATTR{idVendor}=="0421", ATTR{idProduct}=="0637", RUN+="usb_modeswitch '%b/%k'" -# Vodafone MD950 (Wisue Technology), Philips (?) +# Philips (?), Vodafone MD950 (Wisue Technology) ATTR{idVendor}=="0471", ATTR{idProduct}=="1210", RUN+="usb_modeswitch '%b/%k'" # Philips TalkTalk (NXP Semiconductors "Dragonfly") @@ -116,7 +107,7 @@ ATTR{idVendor}=="057c", ATTR{idProduct}=="84ff", RUN+="usb_modeswitch '%b/%k'" # Axesstel Modems (w/ initial idProduct 0x0010) ATTR{idVendor}=="05c6", ATTR{idProduct}=="0010", RUN+="usb_modeswitch '%b/%k'" -# Prolink P2000 CDMA, Samsung SGH-Z810, older Option devices, Vertex Wireless 100 Series, AnyDATA devices, Bless UC165, Option GlobeTrotter GX0201, Celot K-300, Celot CT-680, StrongRising device, TechFaith Venus VT-18 +# TechFaith Venus VT-18, AnyDATA devices, Bless UC165, Samsung SGH-Z810, StrongRising device, Vertex Wireless 100 Series, Celot K-300, Older Option devices, Prolink P2000 CDMA, Celot CT-680 ATTR{idVendor}=="05c6", ATTR{idProduct}=="1000", RUN+="usb_modeswitch '%b/%k'" # Various USB modems @@ -131,6 +122,9 @@ ATTR{idVendor}=="05c6", ATTR{idProduct}=="6503", RUN+="usb_modeswitch '%b/%k'" # Alcatel-sbell ASB TL131 TD-LTE ATTR{idVendor}=="05c6", ATTR{idProduct}=="9024", RUN+="usb_modeswitch '%b/%k'" +# U901 (LTE modem) +ATTR{idVendor}=="05c6", ATTR{idProduct}=="98ff", RUN+="usb_modeswitch '%b/%k'" + # Siptune LM-75 ("LinuxModem") ATTR{idVendor}=="05c6", ATTR{idProduct}=="f000", RUN+="usb_modeswitch '%b/%k'" @@ -506,6 +500,9 @@ ATTR{idVendor}=="1266", ATTR{idProduct}=="1000", RUN+="usb_modeswitch '%b/%k'" # Huawei ME909u-521 ATTR{idVendor}=="12d1", ATTR{idProduct}=="1573", RUN+="usb_modeswitch '%b/%k'" +# Huawei ME906, ME909 +ATTR{idVendor}=="12d1", ATTR{idProduct}=="15c1", RUN+="usb_modeswitch '%b/%k'" + # Cisco AM10 "Valet Connector" ATTR{idVendor}=="1307", ATTR{idProduct}=="1169", RUN+="usb_modeswitch '%b/%k'" @@ -749,7 +746,7 @@ ATTR{idVendor}=="19d2", ATTR{idProduct}=="1580", RUN+="usb_modeswitch '%b/%k'" # ZTE MF710M Variants ATTR{idVendor}=="19d2", ATTR{idProduct}=="1588", RUN+="usb_modeswitch '%b/%k'" -# ZTE MF710 (Vietnam) +# ZTE MF710 (Vietnam) a.o. ATTR{idVendor}=="19d2", ATTR{idProduct}=="1595", RUN+="usb_modeswitch '%b/%k'" # ZTE devices, some Onda devices @@ -797,6 +794,9 @@ ATTR{idVendor}=="1bbb", ATTR{idProduct}=="011f", RUN+="usb_modeswitch '%b/%k'" # Alcatel X602D ATTR{idVendor}=="1bbb", ATTR{idProduct}=="022c", RUN+="usb_modeswitch '%b/%k'" +# Yota W8 +ATTR{idVendor}=="1bbb", ATTR{idProduct}=="025e", RUN+="usb_modeswitch '%b/%k'" + # Alcatel X200/X200L/X060S/L100V, Archos G9 3G Key ATTR{idVendor}=="1bbb", ATTR{idProduct}=="f000", RUN+="usb_modeswitch '%b/%k'" @@ -842,7 +842,7 @@ ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9e00", RUN+="usb_modeswitch '%b/%k'" # Explay Slim ATTR{idVendor}=="1c9e", ATTR{idProduct}=="9e08", RUN+="usb_modeswitch '%b/%k'" -# MobiData MBD-200HU and others, Longcheer/Longsoon (aka Omega Technology) devices +# Longcheer/Longsoon (aka Omega Technology) devices, MobiData MBD-200HU and others ATTR{idVendor}=="1c9e", ATTR{idProduct}=="f000", RUN+="usb_modeswitch '%b/%k'" # TechFaith BSNL Capitel @@ -947,6 +947,18 @@ ATTR{idVendor}=="2001", ATTR{idProduct}=="a403", RUN+="usb_modeswitch '%b/%k'" # D-Link DWM-167 A1 ATTR{idVendor}=="2001", ATTR{idProduct}=="a405", RUN+="usb_modeswitch '%b/%k'" +# D-Link DWM-221 +ATTR{idVendor}=="2001", ATTR{idProduct}=="a406", RUN+="usb_modeswitch '%b/%k'" + +# D-Link DWM-157 C1 +ATTR{idVendor}=="2001", ATTR{idProduct}=="a407", RUN+="usb_modeswitch '%b/%k'" + +# D-Link DWM-156 A8 (Myanmar) +ATTR{idVendor}=="2001", ATTR{idProduct}=="a40a", RUN+="usb_modeswitch '%b/%k'" + +# D-Link DWR-910 +ATTR{idVendor}=="2001", ATTR{idProduct}=="a40d", RUN+="usb_modeswitch '%b/%k'" + # D-Link DWM-156 A7 ATTR{idVendor}=="2001", ATTR{idProduct}=="a706", RUN+="usb_modeswitch '%b/%k'" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/ChangeLog b/release/src-rt-6.x.4708/router/usbmodeswitch/data/ChangeLog index 31f7e85dd1..ee3cd34462 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/ChangeLog +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/ChangeLog @@ -1,3 +1,16 @@ +20160612: + ATTENTION: requires usb-modeswitch version >= 2.4.0 due to appended + StandardEject sequence (affects D-Link devices); + Added devices: [046d:c261] Logitech G920 Racing Wheel, [05c6:98ff] + U901 (LTE modem), [12d1:15c1] Huawei ME906, ME909, [1bbb:025e] Yota + 4G LTE W8, [2001:a406] D-Link DWM-221, [2001:a407] D-Link DWM-157 C1, + [2001:a40a] D-Link DWM-156 A8 (Myanmar), [2001:a40d] D-Link DWR-910, + Corrected/updated devices: [05c6:f000] Siptune LM-75 ("LinuxModem"), + EWangshikong 4G, [10a9:6080] Pantech LTE Modem, [12d1:1573] Huawei + ME909u-521, [12d1:1f1e] Vodafone / Huawei K5160, [19d2:1595] ZTE + MF710 (Vietnam) a.o., [2001:a401] D-Link DWM-221 B1; + "NoDriverLoading" parameter removed from all configs, with respect + to removed feature in usb-modeswitch 2.4.0 20160112: ATTENTION: requires usb-modeswitch version >= 2.3.0 due to new para- meter OptionMode (further reducing config file space demand); diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/Makefile b/release/src-rt-6.x.4708/router/usbmodeswitch/data/Makefile index 9c7bc5413b..e9a92ec89f 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/Makefile +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/Makefile @@ -1,5 +1,5 @@ PROG = usb-modeswitch-data -VERS = 20160112 +VERS = 20160612 RM = /bin/rm -f PREFIX = $(DESTDIR)/usr ETCDIR = $(DESTDIR)/etc diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/gen-rules.tcl b/release/src-rt-6.x.4708/router/usbmodeswitch/data/gen-rules.tcl index 44781d31ee..080900c4d6 100755 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/gen-rules.tcl +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/gen-rules.tcl @@ -11,7 +11,7 @@ # Default version string -set version "20160112" +set version "20160612" # Devices excluded from Huawei catch-all rule set x_huaweiList {12d1:1573} diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/046d:c261 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/046d:c261 new file mode 100644 index 0000000000..25a45c7efd --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/046d:c261 @@ -0,0 +1,5 @@ +# Logitech G920 Racing Wheel +MessageEndpoint=0x01 +ResponseEndpoint=0x01 +TargetClass=0x03 +MessageContent="0f00010142" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:98ff b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:98ff new file mode 100644 index 0000000000..72e252a9d2 --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:98ff @@ -0,0 +1,4 @@ +# U901 (LTE modem) +TargetVendor=0x05c6 +TargetProduct=0x6001 +SierraMode=1 \ No newline at end of file diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:f000 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:f000 index 1380d69e78..d064949f62 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:f000 +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/05c6:f000 @@ -1,4 +1,5 @@ -# Siptune LM-75 ("LinuxModem") +# Siptune LM-75 ("LinuxModem"), EWangshikong 4G TargetVendor=0x05c6 -TargetProductList="0016,9000" +TargetProductList="0016,6000,9000" StandardEject=1 +MessageContent="5553424308306384c000000080000671030000000000000000000000000000" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/10a9:6080 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/10a9:6080 index c5d3bb9580..38830052c9 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/10a9:6080 +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/10a9:6080 @@ -1,4 +1,4 @@ # Pantech LTE Modem TargetVendor=0x10a9 TargetProduct=0x6085 -PantechMode=1 +PantechMode=2 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1573 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1573 index 0e6ae6808c..0397c2ebdd 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1573 +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1573 @@ -1,2 +1,2 @@ -# Huawei ME909u-521 -Configuration=1 +# Huawei ME909u-521 (MBIM, handled by kernel, dummy config) +Configuration=0 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:15c1 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:15c1 new file mode 100644 index 0000000000..24e2ec0cfc --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:15c1 @@ -0,0 +1,2 @@ +# Huawei ME906, ME909 (MBIM, handled by kernel, dummy config) +Configuration=0 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1f1e b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1f1e index 411254ce01..a20456a395 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1f1e +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/12d1:1f1e @@ -1,4 +1,4 @@ -# Vodafone / Huawei Kxxxx +# Vodafone / Huawei K5160 TargetVendor=0x12d1 TargetProductList="157f,1592" HuaweiNewMode=1 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/19d2:1595 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/19d2:1595 index 80dacefe8c..13cc530a98 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/19d2:1595 +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/19d2:1595 @@ -1,5 +1,5 @@ -# ZTE MF710 (Vietnam) +# ZTE MF710 (Vietnam) a.o. TargetVendor= 0x19d2 -TargetProductList=0x1596 +TargetProductList="1592,1596,1600" StandardEject=1 MessageContent="55534243123456702000000080000c85010101180101010101000000000000" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/1bbb:025e b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/1bbb:025e new file mode 100644 index 0000000000..717aa4782a --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/1bbb:025e @@ -0,0 +1,4 @@ +# Yota 4G LTE W8 +TargetVendor=0x1bbb +TargetProduct=0x0195 +MessageContent="55534243123456788000000080000606f50402527000000000000000000000" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a401 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a401 index 58d0dbccd3..8d4e874ae6 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a401 +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a401 @@ -1,5 +1,4 @@ # D-Link DWM-221 B1 TargetVendor=0x2001 TargetProduct=0x7e19 -MessageContent="5553424312345678000000000001061e000000000000000000000000000000" -MessageContent2="5553424312345679000000000001061b000000020000000000000000000000" +StandardEject=1 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a406 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a406 new file mode 100644 index 0000000000..4148807a37 --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a406 @@ -0,0 +1,4 @@ +# D-Link DWM-221 +TargetVendor=0x2001 +TargetProduct=0x7e19 +StandardEject=1 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a407 b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a407 new file mode 100644 index 0000000000..6522888637 --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a407 @@ -0,0 +1,4 @@ +# D-Link DWM-157 C1 +TargetVendor=0x2001 +TargetProduct=0x7d0e +StandardEject=1 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40a b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40a new file mode 100644 index 0000000000..3db2e55080 --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40a @@ -0,0 +1,4 @@ +# D-Link DWM-156 A8 (Myanmar) +TargetVendor=0x2001 +TargetProduct=0x7d10 +MessageContent="555342431234567800000000000003f0010100000000000000000000000000" diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40d b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40d new file mode 100644 index 0000000000..4f126467e3 --- /dev/null +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/data/usb_modeswitch.d/2001:a40d @@ -0,0 +1,4 @@ +# D-Link DWR-910 +TargetVendor=0x2001 +TargetProduct=0x7e38 +StandardEject=1 diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.c b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.c old mode 100755 new mode 100644 index d38fb06840..6499844908 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.c +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.c @@ -1,8 +1,8 @@ /* Mode switching tool for controlling mode of 'multi-state' USB devices - Version 2.3.0, 2016/01/12 + Version 2.4.0, 2016/06/12 - Copyright (C) 2007 - 2016 Josua Dietze (mail to "digidietze" at the domain + Copyright (C) 2007 - 2016 Josua Dietze (mail to "usb_admin" at the domain of the home page; or write a personal message through the forum to "Josh". NO SUPPORT VIA E-MAIL - please use the forum for that) @@ -45,7 +45,7 @@ /* Recommended tab size: 4 */ -#define VERSION "2.3.0" +#define VERSION "2.4.0" #include #include @@ -98,6 +98,7 @@ static int usb_interrupt_io(libusb_device_handle *handle, int ep, unsigned char #define LINE_DIM 1024 +#define MSG_DIM 11 #define MAXLINES 50 #define BUF_SIZE 4096 #define DESCR_MAX 129 @@ -152,6 +153,7 @@ char TargetProductList[LINE_DIM]; char DefaultProductList[5]; unsigned char ByteString[LINE_DIM/2]; unsigned char buffer[BUF_SIZE]; +char **Messages = NULL; FILE *output; @@ -426,7 +428,7 @@ int readArguments(int argc, char **argv) int main(int argc, char **argv) { - int ret=0, numDefaults=0, sonySuccess=0; + int ret=0, numDefaults=0, sonySuccess=0, i; int currentConfigVal=0, defaultClass=0, interfaceClass=0; struct libusb_device_descriptor descriptor; enum libusb_error libusbError; @@ -502,7 +504,7 @@ int main(int argc, char **argv) /* libusb initialization */ if ((libusbError = libusb_init(&ctx)) != LIBUSB_SUCCESS) { - fprintf(stderr, "Error: Failed to initialize libusb. \n\n"); + fprintf(stderr, "Error: Failed to initialize libusb. %s (%d)\n\n"); exit(1); } @@ -576,10 +578,16 @@ int main(int argc, char **argv) /* Get class of default device/interface */ interfaceClass = get_interface_class(); - /* Check or get endpoints */ + /* Check or get endpoints and alloc message list if needed*/ if (strlen(MessageContent) || StandardEject || ModeMap & CISCO_MODE || ModeMap & HUAWEINEW_MODE || ModeMap & OPTION_MODE) { + Messages = (char**) calloc(MSG_DIM, sizeof(char*)); + for (i = 0; i < MSG_DIM; i++) { + Messages[i] = (char*) calloc(LINE_DIM, sizeof(char)); + Messages[i][0] = '\0'; + } + if (!MessageEndpoint) MessageEndpoint = find_first_bulk_endpoint(LIBUSB_ENDPOINT_OUT); if (!ResponseEndpoint) @@ -602,11 +610,11 @@ int main(int argc, char **argv) abortExit(); } - if (defaultClass == 0) + if (defaultClass == 0 || defaultClass == 0xef) defaultClass = interfaceClass; else if (interfaceClass == LIBUSB_CLASS_MASS_STORAGE && defaultClass != LIBUSB_CLASS_MASS_STORAGE - && defaultClass != 0xef && defaultClass != LIBUSB_CLASS_VENDOR_SPEC) { + && defaultClass != LIBUSB_CLASS_VENDOR_SPEC) { /* Unexpected default class combined with differing interface class */ SHOW_PROGRESS(output,"Bogus Class/InterfaceClass: 0x%02x/0x08\n", defaultClass); @@ -715,27 +723,29 @@ int main(int argc, char **argv) if (StandardEject) { SHOW_PROGRESS(output,"Sending standard EJECT sequence\n"); detachDriver(); + + strcpy(Messages[0],"5553424387654321000000000000061e000000000000000000000000000000"); + strcpy(Messages[1],"5553424397654321000000000000061b000000020000000000000000000000"); + strcpy(Messages[2],"5553424387654321000000000001061e000000000000000000000000000000"); + strcpy(Messages[3],"5553424397654321000000000001061b000000020000000000000000000000"); if (MessageContent[0] != '\0') - strcpy(MessageContent3, MessageContent); - else - MessageContent3[0] = '\0'; + strcpy(Messages[4], MessageContent); - strcpy(MessageContent,"5553424387654321000000000000061e000000000000000000000000000000"); - strcpy(MessageContent2,"5553424397654321000000000000061b000000020000000000000000000000"); switchSendMessage(); } else if (ModeMap & HUAWEINEW_MODE) { SHOW_PROGRESS(output,"Using standard Huawei switching message\n"); detachDriver(); - strcpy(MessageContent,"55534243123456780000000000000011062000000101000100000000000000"); + strcpy(Messages[0],"55534243123456780000000000000011062000000101000100000000000000"); switchSendMessage(); } else if (ModeMap & OPTION_MODE) { SHOW_PROGRESS(output,"Using standard Option switching message\n"); detachDriver(); // strcpy(MessageContent,"55534243123456780100000080000601000000000000000000000000000000"); - strcpy(MessageContent,"55534243123456780000000000000601000000000000000000000000000000"); + strcpy(Messages[0],"55534243123456780000000000000601000000000000000000000000000000"); switchSendMessage(); } else if (strlen(MessageContent)) { detachDriver(); + strcpy(Messages[0],MessageContent); switchSendMessage(); } @@ -962,11 +972,11 @@ int switchSendMessage () { const char* cmdHead = "55534243"; int ret, i; - char* msg[3]; +/* char* msg[3]; msg[0] = MessageContent; msg[1] = MessageContent2; msg[2] = MessageContent3; - +*/ SHOW_PROGRESS(output,"Set up interface %d\n", Interface); ret = libusb_claim_interface(devh, Interface); if (ret != 0) { @@ -978,22 +988,25 @@ int switchSendMessage () if (show_progress) fflush(stdout); - for (i=0; i<3; i++) { - if ( strlen(msg[i]) == 0) - continue; + for (i=0; i= 0) + SHOW_PROGRESS(output,", status %d",ByteString[12]); } else { // Other bulk transfer SHOW_PROGRESS(output,"Read the response to message %d ...\n", i+1); - ret = read_bulk(ResponseEndpoint, ByteString, strlen(msg[i])/2 ); + ret = read_bulk(ResponseEndpoint, ByteString, strlen(Messages[i])/2 ); } + SHOW_PROGRESS(output,"\n"); if (ret < 0) goto skip; } @@ -1251,7 +1264,8 @@ void switchActionMode () ret = usb_interrupt_io(devh, EP_OUT, buffer, SIZE, 1000); usb_interrupt_io(devh, EP_IN, buffer, SIZE, 1000); if (ret < 0) { - SHOW_PROGRESS(output," MobileAction control sequence did not complete\n Last error was %d\n",ret); + SHOW_PROGRESS(output," MobileAction control sequence did not complete\n" + " Last error was %d\n",ret); } else { SHOW_PROGRESS(output," MobileAction control sequence complete\n"); } @@ -1270,8 +1284,9 @@ void switchSequansMode() int ret; SHOW_PROGRESS(output,"Send Sequans control message\n"); - ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, - SQN_SET_DEVICE_MODE_REQUEST, SQN_CUSTOM_DEVICE_MODE, 0, buffer, 0, 1000); + ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE + | LIBUSB_ENDPOINT_OUT, SQN_SET_DEVICE_MODE_REQUEST, SQN_CUSTOM_DEVICE_MODE, + 0, buffer, 0, 1000); if (ret < 0) { fprintf(stderr, "Error: Sequans request failed (error %d). Abort\n\n", ret); @@ -1283,19 +1298,18 @@ void switchSequansMode() void switchCiscoMode() { int ret, i, j; - char* msg[11]; - - msg[0] = "55534243f83bcd810002000080000afd000000030000000100000000000000"; - msg[1] = "55534243984300820002000080000afd000000070000000100000000000000"; - msg[2] = "55534243984300820000000000000afd000100071000000000000000000000"; - msg[3] = "55534243984300820002000080000afd000200230000000100000000000000"; - msg[4] = "55534243984300820000000000000afd000300238200000000000000000000"; - msg[5] = "55534243984300820002000080000afd000200260000000100000000000000"; - msg[6] = "55534243984300820000000000000afd00030026c800000000000000000000"; - msg[7] = "55534243d84c04820002000080000afd000010730000000100000000000000"; - msg[8] = "55534243d84c04820002000080000afd000200240000000100000000000000"; - msg[9] = "55534243d84c04820000000000000afd000300241300000000000000000000"; - msg[10] = "55534243d84c04820000000000000afd000110732400000000000000000000"; + + strcpy(Messages[0],"55534243f83bcd810002000080000afd000000030000000100000000000000"); + strcpy(Messages[1],"55534243984300820002000080000afd000000070000000100000000000000"); + strcpy(Messages[2],"55534243984300820000000000000afd000100071000000000000000000000"); + strcpy(Messages[3],"55534243984300820002000080000afd000200230000000100000000000000"); + strcpy(Messages[4],"55534243984300820000000000000afd000300238200000000000000000000"); + strcpy(Messages[5],"55534243984300820002000080000afd000200260000000100000000000000"); + strcpy(Messages[6],"55534243984300820000000000000afd00030026c800000000000000000000"); + strcpy(Messages[7],"55534243d84c04820002000080000afd000010730000000100000000000000"); + strcpy(Messages[8],"55534243d84c04820002000080000afd000200240000000100000000000000"); + strcpy(Messages[9],"55534243d84c04820000000000000afd000300241300000000000000000000"); + strcpy(Messages[10],"55534243d84c04820000000000000afd000110732400000000000000000000"); SHOW_PROGRESS(output,"Set up Cisco interface %d\n", Interface); ret = libusb_claim_interface(devh, Interface); @@ -1311,13 +1325,14 @@ void switchCiscoMode() // SHOW_PROGRESS(output," Extra response (CSW) read, result %d\n",ret); for (i=0; i<11; i++) { - if ( sendMessage(msg[i], i+1) ) + if ( sendMessage(Messages[i], i+1) ) goto skip; for (j=1; j<4; j++) { SHOW_PROGRESS(output," Read the CSW for bulk message %d (attempt %d) ...\n",i+1,j); ret = read_bulk(ResponseEndpoint, ByteString, 13); + SHOW_PROGRESS(output,"\n"); if (ret < 0) goto skip; @@ -1328,11 +1343,10 @@ void switchCiscoMode() libusb_clear_halt(devh, MessageEndpoint); libusb_clear_halt(devh, ResponseEndpoint); -ReleaseDelay = 2000; - if (ReleaseDelay) { - SHOW_PROGRESS(output,"Wait for %d ms before releasing interface ...\n", ReleaseDelay); - usleep(ReleaseDelay*1000); - } + ReleaseDelay = 2000; + SHOW_PROGRESS(output,"Wait for %d ms before releasing interface ...\n", ReleaseDelay); + usleep(ReleaseDelay*1000); + ret = libusb_release_interface(devh, Interface); if (ret < 0) goto skip; @@ -1355,8 +1369,8 @@ int switchSonyMode () } SHOW_PROGRESS(output,"Send Sony control message\n"); - ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN, - 0x11, 2, 0, buffer, 3, 100); + ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE + | LIBUSB_ENDPOINT_IN, 0x11, 2, 0, buffer, 3, 100); if (ret < 0) { fprintf(stderr, "Error: Sony control message failed (error %d). Abort\n\n", ret); @@ -1374,7 +1388,8 @@ int switchSonyMode () dev = 0; while ( dev == 0 && i < 30 ) { if ( i > 5 ) { - dev = search_devices(&found, DefaultVendor, DefaultProductList, TargetClass, 0, SEARCH_TARGET); + dev = search_devices(&found, DefaultVendor, DefaultProductList, TargetClass, + 0, SEARCH_TARGET); } if ( dev != 0 ) break; @@ -1400,8 +1415,8 @@ int switchSonyMode () sleep(1); SHOW_PROGRESS(output,"Send Sony control message again ...\n"); - ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_IN, - 0x11, 2, 0, buffer, 3, 100); + ret = libusb_control_transfer(devh, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE + | LIBUSB_ENDPOINT_IN, 0x11, 2, 0, buffer, 3, 100); if (ret < 0) { fprintf(stderr, "Error: Sony control message (2) failed (error %d)\n", ret); @@ -1529,8 +1544,8 @@ int checkSuccess() */ for (i=i; i < CheckSuccess; i++) { SHOW_PROGRESS(output," Search for target devices ...\n"); - dev = search_devices(&newTargetCount, TargetVendor, TargetProductList, TargetClass, - 0, SEARCH_TARGET); + dev = search_devices(&newTargetCount, TargetVendor, TargetProductList, + TargetClass, 0, SEARCH_TARGET); if (dev && (newTargetCount > targetDeviceCount)) { if (verbose) { @@ -1611,12 +1626,12 @@ int read_bulk(int endpoint, unsigned char *buffer, int length) { int ret = usb_bulk_io(devh, endpoint, buffer, length, 3000); if (ret >= 0 ) { - SHOW_PROGRESS(output," Response successfully read (%d bytes).\n", ret); + SHOW_PROGRESS(output," Response successfully read (%d bytes)", ret); } else if (ret == LIBUSB_ERROR_NO_DEVICE) { - SHOW_PROGRESS(output," Device seems to have vanished after reading. Good.\n"); + SHOW_PROGRESS(output," Device seems to have vanished after reading. Good."); } else - SHOW_PROGRESS(output," Response reading failed (error %d)\n", ret); + SHOW_PROGRESS(output," Response reading failed (error %d)", ret); return ret; } @@ -1992,6 +2007,13 @@ int hexstr2bin(const char *hex, unsigned char *buffer, int len) void close_all() { + int i; + if (Messages) { + for ( i = 0; i < MSG_DIM; i++ ) { + free(Messages[i]); + } + free(Messages); + } if (active_config) libusb_free_config_descriptor(active_config); if (devh) @@ -2016,7 +2038,7 @@ void printVersion() { char* version = VERSION; fprintf(output,"\n * usb_modeswitch: handle USB devices with multiple modes\n" - " * Version %s (C) Josua Dietze 2015\n" + " * Version %s (C) Josua Dietze 2016\n" " * Based on libusb1/libusbx\n\n" " ! PLEASE REPORT NEW CONFIGURATIONS !\n\n", version); } diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.h b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.h index f01bbd4796..f40796f369 100644 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.h +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.h @@ -2,7 +2,7 @@ This file is part of usb_modeswitch, a mode switching tool for controlling the mode of 'multi-state' USB devices - Version 2.3.0, 2016/01/12 + Version 2.4.0, 2016/06/12 Copyright (C) 2007 - 2016 Josua Dietze Config file parsing stuff borrowed from Guillaume Dargaud diff --git a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.sh b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.sh index fb02579def..b126ec3114 100755 --- a/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.sh +++ b/release/src-rt-6.x.4708/router/usbmodeswitch/usb_modeswitch.sh @@ -1,5 +1,5 @@ #!/bin/sh -# part of usb_modeswitch 2.3.0 +# part of usb_modeswitch 2.4.0 device_in() { if [ ! -e /var/lib/usb_modeswitch/$1 ]; then @@ -40,27 +40,7 @@ fi PATH=/sbin:/usr/sbin:$PATH case "$1" in --driver-bind) - ( - dir=$(ls -d /sys$2/ttyUSB* 2>/dev/null) - sleep 1 - if [ ! -z "$dir" ]; then - exit 0 - fi - set +e - device_in "bind_list" $v_id $p_id - if [ "$?" = "1" ]; then - id_attr="/sys/bus/usb-serial/drivers/option1/new_id" - if [ ! -e "$id_attr" ]; then - modprobe option 2>/dev/null || true - fi - if [ -e "$id_attr" ]; then - echo "$v_id $p_id ff" > $id_attr - else - modprobe -r usbserial 2>/dev/null - modprobe usbserial "vendor=0x$v_id" "product=0x$p_id" 2>/dev/null - fi - fi - ) & + # driver binding code removed exit 0 ;; --symlink-name) @@ -73,26 +53,20 @@ case "$1" in exit 0 ;; esac -( + IFS='/' read -r p1 p2 < 0} { set config(Configuration) $cfgno - set config(DriverModule) "" set flags(config) "Configuration=$cfgno" } else { Log " No MBIM configuration found, switch to legacy modem mode" @@ -291,6 +290,10 @@ foreach mconfig $configList { set report "ok:busdev" break } + if {$config(Configuration) == 0} { + Log "Config file contains dummy method, do nothing. Exit" + SafeExit + } UnbindDriver $devdir $ifdir # Now we are actually switching if $flags(logging) { @@ -345,68 +348,19 @@ if [regexp {ok:busdev} $report] { ReadUSBAttrs $devdir $ifdir } -# Checking for bound drivers if there is an interface with class 0xff - -if {$config(DriverModule) != "" && [regexp {ok:} $report]} { - if [HasFF $devdir] { - AddToList link_list $usb(idVendor):$usb(idProduct) - } else { - set config(DriverModule) "" - Log " No vendor-specific class found, skip driver check" - } -} +# driver binding removed !! -# If module is set (it is by default), driver shall be loaded. -# If not, then NoDriverLoading is active - -if {$config(DriverModule) != ""} { - if {[string length "$usb(idVendor)$usb(idProduct)"] < 8} { - if {![regexp {ok:(\w{4}):(\w{4})} $report d usb(idVendor) usb(idProduct)]} { - Log "No target vendor/product ID found or given, can't continue. Abort" - SafeExit - } - } - # wait for any drivers to bind automatically - after 1500 - Log "Now check for bound driver ..." - if {![file exists $devdir/$ifdir/driver]} { - Log " no driver has bound to interface 0 yet" - - # If device is known, the sh wrapper will take care, else: - if {[InBindList $usb(idVendor):$usb(idProduct)] == 0} { - Log "Device is not in \"bind_list\" yet, bind it now" - - # Load driver - CheckDriverBind $usb(idVendor) $usb(idProduct) - - # Old/slow systems may take a while to create the devices - set counter 0 - while {![file exists $devdir/$ifdir/driver]} { - if {$counter == 14} {break} - after 500 - incr counter - } - if {$counter == 14} { - Log " driver binding failed" - } else { - Log " driver was bound to the device" - AddToList bind_list $usb(idVendor):$usb(idProduct) - } - } - } else { - Log " driver has bound, device is known" - if {[llength [glob -nocomplain $devdir/$ifdir/ttyUSB*]] > 0} { - AddToList link_list $usb(idVendor):$usb(idProduct) - } +if {[string length "$usb(idVendor)$usb(idProduct)"] < 8} { + if {![regexp {ok:(\w{4}):(\w{4})} $report d usb(idVendor) usb(idProduct)]} { + Log "No target vendor/product ID found or given, can't continue. Abort" + SafeExit } -} else { - # Just in case "NoDriverLoading" was added after the first bind - RemoveFromBindList $usb(idVendor):$usb(idProduct) } - -if [regexp {ok:$} $report] { - # "NoDriverLoading" was set - Log "No driver check or bind for this device" +# wait for drivers to bind +after 500 +if {[llength [glob -nocomplain $devdir/$ifdir/ttyUSB*]] > 0} { + Log "Serial USB driver bound to interface 0\n will try to guess and symlink modem port on next connect" + AddToList link_list $usb(idVendor):$usb(idProduct) } # In newer kernels there is a switch to avoid the use of a device @@ -599,8 +553,6 @@ return "Use global config file: $configFile" proc ParseDeviceConfig {cfg} { global config -set config(DriverModule) "" -set config(DriverIDPath) "" set config(WaitBefore) "" set config(TargetVendor) "" set config(TargetProduct) "" @@ -609,7 +561,6 @@ set config(Configuration) "" set config(NoMBIMCheck) 0 set config(PantechMode) 0 set config(CheckSuccess) 20 -set loadDriver 1 foreach pname [lsort [array names config]] { if [regexp -line "^\[^# \]*?$pname.*?= *(0x(\\w+)|\"(\[0-9a-fA-F,\]+)\"|(\[0-9\]+)) *\$" $cfg d config($pname)] { @@ -617,26 +568,6 @@ foreach pname [lsort [array names config]] { } } -if [regexp -line {^[^#]*?NoDriverLoading.*?=.*?(1|yes|true).*?$} $cfg] { - set loadDriver 0 - Log "config: NoDriverLoading is set to active" -} - -# For general driver loading; TODO: add respective device names. -# Presently only useful for HSO devices (which are recounted now) -if $loadDriver { - if {$config(DriverModule) == ""} { - set config(DriverModule) "option" - set config(DriverIDPath) "/sys/bus/usb-serial/drivers/option1" - } else { - if {$config(DriverIDPath) == ""} { - set config(DriverIDPath) "/sys/bus/usb/drivers/$config(DriverModule)" - } - } - Log "Driver module is \"$config(DriverModule)\", ID path is $config(DriverIDPath)\n" -} else { - Log "Driver will not be handled by usb_modeswitch" -} set config(WaitBefore) [string trimleft $config(WaitBefore) 0] } @@ -837,92 +768,6 @@ return $symlinkName # end of proc {SymLinkName} -# Load and bind driver (default "option") -# -proc {CheckDriverBind} {vid pid} { -global config - -foreach fn {/sbin/modprobe /usr/sbin/modprobe} { - if [file exists $fn] { - set loader $fn - } -} -Log "Module loader is $loader" - -set idfile $config(DriverIDPath)/new_id -if {![file exists $idfile]} { - if {$loader == ""} { - Log "Can't do anymore without module loader; get \"modtools\"!" - return - } - Log "\nTry to load module \"$config(DriverModule)\"" - if [catch {set result [exec $loader -v $config(DriverModule)]} err] { - Log " Running \"$loader $config(DriverModule)\" gave an error:\n $err" - } else { - Log " Module was loaded successfully:\n$result" - } -} else { - Log "Module is active already" -} -set i 0 -while {$i < 50} { - if [file exists $idfile] { - break - } - after 20 - incr i -} -if {$i < 50} { - Log "Try to add ID to driver \"$config(DriverModule)\"" - SysLog "usb_modeswitch: add device ID $vid:$pid to driver \"$config(DriverModule)\"" - SysLog "usb_modeswitch: please report the device ID to the Linux USB developers!" - if [catch {exec echo "$vid $pid ff" >$idfile} err] { - Log " Error adding ID to driver:\n $err" - } else { - Log " ID added to driver; check for new devices in /dev" - } -} else { - Log " \"$idfile\" not found, check if kernel version is at least 2.6.27" - Log "Fall back to \"usbserial\"" - set config(DriverModule) usbserial - Log "\nTry to unload driver \"usbserial\"" - if [catch {exec $loader -r usbserial} err] { - Log " Running \"$loader -r usbserial\" gave an error:\n $err" - Log "No more fallbacks" - return - } - after 50 - Log "\nTry to load driver \"usbserial\" with device IDs" - if [catch {set result [exec $loader -v usbserial vendor=0x$vid product=0x$pid]} err] { - Log " Running \"$loader usbserial\" gave an error:\n $err" - } else { - Log " Driver was loaded successfully:\n$result" - } -} - -} -# end of proc {CheckDriverBind} - - -# Check if USB ID is listed as needing driver binding -proc {InBindList} {id} { - -set listfile /var/lib/usb_modeswitch/bind_list -if {![file exists $listfile]} {return 0} -set rc [open $listfile r] -set buffer [read $rc] -close $rc -if [string match *$id* $buffer] { -Log "Found $id in bind_list" - return 1 -} else { -Log "No $id in bind_list" - return 0 -} - -} -# end of proc {InBindList} - # Add USB ID to list of devices needing later treatment proc {AddToList} {name id} { @@ -946,37 +791,6 @@ close $lc # end of proc {AddToList} -# Remove USB ID from bind list (NoDriverLoading is set) -proc {RemoveFromBindList} {id} { - -set listfile /var/lib/usb_modeswitch/bind_list -if [file exists $listfile] { - set rc [open $listfile r] - set buffer [read $rc] - close $rc - set idList [split [string trim $buffer] \n] -} else { - return -} -set idx [lsearch $idList $id] -if {$idx > -1} { - set idList [lreplace $idList $idx $idx] -} else { - return -} -if {[llength $idList] == 0} { - file delete $listfile - return -} -set buffer [join $idList "\n"] -if [catch {set lc [open $listfile w]}] {return} -puts $lc $buffer -close $lc - -} -# end of proc {RemoveFromBindList} - - proc {CheckSuccess} {devdir} { global config usb flags -- 2.11.4.GIT